{"version":3,"sources":["../../../node_modules/.pnpm/bn.js@5.2.1/node_modules/bn.js/lib/bn.js","../src/interfaces/SdkWrapper.ts","../src/modules/rpcModule.ts","../src/utils/cachedContent.ts","../src/utils/contracts.ts","../src/utils/coinAssist.ts","../src/errors/baseError.ts","../src/errors/errors.ts","../../../node_modules/.pnpm/decimal.js@10.5.0/node_modules/decimal.js/decimal.mjs","../src/utils/numbers.ts","../src/utils/hex.ts","../src/type/clmm.ts","../src/type/sui.ts","../src/utils/utils.ts","../src/utils/tickUtils.ts","../src/utils/objects.ts","../src/utils/decimal.ts","../src/utils/clmm.ts","../src/utils/tickMath.ts","../src/utils/percentage.ts"],"sourcesContent":["(function (module, exports) {\n  'use strict';\n\n  // Utils\n  function assert (val, msg) {\n    if (!val) throw new Error(msg || 'Assertion failed');\n  }\n\n  // Could use `inherits` module, but don't want to move from single file\n  // architecture yet.\n  function inherits (ctor, superCtor) {\n    ctor.super_ = superCtor;\n    var TempCtor = function () {};\n    TempCtor.prototype = superCtor.prototype;\n    ctor.prototype = new TempCtor();\n    ctor.prototype.constructor = ctor;\n  }\n\n  // BN\n\n  function BN (number, base, endian) {\n    if (BN.isBN(number)) {\n      return number;\n    }\n\n    this.negative = 0;\n    this.words = null;\n    this.length = 0;\n\n    // Reduction context\n    this.red = null;\n\n    if (number !== null) {\n      if (base === 'le' || base === 'be') {\n        endian = base;\n        base = 10;\n      }\n\n      this._init(number || 0, base || 10, endian || 'be');\n    }\n  }\n  if (typeof module === 'object') {\n    module.exports = BN;\n  } else {\n    exports.BN = BN;\n  }\n\n  BN.BN = BN;\n  BN.wordSize = 26;\n\n  var Buffer;\n  try {\n    if (typeof window !== 'undefined' && typeof window.Buffer !== 'undefined') {\n      Buffer = window.Buffer;\n    } else {\n      Buffer = require('buffer').Buffer;\n    }\n  } catch (e) {\n  }\n\n  BN.isBN = function isBN (num) {\n    if (num instanceof BN) {\n      return true;\n    }\n\n    return num !== null && typeof num === 'object' &&\n      num.constructor.wordSize === BN.wordSize && Array.isArray(num.words);\n  };\n\n  BN.max = function max (left, right) {\n    if (left.cmp(right) > 0) return left;\n    return right;\n  };\n\n  BN.min = function min (left, right) {\n    if (left.cmp(right) < 0) return left;\n    return right;\n  };\n\n  BN.prototype._init = function init (number, base, endian) {\n    if (typeof number === 'number') {\n      return this._initNumber(number, base, endian);\n    }\n\n    if (typeof number === 'object') {\n      return this._initArray(number, base, endian);\n    }\n\n    if (base === 'hex') {\n      base = 16;\n    }\n    assert(base === (base | 0) && base >= 2 && base <= 36);\n\n    number = number.toString().replace(/\\s+/g, '');\n    var start = 0;\n    if (number[0] === '-') {\n      start++;\n      this.negative = 1;\n    }\n\n    if (start < number.length) {\n      if (base === 16) {\n        this._parseHex(number, start, endian);\n      } else {\n        this._parseBase(number, base, start);\n        if (endian === 'le') {\n          this._initArray(this.toArray(), base, endian);\n        }\n      }\n    }\n  };\n\n  BN.prototype._initNumber = function _initNumber (number, base, endian) {\n    if (number < 0) {\n      this.negative = 1;\n      number = -number;\n    }\n    if (number < 0x4000000) {\n      this.words = [number & 0x3ffffff];\n      this.length = 1;\n    } else if (number < 0x10000000000000) {\n      this.words = [\n        number & 0x3ffffff,\n        (number / 0x4000000) & 0x3ffffff\n      ];\n      this.length = 2;\n    } else {\n      assert(number < 0x20000000000000); // 2 ^ 53 (unsafe)\n      this.words = [\n        number & 0x3ffffff,\n        (number / 0x4000000) & 0x3ffffff,\n        1\n      ];\n      this.length = 3;\n    }\n\n    if (endian !== 'le') return;\n\n    // Reverse the bytes\n    this._initArray(this.toArray(), base, endian);\n  };\n\n  BN.prototype._initArray = function _initArray (number, base, endian) {\n    // Perhaps a Uint8Array\n    assert(typeof number.length === 'number');\n    if (number.length <= 0) {\n      this.words = [0];\n      this.length = 1;\n      return this;\n    }\n\n    this.length = Math.ceil(number.length / 3);\n    this.words = new Array(this.length);\n    for (var i = 0; i < this.length; i++) {\n      this.words[i] = 0;\n    }\n\n    var j, w;\n    var off = 0;\n    if (endian === 'be') {\n      for (i = number.length - 1, j = 0; i >= 0; i -= 3) {\n        w = number[i] | (number[i - 1] << 8) | (number[i - 2] << 16);\n        this.words[j] |= (w << off) & 0x3ffffff;\n        this.words[j + 1] = (w >>> (26 - off)) & 0x3ffffff;\n        off += 24;\n        if (off >= 26) {\n          off -= 26;\n          j++;\n        }\n      }\n    } else if (endian === 'le') {\n      for (i = 0, j = 0; i < number.length; i += 3) {\n        w = number[i] | (number[i + 1] << 8) | (number[i + 2] << 16);\n        this.words[j] |= (w << off) & 0x3ffffff;\n        this.words[j + 1] = (w >>> (26 - off)) & 0x3ffffff;\n        off += 24;\n        if (off >= 26) {\n          off -= 26;\n          j++;\n        }\n      }\n    }\n    return this._strip();\n  };\n\n  function parseHex4Bits (string, index) {\n    var c = string.charCodeAt(index);\n    // '0' - '9'\n    if (c >= 48 && c <= 57) {\n      return c - 48;\n    // 'A' - 'F'\n    } else if (c >= 65 && c <= 70) {\n      return c - 55;\n    // 'a' - 'f'\n    } else if (c >= 97 && c <= 102) {\n      return c - 87;\n    } else {\n      assert(false, 'Invalid character in ' + string);\n    }\n  }\n\n  function parseHexByte (string, lowerBound, index) {\n    var r = parseHex4Bits(string, index);\n    if (index - 1 >= lowerBound) {\n      r |= parseHex4Bits(string, index - 1) << 4;\n    }\n    return r;\n  }\n\n  BN.prototype._parseHex = function _parseHex (number, start, endian) {\n    // Create possibly bigger array to ensure that it fits the number\n    this.length = Math.ceil((number.length - start) / 6);\n    this.words = new Array(this.length);\n    for (var i = 0; i < this.length; i++) {\n      this.words[i] = 0;\n    }\n\n    // 24-bits chunks\n    var off = 0;\n    var j = 0;\n\n    var w;\n    if (endian === 'be') {\n      for (i = number.length - 1; i >= start; i -= 2) {\n        w = parseHexByte(number, start, i) << off;\n        this.words[j] |= w & 0x3ffffff;\n        if (off >= 18) {\n          off -= 18;\n          j += 1;\n          this.words[j] |= w >>> 26;\n        } else {\n          off += 8;\n        }\n      }\n    } else {\n      var parseLength = number.length - start;\n      for (i = parseLength % 2 === 0 ? start + 1 : start; i < number.length; i += 2) {\n        w = parseHexByte(number, start, i) << off;\n        this.words[j] |= w & 0x3ffffff;\n        if (off >= 18) {\n          off -= 18;\n          j += 1;\n          this.words[j] |= w >>> 26;\n        } else {\n          off += 8;\n        }\n      }\n    }\n\n    this._strip();\n  };\n\n  function parseBase (str, start, end, mul) {\n    var r = 0;\n    var b = 0;\n    var len = Math.min(str.length, end);\n    for (var i = start; i < len; i++) {\n      var c = str.charCodeAt(i) - 48;\n\n      r *= mul;\n\n      // 'a'\n      if (c >= 49) {\n        b = c - 49 + 0xa;\n\n      // 'A'\n      } else if (c >= 17) {\n        b = c - 17 + 0xa;\n\n      // '0' - '9'\n      } else {\n        b = c;\n      }\n      assert(c >= 0 && b < mul, 'Invalid character');\n      r += b;\n    }\n    return r;\n  }\n\n  BN.prototype._parseBase = function _parseBase (number, base, start) {\n    // Initialize as zero\n    this.words = [0];\n    this.length = 1;\n\n    // Find length of limb in base\n    for (var limbLen = 0, limbPow = 1; limbPow <= 0x3ffffff; limbPow *= base) {\n      limbLen++;\n    }\n    limbLen--;\n    limbPow = (limbPow / base) | 0;\n\n    var total = number.length - start;\n    var mod = total % limbLen;\n    var end = Math.min(total, total - mod) + start;\n\n    var word = 0;\n    for (var i = start; i < end; i += limbLen) {\n      word = parseBase(number, i, i + limbLen, base);\n\n      this.imuln(limbPow);\n      if (this.words[0] + word < 0x4000000) {\n        this.words[0] += word;\n      } else {\n        this._iaddn(word);\n      }\n    }\n\n    if (mod !== 0) {\n      var pow = 1;\n      word = parseBase(number, i, number.length, base);\n\n      for (i = 0; i < mod; i++) {\n        pow *= base;\n      }\n\n      this.imuln(pow);\n      if (this.words[0] + word < 0x4000000) {\n        this.words[0] += word;\n      } else {\n        this._iaddn(word);\n      }\n    }\n\n    this._strip();\n  };\n\n  BN.prototype.copy = function copy (dest) {\n    dest.words = new Array(this.length);\n    for (var i = 0; i < this.length; i++) {\n      dest.words[i] = this.words[i];\n    }\n    dest.length = this.length;\n    dest.negative = this.negative;\n    dest.red = this.red;\n  };\n\n  function move (dest, src) {\n    dest.words = src.words;\n    dest.length = src.length;\n    dest.negative = src.negative;\n    dest.red = src.red;\n  }\n\n  BN.prototype._move = function _move (dest) {\n    move(dest, this);\n  };\n\n  BN.prototype.clone = function clone () {\n    var r = new BN(null);\n    this.copy(r);\n    return r;\n  };\n\n  BN.prototype._expand = function _expand (size) {\n    while (this.length < size) {\n      this.words[this.length++] = 0;\n    }\n    return this;\n  };\n\n  // Remove leading `0` from `this`\n  BN.prototype._strip = function strip () {\n    while (this.length > 1 && this.words[this.length - 1] === 0) {\n      this.length--;\n    }\n    return this._normSign();\n  };\n\n  BN.prototype._normSign = function _normSign () {\n    // -0 = 0\n    if (this.length === 1 && this.words[0] === 0) {\n      this.negative = 0;\n    }\n    return this;\n  };\n\n  // Check Symbol.for because not everywhere where Symbol defined\n  // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol#Browser_compatibility\n  if (typeof Symbol !== 'undefined' && typeof Symbol.for === 'function') {\n    try {\n      BN.prototype[Symbol.for('nodejs.util.inspect.custom')] = inspect;\n    } catch (e) {\n      BN.prototype.inspect = inspect;\n    }\n  } else {\n    BN.prototype.inspect = inspect;\n  }\n\n  function inspect () {\n    return (this.red ? '<BN-R: ' : '<BN: ') + this.toString(16) + '>';\n  }\n\n  /*\n\n  var zeros = [];\n  var groupSizes = [];\n  var groupBases = [];\n\n  var s = '';\n  var i = -1;\n  while (++i < BN.wordSize) {\n    zeros[i] = s;\n    s += '0';\n  }\n  groupSizes[0] = 0;\n  groupSizes[1] = 0;\n  groupBases[0] = 0;\n  groupBases[1] = 0;\n  var base = 2 - 1;\n  while (++base < 36 + 1) {\n    var groupSize = 0;\n    var groupBase = 1;\n    while (groupBase < (1 << BN.wordSize) / base) {\n      groupBase *= base;\n      groupSize += 1;\n    }\n    groupSizes[base] = groupSize;\n    groupBases[base] = groupBase;\n  }\n\n  */\n\n  var zeros = [\n    '',\n    '0',\n    '00',\n    '000',\n    '0000',\n    '00000',\n    '000000',\n    '0000000',\n    '00000000',\n    '000000000',\n    '0000000000',\n    '00000000000',\n    '000000000000',\n    '0000000000000',\n    '00000000000000',\n    '000000000000000',\n    '0000000000000000',\n    '00000000000000000',\n    '000000000000000000',\n    '0000000000000000000',\n    '00000000000000000000',\n    '000000000000000000000',\n    '0000000000000000000000',\n    '00000000000000000000000',\n    '000000000000000000000000',\n    '0000000000000000000000000'\n  ];\n\n  var groupSizes = [\n    0, 0,\n    25, 16, 12, 11, 10, 9, 8,\n    8, 7, 7, 7, 7, 6, 6,\n    6, 6, 6, 6, 6, 5, 5,\n    5, 5, 5, 5, 5, 5, 5,\n    5, 5, 5, 5, 5, 5, 5\n  ];\n\n  var groupBases = [\n    0, 0,\n    33554432, 43046721, 16777216, 48828125, 60466176, 40353607, 16777216,\n    43046721, 10000000, 19487171, 35831808, 62748517, 7529536, 11390625,\n    16777216, 24137569, 34012224, 47045881, 64000000, 4084101, 5153632,\n    6436343, 7962624, 9765625, 11881376, 14348907, 17210368, 20511149,\n    24300000, 28629151, 33554432, 39135393, 45435424, 52521875, 60466176\n  ];\n\n  BN.prototype.toString = function toString (base, padding) {\n    base = base || 10;\n    padding = padding | 0 || 1;\n\n    var out;\n    if (base === 16 || base === 'hex') {\n      out = '';\n      var off = 0;\n      var carry = 0;\n      for (var i = 0; i < this.length; i++) {\n        var w = this.words[i];\n        var word = (((w << off) | carry) & 0xffffff).toString(16);\n        carry = (w >>> (24 - off)) & 0xffffff;\n        off += 2;\n        if (off >= 26) {\n          off -= 26;\n          i--;\n        }\n        if (carry !== 0 || i !== this.length - 1) {\n          out = zeros[6 - word.length] + word + out;\n        } else {\n          out = word + out;\n        }\n      }\n      if (carry !== 0) {\n        out = carry.toString(16) + out;\n      }\n      while (out.length % padding !== 0) {\n        out = '0' + out;\n      }\n      if (this.negative !== 0) {\n        out = '-' + out;\n      }\n      return out;\n    }\n\n    if (base === (base | 0) && base >= 2 && base <= 36) {\n      // var groupSize = Math.floor(BN.wordSize * Math.LN2 / Math.log(base));\n      var groupSize = groupSizes[base];\n      // var groupBase = Math.pow(base, groupSize);\n      var groupBase = groupBases[base];\n      out = '';\n      var c = this.clone();\n      c.negative = 0;\n      while (!c.isZero()) {\n        var r = c.modrn(groupBase).toString(base);\n        c = c.idivn(groupBase);\n\n        if (!c.isZero()) {\n          out = zeros[groupSize - r.length] + r + out;\n        } else {\n          out = r + out;\n        }\n      }\n      if (this.isZero()) {\n        out = '0' + out;\n      }\n      while (out.length % padding !== 0) {\n        out = '0' + out;\n      }\n      if (this.negative !== 0) {\n        out = '-' + out;\n      }\n      return out;\n    }\n\n    assert(false, 'Base should be between 2 and 36');\n  };\n\n  BN.prototype.toNumber = function toNumber () {\n    var ret = this.words[0];\n    if (this.length === 2) {\n      ret += this.words[1] * 0x4000000;\n    } else if (this.length === 3 && this.words[2] === 0x01) {\n      // NOTE: at this stage it is known that the top bit is set\n      ret += 0x10000000000000 + (this.words[1] * 0x4000000);\n    } else if (this.length > 2) {\n      assert(false, 'Number can only safely store up to 53 bits');\n    }\n    return (this.negative !== 0) ? -ret : ret;\n  };\n\n  BN.prototype.toJSON = function toJSON () {\n    return this.toString(16, 2);\n  };\n\n  if (Buffer) {\n    BN.prototype.toBuffer = function toBuffer (endian, length) {\n      return this.toArrayLike(Buffer, endian, length);\n    };\n  }\n\n  BN.prototype.toArray = function toArray (endian, length) {\n    return this.toArrayLike(Array, endian, length);\n  };\n\n  var allocate = function allocate (ArrayType, size) {\n    if (ArrayType.allocUnsafe) {\n      return ArrayType.allocUnsafe(size);\n    }\n    return new ArrayType(size);\n  };\n\n  BN.prototype.toArrayLike = function toArrayLike (ArrayType, endian, length) {\n    this._strip();\n\n    var byteLength = this.byteLength();\n    var reqLength = length || Math.max(1, byteLength);\n    assert(byteLength <= reqLength, 'byte array longer than desired length');\n    assert(reqLength > 0, 'Requested array length <= 0');\n\n    var res = allocate(ArrayType, reqLength);\n    var postfix = endian === 'le' ? 'LE' : 'BE';\n    this['_toArrayLike' + postfix](res, byteLength);\n    return res;\n  };\n\n  BN.prototype._toArrayLikeLE = function _toArrayLikeLE (res, byteLength) {\n    var position = 0;\n    var carry = 0;\n\n    for (var i = 0, shift = 0; i < this.length; i++) {\n      var word = (this.words[i] << shift) | carry;\n\n      res[position++] = word & 0xff;\n      if (position < res.length) {\n        res[position++] = (word >> 8) & 0xff;\n      }\n      if (position < res.length) {\n        res[position++] = (word >> 16) & 0xff;\n      }\n\n      if (shift === 6) {\n        if (position < res.length) {\n          res[position++] = (word >> 24) & 0xff;\n        }\n        carry = 0;\n        shift = 0;\n      } else {\n        carry = word >>> 24;\n        shift += 2;\n      }\n    }\n\n    if (position < res.length) {\n      res[position++] = carry;\n\n      while (position < res.length) {\n        res[position++] = 0;\n      }\n    }\n  };\n\n  BN.prototype._toArrayLikeBE = function _toArrayLikeBE (res, byteLength) {\n    var position = res.length - 1;\n    var carry = 0;\n\n    for (var i = 0, shift = 0; i < this.length; i++) {\n      var word = (this.words[i] << shift) | carry;\n\n      res[position--] = word & 0xff;\n      if (position >= 0) {\n        res[position--] = (word >> 8) & 0xff;\n      }\n      if (position >= 0) {\n        res[position--] = (word >> 16) & 0xff;\n      }\n\n      if (shift === 6) {\n        if (position >= 0) {\n          res[position--] = (word >> 24) & 0xff;\n        }\n        carry = 0;\n        shift = 0;\n      } else {\n        carry = word >>> 24;\n        shift += 2;\n      }\n    }\n\n    if (position >= 0) {\n      res[position--] = carry;\n\n      while (position >= 0) {\n        res[position--] = 0;\n      }\n    }\n  };\n\n  if (Math.clz32) {\n    BN.prototype._countBits = function _countBits (w) {\n      return 32 - Math.clz32(w);\n    };\n  } else {\n    BN.prototype._countBits = function _countBits (w) {\n      var t = w;\n      var r = 0;\n      if (t >= 0x1000) {\n        r += 13;\n        t >>>= 13;\n      }\n      if (t >= 0x40) {\n        r += 7;\n        t >>>= 7;\n      }\n      if (t >= 0x8) {\n        r += 4;\n        t >>>= 4;\n      }\n      if (t >= 0x02) {\n        r += 2;\n        t >>>= 2;\n      }\n      return r + t;\n    };\n  }\n\n  BN.prototype._zeroBits = function _zeroBits (w) {\n    // Short-cut\n    if (w === 0) return 26;\n\n    var t = w;\n    var r = 0;\n    if ((t & 0x1fff) === 0) {\n      r += 13;\n      t >>>= 13;\n    }\n    if ((t & 0x7f) === 0) {\n      r += 7;\n      t >>>= 7;\n    }\n    if ((t & 0xf) === 0) {\n      r += 4;\n      t >>>= 4;\n    }\n    if ((t & 0x3) === 0) {\n      r += 2;\n      t >>>= 2;\n    }\n    if ((t & 0x1) === 0) {\n      r++;\n    }\n    return r;\n  };\n\n  // Return number of used bits in a BN\n  BN.prototype.bitLength = function bitLength () {\n    var w = this.words[this.length - 1];\n    var hi = this._countBits(w);\n    return (this.length - 1) * 26 + hi;\n  };\n\n  function toBitArray (num) {\n    var w = new Array(num.bitLength());\n\n    for (var bit = 0; bit < w.length; bit++) {\n      var off = (bit / 26) | 0;\n      var wbit = bit % 26;\n\n      w[bit] = (num.words[off] >>> wbit) & 0x01;\n    }\n\n    return w;\n  }\n\n  // Number of trailing zero bits\n  BN.prototype.zeroBits = function zeroBits () {\n    if (this.isZero()) return 0;\n\n    var r = 0;\n    for (var i = 0; i < this.length; i++) {\n      var b = this._zeroBits(this.words[i]);\n      r += b;\n      if (b !== 26) break;\n    }\n    return r;\n  };\n\n  BN.prototype.byteLength = function byteLength () {\n    return Math.ceil(this.bitLength() / 8);\n  };\n\n  BN.prototype.toTwos = function toTwos (width) {\n    if (this.negative !== 0) {\n      return this.abs().inotn(width).iaddn(1);\n    }\n    return this.clone();\n  };\n\n  BN.prototype.fromTwos = function fromTwos (width) {\n    if (this.testn(width - 1)) {\n      return this.notn(width).iaddn(1).ineg();\n    }\n    return this.clone();\n  };\n\n  BN.prototype.isNeg = function isNeg () {\n    return this.negative !== 0;\n  };\n\n  // Return negative clone of `this`\n  BN.prototype.neg = function neg () {\n    return this.clone().ineg();\n  };\n\n  BN.prototype.ineg = function ineg () {\n    if (!this.isZero()) {\n      this.negative ^= 1;\n    }\n\n    return this;\n  };\n\n  // Or `num` with `this` in-place\n  BN.prototype.iuor = function iuor (num) {\n    while (this.length < num.length) {\n      this.words[this.length++] = 0;\n    }\n\n    for (var i = 0; i < num.length; i++) {\n      this.words[i] = this.words[i] | num.words[i];\n    }\n\n    return this._strip();\n  };\n\n  BN.prototype.ior = function ior (num) {\n    assert((this.negative | num.negative) === 0);\n    return this.iuor(num);\n  };\n\n  // Or `num` with `this`\n  BN.prototype.or = function or (num) {\n    if (this.length > num.length) return this.clone().ior(num);\n    return num.clone().ior(this);\n  };\n\n  BN.prototype.uor = function uor (num) {\n    if (this.length > num.length) return this.clone().iuor(num);\n    return num.clone().iuor(this);\n  };\n\n  // And `num` with `this` in-place\n  BN.prototype.iuand = function iuand (num) {\n    // b = min-length(num, this)\n    var b;\n    if (this.length > num.length) {\n      b = num;\n    } else {\n      b = this;\n    }\n\n    for (var i = 0; i < b.length; i++) {\n      this.words[i] = this.words[i] & num.words[i];\n    }\n\n    this.length = b.length;\n\n    return this._strip();\n  };\n\n  BN.prototype.iand = function iand (num) {\n    assert((this.negative | num.negative) === 0);\n    return this.iuand(num);\n  };\n\n  // And `num` with `this`\n  BN.prototype.and = function and (num) {\n    if (this.length > num.length) return this.clone().iand(num);\n    return num.clone().iand(this);\n  };\n\n  BN.prototype.uand = function uand (num) {\n    if (this.length > num.length) return this.clone().iuand(num);\n    return num.clone().iuand(this);\n  };\n\n  // Xor `num` with `this` in-place\n  BN.prototype.iuxor = function iuxor (num) {\n    // a.length > b.length\n    var a;\n    var b;\n    if (this.length > num.length) {\n      a = this;\n      b = num;\n    } else {\n      a = num;\n      b = this;\n    }\n\n    for (var i = 0; i < b.length; i++) {\n      this.words[i] = a.words[i] ^ b.words[i];\n    }\n\n    if (this !== a) {\n      for (; i < a.length; i++) {\n        this.words[i] = a.words[i];\n      }\n    }\n\n    this.length = a.length;\n\n    return this._strip();\n  };\n\n  BN.prototype.ixor = function ixor (num) {\n    assert((this.negative | num.negative) === 0);\n    return this.iuxor(num);\n  };\n\n  // Xor `num` with `this`\n  BN.prototype.xor = function xor (num) {\n    if (this.length > num.length) return this.clone().ixor(num);\n    return num.clone().ixor(this);\n  };\n\n  BN.prototype.uxor = function uxor (num) {\n    if (this.length > num.length) return this.clone().iuxor(num);\n    return num.clone().iuxor(this);\n  };\n\n  // Not ``this`` with ``width`` bitwidth\n  BN.prototype.inotn = function inotn (width) {\n    assert(typeof width === 'number' && width >= 0);\n\n    var bytesNeeded = Math.ceil(width / 26) | 0;\n    var bitsLeft = width % 26;\n\n    // Extend the buffer with leading zeroes\n    this._expand(bytesNeeded);\n\n    if (bitsLeft > 0) {\n      bytesNeeded--;\n    }\n\n    // Handle complete words\n    for (var i = 0; i < bytesNeeded; i++) {\n      this.words[i] = ~this.words[i] & 0x3ffffff;\n    }\n\n    // Handle the residue\n    if (bitsLeft > 0) {\n      this.words[i] = ~this.words[i] & (0x3ffffff >> (26 - bitsLeft));\n    }\n\n    // And remove leading zeroes\n    return this._strip();\n  };\n\n  BN.prototype.notn = function notn (width) {\n    return this.clone().inotn(width);\n  };\n\n  // Set `bit` of `this`\n  BN.prototype.setn = function setn (bit, val) {\n    assert(typeof bit === 'number' && bit >= 0);\n\n    var off = (bit / 26) | 0;\n    var wbit = bit % 26;\n\n    this._expand(off + 1);\n\n    if (val) {\n      this.words[off] = this.words[off] | (1 << wbit);\n    } else {\n      this.words[off] = this.words[off] & ~(1 << wbit);\n    }\n\n    return this._strip();\n  };\n\n  // Add `num` to `this` in-place\n  BN.prototype.iadd = function iadd (num) {\n    var r;\n\n    // negative + positive\n    if (this.negative !== 0 && num.negative === 0) {\n      this.negative = 0;\n      r = this.isub(num);\n      this.negative ^= 1;\n      return this._normSign();\n\n    // positive + negative\n    } else if (this.negative === 0 && num.negative !== 0) {\n      num.negative = 0;\n      r = this.isub(num);\n      num.negative = 1;\n      return r._normSign();\n    }\n\n    // a.length > b.length\n    var a, b;\n    if (this.length > num.length) {\n      a = this;\n      b = num;\n    } else {\n      a = num;\n      b = this;\n    }\n\n    var carry = 0;\n    for (var i = 0; i < b.length; i++) {\n      r = (a.words[i] | 0) + (b.words[i] | 0) + carry;\n      this.words[i] = r & 0x3ffffff;\n      carry = r >>> 26;\n    }\n    for (; carry !== 0 && i < a.length; i++) {\n      r = (a.words[i] | 0) + carry;\n      this.words[i] = r & 0x3ffffff;\n      carry = r >>> 26;\n    }\n\n    this.length = a.length;\n    if (carry !== 0) {\n      this.words[this.length] = carry;\n      this.length++;\n    // Copy the rest of the words\n    } else if (a !== this) {\n      for (; i < a.length; i++) {\n        this.words[i] = a.words[i];\n      }\n    }\n\n    return this;\n  };\n\n  // Add `num` to `this`\n  BN.prototype.add = function add (num) {\n    var res;\n    if (num.negative !== 0 && this.negative === 0) {\n      num.negative = 0;\n      res = this.sub(num);\n      num.negative ^= 1;\n      return res;\n    } else if (num.negative === 0 && this.negative !== 0) {\n      this.negative = 0;\n      res = num.sub(this);\n      this.negative = 1;\n      return res;\n    }\n\n    if (this.length > num.length) return this.clone().iadd(num);\n\n    return num.clone().iadd(this);\n  };\n\n  // Subtract `num` from `this` in-place\n  BN.prototype.isub = function isub (num) {\n    // this - (-num) = this + num\n    if (num.negative !== 0) {\n      num.negative = 0;\n      var r = this.iadd(num);\n      num.negative = 1;\n      return r._normSign();\n\n    // -this - num = -(this + num)\n    } else if (this.negative !== 0) {\n      this.negative = 0;\n      this.iadd(num);\n      this.negative = 1;\n      return this._normSign();\n    }\n\n    // At this point both numbers are positive\n    var cmp = this.cmp(num);\n\n    // Optimization - zeroify\n    if (cmp === 0) {\n      this.negative = 0;\n      this.length = 1;\n      this.words[0] = 0;\n      return this;\n    }\n\n    // a > b\n    var a, b;\n    if (cmp > 0) {\n      a = this;\n      b = num;\n    } else {\n      a = num;\n      b = this;\n    }\n\n    var carry = 0;\n    for (var i = 0; i < b.length; i++) {\n      r = (a.words[i] | 0) - (b.words[i] | 0) + carry;\n      carry = r >> 26;\n      this.words[i] = r & 0x3ffffff;\n    }\n    for (; carry !== 0 && i < a.length; i++) {\n      r = (a.words[i] | 0) + carry;\n      carry = r >> 26;\n      this.words[i] = r & 0x3ffffff;\n    }\n\n    // Copy rest of the words\n    if (carry === 0 && i < a.length && a !== this) {\n      for (; i < a.length; i++) {\n        this.words[i] = a.words[i];\n      }\n    }\n\n    this.length = Math.max(this.length, i);\n\n    if (a !== this) {\n      this.negative = 1;\n    }\n\n    return this._strip();\n  };\n\n  // Subtract `num` from `this`\n  BN.prototype.sub = function sub (num) {\n    return this.clone().isub(num);\n  };\n\n  function smallMulTo (self, num, out) {\n    out.negative = num.negative ^ self.negative;\n    var len = (self.length + num.length) | 0;\n    out.length = len;\n    len = (len - 1) | 0;\n\n    // Peel one iteration (compiler can't do it, because of code complexity)\n    var a = self.words[0] | 0;\n    var b = num.words[0] | 0;\n    var r = a * b;\n\n    var lo = r & 0x3ffffff;\n    var carry = (r / 0x4000000) | 0;\n    out.words[0] = lo;\n\n    for (var k = 1; k < len; k++) {\n      // Sum all words with the same `i + j = k` and accumulate `ncarry`,\n      // note that ncarry could be >= 0x3ffffff\n      var ncarry = carry >>> 26;\n      var rword = carry & 0x3ffffff;\n      var maxJ = Math.min(k, num.length - 1);\n      for (var j = Math.max(0, k - self.length + 1); j <= maxJ; j++) {\n        var i = (k - j) | 0;\n        a = self.words[i] | 0;\n        b = num.words[j] | 0;\n        r = a * b + rword;\n        ncarry += (r / 0x4000000) | 0;\n        rword = r & 0x3ffffff;\n      }\n      out.words[k] = rword | 0;\n      carry = ncarry | 0;\n    }\n    if (carry !== 0) {\n      out.words[k] = carry | 0;\n    } else {\n      out.length--;\n    }\n\n    return out._strip();\n  }\n\n  // TODO(indutny): it may be reasonable to omit it for users who don't need\n  // to work with 256-bit numbers, otherwise it gives 20% improvement for 256-bit\n  // multiplication (like elliptic secp256k1).\n  var comb10MulTo = function comb10MulTo (self, num, out) {\n    var a = self.words;\n    var b = num.words;\n    var o = out.words;\n    var c = 0;\n    var lo;\n    var mid;\n    var hi;\n    var a0 = a[0] | 0;\n    var al0 = a0 & 0x1fff;\n    var ah0 = a0 >>> 13;\n    var a1 = a[1] | 0;\n    var al1 = a1 & 0x1fff;\n    var ah1 = a1 >>> 13;\n    var a2 = a[2] | 0;\n    var al2 = a2 & 0x1fff;\n    var ah2 = a2 >>> 13;\n    var a3 = a[3] | 0;\n    var al3 = a3 & 0x1fff;\n    var ah3 = a3 >>> 13;\n    var a4 = a[4] | 0;\n    var al4 = a4 & 0x1fff;\n    var ah4 = a4 >>> 13;\n    var a5 = a[5] | 0;\n    var al5 = a5 & 0x1fff;\n    var ah5 = a5 >>> 13;\n    var a6 = a[6] | 0;\n    var al6 = a6 & 0x1fff;\n    var ah6 = a6 >>> 13;\n    var a7 = a[7] | 0;\n    var al7 = a7 & 0x1fff;\n    var ah7 = a7 >>> 13;\n    var a8 = a[8] | 0;\n    var al8 = a8 & 0x1fff;\n    var ah8 = a8 >>> 13;\n    var a9 = a[9] | 0;\n    var al9 = a9 & 0x1fff;\n    var ah9 = a9 >>> 13;\n    var b0 = b[0] | 0;\n    var bl0 = b0 & 0x1fff;\n    var bh0 = b0 >>> 13;\n    var b1 = b[1] | 0;\n    var bl1 = b1 & 0x1fff;\n    var bh1 = b1 >>> 13;\n    var b2 = b[2] | 0;\n    var bl2 = b2 & 0x1fff;\n    var bh2 = b2 >>> 13;\n    var b3 = b[3] | 0;\n    var bl3 = b3 & 0x1fff;\n    var bh3 = b3 >>> 13;\n    var b4 = b[4] | 0;\n    var bl4 = b4 & 0x1fff;\n    var bh4 = b4 >>> 13;\n    var b5 = b[5] | 0;\n    var bl5 = b5 & 0x1fff;\n    var bh5 = b5 >>> 13;\n    var b6 = b[6] | 0;\n    var bl6 = b6 & 0x1fff;\n    var bh6 = b6 >>> 13;\n    var b7 = b[7] | 0;\n    var bl7 = b7 & 0x1fff;\n    var bh7 = b7 >>> 13;\n    var b8 = b[8] | 0;\n    var bl8 = b8 & 0x1fff;\n    var bh8 = b8 >>> 13;\n    var b9 = b[9] | 0;\n    var bl9 = b9 & 0x1fff;\n    var bh9 = b9 >>> 13;\n\n    out.negative = self.negative ^ num.negative;\n    out.length = 19;\n    /* k = 0 */\n    lo = Math.imul(al0, bl0);\n    mid = Math.imul(al0, bh0);\n    mid = (mid + Math.imul(ah0, bl0)) | 0;\n    hi = Math.imul(ah0, bh0);\n    var w0 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n    c = (((hi + (mid >>> 13)) | 0) + (w0 >>> 26)) | 0;\n    w0 &= 0x3ffffff;\n    /* k = 1 */\n    lo = Math.imul(al1, bl0);\n    mid = Math.imul(al1, bh0);\n    mid = (mid + Math.imul(ah1, bl0)) | 0;\n    hi = Math.imul(ah1, bh0);\n    lo = (lo + Math.imul(al0, bl1)) | 0;\n    mid = (mid + Math.imul(al0, bh1)) | 0;\n    mid = (mid + Math.imul(ah0, bl1)) | 0;\n    hi = (hi + Math.imul(ah0, bh1)) | 0;\n    var w1 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n    c = (((hi + (mid >>> 13)) | 0) + (w1 >>> 26)) | 0;\n    w1 &= 0x3ffffff;\n    /* k = 2 */\n    lo = Math.imul(al2, bl0);\n    mid = Math.imul(al2, bh0);\n    mid = (mid + Math.imul(ah2, bl0)) | 0;\n    hi = Math.imul(ah2, bh0);\n    lo = (lo + Math.imul(al1, bl1)) | 0;\n    mid = (mid + Math.imul(al1, bh1)) | 0;\n    mid = (mid + Math.imul(ah1, bl1)) | 0;\n    hi = (hi + Math.imul(ah1, bh1)) | 0;\n    lo = (lo + Math.imul(al0, bl2)) | 0;\n    mid = (mid + Math.imul(al0, bh2)) | 0;\n    mid = (mid + Math.imul(ah0, bl2)) | 0;\n    hi = (hi + Math.imul(ah0, bh2)) | 0;\n    var w2 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n    c = (((hi + (mid >>> 13)) | 0) + (w2 >>> 26)) | 0;\n    w2 &= 0x3ffffff;\n    /* k = 3 */\n    lo = Math.imul(al3, bl0);\n    mid = Math.imul(al3, bh0);\n    mid = (mid + Math.imul(ah3, bl0)) | 0;\n    hi = Math.imul(ah3, bh0);\n    lo = (lo + Math.imul(al2, bl1)) | 0;\n    mid = (mid + Math.imul(al2, bh1)) | 0;\n    mid = (mid + Math.imul(ah2, bl1)) | 0;\n    hi = (hi + Math.imul(ah2, bh1)) | 0;\n    lo = (lo + Math.imul(al1, bl2)) | 0;\n    mid = (mid + Math.imul(al1, bh2)) | 0;\n    mid = (mid + Math.imul(ah1, bl2)) | 0;\n    hi = (hi + Math.imul(ah1, bh2)) | 0;\n    lo = (lo + Math.imul(al0, bl3)) | 0;\n    mid = (mid + Math.imul(al0, bh3)) | 0;\n    mid = (mid + Math.imul(ah0, bl3)) | 0;\n    hi = (hi + Math.imul(ah0, bh3)) | 0;\n    var w3 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n    c = (((hi + (mid >>> 13)) | 0) + (w3 >>> 26)) | 0;\n    w3 &= 0x3ffffff;\n    /* k = 4 */\n    lo = Math.imul(al4, bl0);\n    mid = Math.imul(al4, bh0);\n    mid = (mid + Math.imul(ah4, bl0)) | 0;\n    hi = Math.imul(ah4, bh0);\n    lo = (lo + Math.imul(al3, bl1)) | 0;\n    mid = (mid + Math.imul(al3, bh1)) | 0;\n    mid = (mid + Math.imul(ah3, bl1)) | 0;\n    hi = (hi + Math.imul(ah3, bh1)) | 0;\n    lo = (lo + Math.imul(al2, bl2)) | 0;\n    mid = (mid + Math.imul(al2, bh2)) | 0;\n    mid = (mid + Math.imul(ah2, bl2)) | 0;\n    hi = (hi + Math.imul(ah2, bh2)) | 0;\n    lo = (lo + Math.imul(al1, bl3)) | 0;\n    mid = (mid + Math.imul(al1, bh3)) | 0;\n    mid = (mid + Math.imul(ah1, bl3)) | 0;\n    hi = (hi + Math.imul(ah1, bh3)) | 0;\n    lo = (lo + Math.imul(al0, bl4)) | 0;\n    mid = (mid + Math.imul(al0, bh4)) | 0;\n    mid = (mid + Math.imul(ah0, bl4)) | 0;\n    hi = (hi + Math.imul(ah0, bh4)) | 0;\n    var w4 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n    c = (((hi + (mid >>> 13)) | 0) + (w4 >>> 26)) | 0;\n    w4 &= 0x3ffffff;\n    /* k = 5 */\n    lo = Math.imul(al5, bl0);\n    mid = Math.imul(al5, bh0);\n    mid = (mid + Math.imul(ah5, bl0)) | 0;\n    hi = Math.imul(ah5, bh0);\n    lo = (lo + Math.imul(al4, bl1)) | 0;\n    mid = (mid + Math.imul(al4, bh1)) | 0;\n    mid = (mid + Math.imul(ah4, bl1)) | 0;\n    hi = (hi + Math.imul(ah4, bh1)) | 0;\n    lo = (lo + Math.imul(al3, bl2)) | 0;\n    mid = (mid + Math.imul(al3, bh2)) | 0;\n    mid = (mid + Math.imul(ah3, bl2)) | 0;\n    hi = (hi + Math.imul(ah3, bh2)) | 0;\n    lo = (lo + Math.imul(al2, bl3)) | 0;\n    mid = (mid + Math.imul(al2, bh3)) | 0;\n    mid = (mid + Math.imul(ah2, bl3)) | 0;\n    hi = (hi + Math.imul(ah2, bh3)) | 0;\n    lo = (lo + Math.imul(al1, bl4)) | 0;\n    mid = (mid + Math.imul(al1, bh4)) | 0;\n    mid = (mid + Math.imul(ah1, bl4)) | 0;\n    hi = (hi + Math.imul(ah1, bh4)) | 0;\n    lo = (lo + Math.imul(al0, bl5)) | 0;\n    mid = (mid + Math.imul(al0, bh5)) | 0;\n    mid = (mid + Math.imul(ah0, bl5)) | 0;\n    hi = (hi + Math.imul(ah0, bh5)) | 0;\n    var w5 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n    c = (((hi + (mid >>> 13)) | 0) + (w5 >>> 26)) | 0;\n    w5 &= 0x3ffffff;\n    /* k = 6 */\n    lo = Math.imul(al6, bl0);\n    mid = Math.imul(al6, bh0);\n    mid = (mid + Math.imul(ah6, bl0)) | 0;\n    hi = Math.imul(ah6, bh0);\n    lo = (lo + Math.imul(al5, bl1)) | 0;\n    mid = (mid + Math.imul(al5, bh1)) | 0;\n    mid = (mid + Math.imul(ah5, bl1)) | 0;\n    hi = (hi + Math.imul(ah5, bh1)) | 0;\n    lo = (lo + Math.imul(al4, bl2)) | 0;\n    mid = (mid + Math.imul(al4, bh2)) | 0;\n    mid = (mid + Math.imul(ah4, bl2)) | 0;\n    hi = (hi + Math.imul(ah4, bh2)) | 0;\n    lo = (lo + Math.imul(al3, bl3)) | 0;\n    mid = (mid + Math.imul(al3, bh3)) | 0;\n    mid = (mid + Math.imul(ah3, bl3)) | 0;\n    hi = (hi + Math.imul(ah3, bh3)) | 0;\n    lo = (lo + Math.imul(al2, bl4)) | 0;\n    mid = (mid + Math.imul(al2, bh4)) | 0;\n    mid = (mid + Math.imul(ah2, bl4)) | 0;\n    hi = (hi + Math.imul(ah2, bh4)) | 0;\n    lo = (lo + Math.imul(al1, bl5)) | 0;\n    mid = (mid + Math.imul(al1, bh5)) | 0;\n    mid = (mid + Math.imul(ah1, bl5)) | 0;\n    hi = (hi + Math.imul(ah1, bh5)) | 0;\n    lo = (lo + Math.imul(al0, bl6)) | 0;\n    mid = (mid + Math.imul(al0, bh6)) | 0;\n    mid = (mid + Math.imul(ah0, bl6)) | 0;\n    hi = (hi + Math.imul(ah0, bh6)) | 0;\n    var w6 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n    c = (((hi + (mid >>> 13)) | 0) + (w6 >>> 26)) | 0;\n    w6 &= 0x3ffffff;\n    /* k = 7 */\n    lo = Math.imul(al7, bl0);\n    mid = Math.imul(al7, bh0);\n    mid = (mid + Math.imul(ah7, bl0)) | 0;\n    hi = Math.imul(ah7, bh0);\n    lo = (lo + Math.imul(al6, bl1)) | 0;\n    mid = (mid + Math.imul(al6, bh1)) | 0;\n    mid = (mid + Math.imul(ah6, bl1)) | 0;\n    hi = (hi + Math.imul(ah6, bh1)) | 0;\n    lo = (lo + Math.imul(al5, bl2)) | 0;\n    mid = (mid + Math.imul(al5, bh2)) | 0;\n    mid = (mid + Math.imul(ah5, bl2)) | 0;\n    hi = (hi + Math.imul(ah5, bh2)) | 0;\n    lo = (lo + Math.imul(al4, bl3)) | 0;\n    mid = (mid + Math.imul(al4, bh3)) | 0;\n    mid = (mid + Math.imul(ah4, bl3)) | 0;\n    hi = (hi + Math.imul(ah4, bh3)) | 0;\n    lo = (lo + Math.imul(al3, bl4)) | 0;\n    mid = (mid + Math.imul(al3, bh4)) | 0;\n    mid = (mid + Math.imul(ah3, bl4)) | 0;\n    hi = (hi + Math.imul(ah3, bh4)) | 0;\n    lo = (lo + Math.imul(al2, bl5)) | 0;\n    mid = (mid + Math.imul(al2, bh5)) | 0;\n    mid = (mid + Math.imul(ah2, bl5)) | 0;\n    hi = (hi + Math.imul(ah2, bh5)) | 0;\n    lo = (lo + Math.imul(al1, bl6)) | 0;\n    mid = (mid + Math.imul(al1, bh6)) | 0;\n    mid = (mid + Math.imul(ah1, bl6)) | 0;\n    hi = (hi + Math.imul(ah1, bh6)) | 0;\n    lo = (lo + Math.imul(al0, bl7)) | 0;\n    mid = (mid + Math.imul(al0, bh7)) | 0;\n    mid = (mid + Math.imul(ah0, bl7)) | 0;\n    hi = (hi + Math.imul(ah0, bh7)) | 0;\n    var w7 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n    c = (((hi + (mid >>> 13)) | 0) + (w7 >>> 26)) | 0;\n    w7 &= 0x3ffffff;\n    /* k = 8 */\n    lo = Math.imul(al8, bl0);\n    mid = Math.imul(al8, bh0);\n    mid = (mid + Math.imul(ah8, bl0)) | 0;\n    hi = Math.imul(ah8, bh0);\n    lo = (lo + Math.imul(al7, bl1)) | 0;\n    mid = (mid + Math.imul(al7, bh1)) | 0;\n    mid = (mid + Math.imul(ah7, bl1)) | 0;\n    hi = (hi + Math.imul(ah7, bh1)) | 0;\n    lo = (lo + Math.imul(al6, bl2)) | 0;\n    mid = (mid + Math.imul(al6, bh2)) | 0;\n    mid = (mid + Math.imul(ah6, bl2)) | 0;\n    hi = (hi + Math.imul(ah6, bh2)) | 0;\n    lo = (lo + Math.imul(al5, bl3)) | 0;\n    mid = (mid + Math.imul(al5, bh3)) | 0;\n    mid = (mid + Math.imul(ah5, bl3)) | 0;\n    hi = (hi + Math.imul(ah5, bh3)) | 0;\n    lo = (lo + Math.imul(al4, bl4)) | 0;\n    mid = (mid + Math.imul(al4, bh4)) | 0;\n    mid = (mid + Math.imul(ah4, bl4)) | 0;\n    hi = (hi + Math.imul(ah4, bh4)) | 0;\n    lo = (lo + Math.imul(al3, bl5)) | 0;\n    mid = (mid + Math.imul(al3, bh5)) | 0;\n    mid = (mid + Math.imul(ah3, bl5)) | 0;\n    hi = (hi + Math.imul(ah3, bh5)) | 0;\n    lo = (lo + Math.imul(al2, bl6)) | 0;\n    mid = (mid + Math.imul(al2, bh6)) | 0;\n    mid = (mid + Math.imul(ah2, bl6)) | 0;\n    hi = (hi + Math.imul(ah2, bh6)) | 0;\n    lo = (lo + Math.imul(al1, bl7)) | 0;\n    mid = (mid + Math.imul(al1, bh7)) | 0;\n    mid = (mid + Math.imul(ah1, bl7)) | 0;\n    hi = (hi + Math.imul(ah1, bh7)) | 0;\n    lo = (lo + Math.imul(al0, bl8)) | 0;\n    mid = (mid + Math.imul(al0, bh8)) | 0;\n    mid = (mid + Math.imul(ah0, bl8)) | 0;\n    hi = (hi + Math.imul(ah0, bh8)) | 0;\n    var w8 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n    c = (((hi + (mid >>> 13)) | 0) + (w8 >>> 26)) | 0;\n    w8 &= 0x3ffffff;\n    /* k = 9 */\n    lo = Math.imul(al9, bl0);\n    mid = Math.imul(al9, bh0);\n    mid = (mid + Math.imul(ah9, bl0)) | 0;\n    hi = Math.imul(ah9, bh0);\n    lo = (lo + Math.imul(al8, bl1)) | 0;\n    mid = (mid + Math.imul(al8, bh1)) | 0;\n    mid = (mid + Math.imul(ah8, bl1)) | 0;\n    hi = (hi + Math.imul(ah8, bh1)) | 0;\n    lo = (lo + Math.imul(al7, bl2)) | 0;\n    mid = (mid + Math.imul(al7, bh2)) | 0;\n    mid = (mid + Math.imul(ah7, bl2)) | 0;\n    hi = (hi + Math.imul(ah7, bh2)) | 0;\n    lo = (lo + Math.imul(al6, bl3)) | 0;\n    mid = (mid + Math.imul(al6, bh3)) | 0;\n    mid = (mid + Math.imul(ah6, bl3)) | 0;\n    hi = (hi + Math.imul(ah6, bh3)) | 0;\n    lo = (lo + Math.imul(al5, bl4)) | 0;\n    mid = (mid + Math.imul(al5, bh4)) | 0;\n    mid = (mid + Math.imul(ah5, bl4)) | 0;\n    hi = (hi + Math.imul(ah5, bh4)) | 0;\n    lo = (lo + Math.imul(al4, bl5)) | 0;\n    mid = (mid + Math.imul(al4, bh5)) | 0;\n    mid = (mid + Math.imul(ah4, bl5)) | 0;\n    hi = (hi + Math.imul(ah4, bh5)) | 0;\n    lo = (lo + Math.imul(al3, bl6)) | 0;\n    mid = (mid + Math.imul(al3, bh6)) | 0;\n    mid = (mid + Math.imul(ah3, bl6)) | 0;\n    hi = (hi + Math.imul(ah3, bh6)) | 0;\n    lo = (lo + Math.imul(al2, bl7)) | 0;\n    mid = (mid + Math.imul(al2, bh7)) | 0;\n    mid = (mid + Math.imul(ah2, bl7)) | 0;\n    hi = (hi + Math.imul(ah2, bh7)) | 0;\n    lo = (lo + Math.imul(al1, bl8)) | 0;\n    mid = (mid + Math.imul(al1, bh8)) | 0;\n    mid = (mid + Math.imul(ah1, bl8)) | 0;\n    hi = (hi + Math.imul(ah1, bh8)) | 0;\n    lo = (lo + Math.imul(al0, bl9)) | 0;\n    mid = (mid + Math.imul(al0, bh9)) | 0;\n    mid = (mid + Math.imul(ah0, bl9)) | 0;\n    hi = (hi + Math.imul(ah0, bh9)) | 0;\n    var w9 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n    c = (((hi + (mid >>> 13)) | 0) + (w9 >>> 26)) | 0;\n    w9 &= 0x3ffffff;\n    /* k = 10 */\n    lo = Math.imul(al9, bl1);\n    mid = Math.imul(al9, bh1);\n    mid = (mid + Math.imul(ah9, bl1)) | 0;\n    hi = Math.imul(ah9, bh1);\n    lo = (lo + Math.imul(al8, bl2)) | 0;\n    mid = (mid + Math.imul(al8, bh2)) | 0;\n    mid = (mid + Math.imul(ah8, bl2)) | 0;\n    hi = (hi + Math.imul(ah8, bh2)) | 0;\n    lo = (lo + Math.imul(al7, bl3)) | 0;\n    mid = (mid + Math.imul(al7, bh3)) | 0;\n    mid = (mid + Math.imul(ah7, bl3)) | 0;\n    hi = (hi + Math.imul(ah7, bh3)) | 0;\n    lo = (lo + Math.imul(al6, bl4)) | 0;\n    mid = (mid + Math.imul(al6, bh4)) | 0;\n    mid = (mid + Math.imul(ah6, bl4)) | 0;\n    hi = (hi + Math.imul(ah6, bh4)) | 0;\n    lo = (lo + Math.imul(al5, bl5)) | 0;\n    mid = (mid + Math.imul(al5, bh5)) | 0;\n    mid = (mid + Math.imul(ah5, bl5)) | 0;\n    hi = (hi + Math.imul(ah5, bh5)) | 0;\n    lo = (lo + Math.imul(al4, bl6)) | 0;\n    mid = (mid + Math.imul(al4, bh6)) | 0;\n    mid = (mid + Math.imul(ah4, bl6)) | 0;\n    hi = (hi + Math.imul(ah4, bh6)) | 0;\n    lo = (lo + Math.imul(al3, bl7)) | 0;\n    mid = (mid + Math.imul(al3, bh7)) | 0;\n    mid = (mid + Math.imul(ah3, bl7)) | 0;\n    hi = (hi + Math.imul(ah3, bh7)) | 0;\n    lo = (lo + Math.imul(al2, bl8)) | 0;\n    mid = (mid + Math.imul(al2, bh8)) | 0;\n    mid = (mid + Math.imul(ah2, bl8)) | 0;\n    hi = (hi + Math.imul(ah2, bh8)) | 0;\n    lo = (lo + Math.imul(al1, bl9)) | 0;\n    mid = (mid + Math.imul(al1, bh9)) | 0;\n    mid = (mid + Math.imul(ah1, bl9)) | 0;\n    hi = (hi + Math.imul(ah1, bh9)) | 0;\n    var w10 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n    c = (((hi + (mid >>> 13)) | 0) + (w10 >>> 26)) | 0;\n    w10 &= 0x3ffffff;\n    /* k = 11 */\n    lo = Math.imul(al9, bl2);\n    mid = Math.imul(al9, bh2);\n    mid = (mid + Math.imul(ah9, bl2)) | 0;\n    hi = Math.imul(ah9, bh2);\n    lo = (lo + Math.imul(al8, bl3)) | 0;\n    mid = (mid + Math.imul(al8, bh3)) | 0;\n    mid = (mid + Math.imul(ah8, bl3)) | 0;\n    hi = (hi + Math.imul(ah8, bh3)) | 0;\n    lo = (lo + Math.imul(al7, bl4)) | 0;\n    mid = (mid + Math.imul(al7, bh4)) | 0;\n    mid = (mid + Math.imul(ah7, bl4)) | 0;\n    hi = (hi + Math.imul(ah7, bh4)) | 0;\n    lo = (lo + Math.imul(al6, bl5)) | 0;\n    mid = (mid + Math.imul(al6, bh5)) | 0;\n    mid = (mid + Math.imul(ah6, bl5)) | 0;\n    hi = (hi + Math.imul(ah6, bh5)) | 0;\n    lo = (lo + Math.imul(al5, bl6)) | 0;\n    mid = (mid + Math.imul(al5, bh6)) | 0;\n    mid = (mid + Math.imul(ah5, bl6)) | 0;\n    hi = (hi + Math.imul(ah5, bh6)) | 0;\n    lo = (lo + Math.imul(al4, bl7)) | 0;\n    mid = (mid + Math.imul(al4, bh7)) | 0;\n    mid = (mid + Math.imul(ah4, bl7)) | 0;\n    hi = (hi + Math.imul(ah4, bh7)) | 0;\n    lo = (lo + Math.imul(al3, bl8)) | 0;\n    mid = (mid + Math.imul(al3, bh8)) | 0;\n    mid = (mid + Math.imul(ah3, bl8)) | 0;\n    hi = (hi + Math.imul(ah3, bh8)) | 0;\n    lo = (lo + Math.imul(al2, bl9)) | 0;\n    mid = (mid + Math.imul(al2, bh9)) | 0;\n    mid = (mid + Math.imul(ah2, bl9)) | 0;\n    hi = (hi + Math.imul(ah2, bh9)) | 0;\n    var w11 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n    c = (((hi + (mid >>> 13)) | 0) + (w11 >>> 26)) | 0;\n    w11 &= 0x3ffffff;\n    /* k = 12 */\n    lo = Math.imul(al9, bl3);\n    mid = Math.imul(al9, bh3);\n    mid = (mid + Math.imul(ah9, bl3)) | 0;\n    hi = Math.imul(ah9, bh3);\n    lo = (lo + Math.imul(al8, bl4)) | 0;\n    mid = (mid + Math.imul(al8, bh4)) | 0;\n    mid = (mid + Math.imul(ah8, bl4)) | 0;\n    hi = (hi + Math.imul(ah8, bh4)) | 0;\n    lo = (lo + Math.imul(al7, bl5)) | 0;\n    mid = (mid + Math.imul(al7, bh5)) | 0;\n    mid = (mid + Math.imul(ah7, bl5)) | 0;\n    hi = (hi + Math.imul(ah7, bh5)) | 0;\n    lo = (lo + Math.imul(al6, bl6)) | 0;\n    mid = (mid + Math.imul(al6, bh6)) | 0;\n    mid = (mid + Math.imul(ah6, bl6)) | 0;\n    hi = (hi + Math.imul(ah6, bh6)) | 0;\n    lo = (lo + Math.imul(al5, bl7)) | 0;\n    mid = (mid + Math.imul(al5, bh7)) | 0;\n    mid = (mid + Math.imul(ah5, bl7)) | 0;\n    hi = (hi + Math.imul(ah5, bh7)) | 0;\n    lo = (lo + Math.imul(al4, bl8)) | 0;\n    mid = (mid + Math.imul(al4, bh8)) | 0;\n    mid = (mid + Math.imul(ah4, bl8)) | 0;\n    hi = (hi + Math.imul(ah4, bh8)) | 0;\n    lo = (lo + Math.imul(al3, bl9)) | 0;\n    mid = (mid + Math.imul(al3, bh9)) | 0;\n    mid = (mid + Math.imul(ah3, bl9)) | 0;\n    hi = (hi + Math.imul(ah3, bh9)) | 0;\n    var w12 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n    c = (((hi + (mid >>> 13)) | 0) + (w12 >>> 26)) | 0;\n    w12 &= 0x3ffffff;\n    /* k = 13 */\n    lo = Math.imul(al9, bl4);\n    mid = Math.imul(al9, bh4);\n    mid = (mid + Math.imul(ah9, bl4)) | 0;\n    hi = Math.imul(ah9, bh4);\n    lo = (lo + Math.imul(al8, bl5)) | 0;\n    mid = (mid + Math.imul(al8, bh5)) | 0;\n    mid = (mid + Math.imul(ah8, bl5)) | 0;\n    hi = (hi + Math.imul(ah8, bh5)) | 0;\n    lo = (lo + Math.imul(al7, bl6)) | 0;\n    mid = (mid + Math.imul(al7, bh6)) | 0;\n    mid = (mid + Math.imul(ah7, bl6)) | 0;\n    hi = (hi + Math.imul(ah7, bh6)) | 0;\n    lo = (lo + Math.imul(al6, bl7)) | 0;\n    mid = (mid + Math.imul(al6, bh7)) | 0;\n    mid = (mid + Math.imul(ah6, bl7)) | 0;\n    hi = (hi + Math.imul(ah6, bh7)) | 0;\n    lo = (lo + Math.imul(al5, bl8)) | 0;\n    mid = (mid + Math.imul(al5, bh8)) | 0;\n    mid = (mid + Math.imul(ah5, bl8)) | 0;\n    hi = (hi + Math.imul(ah5, bh8)) | 0;\n    lo = (lo + Math.imul(al4, bl9)) | 0;\n    mid = (mid + Math.imul(al4, bh9)) | 0;\n    mid = (mid + Math.imul(ah4, bl9)) | 0;\n    hi = (hi + Math.imul(ah4, bh9)) | 0;\n    var w13 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n    c = (((hi + (mid >>> 13)) | 0) + (w13 >>> 26)) | 0;\n    w13 &= 0x3ffffff;\n    /* k = 14 */\n    lo = Math.imul(al9, bl5);\n    mid = Math.imul(al9, bh5);\n    mid = (mid + Math.imul(ah9, bl5)) | 0;\n    hi = Math.imul(ah9, bh5);\n    lo = (lo + Math.imul(al8, bl6)) | 0;\n    mid = (mid + Math.imul(al8, bh6)) | 0;\n    mid = (mid + Math.imul(ah8, bl6)) | 0;\n    hi = (hi + Math.imul(ah8, bh6)) | 0;\n    lo = (lo + Math.imul(al7, bl7)) | 0;\n    mid = (mid + Math.imul(al7, bh7)) | 0;\n    mid = (mid + Math.imul(ah7, bl7)) | 0;\n    hi = (hi + Math.imul(ah7, bh7)) | 0;\n    lo = (lo + Math.imul(al6, bl8)) | 0;\n    mid = (mid + Math.imul(al6, bh8)) | 0;\n    mid = (mid + Math.imul(ah6, bl8)) | 0;\n    hi = (hi + Math.imul(ah6, bh8)) | 0;\n    lo = (lo + Math.imul(al5, bl9)) | 0;\n    mid = (mid + Math.imul(al5, bh9)) | 0;\n    mid = (mid + Math.imul(ah5, bl9)) | 0;\n    hi = (hi + Math.imul(ah5, bh9)) | 0;\n    var w14 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n    c = (((hi + (mid >>> 13)) | 0) + (w14 >>> 26)) | 0;\n    w14 &= 0x3ffffff;\n    /* k = 15 */\n    lo = Math.imul(al9, bl6);\n    mid = Math.imul(al9, bh6);\n    mid = (mid + Math.imul(ah9, bl6)) | 0;\n    hi = Math.imul(ah9, bh6);\n    lo = (lo + Math.imul(al8, bl7)) | 0;\n    mid = (mid + Math.imul(al8, bh7)) | 0;\n    mid = (mid + Math.imul(ah8, bl7)) | 0;\n    hi = (hi + Math.imul(ah8, bh7)) | 0;\n    lo = (lo + Math.imul(al7, bl8)) | 0;\n    mid = (mid + Math.imul(al7, bh8)) | 0;\n    mid = (mid + Math.imul(ah7, bl8)) | 0;\n    hi = (hi + Math.imul(ah7, bh8)) | 0;\n    lo = (lo + Math.imul(al6, bl9)) | 0;\n    mid = (mid + Math.imul(al6, bh9)) | 0;\n    mid = (mid + Math.imul(ah6, bl9)) | 0;\n    hi = (hi + Math.imul(ah6, bh9)) | 0;\n    var w15 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n    c = (((hi + (mid >>> 13)) | 0) + (w15 >>> 26)) | 0;\n    w15 &= 0x3ffffff;\n    /* k = 16 */\n    lo = Math.imul(al9, bl7);\n    mid = Math.imul(al9, bh7);\n    mid = (mid + Math.imul(ah9, bl7)) | 0;\n    hi = Math.imul(ah9, bh7);\n    lo = (lo + Math.imul(al8, bl8)) | 0;\n    mid = (mid + Math.imul(al8, bh8)) | 0;\n    mid = (mid + Math.imul(ah8, bl8)) | 0;\n    hi = (hi + Math.imul(ah8, bh8)) | 0;\n    lo = (lo + Math.imul(al7, bl9)) | 0;\n    mid = (mid + Math.imul(al7, bh9)) | 0;\n    mid = (mid + Math.imul(ah7, bl9)) | 0;\n    hi = (hi + Math.imul(ah7, bh9)) | 0;\n    var w16 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n    c = (((hi + (mid >>> 13)) | 0) + (w16 >>> 26)) | 0;\n    w16 &= 0x3ffffff;\n    /* k = 17 */\n    lo = Math.imul(al9, bl8);\n    mid = Math.imul(al9, bh8);\n    mid = (mid + Math.imul(ah9, bl8)) | 0;\n    hi = Math.imul(ah9, bh8);\n    lo = (lo + Math.imul(al8, bl9)) | 0;\n    mid = (mid + Math.imul(al8, bh9)) | 0;\n    mid = (mid + Math.imul(ah8, bl9)) | 0;\n    hi = (hi + Math.imul(ah8, bh9)) | 0;\n    var w17 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n    c = (((hi + (mid >>> 13)) | 0) + (w17 >>> 26)) | 0;\n    w17 &= 0x3ffffff;\n    /* k = 18 */\n    lo = Math.imul(al9, bl9);\n    mid = Math.imul(al9, bh9);\n    mid = (mid + Math.imul(ah9, bl9)) | 0;\n    hi = Math.imul(ah9, bh9);\n    var w18 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n    c = (((hi + (mid >>> 13)) | 0) + (w18 >>> 26)) | 0;\n    w18 &= 0x3ffffff;\n    o[0] = w0;\n    o[1] = w1;\n    o[2] = w2;\n    o[3] = w3;\n    o[4] = w4;\n    o[5] = w5;\n    o[6] = w6;\n    o[7] = w7;\n    o[8] = w8;\n    o[9] = w9;\n    o[10] = w10;\n    o[11] = w11;\n    o[12] = w12;\n    o[13] = w13;\n    o[14] = w14;\n    o[15] = w15;\n    o[16] = w16;\n    o[17] = w17;\n    o[18] = w18;\n    if (c !== 0) {\n      o[19] = c;\n      out.length++;\n    }\n    return out;\n  };\n\n  // Polyfill comb\n  if (!Math.imul) {\n    comb10MulTo = smallMulTo;\n  }\n\n  function bigMulTo (self, num, out) {\n    out.negative = num.negative ^ self.negative;\n    out.length = self.length + num.length;\n\n    var carry = 0;\n    var hncarry = 0;\n    for (var k = 0; k < out.length - 1; k++) {\n      // Sum all words with the same `i + j = k` and accumulate `ncarry`,\n      // note that ncarry could be >= 0x3ffffff\n      var ncarry = hncarry;\n      hncarry = 0;\n      var rword = carry & 0x3ffffff;\n      var maxJ = Math.min(k, num.length - 1);\n      for (var j = Math.max(0, k - self.length + 1); j <= maxJ; j++) {\n        var i = k - j;\n        var a = self.words[i] | 0;\n        var b = num.words[j] | 0;\n        var r = a * b;\n\n        var lo = r & 0x3ffffff;\n        ncarry = (ncarry + ((r / 0x4000000) | 0)) | 0;\n        lo = (lo + rword) | 0;\n        rword = lo & 0x3ffffff;\n        ncarry = (ncarry + (lo >>> 26)) | 0;\n\n        hncarry += ncarry >>> 26;\n        ncarry &= 0x3ffffff;\n      }\n      out.words[k] = rword;\n      carry = ncarry;\n      ncarry = hncarry;\n    }\n    if (carry !== 0) {\n      out.words[k] = carry;\n    } else {\n      out.length--;\n    }\n\n    return out._strip();\n  }\n\n  function jumboMulTo (self, num, out) {\n    // Temporary disable, see https://github.com/indutny/bn.js/issues/211\n    // var fftm = new FFTM();\n    // return fftm.mulp(self, num, out);\n    return bigMulTo(self, num, out);\n  }\n\n  BN.prototype.mulTo = function mulTo (num, out) {\n    var res;\n    var len = this.length + num.length;\n    if (this.length === 10 && num.length === 10) {\n      res = comb10MulTo(this, num, out);\n    } else if (len < 63) {\n      res = smallMulTo(this, num, out);\n    } else if (len < 1024) {\n      res = bigMulTo(this, num, out);\n    } else {\n      res = jumboMulTo(this, num, out);\n    }\n\n    return res;\n  };\n\n  // Cooley-Tukey algorithm for FFT\n  // slightly revisited to rely on looping instead of recursion\n\n  function FFTM (x, y) {\n    this.x = x;\n    this.y = y;\n  }\n\n  FFTM.prototype.makeRBT = function makeRBT (N) {\n    var t = new Array(N);\n    var l = BN.prototype._countBits(N) - 1;\n    for (var i = 0; i < N; i++) {\n      t[i] = this.revBin(i, l, N);\n    }\n\n    return t;\n  };\n\n  // Returns binary-reversed representation of `x`\n  FFTM.prototype.revBin = function revBin (x, l, N) {\n    if (x === 0 || x === N - 1) return x;\n\n    var rb = 0;\n    for (var i = 0; i < l; i++) {\n      rb |= (x & 1) << (l - i - 1);\n      x >>= 1;\n    }\n\n    return rb;\n  };\n\n  // Performs \"tweedling\" phase, therefore 'emulating'\n  // behaviour of the recursive algorithm\n  FFTM.prototype.permute = function permute (rbt, rws, iws, rtws, itws, N) {\n    for (var i = 0; i < N; i++) {\n      rtws[i] = rws[rbt[i]];\n      itws[i] = iws[rbt[i]];\n    }\n  };\n\n  FFTM.prototype.transform = function transform (rws, iws, rtws, itws, N, rbt) {\n    this.permute(rbt, rws, iws, rtws, itws, N);\n\n    for (var s = 1; s < N; s <<= 1) {\n      var l = s << 1;\n\n      var rtwdf = Math.cos(2 * Math.PI / l);\n      var itwdf = Math.sin(2 * Math.PI / l);\n\n      for (var p = 0; p < N; p += l) {\n        var rtwdf_ = rtwdf;\n        var itwdf_ = itwdf;\n\n        for (var j = 0; j < s; j++) {\n          var re = rtws[p + j];\n          var ie = itws[p + j];\n\n          var ro = rtws[p + j + s];\n          var io = itws[p + j + s];\n\n          var rx = rtwdf_ * ro - itwdf_ * io;\n\n          io = rtwdf_ * io + itwdf_ * ro;\n          ro = rx;\n\n          rtws[p + j] = re + ro;\n          itws[p + j] = ie + io;\n\n          rtws[p + j + s] = re - ro;\n          itws[p + j + s] = ie - io;\n\n          /* jshint maxdepth : false */\n          if (j !== l) {\n            rx = rtwdf * rtwdf_ - itwdf * itwdf_;\n\n            itwdf_ = rtwdf * itwdf_ + itwdf * rtwdf_;\n            rtwdf_ = rx;\n          }\n        }\n      }\n    }\n  };\n\n  FFTM.prototype.guessLen13b = function guessLen13b (n, m) {\n    var N = Math.max(m, n) | 1;\n    var odd = N & 1;\n    var i = 0;\n    for (N = N / 2 | 0; N; N = N >>> 1) {\n      i++;\n    }\n\n    return 1 << i + 1 + odd;\n  };\n\n  FFTM.prototype.conjugate = function conjugate (rws, iws, N) {\n    if (N <= 1) return;\n\n    for (var i = 0; i < N / 2; i++) {\n      var t = rws[i];\n\n      rws[i] = rws[N - i - 1];\n      rws[N - i - 1] = t;\n\n      t = iws[i];\n\n      iws[i] = -iws[N - i - 1];\n      iws[N - i - 1] = -t;\n    }\n  };\n\n  FFTM.prototype.normalize13b = function normalize13b (ws, N) {\n    var carry = 0;\n    for (var i = 0; i < N / 2; i++) {\n      var w = Math.round(ws[2 * i + 1] / N) * 0x2000 +\n        Math.round(ws[2 * i] / N) +\n        carry;\n\n      ws[i] = w & 0x3ffffff;\n\n      if (w < 0x4000000) {\n        carry = 0;\n      } else {\n        carry = w / 0x4000000 | 0;\n      }\n    }\n\n    return ws;\n  };\n\n  FFTM.prototype.convert13b = function convert13b (ws, len, rws, N) {\n    var carry = 0;\n    for (var i = 0; i < len; i++) {\n      carry = carry + (ws[i] | 0);\n\n      rws[2 * i] = carry & 0x1fff; carry = carry >>> 13;\n      rws[2 * i + 1] = carry & 0x1fff; carry = carry >>> 13;\n    }\n\n    // Pad with zeroes\n    for (i = 2 * len; i < N; ++i) {\n      rws[i] = 0;\n    }\n\n    assert(carry === 0);\n    assert((carry & ~0x1fff) === 0);\n  };\n\n  FFTM.prototype.stub = function stub (N) {\n    var ph = new Array(N);\n    for (var i = 0; i < N; i++) {\n      ph[i] = 0;\n    }\n\n    return ph;\n  };\n\n  FFTM.prototype.mulp = function mulp (x, y, out) {\n    var N = 2 * this.guessLen13b(x.length, y.length);\n\n    var rbt = this.makeRBT(N);\n\n    var _ = this.stub(N);\n\n    var rws = new Array(N);\n    var rwst = new Array(N);\n    var iwst = new Array(N);\n\n    var nrws = new Array(N);\n    var nrwst = new Array(N);\n    var niwst = new Array(N);\n\n    var rmws = out.words;\n    rmws.length = N;\n\n    this.convert13b(x.words, x.length, rws, N);\n    this.convert13b(y.words, y.length, nrws, N);\n\n    this.transform(rws, _, rwst, iwst, N, rbt);\n    this.transform(nrws, _, nrwst, niwst, N, rbt);\n\n    for (var i = 0; i < N; i++) {\n      var rx = rwst[i] * nrwst[i] - iwst[i] * niwst[i];\n      iwst[i] = rwst[i] * niwst[i] + iwst[i] * nrwst[i];\n      rwst[i] = rx;\n    }\n\n    this.conjugate(rwst, iwst, N);\n    this.transform(rwst, iwst, rmws, _, N, rbt);\n    this.conjugate(rmws, _, N);\n    this.normalize13b(rmws, N);\n\n    out.negative = x.negative ^ y.negative;\n    out.length = x.length + y.length;\n    return out._strip();\n  };\n\n  // Multiply `this` by `num`\n  BN.prototype.mul = function mul (num) {\n    var out = new BN(null);\n    out.words = new Array(this.length + num.length);\n    return this.mulTo(num, out);\n  };\n\n  // Multiply employing FFT\n  BN.prototype.mulf = function mulf (num) {\n    var out = new BN(null);\n    out.words = new Array(this.length + num.length);\n    return jumboMulTo(this, num, out);\n  };\n\n  // In-place Multiplication\n  BN.prototype.imul = function imul (num) {\n    return this.clone().mulTo(num, this);\n  };\n\n  BN.prototype.imuln = function imuln (num) {\n    var isNegNum = num < 0;\n    if (isNegNum) num = -num;\n\n    assert(typeof num === 'number');\n    assert(num < 0x4000000);\n\n    // Carry\n    var carry = 0;\n    for (var i = 0; i < this.length; i++) {\n      var w = (this.words[i] | 0) * num;\n      var lo = (w & 0x3ffffff) + (carry & 0x3ffffff);\n      carry >>= 26;\n      carry += (w / 0x4000000) | 0;\n      // NOTE: lo is 27bit maximum\n      carry += lo >>> 26;\n      this.words[i] = lo & 0x3ffffff;\n    }\n\n    if (carry !== 0) {\n      this.words[i] = carry;\n      this.length++;\n    }\n\n    return isNegNum ? this.ineg() : this;\n  };\n\n  BN.prototype.muln = function muln (num) {\n    return this.clone().imuln(num);\n  };\n\n  // `this` * `this`\n  BN.prototype.sqr = function sqr () {\n    return this.mul(this);\n  };\n\n  // `this` * `this` in-place\n  BN.prototype.isqr = function isqr () {\n    return this.imul(this.clone());\n  };\n\n  // Math.pow(`this`, `num`)\n  BN.prototype.pow = function pow (num) {\n    var w = toBitArray(num);\n    if (w.length === 0) return new BN(1);\n\n    // Skip leading zeroes\n    var res = this;\n    for (var i = 0; i < w.length; i++, res = res.sqr()) {\n      if (w[i] !== 0) break;\n    }\n\n    if (++i < w.length) {\n      for (var q = res.sqr(); i < w.length; i++, q = q.sqr()) {\n        if (w[i] === 0) continue;\n\n        res = res.mul(q);\n      }\n    }\n\n    return res;\n  };\n\n  // Shift-left in-place\n  BN.prototype.iushln = function iushln (bits) {\n    assert(typeof bits === 'number' && bits >= 0);\n    var r = bits % 26;\n    var s = (bits - r) / 26;\n    var carryMask = (0x3ffffff >>> (26 - r)) << (26 - r);\n    var i;\n\n    if (r !== 0) {\n      var carry = 0;\n\n      for (i = 0; i < this.length; i++) {\n        var newCarry = this.words[i] & carryMask;\n        var c = ((this.words[i] | 0) - newCarry) << r;\n        this.words[i] = c | carry;\n        carry = newCarry >>> (26 - r);\n      }\n\n      if (carry) {\n        this.words[i] = carry;\n        this.length++;\n      }\n    }\n\n    if (s !== 0) {\n      for (i = this.length - 1; i >= 0; i--) {\n        this.words[i + s] = this.words[i];\n      }\n\n      for (i = 0; i < s; i++) {\n        this.words[i] = 0;\n      }\n\n      this.length += s;\n    }\n\n    return this._strip();\n  };\n\n  BN.prototype.ishln = function ishln (bits) {\n    // TODO(indutny): implement me\n    assert(this.negative === 0);\n    return this.iushln(bits);\n  };\n\n  // Shift-right in-place\n  // NOTE: `hint` is a lowest bit before trailing zeroes\n  // NOTE: if `extended` is present - it will be filled with destroyed bits\n  BN.prototype.iushrn = function iushrn (bits, hint, extended) {\n    assert(typeof bits === 'number' && bits >= 0);\n    var h;\n    if (hint) {\n      h = (hint - (hint % 26)) / 26;\n    } else {\n      h = 0;\n    }\n\n    var r = bits % 26;\n    var s = Math.min((bits - r) / 26, this.length);\n    var mask = 0x3ffffff ^ ((0x3ffffff >>> r) << r);\n    var maskedWords = extended;\n\n    h -= s;\n    h = Math.max(0, h);\n\n    // Extended mode, copy masked part\n    if (maskedWords) {\n      for (var i = 0; i < s; i++) {\n        maskedWords.words[i] = this.words[i];\n      }\n      maskedWords.length = s;\n    }\n\n    if (s === 0) {\n      // No-op, we should not move anything at all\n    } else if (this.length > s) {\n      this.length -= s;\n      for (i = 0; i < this.length; i++) {\n        this.words[i] = this.words[i + s];\n      }\n    } else {\n      this.words[0] = 0;\n      this.length = 1;\n    }\n\n    var carry = 0;\n    for (i = this.length - 1; i >= 0 && (carry !== 0 || i >= h); i--) {\n      var word = this.words[i] | 0;\n      this.words[i] = (carry << (26 - r)) | (word >>> r);\n      carry = word & mask;\n    }\n\n    // Push carried bits as a mask\n    if (maskedWords && carry !== 0) {\n      maskedWords.words[maskedWords.length++] = carry;\n    }\n\n    if (this.length === 0) {\n      this.words[0] = 0;\n      this.length = 1;\n    }\n\n    return this._strip();\n  };\n\n  BN.prototype.ishrn = function ishrn (bits, hint, extended) {\n    // TODO(indutny): implement me\n    assert(this.negative === 0);\n    return this.iushrn(bits, hint, extended);\n  };\n\n  // Shift-left\n  BN.prototype.shln = function shln (bits) {\n    return this.clone().ishln(bits);\n  };\n\n  BN.prototype.ushln = function ushln (bits) {\n    return this.clone().iushln(bits);\n  };\n\n  // Shift-right\n  BN.prototype.shrn = function shrn (bits) {\n    return this.clone().ishrn(bits);\n  };\n\n  BN.prototype.ushrn = function ushrn (bits) {\n    return this.clone().iushrn(bits);\n  };\n\n  // Test if n bit is set\n  BN.prototype.testn = function testn (bit) {\n    assert(typeof bit === 'number' && bit >= 0);\n    var r = bit % 26;\n    var s = (bit - r) / 26;\n    var q = 1 << r;\n\n    // Fast case: bit is much higher than all existing words\n    if (this.length <= s) return false;\n\n    // Check bit and return\n    var w = this.words[s];\n\n    return !!(w & q);\n  };\n\n  // Return only lowers bits of number (in-place)\n  BN.prototype.imaskn = function imaskn (bits) {\n    assert(typeof bits === 'number' && bits >= 0);\n    var r = bits % 26;\n    var s = (bits - r) / 26;\n\n    assert(this.negative === 0, 'imaskn works only with positive numbers');\n\n    if (this.length <= s) {\n      return this;\n    }\n\n    if (r !== 0) {\n      s++;\n    }\n    this.length = Math.min(s, this.length);\n\n    if (r !== 0) {\n      var mask = 0x3ffffff ^ ((0x3ffffff >>> r) << r);\n      this.words[this.length - 1] &= mask;\n    }\n\n    return this._strip();\n  };\n\n  // Return only lowers bits of number\n  BN.prototype.maskn = function maskn (bits) {\n    return this.clone().imaskn(bits);\n  };\n\n  // Add plain number `num` to `this`\n  BN.prototype.iaddn = function iaddn (num) {\n    assert(typeof num === 'number');\n    assert(num < 0x4000000);\n    if (num < 0) return this.isubn(-num);\n\n    // Possible sign change\n    if (this.negative !== 0) {\n      if (this.length === 1 && (this.words[0] | 0) <= num) {\n        this.words[0] = num - (this.words[0] | 0);\n        this.negative = 0;\n        return this;\n      }\n\n      this.negative = 0;\n      this.isubn(num);\n      this.negative = 1;\n      return this;\n    }\n\n    // Add without checks\n    return this._iaddn(num);\n  };\n\n  BN.prototype._iaddn = function _iaddn (num) {\n    this.words[0] += num;\n\n    // Carry\n    for (var i = 0; i < this.length && this.words[i] >= 0x4000000; i++) {\n      this.words[i] -= 0x4000000;\n      if (i === this.length - 1) {\n        this.words[i + 1] = 1;\n      } else {\n        this.words[i + 1]++;\n      }\n    }\n    this.length = Math.max(this.length, i + 1);\n\n    return this;\n  };\n\n  // Subtract plain number `num` from `this`\n  BN.prototype.isubn = function isubn (num) {\n    assert(typeof num === 'number');\n    assert(num < 0x4000000);\n    if (num < 0) return this.iaddn(-num);\n\n    if (this.negative !== 0) {\n      this.negative = 0;\n      this.iaddn(num);\n      this.negative = 1;\n      return this;\n    }\n\n    this.words[0] -= num;\n\n    if (this.length === 1 && this.words[0] < 0) {\n      this.words[0] = -this.words[0];\n      this.negative = 1;\n    } else {\n      // Carry\n      for (var i = 0; i < this.length && this.words[i] < 0; i++) {\n        this.words[i] += 0x4000000;\n        this.words[i + 1] -= 1;\n      }\n    }\n\n    return this._strip();\n  };\n\n  BN.prototype.addn = function addn (num) {\n    return this.clone().iaddn(num);\n  };\n\n  BN.prototype.subn = function subn (num) {\n    return this.clone().isubn(num);\n  };\n\n  BN.prototype.iabs = function iabs () {\n    this.negative = 0;\n\n    return this;\n  };\n\n  BN.prototype.abs = function abs () {\n    return this.clone().iabs();\n  };\n\n  BN.prototype._ishlnsubmul = function _ishlnsubmul (num, mul, shift) {\n    var len = num.length + shift;\n    var i;\n\n    this._expand(len);\n\n    var w;\n    var carry = 0;\n    for (i = 0; i < num.length; i++) {\n      w = (this.words[i + shift] | 0) + carry;\n      var right = (num.words[i] | 0) * mul;\n      w -= right & 0x3ffffff;\n      carry = (w >> 26) - ((right / 0x4000000) | 0);\n      this.words[i + shift] = w & 0x3ffffff;\n    }\n    for (; i < this.length - shift; i++) {\n      w = (this.words[i + shift] | 0) + carry;\n      carry = w >> 26;\n      this.words[i + shift] = w & 0x3ffffff;\n    }\n\n    if (carry === 0) return this._strip();\n\n    // Subtraction overflow\n    assert(carry === -1);\n    carry = 0;\n    for (i = 0; i < this.length; i++) {\n      w = -(this.words[i] | 0) + carry;\n      carry = w >> 26;\n      this.words[i] = w & 0x3ffffff;\n    }\n    this.negative = 1;\n\n    return this._strip();\n  };\n\n  BN.prototype._wordDiv = function _wordDiv (num, mode) {\n    var shift = this.length - num.length;\n\n    var a = this.clone();\n    var b = num;\n\n    // Normalize\n    var bhi = b.words[b.length - 1] | 0;\n    var bhiBits = this._countBits(bhi);\n    shift = 26 - bhiBits;\n    if (shift !== 0) {\n      b = b.ushln(shift);\n      a.iushln(shift);\n      bhi = b.words[b.length - 1] | 0;\n    }\n\n    // Initialize quotient\n    var m = a.length - b.length;\n    var q;\n\n    if (mode !== 'mod') {\n      q = new BN(null);\n      q.length = m + 1;\n      q.words = new Array(q.length);\n      for (var i = 0; i < q.length; i++) {\n        q.words[i] = 0;\n      }\n    }\n\n    var diff = a.clone()._ishlnsubmul(b, 1, m);\n    if (diff.negative === 0) {\n      a = diff;\n      if (q) {\n        q.words[m] = 1;\n      }\n    }\n\n    for (var j = m - 1; j >= 0; j--) {\n      var qj = (a.words[b.length + j] | 0) * 0x4000000 +\n        (a.words[b.length + j - 1] | 0);\n\n      // NOTE: (qj / bhi) is (0x3ffffff * 0x4000000 + 0x3ffffff) / 0x2000000 max\n      // (0x7ffffff)\n      qj = Math.min((qj / bhi) | 0, 0x3ffffff);\n\n      a._ishlnsubmul(b, qj, j);\n      while (a.negative !== 0) {\n        qj--;\n        a.negative = 0;\n        a._ishlnsubmul(b, 1, j);\n        if (!a.isZero()) {\n          a.negative ^= 1;\n        }\n      }\n      if (q) {\n        q.words[j] = qj;\n      }\n    }\n    if (q) {\n      q._strip();\n    }\n    a._strip();\n\n    // Denormalize\n    if (mode !== 'div' && shift !== 0) {\n      a.iushrn(shift);\n    }\n\n    return {\n      div: q || null,\n      mod: a\n    };\n  };\n\n  // NOTE: 1) `mode` can be set to `mod` to request mod only,\n  //       to `div` to request div only, or be absent to\n  //       request both div & mod\n  //       2) `positive` is true if unsigned mod is requested\n  BN.prototype.divmod = function divmod (num, mode, positive) {\n    assert(!num.isZero());\n\n    if (this.isZero()) {\n      return {\n        div: new BN(0),\n        mod: new BN(0)\n      };\n    }\n\n    var div, mod, res;\n    if (this.negative !== 0 && num.negative === 0) {\n      res = this.neg().divmod(num, mode);\n\n      if (mode !== 'mod') {\n        div = res.div.neg();\n      }\n\n      if (mode !== 'div') {\n        mod = res.mod.neg();\n        if (positive && mod.negative !== 0) {\n          mod.iadd(num);\n        }\n      }\n\n      return {\n        div: div,\n        mod: mod\n      };\n    }\n\n    if (this.negative === 0 && num.negative !== 0) {\n      res = this.divmod(num.neg(), mode);\n\n      if (mode !== 'mod') {\n        div = res.div.neg();\n      }\n\n      return {\n        div: div,\n        mod: res.mod\n      };\n    }\n\n    if ((this.negative & num.negative) !== 0) {\n      res = this.neg().divmod(num.neg(), mode);\n\n      if (mode !== 'div') {\n        mod = res.mod.neg();\n        if (positive && mod.negative !== 0) {\n          mod.isub(num);\n        }\n      }\n\n      return {\n        div: res.div,\n        mod: mod\n      };\n    }\n\n    // Both numbers are positive at this point\n\n    // Strip both numbers to approximate shift value\n    if (num.length > this.length || this.cmp(num) < 0) {\n      return {\n        div: new BN(0),\n        mod: this\n      };\n    }\n\n    // Very short reduction\n    if (num.length === 1) {\n      if (mode === 'div') {\n        return {\n          div: this.divn(num.words[0]),\n          mod: null\n        };\n      }\n\n      if (mode === 'mod') {\n        return {\n          div: null,\n          mod: new BN(this.modrn(num.words[0]))\n        };\n      }\n\n      return {\n        div: this.divn(num.words[0]),\n        mod: new BN(this.modrn(num.words[0]))\n      };\n    }\n\n    return this._wordDiv(num, mode);\n  };\n\n  // Find `this` / `num`\n  BN.prototype.div = function div (num) {\n    return this.divmod(num, 'div', false).div;\n  };\n\n  // Find `this` % `num`\n  BN.prototype.mod = function mod (num) {\n    return this.divmod(num, 'mod', false).mod;\n  };\n\n  BN.prototype.umod = function umod (num) {\n    return this.divmod(num, 'mod', true).mod;\n  };\n\n  // Find Round(`this` / `num`)\n  BN.prototype.divRound = function divRound (num) {\n    var dm = this.divmod(num);\n\n    // Fast case - exact division\n    if (dm.mod.isZero()) return dm.div;\n\n    var mod = dm.div.negative !== 0 ? dm.mod.isub(num) : dm.mod;\n\n    var half = num.ushrn(1);\n    var r2 = num.andln(1);\n    var cmp = mod.cmp(half);\n\n    // Round down\n    if (cmp < 0 || (r2 === 1 && cmp === 0)) return dm.div;\n\n    // Round up\n    return dm.div.negative !== 0 ? dm.div.isubn(1) : dm.div.iaddn(1);\n  };\n\n  BN.prototype.modrn = function modrn (num) {\n    var isNegNum = num < 0;\n    if (isNegNum) num = -num;\n\n    assert(num <= 0x3ffffff);\n    var p = (1 << 26) % num;\n\n    var acc = 0;\n    for (var i = this.length - 1; i >= 0; i--) {\n      acc = (p * acc + (this.words[i] | 0)) % num;\n    }\n\n    return isNegNum ? -acc : acc;\n  };\n\n  // WARNING: DEPRECATED\n  BN.prototype.modn = function modn (num) {\n    return this.modrn(num);\n  };\n\n  // In-place division by number\n  BN.prototype.idivn = function idivn (num) {\n    var isNegNum = num < 0;\n    if (isNegNum) num = -num;\n\n    assert(num <= 0x3ffffff);\n\n    var carry = 0;\n    for (var i = this.length - 1; i >= 0; i--) {\n      var w = (this.words[i] | 0) + carry * 0x4000000;\n      this.words[i] = (w / num) | 0;\n      carry = w % num;\n    }\n\n    this._strip();\n    return isNegNum ? this.ineg() : this;\n  };\n\n  BN.prototype.divn = function divn (num) {\n    return this.clone().idivn(num);\n  };\n\n  BN.prototype.egcd = function egcd (p) {\n    assert(p.negative === 0);\n    assert(!p.isZero());\n\n    var x = this;\n    var y = p.clone();\n\n    if (x.negative !== 0) {\n      x = x.umod(p);\n    } else {\n      x = x.clone();\n    }\n\n    // A * x + B * y = x\n    var A = new BN(1);\n    var B = new BN(0);\n\n    // C * x + D * y = y\n    var C = new BN(0);\n    var D = new BN(1);\n\n    var g = 0;\n\n    while (x.isEven() && y.isEven()) {\n      x.iushrn(1);\n      y.iushrn(1);\n      ++g;\n    }\n\n    var yp = y.clone();\n    var xp = x.clone();\n\n    while (!x.isZero()) {\n      for (var i = 0, im = 1; (x.words[0] & im) === 0 && i < 26; ++i, im <<= 1);\n      if (i > 0) {\n        x.iushrn(i);\n        while (i-- > 0) {\n          if (A.isOdd() || B.isOdd()) {\n            A.iadd(yp);\n            B.isub(xp);\n          }\n\n          A.iushrn(1);\n          B.iushrn(1);\n        }\n      }\n\n      for (var j = 0, jm = 1; (y.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1);\n      if (j > 0) {\n        y.iushrn(j);\n        while (j-- > 0) {\n          if (C.isOdd() || D.isOdd()) {\n            C.iadd(yp);\n            D.isub(xp);\n          }\n\n          C.iushrn(1);\n          D.iushrn(1);\n        }\n      }\n\n      if (x.cmp(y) >= 0) {\n        x.isub(y);\n        A.isub(C);\n        B.isub(D);\n      } else {\n        y.isub(x);\n        C.isub(A);\n        D.isub(B);\n      }\n    }\n\n    return {\n      a: C,\n      b: D,\n      gcd: y.iushln(g)\n    };\n  };\n\n  // This is reduced incarnation of the binary EEA\n  // above, designated to invert members of the\n  // _prime_ fields F(p) at a maximal speed\n  BN.prototype._invmp = function _invmp (p) {\n    assert(p.negative === 0);\n    assert(!p.isZero());\n\n    var a = this;\n    var b = p.clone();\n\n    if (a.negative !== 0) {\n      a = a.umod(p);\n    } else {\n      a = a.clone();\n    }\n\n    var x1 = new BN(1);\n    var x2 = new BN(0);\n\n    var delta = b.clone();\n\n    while (a.cmpn(1) > 0 && b.cmpn(1) > 0) {\n      for (var i = 0, im = 1; (a.words[0] & im) === 0 && i < 26; ++i, im <<= 1);\n      if (i > 0) {\n        a.iushrn(i);\n        while (i-- > 0) {\n          if (x1.isOdd()) {\n            x1.iadd(delta);\n          }\n\n          x1.iushrn(1);\n        }\n      }\n\n      for (var j = 0, jm = 1; (b.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1);\n      if (j > 0) {\n        b.iushrn(j);\n        while (j-- > 0) {\n          if (x2.isOdd()) {\n            x2.iadd(delta);\n          }\n\n          x2.iushrn(1);\n        }\n      }\n\n      if (a.cmp(b) >= 0) {\n        a.isub(b);\n        x1.isub(x2);\n      } else {\n        b.isub(a);\n        x2.isub(x1);\n      }\n    }\n\n    var res;\n    if (a.cmpn(1) === 0) {\n      res = x1;\n    } else {\n      res = x2;\n    }\n\n    if (res.cmpn(0) < 0) {\n      res.iadd(p);\n    }\n\n    return res;\n  };\n\n  BN.prototype.gcd = function gcd (num) {\n    if (this.isZero()) return num.abs();\n    if (num.isZero()) return this.abs();\n\n    var a = this.clone();\n    var b = num.clone();\n    a.negative = 0;\n    b.negative = 0;\n\n    // Remove common factor of two\n    for (var shift = 0; a.isEven() && b.isEven(); shift++) {\n      a.iushrn(1);\n      b.iushrn(1);\n    }\n\n    do {\n      while (a.isEven()) {\n        a.iushrn(1);\n      }\n      while (b.isEven()) {\n        b.iushrn(1);\n      }\n\n      var r = a.cmp(b);\n      if (r < 0) {\n        // Swap `a` and `b` to make `a` always bigger than `b`\n        var t = a;\n        a = b;\n        b = t;\n      } else if (r === 0 || b.cmpn(1) === 0) {\n        break;\n      }\n\n      a.isub(b);\n    } while (true);\n\n    return b.iushln(shift);\n  };\n\n  // Invert number in the field F(num)\n  BN.prototype.invm = function invm (num) {\n    return this.egcd(num).a.umod(num);\n  };\n\n  BN.prototype.isEven = function isEven () {\n    return (this.words[0] & 1) === 0;\n  };\n\n  BN.prototype.isOdd = function isOdd () {\n    return (this.words[0] & 1) === 1;\n  };\n\n  // And first word and num\n  BN.prototype.andln = function andln (num) {\n    return this.words[0] & num;\n  };\n\n  // Increment at the bit position in-line\n  BN.prototype.bincn = function bincn (bit) {\n    assert(typeof bit === 'number');\n    var r = bit % 26;\n    var s = (bit - r) / 26;\n    var q = 1 << r;\n\n    // Fast case: bit is much higher than all existing words\n    if (this.length <= s) {\n      this._expand(s + 1);\n      this.words[s] |= q;\n      return this;\n    }\n\n    // Add bit and propagate, if needed\n    var carry = q;\n    for (var i = s; carry !== 0 && i < this.length; i++) {\n      var w = this.words[i] | 0;\n      w += carry;\n      carry = w >>> 26;\n      w &= 0x3ffffff;\n      this.words[i] = w;\n    }\n    if (carry !== 0) {\n      this.words[i] = carry;\n      this.length++;\n    }\n    return this;\n  };\n\n  BN.prototype.isZero = function isZero () {\n    return this.length === 1 && this.words[0] === 0;\n  };\n\n  BN.prototype.cmpn = function cmpn (num) {\n    var negative = num < 0;\n\n    if (this.negative !== 0 && !negative) return -1;\n    if (this.negative === 0 && negative) return 1;\n\n    this._strip();\n\n    var res;\n    if (this.length > 1) {\n      res = 1;\n    } else {\n      if (negative) {\n        num = -num;\n      }\n\n      assert(num <= 0x3ffffff, 'Number is too big');\n\n      var w = this.words[0] | 0;\n      res = w === num ? 0 : w < num ? -1 : 1;\n    }\n    if (this.negative !== 0) return -res | 0;\n    return res;\n  };\n\n  // Compare two numbers and return:\n  // 1 - if `this` > `num`\n  // 0 - if `this` == `num`\n  // -1 - if `this` < `num`\n  BN.prototype.cmp = function cmp (num) {\n    if (this.negative !== 0 && num.negative === 0) return -1;\n    if (this.negative === 0 && num.negative !== 0) return 1;\n\n    var res = this.ucmp(num);\n    if (this.negative !== 0) return -res | 0;\n    return res;\n  };\n\n  // Unsigned comparison\n  BN.prototype.ucmp = function ucmp (num) {\n    // At this point both numbers have the same sign\n    if (this.length > num.length) return 1;\n    if (this.length < num.length) return -1;\n\n    var res = 0;\n    for (var i = this.length - 1; i >= 0; i--) {\n      var a = this.words[i] | 0;\n      var b = num.words[i] | 0;\n\n      if (a === b) continue;\n      if (a < b) {\n        res = -1;\n      } else if (a > b) {\n        res = 1;\n      }\n      break;\n    }\n    return res;\n  };\n\n  BN.prototype.gtn = function gtn (num) {\n    return this.cmpn(num) === 1;\n  };\n\n  BN.prototype.gt = function gt (num) {\n    return this.cmp(num) === 1;\n  };\n\n  BN.prototype.gten = function gten (num) {\n    return this.cmpn(num) >= 0;\n  };\n\n  BN.prototype.gte = function gte (num) {\n    return this.cmp(num) >= 0;\n  };\n\n  BN.prototype.ltn = function ltn (num) {\n    return this.cmpn(num) === -1;\n  };\n\n  BN.prototype.lt = function lt (num) {\n    return this.cmp(num) === -1;\n  };\n\n  BN.prototype.lten = function lten (num) {\n    return this.cmpn(num) <= 0;\n  };\n\n  BN.prototype.lte = function lte (num) {\n    return this.cmp(num) <= 0;\n  };\n\n  BN.prototype.eqn = function eqn (num) {\n    return this.cmpn(num) === 0;\n  };\n\n  BN.prototype.eq = function eq (num) {\n    return this.cmp(num) === 0;\n  };\n\n  //\n  // A reduce context, could be using montgomery or something better, depending\n  // on the `m` itself.\n  //\n  BN.red = function red (num) {\n    return new Red(num);\n  };\n\n  BN.prototype.toRed = function toRed (ctx) {\n    assert(!this.red, 'Already a number in reduction context');\n    assert(this.negative === 0, 'red works only with positives');\n    return ctx.convertTo(this)._forceRed(ctx);\n  };\n\n  BN.prototype.fromRed = function fromRed () {\n    assert(this.red, 'fromRed works only with numbers in reduction context');\n    return this.red.convertFrom(this);\n  };\n\n  BN.prototype._forceRed = function _forceRed (ctx) {\n    this.red = ctx;\n    return this;\n  };\n\n  BN.prototype.forceRed = function forceRed (ctx) {\n    assert(!this.red, 'Already a number in reduction context');\n    return this._forceRed(ctx);\n  };\n\n  BN.prototype.redAdd = function redAdd (num) {\n    assert(this.red, 'redAdd works only with red numbers');\n    return this.red.add(this, num);\n  };\n\n  BN.prototype.redIAdd = function redIAdd (num) {\n    assert(this.red, 'redIAdd works only with red numbers');\n    return this.red.iadd(this, num);\n  };\n\n  BN.prototype.redSub = function redSub (num) {\n    assert(this.red, 'redSub works only with red numbers');\n    return this.red.sub(this, num);\n  };\n\n  BN.prototype.redISub = function redISub (num) {\n    assert(this.red, 'redISub works only with red numbers');\n    return this.red.isub(this, num);\n  };\n\n  BN.prototype.redShl = function redShl (num) {\n    assert(this.red, 'redShl works only with red numbers');\n    return this.red.shl(this, num);\n  };\n\n  BN.prototype.redMul = function redMul (num) {\n    assert(this.red, 'redMul works only with red numbers');\n    this.red._verify2(this, num);\n    return this.red.mul(this, num);\n  };\n\n  BN.prototype.redIMul = function redIMul (num) {\n    assert(this.red, 'redMul works only with red numbers');\n    this.red._verify2(this, num);\n    return this.red.imul(this, num);\n  };\n\n  BN.prototype.redSqr = function redSqr () {\n    assert(this.red, 'redSqr works only with red numbers');\n    this.red._verify1(this);\n    return this.red.sqr(this);\n  };\n\n  BN.prototype.redISqr = function redISqr () {\n    assert(this.red, 'redISqr works only with red numbers');\n    this.red._verify1(this);\n    return this.red.isqr(this);\n  };\n\n  // Square root over p\n  BN.prototype.redSqrt = function redSqrt () {\n    assert(this.red, 'redSqrt works only with red numbers');\n    this.red._verify1(this);\n    return this.red.sqrt(this);\n  };\n\n  BN.prototype.redInvm = function redInvm () {\n    assert(this.red, 'redInvm works only with red numbers');\n    this.red._verify1(this);\n    return this.red.invm(this);\n  };\n\n  // Return negative clone of `this` % `red modulo`\n  BN.prototype.redNeg = function redNeg () {\n    assert(this.red, 'redNeg works only with red numbers');\n    this.red._verify1(this);\n    return this.red.neg(this);\n  };\n\n  BN.prototype.redPow = function redPow (num) {\n    assert(this.red && !num.red, 'redPow(normalNum)');\n    this.red._verify1(this);\n    return this.red.pow(this, num);\n  };\n\n  // Prime numbers with efficient reduction\n  var primes = {\n    k256: null,\n    p224: null,\n    p192: null,\n    p25519: null\n  };\n\n  // Pseudo-Mersenne prime\n  function MPrime (name, p) {\n    // P = 2 ^ N - K\n    this.name = name;\n    this.p = new BN(p, 16);\n    this.n = this.p.bitLength();\n    this.k = new BN(1).iushln(this.n).isub(this.p);\n\n    this.tmp = this._tmp();\n  }\n\n  MPrime.prototype._tmp = function _tmp () {\n    var tmp = new BN(null);\n    tmp.words = new Array(Math.ceil(this.n / 13));\n    return tmp;\n  };\n\n  MPrime.prototype.ireduce = function ireduce (num) {\n    // Assumes that `num` is less than `P^2`\n    // num = HI * (2 ^ N - K) + HI * K + LO = HI * K + LO (mod P)\n    var r = num;\n    var rlen;\n\n    do {\n      this.split(r, this.tmp);\n      r = this.imulK(r);\n      r = r.iadd(this.tmp);\n      rlen = r.bitLength();\n    } while (rlen > this.n);\n\n    var cmp = rlen < this.n ? -1 : r.ucmp(this.p);\n    if (cmp === 0) {\n      r.words[0] = 0;\n      r.length = 1;\n    } else if (cmp > 0) {\n      r.isub(this.p);\n    } else {\n      if (r.strip !== undefined) {\n        // r is a BN v4 instance\n        r.strip();\n      } else {\n        // r is a BN v5 instance\n        r._strip();\n      }\n    }\n\n    return r;\n  };\n\n  MPrime.prototype.split = function split (input, out) {\n    input.iushrn(this.n, 0, out);\n  };\n\n  MPrime.prototype.imulK = function imulK (num) {\n    return num.imul(this.k);\n  };\n\n  function K256 () {\n    MPrime.call(\n      this,\n      'k256',\n      'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f');\n  }\n  inherits(K256, MPrime);\n\n  K256.prototype.split = function split (input, output) {\n    // 256 = 9 * 26 + 22\n    var mask = 0x3fffff;\n\n    var outLen = Math.min(input.length, 9);\n    for (var i = 0; i < outLen; i++) {\n      output.words[i] = input.words[i];\n    }\n    output.length = outLen;\n\n    if (input.length <= 9) {\n      input.words[0] = 0;\n      input.length = 1;\n      return;\n    }\n\n    // Shift by 9 limbs\n    var prev = input.words[9];\n    output.words[output.length++] = prev & mask;\n\n    for (i = 10; i < input.length; i++) {\n      var next = input.words[i] | 0;\n      input.words[i - 10] = ((next & mask) << 4) | (prev >>> 22);\n      prev = next;\n    }\n    prev >>>= 22;\n    input.words[i - 10] = prev;\n    if (prev === 0 && input.length > 10) {\n      input.length -= 10;\n    } else {\n      input.length -= 9;\n    }\n  };\n\n  K256.prototype.imulK = function imulK (num) {\n    // K = 0x1000003d1 = [ 0x40, 0x3d1 ]\n    num.words[num.length] = 0;\n    num.words[num.length + 1] = 0;\n    num.length += 2;\n\n    // bounded at: 0x40 * 0x3ffffff + 0x3d0 = 0x100000390\n    var lo = 0;\n    for (var i = 0; i < num.length; i++) {\n      var w = num.words[i] | 0;\n      lo += w * 0x3d1;\n      num.words[i] = lo & 0x3ffffff;\n      lo = w * 0x40 + ((lo / 0x4000000) | 0);\n    }\n\n    // Fast length reduction\n    if (num.words[num.length - 1] === 0) {\n      num.length--;\n      if (num.words[num.length - 1] === 0) {\n        num.length--;\n      }\n    }\n    return num;\n  };\n\n  function P224 () {\n    MPrime.call(\n      this,\n      'p224',\n      'ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001');\n  }\n  inherits(P224, MPrime);\n\n  function P192 () {\n    MPrime.call(\n      this,\n      'p192',\n      'ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff');\n  }\n  inherits(P192, MPrime);\n\n  function P25519 () {\n    // 2 ^ 255 - 19\n    MPrime.call(\n      this,\n      '25519',\n      '7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed');\n  }\n  inherits(P25519, MPrime);\n\n  P25519.prototype.imulK = function imulK (num) {\n    // K = 0x13\n    var carry = 0;\n    for (var i = 0; i < num.length; i++) {\n      var hi = (num.words[i] | 0) * 0x13 + carry;\n      var lo = hi & 0x3ffffff;\n      hi >>>= 26;\n\n      num.words[i] = lo;\n      carry = hi;\n    }\n    if (carry !== 0) {\n      num.words[num.length++] = carry;\n    }\n    return num;\n  };\n\n  // Exported mostly for testing purposes, use plain name instead\n  BN._prime = function prime (name) {\n    // Cached version of prime\n    if (primes[name]) return primes[name];\n\n    var prime;\n    if (name === 'k256') {\n      prime = new K256();\n    } else if (name === 'p224') {\n      prime = new P224();\n    } else if (name === 'p192') {\n      prime = new P192();\n    } else if (name === 'p25519') {\n      prime = new P25519();\n    } else {\n      throw new Error('Unknown prime ' + name);\n    }\n    primes[name] = prime;\n\n    return prime;\n  };\n\n  //\n  // Base reduction engine\n  //\n  function Red (m) {\n    if (typeof m === 'string') {\n      var prime = BN._prime(m);\n      this.m = prime.p;\n      this.prime = prime;\n    } else {\n      assert(m.gtn(1), 'modulus must be greater than 1');\n      this.m = m;\n      this.prime = null;\n    }\n  }\n\n  Red.prototype._verify1 = function _verify1 (a) {\n    assert(a.negative === 0, 'red works only with positives');\n    assert(a.red, 'red works only with red numbers');\n  };\n\n  Red.prototype._verify2 = function _verify2 (a, b) {\n    assert((a.negative | b.negative) === 0, 'red works only with positives');\n    assert(a.red && a.red === b.red,\n      'red works only with red numbers');\n  };\n\n  Red.prototype.imod = function imod (a) {\n    if (this.prime) return this.prime.ireduce(a)._forceRed(this);\n\n    move(a, a.umod(this.m)._forceRed(this));\n    return a;\n  };\n\n  Red.prototype.neg = function neg (a) {\n    if (a.isZero()) {\n      return a.clone();\n    }\n\n    return this.m.sub(a)._forceRed(this);\n  };\n\n  Red.prototype.add = function add (a, b) {\n    this._verify2(a, b);\n\n    var res = a.add(b);\n    if (res.cmp(this.m) >= 0) {\n      res.isub(this.m);\n    }\n    return res._forceRed(this);\n  };\n\n  Red.prototype.iadd = function iadd (a, b) {\n    this._verify2(a, b);\n\n    var res = a.iadd(b);\n    if (res.cmp(this.m) >= 0) {\n      res.isub(this.m);\n    }\n    return res;\n  };\n\n  Red.prototype.sub = function sub (a, b) {\n    this._verify2(a, b);\n\n    var res = a.sub(b);\n    if (res.cmpn(0) < 0) {\n      res.iadd(this.m);\n    }\n    return res._forceRed(this);\n  };\n\n  Red.prototype.isub = function isub (a, b) {\n    this._verify2(a, b);\n\n    var res = a.isub(b);\n    if (res.cmpn(0) < 0) {\n      res.iadd(this.m);\n    }\n    return res;\n  };\n\n  Red.prototype.shl = function shl (a, num) {\n    this._verify1(a);\n    return this.imod(a.ushln(num));\n  };\n\n  Red.prototype.imul = function imul (a, b) {\n    this._verify2(a, b);\n    return this.imod(a.imul(b));\n  };\n\n  Red.prototype.mul = function mul (a, b) {\n    this._verify2(a, b);\n    return this.imod(a.mul(b));\n  };\n\n  Red.prototype.isqr = function isqr (a) {\n    return this.imul(a, a.clone());\n  };\n\n  Red.prototype.sqr = function sqr (a) {\n    return this.mul(a, a);\n  };\n\n  Red.prototype.sqrt = function sqrt (a) {\n    if (a.isZero()) return a.clone();\n\n    var mod3 = this.m.andln(3);\n    assert(mod3 % 2 === 1);\n\n    // Fast case\n    if (mod3 === 3) {\n      var pow = this.m.add(new BN(1)).iushrn(2);\n      return this.pow(a, pow);\n    }\n\n    // Tonelli-Shanks algorithm (Totally unoptimized and slow)\n    //\n    // Find Q and S, that Q * 2 ^ S = (P - 1)\n    var q = this.m.subn(1);\n    var s = 0;\n    while (!q.isZero() && q.andln(1) === 0) {\n      s++;\n      q.iushrn(1);\n    }\n    assert(!q.isZero());\n\n    var one = new BN(1).toRed(this);\n    var nOne = one.redNeg();\n\n    // Find quadratic non-residue\n    // NOTE: Max is such because of generalized Riemann hypothesis.\n    var lpow = this.m.subn(1).iushrn(1);\n    var z = this.m.bitLength();\n    z = new BN(2 * z * z).toRed(this);\n\n    while (this.pow(z, lpow).cmp(nOne) !== 0) {\n      z.redIAdd(nOne);\n    }\n\n    var c = this.pow(z, q);\n    var r = this.pow(a, q.addn(1).iushrn(1));\n    var t = this.pow(a, q);\n    var m = s;\n    while (t.cmp(one) !== 0) {\n      var tmp = t;\n      for (var i = 0; tmp.cmp(one) !== 0; i++) {\n        tmp = tmp.redSqr();\n      }\n      assert(i < m);\n      var b = this.pow(c, new BN(1).iushln(m - i - 1));\n\n      r = r.redMul(b);\n      c = b.redSqr();\n      t = t.redMul(c);\n      m = i;\n    }\n\n    return r;\n  };\n\n  Red.prototype.invm = function invm (a) {\n    var inv = a._invmp(this.m);\n    if (inv.negative !== 0) {\n      inv.negative = 0;\n      return this.imod(inv).redNeg();\n    } else {\n      return this.imod(inv);\n    }\n  };\n\n  Red.prototype.pow = function pow (a, num) {\n    if (num.isZero()) return new BN(1).toRed(this);\n    if (num.cmpn(1) === 0) return a.clone();\n\n    var windowSize = 4;\n    var wnd = new Array(1 << windowSize);\n    wnd[0] = new BN(1).toRed(this);\n    wnd[1] = a;\n    for (var i = 2; i < wnd.length; i++) {\n      wnd[i] = this.mul(wnd[i - 1], a);\n    }\n\n    var res = wnd[0];\n    var current = 0;\n    var currentLen = 0;\n    var start = num.bitLength() % 26;\n    if (start === 0) {\n      start = 26;\n    }\n\n    for (i = num.length - 1; i >= 0; i--) {\n      var word = num.words[i];\n      for (var j = start - 1; j >= 0; j--) {\n        var bit = (word >> j) & 1;\n        if (res !== wnd[0]) {\n          res = this.sqr(res);\n        }\n\n        if (bit === 0 && current === 0) {\n          currentLen = 0;\n          continue;\n        }\n\n        current <<= 1;\n        current |= bit;\n        currentLen++;\n        if (currentLen !== windowSize && (i !== 0 || j !== 0)) continue;\n\n        res = this.mul(res, wnd[current]);\n        currentLen = 0;\n        current = 0;\n      }\n      start = 26;\n    }\n\n    return res;\n  };\n\n  Red.prototype.convertTo = function convertTo (num) {\n    var r = num.umod(this.m);\n\n    return r === num ? r.clone() : r;\n  };\n\n  Red.prototype.convertFrom = function convertFrom (num) {\n    var res = num.clone();\n    res.red = null;\n    return res;\n  };\n\n  //\n  // Montgomery method engine\n  //\n\n  BN.mont = function mont (num) {\n    return new Mont(num);\n  };\n\n  function Mont (m) {\n    Red.call(this, m);\n\n    this.shift = this.m.bitLength();\n    if (this.shift % 26 !== 0) {\n      this.shift += 26 - (this.shift % 26);\n    }\n\n    this.r = new BN(1).iushln(this.shift);\n    this.r2 = this.imod(this.r.sqr());\n    this.rinv = this.r._invmp(this.m);\n\n    this.minv = this.rinv.mul(this.r).isubn(1).div(this.m);\n    this.minv = this.minv.umod(this.r);\n    this.minv = this.r.sub(this.minv);\n  }\n  inherits(Mont, Red);\n\n  Mont.prototype.convertTo = function convertTo (num) {\n    return this.imod(num.ushln(this.shift));\n  };\n\n  Mont.prototype.convertFrom = function convertFrom (num) {\n    var r = this.imod(num.mul(this.rinv));\n    r.red = null;\n    return r;\n  };\n\n  Mont.prototype.imul = function imul (a, b) {\n    if (a.isZero() || b.isZero()) {\n      a.words[0] = 0;\n      a.length = 1;\n      return a;\n    }\n\n    var t = a.imul(b);\n    var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);\n    var u = t.isub(c).iushrn(this.shift);\n    var res = u;\n\n    if (u.cmp(this.m) >= 0) {\n      res = u.isub(this.m);\n    } else if (u.cmpn(0) < 0) {\n      res = u.iadd(this.m);\n    }\n\n    return res._forceRed(this);\n  };\n\n  Mont.prototype.mul = function mul (a, b) {\n    if (a.isZero() || b.isZero()) return new BN(0)._forceRed(this);\n\n    var t = a.mul(b);\n    var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);\n    var u = t.isub(c).iushrn(this.shift);\n    var res = u;\n    if (u.cmp(this.m) >= 0) {\n      res = u.isub(this.m);\n    } else if (u.cmpn(0) < 0) {\n      res = u.iadd(this.m);\n    }\n\n    return res._forceRed(this);\n  };\n\n  Mont.prototype.invm = function invm (a) {\n    // (AR)^-1 * R^2 = (A^-1 * R^-1) * R^2 = A^-1 * R\n    var res = this.imod(a._invmp(this.m).mul(this.r2));\n    return res._forceRed(this);\n  };\n})(typeof module === 'undefined' || module, this);\n","import { isValidSuiAddress } from '@mysten/sui/utils'\nimport { RpcModule } from '../modules/rpcModule'\nimport type { BaseSdkOptions, InitCetusSDKOptions, SuiAddressType, SuiResource } from '../type/sui'\nimport { CachedContent, cacheTime24h, getFutureTime } from '../utils/cachedContent'\nimport { CommonErrorCode, handleMessageError } from '../errors/errors'\nimport { patchFixSuiObjectId } from '../utils/contracts'\n\nexport abstract class SdkWrapper<T extends BaseSdkOptions> {\n  readonly _cache: Record<string, CachedContent> = {}\n  readonly _fullClient: RpcModule\n  private _senderAddress: SuiAddressType = ''\n  /**\n   *  Provide sdk options\n   */\n  protected _sdkOptions: T\n\n  constructor(options: T) {\n    this._fullClient = new RpcModule({ url: options.full_rpc_url })\n\n    patchFixSuiObjectId(options)\n    this._sdkOptions = options\n  }\n\n  /**\n   * Getter for the sdkOptions property.\n   * @returns {SdkOptions} The sdkOptions property value.\n   */\n  get sdkOptions(): T {\n    return this._sdkOptions\n  }\n\n  get FullClient(): RpcModule {\n    return this._fullClient\n  }\n\n  /**\n   * Static factory method to initialize the SDK\n   * @param options SDK initialization options\n   * @param clmmSDK Optional CLMM SDK instance\n   * @returns An instance of the SDK\n   */\n  static createSDK(options: InitCetusSDKOptions, clmmSDK?: any): any {\n    throw new Error('createSDK must be implemented in derived class')\n  }\n\n  /**\n   * Create a custom SDK instance with the given options\n   * @param options The options for the SDK\n   * @returns An instance of the SDK\n   */\n  static createCustomSDK<T extends BaseSdkOptions>(options: T, clmmSDK?: any): any {\n    throw new Error('createCustomSDK must be implemented in derived class')\n  }\n\n  /**\n   * Getter for the sender address property.\n   * @param {boolean} validate - Whether to validate the sender address. Default is true.\n   * @returns The sender address value.\n   */\n  getSenderAddress(validate = true) {\n    if (validate && !isValidSuiAddress(this._senderAddress)) {\n      handleMessageError(\n        CommonErrorCode.InvalidSenderAddress,\n        'Invalid sender address: sdk requires a valid sender address. Please set it using sdk.setSenderAddress(\"0x...\")'\n      )\n    }\n    return this._senderAddress\n  }\n\n  /**\n   * Setter for the sender address property.\n   * @param {string} value - The new sender address value.\n   */\n  setSenderAddress(value: string) {\n    this._senderAddress = value\n  }\n\n  /**\n   * Updates the cache for the given key.\n   *\n   * @param key The key of the cache entry to update.\n   * @param data The data to store in the cache.\n   * @param time The time in minutes after which the cache entry should expire.\n   */\n  updateCache(key: string, data: SuiResource, time = cacheTime24h): void {\n    let cacheData = this._cache[key]\n    if (cacheData) {\n      cacheData.overdueTime = getFutureTime(time)\n      cacheData.value = data\n    } else {\n      cacheData = new CachedContent(data, getFutureTime(time))\n    }\n    this._cache[key] = cacheData\n  }\n\n  /**\n   * Gets the cache entry for the given key.\n   *\n   * @param key The key of the cache entry to get.\n   * @param forceRefresh Whether to force a refresh of the cache entry.\n   * @returns The cache entry for the given key, or undefined if the cache entry does not exist or is expired.\n   */\n  getCache<T>(key: string, forceRefresh = false): T | undefined {\n    const cacheData = this._cache[key]\n    const isValid = cacheData?.isValid()\n    if (!forceRefresh && isValid) {\n      return cacheData.value as T\n    }\n    if (!isValid) {\n      delete this._cache[key]\n    }\n    return undefined\n  }\n}\n","import type {\n  CoinBalance,\n  CoinMetadata,\n  DevInspectResults,\n  DryRunTransactionBlockResponse,\n  DynamicFieldPage,\n  PaginatedEvents,\n  PaginatedObjectsResponse,\n  PaginatedTransactionResponse,\n  SuiEventFilter,\n  SuiObjectDataOptions,\n  SuiObjectResponse,\n  SuiObjectResponseQuery,\n  SuiTransactionBlockResponse,\n  TransactionFilter,\n} from '@mysten/sui/client'\nimport { SuiClient } from '@mysten/sui/client'\nimport type { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519'\nimport type { Secp256k1Keypair } from '@mysten/sui/keypairs/secp256k1'\nimport type { Transaction } from '@mysten/sui/transactions'\nimport { normalizeSuiAddress } from '@mysten/sui/utils'\nimport type { CoinAsset } from '../type/clmm'\nimport type { DataPage, PaginationArgs, SuiObjectIdType, SuiResource } from '../type/sui'\nimport { CachedContent, cacheTime24h, getFutureTime } from '../utils/cachedContent'\nimport { extractStructTagFromType } from '../utils/contracts'\n\n/**\n * Represents a module for making RPC (Remote Procedure Call) requests.\n */\nexport class RpcModule extends SuiClient {\n  readonly _cache: Record<string, CachedContent> = {}\n\n  async fetchCoinMetadata(coinType: string): Promise<CoinMetadata | null> {\n    const cacheKey = `coin_metadata_${coinType}`\n    const cachedData = this.getCache<CoinMetadata>(cacheKey)\n    if (cachedData) {\n      return cachedData\n    }\n    const res = await this.getCoinMetadata({ coinType })\n    this.updateCache(cacheKey, res)\n    return res\n  }\n\n  /**\n   * Gets the SUI transaction response for a given transaction digest.\n   * @param digest - The digest of the transaction for which the SUI transaction response is requested.\n   * @param forceRefresh - A boolean flag indicating whether to force a refresh of the response.\n   * @returns A Promise that resolves with the SUI transaction block response or null if the response is not available.\n   */\n  async getSuiTransactionResponse(digest: string): Promise<SuiTransactionBlockResponse | null> {\n    let objects\n    try {\n      objects = (await this.getTransactionBlock({\n        digest,\n        options: {\n          showEvents: true,\n          showEffects: true,\n          showBalanceChanges: true,\n          showInput: true,\n          showObjectChanges: true,\n        },\n      })) as SuiTransactionBlockResponse\n    } catch (error) {\n      objects = (await this.getTransactionBlock({\n        digest,\n        options: {\n          showEvents: true,\n          showEffects: true,\n        },\n      })) as SuiTransactionBlockResponse\n    }\n\n    return objects\n  }\n\n  /**\n   * Get events for a given query criteria\n   * @param query\n   * @param paginationArgs\n   * @returns\n   */\n  async queryEventsByPage(query: SuiEventFilter, paginationArgs: PaginationArgs = 'all'): Promise<DataPage<any>> {\n    let result: any = []\n    let hasNextPage = true\n    const queryAll = paginationArgs === 'all'\n    let nextCursor = queryAll ? null : paginationArgs.cursor\n\n    do {\n      const res: PaginatedEvents = await this.queryEvents({\n        query,\n        cursor: nextCursor,\n        limit: queryAll ? null : paginationArgs.limit,\n      })\n      if (res.data) {\n        result = [...result, ...res.data]\n        hasNextPage = res.hasNextPage\n        nextCursor = res.nextCursor\n      } else {\n        hasNextPage = false\n      }\n    } while (queryAll && hasNextPage)\n\n    return { data: result, next_cursor: nextCursor, has_next_page: hasNextPage }\n  }\n\n  async queryTransactionBlocksByPage(\n    filter?: TransactionFilter,\n    paginationArgs: PaginationArgs = 'all',\n    order: 'ascending' | 'descending' | null | undefined = 'ascending'\n  ): Promise<DataPage<SuiTransactionBlockResponse>> {\n    let result: any = []\n    let hasNextPage = true\n    const queryAll = paginationArgs === 'all'\n    let nextCursor = queryAll ? null : paginationArgs.cursor\n\n    do {\n      const res: PaginatedTransactionResponse = await this.queryTransactionBlocks({\n        filter,\n        cursor: nextCursor,\n        order,\n        limit: queryAll ? null : paginationArgs.limit,\n        options: { showEvents: true },\n      })\n      if (res.data) {\n        result = [...result, ...res.data]\n        hasNextPage = res.hasNextPage\n        nextCursor = res.nextCursor\n      } else {\n        hasNextPage = false\n      }\n    } while (queryAll && hasNextPage)\n\n    return { data: result, next_cursor: nextCursor, has_next_page: hasNextPage }\n  }\n\n  /**\n   * Get all objects owned by an address\n   * @param owner\n   * @param query\n   * @param paginationArgs\n   * @returns\n   */\n  async getOwnedObjectsByPage(\n    owner: string,\n    query: SuiObjectResponseQuery,\n    paginationArgs: PaginationArgs = 'all'\n  ): Promise<DataPage<any>> {\n    let result: any = []\n    let hasNextPage = true\n    const queryAll = paginationArgs === 'all'\n    let nextCursor = queryAll ? null : paginationArgs.cursor\n    do {\n      const res: PaginatedObjectsResponse = await this.getOwnedObjects({\n        owner,\n        ...query,\n        cursor: nextCursor,\n        limit: queryAll ? null : paginationArgs.limit,\n      })\n      if (res.data) {\n        result = [...result, ...res.data]\n        hasNextPage = res.hasNextPage\n        nextCursor = res.nextCursor\n      } else {\n        hasNextPage = false\n      }\n    } while (queryAll && hasNextPage)\n\n    return { data: result, next_cursor: nextCursor, has_next_page: hasNextPage }\n  }\n\n  /**\n   * Return the list of dynamic field objects owned by an object\n   * @param parentId\n   * @param paginationArgs\n   * @returns\n   */\n  async getDynamicFieldsByPage(parentId: SuiObjectIdType, paginationArgs: PaginationArgs = 'all'): Promise<DataPage<any>> {\n    let result: any = []\n    let hasNextPage = true\n    const queryAll = paginationArgs === 'all'\n    let nextCursor = queryAll ? null : paginationArgs.cursor\n    do {\n      const res: DynamicFieldPage = await this.getDynamicFields({\n        parentId,\n        cursor: nextCursor,\n        limit: queryAll ? null : paginationArgs.limit,\n      })\n\n      if (res.data) {\n        result = [...result, ...res.data]\n        hasNextPage = res.hasNextPage\n        nextCursor = res.nextCursor\n      } else {\n        hasNextPage = false\n      }\n    } while (queryAll && hasNextPage)\n\n    return { data: result, next_cursor: nextCursor, has_next_page: hasNextPage }\n  }\n\n  /**\n   * Batch get details about a list of objects. If any of the object ids are duplicates the call will fail\n   * @param ids\n   * @param options\n   * @param limit\n   * @returns\n   */\n  async batchGetObjects(ids: SuiObjectIdType[], options?: SuiObjectDataOptions, limit = 50): Promise<SuiObjectResponse[]> {\n    let objectDataResponses: SuiObjectResponse[] = []\n\n    try {\n      for (let i = 0; i < Math.ceil(ids.length / limit); i++) {\n        const res = await this.multiGetObjects({\n          ids: ids.slice(i * limit, limit * (i + 1)),\n          options,\n        })\n        objectDataResponses = [...objectDataResponses, ...res]\n      }\n    } catch (error) {\n      console.log(error)\n    }\n\n    return objectDataResponses\n  }\n\n  /**\n   * Calculates the gas cost of a transaction block.\n   * @param {Transaction} tx - The transaction block to calculate gas for.\n   * @returns {Promise<number>} - The estimated gas cost of the transaction block.\n   * @throws {Error} - Throws an error if the sender is empty.\n   */\n  async calculationTxGas(tx: Transaction): Promise<number> {\n    const { sender } = tx.blockData\n\n    if (sender === undefined) {\n      throw Error('sdk sender is empty')\n    }\n\n    const devResult = await this.devInspectTransactionBlock({\n      transactionBlock: tx,\n      sender,\n    })\n    const { gasUsed } = devResult.effects\n\n    const estimateGas = Number(gasUsed.computationCost) + Number(gasUsed.storageCost) - Number(gasUsed.storageRebate)\n    return estimateGas\n  }\n\n  /**\n   * Sends a transaction block after signing it with the provided keypair.\n   *\n   * @param {Ed25519Keypair | Secp256k1Keypair} keypair - The keypair used for signing the transaction.\n   * @param {Transaction} tx - The transaction block to send.\n   * @returns {Promise<SuiTransactionBlockResponse | undefined>} - The response of the sent transaction block.\n   */\n  async sendTransaction(keypair: Ed25519Keypair | Secp256k1Keypair, tx: Transaction): Promise<SuiTransactionBlockResponse | undefined> {\n    try {\n      const resultTxn: any = await this.signAndExecuteTransaction({\n        transaction: tx,\n        signer: keypair,\n        options: {\n          showEffects: true,\n          showEvents: true,\n        },\n      })\n      return resultTxn\n    } catch (error) {\n      console.log('error: ', error)\n    }\n    return undefined\n  }\n\n  /**\n   * Send a simulation transaction.\n   * @param tx - The transaction block.\n   * @param simulationAccount - The simulation account.\n   * @param useDevInspect - A flag indicating whether to use DevInspect. Defaults to true.\n   * @returns A promise that resolves to DevInspectResults or undefined.\n   */\n  async sendSimulationTransaction(tx: Transaction, simulationAccount: string): Promise<DryRunTransactionBlockResponse | undefined> {\n    try {\n      tx.setSender(simulationAccount)\n      const simulateRes = await this.dryRunTransactionBlock({\n        transactionBlock: await tx.build({\n          client: this,\n        }),\n      })\n      // const simulateRes = await this.devInspectTransactionBlock({\n      //   transactionBlock: tx,\n      //   sender: simulationAccount,\n      // })\n      return simulateRes\n    } catch (error) {\n      console.log('devInspectTransactionBlock error', error)\n    }\n\n    return undefined\n  }\n\n  async executeTx(keypair: Ed25519Keypair | Secp256k1Keypair, tx: Transaction, simulate: boolean): Promise<any> {\n    if (simulate) {\n      const res = await this.sendSimulationTransaction(tx, normalizeSuiAddress(keypair.getPublicKey().toSuiAddress()))\n      // console.log('executeTx: ', res.events.length > 0? res.events : res)\n      return res!.events.length > 0 ? res!.events : res\n    } else {\n      const txResult = await this.sendTransaction(keypair, tx)\n      return txResult\n    }\n  }\n\n  /**\n   * Gets all coin assets for the given owner and coin type.\n   *\n   * @param suiAddress The address of the owner.\n   * @param coinType The type of the coin.\n   * @returns an array of coin assets.\n   */\n  async getOwnerCoinAssets(suiAddress: string, coinType?: string | null): Promise<CoinAsset[]> {\n    const allCoinAsset: CoinAsset[] = []\n    let nextCursor: string | null | undefined = null\n\n    while (true) {\n      const allCoinObject: any = await (coinType\n        ? this.getCoins({\n            owner: suiAddress,\n            coinType,\n            cursor: nextCursor,\n          })\n        : this.getAllCoins({\n            owner: suiAddress,\n            cursor: nextCursor,\n          }))\n\n      allCoinObject.data.forEach((coin: any) => {\n        if (BigInt(coin.balance) > 0) {\n          allCoinAsset.push({\n            coin_type: extractStructTagFromType(coin.coinType).source_address,\n            coin_object_id: coin.coinObjectId,\n            balance: BigInt(coin.balance),\n          })\n        }\n      })\n      nextCursor = allCoinObject.nextCursor\n\n      if (!allCoinObject.hasNextPage) {\n        break\n      }\n    }\n    return allCoinAsset\n  }\n\n  /**\n   * Gets all coin balances for the given owner and coin type.\n   *\n   * @param suiAddress The address of the owner.\n   * @param coinType The type of the coin.\n   * @returns an array of coin balances.\n   */\n  async getOwnerCoinBalances(suiAddress: string, coinType?: string | null): Promise<CoinBalance[]> {\n    let allCoinBalance: CoinBalance[] = []\n\n    if (coinType) {\n      const res = await this.getBalance({\n        owner: suiAddress,\n        coinType,\n      })\n      allCoinBalance = [res]\n    } else {\n      const res = await this.getAllBalances({\n        owner: suiAddress,\n      })\n      allCoinBalance = [...res]\n    }\n    return allCoinBalance\n  }\n\n  /**\n   * Updates the cache for the given key.\n   *\n   * @param key The key of the cache entry to update.\n   * @param data The data to store in the cache.\n   * @param time The time in minutes after which the cache entry should expire.\n   */\n  private updateCache(key: string, data: SuiResource, time = cacheTime24h): void {\n    let cacheData = this._cache[key]\n    if (cacheData) {\n      cacheData.overdueTime = getFutureTime(time)\n      cacheData.value = data\n    } else {\n      cacheData = new CachedContent(data, getFutureTime(time))\n    }\n    this._cache[key] = cacheData\n  }\n\n  /**\n   * Gets the cache entry for the given key.\n   *\n   * @param key The key of the cache entry to get.\n   * @param forceRefresh Whether to force a refresh of the cache entry.\n   * @returns The cache entry for the given key, or undefined if the cache entry does not exist or is expired.\n   */\n  private getCache<T>(key: string, forceRefresh = false): T | undefined {\n    const cacheData = this._cache[key]\n    const isValid = cacheData?.isValid()\n    if (!forceRefresh && isValid) {\n      return cacheData.value as T\n    }\n    if (!isValid) {\n      delete this._cache[key]\n    }\n    return undefined\n  }\n}\n","import type { SuiResource } from '../type/sui'\n\nexport const cacheTime5min = 5 * 60 * 1000\nexport const cacheTime24h = 24 * 60 * 60 * 1000\n\nexport function getFutureTime(interval: number) {\n  return Date.parse(new Date().toString()) + interval\n}\n\n/**\n * Defines the structure of a CachedContent object, used for caching resources in memory.\n */\nexport class CachedContent {\n  overdueTime: number\n\n  value: SuiResource | null\n\n  constructor(value: SuiResource | null, overdueTime = 0) {\n    this.overdueTime = overdueTime\n    this.value = value\n  }\n\n  isValid(): boolean {\n    if (this.value === null) {\n      return false\n    }\n    if (this.overdueTime === 0) {\n      return true\n    }\n    if (Date.parse(new Date().toString()) > this.overdueTime) {\n      return false\n    }\n    return true\n  }\n}\n","import { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519'\nimport { Secp256k1Keypair } from '@mysten/sui/keypairs/secp256k1'\nimport { fromB64, fromBase64, fromHex, fromHEX, normalizeSuiObjectId } from '@mysten/sui/utils'\nimport type { SuiAddressType, SuiStructTag } from '../type/sui'\nimport { CoinAssist, GAS_TYPE_ARG, GAS_TYPE_ARG_LONG } from './coinAssist'\nimport { removeHexPrefix } from './hex'\n\nconst EQUAL = 0\nconst LESS_THAN = 1\nconst GREATER_THAN = 2\n\nfunction cmp(a: number, b: number) {\n  if (a === b) {\n    return EQUAL\n  }\n  if (a < b) {\n    return LESS_THAN\n  }\n  return GREATER_THAN\n}\n\nfunction compare(symbolX: string, symbolY: string) {\n  let i = 0\n\n  const len = symbolX.length <= symbolY.length ? symbolX.length : symbolY.length\n\n  const lenCmp = cmp(symbolX.length, symbolY.length)\n  while (i < len) {\n    const elemCmp = cmp(symbolX.charCodeAt(i), symbolY.charCodeAt(i))\n    i += 1\n    if (elemCmp !== 0) {\n      return elemCmp\n    }\n  }\n\n  return lenCmp\n}\n\nexport function isSortedSymbols(symbolX: string, symbolY: string) {\n  return compare(symbolX, symbolY) === LESS_THAN\n}\n\nexport function composeType(address: string, generics: SuiAddressType[]): SuiAddressType\nexport function composeType(address: string, struct: string, generics?: SuiAddressType[]): SuiAddressType\nexport function composeType(address: string, module: string, struct: string, generics?: SuiAddressType[]): SuiAddressType\nexport function composeType(address: string, ...args: unknown[]): SuiAddressType {\n  const generics: string[] = Array.isArray(args[args.length - 1]) ? (args.pop() as string[]) : []\n  const chains = [address, ...args].filter(Boolean)\n\n  let result: string = chains.join('::')\n\n  if (generics && generics.length) {\n    result += `<${generics.join(', ')}>`\n  }\n\n  return result\n}\n\nexport function extractAddressFromType(type: string) {\n  return type.split('::')[0]\n}\n\nexport function extractStructTagFromType(type: string): SuiStructTag {\n  try {\n    let _type = type.replace(/\\s/g, '')\n\n    const genericsString = _type.match(/(<.+>)$/)\n    const generics = genericsString?.[0]?.match(/(\\w+::\\w+::\\w+)(?:<.*?>(?!>))?/g)\n    if (generics) {\n      _type = _type.slice(0, _type.indexOf('<'))\n      const tag = extractStructTagFromType(_type)\n      const structTag: SuiStructTag = {\n        ...tag,\n        type_arguments: generics.map((item) => extractStructTagFromType(item).source_address),\n      }\n      structTag.type_arguments = structTag.type_arguments.map((item) => {\n        return CoinAssist.isSuiCoin(item) ? item : extractStructTagFromType(item).source_address\n      })\n      structTag.source_address = composeType(structTag.full_address, structTag.type_arguments)\n      return structTag\n    }\n    const parts = _type.split('::')\n\n    const isSuiCoin = _type === GAS_TYPE_ARG || _type === GAS_TYPE_ARG_LONG\n\n    const structTag: SuiStructTag = {\n      full_address: _type,\n      address: isSuiCoin ? '0x2' : normalizeSuiObjectId(parts[0]),\n      module: parts[1],\n      name: parts[2],\n      type_arguments: [],\n      source_address: '',\n    }\n    structTag.full_address = `${structTag.address}::${structTag.module}::${structTag.name}`\n    structTag.source_address = composeType(structTag.full_address, structTag.type_arguments)\n    return structTag\n  } catch (error) {\n    return {\n      full_address: type,\n      address: '',\n      module: '',\n      name: '',\n      type_arguments: [],\n      source_address: type,\n    }\n  }\n}\n\nexport function normalizeCoinType(coinType: string): string {\n  return extractStructTagFromType(coinType).source_address\n}\n\nexport function fixSuiObjectId(value: string): string {\n  if (value.toLowerCase().startsWith('0x')) {\n    return normalizeSuiObjectId(value)\n  }\n  return value\n}\n\n/**\n * Fixes and normalizes a coin type by removing or keeping the prefix.\n *\n * @param {string} coinType - The coin type to be fixed.\n * @param {boolean} removePrefix - Whether to remove the prefix or not (default: true).\n * @returns {string} - The fixed and normalized coin type.\n */\nexport const fixCoinType = (coinType: string, removePrefix = true) => {\n  const arr = coinType.split('::')\n  const address = arr.shift() as string\n  let normalizeAddress = normalizeSuiObjectId(address)\n  if (removePrefix) {\n    normalizeAddress = removeHexPrefix(normalizeAddress)\n  }\n  return `${normalizeAddress}::${arr.join('::')}`\n}\n\n/**\n * Recursively traverses the given data object and patches any string values that represent Sui object IDs.\n *\n * @param {any} data - The data object to be patched.\n */\nexport function patchFixSuiObjectId(data: any) {\n  for (const key in data) {\n    const type = typeof data[key]\n    if (type === 'object') {\n      patchFixSuiObjectId(data[key])\n    } else if (type === 'string') {\n      const value = data[key]\n      if (value && !value.includes('::')) {\n        data[key] = fixSuiObjectId(value)\n      }\n    }\n  }\n}\n\n/**\n * Converts a secret key in string or Uint8Array format to an Ed25519 key pair.\n * @param {string|Uint8Array} secretKey - The secret key to convert.\n * @param {string} ecode - The encoding of the secret key ('hex' or 'base64'). Defaults to 'hex'.\n * @returns {Ed25519Keypair} - Returns the Ed25519 key pair.\n */\nexport function secretKeyToEd25519Keypair(secretKey: string | Uint8Array, ecode: 'hex' | 'base64' = 'hex'): Ed25519Keypair {\n  if (secretKey instanceof Uint8Array) {\n    const key = Buffer.from(secretKey)\n    return Ed25519Keypair.fromSecretKey(new Uint8Array(key))\n  }\n\n  const hexKey = ecode === 'hex' ? fromHex(secretKey) : fromBase64(secretKey)\n  return Ed25519Keypair.fromSecretKey(hexKey)\n}\n\n/**\n * Converts a secret key in string or Uint8Array format to a Secp256k1 key pair.\n * @param {string|Uint8Array} secretKey - The secret key to convert.\n * @param {string} ecode - The encoding of the secret key ('hex' or 'base64'). Defaults to 'hex'.\n * @returns {Ed25519Keypair} - Returns the Secp256k1 key pair.\n */\nexport function secretKeyToSecp256k1Keypair(secretKey: string | Uint8Array, ecode: 'hex' | 'base64' = 'hex'): Secp256k1Keypair {\n  if (secretKey instanceof Uint8Array) {\n    const key = Buffer.from(secretKey)\n    return Secp256k1Keypair.fromSecretKey(new Uint8Array(key))\n  }\n  const hexKey = ecode === 'hex' ? fromHEX(secretKey) : fromB64(secretKey)\n  return Secp256k1Keypair.fromSecretKey(hexKey)\n}\n","import type { Transaction, TransactionObjectArgument } from '@mysten/sui/transactions'\nimport { coinWithBalance } from '@mysten/sui/transactions'\nimport { CommonErrorCode, handleMessageError } from '../errors/errors'\nimport type { BuildCoinResult, CoinAsset, CoinInputInterval, MultiCoinInput } from '../type/clmm'\nimport type { SuiAddressType } from '../type/sui'\nimport { extractStructTagFromType, normalizeCoinType } from './contracts'\nimport { d } from './numbers'\n\nexport const DEFAULT_GAS_BUDGET_FOR_SPLIT = 1000\nexport const DEFAULT_GAS_BUDGET_FOR_MERGE = 500\nexport const DEFAULT_GAS_BUDGET_FOR_TRANSFER = 100\nexport const DEFAULT_GAS_BUDGET_FOR_TRANSFER_SUI = 100\nexport const DEFAULT_GAS_BUDGET_FOR_STAKE = 1000\nexport const GAS_TYPE_ARG = '0x2::sui::SUI'\nexport const GAS_TYPE_ARG_LONG = '0x0000000000000000000000000000000000000000000000000000000000000002::sui::SUI'\nexport const GAS_SYMBOL = 'SUI'\nexport const DEFAULT_NFT_TRANSFER_GAS_FEE = 450\nexport const SUI_SYSTEM_STATE_OBJECT_ID = '0x0000000000000000000000000000000000000005'\n/**\n * This class provides helper methods for working with coins.\n */\nexport class CoinAssist {\n  /**\n   * Get the total balance of a list of CoinAsset objects for a given coin address.\n   *\n   * @param objs The list of CoinAsset objects to get the total balance for.\n   * @param coinAddress The coin address to get the total balance for.\n   * @returns The total balance of the CoinAsset objects for the given coin address.\n   */\n  public static totalBalance(objs: CoinAsset[], coinAddress: SuiAddressType): bigint {\n    let balanceTotal = BigInt(0)\n    objs.forEach((obj) => {\n      if (coinAddress === obj.coin_type) {\n        balanceTotal += BigInt(obj.balance)\n      }\n    })\n    return balanceTotal\n  }\n\n  /**\n   * Get the CoinAsset objects for a given coin type.\n   *\n   * @param coinType The coin type to get the CoinAsset objects for.\n   * @param allSuiObjects The list of all SuiMoveObjects.\n   * @returns The CoinAsset objects for the given coin type.\n   */\n  public static getCoinAssets(coinType: string, allSuiObjects: CoinAsset[]): CoinAsset[] {\n    const coins: CoinAsset[] = []\n    allSuiObjects.forEach((anObj) => {\n      if (normalizeCoinType(anObj.coin_type) === normalizeCoinType(coinType)) {\n        coins.push(anObj)\n      }\n    })\n    return coins\n  }\n\n  /**\n   * Get whether a coin address is a SUI coin.\n   *\n   * @param coinAddress The coin address to check.\n   * @returns Whether the coin address is a SUI coin.\n   */\n  public static isSuiCoin(coinAddress: SuiAddressType) {\n    return extractStructTagFromType(coinAddress).full_address === GAS_TYPE_ARG\n  }\n\n  /**\n   * Select the CoinAsset objects from a list of CoinAsset objects that have a balance greater than or equal to a given amount.\n   *\n   * @param coins The list of CoinAsset objects to select from.\n   * @param amount The amount to select CoinAsset objects with a balance greater than or equal to.\n   * @param exclude A list of CoinAsset objects to exclude from the selection.\n   * @returns The CoinAsset objects that have a balance greater than or equal to the given amount.\n   */\n  static selectCoinObjectIdGreaterThanOrEqual(\n    coins: CoinAsset[],\n    amount: bigint,\n    exclude: string[] = []\n  ): { objectArray: string[]; remainCoins: CoinAsset[]; amountArray: string[] } {\n    const selectedResult = CoinAssist.selectCoinAssetGreaterThanOrEqual(coins, amount, exclude)\n    const objectArray = selectedResult.selectedCoins.map((item) => item.coin_object_id)\n    const remainCoins = selectedResult.remainingCoins\n    const amountArray = selectedResult.selectedCoins.map((item) => item.balance.toString())\n    return { objectArray, remainCoins, amountArray }\n  }\n\n  /**\n   * Select the CoinAsset objects from a list of CoinAsset objects that have a balance greater than or equal to a given amount.\n   *\n   * @param coins The list of CoinAsset objects to select from.\n   * @param amount The amount to select CoinAsset objects with a balance greater than or equal to.\n   * @param exclude A list of CoinAsset objects to exclude from the selection.\n   * @returns The CoinAsset objects that have a balance greater than or equal to the given amount.\n   */\n  static selectCoinAssetGreaterThanOrEqual(\n    coins: CoinAsset[],\n    amount: bigint,\n    exclude: string[] = []\n  ): { selectedCoins: CoinAsset[]; remainingCoins: CoinAsset[] } {\n    const sortedCoins = CoinAssist.sortByBalance(coins.filter((c) => !exclude.includes(c.coin_object_id)))\n\n    const total = CoinAssist.calculateTotalBalance(sortedCoins)\n\n    if (total < amount) {\n      return { selectedCoins: [], remainingCoins: sortedCoins }\n    }\n    if (total === amount) {\n      return { selectedCoins: sortedCoins, remainingCoins: [] }\n    }\n\n    let sum = BigInt(0)\n    const selectedCoins = []\n    const remainingCoins = [...sortedCoins]\n    while (sum < total) {\n      const target = amount - sum\n      const coinWithSmallestSufficientBalanceIndex = remainingCoins.findIndex((c) => c.balance >= target)\n      if (coinWithSmallestSufficientBalanceIndex !== -1) {\n        selectedCoins.push(remainingCoins[coinWithSmallestSufficientBalanceIndex])\n        remainingCoins.splice(coinWithSmallestSufficientBalanceIndex, 1)\n        break\n      }\n\n      const coinWithLargestBalance = remainingCoins.pop()!\n      if (coinWithLargestBalance.balance > 0) {\n        selectedCoins.push(coinWithLargestBalance)\n        sum += coinWithLargestBalance.balance\n      }\n    }\n    return { selectedCoins: CoinAssist.sortByBalance(selectedCoins), remainingCoins: CoinAssist.sortByBalance(remainingCoins) }\n  }\n\n  /**\n   * Sort the CoinAsset objects by their balance.\n   *\n   * @param coins The CoinAsset objects to sort.\n   * @returns The sorted CoinAsset objects.\n   */\n  static sortByBalance(coins: CoinAsset[]): CoinAsset[] {\n    return coins.sort((a, b) => (a.balance < b.balance ? -1 : a.balance > b.balance ? 1 : 0))\n  }\n\n  static sortByBalanceDes(coins: CoinAsset[]): CoinAsset[] {\n    return coins.sort((a, b) => (a.balance > b.balance ? -1 : a.balance < b.balance ? 0 : 1))\n  }\n\n  /**\n   * Calculate the total balance of a list of CoinAsset objects.\n   *\n   * @param coins The list of CoinAsset objects to calculate the total balance for.\n   * @returns The total balance of the CoinAsset objects.\n   */\n  static calculateTotalBalance(coins: CoinAsset[]): bigint {\n    return coins.reduce((partialSum, c) => partialSum + c.balance, BigInt(0))\n  }\n\n  public static buildCoinForAmount(\n    tx: Transaction,\n    allCoins: CoinAsset[],\n    amount: bigint,\n    coinType: string,\n    buildVector = true,\n    fixAmount = true\n  ): BuildCoinResult {\n    const coinAssets: CoinAsset[] = CoinAssist.getCoinAssets(coinType, allCoins)\n    // mint zero coin\n    if (amount === BigInt(0)) {\n      return this.buildZeroValueCoin(allCoins, tx, coinType, buildVector)\n    }\n    const amountTotal = CoinAssist.calculateTotalBalance(coinAssets)\n    if (amountTotal < amount) {\n      throw new Error(`The amount(${amountTotal}) is Insufficient balance for ${coinType} , expect ${amount} `)\n    }\n\n    return this.buildCoin(tx, allCoins, coinAssets, amount, coinType, buildVector, fixAmount)\n  }\n\n  public static buildCoinWithBalance(amount: bigint, coinType: string, tx: Transaction): TransactionObjectArgument {\n    if (amount === BigInt(0)) {\n      if (CoinAssist.isSuiCoin(coinType)) {\n        return tx.add(coinWithBalance({ balance: amount, useGasCoin: false }))\n      }\n    }\n\n    return tx.add(coinWithBalance({ balance: amount, type: coinType }))\n  }\n\n  private static buildVectorCoin(\n    tx: Transaction,\n    allCoins: CoinAsset[],\n    coinAssets: CoinAsset[],\n    amount: bigint,\n    coinType: string,\n    fixAmount = true\n  ): BuildCoinResult {\n    if (CoinAssist.isSuiCoin(coinType)) {\n      const amountCoin = tx.splitCoins(tx.gas, [tx.pure.u64(amount)])\n      return {\n        selected_coins: [],\n        target_coin: amountCoin,\n        remain_coins: allCoins,\n        target_coin_amount: amount.toString(),\n        is_mint_zero_coin: false,\n        original_spited_coin: tx.gas,\n      }\n    }\n\n    const { original_spited_coin, target_coin, target_coin_amount, remain_coins, selected_coins } = this.buildSpitTargeCoin(\n      tx,\n      amount,\n      coinAssets,\n      fixAmount\n    )\n\n    if (fixAmount) {\n      return {\n        target_coin: tx.makeMoveVec({ elements: [target_coin] }),\n        selected_coins: selected_coins,\n        remain_coins: remain_coins,\n        target_coin_amount: target_coin_amount,\n        is_mint_zero_coin: false,\n        original_spited_coin: original_spited_coin,\n      }\n    }\n\n    return {\n      selected_coins: selected_coins,\n      target_coin: tx.makeMoveVec({ elements: selected_coins.map((id) => tx.object(id)) }),\n      remain_coins: remain_coins,\n      target_coin_amount,\n      is_mint_zero_coin: false,\n    }\n  }\n\n  private static buildOneCoin(\n    tx: Transaction,\n    coinAssets: CoinAsset[],\n    amount: bigint,\n    coinType: string,\n    fixAmount = true\n  ): BuildCoinResult {\n    if (CoinAssist.isSuiCoin(coinType)) {\n      if (amount === 0n && coinAssets.length > 1) {\n        const selectedCoinsResult = CoinAssist.selectCoinObjectIdGreaterThanOrEqual(coinAssets, amount)\n\n        return {\n          selected_coins: selectedCoinsResult.objectArray,\n          target_coin: tx.object(selectedCoinsResult.objectArray[0]),\n          remain_coins: selectedCoinsResult.remainCoins,\n          target_coin_amount: selectedCoinsResult.amountArray[0],\n          is_mint_zero_coin: false,\n        }\n      }\n      const selectedCoinsResult = CoinAssist.selectCoinObjectIdGreaterThanOrEqual(coinAssets, amount)\n      const amountCoin = tx.splitCoins(tx.gas, [tx.pure.u64(amount)])\n\n      return {\n        selected_coins: [],\n        target_coin: amountCoin,\n        remain_coins: selectedCoinsResult.remainCoins,\n        target_coin_amount: amount.toString(),\n        is_mint_zero_coin: false,\n        original_spited_coin: tx.gas,\n      }\n    }\n\n    return this.buildSpitTargeCoin(tx, amount, coinAssets, fixAmount)\n  }\n\n  private static buildSpitTargeCoin(tx: Transaction, amount: bigint, coinAssets: CoinAsset[], fixAmount: boolean): BuildCoinResult {\n    const selectedCoinsResult = CoinAssist.selectCoinObjectIdGreaterThanOrEqual(coinAssets, amount)\n    const totalSelectedCoinAmount = selectedCoinsResult.amountArray.reduce((a, b) => Number(a) + Number(b), 0).toString()\n    const coinObjectIds = selectedCoinsResult.objectArray\n\n    const [primaryCoinA, ...mergeCoinAs] = coinObjectIds\n    const primaryCoinAObject = tx.object(primaryCoinA)\n\n    let targetCoin: any = primaryCoinAObject\n    const targetCoinAmount = selectedCoinsResult.amountArray.reduce((a, b) => Number(a) + Number(b), 0).toString()\n    let originalSpitedCoin\n    if (mergeCoinAs.length > 0) {\n      tx.mergeCoins(\n        primaryCoinAObject,\n        mergeCoinAs.map((coin) => tx.object(coin))\n      )\n    }\n\n    if (fixAmount && Number(totalSelectedCoinAmount) > Number(amount)) {\n      targetCoin = tx.splitCoins(primaryCoinAObject, [tx.pure.u64(amount)])\n      originalSpitedCoin = primaryCoinAObject\n    }\n\n    return {\n      original_spited_coin: originalSpitedCoin,\n      target_coin: targetCoin,\n      target_coin_amount: targetCoinAmount,\n      remain_coins: selectedCoinsResult.remainCoins,\n      selected_coins: selectedCoinsResult.objectArray,\n      is_mint_zero_coin: false,\n    }\n  }\n\n  private static buildCoin(\n    tx: Transaction,\n    allCoins: CoinAsset[],\n    coinAssets: CoinAsset[],\n    amount: bigint,\n    coinType: string,\n    buildVector = true,\n    fixAmount = true\n  ): BuildCoinResult {\n    if (buildVector) {\n      return this.buildVectorCoin(tx, allCoins, coinAssets, amount, coinType, fixAmount)\n    }\n\n    return this.buildOneCoin(tx, coinAssets, amount, coinType, fixAmount)\n  }\n\n  private static buildZeroValueCoin(allCoins: CoinAsset[], tx: Transaction, coinType: string, buildVector = true): BuildCoinResult {\n    const zeroCoin = this.callMintZeroValueCoin(tx, coinType)\n    let targetCoin: any\n    if (buildVector) {\n      targetCoin = tx.makeMoveVec({ elements: [zeroCoin] })\n    } else {\n      targetCoin = zeroCoin\n    }\n\n    return {\n      target_coin: targetCoin,\n      remain_coins: allCoins,\n      selected_coins: [],\n      is_mint_zero_coin: true,\n      target_coin_amount: '0',\n    }\n  }\n\n  public static buildCoinForAmountInterval(\n    tx: Transaction,\n    allCoins: CoinAsset[],\n    amounts: CoinInputInterval,\n    coinType: string,\n    buildVector = true,\n    fixAmount = true\n  ): BuildCoinResult {\n    const coinAssets: CoinAsset[] = CoinAssist.getCoinAssets(coinType, allCoins)\n    if (amounts.amount_first === BigInt(0)) {\n      if (coinAssets.length > 0) {\n        return this.buildCoin(tx, [...allCoins], [...coinAssets], amounts.amount_first, coinType, buildVector, fixAmount)\n      }\n      return this.buildZeroValueCoin(allCoins, tx, coinType, buildVector)\n    }\n\n    const amountTotal = CoinAssist.calculateTotalBalance(coinAssets)\n\n    if (amountTotal >= amounts.amount_first) {\n      return this.buildCoin(tx, [...allCoins], [...coinAssets], amounts.amount_first, coinType, buildVector, fixAmount)\n    }\n\n    if (amountTotal < amounts.amount_second) {\n      throw new Error(`The amount(${amountTotal}) is Insufficient balance for ${coinType} , expect ${amounts.amount_second} `)\n    }\n\n    return this.buildCoin(tx, [...allCoins], [...coinAssets], amounts.amount_second, coinType, buildVector, fixAmount)\n  }\n\n  public static callMintZeroValueCoin = (txb: Transaction, coinType: string) => {\n    return txb.moveCall({\n      target: '0x2::coin::zero',\n      typeArguments: [coinType],\n    })\n  }\n\n  public static fromBalance(balance: TransactionObjectArgument, coinType: string, tx: Transaction): TransactionObjectArgument {\n    const coin = tx.moveCall({\n      target: `0x2::coin::from_balance`,\n      typeArguments: [coinType],\n      arguments: [balance],\n    })\n\n    return coin\n  }\n\n  public static getCoinAmountObjId(coinInput: MultiCoinInput, amount: string): TransactionObjectArgument {\n    const coinObj = coinInput.amount_coin_array.find((coin) => {\n      if (!coin.used && d(coin.amount).eq(amount)) {\n        coin.used = true\n        return true\n      }\n      return false\n    })\n    if (!coinObj) {\n      return handleMessageError(CommonErrorCode.CoinNotFound, `Coin not found for ${amount} ${coinInput.coin_type}`)\n    }\n    return coinObj.coin_object_id\n  }\n\n  public static buildMultiCoinInput(tx: Transaction, allCoinAssets: CoinAsset[], coinType: string, amountArr: bigint[]): MultiCoinInput {\n    const coinAssets = CoinAssist.getCoinAssets(coinType, allCoinAssets)\n    if (CoinAssist.isSuiCoin(coinType)) {\n      const amountCoins = tx.splitCoins(\n        tx.gas,\n        amountArr.map((amount) => tx.pure.u64(amount))\n      )\n\n      const amountCoinArray = amountArr.map((amount, index) => {\n        return {\n          coin_object_id: amountCoins[index],\n          amount: amount.toString(),\n          used: false,\n        }\n      })\n\n      return {\n        amount_coin_array: amountCoinArray,\n        coin_type: coinType,\n        remain_coins: coinAssets,\n      }\n    }\n    const totalAmount = amountArr.reduce((acc, curr) => acc + curr, BigInt(0))\n    const selectedCoinsResult = CoinAssist.selectCoinObjectIdGreaterThanOrEqual(coinAssets, totalAmount)\n    if (selectedCoinsResult.objectArray.length === 0) {\n      return handleMessageError(\n        CommonErrorCode.InsufficientBalance,\n        `No enough coins for ${coinType} expect ${totalAmount} actual ${CoinAssist.calculateTotalBalance(coinAssets)}`\n      )\n    }\n    const [targetCoin, ...otherCoins] = selectedCoinsResult.objectArray\n    if (otherCoins.length > 0) {\n      tx.mergeCoins(targetCoin, [...otherCoins])\n    }\n\n    const amountCoins = tx.splitCoins(\n      targetCoin,\n      amountArr.map((amount) => tx.pure.u64(amount))\n    )\n\n    const amountCoinArray = amountArr.map((amount, index) => {\n      return {\n        coin_object_id: amountCoins[index],\n        amount: amount.toString(),\n        used: false,\n      }\n    })\n\n    return {\n      amount_coin_array: amountCoinArray,\n      remain_coins: selectedCoinsResult.remainCoins,\n      coin_type: coinType,\n    }\n  }\n}\n","// Common keys for error details\nexport const DETAILS_KEYS = {\n  REQUEST_PARAMS: 'requestParams',\n  METHOD_NAME: 'methodName',\n} as const\n\n// Type for error details\ntype ErrorDetails = {\n  [DETAILS_KEYS.REQUEST_PARAMS]?: Record<string, any>\n  [DETAILS_KEYS.METHOD_NAME]?: string\n}\n\nexport abstract class BaseError extends Error {\n  static readonly DETAILS_KEYS = DETAILS_KEYS\n\n  protected constructor(\n    message: string,\n    public readonly code: string,\n    public readonly details?: Partial<ErrorDetails>\n  ) {\n    super(message)\n    this.name = this.constructor.name\n  }\n\n  /**\n   * Convert error to JSON format\n   */\n  toJSON(): Record<string, any> {\n    return {\n      name: this.name,\n      message: this.message,\n      code: this.code,\n      details: this.details,\n    }\n  }\n\n  /**\n   * Convert error to string format\n   */\n  toString(): string {\n    return JSON.stringify(this.toJSON())\n  }\n\n  /**\n   * Check if error is instance of specific error code\n   */\n  static isErrorCode<T extends BaseError>(error: any, code: string): error is T {\n    return error instanceof BaseError && error.code === code\n  }\n}\n","import { BaseError } from './baseError'\n\nexport enum CommonErrorCode {\n  MultiplicationOverflow = 'MultiplicationOverflow',\n  DivisionByZero = 'DivisionByZero',\n  CoinNotFound = 'CoinNotFound',\n  InsufficientBalance = 'InsufficientBalance',\n  InvalidTick = 'InvalidTick',\n  InvalidSenderAddress = 'InvalidSenderAddress',\n}\n\nexport class CommonError extends BaseError {\n  constructor(message: string, errorCode?: CommonErrorCode, details?: Record<string, any>) {\n    super(message, errorCode || 'UnknownError', details)\n  }\n\n  static isCommonErrorCode(e: any, code: CommonErrorCode): boolean {\n    return this.isErrorCode<CommonError>(e, code)\n  }\n}\n\nexport const handleError = (code: CommonErrorCode, error: Error, details?: Record<string, any>) => {\n  throw new CommonError(error.message, code, details)\n}\n\nexport const handleMessageError = (code: CommonErrorCode, message: string, details?: Record<string, any>) => {\n  throw new CommonError(message, code, details)\n}\n","/*!\r\n *  decimal.js v10.5.0\r\n *  An arbitrary-precision Decimal type for JavaScript.\r\n *  https://github.com/MikeMcl/decimal.js\r\n *  Copyright (c) 2025 Michael Mclaughlin <M8ch88l@gmail.com>\r\n *  MIT Licence\r\n */\r\n\r\n\r\n// -----------------------------------  EDITABLE DEFAULTS  ------------------------------------ //\r\n\r\n\r\n  // The maximum exponent magnitude.\r\n  // The limit on the value of `toExpNeg`, `toExpPos`, `minE` and `maxE`.\r\nvar EXP_LIMIT = 9e15,                      // 0 to 9e15\r\n\r\n  // The limit on the value of `precision`, and on the value of the first argument to\r\n  // `toDecimalPlaces`, `toExponential`, `toFixed`, `toPrecision` and `toSignificantDigits`.\r\n  MAX_DIGITS = 1e9,                        // 0 to 1e9\r\n\r\n  // Base conversion alphabet.\r\n  NUMERALS = '0123456789abcdef',\r\n\r\n  // The natural logarithm of 10 (1025 digits).\r\n  LN10 = '2.3025850929940456840179914546843642076011014886287729760333279009675726096773524802359972050895982983419677840422862486334095254650828067566662873690987816894829072083255546808437998948262331985283935053089653777326288461633662222876982198867465436674744042432743651550489343149393914796194044002221051017141748003688084012647080685567743216228355220114804663715659121373450747856947683463616792101806445070648000277502684916746550586856935673420670581136429224554405758925724208241314695689016758940256776311356919292033376587141660230105703089634572075440370847469940168269282808481184289314848524948644871927809676271275775397027668605952496716674183485704422507197965004714951050492214776567636938662976979522110718264549734772662425709429322582798502585509785265383207606726317164309505995087807523710333101197857547331541421808427543863591778117054309827482385045648019095610299291824318237525357709750539565187697510374970888692180205189339507238539205144634197265287286965110862571492198849978748873771345686209167058',\r\n\r\n  // Pi (1025 digits).\r\n  PI = '3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989380952572010654858632789',\r\n\r\n\r\n  // The initial configuration properties of the Decimal constructor.\r\n  DEFAULTS = {\r\n\r\n    // These values must be integers within the stated ranges (inclusive).\r\n    // Most of these values can be changed at run-time using the `Decimal.config` method.\r\n\r\n    // The maximum number of significant digits of the result of a calculation or base conversion.\r\n    // E.g. `Decimal.config({ precision: 20 });`\r\n    precision: 20,                         // 1 to MAX_DIGITS\r\n\r\n    // The rounding mode used when rounding to `precision`.\r\n    //\r\n    // ROUND_UP         0 Away from zero.\r\n    // ROUND_DOWN       1 Towards zero.\r\n    // ROUND_CEIL       2 Towards +Infinity.\r\n    // ROUND_FLOOR      3 Towards -Infinity.\r\n    // ROUND_HALF_UP    4 Towards nearest neighbour. If equidistant, up.\r\n    // ROUND_HALF_DOWN  5 Towards nearest neighbour. If equidistant, down.\r\n    // ROUND_HALF_EVEN  6 Towards nearest neighbour. If equidistant, towards even neighbour.\r\n    // ROUND_HALF_CEIL  7 Towards nearest neighbour. If equidistant, towards +Infinity.\r\n    // ROUND_HALF_FLOOR 8 Towards nearest neighbour. If equidistant, towards -Infinity.\r\n    //\r\n    // E.g.\r\n    // `Decimal.rounding = 4;`\r\n    // `Decimal.rounding = Decimal.ROUND_HALF_UP;`\r\n    rounding: 4,                           // 0 to 8\r\n\r\n    // The modulo mode used when calculating the modulus: a mod n.\r\n    // The quotient (q = a / n) is calculated according to the corresponding rounding mode.\r\n    // The remainder (r) is calculated as: r = a - n * q.\r\n    //\r\n    // UP         0 The remainder is positive if the dividend is negative, else is negative.\r\n    // DOWN       1 The remainder has the same sign as the dividend (JavaScript %).\r\n    // FLOOR      3 The remainder has the same sign as the divisor (Python %).\r\n    // HALF_EVEN  6 The IEEE 754 remainder function.\r\n    // EUCLID     9 Euclidian division. q = sign(n) * floor(a / abs(n)). Always positive.\r\n    //\r\n    // Truncated division (1), floored division (3), the IEEE 754 remainder (6), and Euclidian\r\n    // division (9) are commonly used for the modulus operation. The other rounding modes can also\r\n    // be used, but they may not give useful results.\r\n    modulo: 1,                             // 0 to 9\r\n\r\n    // The exponent value at and beneath which `toString` returns exponential notation.\r\n    // JavaScript numbers: -7\r\n    toExpNeg: -7,                          // 0 to -EXP_LIMIT\r\n\r\n    // The exponent value at and above which `toString` returns exponential notation.\r\n    // JavaScript numbers: 21\r\n    toExpPos:  21,                         // 0 to EXP_LIMIT\r\n\r\n    // The minimum exponent value, beneath which underflow to zero occurs.\r\n    // JavaScript numbers: -324  (5e-324)\r\n    minE: -EXP_LIMIT,                      // -1 to -EXP_LIMIT\r\n\r\n    // The maximum exponent value, above which overflow to Infinity occurs.\r\n    // JavaScript numbers: 308  (1.7976931348623157e+308)\r\n    maxE: EXP_LIMIT,                       // 1 to EXP_LIMIT\r\n\r\n    // Whether to use cryptographically-secure random number generation, if available.\r\n    crypto: false                          // true/false\r\n  },\r\n\r\n\r\n// ----------------------------------- END OF EDITABLE DEFAULTS ------------------------------- //\r\n\r\n\r\n  inexact, quadrant,\r\n  external = true,\r\n\r\n  decimalError = '[DecimalError] ',\r\n  invalidArgument = decimalError + 'Invalid argument: ',\r\n  precisionLimitExceeded = decimalError + 'Precision limit exceeded',\r\n  cryptoUnavailable = decimalError + 'crypto unavailable',\r\n  tag = '[object Decimal]',\r\n\r\n  mathfloor = Math.floor,\r\n  mathpow = Math.pow,\r\n\r\n  isBinary = /^0b([01]+(\\.[01]*)?|\\.[01]+)(p[+-]?\\d+)?$/i,\r\n  isHex = /^0x([0-9a-f]+(\\.[0-9a-f]*)?|\\.[0-9a-f]+)(p[+-]?\\d+)?$/i,\r\n  isOctal = /^0o([0-7]+(\\.[0-7]*)?|\\.[0-7]+)(p[+-]?\\d+)?$/i,\r\n  isDecimal = /^(\\d+(\\.\\d*)?|\\.\\d+)(e[+-]?\\d+)?$/i,\r\n\r\n  BASE = 1e7,\r\n  LOG_BASE = 7,\r\n  MAX_SAFE_INTEGER = 9007199254740991,\r\n\r\n  LN10_PRECISION = LN10.length - 1,\r\n  PI_PRECISION = PI.length - 1,\r\n\r\n  // Decimal.prototype object\r\n  P = { toStringTag: tag };\r\n\r\n\r\n// Decimal prototype methods\r\n\r\n\r\n/*\r\n *  absoluteValue             abs\r\n *  ceil\r\n *  clampedTo                 clamp\r\n *  comparedTo                cmp\r\n *  cosine                    cos\r\n *  cubeRoot                  cbrt\r\n *  decimalPlaces             dp\r\n *  dividedBy                 div\r\n *  dividedToIntegerBy        divToInt\r\n *  equals                    eq\r\n *  floor\r\n *  greaterThan               gt\r\n *  greaterThanOrEqualTo      gte\r\n *  hyperbolicCosine          cosh\r\n *  hyperbolicSine            sinh\r\n *  hyperbolicTangent         tanh\r\n *  inverseCosine             acos\r\n *  inverseHyperbolicCosine   acosh\r\n *  inverseHyperbolicSine     asinh\r\n *  inverseHyperbolicTangent  atanh\r\n *  inverseSine               asin\r\n *  inverseTangent            atan\r\n *  isFinite\r\n *  isInteger                 isInt\r\n *  isNaN\r\n *  isNegative                isNeg\r\n *  isPositive                isPos\r\n *  isZero\r\n *  lessThan                  lt\r\n *  lessThanOrEqualTo         lte\r\n *  logarithm                 log\r\n *  [maximum]                 [max]\r\n *  [minimum]                 [min]\r\n *  minus                     sub\r\n *  modulo                    mod\r\n *  naturalExponential        exp\r\n *  naturalLogarithm          ln\r\n *  negated                   neg\r\n *  plus                      add\r\n *  precision                 sd\r\n *  round\r\n *  sine                      sin\r\n *  squareRoot                sqrt\r\n *  tangent                   tan\r\n *  times                     mul\r\n *  toBinary\r\n *  toDecimalPlaces           toDP\r\n *  toExponential\r\n *  toFixed\r\n *  toFraction\r\n *  toHexadecimal             toHex\r\n *  toNearest\r\n *  toNumber\r\n *  toOctal\r\n *  toPower                   pow\r\n *  toPrecision\r\n *  toSignificantDigits       toSD\r\n *  toString\r\n *  truncated                 trunc\r\n *  valueOf                   toJSON\r\n */\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the absolute value of this Decimal.\r\n *\r\n */\r\nP.absoluteValue = P.abs = function () {\r\n  var x = new this.constructor(this);\r\n  if (x.s < 0) x.s = 1;\r\n  return finalise(x);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal rounded to a whole number in the\r\n * direction of positive Infinity.\r\n *\r\n */\r\nP.ceil = function () {\r\n  return finalise(new this.constructor(this), this.e + 1, 2);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal clamped to the range\r\n * delineated by `min` and `max`.\r\n *\r\n * min {number|string|bigint|Decimal}\r\n * max {number|string|bigint|Decimal}\r\n *\r\n */\r\nP.clampedTo = P.clamp = function (min, max) {\r\n  var k,\r\n    x = this,\r\n    Ctor = x.constructor;\r\n  min = new Ctor(min);\r\n  max = new Ctor(max);\r\n  if (!min.s || !max.s) return new Ctor(NaN);\r\n  if (min.gt(max)) throw Error(invalidArgument + max);\r\n  k = x.cmp(min);\r\n  return k < 0 ? min : x.cmp(max) > 0 ? max : new Ctor(x);\r\n};\r\n\r\n\r\n/*\r\n * Return\r\n *   1    if the value of this Decimal is greater than the value of `y`,\r\n *  -1    if the value of this Decimal is less than the value of `y`,\r\n *   0    if they have the same value,\r\n *   NaN  if the value of either Decimal is NaN.\r\n *\r\n */\r\nP.comparedTo = P.cmp = function (y) {\r\n  var i, j, xdL, ydL,\r\n    x = this,\r\n    xd = x.d,\r\n    yd = (y = new x.constructor(y)).d,\r\n    xs = x.s,\r\n    ys = y.s;\r\n\r\n  // Either NaN or ±Infinity?\r\n  if (!xd || !yd) {\r\n    return !xs || !ys ? NaN : xs !== ys ? xs : xd === yd ? 0 : !xd ^ xs < 0 ? 1 : -1;\r\n  }\r\n\r\n  // Either zero?\r\n  if (!xd[0] || !yd[0]) return xd[0] ? xs : yd[0] ? -ys : 0;\r\n\r\n  // Signs differ?\r\n  if (xs !== ys) return xs;\r\n\r\n  // Compare exponents.\r\n  if (x.e !== y.e) return x.e > y.e ^ xs < 0 ? 1 : -1;\r\n\r\n  xdL = xd.length;\r\n  ydL = yd.length;\r\n\r\n  // Compare digit by digit.\r\n  for (i = 0, j = xdL < ydL ? xdL : ydL; i < j; ++i) {\r\n    if (xd[i] !== yd[i]) return xd[i] > yd[i] ^ xs < 0 ? 1 : -1;\r\n  }\r\n\r\n  // Compare lengths.\r\n  return xdL === ydL ? 0 : xdL > ydL ^ xs < 0 ? 1 : -1;\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the cosine of the value in radians of this Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-1, 1]\r\n *\r\n * cos(0)         = 1\r\n * cos(-0)        = 1\r\n * cos(Infinity)  = NaN\r\n * cos(-Infinity) = NaN\r\n * cos(NaN)       = NaN\r\n *\r\n */\r\nP.cosine = P.cos = function () {\r\n  var pr, rm,\r\n    x = this,\r\n    Ctor = x.constructor;\r\n\r\n  if (!x.d) return new Ctor(NaN);\r\n\r\n  // cos(0) = cos(-0) = 1\r\n  if (!x.d[0]) return new Ctor(1);\r\n\r\n  pr = Ctor.precision;\r\n  rm = Ctor.rounding;\r\n  Ctor.precision = pr + Math.max(x.e, x.sd()) + LOG_BASE;\r\n  Ctor.rounding = 1;\r\n\r\n  x = cosine(Ctor, toLessThanHalfPi(Ctor, x));\r\n\r\n  Ctor.precision = pr;\r\n  Ctor.rounding = rm;\r\n\r\n  return finalise(quadrant == 2 || quadrant == 3 ? x.neg() : x, pr, rm, true);\r\n};\r\n\r\n\r\n/*\r\n *\r\n * Return a new Decimal whose value is the cube root of the value of this Decimal, rounded to\r\n * `precision` significant digits using rounding mode `rounding`.\r\n *\r\n *  cbrt(0)  =  0\r\n *  cbrt(-0) = -0\r\n *  cbrt(1)  =  1\r\n *  cbrt(-1) = -1\r\n *  cbrt(N)  =  N\r\n *  cbrt(-I) = -I\r\n *  cbrt(I)  =  I\r\n *\r\n * Math.cbrt(x) = (x < 0 ? -Math.pow(-x, 1/3) : Math.pow(x, 1/3))\r\n *\r\n */\r\nP.cubeRoot = P.cbrt = function () {\r\n  var e, m, n, r, rep, s, sd, t, t3, t3plusx,\r\n    x = this,\r\n    Ctor = x.constructor;\r\n\r\n  if (!x.isFinite() || x.isZero()) return new Ctor(x);\r\n  external = false;\r\n\r\n  // Initial estimate.\r\n  s = x.s * mathpow(x.s * x, 1 / 3);\r\n\r\n   // Math.cbrt underflow/overflow?\r\n   // Pass x to Math.pow as integer, then adjust the exponent of the result.\r\n  if (!s || Math.abs(s) == 1 / 0) {\r\n    n = digitsToString(x.d);\r\n    e = x.e;\r\n\r\n    // Adjust n exponent so it is a multiple of 3 away from x exponent.\r\n    if (s = (e - n.length + 1) % 3) n += (s == 1 || s == -2 ? '0' : '00');\r\n    s = mathpow(n, 1 / 3);\r\n\r\n    // Rarely, e may be one less than the result exponent value.\r\n    e = mathfloor((e + 1) / 3) - (e % 3 == (e < 0 ? -1 : 2));\r\n\r\n    if (s == 1 / 0) {\r\n      n = '5e' + e;\r\n    } else {\r\n      n = s.toExponential();\r\n      n = n.slice(0, n.indexOf('e') + 1) + e;\r\n    }\r\n\r\n    r = new Ctor(n);\r\n    r.s = x.s;\r\n  } else {\r\n    r = new Ctor(s.toString());\r\n  }\r\n\r\n  sd = (e = Ctor.precision) + 3;\r\n\r\n  // Halley's method.\r\n  // TODO? Compare Newton's method.\r\n  for (;;) {\r\n    t = r;\r\n    t3 = t.times(t).times(t);\r\n    t3plusx = t3.plus(x);\r\n    r = divide(t3plusx.plus(x).times(t), t3plusx.plus(t3), sd + 2, 1);\r\n\r\n    // TODO? Replace with for-loop and checkRoundingDigits.\r\n    if (digitsToString(t.d).slice(0, sd) === (n = digitsToString(r.d)).slice(0, sd)) {\r\n      n = n.slice(sd - 3, sd + 1);\r\n\r\n      // The 4th rounding digit may be in error by -1 so if the 4 rounding digits are 9999 or 4999\r\n      // , i.e. approaching a rounding boundary, continue the iteration.\r\n      if (n == '9999' || !rep && n == '4999') {\r\n\r\n        // On the first iteration only, check to see if rounding up gives the exact result as the\r\n        // nines may infinitely repeat.\r\n        if (!rep) {\r\n          finalise(t, e + 1, 0);\r\n\r\n          if (t.times(t).times(t).eq(x)) {\r\n            r = t;\r\n            break;\r\n          }\r\n        }\r\n\r\n        sd += 4;\r\n        rep = 1;\r\n      } else {\r\n\r\n        // If the rounding digits are null, 0{0,4} or 50{0,3}, check for an exact result.\r\n        // If not, then there are further digits and m will be truthy.\r\n        if (!+n || !+n.slice(1) && n.charAt(0) == '5') {\r\n\r\n          // Truncate to the first rounding digit.\r\n          finalise(r, e + 1, 1);\r\n          m = !r.times(r).times(r).eq(x);\r\n        }\r\n\r\n        break;\r\n      }\r\n    }\r\n  }\r\n\r\n  external = true;\r\n\r\n  return finalise(r, e, Ctor.rounding, m);\r\n};\r\n\r\n\r\n/*\r\n * Return the number of decimal places of the value of this Decimal.\r\n *\r\n */\r\nP.decimalPlaces = P.dp = function () {\r\n  var w,\r\n    d = this.d,\r\n    n = NaN;\r\n\r\n  if (d) {\r\n    w = d.length - 1;\r\n    n = (w - mathfloor(this.e / LOG_BASE)) * LOG_BASE;\r\n\r\n    // Subtract the number of trailing zeros of the last word.\r\n    w = d[w];\r\n    if (w) for (; w % 10 == 0; w /= 10) n--;\r\n    if (n < 0) n = 0;\r\n  }\r\n\r\n  return n;\r\n};\r\n\r\n\r\n/*\r\n *  n / 0 = I\r\n *  n / N = N\r\n *  n / I = 0\r\n *  0 / n = 0\r\n *  0 / 0 = N\r\n *  0 / N = N\r\n *  0 / I = 0\r\n *  N / n = N\r\n *  N / 0 = N\r\n *  N / N = N\r\n *  N / I = N\r\n *  I / n = I\r\n *  I / 0 = I\r\n *  I / N = N\r\n *  I / I = N\r\n *\r\n * Return a new Decimal whose value is the value of this Decimal divided by `y`, rounded to\r\n * `precision` significant digits using rounding mode `rounding`.\r\n *\r\n */\r\nP.dividedBy = P.div = function (y) {\r\n  return divide(this, new this.constructor(y));\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the integer part of dividing the value of this Decimal\r\n * by the value of `y`, rounded to `precision` significant digits using rounding mode `rounding`.\r\n *\r\n */\r\nP.dividedToIntegerBy = P.divToInt = function (y) {\r\n  var x = this,\r\n    Ctor = x.constructor;\r\n  return finalise(divide(x, new Ctor(y), 0, 1, 1), Ctor.precision, Ctor.rounding);\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is equal to the value of `y`, otherwise return false.\r\n *\r\n */\r\nP.equals = P.eq = function (y) {\r\n  return this.cmp(y) === 0;\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal rounded to a whole number in the\r\n * direction of negative Infinity.\r\n *\r\n */\r\nP.floor = function () {\r\n  return finalise(new this.constructor(this), this.e + 1, 3);\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is greater than the value of `y`, otherwise return\r\n * false.\r\n *\r\n */\r\nP.greaterThan = P.gt = function (y) {\r\n  return this.cmp(y) > 0;\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is greater than or equal to the value of `y`,\r\n * otherwise return false.\r\n *\r\n */\r\nP.greaterThanOrEqualTo = P.gte = function (y) {\r\n  var k = this.cmp(y);\r\n  return k == 1 || k === 0;\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the hyperbolic cosine of the value in radians of this\r\n * Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [1, Infinity]\r\n *\r\n * cosh(x) = 1 + x^2/2! + x^4/4! + x^6/6! + ...\r\n *\r\n * cosh(0)         = 1\r\n * cosh(-0)        = 1\r\n * cosh(Infinity)  = Infinity\r\n * cosh(-Infinity) = Infinity\r\n * cosh(NaN)       = NaN\r\n *\r\n *  x        time taken (ms)   result\r\n * 1000      9                 9.8503555700852349694e+433\r\n * 10000     25                4.4034091128314607936e+4342\r\n * 100000    171               1.4033316802130615897e+43429\r\n * 1000000   3817              1.5166076984010437725e+434294\r\n * 10000000  abandoned after 2 minute wait\r\n *\r\n * TODO? Compare performance of cosh(x) = 0.5 * (exp(x) + exp(-x))\r\n *\r\n */\r\nP.hyperbolicCosine = P.cosh = function () {\r\n  var k, n, pr, rm, len,\r\n    x = this,\r\n    Ctor = x.constructor,\r\n    one = new Ctor(1);\r\n\r\n  if (!x.isFinite()) return new Ctor(x.s ? 1 / 0 : NaN);\r\n  if (x.isZero()) return one;\r\n\r\n  pr = Ctor.precision;\r\n  rm = Ctor.rounding;\r\n  Ctor.precision = pr + Math.max(x.e, x.sd()) + 4;\r\n  Ctor.rounding = 1;\r\n  len = x.d.length;\r\n\r\n  // Argument reduction: cos(4x) = 1 - 8cos^2(x) + 8cos^4(x) + 1\r\n  // i.e. cos(x) = 1 - cos^2(x/4)(8 - 8cos^2(x/4))\r\n\r\n  // Estimate the optimum number of times to use the argument reduction.\r\n  // TODO? Estimation reused from cosine() and may not be optimal here.\r\n  if (len < 32) {\r\n    k = Math.ceil(len / 3);\r\n    n = (1 / tinyPow(4, k)).toString();\r\n  } else {\r\n    k = 16;\r\n    n = '2.3283064365386962890625e-10';\r\n  }\r\n\r\n  x = taylorSeries(Ctor, 1, x.times(n), new Ctor(1), true);\r\n\r\n  // Reverse argument reduction\r\n  var cosh2_x,\r\n    i = k,\r\n    d8 = new Ctor(8);\r\n  for (; i--;) {\r\n    cosh2_x = x.times(x);\r\n    x = one.minus(cosh2_x.times(d8.minus(cosh2_x.times(d8))));\r\n  }\r\n\r\n  return finalise(x, Ctor.precision = pr, Ctor.rounding = rm, true);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the hyperbolic sine of the value in radians of this\r\n * Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-Infinity, Infinity]\r\n *\r\n * sinh(x) = x + x^3/3! + x^5/5! + x^7/7! + ...\r\n *\r\n * sinh(0)         = 0\r\n * sinh(-0)        = -0\r\n * sinh(Infinity)  = Infinity\r\n * sinh(-Infinity) = -Infinity\r\n * sinh(NaN)       = NaN\r\n *\r\n * x        time taken (ms)\r\n * 10       2 ms\r\n * 100      5 ms\r\n * 1000     14 ms\r\n * 10000    82 ms\r\n * 100000   886 ms            1.4033316802130615897e+43429\r\n * 200000   2613 ms\r\n * 300000   5407 ms\r\n * 400000   8824 ms\r\n * 500000   13026 ms          8.7080643612718084129e+217146\r\n * 1000000  48543 ms\r\n *\r\n * TODO? Compare performance of sinh(x) = 0.5 * (exp(x) - exp(-x))\r\n *\r\n */\r\nP.hyperbolicSine = P.sinh = function () {\r\n  var k, pr, rm, len,\r\n    x = this,\r\n    Ctor = x.constructor;\r\n\r\n  if (!x.isFinite() || x.isZero()) return new Ctor(x);\r\n\r\n  pr = Ctor.precision;\r\n  rm = Ctor.rounding;\r\n  Ctor.precision = pr + Math.max(x.e, x.sd()) + 4;\r\n  Ctor.rounding = 1;\r\n  len = x.d.length;\r\n\r\n  if (len < 3) {\r\n    x = taylorSeries(Ctor, 2, x, x, true);\r\n  } else {\r\n\r\n    // Alternative argument reduction: sinh(3x) = sinh(x)(3 + 4sinh^2(x))\r\n    // i.e. sinh(x) = sinh(x/3)(3 + 4sinh^2(x/3))\r\n    // 3 multiplications and 1 addition\r\n\r\n    // Argument reduction: sinh(5x) = sinh(x)(5 + sinh^2(x)(20 + 16sinh^2(x)))\r\n    // i.e. sinh(x) = sinh(x/5)(5 + sinh^2(x/5)(20 + 16sinh^2(x/5)))\r\n    // 4 multiplications and 2 additions\r\n\r\n    // Estimate the optimum number of times to use the argument reduction.\r\n    k = 1.4 * Math.sqrt(len);\r\n    k = k > 16 ? 16 : k | 0;\r\n\r\n    x = x.times(1 / tinyPow(5, k));\r\n    x = taylorSeries(Ctor, 2, x, x, true);\r\n\r\n    // Reverse argument reduction\r\n    var sinh2_x,\r\n      d5 = new Ctor(5),\r\n      d16 = new Ctor(16),\r\n      d20 = new Ctor(20);\r\n    for (; k--;) {\r\n      sinh2_x = x.times(x);\r\n      x = x.times(d5.plus(sinh2_x.times(d16.times(sinh2_x).plus(d20))));\r\n    }\r\n  }\r\n\r\n  Ctor.precision = pr;\r\n  Ctor.rounding = rm;\r\n\r\n  return finalise(x, pr, rm, true);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the hyperbolic tangent of the value in radians of this\r\n * Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-1, 1]\r\n *\r\n * tanh(x) = sinh(x) / cosh(x)\r\n *\r\n * tanh(0)         = 0\r\n * tanh(-0)        = -0\r\n * tanh(Infinity)  = 1\r\n * tanh(-Infinity) = -1\r\n * tanh(NaN)       = NaN\r\n *\r\n */\r\nP.hyperbolicTangent = P.tanh = function () {\r\n  var pr, rm,\r\n    x = this,\r\n    Ctor = x.constructor;\r\n\r\n  if (!x.isFinite()) return new Ctor(x.s);\r\n  if (x.isZero()) return new Ctor(x);\r\n\r\n  pr = Ctor.precision;\r\n  rm = Ctor.rounding;\r\n  Ctor.precision = pr + 7;\r\n  Ctor.rounding = 1;\r\n\r\n  return divide(x.sinh(), x.cosh(), Ctor.precision = pr, Ctor.rounding = rm);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the arccosine (inverse cosine) in radians of the value of\r\n * this Decimal.\r\n *\r\n * Domain: [-1, 1]\r\n * Range: [0, pi]\r\n *\r\n * acos(x) = pi/2 - asin(x)\r\n *\r\n * acos(0)       = pi/2\r\n * acos(-0)      = pi/2\r\n * acos(1)       = 0\r\n * acos(-1)      = pi\r\n * acos(1/2)     = pi/3\r\n * acos(-1/2)    = 2*pi/3\r\n * acos(|x| > 1) = NaN\r\n * acos(NaN)     = NaN\r\n *\r\n */\r\nP.inverseCosine = P.acos = function () {\r\n  var x = this,\r\n    Ctor = x.constructor,\r\n    k = x.abs().cmp(1),\r\n    pr = Ctor.precision,\r\n    rm = Ctor.rounding;\r\n\r\n  if (k !== -1) {\r\n    return k === 0\r\n      // |x| is 1\r\n      ? x.isNeg() ? getPi(Ctor, pr, rm) : new Ctor(0)\r\n      // |x| > 1 or x is NaN\r\n      : new Ctor(NaN);\r\n  }\r\n\r\n  if (x.isZero()) return getPi(Ctor, pr + 4, rm).times(0.5);\r\n\r\n  // TODO? Special case acos(0.5) = pi/3 and acos(-0.5) = 2*pi/3\r\n\r\n  Ctor.precision = pr + 6;\r\n  Ctor.rounding = 1;\r\n\r\n  // See https://github.com/MikeMcl/decimal.js/pull/217\r\n  x = new Ctor(1).minus(x).div(x.plus(1)).sqrt().atan();\r\n\r\n  Ctor.precision = pr;\r\n  Ctor.rounding = rm;\r\n\r\n  return x.times(2);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the inverse of the hyperbolic cosine in radians of the\r\n * value of this Decimal.\r\n *\r\n * Domain: [1, Infinity]\r\n * Range: [0, Infinity]\r\n *\r\n * acosh(x) = ln(x + sqrt(x^2 - 1))\r\n *\r\n * acosh(x < 1)     = NaN\r\n * acosh(NaN)       = NaN\r\n * acosh(Infinity)  = Infinity\r\n * acosh(-Infinity) = NaN\r\n * acosh(0)         = NaN\r\n * acosh(-0)        = NaN\r\n * acosh(1)         = 0\r\n * acosh(-1)        = NaN\r\n *\r\n */\r\nP.inverseHyperbolicCosine = P.acosh = function () {\r\n  var pr, rm,\r\n    x = this,\r\n    Ctor = x.constructor;\r\n\r\n  if (x.lte(1)) return new Ctor(x.eq(1) ? 0 : NaN);\r\n  if (!x.isFinite()) return new Ctor(x);\r\n\r\n  pr = Ctor.precision;\r\n  rm = Ctor.rounding;\r\n  Ctor.precision = pr + Math.max(Math.abs(x.e), x.sd()) + 4;\r\n  Ctor.rounding = 1;\r\n  external = false;\r\n\r\n  x = x.times(x).minus(1).sqrt().plus(x);\r\n\r\n  external = true;\r\n  Ctor.precision = pr;\r\n  Ctor.rounding = rm;\r\n\r\n  return x.ln();\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the inverse of the hyperbolic sine in radians of the value\r\n * of this Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-Infinity, Infinity]\r\n *\r\n * asinh(x) = ln(x + sqrt(x^2 + 1))\r\n *\r\n * asinh(NaN)       = NaN\r\n * asinh(Infinity)  = Infinity\r\n * asinh(-Infinity) = -Infinity\r\n * asinh(0)         = 0\r\n * asinh(-0)        = -0\r\n *\r\n */\r\nP.inverseHyperbolicSine = P.asinh = function () {\r\n  var pr, rm,\r\n    x = this,\r\n    Ctor = x.constructor;\r\n\r\n  if (!x.isFinite() || x.isZero()) return new Ctor(x);\r\n\r\n  pr = Ctor.precision;\r\n  rm = Ctor.rounding;\r\n  Ctor.precision = pr + 2 * Math.max(Math.abs(x.e), x.sd()) + 6;\r\n  Ctor.rounding = 1;\r\n  external = false;\r\n\r\n  x = x.times(x).plus(1).sqrt().plus(x);\r\n\r\n  external = true;\r\n  Ctor.precision = pr;\r\n  Ctor.rounding = rm;\r\n\r\n  return x.ln();\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the inverse of the hyperbolic tangent in radians of the\r\n * value of this Decimal.\r\n *\r\n * Domain: [-1, 1]\r\n * Range: [-Infinity, Infinity]\r\n *\r\n * atanh(x) = 0.5 * ln((1 + x) / (1 - x))\r\n *\r\n * atanh(|x| > 1)   = NaN\r\n * atanh(NaN)       = NaN\r\n * atanh(Infinity)  = NaN\r\n * atanh(-Infinity) = NaN\r\n * atanh(0)         = 0\r\n * atanh(-0)        = -0\r\n * atanh(1)         = Infinity\r\n * atanh(-1)        = -Infinity\r\n *\r\n */\r\nP.inverseHyperbolicTangent = P.atanh = function () {\r\n  var pr, rm, wpr, xsd,\r\n    x = this,\r\n    Ctor = x.constructor;\r\n\r\n  if (!x.isFinite()) return new Ctor(NaN);\r\n  if (x.e >= 0) return new Ctor(x.abs().eq(1) ? x.s / 0 : x.isZero() ? x : NaN);\r\n\r\n  pr = Ctor.precision;\r\n  rm = Ctor.rounding;\r\n  xsd = x.sd();\r\n\r\n  if (Math.max(xsd, pr) < 2 * -x.e - 1) return finalise(new Ctor(x), pr, rm, true);\r\n\r\n  Ctor.precision = wpr = xsd - x.e;\r\n\r\n  x = divide(x.plus(1), new Ctor(1).minus(x), wpr + pr, 1);\r\n\r\n  Ctor.precision = pr + 4;\r\n  Ctor.rounding = 1;\r\n\r\n  x = x.ln();\r\n\r\n  Ctor.precision = pr;\r\n  Ctor.rounding = rm;\r\n\r\n  return x.times(0.5);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the arcsine (inverse sine) in radians of the value of this\r\n * Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-pi/2, pi/2]\r\n *\r\n * asin(x) = 2*atan(x/(1 + sqrt(1 - x^2)))\r\n *\r\n * asin(0)       = 0\r\n * asin(-0)      = -0\r\n * asin(1/2)     = pi/6\r\n * asin(-1/2)    = -pi/6\r\n * asin(1)       = pi/2\r\n * asin(-1)      = -pi/2\r\n * asin(|x| > 1) = NaN\r\n * asin(NaN)     = NaN\r\n *\r\n * TODO? Compare performance of Taylor series.\r\n *\r\n */\r\nP.inverseSine = P.asin = function () {\r\n  var halfPi, k,\r\n    pr, rm,\r\n    x = this,\r\n    Ctor = x.constructor;\r\n\r\n  if (x.isZero()) return new Ctor(x);\r\n\r\n  k = x.abs().cmp(1);\r\n  pr = Ctor.precision;\r\n  rm = Ctor.rounding;\r\n\r\n  if (k !== -1) {\r\n\r\n    // |x| is 1\r\n    if (k === 0) {\r\n      halfPi = getPi(Ctor, pr + 4, rm).times(0.5);\r\n      halfPi.s = x.s;\r\n      return halfPi;\r\n    }\r\n\r\n    // |x| > 1 or x is NaN\r\n    return new Ctor(NaN);\r\n  }\r\n\r\n  // TODO? Special case asin(1/2) = pi/6 and asin(-1/2) = -pi/6\r\n\r\n  Ctor.precision = pr + 6;\r\n  Ctor.rounding = 1;\r\n\r\n  x = x.div(new Ctor(1).minus(x.times(x)).sqrt().plus(1)).atan();\r\n\r\n  Ctor.precision = pr;\r\n  Ctor.rounding = rm;\r\n\r\n  return x.times(2);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the arctangent (inverse tangent) in radians of the value\r\n * of this Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-pi/2, pi/2]\r\n *\r\n * atan(x) = x - x^3/3 + x^5/5 - x^7/7 + ...\r\n *\r\n * atan(0)         = 0\r\n * atan(-0)        = -0\r\n * atan(1)         = pi/4\r\n * atan(-1)        = -pi/4\r\n * atan(Infinity)  = pi/2\r\n * atan(-Infinity) = -pi/2\r\n * atan(NaN)       = NaN\r\n *\r\n */\r\nP.inverseTangent = P.atan = function () {\r\n  var i, j, k, n, px, t, r, wpr, x2,\r\n    x = this,\r\n    Ctor = x.constructor,\r\n    pr = Ctor.precision,\r\n    rm = Ctor.rounding;\r\n\r\n  if (!x.isFinite()) {\r\n    if (!x.s) return new Ctor(NaN);\r\n    if (pr + 4 <= PI_PRECISION) {\r\n      r = getPi(Ctor, pr + 4, rm).times(0.5);\r\n      r.s = x.s;\r\n      return r;\r\n    }\r\n  } else if (x.isZero()) {\r\n    return new Ctor(x);\r\n  } else if (x.abs().eq(1) && pr + 4 <= PI_PRECISION) {\r\n    r = getPi(Ctor, pr + 4, rm).times(0.25);\r\n    r.s = x.s;\r\n    return r;\r\n  }\r\n\r\n  Ctor.precision = wpr = pr + 10;\r\n  Ctor.rounding = 1;\r\n\r\n  // TODO? if (x >= 1 && pr <= PI_PRECISION) atan(x) = halfPi * x.s - atan(1 / x);\r\n\r\n  // Argument reduction\r\n  // Ensure |x| < 0.42\r\n  // atan(x) = 2 * atan(x / (1 + sqrt(1 + x^2)))\r\n\r\n  k = Math.min(28, wpr / LOG_BASE + 2 | 0);\r\n\r\n  for (i = k; i; --i) x = x.div(x.times(x).plus(1).sqrt().plus(1));\r\n\r\n  external = false;\r\n\r\n  j = Math.ceil(wpr / LOG_BASE);\r\n  n = 1;\r\n  x2 = x.times(x);\r\n  r = new Ctor(x);\r\n  px = x;\r\n\r\n  // atan(x) = x - x^3/3 + x^5/5 - x^7/7 + ...\r\n  for (; i !== -1;) {\r\n    px = px.times(x2);\r\n    t = r.minus(px.div(n += 2));\r\n\r\n    px = px.times(x2);\r\n    r = t.plus(px.div(n += 2));\r\n\r\n    if (r.d[j] !== void 0) for (i = j; r.d[i] === t.d[i] && i--;);\r\n  }\r\n\r\n  if (k) r = r.times(2 << (k - 1));\r\n\r\n  external = true;\r\n\r\n  return finalise(r, Ctor.precision = pr, Ctor.rounding = rm, true);\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is a finite number, otherwise return false.\r\n *\r\n */\r\nP.isFinite = function () {\r\n  return !!this.d;\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is an integer, otherwise return false.\r\n *\r\n */\r\nP.isInteger = P.isInt = function () {\r\n  return !!this.d && mathfloor(this.e / LOG_BASE) > this.d.length - 2;\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is NaN, otherwise return false.\r\n *\r\n */\r\nP.isNaN = function () {\r\n  return !this.s;\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is negative, otherwise return false.\r\n *\r\n */\r\nP.isNegative = P.isNeg = function () {\r\n  return this.s < 0;\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is positive, otherwise return false.\r\n *\r\n */\r\nP.isPositive = P.isPos = function () {\r\n  return this.s > 0;\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is 0 or -0, otherwise return false.\r\n *\r\n */\r\nP.isZero = function () {\r\n  return !!this.d && this.d[0] === 0;\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is less than `y`, otherwise return false.\r\n *\r\n */\r\nP.lessThan = P.lt = function (y) {\r\n  return this.cmp(y) < 0;\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is less than or equal to `y`, otherwise return false.\r\n *\r\n */\r\nP.lessThanOrEqualTo = P.lte = function (y) {\r\n  return this.cmp(y) < 1;\r\n};\r\n\r\n\r\n/*\r\n * Return the logarithm of the value of this Decimal to the specified base, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * If no base is specified, return log[10](arg).\r\n *\r\n * log[base](arg) = ln(arg) / ln(base)\r\n *\r\n * The result will always be correctly rounded if the base of the log is 10, and 'almost always'\r\n * otherwise:\r\n *\r\n * Depending on the rounding mode, the result may be incorrectly rounded if the first fifteen\r\n * rounding digits are [49]99999999999999 or [50]00000000000000. In that case, the maximum error\r\n * between the result and the correctly rounded result will be one ulp (unit in the last place).\r\n *\r\n * log[-b](a)       = NaN\r\n * log[0](a)        = NaN\r\n * log[1](a)        = NaN\r\n * log[NaN](a)      = NaN\r\n * log[Infinity](a) = NaN\r\n * log[b](0)        = -Infinity\r\n * log[b](-0)       = -Infinity\r\n * log[b](-a)       = NaN\r\n * log[b](1)        = 0\r\n * log[b](Infinity) = Infinity\r\n * log[b](NaN)      = NaN\r\n *\r\n * [base] {number|string|bigint|Decimal} The base of the logarithm.\r\n *\r\n */\r\nP.logarithm = P.log = function (base) {\r\n  var isBase10, d, denominator, k, inf, num, sd, r,\r\n    arg = this,\r\n    Ctor = arg.constructor,\r\n    pr = Ctor.precision,\r\n    rm = Ctor.rounding,\r\n    guard = 5;\r\n\r\n  // Default base is 10.\r\n  if (base == null) {\r\n    base = new Ctor(10);\r\n    isBase10 = true;\r\n  } else {\r\n    base = new Ctor(base);\r\n    d = base.d;\r\n\r\n    // Return NaN if base is negative, or non-finite, or is 0 or 1.\r\n    if (base.s < 0 || !d || !d[0] || base.eq(1)) return new Ctor(NaN);\r\n\r\n    isBase10 = base.eq(10);\r\n  }\r\n\r\n  d = arg.d;\r\n\r\n  // Is arg negative, non-finite, 0 or 1?\r\n  if (arg.s < 0 || !d || !d[0] || arg.eq(1)) {\r\n    return new Ctor(d && !d[0] ? -1 / 0 : arg.s != 1 ? NaN : d ? 0 : 1 / 0);\r\n  }\r\n\r\n  // The result will have a non-terminating decimal expansion if base is 10 and arg is not an\r\n  // integer power of 10.\r\n  if (isBase10) {\r\n    if (d.length > 1) {\r\n      inf = true;\r\n    } else {\r\n      for (k = d[0]; k % 10 === 0;) k /= 10;\r\n      inf = k !== 1;\r\n    }\r\n  }\r\n\r\n  external = false;\r\n  sd = pr + guard;\r\n  num = naturalLogarithm(arg, sd);\r\n  denominator = isBase10 ? getLn10(Ctor, sd + 10) : naturalLogarithm(base, sd);\r\n\r\n  // The result will have 5 rounding digits.\r\n  r = divide(num, denominator, sd, 1);\r\n\r\n  // If at a rounding boundary, i.e. the result's rounding digits are [49]9999 or [50]0000,\r\n  // calculate 10 further digits.\r\n  //\r\n  // If the result is known to have an infinite decimal expansion, repeat this until it is clear\r\n  // that the result is above or below the boundary. Otherwise, if after calculating the 10\r\n  // further digits, the last 14 are nines, round up and assume the result is exact.\r\n  // Also assume the result is exact if the last 14 are zero.\r\n  //\r\n  // Example of a result that will be incorrectly rounded:\r\n  // log[1048576](4503599627370502) = 2.60000000000000009610279511444746...\r\n  // The above result correctly rounded using ROUND_CEIL to 1 decimal place should be 2.7, but it\r\n  // will be given as 2.6 as there are 15 zeros immediately after the requested decimal place, so\r\n  // the exact result would be assumed to be 2.6, which rounded using ROUND_CEIL to 1 decimal\r\n  // place is still 2.6.\r\n  if (checkRoundingDigits(r.d, k = pr, rm)) {\r\n\r\n    do {\r\n      sd += 10;\r\n      num = naturalLogarithm(arg, sd);\r\n      denominator = isBase10 ? getLn10(Ctor, sd + 10) : naturalLogarithm(base, sd);\r\n      r = divide(num, denominator, sd, 1);\r\n\r\n      if (!inf) {\r\n\r\n        // Check for 14 nines from the 2nd rounding digit, as the first may be 4.\r\n        if (+digitsToString(r.d).slice(k + 1, k + 15) + 1 == 1e14) {\r\n          r = finalise(r, pr + 1, 0);\r\n        }\r\n\r\n        break;\r\n      }\r\n    } while (checkRoundingDigits(r.d, k += 10, rm));\r\n  }\r\n\r\n  external = true;\r\n\r\n  return finalise(r, pr, rm);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the maximum of the arguments and the value of this Decimal.\r\n *\r\n * arguments {number|string|bigint|Decimal}\r\n *\r\nP.max = function () {\r\n  Array.prototype.push.call(arguments, this);\r\n  return maxOrMin(this.constructor, arguments, -1);\r\n};\r\n */\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the minimum of the arguments and the value of this Decimal.\r\n *\r\n * arguments {number|string|bigint|Decimal}\r\n *\r\nP.min = function () {\r\n  Array.prototype.push.call(arguments, this);\r\n  return maxOrMin(this.constructor, arguments, 1);\r\n};\r\n */\r\n\r\n\r\n/*\r\n *  n - 0 = n\r\n *  n - N = N\r\n *  n - I = -I\r\n *  0 - n = -n\r\n *  0 - 0 = 0\r\n *  0 - N = N\r\n *  0 - I = -I\r\n *  N - n = N\r\n *  N - 0 = N\r\n *  N - N = N\r\n *  N - I = N\r\n *  I - n = I\r\n *  I - 0 = I\r\n *  I - N = N\r\n *  I - I = N\r\n *\r\n * Return a new Decimal whose value is the value of this Decimal minus `y`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n */\r\nP.minus = P.sub = function (y) {\r\n  var d, e, i, j, k, len, pr, rm, xd, xe, xLTy, yd,\r\n    x = this,\r\n    Ctor = x.constructor;\r\n\r\n  y = new Ctor(y);\r\n\r\n  // If either is not finite...\r\n  if (!x.d || !y.d) {\r\n\r\n    // Return NaN if either is NaN.\r\n    if (!x.s || !y.s) y = new Ctor(NaN);\r\n\r\n    // Return y negated if x is finite and y is ±Infinity.\r\n    else if (x.d) y.s = -y.s;\r\n\r\n    // Return x if y is finite and x is ±Infinity.\r\n    // Return x if both are ±Infinity with different signs.\r\n    // Return NaN if both are ±Infinity with the same sign.\r\n    else y = new Ctor(y.d || x.s !== y.s ? x : NaN);\r\n\r\n    return y;\r\n  }\r\n\r\n  // If signs differ...\r\n  if (x.s != y.s) {\r\n    y.s = -y.s;\r\n    return x.plus(y);\r\n  }\r\n\r\n  xd = x.d;\r\n  yd = y.d;\r\n  pr = Ctor.precision;\r\n  rm = Ctor.rounding;\r\n\r\n  // If either is zero...\r\n  if (!xd[0] || !yd[0]) {\r\n\r\n    // Return y negated if x is zero and y is non-zero.\r\n    if (yd[0]) y.s = -y.s;\r\n\r\n    // Return x if y is zero and x is non-zero.\r\n    else if (xd[0]) y = new Ctor(x);\r\n\r\n    // Return zero if both are zero.\r\n    // From IEEE 754 (2008) 6.3: 0 - 0 = -0 - -0 = -0 when rounding to -Infinity.\r\n    else return new Ctor(rm === 3 ? -0 : 0);\r\n\r\n    return external ? finalise(y, pr, rm) : y;\r\n  }\r\n\r\n  // x and y are finite, non-zero numbers with the same sign.\r\n\r\n  // Calculate base 1e7 exponents.\r\n  e = mathfloor(y.e / LOG_BASE);\r\n  xe = mathfloor(x.e / LOG_BASE);\r\n\r\n  xd = xd.slice();\r\n  k = xe - e;\r\n\r\n  // If base 1e7 exponents differ...\r\n  if (k) {\r\n    xLTy = k < 0;\r\n\r\n    if (xLTy) {\r\n      d = xd;\r\n      k = -k;\r\n      len = yd.length;\r\n    } else {\r\n      d = yd;\r\n      e = xe;\r\n      len = xd.length;\r\n    }\r\n\r\n    // Numbers with massively different exponents would result in a very high number of\r\n    // zeros needing to be prepended, but this can be avoided while still ensuring correct\r\n    // rounding by limiting the number of zeros to `Math.ceil(pr / LOG_BASE) + 2`.\r\n    i = Math.max(Math.ceil(pr / LOG_BASE), len) + 2;\r\n\r\n    if (k > i) {\r\n      k = i;\r\n      d.length = 1;\r\n    }\r\n\r\n    // Prepend zeros to equalise exponents.\r\n    d.reverse();\r\n    for (i = k; i--;) d.push(0);\r\n    d.reverse();\r\n\r\n  // Base 1e7 exponents equal.\r\n  } else {\r\n\r\n    // Check digits to determine which is the bigger number.\r\n\r\n    i = xd.length;\r\n    len = yd.length;\r\n    xLTy = i < len;\r\n    if (xLTy) len = i;\r\n\r\n    for (i = 0; i < len; i++) {\r\n      if (xd[i] != yd[i]) {\r\n        xLTy = xd[i] < yd[i];\r\n        break;\r\n      }\r\n    }\r\n\r\n    k = 0;\r\n  }\r\n\r\n  if (xLTy) {\r\n    d = xd;\r\n    xd = yd;\r\n    yd = d;\r\n    y.s = -y.s;\r\n  }\r\n\r\n  len = xd.length;\r\n\r\n  // Append zeros to `xd` if shorter.\r\n  // Don't add zeros to `yd` if shorter as subtraction only needs to start at `yd` length.\r\n  for (i = yd.length - len; i > 0; --i) xd[len++] = 0;\r\n\r\n  // Subtract yd from xd.\r\n  for (i = yd.length; i > k;) {\r\n\r\n    if (xd[--i] < yd[i]) {\r\n      for (j = i; j && xd[--j] === 0;) xd[j] = BASE - 1;\r\n      --xd[j];\r\n      xd[i] += BASE;\r\n    }\r\n\r\n    xd[i] -= yd[i];\r\n  }\r\n\r\n  // Remove trailing zeros.\r\n  for (; xd[--len] === 0;) xd.pop();\r\n\r\n  // Remove leading zeros and adjust exponent accordingly.\r\n  for (; xd[0] === 0; xd.shift()) --e;\r\n\r\n  // Zero?\r\n  if (!xd[0]) return new Ctor(rm === 3 ? -0 : 0);\r\n\r\n  y.d = xd;\r\n  y.e = getBase10Exponent(xd, e);\r\n\r\n  return external ? finalise(y, pr, rm) : y;\r\n};\r\n\r\n\r\n/*\r\n *   n % 0 =  N\r\n *   n % N =  N\r\n *   n % I =  n\r\n *   0 % n =  0\r\n *  -0 % n = -0\r\n *   0 % 0 =  N\r\n *   0 % N =  N\r\n *   0 % I =  0\r\n *   N % n =  N\r\n *   N % 0 =  N\r\n *   N % N =  N\r\n *   N % I =  N\r\n *   I % n =  N\r\n *   I % 0 =  N\r\n *   I % N =  N\r\n *   I % I =  N\r\n *\r\n * Return a new Decimal whose value is the value of this Decimal modulo `y`, rounded to\r\n * `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * The result depends on the modulo mode.\r\n *\r\n */\r\nP.modulo = P.mod = function (y) {\r\n  var q,\r\n    x = this,\r\n    Ctor = x.constructor;\r\n\r\n  y = new Ctor(y);\r\n\r\n  // Return NaN if x is ±Infinity or NaN, or y is NaN or ±0.\r\n  if (!x.d || !y.s || y.d && !y.d[0]) return new Ctor(NaN);\r\n\r\n  // Return x if y is ±Infinity or x is ±0.\r\n  if (!y.d || x.d && !x.d[0]) {\r\n    return finalise(new Ctor(x), Ctor.precision, Ctor.rounding);\r\n  }\r\n\r\n  // Prevent rounding of intermediate calculations.\r\n  external = false;\r\n\r\n  if (Ctor.modulo == 9) {\r\n\r\n    // Euclidian division: q = sign(y) * floor(x / abs(y))\r\n    // result = x - q * y    where  0 <= result < abs(y)\r\n    q = divide(x, y.abs(), 0, 3, 1);\r\n    q.s *= y.s;\r\n  } else {\r\n    q = divide(x, y, 0, Ctor.modulo, 1);\r\n  }\r\n\r\n  q = q.times(y);\r\n\r\n  external = true;\r\n\r\n  return x.minus(q);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the natural exponential of the value of this Decimal,\r\n * i.e. the base e raised to the power the value of this Decimal, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n */\r\nP.naturalExponential = P.exp = function () {\r\n  return naturalExponential(this);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the natural logarithm of the value of this Decimal,\r\n * rounded to `precision` significant digits using rounding mode `rounding`.\r\n *\r\n */\r\nP.naturalLogarithm = P.ln = function () {\r\n  return naturalLogarithm(this);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal negated, i.e. as if multiplied by\r\n * -1.\r\n *\r\n */\r\nP.negated = P.neg = function () {\r\n  var x = new this.constructor(this);\r\n  x.s = -x.s;\r\n  return finalise(x);\r\n};\r\n\r\n\r\n/*\r\n *  n + 0 = n\r\n *  n + N = N\r\n *  n + I = I\r\n *  0 + n = n\r\n *  0 + 0 = 0\r\n *  0 + N = N\r\n *  0 + I = I\r\n *  N + n = N\r\n *  N + 0 = N\r\n *  N + N = N\r\n *  N + I = N\r\n *  I + n = I\r\n *  I + 0 = I\r\n *  I + N = N\r\n *  I + I = I\r\n *\r\n * Return a new Decimal whose value is the value of this Decimal plus `y`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n */\r\nP.plus = P.add = function (y) {\r\n  var carry, d, e, i, k, len, pr, rm, xd, yd,\r\n    x = this,\r\n    Ctor = x.constructor;\r\n\r\n  y = new Ctor(y);\r\n\r\n  // If either is not finite...\r\n  if (!x.d || !y.d) {\r\n\r\n    // Return NaN if either is NaN.\r\n    if (!x.s || !y.s) y = new Ctor(NaN);\r\n\r\n    // Return x if y is finite and x is ±Infinity.\r\n    // Return x if both are ±Infinity with the same sign.\r\n    // Return NaN if both are ±Infinity with different signs.\r\n    // Return y if x is finite and y is ±Infinity.\r\n    else if (!x.d) y = new Ctor(y.d || x.s === y.s ? x : NaN);\r\n\r\n    return y;\r\n  }\r\n\r\n   // If signs differ...\r\n  if (x.s != y.s) {\r\n    y.s = -y.s;\r\n    return x.minus(y);\r\n  }\r\n\r\n  xd = x.d;\r\n  yd = y.d;\r\n  pr = Ctor.precision;\r\n  rm = Ctor.rounding;\r\n\r\n  // If either is zero...\r\n  if (!xd[0] || !yd[0]) {\r\n\r\n    // Return x if y is zero.\r\n    // Return y if y is non-zero.\r\n    if (!yd[0]) y = new Ctor(x);\r\n\r\n    return external ? finalise(y, pr, rm) : y;\r\n  }\r\n\r\n  // x and y are finite, non-zero numbers with the same sign.\r\n\r\n  // Calculate base 1e7 exponents.\r\n  k = mathfloor(x.e / LOG_BASE);\r\n  e = mathfloor(y.e / LOG_BASE);\r\n\r\n  xd = xd.slice();\r\n  i = k - e;\r\n\r\n  // If base 1e7 exponents differ...\r\n  if (i) {\r\n\r\n    if (i < 0) {\r\n      d = xd;\r\n      i = -i;\r\n      len = yd.length;\r\n    } else {\r\n      d = yd;\r\n      e = k;\r\n      len = xd.length;\r\n    }\r\n\r\n    // Limit number of zeros prepended to max(ceil(pr / LOG_BASE), len) + 1.\r\n    k = Math.ceil(pr / LOG_BASE);\r\n    len = k > len ? k + 1 : len + 1;\r\n\r\n    if (i > len) {\r\n      i = len;\r\n      d.length = 1;\r\n    }\r\n\r\n    // Prepend zeros to equalise exponents. Note: Faster to use reverse then do unshifts.\r\n    d.reverse();\r\n    for (; i--;) d.push(0);\r\n    d.reverse();\r\n  }\r\n\r\n  len = xd.length;\r\n  i = yd.length;\r\n\r\n  // If yd is longer than xd, swap xd and yd so xd points to the longer array.\r\n  if (len - i < 0) {\r\n    i = len;\r\n    d = yd;\r\n    yd = xd;\r\n    xd = d;\r\n  }\r\n\r\n  // Only start adding at yd.length - 1 as the further digits of xd can be left as they are.\r\n  for (carry = 0; i;) {\r\n    carry = (xd[--i] = xd[i] + yd[i] + carry) / BASE | 0;\r\n    xd[i] %= BASE;\r\n  }\r\n\r\n  if (carry) {\r\n    xd.unshift(carry);\r\n    ++e;\r\n  }\r\n\r\n  // Remove trailing zeros.\r\n  // No need to check for zero, as +x + +y != 0 && -x + -y != 0\r\n  for (len = xd.length; xd[--len] == 0;) xd.pop();\r\n\r\n  y.d = xd;\r\n  y.e = getBase10Exponent(xd, e);\r\n\r\n  return external ? finalise(y, pr, rm) : y;\r\n};\r\n\r\n\r\n/*\r\n * Return the number of significant digits of the value of this Decimal.\r\n *\r\n * [z] {boolean|number} Whether to count integer-part trailing zeros: true, false, 1 or 0.\r\n *\r\n */\r\nP.precision = P.sd = function (z) {\r\n  var k,\r\n    x = this;\r\n\r\n  if (z !== void 0 && z !== !!z && z !== 1 && z !== 0) throw Error(invalidArgument + z);\r\n\r\n  if (x.d) {\r\n    k = getPrecision(x.d);\r\n    if (z && x.e + 1 > k) k = x.e + 1;\r\n  } else {\r\n    k = NaN;\r\n  }\r\n\r\n  return k;\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal rounded to a whole number using\r\n * rounding mode `rounding`.\r\n *\r\n */\r\nP.round = function () {\r\n  var x = this,\r\n    Ctor = x.constructor;\r\n\r\n  return finalise(new Ctor(x), x.e + 1, Ctor.rounding);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the sine of the value in radians of this Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-1, 1]\r\n *\r\n * sin(x) = x - x^3/3! + x^5/5! - ...\r\n *\r\n * sin(0)         = 0\r\n * sin(-0)        = -0\r\n * sin(Infinity)  = NaN\r\n * sin(-Infinity) = NaN\r\n * sin(NaN)       = NaN\r\n *\r\n */\r\nP.sine = P.sin = function () {\r\n  var pr, rm,\r\n    x = this,\r\n    Ctor = x.constructor;\r\n\r\n  if (!x.isFinite()) return new Ctor(NaN);\r\n  if (x.isZero()) return new Ctor(x);\r\n\r\n  pr = Ctor.precision;\r\n  rm = Ctor.rounding;\r\n  Ctor.precision = pr + Math.max(x.e, x.sd()) + LOG_BASE;\r\n  Ctor.rounding = 1;\r\n\r\n  x = sine(Ctor, toLessThanHalfPi(Ctor, x));\r\n\r\n  Ctor.precision = pr;\r\n  Ctor.rounding = rm;\r\n\r\n  return finalise(quadrant > 2 ? x.neg() : x, pr, rm, true);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the square root of this Decimal, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n *  sqrt(-n) =  N\r\n *  sqrt(N)  =  N\r\n *  sqrt(-I) =  N\r\n *  sqrt(I)  =  I\r\n *  sqrt(0)  =  0\r\n *  sqrt(-0) = -0\r\n *\r\n */\r\nP.squareRoot = P.sqrt = function () {\r\n  var m, n, sd, r, rep, t,\r\n    x = this,\r\n    d = x.d,\r\n    e = x.e,\r\n    s = x.s,\r\n    Ctor = x.constructor;\r\n\r\n  // Negative/NaN/Infinity/zero?\r\n  if (s !== 1 || !d || !d[0]) {\r\n    return new Ctor(!s || s < 0 && (!d || d[0]) ? NaN : d ? x : 1 / 0);\r\n  }\r\n\r\n  external = false;\r\n\r\n  // Initial estimate.\r\n  s = Math.sqrt(+x);\r\n\r\n  // Math.sqrt underflow/overflow?\r\n  // Pass x to Math.sqrt as integer, then adjust the exponent of the result.\r\n  if (s == 0 || s == 1 / 0) {\r\n    n = digitsToString(d);\r\n\r\n    if ((n.length + e) % 2 == 0) n += '0';\r\n    s = Math.sqrt(n);\r\n    e = mathfloor((e + 1) / 2) - (e < 0 || e % 2);\r\n\r\n    if (s == 1 / 0) {\r\n      n = '5e' + e;\r\n    } else {\r\n      n = s.toExponential();\r\n      n = n.slice(0, n.indexOf('e') + 1) + e;\r\n    }\r\n\r\n    r = new Ctor(n);\r\n  } else {\r\n    r = new Ctor(s.toString());\r\n  }\r\n\r\n  sd = (e = Ctor.precision) + 3;\r\n\r\n  // Newton-Raphson iteration.\r\n  for (;;) {\r\n    t = r;\r\n    r = t.plus(divide(x, t, sd + 2, 1)).times(0.5);\r\n\r\n    // TODO? Replace with for-loop and checkRoundingDigits.\r\n    if (digitsToString(t.d).slice(0, sd) === (n = digitsToString(r.d)).slice(0, sd)) {\r\n      n = n.slice(sd - 3, sd + 1);\r\n\r\n      // The 4th rounding digit may be in error by -1 so if the 4 rounding digits are 9999 or\r\n      // 4999, i.e. approaching a rounding boundary, continue the iteration.\r\n      if (n == '9999' || !rep && n == '4999') {\r\n\r\n        // On the first iteration only, check to see if rounding up gives the exact result as the\r\n        // nines may infinitely repeat.\r\n        if (!rep) {\r\n          finalise(t, e + 1, 0);\r\n\r\n          if (t.times(t).eq(x)) {\r\n            r = t;\r\n            break;\r\n          }\r\n        }\r\n\r\n        sd += 4;\r\n        rep = 1;\r\n      } else {\r\n\r\n        // If the rounding digits are null, 0{0,4} or 50{0,3}, check for an exact result.\r\n        // If not, then there are further digits and m will be truthy.\r\n        if (!+n || !+n.slice(1) && n.charAt(0) == '5') {\r\n\r\n          // Truncate to the first rounding digit.\r\n          finalise(r, e + 1, 1);\r\n          m = !r.times(r).eq(x);\r\n        }\r\n\r\n        break;\r\n      }\r\n    }\r\n  }\r\n\r\n  external = true;\r\n\r\n  return finalise(r, e, Ctor.rounding, m);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the tangent of the value in radians of this Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-Infinity, Infinity]\r\n *\r\n * tan(0)         = 0\r\n * tan(-0)        = -0\r\n * tan(Infinity)  = NaN\r\n * tan(-Infinity) = NaN\r\n * tan(NaN)       = NaN\r\n *\r\n */\r\nP.tangent = P.tan = function () {\r\n  var pr, rm,\r\n    x = this,\r\n    Ctor = x.constructor;\r\n\r\n  if (!x.isFinite()) return new Ctor(NaN);\r\n  if (x.isZero()) return new Ctor(x);\r\n\r\n  pr = Ctor.precision;\r\n  rm = Ctor.rounding;\r\n  Ctor.precision = pr + 10;\r\n  Ctor.rounding = 1;\r\n\r\n  x = x.sin();\r\n  x.s = 1;\r\n  x = divide(x, new Ctor(1).minus(x.times(x)).sqrt(), pr + 10, 0);\r\n\r\n  Ctor.precision = pr;\r\n  Ctor.rounding = rm;\r\n\r\n  return finalise(quadrant == 2 || quadrant == 4 ? x.neg() : x, pr, rm, true);\r\n};\r\n\r\n\r\n/*\r\n *  n * 0 = 0\r\n *  n * N = N\r\n *  n * I = I\r\n *  0 * n = 0\r\n *  0 * 0 = 0\r\n *  0 * N = N\r\n *  0 * I = N\r\n *  N * n = N\r\n *  N * 0 = N\r\n *  N * N = N\r\n *  N * I = N\r\n *  I * n = I\r\n *  I * 0 = N\r\n *  I * N = N\r\n *  I * I = I\r\n *\r\n * Return a new Decimal whose value is this Decimal times `y`, rounded to `precision` significant\r\n * digits using rounding mode `rounding`.\r\n *\r\n */\r\nP.times = P.mul = function (y) {\r\n  var carry, e, i, k, r, rL, t, xdL, ydL,\r\n    x = this,\r\n    Ctor = x.constructor,\r\n    xd = x.d,\r\n    yd = (y = new Ctor(y)).d;\r\n\r\n  y.s *= x.s;\r\n\r\n   // If either is NaN, ±Infinity or ±0...\r\n  if (!xd || !xd[0] || !yd || !yd[0]) {\r\n\r\n    return new Ctor(!y.s || xd && !xd[0] && !yd || yd && !yd[0] && !xd\r\n\r\n      // Return NaN if either is NaN.\r\n      // Return NaN if x is ±0 and y is ±Infinity, or y is ±0 and x is ±Infinity.\r\n      ? NaN\r\n\r\n      // Return ±Infinity if either is ±Infinity.\r\n      // Return ±0 if either is ±0.\r\n      : !xd || !yd ? y.s / 0 : y.s * 0);\r\n  }\r\n\r\n  e = mathfloor(x.e / LOG_BASE) + mathfloor(y.e / LOG_BASE);\r\n  xdL = xd.length;\r\n  ydL = yd.length;\r\n\r\n  // Ensure xd points to the longer array.\r\n  if (xdL < ydL) {\r\n    r = xd;\r\n    xd = yd;\r\n    yd = r;\r\n    rL = xdL;\r\n    xdL = ydL;\r\n    ydL = rL;\r\n  }\r\n\r\n  // Initialise the result array with zeros.\r\n  r = [];\r\n  rL = xdL + ydL;\r\n  for (i = rL; i--;) r.push(0);\r\n\r\n  // Multiply!\r\n  for (i = ydL; --i >= 0;) {\r\n    carry = 0;\r\n    for (k = xdL + i; k > i;) {\r\n      t = r[k] + yd[i] * xd[k - i - 1] + carry;\r\n      r[k--] = t % BASE | 0;\r\n      carry = t / BASE | 0;\r\n    }\r\n\r\n    r[k] = (r[k] + carry) % BASE | 0;\r\n  }\r\n\r\n  // Remove trailing zeros.\r\n  for (; !r[--rL];) r.pop();\r\n\r\n  if (carry) ++e;\r\n  else r.shift();\r\n\r\n  y.d = r;\r\n  y.e = getBase10Exponent(r, e);\r\n\r\n  return external ? finalise(y, Ctor.precision, Ctor.rounding) : y;\r\n};\r\n\r\n\r\n/*\r\n * Return a string representing the value of this Decimal in base 2, round to `sd` significant\r\n * digits using rounding mode `rm`.\r\n *\r\n * If the optional `sd` argument is present then return binary exponential notation.\r\n *\r\n * [sd] {number} Significant digits. Integer, 1 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n */\r\nP.toBinary = function (sd, rm) {\r\n  return toStringBinary(this, 2, sd, rm);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal rounded to a maximum of `dp`\r\n * decimal places using rounding mode `rm` or `rounding` if `rm` is omitted.\r\n *\r\n * If `dp` is omitted, return a new Decimal whose value is the value of this Decimal.\r\n *\r\n * [dp] {number} Decimal places. Integer, 0 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n */\r\nP.toDecimalPlaces = P.toDP = function (dp, rm) {\r\n  var x = this,\r\n    Ctor = x.constructor;\r\n\r\n  x = new Ctor(x);\r\n  if (dp === void 0) return x;\r\n\r\n  checkInt32(dp, 0, MAX_DIGITS);\r\n\r\n  if (rm === void 0) rm = Ctor.rounding;\r\n  else checkInt32(rm, 0, 8);\r\n\r\n  return finalise(x, dp + x.e + 1, rm);\r\n};\r\n\r\n\r\n/*\r\n * Return a string representing the value of this Decimal in exponential notation rounded to\r\n * `dp` fixed decimal places using rounding mode `rounding`.\r\n *\r\n * [dp] {number} Decimal places. Integer, 0 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n */\r\nP.toExponential = function (dp, rm) {\r\n  var str,\r\n    x = this,\r\n    Ctor = x.constructor;\r\n\r\n  if (dp === void 0) {\r\n    str = finiteToString(x, true);\r\n  } else {\r\n    checkInt32(dp, 0, MAX_DIGITS);\r\n\r\n    if (rm === void 0) rm = Ctor.rounding;\r\n    else checkInt32(rm, 0, 8);\r\n\r\n    x = finalise(new Ctor(x), dp + 1, rm);\r\n    str = finiteToString(x, true, dp + 1);\r\n  }\r\n\r\n  return x.isNeg() && !x.isZero() ? '-' + str : str;\r\n};\r\n\r\n\r\n/*\r\n * Return a string representing the value of this Decimal in normal (fixed-point) notation to\r\n * `dp` fixed decimal places and rounded using rounding mode `rm` or `rounding` if `rm` is\r\n * omitted.\r\n *\r\n * As with JavaScript numbers, (-0).toFixed(0) is '0', but e.g. (-0.00001).toFixed(0) is '-0'.\r\n *\r\n * [dp] {number} Decimal places. Integer, 0 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * (-0).toFixed(0) is '0', but (-0.1).toFixed(0) is '-0'.\r\n * (-0).toFixed(1) is '0.0', but (-0.01).toFixed(1) is '-0.0'.\r\n * (-0).toFixed(3) is '0.000'.\r\n * (-0.5).toFixed(0) is '-0'.\r\n *\r\n */\r\nP.toFixed = function (dp, rm) {\r\n  var str, y,\r\n    x = this,\r\n    Ctor = x.constructor;\r\n\r\n  if (dp === void 0) {\r\n    str = finiteToString(x);\r\n  } else {\r\n    checkInt32(dp, 0, MAX_DIGITS);\r\n\r\n    if (rm === void 0) rm = Ctor.rounding;\r\n    else checkInt32(rm, 0, 8);\r\n\r\n    y = finalise(new Ctor(x), dp + x.e + 1, rm);\r\n    str = finiteToString(y, false, dp + y.e + 1);\r\n  }\r\n\r\n  // To determine whether to add the minus sign look at the value before it was rounded,\r\n  // i.e. look at `x` rather than `y`.\r\n  return x.isNeg() && !x.isZero() ? '-' + str : str;\r\n};\r\n\r\n\r\n/*\r\n * Return an array representing the value of this Decimal as a simple fraction with an integer\r\n * numerator and an integer denominator.\r\n *\r\n * The denominator will be a positive non-zero value less than or equal to the specified maximum\r\n * denominator. If a maximum denominator is not specified, the denominator will be the lowest\r\n * value necessary to represent the number exactly.\r\n *\r\n * [maxD] {number|string|bigint|Decimal} Maximum denominator. Integer >= 1 and < Infinity.\r\n *\r\n */\r\nP.toFraction = function (maxD) {\r\n  var d, d0, d1, d2, e, k, n, n0, n1, pr, q, r,\r\n    x = this,\r\n    xd = x.d,\r\n    Ctor = x.constructor;\r\n\r\n  if (!xd) return new Ctor(x);\r\n\r\n  n1 = d0 = new Ctor(1);\r\n  d1 = n0 = new Ctor(0);\r\n\r\n  d = new Ctor(d1);\r\n  e = d.e = getPrecision(xd) - x.e - 1;\r\n  k = e % LOG_BASE;\r\n  d.d[0] = mathpow(10, k < 0 ? LOG_BASE + k : k);\r\n\r\n  if (maxD == null) {\r\n\r\n    // d is 10**e, the minimum max-denominator needed.\r\n    maxD = e > 0 ? d : n1;\r\n  } else {\r\n    n = new Ctor(maxD);\r\n    if (!n.isInt() || n.lt(n1)) throw Error(invalidArgument + n);\r\n    maxD = n.gt(d) ? (e > 0 ? d : n1) : n;\r\n  }\r\n\r\n  external = false;\r\n  n = new Ctor(digitsToString(xd));\r\n  pr = Ctor.precision;\r\n  Ctor.precision = e = xd.length * LOG_BASE * 2;\r\n\r\n  for (;;)  {\r\n    q = divide(n, d, 0, 1, 1);\r\n    d2 = d0.plus(q.times(d1));\r\n    if (d2.cmp(maxD) == 1) break;\r\n    d0 = d1;\r\n    d1 = d2;\r\n    d2 = n1;\r\n    n1 = n0.plus(q.times(d2));\r\n    n0 = d2;\r\n    d2 = d;\r\n    d = n.minus(q.times(d2));\r\n    n = d2;\r\n  }\r\n\r\n  d2 = divide(maxD.minus(d0), d1, 0, 1, 1);\r\n  n0 = n0.plus(d2.times(n1));\r\n  d0 = d0.plus(d2.times(d1));\r\n  n0.s = n1.s = x.s;\r\n\r\n  // Determine which fraction is closer to x, n0/d0 or n1/d1?\r\n  r = divide(n1, d1, e, 1).minus(x).abs().cmp(divide(n0, d0, e, 1).minus(x).abs()) < 1\r\n      ? [n1, d1] : [n0, d0];\r\n\r\n  Ctor.precision = pr;\r\n  external = true;\r\n\r\n  return r;\r\n};\r\n\r\n\r\n/*\r\n * Return a string representing the value of this Decimal in base 16, round to `sd` significant\r\n * digits using rounding mode `rm`.\r\n *\r\n * If the optional `sd` argument is present then return binary exponential notation.\r\n *\r\n * [sd] {number} Significant digits. Integer, 1 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n */\r\nP.toHexadecimal = P.toHex = function (sd, rm) {\r\n  return toStringBinary(this, 16, sd, rm);\r\n};\r\n\r\n\r\n/*\r\n * Returns a new Decimal whose value is the nearest multiple of `y` in the direction of rounding\r\n * mode `rm`, or `Decimal.rounding` if `rm` is omitted, to the value of this Decimal.\r\n *\r\n * The return value will always have the same sign as this Decimal, unless either this Decimal\r\n * or `y` is NaN, in which case the return value will be also be NaN.\r\n *\r\n * The return value is not affected by the value of `precision`.\r\n *\r\n * y {number|string|bigint|Decimal} The magnitude to round to a multiple of.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * 'toNearest() rounding mode not an integer: {rm}'\r\n * 'toNearest() rounding mode out of range: {rm}'\r\n *\r\n */\r\nP.toNearest = function (y, rm) {\r\n  var x = this,\r\n    Ctor = x.constructor;\r\n\r\n  x = new Ctor(x);\r\n\r\n  if (y == null) {\r\n\r\n    // If x is not finite, return x.\r\n    if (!x.d) return x;\r\n\r\n    y = new Ctor(1);\r\n    rm = Ctor.rounding;\r\n  } else {\r\n    y = new Ctor(y);\r\n    if (rm === void 0) {\r\n      rm = Ctor.rounding;\r\n    } else {\r\n      checkInt32(rm, 0, 8);\r\n    }\r\n\r\n    // If x is not finite, return x if y is not NaN, else NaN.\r\n    if (!x.d) return y.s ? x : y;\r\n\r\n    // If y is not finite, return Infinity with the sign of x if y is Infinity, else NaN.\r\n    if (!y.d) {\r\n      if (y.s) y.s = x.s;\r\n      return y;\r\n    }\r\n  }\r\n\r\n  // If y is not zero, calculate the nearest multiple of y to x.\r\n  if (y.d[0]) {\r\n    external = false;\r\n    x = divide(x, y, 0, rm, 1).times(y);\r\n    external = true;\r\n    finalise(x);\r\n\r\n  // If y is zero, return zero with the sign of x.\r\n  } else {\r\n    y.s = x.s;\r\n    x = y;\r\n  }\r\n\r\n  return x;\r\n};\r\n\r\n\r\n/*\r\n * Return the value of this Decimal converted to a number primitive.\r\n * Zero keeps its sign.\r\n *\r\n */\r\nP.toNumber = function () {\r\n  return +this;\r\n};\r\n\r\n\r\n/*\r\n * Return a string representing the value of this Decimal in base 8, round to `sd` significant\r\n * digits using rounding mode `rm`.\r\n *\r\n * If the optional `sd` argument is present then return binary exponential notation.\r\n *\r\n * [sd] {number} Significant digits. Integer, 1 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n */\r\nP.toOctal = function (sd, rm) {\r\n  return toStringBinary(this, 8, sd, rm);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal raised to the power `y`, rounded\r\n * to `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * ECMAScript compliant.\r\n *\r\n *   pow(x, NaN)                           = NaN\r\n *   pow(x, ±0)                            = 1\r\n\r\n *   pow(NaN, non-zero)                    = NaN\r\n *   pow(abs(x) > 1, +Infinity)            = +Infinity\r\n *   pow(abs(x) > 1, -Infinity)            = +0\r\n *   pow(abs(x) == 1, ±Infinity)           = NaN\r\n *   pow(abs(x) < 1, +Infinity)            = +0\r\n *   pow(abs(x) < 1, -Infinity)            = +Infinity\r\n *   pow(+Infinity, y > 0)                 = +Infinity\r\n *   pow(+Infinity, y < 0)                 = +0\r\n *   pow(-Infinity, odd integer > 0)       = -Infinity\r\n *   pow(-Infinity, even integer > 0)      = +Infinity\r\n *   pow(-Infinity, odd integer < 0)       = -0\r\n *   pow(-Infinity, even integer < 0)      = +0\r\n *   pow(+0, y > 0)                        = +0\r\n *   pow(+0, y < 0)                        = +Infinity\r\n *   pow(-0, odd integer > 0)              = -0\r\n *   pow(-0, even integer > 0)             = +0\r\n *   pow(-0, odd integer < 0)              = -Infinity\r\n *   pow(-0, even integer < 0)             = +Infinity\r\n *   pow(finite x < 0, finite non-integer) = NaN\r\n *\r\n * For non-integer or very large exponents pow(x, y) is calculated using\r\n *\r\n *   x^y = exp(y*ln(x))\r\n *\r\n * Assuming the first 15 rounding digits are each equally likely to be any digit 0-9, the\r\n * probability of an incorrectly rounded result\r\n * P([49]9{14} | [50]0{14}) = 2 * 0.2 * 10^-14 = 4e-15 = 1/2.5e+14\r\n * i.e. 1 in 250,000,000,000,000\r\n *\r\n * If a result is incorrectly rounded the maximum error will be 1 ulp (unit in last place).\r\n *\r\n * y {number|string|bigint|Decimal} The power to which to raise this Decimal.\r\n *\r\n */\r\nP.toPower = P.pow = function (y) {\r\n  var e, k, pr, r, rm, s,\r\n    x = this,\r\n    Ctor = x.constructor,\r\n    yn = +(y = new Ctor(y));\r\n\r\n  // Either ±Infinity, NaN or ±0?\r\n  if (!x.d || !y.d || !x.d[0] || !y.d[0]) return new Ctor(mathpow(+x, yn));\r\n\r\n  x = new Ctor(x);\r\n\r\n  if (x.eq(1)) return x;\r\n\r\n  pr = Ctor.precision;\r\n  rm = Ctor.rounding;\r\n\r\n  if (y.eq(1)) return finalise(x, pr, rm);\r\n\r\n  // y exponent\r\n  e = mathfloor(y.e / LOG_BASE);\r\n\r\n  // If y is a small integer use the 'exponentiation by squaring' algorithm.\r\n  if (e >= y.d.length - 1 && (k = yn < 0 ? -yn : yn) <= MAX_SAFE_INTEGER) {\r\n    r = intPow(Ctor, x, k, pr);\r\n    return y.s < 0 ? new Ctor(1).div(r) : finalise(r, pr, rm);\r\n  }\r\n\r\n  s = x.s;\r\n\r\n  // if x is negative\r\n  if (s < 0) {\r\n\r\n    // if y is not an integer\r\n    if (e < y.d.length - 1) return new Ctor(NaN);\r\n\r\n    // Result is positive if x is negative and the last digit of integer y is even.\r\n    if ((y.d[e] & 1) == 0) s = 1;\r\n\r\n    // if x.eq(-1)\r\n    if (x.e == 0 && x.d[0] == 1 && x.d.length == 1) {\r\n      x.s = s;\r\n      return x;\r\n    }\r\n  }\r\n\r\n  // Estimate result exponent.\r\n  // x^y = 10^e,  where e = y * log10(x)\r\n  // log10(x) = log10(x_significand) + x_exponent\r\n  // log10(x_significand) = ln(x_significand) / ln(10)\r\n  k = mathpow(+x, yn);\r\n  e = k == 0 || !isFinite(k)\r\n    ? mathfloor(yn * (Math.log('0.' + digitsToString(x.d)) / Math.LN10 + x.e + 1))\r\n    : new Ctor(k + '').e;\r\n\r\n  // Exponent estimate may be incorrect e.g. x: 0.999999999999999999, y: 2.29, e: 0, r.e: -1.\r\n\r\n  // Overflow/underflow?\r\n  if (e > Ctor.maxE + 1 || e < Ctor.minE - 1) return new Ctor(e > 0 ? s / 0 : 0);\r\n\r\n  external = false;\r\n  Ctor.rounding = x.s = 1;\r\n\r\n  // Estimate the extra guard digits needed to ensure five correct rounding digits from\r\n  // naturalLogarithm(x). Example of failure without these extra digits (precision: 10):\r\n  // new Decimal(2.32456).pow('2087987436534566.46411')\r\n  // should be 1.162377823e+764914905173815, but is 1.162355823e+764914905173815\r\n  k = Math.min(12, (e + '').length);\r\n\r\n  // r = x^y = exp(y*ln(x))\r\n  r = naturalExponential(y.times(naturalLogarithm(x, pr + k)), pr);\r\n\r\n  // r may be Infinity, e.g. (0.9999999999999999).pow(-1e+40)\r\n  if (r.d) {\r\n\r\n    // Truncate to the required precision plus five rounding digits.\r\n    r = finalise(r, pr + 5, 1);\r\n\r\n    // If the rounding digits are [49]9999 or [50]0000 increase the precision by 10 and recalculate\r\n    // the result.\r\n    if (checkRoundingDigits(r.d, pr, rm)) {\r\n      e = pr + 10;\r\n\r\n      // Truncate to the increased precision plus five rounding digits.\r\n      r = finalise(naturalExponential(y.times(naturalLogarithm(x, e + k)), e), e + 5, 1);\r\n\r\n      // Check for 14 nines from the 2nd rounding digit (the first rounding digit may be 4 or 9).\r\n      if (+digitsToString(r.d).slice(pr + 1, pr + 15) + 1 == 1e14) {\r\n        r = finalise(r, pr + 1, 0);\r\n      }\r\n    }\r\n  }\r\n\r\n  r.s = s;\r\n  external = true;\r\n  Ctor.rounding = rm;\r\n\r\n  return finalise(r, pr, rm);\r\n};\r\n\r\n\r\n/*\r\n * Return a string representing the value of this Decimal rounded to `sd` significant digits\r\n * using rounding mode `rounding`.\r\n *\r\n * Return exponential notation if `sd` is less than the number of digits necessary to represent\r\n * the integer part of the value in normal notation.\r\n *\r\n * [sd] {number} Significant digits. Integer, 1 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n */\r\nP.toPrecision = function (sd, rm) {\r\n  var str,\r\n    x = this,\r\n    Ctor = x.constructor;\r\n\r\n  if (sd === void 0) {\r\n    str = finiteToString(x, x.e <= Ctor.toExpNeg || x.e >= Ctor.toExpPos);\r\n  } else {\r\n    checkInt32(sd, 1, MAX_DIGITS);\r\n\r\n    if (rm === void 0) rm = Ctor.rounding;\r\n    else checkInt32(rm, 0, 8);\r\n\r\n    x = finalise(new Ctor(x), sd, rm);\r\n    str = finiteToString(x, sd <= x.e || x.e <= Ctor.toExpNeg, sd);\r\n  }\r\n\r\n  return x.isNeg() && !x.isZero() ? '-' + str : str;\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal rounded to a maximum of `sd`\r\n * significant digits using rounding mode `rm`, or to `precision` and `rounding` respectively if\r\n * omitted.\r\n *\r\n * [sd] {number} Significant digits. Integer, 1 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * 'toSD() digits out of range: {sd}'\r\n * 'toSD() digits not an integer: {sd}'\r\n * 'toSD() rounding mode not an integer: {rm}'\r\n * 'toSD() rounding mode out of range: {rm}'\r\n *\r\n */\r\nP.toSignificantDigits = P.toSD = function (sd, rm) {\r\n  var x = this,\r\n    Ctor = x.constructor;\r\n\r\n  if (sd === void 0) {\r\n    sd = Ctor.precision;\r\n    rm = Ctor.rounding;\r\n  } else {\r\n    checkInt32(sd, 1, MAX_DIGITS);\r\n\r\n    if (rm === void 0) rm = Ctor.rounding;\r\n    else checkInt32(rm, 0, 8);\r\n  }\r\n\r\n  return finalise(new Ctor(x), sd, rm);\r\n};\r\n\r\n\r\n/*\r\n * Return a string representing the value of this Decimal.\r\n *\r\n * Return exponential notation if this Decimal has a positive exponent equal to or greater than\r\n * `toExpPos`, or a negative exponent equal to or less than `toExpNeg`.\r\n *\r\n */\r\nP.toString = function () {\r\n  var x = this,\r\n    Ctor = x.constructor,\r\n    str = finiteToString(x, x.e <= Ctor.toExpNeg || x.e >= Ctor.toExpPos);\r\n\r\n  return x.isNeg() && !x.isZero() ? '-' + str : str;\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal truncated to a whole number.\r\n *\r\n */\r\nP.truncated = P.trunc = function () {\r\n  return finalise(new this.constructor(this), this.e + 1, 1);\r\n};\r\n\r\n\r\n/*\r\n * Return a string representing the value of this Decimal.\r\n * Unlike `toString`, negative zero will include the minus sign.\r\n *\r\n */\r\nP.valueOf = P.toJSON = function () {\r\n  var x = this,\r\n    Ctor = x.constructor,\r\n    str = finiteToString(x, x.e <= Ctor.toExpNeg || x.e >= Ctor.toExpPos);\r\n\r\n  return x.isNeg() ? '-' + str : str;\r\n};\r\n\r\n\r\n// Helper functions for Decimal.prototype (P) and/or Decimal methods, and their callers.\r\n\r\n\r\n/*\r\n *  digitsToString           P.cubeRoot, P.logarithm, P.squareRoot, P.toFraction, P.toPower,\r\n *                           finiteToString, naturalExponential, naturalLogarithm\r\n *  checkInt32               P.toDecimalPlaces, P.toExponential, P.toFixed, P.toNearest,\r\n *                           P.toPrecision, P.toSignificantDigits, toStringBinary, random\r\n *  checkRoundingDigits      P.logarithm, P.toPower, naturalExponential, naturalLogarithm\r\n *  convertBase              toStringBinary, parseOther\r\n *  cos                      P.cos\r\n *  divide                   P.atanh, P.cubeRoot, P.dividedBy, P.dividedToIntegerBy,\r\n *                           P.logarithm, P.modulo, P.squareRoot, P.tan, P.tanh, P.toFraction,\r\n *                           P.toNearest, toStringBinary, naturalExponential, naturalLogarithm,\r\n *                           taylorSeries, atan2, parseOther\r\n *  finalise                 P.absoluteValue, P.atan, P.atanh, P.ceil, P.cos, P.cosh,\r\n *                           P.cubeRoot, P.dividedToIntegerBy, P.floor, P.logarithm, P.minus,\r\n *                           P.modulo, P.negated, P.plus, P.round, P.sin, P.sinh, P.squareRoot,\r\n *                           P.tan, P.times, P.toDecimalPlaces, P.toExponential, P.toFixed,\r\n *                           P.toNearest, P.toPower, P.toPrecision, P.toSignificantDigits,\r\n *                           P.truncated, divide, getLn10, getPi, naturalExponential,\r\n *                           naturalLogarithm, ceil, floor, round, trunc\r\n *  finiteToString           P.toExponential, P.toFixed, P.toPrecision, P.toString, P.valueOf,\r\n *                           toStringBinary\r\n *  getBase10Exponent        P.minus, P.plus, P.times, parseOther\r\n *  getLn10                  P.logarithm, naturalLogarithm\r\n *  getPi                    P.acos, P.asin, P.atan, toLessThanHalfPi, atan2\r\n *  getPrecision             P.precision, P.toFraction\r\n *  getZeroString            digitsToString, finiteToString\r\n *  intPow                   P.toPower, parseOther\r\n *  isOdd                    toLessThanHalfPi\r\n *  maxOrMin                 max, min\r\n *  naturalExponential       P.naturalExponential, P.toPower\r\n *  naturalLogarithm         P.acosh, P.asinh, P.atanh, P.logarithm, P.naturalLogarithm,\r\n *                           P.toPower, naturalExponential\r\n *  nonFiniteToString        finiteToString, toStringBinary\r\n *  parseDecimal             Decimal\r\n *  parseOther               Decimal\r\n *  sin                      P.sin\r\n *  taylorSeries             P.cosh, P.sinh, cos, sin\r\n *  toLessThanHalfPi         P.cos, P.sin\r\n *  toStringBinary           P.toBinary, P.toHexadecimal, P.toOctal\r\n *  truncate                 intPow\r\n *\r\n *  Throws:                  P.logarithm, P.precision, P.toFraction, checkInt32, getLn10, getPi,\r\n *                           naturalLogarithm, config, parseOther, random, Decimal\r\n */\r\n\r\n\r\nfunction digitsToString(d) {\r\n  var i, k, ws,\r\n    indexOfLastWord = d.length - 1,\r\n    str = '',\r\n    w = d[0];\r\n\r\n  if (indexOfLastWord > 0) {\r\n    str += w;\r\n    for (i = 1; i < indexOfLastWord; i++) {\r\n      ws = d[i] + '';\r\n      k = LOG_BASE - ws.length;\r\n      if (k) str += getZeroString(k);\r\n      str += ws;\r\n    }\r\n\r\n    w = d[i];\r\n    ws = w + '';\r\n    k = LOG_BASE - ws.length;\r\n    if (k) str += getZeroString(k);\r\n  } else if (w === 0) {\r\n    return '0';\r\n  }\r\n\r\n  // Remove trailing zeros of last w.\r\n  for (; w % 10 === 0;) w /= 10;\r\n\r\n  return str + w;\r\n}\r\n\r\n\r\nfunction checkInt32(i, min, max) {\r\n  if (i !== ~~i || i < min || i > max) {\r\n    throw Error(invalidArgument + i);\r\n  }\r\n}\r\n\r\n\r\n/*\r\n * Check 5 rounding digits if `repeating` is null, 4 otherwise.\r\n * `repeating == null` if caller is `log` or `pow`,\r\n * `repeating != null` if caller is `naturalLogarithm` or `naturalExponential`.\r\n */\r\nfunction checkRoundingDigits(d, i, rm, repeating) {\r\n  var di, k, r, rd;\r\n\r\n  // Get the length of the first word of the array d.\r\n  for (k = d[0]; k >= 10; k /= 10) --i;\r\n\r\n  // Is the rounding digit in the first word of d?\r\n  if (--i < 0) {\r\n    i += LOG_BASE;\r\n    di = 0;\r\n  } else {\r\n    di = Math.ceil((i + 1) / LOG_BASE);\r\n    i %= LOG_BASE;\r\n  }\r\n\r\n  // i is the index (0 - 6) of the rounding digit.\r\n  // E.g. if within the word 3487563 the first rounding digit is 5,\r\n  // then i = 4, k = 1000, rd = 3487563 % 1000 = 563\r\n  k = mathpow(10, LOG_BASE - i);\r\n  rd = d[di] % k | 0;\r\n\r\n  if (repeating == null) {\r\n    if (i < 3) {\r\n      if (i == 0) rd = rd / 100 | 0;\r\n      else if (i == 1) rd = rd / 10 | 0;\r\n      r = rm < 4 && rd == 99999 || rm > 3 && rd == 49999 || rd == 50000 || rd == 0;\r\n    } else {\r\n      r = (rm < 4 && rd + 1 == k || rm > 3 && rd + 1 == k / 2) &&\r\n        (d[di + 1] / k / 100 | 0) == mathpow(10, i - 2) - 1 ||\r\n          (rd == k / 2 || rd == 0) && (d[di + 1] / k / 100 | 0) == 0;\r\n    }\r\n  } else {\r\n    if (i < 4) {\r\n      if (i == 0) rd = rd / 1000 | 0;\r\n      else if (i == 1) rd = rd / 100 | 0;\r\n      else if (i == 2) rd = rd / 10 | 0;\r\n      r = (repeating || rm < 4) && rd == 9999 || !repeating && rm > 3 && rd == 4999;\r\n    } else {\r\n      r = ((repeating || rm < 4) && rd + 1 == k ||\r\n      (!repeating && rm > 3) && rd + 1 == k / 2) &&\r\n        (d[di + 1] / k / 1000 | 0) == mathpow(10, i - 3) - 1;\r\n    }\r\n  }\r\n\r\n  return r;\r\n}\r\n\r\n\r\n// Convert string of `baseIn` to an array of numbers of `baseOut`.\r\n// Eg. convertBase('255', 10, 16) returns [15, 15].\r\n// Eg. convertBase('ff', 16, 10) returns [2, 5, 5].\r\nfunction convertBase(str, baseIn, baseOut) {\r\n  var j,\r\n    arr = [0],\r\n    arrL,\r\n    i = 0,\r\n    strL = str.length;\r\n\r\n  for (; i < strL;) {\r\n    for (arrL = arr.length; arrL--;) arr[arrL] *= baseIn;\r\n    arr[0] += NUMERALS.indexOf(str.charAt(i++));\r\n    for (j = 0; j < arr.length; j++) {\r\n      if (arr[j] > baseOut - 1) {\r\n        if (arr[j + 1] === void 0) arr[j + 1] = 0;\r\n        arr[j + 1] += arr[j] / baseOut | 0;\r\n        arr[j] %= baseOut;\r\n      }\r\n    }\r\n  }\r\n\r\n  return arr.reverse();\r\n}\r\n\r\n\r\n/*\r\n * cos(x) = 1 - x^2/2! + x^4/4! - ...\r\n * |x| < pi/2\r\n *\r\n */\r\nfunction cosine(Ctor, x) {\r\n  var k, len, y;\r\n\r\n  if (x.isZero()) return x;\r\n\r\n  // Argument reduction: cos(4x) = 8*(cos^4(x) - cos^2(x)) + 1\r\n  // i.e. cos(x) = 8*(cos^4(x/4) - cos^2(x/4)) + 1\r\n\r\n  // Estimate the optimum number of times to use the argument reduction.\r\n  len = x.d.length;\r\n  if (len < 32) {\r\n    k = Math.ceil(len / 3);\r\n    y = (1 / tinyPow(4, k)).toString();\r\n  } else {\r\n    k = 16;\r\n    y = '2.3283064365386962890625e-10';\r\n  }\r\n\r\n  Ctor.precision += k;\r\n\r\n  x = taylorSeries(Ctor, 1, x.times(y), new Ctor(1));\r\n\r\n  // Reverse argument reduction\r\n  for (var i = k; i--;) {\r\n    var cos2x = x.times(x);\r\n    x = cos2x.times(cos2x).minus(cos2x).times(8).plus(1);\r\n  }\r\n\r\n  Ctor.precision -= k;\r\n\r\n  return x;\r\n}\r\n\r\n\r\n/*\r\n * Perform division in the specified base.\r\n */\r\nvar divide = (function () {\r\n\r\n  // Assumes non-zero x and k, and hence non-zero result.\r\n  function multiplyInteger(x, k, base) {\r\n    var temp,\r\n      carry = 0,\r\n      i = x.length;\r\n\r\n    for (x = x.slice(); i--;) {\r\n      temp = x[i] * k + carry;\r\n      x[i] = temp % base | 0;\r\n      carry = temp / base | 0;\r\n    }\r\n\r\n    if (carry) x.unshift(carry);\r\n\r\n    return x;\r\n  }\r\n\r\n  function compare(a, b, aL, bL) {\r\n    var i, r;\r\n\r\n    if (aL != bL) {\r\n      r = aL > bL ? 1 : -1;\r\n    } else {\r\n      for (i = r = 0; i < aL; i++) {\r\n        if (a[i] != b[i]) {\r\n          r = a[i] > b[i] ? 1 : -1;\r\n          break;\r\n        }\r\n      }\r\n    }\r\n\r\n    return r;\r\n  }\r\n\r\n  function subtract(a, b, aL, base) {\r\n    var i = 0;\r\n\r\n    // Subtract b from a.\r\n    for (; aL--;) {\r\n      a[aL] -= i;\r\n      i = a[aL] < b[aL] ? 1 : 0;\r\n      a[aL] = i * base + a[aL] - b[aL];\r\n    }\r\n\r\n    // Remove leading zeros.\r\n    for (; !a[0] && a.length > 1;) a.shift();\r\n  }\r\n\r\n  return function (x, y, pr, rm, dp, base) {\r\n    var cmp, e, i, k, logBase, more, prod, prodL, q, qd, rem, remL, rem0, sd, t, xi, xL, yd0,\r\n      yL, yz,\r\n      Ctor = x.constructor,\r\n      sign = x.s == y.s ? 1 : -1,\r\n      xd = x.d,\r\n      yd = y.d;\r\n\r\n    // Either NaN, Infinity or 0?\r\n    if (!xd || !xd[0] || !yd || !yd[0]) {\r\n\r\n      return new Ctor(// Return NaN if either NaN, or both Infinity or 0.\r\n        !x.s || !y.s || (xd ? yd && xd[0] == yd[0] : !yd) ? NaN :\r\n\r\n        // Return ±0 if x is 0 or y is ±Infinity, or return ±Infinity as y is 0.\r\n        xd && xd[0] == 0 || !yd ? sign * 0 : sign / 0);\r\n    }\r\n\r\n    if (base) {\r\n      logBase = 1;\r\n      e = x.e - y.e;\r\n    } else {\r\n      base = BASE;\r\n      logBase = LOG_BASE;\r\n      e = mathfloor(x.e / logBase) - mathfloor(y.e / logBase);\r\n    }\r\n\r\n    yL = yd.length;\r\n    xL = xd.length;\r\n    q = new Ctor(sign);\r\n    qd = q.d = [];\r\n\r\n    // Result exponent may be one less than e.\r\n    // The digit array of a Decimal from toStringBinary may have trailing zeros.\r\n    for (i = 0; yd[i] == (xd[i] || 0); i++);\r\n\r\n    if (yd[i] > (xd[i] || 0)) e--;\r\n\r\n    if (pr == null) {\r\n      sd = pr = Ctor.precision;\r\n      rm = Ctor.rounding;\r\n    } else if (dp) {\r\n      sd = pr + (x.e - y.e) + 1;\r\n    } else {\r\n      sd = pr;\r\n    }\r\n\r\n    if (sd < 0) {\r\n      qd.push(1);\r\n      more = true;\r\n    } else {\r\n\r\n      // Convert precision in number of base 10 digits to base 1e7 digits.\r\n      sd = sd / logBase + 2 | 0;\r\n      i = 0;\r\n\r\n      // divisor < 1e7\r\n      if (yL == 1) {\r\n        k = 0;\r\n        yd = yd[0];\r\n        sd++;\r\n\r\n        // k is the carry.\r\n        for (; (i < xL || k) && sd--; i++) {\r\n          t = k * base + (xd[i] || 0);\r\n          qd[i] = t / yd | 0;\r\n          k = t % yd | 0;\r\n        }\r\n\r\n        more = k || i < xL;\r\n\r\n      // divisor >= 1e7\r\n      } else {\r\n\r\n        // Normalise xd and yd so highest order digit of yd is >= base/2\r\n        k = base / (yd[0] + 1) | 0;\r\n\r\n        if (k > 1) {\r\n          yd = multiplyInteger(yd, k, base);\r\n          xd = multiplyInteger(xd, k, base);\r\n          yL = yd.length;\r\n          xL = xd.length;\r\n        }\r\n\r\n        xi = yL;\r\n        rem = xd.slice(0, yL);\r\n        remL = rem.length;\r\n\r\n        // Add zeros to make remainder as long as divisor.\r\n        for (; remL < yL;) rem[remL++] = 0;\r\n\r\n        yz = yd.slice();\r\n        yz.unshift(0);\r\n        yd0 = yd[0];\r\n\r\n        if (yd[1] >= base / 2) ++yd0;\r\n\r\n        do {\r\n          k = 0;\r\n\r\n          // Compare divisor and remainder.\r\n          cmp = compare(yd, rem, yL, remL);\r\n\r\n          // If divisor < remainder.\r\n          if (cmp < 0) {\r\n\r\n            // Calculate trial digit, k.\r\n            rem0 = rem[0];\r\n            if (yL != remL) rem0 = rem0 * base + (rem[1] || 0);\r\n\r\n            // k will be how many times the divisor goes into the current remainder.\r\n            k = rem0 / yd0 | 0;\r\n\r\n            //  Algorithm:\r\n            //  1. product = divisor * trial digit (k)\r\n            //  2. if product > remainder: product -= divisor, k--\r\n            //  3. remainder -= product\r\n            //  4. if product was < remainder at 2:\r\n            //    5. compare new remainder and divisor\r\n            //    6. If remainder > divisor: remainder -= divisor, k++\r\n\r\n            if (k > 1) {\r\n              if (k >= base) k = base - 1;\r\n\r\n              // product = divisor * trial digit.\r\n              prod = multiplyInteger(yd, k, base);\r\n              prodL = prod.length;\r\n              remL = rem.length;\r\n\r\n              // Compare product and remainder.\r\n              cmp = compare(prod, rem, prodL, remL);\r\n\r\n              // product > remainder.\r\n              if (cmp == 1) {\r\n                k--;\r\n\r\n                // Subtract divisor from product.\r\n                subtract(prod, yL < prodL ? yz : yd, prodL, base);\r\n              }\r\n            } else {\r\n\r\n              // cmp is -1.\r\n              // If k is 0, there is no need to compare yd and rem again below, so change cmp to 1\r\n              // to avoid it. If k is 1 there is a need to compare yd and rem again below.\r\n              if (k == 0) cmp = k = 1;\r\n              prod = yd.slice();\r\n            }\r\n\r\n            prodL = prod.length;\r\n            if (prodL < remL) prod.unshift(0);\r\n\r\n            // Subtract product from remainder.\r\n            subtract(rem, prod, remL, base);\r\n\r\n            // If product was < previous remainder.\r\n            if (cmp == -1) {\r\n              remL = rem.length;\r\n\r\n              // Compare divisor and new remainder.\r\n              cmp = compare(yd, rem, yL, remL);\r\n\r\n              // If divisor < new remainder, subtract divisor from remainder.\r\n              if (cmp < 1) {\r\n                k++;\r\n\r\n                // Subtract divisor from remainder.\r\n                subtract(rem, yL < remL ? yz : yd, remL, base);\r\n              }\r\n            }\r\n\r\n            remL = rem.length;\r\n          } else if (cmp === 0) {\r\n            k++;\r\n            rem = [0];\r\n          }    // if cmp === 1, k will be 0\r\n\r\n          // Add the next digit, k, to the result array.\r\n          qd[i++] = k;\r\n\r\n          // Update the remainder.\r\n          if (cmp && rem[0]) {\r\n            rem[remL++] = xd[xi] || 0;\r\n          } else {\r\n            rem = [xd[xi]];\r\n            remL = 1;\r\n          }\r\n\r\n        } while ((xi++ < xL || rem[0] !== void 0) && sd--);\r\n\r\n        more = rem[0] !== void 0;\r\n      }\r\n\r\n      // Leading zero?\r\n      if (!qd[0]) qd.shift();\r\n    }\r\n\r\n    // logBase is 1 when divide is being used for base conversion.\r\n    if (logBase == 1) {\r\n      q.e = e;\r\n      inexact = more;\r\n    } else {\r\n\r\n      // To calculate q.e, first get the number of digits of qd[0].\r\n      for (i = 1, k = qd[0]; k >= 10; k /= 10) i++;\r\n      q.e = i + e * logBase - 1;\r\n\r\n      finalise(q, dp ? pr + q.e + 1 : pr, rm, more);\r\n    }\r\n\r\n    return q;\r\n  };\r\n})();\r\n\r\n\r\n/*\r\n * Round `x` to `sd` significant digits using rounding mode `rm`.\r\n * Check for over/under-flow.\r\n */\r\n function finalise(x, sd, rm, isTruncated) {\r\n  var digits, i, j, k, rd, roundUp, w, xd, xdi,\r\n    Ctor = x.constructor;\r\n\r\n  // Don't round if sd is null or undefined.\r\n  out: if (sd != null) {\r\n    xd = x.d;\r\n\r\n    // Infinity/NaN.\r\n    if (!xd) return x;\r\n\r\n    // rd: the rounding digit, i.e. the digit after the digit that may be rounded up.\r\n    // w: the word of xd containing rd, a base 1e7 number.\r\n    // xdi: the index of w within xd.\r\n    // digits: the number of digits of w.\r\n    // i: what would be the index of rd within w if all the numbers were 7 digits long (i.e. if\r\n    // they had leading zeros)\r\n    // j: if > 0, the actual index of rd within w (if < 0, rd is a leading zero).\r\n\r\n    // Get the length of the first word of the digits array xd.\r\n    for (digits = 1, k = xd[0]; k >= 10; k /= 10) digits++;\r\n    i = sd - digits;\r\n\r\n    // Is the rounding digit in the first word of xd?\r\n    if (i < 0) {\r\n      i += LOG_BASE;\r\n      j = sd;\r\n      w = xd[xdi = 0];\r\n\r\n      // Get the rounding digit at index j of w.\r\n      rd = w / mathpow(10, digits - j - 1) % 10 | 0;\r\n    } else {\r\n      xdi = Math.ceil((i + 1) / LOG_BASE);\r\n      k = xd.length;\r\n      if (xdi >= k) {\r\n        if (isTruncated) {\r\n\r\n          // Needed by `naturalExponential`, `naturalLogarithm` and `squareRoot`.\r\n          for (; k++ <= xdi;) xd.push(0);\r\n          w = rd = 0;\r\n          digits = 1;\r\n          i %= LOG_BASE;\r\n          j = i - LOG_BASE + 1;\r\n        } else {\r\n          break out;\r\n        }\r\n      } else {\r\n        w = k = xd[xdi];\r\n\r\n        // Get the number of digits of w.\r\n        for (digits = 1; k >= 10; k /= 10) digits++;\r\n\r\n        // Get the index of rd within w.\r\n        i %= LOG_BASE;\r\n\r\n        // Get the index of rd within w, adjusted for leading zeros.\r\n        // The number of leading zeros of w is given by LOG_BASE - digits.\r\n        j = i - LOG_BASE + digits;\r\n\r\n        // Get the rounding digit at index j of w.\r\n        rd = j < 0 ? 0 : w / mathpow(10, digits - j - 1) % 10 | 0;\r\n      }\r\n    }\r\n\r\n    // Are there any non-zero digits after the rounding digit?\r\n    isTruncated = isTruncated || sd < 0 ||\r\n      xd[xdi + 1] !== void 0 || (j < 0 ? w : w % mathpow(10, digits - j - 1));\r\n\r\n    // The expression `w % mathpow(10, digits - j - 1)` returns all the digits of w to the right\r\n    // of the digit at (left-to-right) index j, e.g. if w is 908714 and j is 2, the expression\r\n    // will give 714.\r\n\r\n    roundUp = rm < 4\r\n      ? (rd || isTruncated) && (rm == 0 || rm == (x.s < 0 ? 3 : 2))\r\n      : rd > 5 || rd == 5 && (rm == 4 || isTruncated || rm == 6 &&\r\n\r\n        // Check whether the digit to the left of the rounding digit is odd.\r\n        ((i > 0 ? j > 0 ? w / mathpow(10, digits - j) : 0 : xd[xdi - 1]) % 10) & 1 ||\r\n          rm == (x.s < 0 ? 8 : 7));\r\n\r\n    if (sd < 1 || !xd[0]) {\r\n      xd.length = 0;\r\n      if (roundUp) {\r\n\r\n        // Convert sd to decimal places.\r\n        sd -= x.e + 1;\r\n\r\n        // 1, 0.1, 0.01, 0.001, 0.0001 etc.\r\n        xd[0] = mathpow(10, (LOG_BASE - sd % LOG_BASE) % LOG_BASE);\r\n        x.e = -sd || 0;\r\n      } else {\r\n\r\n        // Zero.\r\n        xd[0] = x.e = 0;\r\n      }\r\n\r\n      return x;\r\n    }\r\n\r\n    // Remove excess digits.\r\n    if (i == 0) {\r\n      xd.length = xdi;\r\n      k = 1;\r\n      xdi--;\r\n    } else {\r\n      xd.length = xdi + 1;\r\n      k = mathpow(10, LOG_BASE - i);\r\n\r\n      // E.g. 56700 becomes 56000 if 7 is the rounding digit.\r\n      // j > 0 means i > number of leading zeros of w.\r\n      xd[xdi] = j > 0 ? (w / mathpow(10, digits - j) % mathpow(10, j) | 0) * k : 0;\r\n    }\r\n\r\n    if (roundUp) {\r\n      for (;;) {\r\n\r\n        // Is the digit to be rounded up in the first word of xd?\r\n        if (xdi == 0) {\r\n\r\n          // i will be the length of xd[0] before k is added.\r\n          for (i = 1, j = xd[0]; j >= 10; j /= 10) i++;\r\n          j = xd[0] += k;\r\n          for (k = 1; j >= 10; j /= 10) k++;\r\n\r\n          // if i != k the length has increased.\r\n          if (i != k) {\r\n            x.e++;\r\n            if (xd[0] == BASE) xd[0] = 1;\r\n          }\r\n\r\n          break;\r\n        } else {\r\n          xd[xdi] += k;\r\n          if (xd[xdi] != BASE) break;\r\n          xd[xdi--] = 0;\r\n          k = 1;\r\n        }\r\n      }\r\n    }\r\n\r\n    // Remove trailing zeros.\r\n    for (i = xd.length; xd[--i] === 0;) xd.pop();\r\n  }\r\n\r\n  if (external) {\r\n\r\n    // Overflow?\r\n    if (x.e > Ctor.maxE) {\r\n\r\n      // Infinity.\r\n      x.d = null;\r\n      x.e = NaN;\r\n\r\n    // Underflow?\r\n    } else if (x.e < Ctor.minE) {\r\n\r\n      // Zero.\r\n      x.e = 0;\r\n      x.d = [0];\r\n      // Ctor.underflow = true;\r\n    } // else Ctor.underflow = false;\r\n  }\r\n\r\n  return x;\r\n}\r\n\r\n\r\nfunction finiteToString(x, isExp, sd) {\r\n  if (!x.isFinite()) return nonFiniteToString(x);\r\n  var k,\r\n    e = x.e,\r\n    str = digitsToString(x.d),\r\n    len = str.length;\r\n\r\n  if (isExp) {\r\n    if (sd && (k = sd - len) > 0) {\r\n      str = str.charAt(0) + '.' + str.slice(1) + getZeroString(k);\r\n    } else if (len > 1) {\r\n      str = str.charAt(0) + '.' + str.slice(1);\r\n    }\r\n\r\n    str = str + (x.e < 0 ? 'e' : 'e+') + x.e;\r\n  } else if (e < 0) {\r\n    str = '0.' + getZeroString(-e - 1) + str;\r\n    if (sd && (k = sd - len) > 0) str += getZeroString(k);\r\n  } else if (e >= len) {\r\n    str += getZeroString(e + 1 - len);\r\n    if (sd && (k = sd - e - 1) > 0) str = str + '.' + getZeroString(k);\r\n  } else {\r\n    if ((k = e + 1) < len) str = str.slice(0, k) + '.' + str.slice(k);\r\n    if (sd && (k = sd - len) > 0) {\r\n      if (e + 1 === len) str += '.';\r\n      str += getZeroString(k);\r\n    }\r\n  }\r\n\r\n  return str;\r\n}\r\n\r\n\r\n// Calculate the base 10 exponent from the base 1e7 exponent.\r\nfunction getBase10Exponent(digits, e) {\r\n  var w = digits[0];\r\n\r\n  // Add the number of digits of the first word of the digits array.\r\n  for ( e *= LOG_BASE; w >= 10; w /= 10) e++;\r\n  return e;\r\n}\r\n\r\n\r\nfunction getLn10(Ctor, sd, pr) {\r\n  if (sd > LN10_PRECISION) {\r\n\r\n    // Reset global state in case the exception is caught.\r\n    external = true;\r\n    if (pr) Ctor.precision = pr;\r\n    throw Error(precisionLimitExceeded);\r\n  }\r\n  return finalise(new Ctor(LN10), sd, 1, true);\r\n}\r\n\r\n\r\nfunction getPi(Ctor, sd, rm) {\r\n  if (sd > PI_PRECISION) throw Error(precisionLimitExceeded);\r\n  return finalise(new Ctor(PI), sd, rm, true);\r\n}\r\n\r\n\r\nfunction getPrecision(digits) {\r\n  var w = digits.length - 1,\r\n    len = w * LOG_BASE + 1;\r\n\r\n  w = digits[w];\r\n\r\n  // If non-zero...\r\n  if (w) {\r\n\r\n    // Subtract the number of trailing zeros of the last word.\r\n    for (; w % 10 == 0; w /= 10) len--;\r\n\r\n    // Add the number of digits of the first word.\r\n    for (w = digits[0]; w >= 10; w /= 10) len++;\r\n  }\r\n\r\n  return len;\r\n}\r\n\r\n\r\nfunction getZeroString(k) {\r\n  var zs = '';\r\n  for (; k--;) zs += '0';\r\n  return zs;\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of Decimal `x` to the power `n`, where `n` is an\r\n * integer of type number.\r\n *\r\n * Implements 'exponentiation by squaring'. Called by `pow` and `parseOther`.\r\n *\r\n */\r\nfunction intPow(Ctor, x, n, pr) {\r\n  var isTruncated,\r\n    r = new Ctor(1),\r\n\r\n    // Max n of 9007199254740991 takes 53 loop iterations.\r\n    // Maximum digits array length; leaves [28, 34] guard digits.\r\n    k = Math.ceil(pr / LOG_BASE + 4);\r\n\r\n  external = false;\r\n\r\n  for (;;) {\r\n    if (n % 2) {\r\n      r = r.times(x);\r\n      if (truncate(r.d, k)) isTruncated = true;\r\n    }\r\n\r\n    n = mathfloor(n / 2);\r\n    if (n === 0) {\r\n\r\n      // To ensure correct rounding when r.d is truncated, increment the last word if it is zero.\r\n      n = r.d.length - 1;\r\n      if (isTruncated && r.d[n] === 0) ++r.d[n];\r\n      break;\r\n    }\r\n\r\n    x = x.times(x);\r\n    truncate(x.d, k);\r\n  }\r\n\r\n  external = true;\r\n\r\n  return r;\r\n}\r\n\r\n\r\nfunction isOdd(n) {\r\n  return n.d[n.d.length - 1] & 1;\r\n}\r\n\r\n\r\n/*\r\n * Handle `max` (`n` is -1) and `min` (`n` is 1).\r\n */\r\nfunction maxOrMin(Ctor, args, n) {\r\n  var k, y,\r\n    x = new Ctor(args[0]),\r\n    i = 0;\r\n\r\n  for (; ++i < args.length;) {\r\n    y = new Ctor(args[i]);\r\n\r\n    // NaN?\r\n    if (!y.s) {\r\n      x = y;\r\n      break;\r\n    }\r\n\r\n    k = x.cmp(y);\r\n\r\n    if (k === n || k === 0 && x.s === n) {\r\n      x = y;\r\n    }\r\n  }\r\n\r\n  return x;\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the natural exponential of `x` rounded to `sd` significant\r\n * digits.\r\n *\r\n * Taylor/Maclaurin series.\r\n *\r\n * exp(x) = x^0/0! + x^1/1! + x^2/2! + x^3/3! + ...\r\n *\r\n * Argument reduction:\r\n *   Repeat x = x / 32, k += 5, until |x| < 0.1\r\n *   exp(x) = exp(x / 2^k)^(2^k)\r\n *\r\n * Previously, the argument was initially reduced by\r\n * exp(x) = exp(r) * 10^k  where r = x - k * ln10, k = floor(x / ln10)\r\n * to first put r in the range [0, ln10], before dividing by 32 until |x| < 0.1, but this was\r\n * found to be slower than just dividing repeatedly by 32 as above.\r\n *\r\n * Max integer argument: exp('20723265836946413') = 6.3e+9000000000000000\r\n * Min integer argument: exp('-20723265836946411') = 1.2e-9000000000000000\r\n * (Math object integer min/max: Math.exp(709) = 8.2e+307, Math.exp(-745) = 5e-324)\r\n *\r\n *  exp(Infinity)  = Infinity\r\n *  exp(-Infinity) = 0\r\n *  exp(NaN)       = NaN\r\n *  exp(±0)        = 1\r\n *\r\n *  exp(x) is non-terminating for any finite, non-zero x.\r\n *\r\n *  The result will always be correctly rounded.\r\n *\r\n */\r\nfunction naturalExponential(x, sd) {\r\n  var denominator, guard, j, pow, sum, t, wpr,\r\n    rep = 0,\r\n    i = 0,\r\n    k = 0,\r\n    Ctor = x.constructor,\r\n    rm = Ctor.rounding,\r\n    pr = Ctor.precision;\r\n\r\n  // 0/NaN/Infinity?\r\n  if (!x.d || !x.d[0] || x.e > 17) {\r\n\r\n    return new Ctor(x.d\r\n      ? !x.d[0] ? 1 : x.s < 0 ? 0 : 1 / 0\r\n      : x.s ? x.s < 0 ? 0 : x : 0 / 0);\r\n  }\r\n\r\n  if (sd == null) {\r\n    external = false;\r\n    wpr = pr;\r\n  } else {\r\n    wpr = sd;\r\n  }\r\n\r\n  t = new Ctor(0.03125);\r\n\r\n  // while abs(x) >= 0.1\r\n  while (x.e > -2) {\r\n\r\n    // x = x / 2^5\r\n    x = x.times(t);\r\n    k += 5;\r\n  }\r\n\r\n  // Use 2 * log10(2^k) + 5 (empirically derived) to estimate the increase in precision\r\n  // necessary to ensure the first 4 rounding digits are correct.\r\n  guard = Math.log(mathpow(2, k)) / Math.LN10 * 2 + 5 | 0;\r\n  wpr += guard;\r\n  denominator = pow = sum = new Ctor(1);\r\n  Ctor.precision = wpr;\r\n\r\n  for (;;) {\r\n    pow = finalise(pow.times(x), wpr, 1);\r\n    denominator = denominator.times(++i);\r\n    t = sum.plus(divide(pow, denominator, wpr, 1));\r\n\r\n    if (digitsToString(t.d).slice(0, wpr) === digitsToString(sum.d).slice(0, wpr)) {\r\n      j = k;\r\n      while (j--) sum = finalise(sum.times(sum), wpr, 1);\r\n\r\n      // Check to see if the first 4 rounding digits are [49]999.\r\n      // If so, repeat the summation with a higher precision, otherwise\r\n      // e.g. with precision: 18, rounding: 1\r\n      // exp(18.404272462595034083567793919843761) = 98372560.1229999999 (should be 98372560.123)\r\n      // `wpr - guard` is the index of first rounding digit.\r\n      if (sd == null) {\r\n\r\n        if (rep < 3 && checkRoundingDigits(sum.d, wpr - guard, rm, rep)) {\r\n          Ctor.precision = wpr += 10;\r\n          denominator = pow = t = new Ctor(1);\r\n          i = 0;\r\n          rep++;\r\n        } else {\r\n          return finalise(sum, Ctor.precision = pr, rm, external = true);\r\n        }\r\n      } else {\r\n        Ctor.precision = pr;\r\n        return sum;\r\n      }\r\n    }\r\n\r\n    sum = t;\r\n  }\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the natural logarithm of `x` rounded to `sd` significant\r\n * digits.\r\n *\r\n *  ln(-n)        = NaN\r\n *  ln(0)         = -Infinity\r\n *  ln(-0)        = -Infinity\r\n *  ln(1)         = 0\r\n *  ln(Infinity)  = Infinity\r\n *  ln(-Infinity) = NaN\r\n *  ln(NaN)       = NaN\r\n *\r\n *  ln(n) (n != 1) is non-terminating.\r\n *\r\n */\r\nfunction naturalLogarithm(y, sd) {\r\n  var c, c0, denominator, e, numerator, rep, sum, t, wpr, x1, x2,\r\n    n = 1,\r\n    guard = 10,\r\n    x = y,\r\n    xd = x.d,\r\n    Ctor = x.constructor,\r\n    rm = Ctor.rounding,\r\n    pr = Ctor.precision;\r\n\r\n  // Is x negative or Infinity, NaN, 0 or 1?\r\n  if (x.s < 0 || !xd || !xd[0] || !x.e && xd[0] == 1 && xd.length == 1) {\r\n    return new Ctor(xd && !xd[0] ? -1 / 0 : x.s != 1 ? NaN : xd ? 0 : x);\r\n  }\r\n\r\n  if (sd == null) {\r\n    external = false;\r\n    wpr = pr;\r\n  } else {\r\n    wpr = sd;\r\n  }\r\n\r\n  Ctor.precision = wpr += guard;\r\n  c = digitsToString(xd);\r\n  c0 = c.charAt(0);\r\n\r\n  if (Math.abs(e = x.e) < 1.5e15) {\r\n\r\n    // Argument reduction.\r\n    // The series converges faster the closer the argument is to 1, so using\r\n    // ln(a^b) = b * ln(a),   ln(a) = ln(a^b) / b\r\n    // multiply the argument by itself until the leading digits of the significand are 7, 8, 9,\r\n    // 10, 11, 12 or 13, recording the number of multiplications so the sum of the series can\r\n    // later be divided by this number, then separate out the power of 10 using\r\n    // ln(a*10^b) = ln(a) + b*ln(10).\r\n\r\n    // max n is 21 (gives 0.9, 1.0 or 1.1) (9e15 / 21 = 4.2e14).\r\n    //while (c0 < 9 && c0 != 1 || c0 == 1 && c.charAt(1) > 1) {\r\n    // max n is 6 (gives 0.7 - 1.3)\r\n    while (c0 < 7 && c0 != 1 || c0 == 1 && c.charAt(1) > 3) {\r\n      x = x.times(y);\r\n      c = digitsToString(x.d);\r\n      c0 = c.charAt(0);\r\n      n++;\r\n    }\r\n\r\n    e = x.e;\r\n\r\n    if (c0 > 1) {\r\n      x = new Ctor('0.' + c);\r\n      e++;\r\n    } else {\r\n      x = new Ctor(c0 + '.' + c.slice(1));\r\n    }\r\n  } else {\r\n\r\n    // The argument reduction method above may result in overflow if the argument y is a massive\r\n    // number with exponent >= 1500000000000000 (9e15 / 6 = 1.5e15), so instead recall this\r\n    // function using ln(x*10^e) = ln(x) + e*ln(10).\r\n    t = getLn10(Ctor, wpr + 2, pr).times(e + '');\r\n    x = naturalLogarithm(new Ctor(c0 + '.' + c.slice(1)), wpr - guard).plus(t);\r\n    Ctor.precision = pr;\r\n\r\n    return sd == null ? finalise(x, pr, rm, external = true) : x;\r\n  }\r\n\r\n  // x1 is x reduced to a value near 1.\r\n  x1 = x;\r\n\r\n  // Taylor series.\r\n  // ln(y) = ln((1 + x)/(1 - x)) = 2(x + x^3/3 + x^5/5 + x^7/7 + ...)\r\n  // where x = (y - 1)/(y + 1)    (|x| < 1)\r\n  sum = numerator = x = divide(x.minus(1), x.plus(1), wpr, 1);\r\n  x2 = finalise(x.times(x), wpr, 1);\r\n  denominator = 3;\r\n\r\n  for (;;) {\r\n    numerator = finalise(numerator.times(x2), wpr, 1);\r\n    t = sum.plus(divide(numerator, new Ctor(denominator), wpr, 1));\r\n\r\n    if (digitsToString(t.d).slice(0, wpr) === digitsToString(sum.d).slice(0, wpr)) {\r\n      sum = sum.times(2);\r\n\r\n      // Reverse the argument reduction. Check that e is not 0 because, besides preventing an\r\n      // unnecessary calculation, -0 + 0 = +0 and to ensure correct rounding -0 needs to stay -0.\r\n      if (e !== 0) sum = sum.plus(getLn10(Ctor, wpr + 2, pr).times(e + ''));\r\n      sum = divide(sum, new Ctor(n), wpr, 1);\r\n\r\n      // Is rm > 3 and the first 4 rounding digits 4999, or rm < 4 (or the summation has\r\n      // been repeated previously) and the first 4 rounding digits 9999?\r\n      // If so, restart the summation with a higher precision, otherwise\r\n      // e.g. with precision: 12, rounding: 1\r\n      // ln(135520028.6126091714265381533) = 18.7246299999 when it should be 18.72463.\r\n      // `wpr - guard` is the index of first rounding digit.\r\n      if (sd == null) {\r\n        if (checkRoundingDigits(sum.d, wpr - guard, rm, rep)) {\r\n          Ctor.precision = wpr += guard;\r\n          t = numerator = x = divide(x1.minus(1), x1.plus(1), wpr, 1);\r\n          x2 = finalise(x.times(x), wpr, 1);\r\n          denominator = rep = 1;\r\n        } else {\r\n          return finalise(sum, Ctor.precision = pr, rm, external = true);\r\n        }\r\n      } else {\r\n        Ctor.precision = pr;\r\n        return sum;\r\n      }\r\n    }\r\n\r\n    sum = t;\r\n    denominator += 2;\r\n  }\r\n}\r\n\r\n\r\n// ±Infinity, NaN.\r\nfunction nonFiniteToString(x) {\r\n  // Unsigned.\r\n  return String(x.s * x.s / 0);\r\n}\r\n\r\n\r\n/*\r\n * Parse the value of a new Decimal `x` from string `str`.\r\n */\r\nfunction parseDecimal(x, str) {\r\n  var e, i, len;\r\n\r\n  // TODO BigInt str: no need to check for decimal point, exponential form or leading zeros.\r\n  // Decimal point?\r\n  if ((e = str.indexOf('.')) > -1) str = str.replace('.', '');\r\n\r\n  // Exponential form?\r\n  if ((i = str.search(/e/i)) > 0) {\r\n\r\n    // Determine exponent.\r\n    if (e < 0) e = i;\r\n    e += +str.slice(i + 1);\r\n    str = str.substring(0, i);\r\n  } else if (e < 0) {\r\n\r\n    // Integer.\r\n    e = str.length;\r\n  }\r\n\r\n  // Determine leading zeros.\r\n  for (i = 0; str.charCodeAt(i) === 48; i++);\r\n\r\n  // Determine trailing zeros.\r\n  for (len = str.length; str.charCodeAt(len - 1) === 48; --len);\r\n  str = str.slice(i, len);\r\n\r\n  if (str) {\r\n    len -= i;\r\n    x.e = e = e - i - 1;\r\n    x.d = [];\r\n\r\n    // Transform base\r\n\r\n    // e is the base 10 exponent.\r\n    // i is where to slice str to get the first word of the digits array.\r\n    i = (e + 1) % LOG_BASE;\r\n    if (e < 0) i += LOG_BASE;\r\n\r\n    if (i < len) {\r\n      if (i) x.d.push(+str.slice(0, i));\r\n      for (len -= LOG_BASE; i < len;) x.d.push(+str.slice(i, i += LOG_BASE));\r\n      str = str.slice(i);\r\n      i = LOG_BASE - str.length;\r\n    } else {\r\n      i -= len;\r\n    }\r\n\r\n    for (; i--;) str += '0';\r\n    x.d.push(+str);\r\n\r\n    if (external) {\r\n\r\n      // Overflow?\r\n      if (x.e > x.constructor.maxE) {\r\n\r\n        // Infinity.\r\n        x.d = null;\r\n        x.e = NaN;\r\n\r\n      // Underflow?\r\n      } else if (x.e < x.constructor.minE) {\r\n\r\n        // Zero.\r\n        x.e = 0;\r\n        x.d = [0];\r\n        // x.constructor.underflow = true;\r\n      } // else x.constructor.underflow = false;\r\n    }\r\n  } else {\r\n\r\n    // Zero.\r\n    x.e = 0;\r\n    x.d = [0];\r\n  }\r\n\r\n  return x;\r\n}\r\n\r\n\r\n/*\r\n * Parse the value of a new Decimal `x` from a string `str`, which is not a decimal value.\r\n */\r\nfunction parseOther(x, str) {\r\n  var base, Ctor, divisor, i, isFloat, len, p, xd, xe;\r\n\r\n  if (str.indexOf('_') > -1) {\r\n    str = str.replace(/(\\d)_(?=\\d)/g, '$1');\r\n    if (isDecimal.test(str)) return parseDecimal(x, str);\r\n  } else if (str === 'Infinity' || str === 'NaN') {\r\n    if (!+str) x.s = NaN;\r\n    x.e = NaN;\r\n    x.d = null;\r\n    return x;\r\n  }\r\n\r\n  if (isHex.test(str))  {\r\n    base = 16;\r\n    str = str.toLowerCase();\r\n  } else if (isBinary.test(str))  {\r\n    base = 2;\r\n  } else if (isOctal.test(str))  {\r\n    base = 8;\r\n  } else {\r\n    throw Error(invalidArgument + str);\r\n  }\r\n\r\n  // Is there a binary exponent part?\r\n  i = str.search(/p/i);\r\n\r\n  if (i > 0) {\r\n    p = +str.slice(i + 1);\r\n    str = str.substring(2, i);\r\n  } else {\r\n    str = str.slice(2);\r\n  }\r\n\r\n  // Convert `str` as an integer then divide the result by `base` raised to a power such that the\r\n  // fraction part will be restored.\r\n  i = str.indexOf('.');\r\n  isFloat = i >= 0;\r\n  Ctor = x.constructor;\r\n\r\n  if (isFloat) {\r\n    str = str.replace('.', '');\r\n    len = str.length;\r\n    i = len - i;\r\n\r\n    // log[10](16) = 1.2041... , log[10](88) = 1.9444....\r\n    divisor = intPow(Ctor, new Ctor(base), i, i * 2);\r\n  }\r\n\r\n  xd = convertBase(str, base, BASE);\r\n  xe = xd.length - 1;\r\n\r\n  // Remove trailing zeros.\r\n  for (i = xe; xd[i] === 0; --i) xd.pop();\r\n  if (i < 0) return new Ctor(x.s * 0);\r\n  x.e = getBase10Exponent(xd, xe);\r\n  x.d = xd;\r\n  external = false;\r\n\r\n  // At what precision to perform the division to ensure exact conversion?\r\n  // maxDecimalIntegerPartDigitCount = ceil(log[10](b) * otherBaseIntegerPartDigitCount)\r\n  // log[10](2) = 0.30103, log[10](8) = 0.90309, log[10](16) = 1.20412\r\n  // E.g. ceil(1.2 * 3) = 4, so up to 4 decimal digits are needed to represent 3 hex int digits.\r\n  // maxDecimalFractionPartDigitCount = {Hex:4|Oct:3|Bin:1} * otherBaseFractionPartDigitCount\r\n  // Therefore using 4 * the number of digits of str will always be enough.\r\n  if (isFloat) x = divide(x, divisor, len * 4);\r\n\r\n  // Multiply by the binary exponent part if present.\r\n  if (p) x = x.times(Math.abs(p) < 54 ? mathpow(2, p) : Decimal.pow(2, p));\r\n  external = true;\r\n\r\n  return x;\r\n}\r\n\r\n\r\n/*\r\n * sin(x) = x - x^3/3! + x^5/5! - ...\r\n * |x| < pi/2\r\n *\r\n */\r\nfunction sine(Ctor, x) {\r\n  var k,\r\n    len = x.d.length;\r\n\r\n  if (len < 3) {\r\n    return x.isZero() ? x : taylorSeries(Ctor, 2, x, x);\r\n  }\r\n\r\n  // Argument reduction: sin(5x) = 16*sin^5(x) - 20*sin^3(x) + 5*sin(x)\r\n  // i.e. sin(x) = 16*sin^5(x/5) - 20*sin^3(x/5) + 5*sin(x/5)\r\n  // and  sin(x) = sin(x/5)(5 + sin^2(x/5)(16sin^2(x/5) - 20))\r\n\r\n  // Estimate the optimum number of times to use the argument reduction.\r\n  k = 1.4 * Math.sqrt(len);\r\n  k = k > 16 ? 16 : k | 0;\r\n\r\n  x = x.times(1 / tinyPow(5, k));\r\n  x = taylorSeries(Ctor, 2, x, x);\r\n\r\n  // Reverse argument reduction\r\n  var sin2_x,\r\n    d5 = new Ctor(5),\r\n    d16 = new Ctor(16),\r\n    d20 = new Ctor(20);\r\n  for (; k--;) {\r\n    sin2_x = x.times(x);\r\n    x = x.times(d5.plus(sin2_x.times(d16.times(sin2_x).minus(d20))));\r\n  }\r\n\r\n  return x;\r\n}\r\n\r\n\r\n// Calculate Taylor series for `cos`, `cosh`, `sin` and `sinh`.\r\nfunction taylorSeries(Ctor, n, x, y, isHyperbolic) {\r\n  var j, t, u, x2,\r\n    i = 1,\r\n    pr = Ctor.precision,\r\n    k = Math.ceil(pr / LOG_BASE);\r\n\r\n  external = false;\r\n  x2 = x.times(x);\r\n  u = new Ctor(y);\r\n\r\n  for (;;) {\r\n    t = divide(u.times(x2), new Ctor(n++ * n++), pr, 1);\r\n    u = isHyperbolic ? y.plus(t) : y.minus(t);\r\n    y = divide(t.times(x2), new Ctor(n++ * n++), pr, 1);\r\n    t = u.plus(y);\r\n\r\n    if (t.d[k] !== void 0) {\r\n      for (j = k; t.d[j] === u.d[j] && j--;);\r\n      if (j == -1) break;\r\n    }\r\n\r\n    j = u;\r\n    u = y;\r\n    y = t;\r\n    t = j;\r\n    i++;\r\n  }\r\n\r\n  external = true;\r\n  t.d.length = k + 1;\r\n\r\n  return t;\r\n}\r\n\r\n\r\n// Exponent e must be positive and non-zero.\r\nfunction tinyPow(b, e) {\r\n  var n = b;\r\n  while (--e) n *= b;\r\n  return n;\r\n}\r\n\r\n\r\n// Return the absolute value of `x` reduced to less than or equal to half pi.\r\nfunction toLessThanHalfPi(Ctor, x) {\r\n  var t,\r\n    isNeg = x.s < 0,\r\n    pi = getPi(Ctor, Ctor.precision, 1),\r\n    halfPi = pi.times(0.5);\r\n\r\n  x = x.abs();\r\n\r\n  if (x.lte(halfPi)) {\r\n    quadrant = isNeg ? 4 : 1;\r\n    return x;\r\n  }\r\n\r\n  t = x.divToInt(pi);\r\n\r\n  if (t.isZero()) {\r\n    quadrant = isNeg ? 3 : 2;\r\n  } else {\r\n    x = x.minus(t.times(pi));\r\n\r\n    // 0 <= x < pi\r\n    if (x.lte(halfPi)) {\r\n      quadrant = isOdd(t) ? (isNeg ? 2 : 3) : (isNeg ? 4 : 1);\r\n      return x;\r\n    }\r\n\r\n    quadrant = isOdd(t) ? (isNeg ? 1 : 4) : (isNeg ? 3 : 2);\r\n  }\r\n\r\n  return x.minus(pi).abs();\r\n}\r\n\r\n\r\n/*\r\n * Return the value of Decimal `x` as a string in base `baseOut`.\r\n *\r\n * If the optional `sd` argument is present include a binary exponent suffix.\r\n */\r\nfunction toStringBinary(x, baseOut, sd, rm) {\r\n  var base, e, i, k, len, roundUp, str, xd, y,\r\n    Ctor = x.constructor,\r\n    isExp = sd !== void 0;\r\n\r\n  if (isExp) {\r\n    checkInt32(sd, 1, MAX_DIGITS);\r\n    if (rm === void 0) rm = Ctor.rounding;\r\n    else checkInt32(rm, 0, 8);\r\n  } else {\r\n    sd = Ctor.precision;\r\n    rm = Ctor.rounding;\r\n  }\r\n\r\n  if (!x.isFinite()) {\r\n    str = nonFiniteToString(x);\r\n  } else {\r\n    str = finiteToString(x);\r\n    i = str.indexOf('.');\r\n\r\n    // Use exponential notation according to `toExpPos` and `toExpNeg`? No, but if required:\r\n    // maxBinaryExponent = floor((decimalExponent + 1) * log[2](10))\r\n    // minBinaryExponent = floor(decimalExponent * log[2](10))\r\n    // log[2](10) = 3.321928094887362347870319429489390175864\r\n\r\n    if (isExp) {\r\n      base = 2;\r\n      if (baseOut == 16) {\r\n        sd = sd * 4 - 3;\r\n      } else if (baseOut == 8) {\r\n        sd = sd * 3 - 2;\r\n      }\r\n    } else {\r\n      base = baseOut;\r\n    }\r\n\r\n    // Convert the number as an integer then divide the result by its base raised to a power such\r\n    // that the fraction part will be restored.\r\n\r\n    // Non-integer.\r\n    if (i >= 0) {\r\n      str = str.replace('.', '');\r\n      y = new Ctor(1);\r\n      y.e = str.length - i;\r\n      y.d = convertBase(finiteToString(y), 10, base);\r\n      y.e = y.d.length;\r\n    }\r\n\r\n    xd = convertBase(str, 10, base);\r\n    e = len = xd.length;\r\n\r\n    // Remove trailing zeros.\r\n    for (; xd[--len] == 0;) xd.pop();\r\n\r\n    if (!xd[0]) {\r\n      str = isExp ? '0p+0' : '0';\r\n    } else {\r\n      if (i < 0) {\r\n        e--;\r\n      } else {\r\n        x = new Ctor(x);\r\n        x.d = xd;\r\n        x.e = e;\r\n        x = divide(x, y, sd, rm, 0, base);\r\n        xd = x.d;\r\n        e = x.e;\r\n        roundUp = inexact;\r\n      }\r\n\r\n      // The rounding digit, i.e. the digit after the digit that may be rounded up.\r\n      i = xd[sd];\r\n      k = base / 2;\r\n      roundUp = roundUp || xd[sd + 1] !== void 0;\r\n\r\n      roundUp = rm < 4\r\n        ? (i !== void 0 || roundUp) && (rm === 0 || rm === (x.s < 0 ? 3 : 2))\r\n        : i > k || i === k && (rm === 4 || roundUp || rm === 6 && xd[sd - 1] & 1 ||\r\n          rm === (x.s < 0 ? 8 : 7));\r\n\r\n      xd.length = sd;\r\n\r\n      if (roundUp) {\r\n\r\n        // Rounding up may mean the previous digit has to be rounded up and so on.\r\n        for (; ++xd[--sd] > base - 1;) {\r\n          xd[sd] = 0;\r\n          if (!sd) {\r\n            ++e;\r\n            xd.unshift(1);\r\n          }\r\n        }\r\n      }\r\n\r\n      // Determine trailing zeros.\r\n      for (len = xd.length; !xd[len - 1]; --len);\r\n\r\n      // E.g. [4, 11, 15] becomes 4bf.\r\n      for (i = 0, str = ''; i < len; i++) str += NUMERALS.charAt(xd[i]);\r\n\r\n      // Add binary exponent suffix?\r\n      if (isExp) {\r\n        if (len > 1) {\r\n          if (baseOut == 16 || baseOut == 8) {\r\n            i = baseOut == 16 ? 4 : 3;\r\n            for (--len; len % i; len++) str += '0';\r\n            xd = convertBase(str, base, baseOut);\r\n            for (len = xd.length; !xd[len - 1]; --len);\r\n\r\n            // xd[0] will always be be 1\r\n            for (i = 1, str = '1.'; i < len; i++) str += NUMERALS.charAt(xd[i]);\r\n          } else {\r\n            str = str.charAt(0) + '.' + str.slice(1);\r\n          }\r\n        }\r\n\r\n        str =  str + (e < 0 ? 'p' : 'p+') + e;\r\n      } else if (e < 0) {\r\n        for (; ++e;) str = '0' + str;\r\n        str = '0.' + str;\r\n      } else {\r\n        if (++e > len) for (e -= len; e-- ;) str += '0';\r\n        else if (e < len) str = str.slice(0, e) + '.' + str.slice(e);\r\n      }\r\n    }\r\n\r\n    str = (baseOut == 16 ? '0x' : baseOut == 2 ? '0b' : baseOut == 8 ? '0o' : '') + str;\r\n  }\r\n\r\n  return x.s < 0 ? '-' + str : str;\r\n}\r\n\r\n\r\n// Does not strip trailing zeros.\r\nfunction truncate(arr, len) {\r\n  if (arr.length > len) {\r\n    arr.length = len;\r\n    return true;\r\n  }\r\n}\r\n\r\n\r\n// Decimal methods\r\n\r\n\r\n/*\r\n *  abs\r\n *  acos\r\n *  acosh\r\n *  add\r\n *  asin\r\n *  asinh\r\n *  atan\r\n *  atanh\r\n *  atan2\r\n *  cbrt\r\n *  ceil\r\n *  clamp\r\n *  clone\r\n *  config\r\n *  cos\r\n *  cosh\r\n *  div\r\n *  exp\r\n *  floor\r\n *  hypot\r\n *  ln\r\n *  log\r\n *  log2\r\n *  log10\r\n *  max\r\n *  min\r\n *  mod\r\n *  mul\r\n *  pow\r\n *  random\r\n *  round\r\n *  set\r\n *  sign\r\n *  sin\r\n *  sinh\r\n *  sqrt\r\n *  sub\r\n *  sum\r\n *  tan\r\n *  tanh\r\n *  trunc\r\n */\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the absolute value of `x`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction abs(x) {\r\n  return new this(x).abs();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the arccosine in radians of `x`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction acos(x) {\r\n  return new this(x).acos();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the inverse of the hyperbolic cosine of `x`, rounded to\r\n * `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal} A value in radians.\r\n *\r\n */\r\nfunction acosh(x) {\r\n  return new this(x).acosh();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the sum of `x` and `y`, rounded to `precision` significant\r\n * digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n * y {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction add(x, y) {\r\n  return new this(x).plus(y);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the arcsine in radians of `x`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction asin(x) {\r\n  return new this(x).asin();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the inverse of the hyperbolic sine of `x`, rounded to\r\n * `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal} A value in radians.\r\n *\r\n */\r\nfunction asinh(x) {\r\n  return new this(x).asinh();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the arctangent in radians of `x`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction atan(x) {\r\n  return new this(x).atan();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the inverse of the hyperbolic tangent of `x`, rounded to\r\n * `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal} A value in radians.\r\n *\r\n */\r\nfunction atanh(x) {\r\n  return new this(x).atanh();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the arctangent in radians of `y/x` in the range -pi to pi\r\n * (inclusive), rounded to `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-pi, pi]\r\n *\r\n * y {number|string|bigint|Decimal} The y-coordinate.\r\n * x {number|string|bigint|Decimal} The x-coordinate.\r\n *\r\n * atan2(±0, -0)               = ±pi\r\n * atan2(±0, +0)               = ±0\r\n * atan2(±0, -x)               = ±pi for x > 0\r\n * atan2(±0, x)                = ±0 for x > 0\r\n * atan2(-y, ±0)               = -pi/2 for y > 0\r\n * atan2(y, ±0)                = pi/2 for y > 0\r\n * atan2(±y, -Infinity)        = ±pi for finite y > 0\r\n * atan2(±y, +Infinity)        = ±0 for finite y > 0\r\n * atan2(±Infinity, x)         = ±pi/2 for finite x\r\n * atan2(±Infinity, -Infinity) = ±3*pi/4\r\n * atan2(±Infinity, +Infinity) = ±pi/4\r\n * atan2(NaN, x) = NaN\r\n * atan2(y, NaN) = NaN\r\n *\r\n */\r\nfunction atan2(y, x) {\r\n  y = new this(y);\r\n  x = new this(x);\r\n  var r,\r\n    pr = this.precision,\r\n    rm = this.rounding,\r\n    wpr = pr + 4;\r\n\r\n  // Either NaN\r\n  if (!y.s || !x.s) {\r\n    r = new this(NaN);\r\n\r\n  // Both ±Infinity\r\n  } else if (!y.d && !x.d) {\r\n    r = getPi(this, wpr, 1).times(x.s > 0 ? 0.25 : 0.75);\r\n    r.s = y.s;\r\n\r\n  // x is ±Infinity or y is ±0\r\n  } else if (!x.d || y.isZero()) {\r\n    r = x.s < 0 ? getPi(this, pr, rm) : new this(0);\r\n    r.s = y.s;\r\n\r\n  // y is ±Infinity or x is ±0\r\n  } else if (!y.d || x.isZero()) {\r\n    r = getPi(this, wpr, 1).times(0.5);\r\n    r.s = y.s;\r\n\r\n  // Both non-zero and finite\r\n  } else if (x.s < 0) {\r\n    this.precision = wpr;\r\n    this.rounding = 1;\r\n    r = this.atan(divide(y, x, wpr, 1));\r\n    x = getPi(this, wpr, 1);\r\n    this.precision = pr;\r\n    this.rounding = rm;\r\n    r = y.s < 0 ? r.minus(x) : r.plus(x);\r\n  } else {\r\n    r = this.atan(divide(y, x, wpr, 1));\r\n  }\r\n\r\n  return r;\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the cube root of `x`, rounded to `precision` significant\r\n * digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction cbrt(x) {\r\n  return new this(x).cbrt();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` rounded to an integer using `ROUND_CEIL`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction ceil(x) {\r\n  return finalise(x = new this(x), x.e + 1, 2);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` clamped to the range delineated by `min` and `max`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n * min {number|string|bigint|Decimal}\r\n * max {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction clamp(x, min, max) {\r\n  return new this(x).clamp(min, max);\r\n}\r\n\r\n\r\n/*\r\n * Configure global settings for a Decimal constructor.\r\n *\r\n * `obj` is an object with one or more of the following properties,\r\n *\r\n *   precision  {number}\r\n *   rounding   {number}\r\n *   toExpNeg   {number}\r\n *   toExpPos   {number}\r\n *   maxE       {number}\r\n *   minE       {number}\r\n *   modulo     {number}\r\n *   crypto     {boolean|number}\r\n *   defaults   {true}\r\n *\r\n * E.g. Decimal.config({ precision: 20, rounding: 4 })\r\n *\r\n */\r\nfunction config(obj) {\r\n  if (!obj || typeof obj !== 'object') throw Error(decimalError + 'Object expected');\r\n  var i, p, v,\r\n    useDefaults = obj.defaults === true,\r\n    ps = [\r\n      'precision', 1, MAX_DIGITS,\r\n      'rounding', 0, 8,\r\n      'toExpNeg', -EXP_LIMIT, 0,\r\n      'toExpPos', 0, EXP_LIMIT,\r\n      'maxE', 0, EXP_LIMIT,\r\n      'minE', -EXP_LIMIT, 0,\r\n      'modulo', 0, 9\r\n    ];\r\n\r\n  for (i = 0; i < ps.length; i += 3) {\r\n    if (p = ps[i], useDefaults) this[p] = DEFAULTS[p];\r\n    if ((v = obj[p]) !== void 0) {\r\n      if (mathfloor(v) === v && v >= ps[i + 1] && v <= ps[i + 2]) this[p] = v;\r\n      else throw Error(invalidArgument + p + ': ' + v);\r\n    }\r\n  }\r\n\r\n  if (p = 'crypto', useDefaults) this[p] = DEFAULTS[p];\r\n  if ((v = obj[p]) !== void 0) {\r\n    if (v === true || v === false || v === 0 || v === 1) {\r\n      if (v) {\r\n        if (typeof crypto != 'undefined' && crypto &&\r\n          (crypto.getRandomValues || crypto.randomBytes)) {\r\n          this[p] = true;\r\n        } else {\r\n          throw Error(cryptoUnavailable);\r\n        }\r\n      } else {\r\n        this[p] = false;\r\n      }\r\n    } else {\r\n      throw Error(invalidArgument + p + ': ' + v);\r\n    }\r\n  }\r\n\r\n  return this;\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the cosine of `x`, rounded to `precision` significant\r\n * digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal} A value in radians.\r\n *\r\n */\r\nfunction cos(x) {\r\n  return new this(x).cos();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the hyperbolic cosine of `x`, rounded to precision\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal} A value in radians.\r\n *\r\n */\r\nfunction cosh(x) {\r\n  return new this(x).cosh();\r\n}\r\n\r\n\r\n/*\r\n * Create and return a Decimal constructor with the same configuration properties as this Decimal\r\n * constructor.\r\n *\r\n */\r\nfunction clone(obj) {\r\n  var i, p, ps;\r\n\r\n  /*\r\n   * The Decimal constructor and exported function.\r\n   * Return a new Decimal instance.\r\n   *\r\n   * v {number|string|bigint|Decimal} A numeric value.\r\n   *\r\n   */\r\n  function Decimal(v) {\r\n    var e, i, t,\r\n      x = this;\r\n\r\n    // Decimal called without new.\r\n    if (!(x instanceof Decimal)) return new Decimal(v);\r\n\r\n    // Retain a reference to this Decimal constructor, and shadow Decimal.prototype.constructor\r\n    // which points to Object.\r\n    x.constructor = Decimal;\r\n\r\n    if (isDecimalInstance(v)) {\r\n      x.s = v.s;\r\n\r\n      if (external) {\r\n        if (!v.d || v.e > Decimal.maxE) {\r\n\r\n          // Infinity.\r\n          x.e = NaN;\r\n          x.d = null;\r\n        } else if (v.e < Decimal.minE) {\r\n\r\n          // Zero.\r\n          x.e = 0;\r\n          x.d = [0];\r\n        } else {\r\n          x.e = v.e;\r\n          x.d = v.d.slice();\r\n        }\r\n      } else {\r\n        x.e = v.e;\r\n        x.d = v.d ? v.d.slice() : v.d;\r\n      }\r\n\r\n      return;\r\n    }\r\n\r\n    t = typeof v;\r\n\r\n    if (t === 'number') {\r\n      if (v === 0) {\r\n        x.s = 1 / v < 0 ? -1 : 1;\r\n        x.e = 0;\r\n        x.d = [0];\r\n        return;\r\n      }\r\n\r\n      if (v < 0) {\r\n        v = -v;\r\n        x.s = -1;\r\n      } else {\r\n        x.s = 1;\r\n      }\r\n\r\n      // Fast path for small integers.\r\n      if (v === ~~v && v < 1e7) {\r\n        for (e = 0, i = v; i >= 10; i /= 10) e++;\r\n\r\n        if (external) {\r\n          if (e > Decimal.maxE) {\r\n            x.e = NaN;\r\n            x.d = null;\r\n          } else if (e < Decimal.minE) {\r\n            x.e = 0;\r\n            x.d = [0];\r\n          } else {\r\n            x.e = e;\r\n            x.d = [v];\r\n          }\r\n        } else {\r\n          x.e = e;\r\n          x.d = [v];\r\n        }\r\n\r\n        return;\r\n      }\r\n\r\n      // Infinity or NaN?\r\n      if (v * 0 !== 0) {\r\n        if (!v) x.s = NaN;\r\n        x.e = NaN;\r\n        x.d = null;\r\n        return;\r\n      }\r\n\r\n      return parseDecimal(x, v.toString());\r\n    }\r\n\r\n    if (t === 'string') {\r\n      if ((i = v.charCodeAt(0)) === 45) {  // minus sign\r\n        v = v.slice(1);\r\n        x.s = -1;\r\n      } else {\r\n        if (i === 43) v = v.slice(1);  // plus sign\r\n        x.s = 1;\r\n      }\r\n\r\n      return isDecimal.test(v) ? parseDecimal(x, v) : parseOther(x, v);\r\n    }\r\n\r\n    if (t === 'bigint') {\r\n      if (v < 0) {\r\n        v = -v;\r\n        x.s = -1;\r\n      } else {\r\n        x.s = 1;\r\n      }\r\n\r\n      return parseDecimal(x, v.toString());\r\n    }\r\n\r\n    throw Error(invalidArgument + v);\r\n  }\r\n\r\n  Decimal.prototype = P;\r\n\r\n  Decimal.ROUND_UP = 0;\r\n  Decimal.ROUND_DOWN = 1;\r\n  Decimal.ROUND_CEIL = 2;\r\n  Decimal.ROUND_FLOOR = 3;\r\n  Decimal.ROUND_HALF_UP = 4;\r\n  Decimal.ROUND_HALF_DOWN = 5;\r\n  Decimal.ROUND_HALF_EVEN = 6;\r\n  Decimal.ROUND_HALF_CEIL = 7;\r\n  Decimal.ROUND_HALF_FLOOR = 8;\r\n  Decimal.EUCLID = 9;\r\n\r\n  Decimal.config = Decimal.set = config;\r\n  Decimal.clone = clone;\r\n  Decimal.isDecimal = isDecimalInstance;\r\n\r\n  Decimal.abs = abs;\r\n  Decimal.acos = acos;\r\n  Decimal.acosh = acosh;        // ES6\r\n  Decimal.add = add;\r\n  Decimal.asin = asin;\r\n  Decimal.asinh = asinh;        // ES6\r\n  Decimal.atan = atan;\r\n  Decimal.atanh = atanh;        // ES6\r\n  Decimal.atan2 = atan2;\r\n  Decimal.cbrt = cbrt;          // ES6\r\n  Decimal.ceil = ceil;\r\n  Decimal.clamp = clamp;\r\n  Decimal.cos = cos;\r\n  Decimal.cosh = cosh;          // ES6\r\n  Decimal.div = div;\r\n  Decimal.exp = exp;\r\n  Decimal.floor = floor;\r\n  Decimal.hypot = hypot;        // ES6\r\n  Decimal.ln = ln;\r\n  Decimal.log = log;\r\n  Decimal.log10 = log10;        // ES6\r\n  Decimal.log2 = log2;          // ES6\r\n  Decimal.max = max;\r\n  Decimal.min = min;\r\n  Decimal.mod = mod;\r\n  Decimal.mul = mul;\r\n  Decimal.pow = pow;\r\n  Decimal.random = random;\r\n  Decimal.round = round;\r\n  Decimal.sign = sign;          // ES6\r\n  Decimal.sin = sin;\r\n  Decimal.sinh = sinh;          // ES6\r\n  Decimal.sqrt = sqrt;\r\n  Decimal.sub = sub;\r\n  Decimal.sum = sum;\r\n  Decimal.tan = tan;\r\n  Decimal.tanh = tanh;          // ES6\r\n  Decimal.trunc = trunc;        // ES6\r\n\r\n  if (obj === void 0) obj = {};\r\n  if (obj) {\r\n    if (obj.defaults !== true) {\r\n      ps = ['precision', 'rounding', 'toExpNeg', 'toExpPos', 'maxE', 'minE', 'modulo', 'crypto'];\r\n      for (i = 0; i < ps.length;) if (!obj.hasOwnProperty(p = ps[i++])) obj[p] = this[p];\r\n    }\r\n  }\r\n\r\n  Decimal.config(obj);\r\n\r\n  return Decimal;\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` divided by `y`, rounded to `precision` significant\r\n * digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n * y {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction div(x, y) {\r\n  return new this(x).div(y);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the natural exponential of `x`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal} The power to which to raise the base of the natural log.\r\n *\r\n */\r\nfunction exp(x) {\r\n  return new this(x).exp();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` round to an integer using `ROUND_FLOOR`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction floor(x) {\r\n  return finalise(x = new this(x), x.e + 1, 3);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the square root of the sum of the squares of the arguments,\r\n * rounded to `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * hypot(a, b, ...) = sqrt(a^2 + b^2 + ...)\r\n *\r\n * arguments {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction hypot() {\r\n  var i, n,\r\n    t = new this(0);\r\n\r\n  external = false;\r\n\r\n  for (i = 0; i < arguments.length;) {\r\n    n = new this(arguments[i++]);\r\n    if (!n.d) {\r\n      if (n.s) {\r\n        external = true;\r\n        return new this(1 / 0);\r\n      }\r\n      t = n;\r\n    } else if (t.d) {\r\n      t = t.plus(n.times(n));\r\n    }\r\n  }\r\n\r\n  external = true;\r\n\r\n  return t.sqrt();\r\n}\r\n\r\n\r\n/*\r\n * Return true if object is a Decimal instance (where Decimal is any Decimal constructor),\r\n * otherwise return false.\r\n *\r\n */\r\nfunction isDecimalInstance(obj) {\r\n  return obj instanceof Decimal || obj && obj.toStringTag === tag || false;\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the natural logarithm of `x`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction ln(x) {\r\n  return new this(x).ln();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the log of `x` to the base `y`, or to base 10 if no base\r\n * is specified, rounded to `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * log[y](x)\r\n *\r\n * x {number|string|bigint|Decimal} The argument of the logarithm.\r\n * y {number|string|bigint|Decimal} The base of the logarithm.\r\n *\r\n */\r\nfunction log(x, y) {\r\n  return new this(x).log(y);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the base 2 logarithm of `x`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction log2(x) {\r\n  return new this(x).log(2);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the base 10 logarithm of `x`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction log10(x) {\r\n  return new this(x).log(10);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the maximum of the arguments.\r\n *\r\n * arguments {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction max() {\r\n  return maxOrMin(this, arguments, -1);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the minimum of the arguments.\r\n *\r\n * arguments {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction min() {\r\n  return maxOrMin(this, arguments, 1);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` modulo `y`, rounded to `precision` significant digits\r\n * using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n * y {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction mod(x, y) {\r\n  return new this(x).mod(y);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` multiplied by `y`, rounded to `precision` significant\r\n * digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n * y {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction mul(x, y) {\r\n  return new this(x).mul(y);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` raised to the power `y`, rounded to precision\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal} The base.\r\n * y {number|string|bigint|Decimal} The exponent.\r\n *\r\n */\r\nfunction pow(x, y) {\r\n  return new this(x).pow(y);\r\n}\r\n\r\n\r\n/*\r\n * Returns a new Decimal with a random value equal to or greater than 0 and less than 1, and with\r\n * `sd`, or `Decimal.precision` if `sd` is omitted, significant digits (or less if trailing zeros\r\n * are produced).\r\n *\r\n * [sd] {number} Significant digits. Integer, 0 to MAX_DIGITS inclusive.\r\n *\r\n */\r\nfunction random(sd) {\r\n  var d, e, k, n,\r\n    i = 0,\r\n    r = new this(1),\r\n    rd = [];\r\n\r\n  if (sd === void 0) sd = this.precision;\r\n  else checkInt32(sd, 1, MAX_DIGITS);\r\n\r\n  k = Math.ceil(sd / LOG_BASE);\r\n\r\n  if (!this.crypto) {\r\n    for (; i < k;) rd[i++] = Math.random() * 1e7 | 0;\r\n\r\n  // Browsers supporting crypto.getRandomValues.\r\n  } else if (crypto.getRandomValues) {\r\n    d = crypto.getRandomValues(new Uint32Array(k));\r\n\r\n    for (; i < k;) {\r\n      n = d[i];\r\n\r\n      // 0 <= n < 4294967296\r\n      // Probability n >= 4.29e9, is 4967296 / 4294967296 = 0.00116 (1 in 865).\r\n      if (n >= 4.29e9) {\r\n        d[i] = crypto.getRandomValues(new Uint32Array(1))[0];\r\n      } else {\r\n\r\n        // 0 <= n <= 4289999999\r\n        // 0 <= (n % 1e7) <= 9999999\r\n        rd[i++] = n % 1e7;\r\n      }\r\n    }\r\n\r\n  // Node.js supporting crypto.randomBytes.\r\n  } else if (crypto.randomBytes) {\r\n\r\n    // buffer\r\n    d = crypto.randomBytes(k *= 4);\r\n\r\n    for (; i < k;) {\r\n\r\n      // 0 <= n < 2147483648\r\n      n = d[i] + (d[i + 1] << 8) + (d[i + 2] << 16) + ((d[i + 3] & 0x7f) << 24);\r\n\r\n      // Probability n >= 2.14e9, is 7483648 / 2147483648 = 0.0035 (1 in 286).\r\n      if (n >= 2.14e9) {\r\n        crypto.randomBytes(4).copy(d, i);\r\n      } else {\r\n\r\n        // 0 <= n <= 2139999999\r\n        // 0 <= (n % 1e7) <= 9999999\r\n        rd.push(n % 1e7);\r\n        i += 4;\r\n      }\r\n    }\r\n\r\n    i = k / 4;\r\n  } else {\r\n    throw Error(cryptoUnavailable);\r\n  }\r\n\r\n  k = rd[--i];\r\n  sd %= LOG_BASE;\r\n\r\n  // Convert trailing digits to zeros according to sd.\r\n  if (k && sd) {\r\n    n = mathpow(10, LOG_BASE - sd);\r\n    rd[i] = (k / n | 0) * n;\r\n  }\r\n\r\n  // Remove trailing words which are zero.\r\n  for (; rd[i] === 0; i--) rd.pop();\r\n\r\n  // Zero?\r\n  if (i < 0) {\r\n    e = 0;\r\n    rd = [0];\r\n  } else {\r\n    e = -1;\r\n\r\n    // Remove leading words which are zero and adjust exponent accordingly.\r\n    for (; rd[0] === 0; e -= LOG_BASE) rd.shift();\r\n\r\n    // Count the digits of the first word of rd to determine leading zeros.\r\n    for (k = 1, n = rd[0]; n >= 10; n /= 10) k++;\r\n\r\n    // Adjust the exponent for leading zeros of the first word of rd.\r\n    if (k < LOG_BASE) e -= LOG_BASE - k;\r\n  }\r\n\r\n  r.e = e;\r\n  r.d = rd;\r\n\r\n  return r;\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` rounded to an integer using rounding mode `rounding`.\r\n *\r\n * To emulate `Math.round`, set rounding to 7 (ROUND_HALF_CEIL).\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction round(x) {\r\n  return finalise(x = new this(x), x.e + 1, this.rounding);\r\n}\r\n\r\n\r\n/*\r\n * Return\r\n *   1    if x > 0,\r\n *  -1    if x < 0,\r\n *   0    if x is 0,\r\n *  -0    if x is -0,\r\n *   NaN  otherwise\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction sign(x) {\r\n  x = new this(x);\r\n  return x.d ? (x.d[0] ? x.s : 0 * x.s) : x.s || NaN;\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the sine of `x`, rounded to `precision` significant digits\r\n * using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal} A value in radians.\r\n *\r\n */\r\nfunction sin(x) {\r\n  return new this(x).sin();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the hyperbolic sine of `x`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal} A value in radians.\r\n *\r\n */\r\nfunction sinh(x) {\r\n  return new this(x).sinh();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the square root of `x`, rounded to `precision` significant\r\n * digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction sqrt(x) {\r\n  return new this(x).sqrt();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` minus `y`, rounded to `precision` significant digits\r\n * using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n * y {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction sub(x, y) {\r\n  return new this(x).sub(y);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the sum of the arguments, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * Only the result is rounded, not the intermediate calculations.\r\n *\r\n * arguments {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction sum() {\r\n  var i = 0,\r\n    args = arguments,\r\n    x = new this(args[i]);\r\n\r\n  external = false;\r\n  for (; x.s && ++i < args.length;) x = x.plus(args[i]);\r\n  external = true;\r\n\r\n  return finalise(x, this.precision, this.rounding);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the tangent of `x`, rounded to `precision` significant\r\n * digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal} A value in radians.\r\n *\r\n */\r\nfunction tan(x) {\r\n  return new this(x).tan();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the hyperbolic tangent of `x`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|bigint|Decimal} A value in radians.\r\n *\r\n */\r\nfunction tanh(x) {\r\n  return new this(x).tanh();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` truncated to an integer.\r\n *\r\n * x {number|string|bigint|Decimal}\r\n *\r\n */\r\nfunction trunc(x) {\r\n  return finalise(x = new this(x), x.e + 1, 1);\r\n}\r\n\r\n\r\nP[Symbol.for('nodejs.util.inspect.custom')] = P.toString;\r\nP[Symbol.toStringTag] = 'Decimal';\r\n\r\n// Create and configure initial Decimal constructor.\r\nexport var Decimal = P.constructor = clone(DEFAULTS);\r\n\r\n// Create the internal constants from their string values.\r\nLN10 = new Decimal(LN10);\r\nPI = new Decimal(PI);\r\n\r\nexport default Decimal;\r\n","import Decimal from 'decimal.js'\n\n/**\n * Creates a Decimal instance from a value\n * @param value - The value to convert to Decimal\n * @returns A Decimal instance\n */\nexport function d(value?: Decimal.Value): Decimal.Instance {\n  if (Decimal.isDecimal(value)) {\n    return value as Decimal\n  }\n\n  return new Decimal(value === undefined ? 0 : value)\n}\n\n/**\n * Calculates the multiplier for decimal places\n * @param decimals - The number of decimal places\n * @returns A Decimal instance representing the multiplier\n */\nexport function decimalsMultiplier(decimals?: Decimal.Value): Decimal.Instance {\n  return d(10).pow(d(decimals).abs())\n}\n\n/**\n * Converts an amount to a decimal value, based on the number of decimals specified.\n * @param  {number | string} amount - The amount to convert to decimal.\n * @param  {number | string} decimals - The number of decimals to use in the conversion.\n * @returns {number} - Returns the converted amount as a number.\n */\nexport function toDecimalsAmount(amount: number | string, decimals: number | string): number {\n  const mul = decimalsMultiplier(d(decimals))\n\n  return Number(d(amount).mul(mul))\n}\n\n/**\n * Converts a bigint to an unsigned integer of the specified number of bits.\n * @param {bigint} int - The bigint to convert.\n * @param {number} bits - The number of bits to use in the conversion. Defaults to 32 bits.\n * @returns {string} - Returns the converted unsigned integer as a string.\n */\nexport function asUintN(int: bigint, bits = 32) {\n  return BigInt.asUintN(bits, BigInt(int)).toString()\n}\n\n/**\n * Converts a bigint to a signed integer of the specified number of bits.\n * @param {bigint} int - The bigint to convert.\n * @param {number} bits - The number of bits to use in the conversion. Defaults to 32 bits.\n * @returns {number} - Returns the converted signed integer as a number.\n */\nexport function asIntN(int: bigint, bits = 32) {\n  return Number(BigInt.asIntN(bits, BigInt(int)))\n}\n\n/**\n * Converts an amount in decimals to its corresponding numerical value.\n * @param {number|string} amount - The amount to convert.\n * @param {number|string} decimals - The number of decimal places used in the amount.\n * @returns {number} - Returns the converted numerical value.\n */\nexport function fromDecimalsAmount(amount: number | string, decimals: number | string): number {\n  const mul = decimalsMultiplier(d(decimals))\n\n  return Number(d(amount).div(mul))\n}\n\n/**\n * Handles precision calculation for scientific notation addition\n * @param num - The number to process\n * @param precision - The desired precision\n * @param autoFix - Whether to automatically fix the precision\n * @returns The processed number as a string\n */\nconst fixDEAdd = (num: any, precision: any, autoFix = true) => {\n  if (`${num}` === '0') {\n    if (!parseFloat(precision) || !autoFix) return '0'\n    return '0.'.padEnd(precision + 2, '0')\n  }\n  if (!num) return '--'\n\n  const number = parseFloat(num)\n  const strN = num.toString()\n  const flag = number < 0\n  let result = strN\n\n  if (strN.toLowerCase().includes('e')) {\n    const n = strN.match(/(\\d+?)(?:\\.(\\d*))?e([+-])(\\d+)/)\n    // Avoid array out-of-bounds errors, return the original value if matching fails\n    if (!n) {\n      return num.toString() // Return original value if pattern matching fails to avoid array out of bounds\n    }\n\n    const nl = n[1] || '0' // Left part of decimal point\n    const nr = n[2] || '' // Right part of decimal point\n    const type = n[3] // '+' or '-'\n    const floatN = parseInt(n[4], 10) // Exponent part\n\n    let params = ''\n    let pr = nr.substring(floatN) || ''\n    if (pr) pr = `.${pr}`\n\n    if (type !== '-') {\n      for (let i = 0; i < floatN; i++) {\n        params += nr[i] || '0'\n      }\n      result = nl + params + pr\n    } else {\n      let strL = '0'\n      for (let i = 0; i < floatN; i++) {\n        params = (nl[nl.length - i - 1] || '0') + params\n      }\n      if (nl.length > floatN) {\n        strL = nl.substring(0, nl.length - floatN)\n      }\n      result = `${strL}.${params}${nr}`\n    }\n  }\n\n  if (precision && autoFix) {\n    let pal = `${result.split('.')[0]}.`\n    const par = result.split('.')[1] || ''\n\n    for (let i = 0; i < precision; i++) {\n      pal += par[i] || '0'\n    }\n    result = pal\n  }\n\n  return `${flag ? '-' : ''}${result}`\n}\n\n/**\n * Converts a scientific notation number string to decimal form\n * @param numStr - The number string to convert\n * @param precision - The precision (number of decimal places to keep)\n * @returns The decimal form string\n */\nexport function convertScientificToDecimal(numStr?: string, precision = 9): string {\n  if (numStr === undefined) {\n    return ''\n  }\n  // Convert to lowercase for consistency\n  const newNum = numStr?.toLowerCase()\n\n  // Check if it contains scientific notation 'e'\n  if (newNum.includes('e')) {\n    // Check if it's in 'e+' format\n    if (newNum.includes('+')) {\n      return fixDEAdd(newNum, precision)\n    }\n\n    // Handle 'e-' case\n    const [base, exponentStr] = newNum.split('e')\n    let integerPart = base\n    const exponent = Math.abs(parseInt(exponentStr, 10)) // Get absolute value of exponent part\n    let zeros = ''\n    let integerLength = integerPart.length\n\n    // Check for decimal point and remove it\n    if (base.includes('.')) {\n      const [intPart, fracPart] = base.split('.')\n      integerPart = intPart + fracPart // Remove decimal point\n      integerLength = intPart.length\n    }\n\n    // Generate the necessary leading zeros\n    for (let i = 0; i < exponent - integerLength; i++) {\n      zeros += '0'\n    }\n\n    // Combine into decimal format\n    return `0.${zeros}${integerPart}`.slice(0, precision + 2) // precision + 2 ensures enough decimal places\n  }\n\n  // If not scientific notation, return as is\n  return numStr\n}\n","// eslint-disable-next-line import/no-import-module-exports\n\nconst HEX_REGEXP = /^[-+]?[0-9A-Fa-f]+\\.?[0-9A-Fa-f]*?$/\n\nexport function addHexPrefix(hex: string): string {\n  return !hex.startsWith('0x') ? `0x${hex}` : hex\n}\n\nexport function removeHexPrefix(hex: string): string {\n  return hex.startsWith('0x') ? `${hex.slice(2)}` : hex\n}\n\nexport function shortString(str: string, start = 4, end = 4) {\n  const slen = Math.max(start, 1)\n  const elen = Math.max(end, 1)\n\n  return `${str.slice(0, slen + 2)} ... ${str.slice(-elen)}`\n}\n\nexport function shortAddress(address: string, start = 4, end = 4) {\n  return shortString(addHexPrefix(address), start, end)\n}\n\nexport function checkAddress(address: any, options: { leadingZero: boolean } = { leadingZero: true }): boolean {\n  if (typeof address !== 'string') {\n    return false\n  }\n  let str = address\n\n  if (options.leadingZero) {\n    if (!address.startsWith('0x')) {\n      return false\n    }\n    str = str.substring(2)\n  }\n\n  return HEX_REGEXP.test(str)\n}\n\n/**\n * Attempts to turn a value into a `Buffer`. As input it supports `Buffer`, `String`, `Number`, null/undefined, `BN` and other objects with a `toArray()` method.\n * @param v the value\n */\nexport function toBuffer(v: any): Buffer {\n  if (!Buffer.isBuffer(v)) {\n    if (Array.isArray(v)) {\n      v = Buffer.from(v)\n    } else if (typeof v === 'string') {\n      if (exports.isHexString(v)) {\n        v = Buffer.from(exports.padToEven(exports.stripHexPrefix(v)), 'hex')\n      } else {\n        v = Buffer.from(v)\n      }\n    } else if (typeof v === 'number') {\n      v = exports.intToBuffer(v)\n    } else if (v === null || v === undefined) {\n      v = Buffer.allocUnsafe(0)\n    } else if (v.toArray) {\n      // converts a BN to a Buffer\n      v = Buffer.from(v.toArray())\n    } else {\n      throw new Error(`Invalid type`)\n    }\n  }\n  return v\n}\n\nexport function bufferToHex(buffer: Buffer): string {\n  return addHexPrefix(toBuffer(buffer).toString('hex'))\n}\n/**\n * '\\x02\\x00\\x00\\x00' to 2\n * @param binaryData\n */\nexport function hexToNumber(binaryData: string) {\n  const buffer = new ArrayBuffer(4)\n  const view = new DataView(buffer)\n\n  for (let i = 0; i < binaryData.length; i++) {\n    view.setUint8(i, binaryData.charCodeAt(i))\n  }\n\n  const number = view.getUint32(0, true) //\n\n  return number\n}\n\nexport function utf8to16(str: string) {\n  let out\n  let i\n  let c\n  let char2\n  let char3\n  out = ''\n  const len = str.length\n  i = 0\n  while (i < len) {\n    c = str.charCodeAt(i++)\n    switch (c >> 4) {\n      case 0:\n      case 1:\n      case 2:\n      case 3:\n      case 4:\n      case 5:\n      case 6:\n      case 7:\n        out += str.charAt(i - 1)\n        break\n      case 12:\n      case 13:\n        char2 = str.charCodeAt(i++)\n        out += String.fromCharCode(((c & 0x1f) << 6) | (char2 & 0x3f))\n        break\n      case 14:\n        char2 = str.charCodeAt(i++)\n        char3 = str.charCodeAt(i++)\n        out += String.fromCharCode(((c & 0x0f) << 12) | ((char2 & 0x3f) << 6) | ((char3 & 0x3f) << 0))\n        break\n    }\n  }\n  return out\n}\n\nexport function hexToString(str: string) {\n  let val = ''\n  const newStr = removeHexPrefix(str)\n\n  const len = newStr.length / 2\n  for (let i = 0; i < len; i++) {\n    val += String.fromCharCode(parseInt(newStr.substr(i * 2, 2), 16))\n  }\n  return utf8to16(val)\n}\n\nexport function convertU64BytesToDecimal(bytes: number[]): string {\n  if (bytes.length !== 8) {\n    throw new Error('Invalid u64 byte array length')\n  }\n  const hexString = bytes\n    .map((b) => b.toString(16).padStart(2, '0'))\n    .reverse()\n    .join('')\n  return BigInt(`0x${hexString}`).toString()\n}\n","import type { TransactionObjectArgument } from '@mysten/sui/transactions'\nimport BN from 'bn.js'\nimport type { SuiAddressType, SuiObjectIdType } from './sui'\n\n/**\n * The maximum tick index supported by the clmmpool program.\n * @category Constants\n */\nexport const MAX_TICK_INDEX = 443636\n\n/**\n * The minimum tick index supported by the clmmpool program.\n * @category Constants\n */\nexport const MIN_TICK_INDEX = -443636\n\n/**\n * The maximum sqrt-price supported by the clmmpool program.\n * @category Constants\n */\nexport const MAX_SQRT_PRICE = '79226673515401279992447579055'\n\n/**\n * The number of initialized ticks that a tick-array account can hold.\n * @category Constants\n */\nexport const TICK_ARRAY_SIZE = 64\n\n/**\n * The minimum sqrt-price supported by the clmmpool program.\n * @category Constants\n */\nexport const MIN_SQRT_PRICE = '4295048016'\n\n/**\n * The denominator which the fee rate is divided on.\n * @category Constants\n */\nexport const FEE_RATE_DENOMINATOR = new BN(1_000_000)\n\n/**\n * Represents input data for adding liquidity to a pool.\n */\nexport type LiquidityInput = {\n  /**\n   * The amount of coin A.\n   */\n  coin_amount_a: string\n\n  /**\n   * The amount of coin B.\n   */\n  coin_amount_b: string\n\n  /**\n   * The maximum amount of token A.\n   */\n  coin_amount_limit_a: string\n\n  /**\n   * The maximum amount of token B.\n   */\n  coin_amount_limit_b: string\n\n  /**\n   * The liquidity amount.\n   */\n  liquidity_amount: string\n\n  /**\n   * Whether to fix the amount of token A.\n   */\n  fix_amount_a: boolean\n}\n\n/**\n * Represents a coin asset with address, object ID, and balance information.\n */\nexport type CoinAsset = {\n  /**\n   * The address type of the coin asset.\n   */\n  coin_type: string\n\n  /**\n   * The object identifier of the coin asset.\n   */\n  coin_object_id: SuiObjectIdType\n\n  /**\n   * The balance amount of the coin asset.\n   */\n  balance: bigint\n}\n\nexport type BuildCoinResult = {\n  target_coin: TransactionObjectArgument\n  selected_coins: string[]\n  remain_coins: CoinAsset[]\n  is_mint_zero_coin: boolean\n  target_coin_amount: string\n  original_spited_coin?: TransactionObjectArgument\n}\n\nexport type CoinInputInterval = {\n  amount_second: bigint\n  amount_first: bigint\n}\n\nexport type CoinAmounts = {\n  coin_amount_a: string\n  coin_amount_b: string\n}\n\nexport type MultiCoinInput = {\n  amount_coin_array: { coin_object_id: TransactionObjectArgument; amount: string; used: boolean }[]\n  coin_type: string\n  remain_coins: CoinAsset[]\n}\n\nexport enum PositionStatus {\n  BelowRange,\n  InRange,\n  AboveRange,\n}\n\n/**\n * Represents a pair of coins used in a financial context.\n */\nexport type CoinPairType = {\n  /**\n   * The address type of the coin a in the pair.\n   */\n  coin_type_a: SuiAddressType\n\n  /**\n   * The address type of the coin b in the pair.\n   */\n  coin_type_b: SuiAddressType\n}\n","import type { TransactionArgument } from '@mysten/sui/transactions'\nimport Decimal from 'decimal.js'\n\n/**\n * Represents a SUI address, which is a string.\n */\nexport type SuiAddressType = string\n/**\n * Represents a SUI object identifier, which is a string.\n */\nexport type SuiObjectIdType = string\n/**\n * Represents a BigNumber, which can be a Decimal.Value, number, or string.\n */\nexport type BigNumber = Decimal.Value | number | string\n/**\n * The address representing the clock in the system.\n */\nexport const CLOCK_ADDRESS = '0x0000000000000000000000000000000000000000000000000000000000000006'\n\n/**\n * The address for CoinInfo module.\n */\nexport const CoinInfoAddress = '0x1::coin::CoinInfo'\n/**\n * The address for CoinStore module.\n */\nexport const CoinStoreAddress = '0x1::coin::CoinStore'\n\n/**\n * Represents a SUI resource, which can be of any type.\n */\nexport type SuiResource = any\n\nexport const FullRpcUrlMainnet = 'https://fullnode.mainnet.sui.io:443'\nexport const FullRpcUrlTestnet = 'https://fullnode.testest.sui.io:443'\nexport const DefaultProviders = [\n  'CETUS',\n  'TURBOS',\n  'STEAMM',\n  'SPRINGSUI',\n  'HAEDAL',\n  'FLOWX',\n  'AFTERMATH',\n  'ALPHAFI',\n  'BLUEFIN',\n  'METASTABLE',\n  'VOLO',\n  'SCALLOP',\n  'KRIYA',\n  'FLOWXV3',\n  'DEEPBOOKV3',\n  'AFSUI',\n  'BLUEMOVE',\n  'KRIYAV3',\n  'HAEDALPMM',\n  'OBRIC',\n]\n\n/**\n * Represents a package containing specific configuration or data.\n * @template T - The type of configuration or data contained in the package.\n */\nexport type Package<T = undefined> = {\n  /**\n   * The unique identifier of the package.\n   */\n  package_id: string\n  /**\n   * the package was published.\n   */\n  published_at: string\n  /**\n   * The version number of the package (optional).\n   */\n  version?: number\n  /**\n   * The configuration or data contained in the package (optional).\n   */\n  config?: T\n}\n\n/**\n * Represents a paginated data page with optional cursor and limit.\n */\nexport type DataPage<T> = {\n  data: T[]\n  next_cursor?: any\n  has_next_page: boolean\n}\n\n/**\n * Represents query parameters for pagination.\n */\nexport type PageQuery = {\n  cursor?: any\n  limit?: number | null\n}\n\n/**\n * Represents arguments for pagination, with options for fetching all data or using PageQuery.\n */\nexport type PaginationArgs = 'all' | PageQuery\n\n/**\n * Represents a Non-Fungible Token (NFT) with associated metadata.\n */\nexport type NFT = {\n  /**\n   * The address or identifier of the creator of the NFT.\n   */\n  creator: string\n\n  /**\n   * A description providing additional information about the NFT.\n   */\n  description: string\n\n  /**\n   * The URL to the image representing the NFT visually.\n   */\n  image_url: string\n\n  /**\n   * A link associated with the NFT, providing more details or interactions.\n   */\n  link: string\n\n  /**\n   * The name or title of the NFT.\n   */\n  name: string\n\n  /**\n   * The URL to the project or collection associated with the NFT.\n   */\n  project_url: string\n}\n\n/**\n * Represents a SUI struct tag.\n */\nexport type SuiStructTag = {\n  /**\n   * The full address of the struct.\n   */\n  full_address: string\n\n  /**\n   * The source address of the struct.\n   */\n  source_address: string\n\n  /**\n   * The address of the struct.\n   */\n  address: SuiAddressType\n\n  /**\n   * The module to which the struct belongs.\n   */\n  module: string\n\n  /**\n   * The name of the struct.\n   */\n  name: string\n\n  /**\n   * An array of type arguments (SUI addresses) for the struct.\n   */\n  type_arguments: SuiAddressType[]\n}\n\n/**\n * Represents basic SUI data types.\n */\nexport type SuiBasicTypes = 'address' | 'bool' | 'u8' | 'u16' | 'u32' | 'u64' | 'u128' | 'u256'\n\n/**\n * Represents a SUI transaction argument, which can be of various types.\n */\nexport type SuiTxArg = TransactionArgument | string | number | bigint | boolean\n\n/**\n * Represents input types for SUI data.\n */\nexport type SuiInputTypes = 'object' | SuiBasicTypes\n\nexport type BaseSdkOptions = {\n  env: 'mainnet' | 'testnet'\n  full_rpc_url: string\n}\n\nexport interface InitCetusSDKOptions {\n  env: 'mainnet' | 'testnet'\n  full_rpc_url?: string\n}\n","import BN from 'bn.js'\nimport Decimal from 'decimal.js'\nimport { CommonErrorCode, handleMessageError } from '../errors/errors'\n\nexport const ZERO = new BN(0)\n\nexport const ONE = new BN(1)\n\nexport const TWO = new BN(2)\n\nexport const U128 = TWO.pow(new BN(128))\n\nexport const U64_MAX = TWO.pow(new BN(64)).sub(ONE)\n\nexport const U128_MAX = TWO.pow(new BN(128)).sub(ONE)\n\n/**\n * @category MathUtil\n */\nexport class MathUtil {\n  static toX64BN(num: BN): BN {\n    return num.mul(new BN(2).pow(new BN(64)))\n  }\n\n  static toX64Decimal(num: Decimal): Decimal {\n    return num.mul(Decimal.pow(2, 64))\n  }\n\n  static toX64(num: Decimal): BN {\n    return new BN(num.mul(Decimal.pow(2, 64)).floor().toFixed())\n  }\n\n  static fromX64(num: BN): Decimal {\n    return new Decimal(num.toString()).mul(Decimal.pow(2, -64))\n  }\n\n  static fromX64Decimal(num: Decimal): Decimal {\n    return num.mul(Decimal.pow(2, -64))\n  }\n\n  static fromX64BN(num: BN): BN {\n    return num.div(new BN(2).pow(new BN(64)))\n  }\n\n  static shiftRightRoundUp(n: BN): BN {\n    let result = n.shrn(64)\n\n    if (n.mod(U64_MAX).gt(ZERO)) {\n      result = result.add(ONE)\n    }\n\n    return result\n  }\n\n  static divRoundUp(n0: BN, n1: BN): BN {\n    const hasRemainder = !n0.mod(n1).eq(ZERO)\n    if (hasRemainder) {\n      return n0.div(n1).add(new BN(1))\n    }\n    return n0.div(n1)\n  }\n\n  static subUnderflowU128(n0: BN, n1: BN): BN {\n    if (n0.lt(n1)) {\n      return n0.sub(n1).add(U128_MAX)\n    }\n\n    return n0.sub(n1)\n  }\n\n  static checkUnsignedSub(n0: BN, n1: BN): BN {\n    const n = n0.sub(n1)\n    if (n.isNeg()) {\n      throw new Error('Unsigned integer sub overflow')\n    }\n    return n\n  }\n\n  static checkMul(n0: BN, n1: BN, limit: number): BN {\n    const n = n0.mul(n1)\n    if (this.isOverflow(n, limit)) {\n      handleMessageError(CommonErrorCode.MultiplicationOverflow, 'Multiplication overflow')\n    }\n    return n\n  }\n\n  static checkMulDivFloor(n0: BN, n1: BN, denom: BN, limit: number): BN {\n    if (denom.eq(ZERO)) {\n      handleMessageError(CommonErrorCode.DivisionByZero, 'Divide by zero')\n    }\n    const n = n0.mul(n1).div(denom)\n    if (this.isOverflow(n, limit)) {\n      handleMessageError(CommonErrorCode.MultiplicationOverflow, 'Multiplication div overflow')\n    }\n    return n\n  }\n\n  static checkMulDivCeil(n0: BN, n1: BN, denom: BN, limit: number): BN {\n    if (denom.eq(ZERO)) {\n      throw new Error('Divide by zero')\n    }\n    const n = n0.mul(n1).add(denom.sub(ONE)).div(denom)\n    if (this.isOverflow(n, limit)) {\n      throw new Error('Multiplication div overflow')\n    }\n    return n\n  }\n\n  static checkMulDivRound(n0: BN, n1: BN, denom: BN, limit: number): BN {\n    if (denom.eq(ZERO)) {\n      handleMessageError(CommonErrorCode.DivisionByZero, 'Divide by zero')\n    }\n    const n = n0.mul(n1.add(denom.shrn(1))).div(denom)\n    if (this.isOverflow(n, limit)) {\n      handleMessageError(CommonErrorCode.MultiplicationOverflow, 'Multiplication div overflow')\n    }\n    return n\n  }\n\n  static checkMulShiftRight(n0: BN, n1: BN, shift: number, limit: number): BN {\n    const n = n0.mul(n1).div(new BN(2).pow(new BN(shift)))\n    // const n = n0.mul(n1).shrn(shift)\n    if (this.isOverflow(n, limit)) {\n      handleMessageError(CommonErrorCode.MultiplicationOverflow, 'Multiplication shift right overflow')\n    }\n    return n\n  }\n\n  static checkMulShiftRight64RoundUpIf(n0: BN, n1: BN, limit: number, roundUp: boolean): BN {\n    const p = n0.mul(n1)\n    const shouldRoundUp = roundUp && p.and(U64_MAX).gt(ZERO)\n    const result = shouldRoundUp ? p.shrn(64).add(ONE) : p.shrn(64)\n    if (this.isOverflow(result, limit)) {\n      handleMessageError(CommonErrorCode.MultiplicationOverflow, 'Multiplication shift right overflow')\n    }\n    return result\n  }\n\n  static checkMulShiftLeft(n0: BN, n1: BN, shift: number, limit: number): BN {\n    const n = n0.mul(n1).shln(shift)\n    if (this.isOverflow(n, limit)) {\n      handleMessageError(CommonErrorCode.MultiplicationOverflow, 'Multiplication shift left overflow')\n    }\n    return n\n  }\n\n  static checkDivRoundUpIf(n0: BN, n1: BN, roundUp: boolean): BN {\n    if (n1.eq(ZERO)) {\n      handleMessageError(CommonErrorCode.DivisionByZero, 'Divide by zero')\n    }\n    if (roundUp) {\n      return this.divRoundUp(n0, n1)\n    }\n    return n0.div(n1)\n  }\n\n  static isOverflow(n: BN, bit: number): boolean {\n    return n.gte(TWO.pow(new BN(bit)))\n  }\n\n  static sign(v: BN): number {\n    const signBit = v.testn(127) ? 1 : 0\n    return signBit\n  }\n\n  static is_neg(v: BN): boolean {\n    return this.sign(v) === 1\n  }\n\n  static abs_u128(v: BN): BN {\n    if (v.gt(ZERO)) {\n      return v\n    }\n    return this.u128Neg(v.subn(1))\n  }\n\n  static u128Neg(v: BN): BN {\n    return v.uxor(new BN('ffffffffffffffffffffffffffffffff', 16))\n  }\n\n  static neg(v: BN): BN {\n    if (this.is_neg(v)) {\n      return v.abs()\n    }\n    return this.negFrom(v)\n  }\n\n  static abs(v: BN): BN {\n    if (this.sign(v) === 0) {\n      return v\n    }\n    return this.u128Neg(v.sub(new BN(1)))\n  }\n\n  static negFrom(v: BN): BN {\n    if (v.eq(ZERO)) {\n      return v\n    }\n    return this.u128Neg(v).add(new BN(1)).or(new BN(1).shln(127))\n  }\n}\n","import { MAX_SQRT_PRICE, MAX_TICK_INDEX, MIN_SQRT_PRICE, MIN_TICK_INDEX } from '../type/clmm'\n\nexport class TickUtil {\n  /**\n   * Get min tick index.\n   * @param tick_spacing tick spacing\n   * @returns min tick index\n   */\n  static getMinIndex(tickSpacing: number): number {\n    return MIN_TICK_INDEX + (Math.abs(MIN_TICK_INDEX) % tickSpacing)\n  }\n\n  /**\n   * Get max tick index.\n   * @param tick_spacing - tick spacing\n   * @returns max tick index\n   */\n  // eslint-disable-next-line camelcase\n  static getMaxIndex(tickSpacing: number): number {\n    return MAX_TICK_INDEX - (MAX_TICK_INDEX % tickSpacing)\n  }\n}\n\n/**\n * Get nearest tick by current tick.\n *\n * @param tickIndex\n * @param tickSpacing\n * @returns\n */\n\nexport function getNearestTickByTick(tickIndex: number, tickSpacing: number): number {\n  const mod = Math.abs(tickIndex) % tickSpacing\n  if (tickIndex > 0) {\n    if (mod > tickSpacing / 2) {\n      return tickIndex + tickSpacing - mod\n    }\n    return tickIndex - mod\n  }\n  if (mod > tickSpacing / 2) {\n    return tickIndex - tickSpacing + mod\n  }\n  return tickIndex + mod\n}\n\n/**\n * Get the default sqrt price limit for a swap.\n *\n * @param a2b - true if the swap is A to B, false if the swap is B to A.\n * @returns The default sqrt price limit for the swap.\n */\nexport function getDefaultSqrtPriceLimit(a2b: boolean): string {\n  return a2b ? MIN_SQRT_PRICE : MAX_SQRT_PRICE\n}\n\nexport function getTickSide(afterTick: number, lowerTick: number, upperTick: number) {\n  if (afterTick >= lowerTick && afterTick <= upperTick) {\n    return 'inRange'\n  }\n  if (afterTick < lowerTick) {\n    return 'left'\n  }\n  return 'right'\n}\n","/* -------------------------------------------------------------------------- */\n/*                              Helper functions                              */\n/* -------------------------------------------------------------------------- */\n\nimport type {\n  DisplayFieldsResponse,\n  ObjectOwner,\n  OwnedObjectRef,\n  SuiMoveObject,\n  SuiObjectData,\n  SuiObjectRef,\n  SuiObjectResponse,\n  SuiParsedData,\n} from '@mysten/sui/client'\nimport type { NFT } from '../type'\n\n/* -------------------------- SuiObjectResponse ------------------------- */\n\nexport function getSuiObjectData(resp: SuiObjectResponse): SuiObjectData | null | undefined {\n  return resp.data\n}\n\nexport function getObjectDeletedResponse(resp: SuiObjectResponse): SuiObjectRef | undefined {\n  if (resp.error && 'object_id' in resp.error && 'version' in resp.error && 'digest' in resp.error) {\n    const { error } = resp\n    return {\n      objectId: error.object_id,\n      version: error.version,\n      digest: error.digest,\n    } as SuiObjectRef\n  }\n\n  return undefined\n}\n\nexport function getObjectNotExistsResponse(resp: SuiObjectResponse): string | undefined {\n  if (resp.error && 'object_id' in resp.error && !('version' in resp.error) && !('digest' in resp.error)) {\n    return resp.error.object_id as string\n  }\n\n  return undefined\n}\n\nexport function getObjectReference(resp: SuiObjectResponse | OwnedObjectRef): SuiObjectRef | undefined {\n  if ('reference' in resp) {\n    return resp.reference\n  }\n  const exists = getSuiObjectData(resp)\n  if (exists) {\n    return {\n      objectId: exists.objectId,\n      version: exists.version,\n      digest: exists.digest,\n    }\n  }\n  return getObjectDeletedResponse(resp)\n}\n\n/* ------------------------------ SuiObjectRef ------------------------------ */\n\nexport function getObjectId(data: SuiObjectResponse | SuiObjectRef | OwnedObjectRef): string {\n  if ('objectId' in data) {\n    return data.objectId\n  }\n  return getObjectReference(data)?.objectId ?? getObjectNotExistsResponse(data as SuiObjectResponse)!\n}\n\nexport function getObjectVersion(data: SuiObjectResponse | SuiObjectRef | SuiObjectData): string | number | undefined {\n  if ('version' in data) {\n    return data.version\n  }\n  return getObjectReference(data)?.version\n}\n\n/* -------------------------------- SuiObject ------------------------------- */\n\nexport function isSuiObjectResponse(resp: SuiObjectResponse | SuiObjectData): resp is SuiObjectResponse {\n  return (resp as SuiObjectResponse).data !== undefined\n}\n\nfunction isSuiObjectDataWithContent(data: SuiObjectData): data is SuiObjectDataWithContent {\n  return data.content !== undefined\n}\n\nexport function getMovePackageContent(data: SuiObjectResponse): any | undefined {\n  const suiObject = getSuiObjectData(data)\n  if (suiObject?.content?.dataType !== 'package') {\n    return undefined\n  }\n  return suiObject.content.disassembled\n}\nexport function getMoveObject(data: SuiObjectResponse | SuiObjectData): SuiMoveObject | undefined {\n  const suiObject = 'data' in data ? getSuiObjectData(data) : (data as SuiObjectData)\n\n  if (!suiObject || !isSuiObjectDataWithContent(suiObject) || suiObject.content.dataType !== 'moveObject') {\n    return undefined\n  }\n\n  return suiObject.content as SuiMoveObject\n}\n\nexport function getMoveObjectType(resp: SuiObjectResponse): string | undefined {\n  return getMoveObject(resp)?.type\n}\n\n/**\n * Deriving the object type from the object response\n * @returns 'package' if the object is a package, move object type(e.g., 0x2::coin::Coin<0x2::sui::SUI>)\n * if the object is a move object\n */\nexport function getObjectType(resp: SuiObjectResponse | SuiObjectData): string | null | undefined {\n  const data = isSuiObjectResponse(resp) ? resp.data : resp\n\n  if (!data?.type && 'data' in resp) {\n    if (data?.content?.dataType === 'package') {\n      return 'package'\n    }\n    return getMoveObjectType(resp)\n  }\n  return data?.type\n}\n\nexport function getObjectPreviousTransactionDigest(resp: SuiObjectResponse): string | null | undefined {\n  return getSuiObjectData(resp)?.previousTransaction\n}\n\nexport function getObjectOwner(resp: SuiObjectResponse): ObjectOwner | null | undefined {\n  return getSuiObjectData(resp)?.owner\n}\n\nexport function getObjectDisplay(resp: SuiObjectResponse): DisplayFieldsResponse {\n  const display = getSuiObjectData(resp)?.display\n  if (!display) {\n    return { data: null, error: null }\n  }\n  return display\n}\n\n/**\n * Get the fields of a sui object response or data. The dataType of the object must be moveObject.\n * @param {SuiObjectResponse | SuiObjectData}object The object to get the fields from.\n * @returns {any} The fields of the object.\n */\nexport function getObjectFields(object: SuiObjectResponse | SuiObjectData): any {\n  const fields = getMoveObject(object)?.fields\n  if (fields) {\n    if ('fields' in fields) {\n      return fields.fields\n    }\n    return fields\n  }\n  return undefined\n}\n\nexport interface SuiObjectDataWithContent extends SuiObjectData {\n  content: SuiParsedData\n}\n\n/**\n * Return hasPublicTransfer of a move object.\n * @param {SuiObjectResponse | SuiObjectData}data\n * @returns\n */\nexport function hasPublicTransfer(data: SuiObjectResponse | SuiObjectData): boolean {\n  return getMoveObject(data)?.hasPublicTransfer ?? false\n}\n\n\n\n/**\n * Builds an NFT object based on a response containing information about the NFT.\n * @param {any} objects - The response containing information about the NFT.\n * @returns {NFT} - The built NFT object.\n */\nexport function buildNFT(objects: any): NFT {\n  const fields = getObjectDisplay(objects).data\n  const nft: NFT = {\n    creator: '',\n    description: '',\n    image_url: '',\n    link: '',\n    name: '',\n    project_url: '',\n  }\n  if (fields) {\n    nft.creator = fields.creator\n    nft.description = fields.description\n    nft.image_url = fields.image_url\n    nft.link = fields.link\n    nft.name = fields.name\n    nft.project_url = fields.project_url\n  }\n  return nft\n}","import Decimal from 'decimal.js'\n\nDecimal.config({\n  precision: 64,\n  rounding: Decimal.ROUND_DOWN,\n  toExpNeg: -64,\n  toExpPos: 64,\n})\n\nexport default Decimal\n","import type { Transaction } from '@mysten/sui/dist/cjs/transactions'\nimport BN from 'bn.js'\nimport type { CoinAmounts, LiquidityInput } from '../type/clmm'\nimport { MAX_SQRT_PRICE, MIN_SQRT_PRICE, PositionStatus } from '../type/clmm'\nimport type { Package } from '../type/sui'\nimport Decimal from './decimal'\nimport { d, fromDecimalsAmount, toDecimalsAmount } from './numbers'\nimport { TickMath } from './tickMath'\nimport { MathUtil, ONE, U64_MAX, ZERO } from './utils'\nimport { CommonErrorCode, handleMessageError } from '../errors/errors'\nimport { DETAILS_KEYS } from '../errors/baseError'\n\n/**\n * Get the amount A delta about two prices, for give amount of liquidity.\n * `delta_a = (liquidity * delta_sqrt_price) / sqrt_price_upper * sqrt_price_lower)`\n *\n * @param sqrtPrice0 - A sqrt price\n * @param sqrtPrice1 - Another sqrt price\n * @param liquidity - The amount of usable liquidity\n * @param roundUp - Whether to round the amount up or down\n * @returns\n */\nexport function getDeltaA(sqrtPrice0: BN, sqrtPrice1: BN, liquidity: BN, roundUp: boolean): BN {\n  const sqrtPriceDiff = sqrtPrice0.gt(sqrtPrice1) ? sqrtPrice0.sub(sqrtPrice1) : sqrtPrice1.sub(sqrtPrice0)\n  const numerator = liquidity.mul(sqrtPriceDiff).shln(64)\n  const denominator = sqrtPrice0.mul(sqrtPrice1)\n  const quotient = numerator.div(denominator)\n  const remainder = numerator.mod(denominator)\n  const result = roundUp && !remainder.eq(ZERO) ? quotient.add(new BN(1)) : quotient\n  return result\n}\n\n/**\n * Get the amount B delta about two prices, for give amount of liquidity.\n * `delta_a = (liquidity * delta_sqrt_price) / sqrt_price_upper * sqrt_price_lower)`\n *\n * @param sqrtPrice0 - A sqrt price\n * @param sqrtPrice1 - Another sqrt price\n * @param liquidity - The amount of usable liquidity\n * @param roundUp - Whether to round the amount up or down\n * @returns\n */\nexport function getDeltaB(sqrtPrice0: BN, sqrtPrice1: BN, liquidity: BN, roundUp: boolean): BN {\n  const sqrtPriceDiff = sqrtPrice0.gt(sqrtPrice1) ? sqrtPrice0.sub(sqrtPrice1) : sqrtPrice1.sub(sqrtPrice0)\n  if (liquidity.eq(ZERO) || sqrtPriceDiff.eq(ZERO)) {\n    return ZERO\n  }\n  const p = liquidity.mul(sqrtPriceDiff)\n  const shouldRoundUp = roundUp && p.and(U64_MAX).gt(ZERO)\n  const result = shouldRoundUp ? p.shrn(64).add(ONE) : p.shrn(64)\n  if (MathUtil.isOverflow(result, 64)) {\n    throw new Error('Result large than u64 max')\n  }\n  return result\n}\n\n/**\n * Get the next sqrt price from give a delta of token_a.\n * `new_sqrt_price = (sqrt_price * liquidity) / (liquidity +/- amount * sqrt_price)`\n *\n * @param sqrtPrice - The start sqrt price\n * @param liquidity - The amount of usable liquidity\n * @param amount - The amount of token_a\n * @param byAmountIn - Weather to fixed input\n */\nexport function getNextSqrtPriceAUp(sqrtPrice: BN, liquidity: BN, amount: BN, byAmountIn: boolean): BN {\n  if (amount.eq(ZERO)) {\n    return sqrtPrice\n  }\n  const numerator = MathUtil.checkMulShiftLeft(sqrtPrice, liquidity, 64, 256)\n  const liquidityShl64 = liquidity.shln(64)\n  const product = MathUtil.checkMul(sqrtPrice, amount, 256)\n  if (!byAmountIn && liquidityShl64.lte(product)) {\n    throw new Error('getNextSqrtPriceAUp - Unable to divide liquidityShl64 by product')\n  }\n  const nextSqrtPrice = byAmountIn\n    ? MathUtil.checkDivRoundUpIf(numerator, liquidityShl64.add(product), true)\n    : MathUtil.checkDivRoundUpIf(numerator, liquidityShl64.sub(product), true)\n  if (nextSqrtPrice.lt(new BN(MIN_SQRT_PRICE))) {\n    throw new Error('getNextSqrtPriceAUp - Next sqrt price less than min sqrt price')\n  }\n  if (nextSqrtPrice.gt(new BN(MAX_SQRT_PRICE))) {\n    throw new Error('getNextSqrtPriceAUp - Next sqrt price greater than max sqrt price')\n  }\n\n  return nextSqrtPrice\n}\n\n/**\n * Get the next sqrt price from give a delta of token_b.\n * `new_sqrt_price = (sqrt_price +(delta_b / liquidity)`\n *\n * @param sqrtPrice - The start sqrt price\n * @param liquidity - The amount of usable liquidity\n * @param amount - The amount of token_a\n * @param byAmountIn - Weather to fixed input\n */\nexport function getNextSqrtPriceBDown(sqrtPrice: BN, liquidity: BN, amount: BN, byAmountIn: boolean): BN {\n  const deltaSqrtPrice = MathUtil.checkDivRoundUpIf(amount.shln(64), liquidity, !byAmountIn)\n  const nextSqrtPrice = byAmountIn ? sqrtPrice.add(deltaSqrtPrice) : sqrtPrice.sub(deltaSqrtPrice)\n\n  if (nextSqrtPrice.lt(new BN(MIN_SQRT_PRICE)) || nextSqrtPrice.gt(new BN(MAX_SQRT_PRICE))) {\n    throw new Error('getNextSqrtPriceAUp - Next sqrt price out of bounds')\n  }\n\n  return nextSqrtPrice\n}\n\n/**\n * Get next sqrt price from input parameter.\n *\n * @param sqrtPrice\n * @param liquidity\n * @param amount\n * @param aToB\n * @returns\n */\nexport function getNextSqrtPriceFromInput(sqrtPrice: BN, liquidity: BN, amount: BN, aToB: boolean): BN {\n  return aToB ? getNextSqrtPriceAUp(sqrtPrice, liquidity, amount, true) : getNextSqrtPriceBDown(sqrtPrice, liquidity, amount, true)\n}\n\n/**\n * Get the next sqrt price from output parameters.\n *\n * @param sqrtPrice\n * @param liquidity\n * @param amount\n * @param a2b\n * @returns\n */\nexport function getNextSqrtPriceFromOutput(sqrtPrice: BN, liquidity: BN, amount: BN, a2b: boolean): BN {\n  return a2b ? getNextSqrtPriceBDown(sqrtPrice, liquidity, amount, false) : getNextSqrtPriceAUp(sqrtPrice, liquidity, amount, false)\n}\n\n/**\n * Get the amount of delta_a or delta_b from input parameters, and round up result.\n *\n * @param currentSqrtPrice\n * @param targetSqrtPrice\n * @param liquidity\n * @param a2b\n * @returns\n */\nexport function getDeltaUpFromInput(currentSqrtPrice: BN, targetSqrtPrice: BN, liquidity: BN, a2b: boolean): BN {\n  const sqrtPriceDiff = currentSqrtPrice.gt(targetSqrtPrice) ? currentSqrtPrice.sub(targetSqrtPrice) : targetSqrtPrice.sub(currentSqrtPrice)\n\n  if (liquidity.lte(ZERO) || sqrtPriceDiff.eq(ZERO)) {\n    return ZERO\n  }\n\n  let result\n  if (a2b) {\n    const numerator = new BN(liquidity).mul(new BN(sqrtPriceDiff)).shln(64)\n    const denominator = targetSqrtPrice.mul(currentSqrtPrice)\n    const quotient = numerator.div(denominator)\n    const remainder = numerator.mod(denominator)\n    result = !remainder.eq(ZERO) ? quotient.add(ONE) : quotient\n  } else {\n    const product = new BN(liquidity).mul(new BN(sqrtPriceDiff))\n    const shouldRoundUp = product.and(U64_MAX).gt(ZERO)\n    result = shouldRoundUp ? product.shrn(64).add(ONE) : product.shrn(64)\n  }\n  return result\n}\n\n/**\n * Get the amount of delta_a or delta_b from output parameters, and round down result.\n *\n * @param currentSqrtPrice\n * @param targetSqrtPrice\n * @param liquidity\n * @param a2b\n * @returns\n */\nexport function getDeltaDownFromOutput(currentSqrtPrice: BN, targetSqrtPrice: BN, liquidity: BN, a2b: boolean): BN {\n  const sqrtPriceDiff = currentSqrtPrice.gt(targetSqrtPrice) ? currentSqrtPrice.sub(targetSqrtPrice) : targetSqrtPrice.sub(currentSqrtPrice)\n\n  if (liquidity.lte(ZERO) || sqrtPriceDiff.eq(ZERO)) {\n    return ZERO\n  }\n\n  let result\n  if (a2b) {\n    const product = liquidity.mul(sqrtPriceDiff)\n    result = product.shrn(64)\n  } else {\n    const numerator = liquidity.mul(sqrtPriceDiff).shln(64)\n    const denominator = targetSqrtPrice.mul(currentSqrtPrice)\n    result = numerator.div(denominator)\n  }\n  return result\n}\n\n/**\n * Estimate liquidity for coin A\n * @param sqrtPriceX - coin A sqrt price\n * @param sqrtPriceY - coin B sqrt price\n * @param coinAmount - token amount\n * @return\n */\nexport function estimateLiquidityForCoinA(sqrtPriceX: BN, sqrtPriceY: BN, coinAmount: BN) {\n  const lowerSqrtPriceX64 = BN.min(sqrtPriceX, sqrtPriceY)\n  const upperSqrtPriceX64 = BN.max(sqrtPriceX, sqrtPriceY)\n  const num = MathUtil.fromX64BN(coinAmount.mul(upperSqrtPriceX64).mul(lowerSqrtPriceX64))\n  const dem = upperSqrtPriceX64.sub(lowerSqrtPriceX64)\n  return !num.isZero() && !dem.isZero() ? num.div(dem) : new BN(0)\n}\n\n/**\n * Estimate liquidity for coin B\n * @param sqrtPriceX - coin A sqrt price\n * @param sqrtPriceY - coin B sqrt price\n * @param coinAmount - token amount\n * @return\n */\nexport function estimateLiquidityForCoinB(sqrtPriceX: BN, sqrtPriceY: BN, coinAmount: BN) {\n  const lowerSqrtPriceX64 = BN.min(sqrtPriceX, sqrtPriceY)\n  const upperSqrtPriceX64 = BN.max(sqrtPriceX, sqrtPriceY)\n  const delta = upperSqrtPriceX64.sub(lowerSqrtPriceX64)\n  return !delta.isZero() ? coinAmount.shln(64).div(delta) : new BN(0)\n}\n\nexport class ClmmPoolUtil {\n  /**\n   * Get token amount from liquidity.\n   * @param liquidity - liquidity\n   * @param curSqrtPrice - Pool current sqrt price\n   * @param lowerSqrtPrice - position lower sqrt price\n   * @param upperSqrtPrice - position upper sqrt price\n   * @param roundUp - is round up\n   * @returns\n   */\n  static getCoinAmountFromLiquidity(\n    liquidity: BN,\n    curSqrtPrice: BN,\n    lowerSqrtPrice: BN,\n    upperSqrtPrice: BN,\n    roundUp: boolean\n  ): CoinAmounts {\n    const liq = new Decimal(liquidity.toString())\n    const curSqrtPriceStr = new Decimal(curSqrtPrice.toString())\n    const lowerPriceStr = new Decimal(lowerSqrtPrice.toString())\n    const upperPriceStr = new Decimal(upperSqrtPrice.toString())\n    let coinA\n    let coinB\n    if (curSqrtPrice.lt(lowerSqrtPrice)) {\n      coinA = MathUtil.toX64Decimal(liq).mul(upperPriceStr.sub(lowerPriceStr)).div(lowerPriceStr.mul(upperPriceStr))\n      coinB = new Decimal(0)\n    } else if (curSqrtPrice.lt(upperSqrtPrice)) {\n      coinA = MathUtil.toX64Decimal(liq).mul(upperPriceStr.sub(curSqrtPriceStr)).div(curSqrtPriceStr.mul(upperPriceStr))\n\n      coinB = MathUtil.fromX64Decimal(liq.mul(curSqrtPriceStr.sub(lowerPriceStr)))\n    } else {\n      coinA = new Decimal(0)\n      coinB = MathUtil.fromX64Decimal(liq.mul(upperPriceStr.sub(lowerPriceStr)))\n    }\n    if (roundUp) {\n      return {\n        coin_amount_a: coinA.ceil().toString(),\n        coin_amount_b: coinB.ceil().toString(),\n      }\n    }\n    return {\n      coin_amount_a: coinA.floor().toString(),\n      coin_amount_b: coinB.floor().toString(),\n    }\n  }\n\n  /**\n   * Estimate liquidity and token amount from one amounts\n   * @param lowerTick - lower tick\n   * @param upperTick - upper tick\n   * @param coinAmount - token amount\n   * @param isCoinA - is token A\n   * @param roundUp - is round up\n   * @param isIncrease - is increase\n   * @param slippage - slippage percentage\n   * @param curSqrtPrice - current sqrt price.\n   * @return IncreaseLiquidityInput\n   */\n  static estLiquidityAndCoinAmountFromOneAmounts(\n    lowerTick: number,\n    upperTick: number,\n    coinAmount: BN,\n    isCoinA: boolean,\n    roundUp: boolean,\n    slippage: number,\n    curSqrtPrice: BN\n  ): LiquidityInput {\n    const currentTick = TickMath.sqrtPriceX64ToTickIndex(curSqrtPrice)\n    const lowerSqrtPrice = TickMath.tickIndexToSqrtPriceX64(lowerTick)\n    const upperSqrtPrice = TickMath.tickIndexToSqrtPriceX64(upperTick)\n    let liquidity\n    if (currentTick < lowerTick) {\n      if (!isCoinA) {\n        throw new Error('lower tick cannot calculate liquidity by coinB')\n      }\n      liquidity = estimateLiquidityForCoinA(lowerSqrtPrice, upperSqrtPrice, coinAmount)\n    } else if (currentTick > upperTick) {\n      if (isCoinA) {\n        throw new Error('upper tick cannot calculate liquidity by coinA')\n      }\n      liquidity = estimateLiquidityForCoinB(upperSqrtPrice, lowerSqrtPrice, coinAmount)\n    } else if (isCoinA) {\n      liquidity = estimateLiquidityForCoinA(curSqrtPrice, upperSqrtPrice, coinAmount)\n    } else {\n      liquidity = estimateLiquidityForCoinB(curSqrtPrice, lowerSqrtPrice, coinAmount)\n    }\n    const coinAmounts = ClmmPoolUtil.getCoinAmountFromLiquidity(liquidity, curSqrtPrice, lowerSqrtPrice, upperSqrtPrice, roundUp)\n    const tokenLimitA = roundUp\n      ? d(coinAmounts.coin_amount_a.toString())\n          .mul(1 + slippage)\n          .toString()\n      : d(coinAmounts.coin_amount_a.toString())\n          .mul(1 - slippage)\n          .toString()\n\n    const tokenLimitB = roundUp\n      ? d(coinAmounts.coin_amount_b.toString())\n          .mul(1 + slippage)\n          .toString()\n      : d(coinAmounts.coin_amount_b.toString())\n          .mul(1 - slippage)\n          .toString()\n\n    return {\n      coin_amount_a: coinAmounts.coin_amount_a,\n      coin_amount_b: coinAmounts.coin_amount_b,\n      coin_amount_limit_a: roundUp ? Decimal.ceil(tokenLimitA).toString() : Decimal.floor(tokenLimitA).toString(),\n      coin_amount_limit_b: roundUp ? Decimal.ceil(tokenLimitB).toString() : Decimal.floor(tokenLimitB).toString(),\n      liquidity_amount: liquidity.toString(),\n      fix_amount_a: isCoinA,\n    }\n  }\n\n  /**\n   * Estimate liquidity from token amounts\n   * @param curSqrtPrice - current sqrt price.\n   * @param lowerTick - lower tick\n   * @param upperTick - upper tick\n   * @param tokenAmount - token amount\n   * @return\n   */\n  static estimateLiquidityFromCoinAmounts(curSqrtPrice: BN, lowerTick: number, upperTick: number, tokenAmount: CoinAmounts): string {\n    if (lowerTick > upperTick) {\n      return handleMessageError(CommonErrorCode.InvalidTick, 'lower tick cannot be greater than lower tick', {\n        [DETAILS_KEYS.METHOD_NAME]: 'estimateLiquidityFromCoinAmounts',\n        [DETAILS_KEYS.REQUEST_PARAMS]: {\n          lowerTick,\n          upperTick,\n          tokenAmount,\n        },\n      })\n    }\n    const currTick = TickMath.sqrtPriceX64ToTickIndex(curSqrtPrice)\n    const lowerSqrtPrice = TickMath.tickIndexToSqrtPriceX64(lowerTick)\n    const upperSqrtPrice = TickMath.tickIndexToSqrtPriceX64(upperTick)\n    if (currTick < lowerTick) {\n      return estimateLiquidityForCoinA(lowerSqrtPrice, upperSqrtPrice, new BN(tokenAmount.coin_amount_a)).toString()\n    }\n    if (currTick >= upperTick) {\n      return estimateLiquidityForCoinB(upperSqrtPrice, lowerSqrtPrice, new BN(tokenAmount.coin_amount_b)).toString()\n    }\n    const estimateLiquidityAmountA = estimateLiquidityForCoinA(curSqrtPrice, upperSqrtPrice, new BN(tokenAmount.coin_amount_a))\n    const estimateLiquidityAmountB = estimateLiquidityForCoinB(curSqrtPrice, lowerSqrtPrice, new BN(tokenAmount.coin_amount_b))\n    return BN.min(estimateLiquidityAmountA, estimateLiquidityAmountB).toString()\n  }\n\n  static calculateDepositRatio(lowerTick: number, upperTick: number, curSqrtPrice: BN) {\n    // Use a fixed amount of token A with proper decimals\n    const coinAmountA = new BN(100000000)\n    const { coin_amount_b } = ClmmPoolUtil.estLiquidityAndCoinAmountFromOneAmounts(\n      lowerTick,\n      upperTick,\n      coinAmountA,\n      true,\n      true,\n      0,\n      curSqrtPrice\n    )\n\n    const currPrice = TickMath.sqrtPriceX64ToPrice(curSqrtPrice, 0, 0)\n\n    const transformAmountB = d(coinAmountA.toString()).mul(currPrice)\n\n    const totalAmount = transformAmountB.add(coin_amount_b.toString())\n    const ratioA = transformAmountB.div(totalAmount)\n    const ratioB = d(coin_amount_b.toString()).div(totalAmount)\n\n    return { ratioA, ratioB }\n  }\n\n  static calculateAmountDepositRatio(\n    lowerTick: number,\n    upperTick: number,\n    curSqrtPrice: BN,\n    coin_decimal_a: number,\n    coin_decimal_b: number\n  ) {\n    const currPrice = TickMath.sqrtPriceX64ToPrice(curSqrtPrice, coin_decimal_a, coin_decimal_b)\n    const currentTick = TickMath.sqrtPriceX64ToTickIndex(curSqrtPrice)\n    if (currentTick < lowerTick) {\n      return { ratioA: new Decimal(1), ratioB: new Decimal(0), currPrice }\n    }\n    if (currentTick > upperTick) {\n      return { ratioA: new Decimal(0), ratioB: new Decimal(1), currPrice }\n    }\n    const coinAmountA = new BN(toDecimalsAmount(1, coin_decimal_a))\n    const { coin_amount_b: coinAmountB } = ClmmPoolUtil.estLiquidityAndCoinAmountFromOneAmounts(\n      lowerTick,\n      upperTick,\n      coinAmountA,\n      true,\n      true,\n      0,\n      curSqrtPrice\n    )\n\n    const amountA = fromDecimalsAmount(coinAmountA.toString(), coin_decimal_a)\n    const amountB = fromDecimalsAmount(coinAmountB.toString(), coin_decimal_b)\n    const totalAmount = d(amountA).add(amountB)\n\n    const ratioA = d(amountA).div(totalAmount)\n\n    const ratioB = d(amountB).div(totalAmount)\n\n    return { ratioA, ratioB, currPrice }\n  }\n\n  static getCoinAmountsFromRatio(\n    ratioA: Decimal,\n    ratioB: Decimal,\n    totalValue: string,\n    tokenPriceA: string,\n    tokenPriceB: string,\n    decimalsA: number,\n    decimalsB: number\n  ) {\n    const amountA = d(toDecimalsAmount(d(totalValue).mul(ratioA).div(tokenPriceA).toString(), decimalsA)).toFixed(0)\n    const amountB = d(toDecimalsAmount(d(totalValue).mul(ratioB).div(tokenPriceB).toString(), decimalsB)).toFixed(0)\n\n    return { amountA, amountB }\n  }\n\n  /**\n   * Estimate coin amounts from total amount\n   * @param lowerTick\n   * @param upperTick\n   * @param decimalsA\n   * @param decimalsB\n   * @param curSqrtPrice\n   * @param totalAmount\n   * @param tokenPriceA\n   * @param tokenPriceB\n   * @returns\n   */\n  static estCoinAmountsFromTotalAmount(\n    lowerTick: number,\n    upperTick: number,\n    curSqrtPrice: BN,\n    totalValue: string,\n    tokenPriceA: string,\n    tokenPriceB: string,\n    decimalsA: number,\n    decimalsB: number\n  ) {\n    const { ratioA, ratioB } = ClmmPoolUtil.calculateDepositRatio(lowerTick, upperTick, curSqrtPrice)\n\n    return ClmmPoolUtil.getCoinAmountsFromRatio(ratioA, ratioB, totalValue, tokenPriceA, tokenPriceB, decimalsA, decimalsB)\n  }\n\n  /**\n   * Get the position status for the given tick indices.\n   *\n   * @param currentTickIndex The current tick index.\n   * @param lowerTickIndex The lower tick index.\n   * @param upperTickIndex The upper tick index.\n   * @returns The position status.\n   */\n  static getPositionStatus(currentTickIndex: number, lowerTickIndex: number, upperTickIndex: number): PositionStatus {\n    if (currentTickIndex < lowerTickIndex) {\n      return PositionStatus.BelowRange\n    }\n    if (currentTickIndex < upperTickIndex) {\n      return PositionStatus.InRange\n      return PositionStatus.InRange\n    }\n    return PositionStatus.AboveRange\n  }\n}\n\n/**\n * Utility function to retrieve packager configurations from a package object.\n * @param {Package<T>} packageObj - The package object containing configurations.\n * @throws {Error} Throws an error if the package does not have a valid config.\n * @returns {T} The retrieved configuration.\n */\nexport function getPackagerConfigs<T extends Package<any>>(packageObj: T): T extends Package<infer C> ? C : never {\n  if (packageObj.config === undefined) {\n    throw new Error(`package: ${packageObj.package_id}  not config in sdk SdkOptions`)\n  }\n  return packageObj.config as T extends Package<infer C> ? C : never\n}\n\nexport async function printTransaction(tx: Transaction, isPrint = true) {\n  console.log(`inputs`, tx.getData().inputs)\n  tx.getData().commands.forEach((item, index) => {\n    if (isPrint) {\n      console.log(`transaction ${index}: `, JSON.stringify(item, null, 2))\n    }\n  })\n}\n","/* eslint-disable import/no-unresolved */\n/* eslint-disable no-bitwise */\nimport BN from 'bn.js'\nimport { d } from '.'\nimport { MAX_SQRT_PRICE, MIN_SQRT_PRICE } from '../type/clmm'\nimport Decimal from './decimal'\nimport { MathUtil } from './utils'\n\nconst BIT_PRECISION = 14\nconst LOG_B_2_X32 = '59543866431248'\nconst LOG_B_P_ERR_MARGIN_LOWER_X64 = '184467440737095516'\nconst LOG_B_P_ERR_MARGIN_UPPER_X64 = '15793534762490258745'\nconst TICK_BOUND = 443636\n\nfunction signedShiftLeft(n0: BN, shiftBy: number, bitWidth: number) {\n  const twosN0 = n0.toTwos(bitWidth).shln(shiftBy)\n  twosN0.imaskn(bitWidth + 1)\n  return twosN0.fromTwos(bitWidth)\n}\n\nfunction signedShiftRight(n0: BN, shiftBy: number, bitWidth: number) {\n  const twoN0 = n0.toTwos(bitWidth).shrn(shiftBy)\n  twoN0.imaskn(bitWidth - shiftBy + 1)\n  return twoN0.fromTwos(bitWidth - shiftBy)\n}\n\nfunction tickIndexToSqrtPricePositive(tick: number) {\n  let ratio: BN\n\n  if ((tick & 1) !== 0) {\n    ratio = new BN('79232123823359799118286999567')\n  } else {\n    ratio = new BN('79228162514264337593543950336')\n  }\n\n  if ((tick & 2) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('79236085330515764027303304731')), 96, 256)\n  }\n  if ((tick & 4) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('79244008939048815603706035061')), 96, 256)\n  }\n  if ((tick & 8) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('79259858533276714757314932305')), 96, 256)\n  }\n  if ((tick & 16) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('79291567232598584799939703904')), 96, 256)\n  }\n  if ((tick & 32) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('79355022692464371645785046466')), 96, 256)\n  }\n  if ((tick & 64) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('79482085999252804386437311141')), 96, 256)\n  }\n  if ((tick & 128) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('79736823300114093921829183326')), 96, 256)\n  }\n  if ((tick & 256) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('80248749790819932309965073892')), 96, 256)\n  }\n  if ((tick & 512) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('81282483887344747381513967011')), 96, 256)\n  }\n  if ((tick & 1024) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('83390072131320151908154831281')), 96, 256)\n  }\n  if ((tick & 2048) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('87770609709833776024991924138')), 96, 256)\n  }\n  if ((tick & 4096) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('97234110755111693312479820773')), 96, 256)\n  }\n  if ((tick & 8192) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('119332217159966728226237229890')), 96, 256)\n  }\n  if ((tick & 16384) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('179736315981702064433883588727')), 96, 256)\n  }\n  if ((tick & 32768) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('407748233172238350107850275304')), 96, 256)\n  }\n  if ((tick & 65536) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('2098478828474011932436660412517')), 96, 256)\n  }\n  if ((tick & 131072) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('55581415166113811149459800483533')), 96, 256)\n  }\n  if ((tick & 262144) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('38992368544603139932233054999993551')), 96, 256)\n  }\n\n  return signedShiftRight(ratio, 32, 256)\n}\n\nfunction tickIndexToSqrtPriceNegative(tickIndex: number) {\n  const tick = Math.abs(tickIndex)\n  let ratio: BN\n\n  if ((tick & 1) !== 0) {\n    ratio = new BN('18445821805675392311')\n  } else {\n    ratio = new BN('18446744073709551616')\n  }\n\n  if ((tick & 2) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('18444899583751176498')), 64, 256)\n  }\n  if ((tick & 4) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('18443055278223354162')), 64, 256)\n  }\n  if ((tick & 8) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('18439367220385604838')), 64, 256)\n  }\n  if ((tick & 16) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('18431993317065449817')), 64, 256)\n  }\n  if ((tick & 32) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('18417254355718160513')), 64, 256)\n  }\n  if ((tick & 64) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('18387811781193591352')), 64, 256)\n  }\n  if ((tick & 128) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('18329067761203520168')), 64, 256)\n  }\n  if ((tick & 256) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('18212142134806087854')), 64, 256)\n  }\n  if ((tick & 512) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('17980523815641551639')), 64, 256)\n  }\n  if ((tick & 1024) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('17526086738831147013')), 64, 256)\n  }\n  if ((tick & 2048) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('16651378430235024244')), 64, 256)\n  }\n  if ((tick & 4096) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('15030750278693429944')), 64, 256)\n  }\n  if ((tick & 8192) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('12247334978882834399')), 64, 256)\n  }\n  if ((tick & 16384) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('8131365268884726200')), 64, 256)\n  }\n  if ((tick & 32768) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('3584323654723342297')), 64, 256)\n  }\n  if ((tick & 65536) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('696457651847595233')), 64, 256)\n  }\n  if ((tick & 131072) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('26294789957452057')), 64, 256)\n  }\n  if ((tick & 262144) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('37481735321082')), 64, 256)\n  }\n\n  return ratio\n}\n\nexport class TickMath {\n  static priceToSqrtPriceX64(price: Decimal, decimalsA: number, decimalsB: number): BN {\n    return MathUtil.toX64(price.mul(Decimal.pow(10, decimalsB - decimalsA)).sqrt())\n  }\n\n  static sqrtPriceX64ToPrice(sqrtPriceX64: BN, decimalsA: number, decimalsB: number): Decimal {\n    return MathUtil.fromX64(sqrtPriceX64)\n      .pow(2)\n      .mul(Decimal.pow(10, decimalsA - decimalsB))\n  }\n\n  static tickIndexToSqrtPriceX64(tickIndex: number): BN {\n    if (tickIndex > 0) {\n      return new BN(tickIndexToSqrtPricePositive(tickIndex))\n    }\n    return new BN(tickIndexToSqrtPriceNegative(tickIndex))\n  }\n\n  static sqrtPriceX64ToTickIndex(sqrtPriceX64: BN): number {\n    if (sqrtPriceX64.gt(new BN(MAX_SQRT_PRICE)) || sqrtPriceX64.lt(new BN(MIN_SQRT_PRICE))) {\n      throw new Error('Provided sqrtPrice is not within the supported sqrtPrice range.')\n    }\n\n    const msb = sqrtPriceX64.bitLength() - 1\n    const adjustedMsb = new BN(msb - 64)\n    const log2pIntegerX32 = signedShiftLeft(adjustedMsb, 32, 128)\n\n    let bit = new BN('8000000000000000', 'hex')\n    let precision = 0\n    let log2pFractionX64 = new BN(0)\n\n    let r = msb >= 64 ? sqrtPriceX64.shrn(msb - 63) : sqrtPriceX64.shln(63 - msb)\n\n    while (bit.gt(new BN(0)) && precision < BIT_PRECISION) {\n      r = r.mul(r)\n      const rMoreThanTwo = r.shrn(127)\n      r = r.shrn(63 + rMoreThanTwo.toNumber())\n      log2pFractionX64 = log2pFractionX64.add(bit.mul(rMoreThanTwo))\n      bit = bit.shrn(1)\n      precision += 1\n    }\n\n    const log2pFractionX32 = log2pFractionX64.shrn(32)\n\n    const log2pX32 = log2pIntegerX32.add(log2pFractionX32)\n    const logbpX64 = log2pX32.mul(new BN(LOG_B_2_X32))\n\n    const tickLow = signedShiftRight(logbpX64.sub(new BN(LOG_B_P_ERR_MARGIN_LOWER_X64)), 64, 128).toNumber()\n    const tickHigh = signedShiftRight(logbpX64.add(new BN(LOG_B_P_ERR_MARGIN_UPPER_X64)), 64, 128).toNumber()\n\n    if (tickLow === tickHigh) {\n      return tickLow\n    }\n    const derivedTickHighSqrtPriceX64 = TickMath.tickIndexToSqrtPriceX64(tickHigh)\n    if (derivedTickHighSqrtPriceX64.lte(sqrtPriceX64)) {\n      return tickHigh\n    }\n    return tickLow\n  }\n\n  static tickIndexToPrice(tickIndex: number, decimalsA: number, decimalsB: number): Decimal {\n    return TickMath.sqrtPriceX64ToPrice(TickMath.tickIndexToSqrtPriceX64(tickIndex), decimalsA, decimalsB)\n  }\n\n  static priceToTickIndex(price: Decimal, decimalsA: number, decimalsB: number): number {\n    return TickMath.sqrtPriceX64ToTickIndex(TickMath.priceToSqrtPriceX64(price, decimalsA, decimalsB))\n  }\n\n  static priceToInitializeTickIndex(price: Decimal, decimalsA: number, decimalsB: number, tickSpacing: number): number {\n    return TickMath.getInitializeTickIndex(TickMath.priceToTickIndex(price, decimalsA, decimalsB), tickSpacing)\n  }\n\n  static getInitializeTickIndex(tickIndex: number, tickSpacing: number): number {\n    return tickIndex - (tickIndex % tickSpacing)\n  }\n\n  /**\n   *\n   * @param tickIndex\n   * @param tickSpacing\n   * @returns\n   */\n  static getNextInitializeTickIndex(tickIndex: number, tickSpacing: number) {\n    return TickMath.getInitializeTickIndex(tickIndex, tickSpacing) + tickSpacing\n  }\n\n  static getPrevInitializeTickIndex(tickIndex: number, tickSpacing: number) {\n    return TickMath.getInitializeTickIndex(tickIndex, tickSpacing) - tickSpacing\n  }\n}\n\nexport function tickScore(tickIndex: number) {\n  return d(tickIndex).add(d(TICK_BOUND))\n}\n","import BN from 'bn.js'\nimport { Decimal } from 'decimal.js'\nimport type { CoinAmounts } from '../type/clmm'\n\n/**\n * Percentage - the util set for percentage struct.\n */\nexport class Percentage {\n  readonly numerator: BN\n\n  readonly denominator: BN\n\n  constructor(numerator: BN, denominator: BN) {\n    this.toString = () => {\n      return `${this.numerator.toString()}/${this.denominator.toString()}`\n    }\n    this.numerator = numerator\n    this.denominator = denominator\n  }\n\n  /**\n   * Get the percentage of a number.\n   *\n   * @param number\n   * @returns\n   */\n  static fromDecimal(number: Decimal): Percentage {\n    return Percentage.fromFraction(number.toDecimalPlaces(1).mul(10).toNumber(), 1000)\n  }\n\n  /**\n   * Convert the percentage to a Decimal\n   *\n   * @returns Decimal representation of the percentage\n   */\n  toDecimal(): Decimal {\n    return new Decimal(this.numerator.toString()).div(this.denominator.toString()).mul(100)\n  }\n\n  /**\n   * Get the percentage of a fraction.\n   *\n   * @param numerator\n   * @param denominator\n   * @returns\n   */\n  static fromFraction(numerator: BN | number, denominator: BN | number): Percentage {\n    const num = typeof numerator === 'number' ? new BN(numerator.toString()) : numerator\n    const denom = typeof denominator === 'number' ? new BN(denominator.toString()) : denominator\n    return new Percentage(num, denom)\n  }\n}\n\nexport function adjustForSlippage(n: BN, { numerator, denominator }: Percentage, adjustUp: boolean): BN {\n  if (adjustUp) {\n    return n.mul(denominator.add(numerator)).div(denominator)\n  }\n  return n.mul(denominator).div(denominator.add(numerator))\n}\n\n/**\n * Adjusts token amounts based on slippage tolerance\n * @param tokenAmount - The input token amounts\n * @param slippage - The slippage percentage\n * @param adjustUp - If true, adjusts up for maximum amount, if false adjusts down for minimum amount\n * @throws Error if token amounts are invalid\n * @returns Object with adjusted coin limits\n */\nexport function adjustForCoinSlippage(\n  tokenAmount: CoinAmounts,\n  slippage: Percentage,\n  adjustUp: boolean\n): { coin_amount_limit_a: string; coin_amount_limit_b: string } {\n  if (!tokenAmount?.coin_amount_a || !tokenAmount?.coin_amount_b) {\n    throw new Error('Invalid token amounts')\n  }\n\n  try {\n    const coinLimitA = adjustForSlippage(new BN(tokenAmount.coin_amount_a), slippage, adjustUp)\n    const coinLimitB = adjustForSlippage(new BN(tokenAmount.coin_amount_b), slippage, adjustUp)\n\n    return {\n      coin_amount_limit_a: coinLimitA.toString(),\n      coin_amount_limit_b: coinLimitB.toString(),\n    }\n  } catch (error: unknown) {\n    const errorMessage = error instanceof Error ? error.message : 'Unknown error'\n    throw new Error(`Failed to adjust for slippage: ${errorMessage}`)\n  }\n}\n"],"mappings":"oxBAAA,IAAAA,GAAAC,GAAA,CAAAC,GAAAC,KAAA,eAAC,SAAUA,EAAQD,EAAS,CAC1B,aAGA,SAASE,EAAQC,EAAKC,EAAK,CACzB,GAAI,CAACD,EAAK,MAAM,IAAI,MAAMC,GAAO,kBAAkB,CACrD,CAIA,SAASC,EAAUC,EAAMC,EAAW,CAClCD,EAAK,OAASC,EACd,IAAIC,EAAW,UAAY,CAAC,EAC5BA,EAAS,UAAYD,EAAU,UAC/BD,EAAK,UAAY,IAAIE,EACrBF,EAAK,UAAU,YAAcA,CAC/B,CAIA,SAASG,EAAIC,EAAQC,EAAMC,EAAQ,CACjC,GAAIH,EAAG,KAAKC,CAAM,EAChB,OAAOA,EAGT,KAAK,SAAW,EAChB,KAAK,MAAQ,KACb,KAAK,OAAS,EAGd,KAAK,IAAM,KAEPA,IAAW,QACTC,IAAS,MAAQA,IAAS,QAC5BC,EAASD,EACTA,EAAO,IAGT,KAAK,MAAMD,GAAU,EAAGC,GAAQ,GAAIC,GAAU,IAAI,EAEtD,CACI,OAAOX,GAAW,SACpBA,EAAO,QAAUQ,EAEjBT,EAAQ,GAAKS,EAGfA,EAAG,GAAKA,EACRA,EAAG,SAAW,GAEd,IAAII,EACJ,GAAI,CACE,OAAO,OAAW,KAAe,OAAO,OAAO,OAAW,IAC5DA,EAAS,OAAO,OAEhBA,EAAS,GAAQ,QAAQ,EAAE,MAE/B,MAAY,CACZ,CAEAJ,EAAG,KAAO,SAAeK,EAAK,CAC5B,OAAIA,aAAeL,EACV,GAGFK,IAAQ,MAAQ,OAAOA,GAAQ,UACpCA,EAAI,YAAY,WAAaL,EAAG,UAAY,MAAM,QAAQK,EAAI,KAAK,CACvE,EAEAL,EAAG,IAAM,SAAcM,EAAMC,EAAO,CAClC,OAAID,EAAK,IAAIC,CAAK,EAAI,EAAUD,EACzBC,CACT,EAEAP,EAAG,IAAM,SAAcM,EAAMC,EAAO,CAClC,OAAID,EAAK,IAAIC,CAAK,EAAI,EAAUD,EACzBC,CACT,EAEAP,EAAG,UAAU,MAAQ,SAAeC,EAAQC,EAAMC,EAAQ,CACxD,GAAI,OAAOF,GAAW,SACpB,OAAO,KAAK,YAAYA,EAAQC,EAAMC,CAAM,EAG9C,GAAI,OAAOF,GAAW,SACpB,OAAO,KAAK,WAAWA,EAAQC,EAAMC,CAAM,EAGzCD,IAAS,QACXA,EAAO,IAETT,EAAOS,KAAUA,EAAO,IAAMA,GAAQ,GAAKA,GAAQ,EAAE,EAErDD,EAASA,EAAO,SAAS,EAAE,QAAQ,OAAQ,EAAE,EAC7C,IAAIO,EAAQ,EACRP,EAAO,CAAC,IAAM,MAChBO,IACA,KAAK,SAAW,GAGdA,EAAQP,EAAO,SACbC,IAAS,GACX,KAAK,UAAUD,EAAQO,EAAOL,CAAM,GAEpC,KAAK,WAAWF,EAAQC,EAAMM,CAAK,EAC/BL,IAAW,MACb,KAAK,WAAW,KAAK,QAAQ,EAAGD,EAAMC,CAAM,GAIpD,EAEAH,EAAG,UAAU,YAAc,SAAsBC,EAAQC,EAAMC,EAAQ,CACjEF,EAAS,IACX,KAAK,SAAW,EAChBA,EAAS,CAACA,GAERA,EAAS,UACX,KAAK,MAAQ,CAACA,EAAS,QAAS,EAChC,KAAK,OAAS,GACLA,EAAS,kBAClB,KAAK,MAAQ,CACXA,EAAS,SACRA,EAAS,SAAa,QACzB,EACA,KAAK,OAAS,IAEdR,EAAOQ,EAAS,gBAAgB,EAChC,KAAK,MAAQ,CACXA,EAAS,SACRA,EAAS,SAAa,SACvB,CACF,EACA,KAAK,OAAS,GAGZE,IAAW,MAGf,KAAK,WAAW,KAAK,QAAQ,EAAGD,EAAMC,CAAM,CAC9C,EAEAH,EAAG,UAAU,WAAa,SAAqBC,EAAQC,EAAMC,EAAQ,CAGnE,GADAV,EAAO,OAAOQ,EAAO,QAAW,QAAQ,EACpCA,EAAO,QAAU,EACnB,YAAK,MAAQ,CAAC,CAAC,EACf,KAAK,OAAS,EACP,KAGT,KAAK,OAAS,KAAK,KAAKA,EAAO,OAAS,CAAC,EACzC,KAAK,MAAQ,IAAI,MAAM,KAAK,MAAM,EAClC,QAASQ,EAAI,EAAGA,EAAI,KAAK,OAAQA,IAC/B,KAAK,MAAMA,CAAC,EAAI,EAGlB,IAAIC,EAAGC,EACHC,EAAM,EACV,GAAIT,IAAW,KACb,IAAKM,EAAIR,EAAO,OAAS,EAAGS,EAAI,EAAGD,GAAK,EAAGA,GAAK,EAC9CE,EAAIV,EAAOQ,CAAC,EAAKR,EAAOQ,EAAI,CAAC,GAAK,EAAMR,EAAOQ,EAAI,CAAC,GAAK,GACzD,KAAK,MAAMC,CAAC,GAAMC,GAAKC,EAAO,SAC9B,KAAK,MAAMF,EAAI,CAAC,EAAKC,IAAO,GAAKC,EAAQ,SACzCA,GAAO,GACHA,GAAO,KACTA,GAAO,GACPF,aAGKP,IAAW,KACpB,IAAKM,EAAI,EAAGC,EAAI,EAAGD,EAAIR,EAAO,OAAQQ,GAAK,EACzCE,EAAIV,EAAOQ,CAAC,EAAKR,EAAOQ,EAAI,CAAC,GAAK,EAAMR,EAAOQ,EAAI,CAAC,GAAK,GACzD,KAAK,MAAMC,CAAC,GAAMC,GAAKC,EAAO,SAC9B,KAAK,MAAMF,EAAI,CAAC,EAAKC,IAAO,GAAKC,EAAQ,SACzCA,GAAO,GACHA,GAAO,KACTA,GAAO,GACPF,KAIN,OAAO,KAAK,OAAO,CACrB,EAEA,SAASG,EAAeC,EAAQC,EAAO,CACrC,IAAIC,EAAIF,EAAO,WAAWC,CAAK,EAE/B,GAAIC,GAAK,IAAMA,GAAK,GAClB,OAAOA,EAAI,GAEN,GAAIA,GAAK,IAAMA,GAAK,GACzB,OAAOA,EAAI,GAEN,GAAIA,GAAK,IAAMA,GAAK,IACzB,OAAOA,EAAI,GAEXvB,EAAO,GAAO,wBAA0BqB,CAAM,CAElD,CAEA,SAASG,EAAcH,EAAQI,EAAYH,EAAO,CAChD,IAAII,EAAIN,EAAcC,EAAQC,CAAK,EACnC,OAAIA,EAAQ,GAAKG,IACfC,GAAKN,EAAcC,EAAQC,EAAQ,CAAC,GAAK,GAEpCI,CACT,CAEAnB,EAAG,UAAU,UAAY,SAAoBC,EAAQO,EAAOL,EAAQ,CAElE,KAAK,OAAS,KAAK,MAAMF,EAAO,OAASO,GAAS,CAAC,EACnD,KAAK,MAAQ,IAAI,MAAM,KAAK,MAAM,EAClC,QAASC,EAAI,EAAGA,EAAI,KAAK,OAAQA,IAC/B,KAAK,MAAMA,CAAC,EAAI,EAIlB,IAAIG,EAAM,EACNF,EAAI,EAEJC,EACJ,GAAIR,IAAW,KACb,IAAKM,EAAIR,EAAO,OAAS,EAAGQ,GAAKD,EAAOC,GAAK,EAC3CE,EAAIM,EAAahB,EAAQO,EAAOC,CAAC,GAAKG,EACtC,KAAK,MAAMF,CAAC,GAAKC,EAAI,SACjBC,GAAO,IACTA,GAAO,GACPF,GAAK,EACL,KAAK,MAAMA,CAAC,GAAKC,IAAM,IAEvBC,GAAO,MAGN,CACL,IAAIQ,EAAcnB,EAAO,OAASO,EAClC,IAAKC,EAAIW,EAAc,IAAM,EAAIZ,EAAQ,EAAIA,EAAOC,EAAIR,EAAO,OAAQQ,GAAK,EAC1EE,EAAIM,EAAahB,EAAQO,EAAOC,CAAC,GAAKG,EACtC,KAAK,MAAMF,CAAC,GAAKC,EAAI,SACjBC,GAAO,IACTA,GAAO,GACPF,GAAK,EACL,KAAK,MAAMA,CAAC,GAAKC,IAAM,IAEvBC,GAAO,CAGb,CAEA,KAAK,OAAO,CACd,EAEA,SAASS,EAAWC,EAAKd,EAAOe,EAAKC,EAAK,CAIxC,QAHIL,EAAI,EACJM,EAAI,EACJC,EAAM,KAAK,IAAIJ,EAAI,OAAQC,CAAG,EACzBd,EAAID,EAAOC,EAAIiB,EAAKjB,IAAK,CAChC,IAAIO,EAAIM,EAAI,WAAWb,CAAC,EAAI,GAE5BU,GAAKK,EAGDR,GAAK,GACPS,EAAIT,EAAI,GAAK,GAGJA,GAAK,GACdS,EAAIT,EAAI,GAAK,GAIbS,EAAIT,EAENvB,EAAOuB,GAAK,GAAKS,EAAID,EAAK,mBAAmB,EAC7CL,GAAKM,CACP,CACA,OAAON,CACT,CAEAnB,EAAG,UAAU,WAAa,SAAqBC,EAAQC,EAAMM,EAAO,CAElE,KAAK,MAAQ,CAAC,CAAC,EACf,KAAK,OAAS,EAGd,QAASmB,EAAU,EAAGC,EAAU,EAAGA,GAAW,SAAWA,GAAW1B,EAClEyB,IAEFA,IACAC,EAAWA,EAAU1B,EAAQ,EAO7B,QALI2B,EAAQ5B,EAAO,OAASO,EACxBsB,EAAMD,EAAQF,EACdJ,EAAM,KAAK,IAAIM,EAAOA,EAAQC,CAAG,EAAItB,EAErCuB,EAAO,EACFtB,EAAID,EAAOC,EAAIc,EAAKd,GAAKkB,EAChCI,EAAOV,EAAUpB,EAAQQ,EAAGA,EAAIkB,EAASzB,CAAI,EAE7C,KAAK,MAAM0B,CAAO,EACd,KAAK,MAAM,CAAC,EAAIG,EAAO,SACzB,KAAK,MAAM,CAAC,GAAKA,EAEjB,KAAK,OAAOA,CAAI,EAIpB,GAAID,IAAQ,EAAG,CACb,IAAIE,EAAM,EAGV,IAFAD,EAAOV,EAAUpB,EAAQQ,EAAGR,EAAO,OAAQC,CAAI,EAE1CO,EAAI,EAAGA,EAAIqB,EAAKrB,IACnBuB,GAAO9B,EAGT,KAAK,MAAM8B,CAAG,EACV,KAAK,MAAM,CAAC,EAAID,EAAO,SACzB,KAAK,MAAM,CAAC,GAAKA,EAEjB,KAAK,OAAOA,CAAI,CAEpB,CAEA,KAAK,OAAO,CACd,EAEA/B,EAAG,UAAU,KAAO,SAAeiC,EAAM,CACvCA,EAAK,MAAQ,IAAI,MAAM,KAAK,MAAM,EAClC,QAASxB,EAAI,EAAGA,EAAI,KAAK,OAAQA,IAC/BwB,EAAK,MAAMxB,CAAC,EAAI,KAAK,MAAMA,CAAC,EAE9BwB,EAAK,OAAS,KAAK,OACnBA,EAAK,SAAW,KAAK,SACrBA,EAAK,IAAM,KAAK,GAClB,EAEA,SAASC,EAAMD,EAAME,EAAK,CACxBF,EAAK,MAAQE,EAAI,MACjBF,EAAK,OAASE,EAAI,OAClBF,EAAK,SAAWE,EAAI,SACpBF,EAAK,IAAME,EAAI,GACjB,CAqCA,GAnCAnC,EAAG,UAAU,MAAQ,SAAgBiC,EAAM,CACzCC,EAAKD,EAAM,IAAI,CACjB,EAEAjC,EAAG,UAAU,MAAQ,UAAkB,CACrC,IAAImB,EAAI,IAAInB,EAAG,IAAI,EACnB,YAAK,KAAKmB,CAAC,EACJA,CACT,EAEAnB,EAAG,UAAU,QAAU,SAAkBoC,EAAM,CAC7C,KAAO,KAAK,OAASA,GACnB,KAAK,MAAM,KAAK,QAAQ,EAAI,EAE9B,OAAO,IACT,EAGApC,EAAG,UAAU,OAAS,UAAkB,CACtC,KAAO,KAAK,OAAS,GAAK,KAAK,MAAM,KAAK,OAAS,CAAC,IAAM,GACxD,KAAK,SAEP,OAAO,KAAK,UAAU,CACxB,EAEAA,EAAG,UAAU,UAAY,UAAsB,CAE7C,OAAI,KAAK,SAAW,GAAK,KAAK,MAAM,CAAC,IAAM,IACzC,KAAK,SAAW,GAEX,IACT,EAII,OAAO,OAAW,KAAe,OAAO,OAAO,KAAQ,WACzD,GAAI,CACFA,EAAG,UAAU,OAAO,IAAI,4BAA4B,CAAC,EAAIqC,CAC3D,MAAY,CACVrC,EAAG,UAAU,QAAUqC,CACzB,MAEArC,EAAG,UAAU,QAAUqC,EAGzB,SAASA,GAAW,CAClB,OAAQ,KAAK,IAAM,UAAY,SAAW,KAAK,SAAS,EAAE,EAAI,GAChE,CAgCA,IAAIC,EAAQ,CACV,GACA,IACA,KACA,MACA,OACA,QACA,SACA,UACA,WACA,YACA,aACA,cACA,eACA,gBACA,iBACA,kBACA,mBACA,oBACA,qBACA,sBACA,uBACA,wBACA,yBACA,0BACA,2BACA,2BACF,EAEIC,EAAa,CACf,EAAG,EACH,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,EACvB,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAClB,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAClB,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAClB,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CACpB,EAEIC,EAAa,CACf,EAAG,EACH,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAC5D,SAAU,IAAU,SAAU,SAAU,SAAU,QAAS,SAC3D,SAAU,SAAU,SAAU,SAAU,KAAU,QAAS,QAC3D,QAAS,QAAS,QAAS,SAAU,SAAU,SAAU,SACzD,MAAU,SAAU,SAAU,SAAU,SAAU,SAAU,QAC9D,EAEAxC,EAAG,UAAU,SAAW,SAAmBE,EAAMuC,EAAS,CACxDvC,EAAOA,GAAQ,GACfuC,EAAUA,EAAU,GAAK,EAEzB,IAAIC,EACJ,GAAIxC,IAAS,IAAMA,IAAS,MAAO,CACjCwC,EAAM,GAGN,QAFI9B,EAAM,EACN+B,EAAQ,EACHlC,EAAI,EAAGA,EAAI,KAAK,OAAQA,IAAK,CACpC,IAAIE,EAAI,KAAK,MAAMF,CAAC,EAChBsB,IAAUpB,GAAKC,EAAO+B,GAAS,UAAU,SAAS,EAAE,EACxDA,EAAShC,IAAO,GAAKC,EAAQ,SAC7BA,GAAO,EACHA,GAAO,KACTA,GAAO,GACPH,KAEEkC,IAAU,GAAKlC,IAAM,KAAK,OAAS,EACrCiC,EAAMJ,EAAM,EAAIP,EAAK,MAAM,EAAIA,EAAOW,EAEtCA,EAAMX,EAAOW,CAEjB,CAIA,IAHIC,IAAU,IACZD,EAAMC,EAAM,SAAS,EAAE,EAAID,GAEtBA,EAAI,OAASD,IAAY,GAC9BC,EAAM,IAAMA,EAEd,OAAI,KAAK,WAAa,IACpBA,EAAM,IAAMA,GAEPA,CACT,CAEA,GAAIxC,KAAUA,EAAO,IAAMA,GAAQ,GAAKA,GAAQ,GAAI,CAElD,IAAI0C,EAAYL,EAAWrC,CAAI,EAE3B2C,EAAYL,EAAWtC,CAAI,EAC/BwC,EAAM,GACN,IAAI1B,EAAI,KAAK,MAAM,EAEnB,IADAA,EAAE,SAAW,EACN,CAACA,EAAE,OAAO,GAAG,CAClB,IAAIG,EAAIH,EAAE,MAAM6B,CAAS,EAAE,SAAS3C,CAAI,EACxCc,EAAIA,EAAE,MAAM6B,CAAS,EAEhB7B,EAAE,OAAO,EAGZ0B,EAAMvB,EAAIuB,EAFVA,EAAMJ,EAAMM,EAAYzB,EAAE,MAAM,EAAIA,EAAIuB,CAI5C,CAIA,IAHI,KAAK,OAAO,IACdA,EAAM,IAAMA,GAEPA,EAAI,OAASD,IAAY,GAC9BC,EAAM,IAAMA,EAEd,OAAI,KAAK,WAAa,IACpBA,EAAM,IAAMA,GAEPA,CACT,CAEAjD,EAAO,GAAO,iCAAiC,CACjD,EAEAO,EAAG,UAAU,SAAW,UAAqB,CAC3C,IAAI8C,EAAM,KAAK,MAAM,CAAC,EACtB,OAAI,KAAK,SAAW,EAClBA,GAAO,KAAK,MAAM,CAAC,EAAI,SACd,KAAK,SAAW,GAAK,KAAK,MAAM,CAAC,IAAM,EAEhDA,GAAO,iBAAoB,KAAK,MAAM,CAAC,EAAI,SAClC,KAAK,OAAS,GACvBrD,EAAO,GAAO,4CAA4C,EAEpD,KAAK,WAAa,EAAK,CAACqD,EAAMA,CACxC,EAEA9C,EAAG,UAAU,OAAS,UAAmB,CACvC,OAAO,KAAK,SAAS,GAAI,CAAC,CAC5B,EAEII,IACFJ,EAAG,UAAU,SAAW,SAAmBG,EAAQ4C,EAAQ,CACzD,OAAO,KAAK,YAAY3C,EAAQD,EAAQ4C,CAAM,CAChD,GAGF/C,EAAG,UAAU,QAAU,SAAkBG,EAAQ4C,EAAQ,CACvD,OAAO,KAAK,YAAY,MAAO5C,EAAQ4C,CAAM,CAC/C,EAEA,IAAIC,EAAW,SAAmBC,EAAWb,EAAM,CACjD,OAAIa,EAAU,YACLA,EAAU,YAAYb,CAAI,EAE5B,IAAIa,EAAUb,CAAI,CAC3B,EAEApC,EAAG,UAAU,YAAc,SAAsBiD,EAAW9C,EAAQ4C,EAAQ,CAC1E,KAAK,OAAO,EAEZ,IAAIG,EAAa,KAAK,WAAW,EAC7BC,EAAYJ,GAAU,KAAK,IAAI,EAAGG,CAAU,EAChDzD,EAAOyD,GAAcC,EAAW,uCAAuC,EACvE1D,EAAO0D,EAAY,EAAG,6BAA6B,EAEnD,IAAIC,EAAMJ,EAASC,EAAWE,CAAS,EACnCE,EAAUlD,IAAW,KAAO,KAAO,KACvC,YAAK,eAAiBkD,CAAO,EAAED,EAAKF,CAAU,EACvCE,CACT,EAEApD,EAAG,UAAU,eAAiB,SAAyBoD,EAAKF,EAAY,CAItE,QAHII,EAAW,EACXX,EAAQ,EAEHlC,EAAI,EAAG8C,EAAQ,EAAG9C,EAAI,KAAK,OAAQA,IAAK,CAC/C,IAAIsB,EAAQ,KAAK,MAAMtB,CAAC,GAAK8C,EAASZ,EAEtCS,EAAIE,GAAU,EAAIvB,EAAO,IACrBuB,EAAWF,EAAI,SACjBA,EAAIE,GAAU,EAAKvB,GAAQ,EAAK,KAE9BuB,EAAWF,EAAI,SACjBA,EAAIE,GAAU,EAAKvB,GAAQ,GAAM,KAG/BwB,IAAU,GACRD,EAAWF,EAAI,SACjBA,EAAIE,GAAU,EAAKvB,GAAQ,GAAM,KAEnCY,EAAQ,EACRY,EAAQ,IAERZ,EAAQZ,IAAS,GACjBwB,GAAS,EAEb,CAEA,GAAID,EAAWF,EAAI,OAGjB,IAFAA,EAAIE,GAAU,EAAIX,EAEXW,EAAWF,EAAI,QACpBA,EAAIE,GAAU,EAAI,CAGxB,EAEAtD,EAAG,UAAU,eAAiB,SAAyBoD,EAAKF,EAAY,CAItE,QAHII,EAAWF,EAAI,OAAS,EACxBT,EAAQ,EAEHlC,EAAI,EAAG8C,EAAQ,EAAG9C,EAAI,KAAK,OAAQA,IAAK,CAC/C,IAAIsB,EAAQ,KAAK,MAAMtB,CAAC,GAAK8C,EAASZ,EAEtCS,EAAIE,GAAU,EAAIvB,EAAO,IACrBuB,GAAY,IACdF,EAAIE,GAAU,EAAKvB,GAAQ,EAAK,KAE9BuB,GAAY,IACdF,EAAIE,GAAU,EAAKvB,GAAQ,GAAM,KAG/BwB,IAAU,GACRD,GAAY,IACdF,EAAIE,GAAU,EAAKvB,GAAQ,GAAM,KAEnCY,EAAQ,EACRY,EAAQ,IAERZ,EAAQZ,IAAS,GACjBwB,GAAS,EAEb,CAEA,GAAID,GAAY,EAGd,IAFAF,EAAIE,GAAU,EAAIX,EAEXW,GAAY,GACjBF,EAAIE,GAAU,EAAI,CAGxB,EAEI,KAAK,MACPtD,EAAG,UAAU,WAAa,SAAqBW,EAAG,CAChD,MAAO,IAAK,KAAK,MAAMA,CAAC,CAC1B,EAEAX,EAAG,UAAU,WAAa,SAAqBW,EAAG,CAChD,IAAI6C,EAAI7C,EACJQ,EAAI,EACR,OAAIqC,GAAK,OACPrC,GAAK,GACLqC,KAAO,IAELA,GAAK,KACPrC,GAAK,EACLqC,KAAO,GAELA,GAAK,IACPrC,GAAK,EACLqC,KAAO,GAELA,GAAK,IACPrC,GAAK,EACLqC,KAAO,GAEFrC,EAAIqC,CACb,EAGFxD,EAAG,UAAU,UAAY,SAAoBW,EAAG,CAE9C,GAAIA,IAAM,EAAG,MAAO,IAEpB,IAAI6C,EAAI7C,EACJQ,EAAI,EACR,OAAKqC,EAAI,QAAY,IACnBrC,GAAK,GACLqC,KAAO,KAEJA,EAAI,OAAU,IACjBrC,GAAK,EACLqC,KAAO,IAEJA,EAAI,MAAS,IAChBrC,GAAK,EACLqC,KAAO,IAEJA,EAAI,KAAS,IAChBrC,GAAK,EACLqC,KAAO,IAEJA,EAAI,KAAS,GAChBrC,IAEKA,CACT,EAGAnB,EAAG,UAAU,UAAY,UAAsB,CAC7C,IAAIW,EAAI,KAAK,MAAM,KAAK,OAAS,CAAC,EAC9B8C,EAAK,KAAK,WAAW9C,CAAC,EAC1B,OAAQ,KAAK,OAAS,GAAK,GAAK8C,CAClC,EAEA,SAASC,EAAYrD,EAAK,CAGxB,QAFIM,EAAI,IAAI,MAAMN,EAAI,UAAU,CAAC,EAExBsD,EAAM,EAAGA,EAAMhD,EAAE,OAAQgD,IAAO,CACvC,IAAI/C,EAAO+C,EAAM,GAAM,EACnBC,EAAOD,EAAM,GAEjBhD,EAAEgD,CAAG,EAAKtD,EAAI,MAAMO,CAAG,IAAMgD,EAAQ,CACvC,CAEA,OAAOjD,CACT,CAGAX,EAAG,UAAU,SAAW,UAAqB,CAC3C,GAAI,KAAK,OAAO,EAAG,MAAO,GAG1B,QADImB,EAAI,EACCV,EAAI,EAAGA,EAAI,KAAK,OAAQA,IAAK,CACpC,IAAIgB,EAAI,KAAK,UAAU,KAAK,MAAMhB,CAAC,CAAC,EAEpC,GADAU,GAAKM,EACDA,IAAM,GAAI,KAChB,CACA,OAAON,CACT,EAEAnB,EAAG,UAAU,WAAa,UAAuB,CAC/C,OAAO,KAAK,KAAK,KAAK,UAAU,EAAI,CAAC,CACvC,EAEAA,EAAG,UAAU,OAAS,SAAiB6D,EAAO,CAC5C,OAAI,KAAK,WAAa,EACb,KAAK,IAAI,EAAE,MAAMA,CAAK,EAAE,MAAM,CAAC,EAEjC,KAAK,MAAM,CACpB,EAEA7D,EAAG,UAAU,SAAW,SAAmB6D,EAAO,CAChD,OAAI,KAAK,MAAMA,EAAQ,CAAC,EACf,KAAK,KAAKA,CAAK,EAAE,MAAM,CAAC,EAAE,KAAK,EAEjC,KAAK,MAAM,CACpB,EAEA7D,EAAG,UAAU,MAAQ,UAAkB,CACrC,OAAO,KAAK,WAAa,CAC3B,EAGAA,EAAG,UAAU,IAAM,UAAgB,CACjC,OAAO,KAAK,MAAM,EAAE,KAAK,CAC3B,EAEAA,EAAG,UAAU,KAAO,UAAiB,CACnC,OAAK,KAAK,OAAO,IACf,KAAK,UAAY,GAGZ,IACT,EAGAA,EAAG,UAAU,KAAO,SAAeK,EAAK,CACtC,KAAO,KAAK,OAASA,EAAI,QACvB,KAAK,MAAM,KAAK,QAAQ,EAAI,EAG9B,QAASI,EAAI,EAAGA,EAAIJ,EAAI,OAAQI,IAC9B,KAAK,MAAMA,CAAC,EAAI,KAAK,MAAMA,CAAC,EAAIJ,EAAI,MAAMI,CAAC,EAG7C,OAAO,KAAK,OAAO,CACrB,EAEAT,EAAG,UAAU,IAAM,SAAcK,EAAK,CACpC,OAAAZ,GAAQ,KAAK,SAAWY,EAAI,YAAc,CAAC,EACpC,KAAK,KAAKA,CAAG,CACtB,EAGAL,EAAG,UAAU,GAAK,SAAaK,EAAK,CAClC,OAAI,KAAK,OAASA,EAAI,OAAe,KAAK,MAAM,EAAE,IAAIA,CAAG,EAClDA,EAAI,MAAM,EAAE,IAAI,IAAI,CAC7B,EAEAL,EAAG,UAAU,IAAM,SAAcK,EAAK,CACpC,OAAI,KAAK,OAASA,EAAI,OAAe,KAAK,MAAM,EAAE,KAAKA,CAAG,EACnDA,EAAI,MAAM,EAAE,KAAK,IAAI,CAC9B,EAGAL,EAAG,UAAU,MAAQ,SAAgBK,EAAK,CAExC,IAAIoB,EACA,KAAK,OAASpB,EAAI,OACpBoB,EAAIpB,EAEJoB,EAAI,KAGN,QAAShB,EAAI,EAAGA,EAAIgB,EAAE,OAAQhB,IAC5B,KAAK,MAAMA,CAAC,EAAI,KAAK,MAAMA,CAAC,EAAIJ,EAAI,MAAMI,CAAC,EAG7C,YAAK,OAASgB,EAAE,OAET,KAAK,OAAO,CACrB,EAEAzB,EAAG,UAAU,KAAO,SAAeK,EAAK,CACtC,OAAAZ,GAAQ,KAAK,SAAWY,EAAI,YAAc,CAAC,EACpC,KAAK,MAAMA,CAAG,CACvB,EAGAL,EAAG,UAAU,IAAM,SAAcK,EAAK,CACpC,OAAI,KAAK,OAASA,EAAI,OAAe,KAAK,MAAM,EAAE,KAAKA,CAAG,EACnDA,EAAI,MAAM,EAAE,KAAK,IAAI,CAC9B,EAEAL,EAAG,UAAU,KAAO,SAAeK,EAAK,CACtC,OAAI,KAAK,OAASA,EAAI,OAAe,KAAK,MAAM,EAAE,MAAMA,CAAG,EACpDA,EAAI,MAAM,EAAE,MAAM,IAAI,CAC/B,EAGAL,EAAG,UAAU,MAAQ,SAAgBK,EAAK,CAExC,IAAIyD,EACArC,EACA,KAAK,OAASpB,EAAI,QACpByD,EAAI,KACJrC,EAAIpB,IAEJyD,EAAIzD,EACJoB,EAAI,MAGN,QAAShB,EAAI,EAAGA,EAAIgB,EAAE,OAAQhB,IAC5B,KAAK,MAAMA,CAAC,EAAIqD,EAAE,MAAMrD,CAAC,EAAIgB,EAAE,MAAMhB,CAAC,EAGxC,GAAI,OAASqD,EACX,KAAOrD,EAAIqD,EAAE,OAAQrD,IACnB,KAAK,MAAMA,CAAC,EAAIqD,EAAE,MAAMrD,CAAC,EAI7B,YAAK,OAASqD,EAAE,OAET,KAAK,OAAO,CACrB,EAEA9D,EAAG,UAAU,KAAO,SAAeK,EAAK,CACtC,OAAAZ,GAAQ,KAAK,SAAWY,EAAI,YAAc,CAAC,EACpC,KAAK,MAAMA,CAAG,CACvB,EAGAL,EAAG,UAAU,IAAM,SAAcK,EAAK,CACpC,OAAI,KAAK,OAASA,EAAI,OAAe,KAAK,MAAM,EAAE,KAAKA,CAAG,EACnDA,EAAI,MAAM,EAAE,KAAK,IAAI,CAC9B,EAEAL,EAAG,UAAU,KAAO,SAAeK,EAAK,CACtC,OAAI,KAAK,OAASA,EAAI,OAAe,KAAK,MAAM,EAAE,MAAMA,CAAG,EACpDA,EAAI,MAAM,EAAE,MAAM,IAAI,CAC/B,EAGAL,EAAG,UAAU,MAAQ,SAAgB6D,EAAO,CAC1CpE,EAAO,OAAOoE,GAAU,UAAYA,GAAS,CAAC,EAE9C,IAAIE,EAAc,KAAK,KAAKF,EAAQ,EAAE,EAAI,EACtCG,EAAWH,EAAQ,GAGvB,KAAK,QAAQE,CAAW,EAEpBC,EAAW,GACbD,IAIF,QAAStD,EAAI,EAAGA,EAAIsD,EAAatD,IAC/B,KAAK,MAAMA,CAAC,EAAI,CAAC,KAAK,MAAMA,CAAC,EAAI,SAInC,OAAIuD,EAAW,IACb,KAAK,MAAMvD,CAAC,EAAI,CAAC,KAAK,MAAMA,CAAC,EAAK,UAAc,GAAKuD,GAIhD,KAAK,OAAO,CACrB,EAEAhE,EAAG,UAAU,KAAO,SAAe6D,EAAO,CACxC,OAAO,KAAK,MAAM,EAAE,MAAMA,CAAK,CACjC,EAGA7D,EAAG,UAAU,KAAO,SAAe2D,EAAKjE,EAAK,CAC3CD,EAAO,OAAOkE,GAAQ,UAAYA,GAAO,CAAC,EAE1C,IAAI/C,EAAO+C,EAAM,GAAM,EACnBC,EAAOD,EAAM,GAEjB,YAAK,QAAQ/C,EAAM,CAAC,EAEhBlB,EACF,KAAK,MAAMkB,CAAG,EAAI,KAAK,MAAMA,CAAG,EAAK,GAAKgD,EAE1C,KAAK,MAAMhD,CAAG,EAAI,KAAK,MAAMA,CAAG,EAAI,EAAE,GAAKgD,GAGtC,KAAK,OAAO,CACrB,EAGA5D,EAAG,UAAU,KAAO,SAAeK,EAAK,CACtC,IAAIc,EAGJ,GAAI,KAAK,WAAa,GAAKd,EAAI,WAAa,EAC1C,YAAK,SAAW,EAChBc,EAAI,KAAK,KAAKd,CAAG,EACjB,KAAK,UAAY,EACV,KAAK,UAAU,EAGjB,GAAI,KAAK,WAAa,GAAKA,EAAI,WAAa,EACjD,OAAAA,EAAI,SAAW,EACfc,EAAI,KAAK,KAAKd,CAAG,EACjBA,EAAI,SAAW,EACRc,EAAE,UAAU,EAIrB,IAAI2C,EAAGrC,EACH,KAAK,OAASpB,EAAI,QACpByD,EAAI,KACJrC,EAAIpB,IAEJyD,EAAIzD,EACJoB,EAAI,MAIN,QADIkB,EAAQ,EACHlC,EAAI,EAAGA,EAAIgB,EAAE,OAAQhB,IAC5BU,GAAK2C,EAAE,MAAMrD,CAAC,EAAI,IAAMgB,EAAE,MAAMhB,CAAC,EAAI,GAAKkC,EAC1C,KAAK,MAAMlC,CAAC,EAAIU,EAAI,SACpBwB,EAAQxB,IAAM,GAEhB,KAAOwB,IAAU,GAAKlC,EAAIqD,EAAE,OAAQrD,IAClCU,GAAK2C,EAAE,MAAMrD,CAAC,EAAI,GAAKkC,EACvB,KAAK,MAAMlC,CAAC,EAAIU,EAAI,SACpBwB,EAAQxB,IAAM,GAIhB,GADA,KAAK,OAAS2C,EAAE,OACZnB,IAAU,EACZ,KAAK,MAAM,KAAK,MAAM,EAAIA,EAC1B,KAAK,iBAEImB,IAAM,KACf,KAAOrD,EAAIqD,EAAE,OAAQrD,IACnB,KAAK,MAAMA,CAAC,EAAIqD,EAAE,MAAMrD,CAAC,EAI7B,OAAO,IACT,EAGAT,EAAG,UAAU,IAAM,SAAcK,EAAK,CACpC,IAAI+C,EACJ,OAAI/C,EAAI,WAAa,GAAK,KAAK,WAAa,GAC1CA,EAAI,SAAW,EACf+C,EAAM,KAAK,IAAI/C,CAAG,EAClBA,EAAI,UAAY,EACT+C,GACE/C,EAAI,WAAa,GAAK,KAAK,WAAa,GACjD,KAAK,SAAW,EAChB+C,EAAM/C,EAAI,IAAI,IAAI,EAClB,KAAK,SAAW,EACT+C,GAGL,KAAK,OAAS/C,EAAI,OAAe,KAAK,MAAM,EAAE,KAAKA,CAAG,EAEnDA,EAAI,MAAM,EAAE,KAAK,IAAI,CAC9B,EAGAL,EAAG,UAAU,KAAO,SAAeK,EAAK,CAEtC,GAAIA,EAAI,WAAa,EAAG,CACtBA,EAAI,SAAW,EACf,IAAIc,EAAI,KAAK,KAAKd,CAAG,EACrB,OAAAA,EAAI,SAAW,EACRc,EAAE,UAAU,CAGrB,SAAW,KAAK,WAAa,EAC3B,YAAK,SAAW,EAChB,KAAK,KAAKd,CAAG,EACb,KAAK,SAAW,EACT,KAAK,UAAU,EAIxB,IAAI4D,EAAM,KAAK,IAAI5D,CAAG,EAGtB,GAAI4D,IAAQ,EACV,YAAK,SAAW,EAChB,KAAK,OAAS,EACd,KAAK,MAAM,CAAC,EAAI,EACT,KAIT,IAAIH,EAAGrC,EACHwC,EAAM,GACRH,EAAI,KACJrC,EAAIpB,IAEJyD,EAAIzD,EACJoB,EAAI,MAIN,QADIkB,EAAQ,EACHlC,EAAI,EAAGA,EAAIgB,EAAE,OAAQhB,IAC5BU,GAAK2C,EAAE,MAAMrD,CAAC,EAAI,IAAMgB,EAAE,MAAMhB,CAAC,EAAI,GAAKkC,EAC1CA,EAAQxB,GAAK,GACb,KAAK,MAAMV,CAAC,EAAIU,EAAI,SAEtB,KAAOwB,IAAU,GAAKlC,EAAIqD,EAAE,OAAQrD,IAClCU,GAAK2C,EAAE,MAAMrD,CAAC,EAAI,GAAKkC,EACvBA,EAAQxB,GAAK,GACb,KAAK,MAAMV,CAAC,EAAIU,EAAI,SAItB,GAAIwB,IAAU,GAAKlC,EAAIqD,EAAE,QAAUA,IAAM,KACvC,KAAOrD,EAAIqD,EAAE,OAAQrD,IACnB,KAAK,MAAMA,CAAC,EAAIqD,EAAE,MAAMrD,CAAC,EAI7B,YAAK,OAAS,KAAK,IAAI,KAAK,OAAQA,CAAC,EAEjCqD,IAAM,OACR,KAAK,SAAW,GAGX,KAAK,OAAO,CACrB,EAGA9D,EAAG,UAAU,IAAM,SAAcK,EAAK,CACpC,OAAO,KAAK,MAAM,EAAE,KAAKA,CAAG,CAC9B,EAEA,SAAS6D,GAAYC,EAAM9D,EAAKqC,EAAK,CACnCA,EAAI,SAAWrC,EAAI,SAAW8D,EAAK,SACnC,IAAIzC,EAAOyC,EAAK,OAAS9D,EAAI,OAAU,EACvCqC,EAAI,OAAShB,EACbA,EAAOA,EAAM,EAAK,EAGlB,IAAIoC,EAAIK,EAAK,MAAM,CAAC,EAAI,EACpB1C,EAAIpB,EAAI,MAAM,CAAC,EAAI,EACnBc,EAAI2C,EAAIrC,EAER2C,EAAKjD,EAAI,SACTwB,EAASxB,EAAI,SAAa,EAC9BuB,EAAI,MAAM,CAAC,EAAI0B,EAEf,QAASC,EAAI,EAAGA,EAAI3C,EAAK2C,IAAK,CAM5B,QAHIC,EAAS3B,IAAU,GACnB4B,EAAQ5B,EAAQ,SAChB6B,EAAO,KAAK,IAAIH,EAAGhE,EAAI,OAAS,CAAC,EAC5BK,EAAI,KAAK,IAAI,EAAG2D,EAAIF,EAAK,OAAS,CAAC,EAAGzD,GAAK8D,EAAM9D,IAAK,CAC7D,IAAID,EAAK4D,EAAI3D,EAAK,EAClBoD,EAAIK,EAAK,MAAM1D,CAAC,EAAI,EACpBgB,EAAIpB,EAAI,MAAMK,CAAC,EAAI,EACnBS,EAAI2C,EAAIrC,EAAI8C,EACZD,GAAWnD,EAAI,SAAa,EAC5BoD,EAAQpD,EAAI,QACd,CACAuB,EAAI,MAAM2B,CAAC,EAAIE,EAAQ,EACvB5B,EAAQ2B,EAAS,CACnB,CACA,OAAI3B,IAAU,EACZD,EAAI,MAAM2B,CAAC,EAAI1B,EAAQ,EAEvBD,EAAI,SAGCA,EAAI,OAAO,CACpB,CAKA,IAAI+B,EAAc,SAAsBN,EAAM9D,EAAKqC,EAAK,CACtD,IAAIoB,EAAIK,EAAK,MACT1C,EAAIpB,EAAI,MACRqE,EAAIhC,EAAI,MACR1B,EAAI,EACJoD,EACAO,EACAlB,EACAmB,EAAKd,EAAE,CAAC,EAAI,EACZe,EAAMD,EAAK,KACXE,EAAMF,IAAO,GACbG,EAAKjB,EAAE,CAAC,EAAI,EACZkB,EAAMD,EAAK,KACXE,EAAMF,IAAO,GACbG,GAAKpB,EAAE,CAAC,EAAI,EACZqB,EAAMD,GAAK,KACXE,EAAMF,KAAO,GACbG,GAAKvB,EAAE,CAAC,EAAI,EACZwB,EAAMD,GAAK,KACXE,EAAMF,KAAO,GACbG,GAAK1B,EAAE,CAAC,EAAI,EACZ2B,EAAMD,GAAK,KACXE,EAAMF,KAAO,GACbG,GAAK7B,EAAE,CAAC,EAAI,EACZ8B,GAAMD,GAAK,KACXE,GAAMF,KAAO,GACbG,GAAKhC,EAAE,CAAC,EAAI,EACZiC,GAAMD,GAAK,KACXE,GAAMF,KAAO,GACbG,GAAKnC,EAAE,CAAC,EAAI,EACZoC,GAAMD,GAAK,KACXE,GAAMF,KAAO,GACbG,GAAKtC,EAAE,CAAC,EAAI,EACZuC,GAAMD,GAAK,KACXE,GAAMF,KAAO,GACbG,GAAKzC,EAAE,CAAC,EAAI,EACZ0C,GAAMD,GAAK,KACXE,GAAMF,KAAO,GACbG,GAAKjF,EAAE,CAAC,EAAI,EACZkF,GAAMD,GAAK,KACXE,GAAMF,KAAO,GACbG,GAAKpF,EAAE,CAAC,EAAI,EACZqF,GAAMD,GAAK,KACXE,GAAMF,KAAO,GACbG,GAAKvF,EAAE,CAAC,EAAI,EACZwF,GAAMD,GAAK,KACXE,GAAMF,KAAO,GACbG,GAAK1F,EAAE,CAAC,EAAI,EACZ2F,GAAMD,GAAK,KACXE,GAAMF,KAAO,GACbG,GAAK7F,EAAE,CAAC,EAAI,EACZ8F,GAAMD,GAAK,KACXE,GAAMF,KAAO,GACbG,GAAKhG,EAAE,CAAC,EAAI,EACZiG,GAAMD,GAAK,KACXE,GAAMF,KAAO,GACbG,GAAKnG,EAAE,CAAC,EAAI,EACZoG,GAAMD,GAAK,KACXE,GAAMF,KAAO,GACbG,GAAKtG,EAAE,CAAC,EAAI,EACZuG,GAAMD,GAAK,KACXE,GAAMF,KAAO,GACbG,GAAKzG,EAAE,CAAC,EAAI,EACZ0G,GAAMD,GAAK,KACXE,GAAMF,KAAO,GACbG,GAAK5G,EAAE,CAAC,EAAI,EACZ6G,GAAMD,GAAK,KACXE,GAAMF,KAAO,GAEjB3F,EAAI,SAAWyB,EAAK,SAAW9D,EAAI,SACnCqC,EAAI,OAAS,GAEb0B,EAAK,KAAK,KAAKS,EAAK8B,EAAG,EACvBhC,EAAM,KAAK,KAAKE,EAAK+B,EAAG,EACxBjC,EAAOA,EAAM,KAAK,KAAKG,EAAK6B,EAAG,EAAK,EACpClD,EAAK,KAAK,KAAKqB,EAAK8B,EAAG,EACvB,IAAI4B,IAAQxH,EAAIoD,EAAM,KAAOO,EAAM,OAAW,IAAO,EACrD3D,GAAOyC,GAAMkB,IAAQ,IAAO,IAAM6D,KAAO,IAAO,EAChDA,IAAM,SAENpE,EAAK,KAAK,KAAKY,EAAK2B,EAAG,EACvBhC,EAAM,KAAK,KAAKK,EAAK4B,EAAG,EACxBjC,EAAOA,EAAM,KAAK,KAAKM,EAAK0B,EAAG,EAAK,EACpClD,EAAK,KAAK,KAAKwB,EAAK2B,EAAG,EACvBxC,EAAMA,EAAK,KAAK,KAAKS,EAAKiC,EAAG,EAAK,EAClCnC,EAAOA,EAAM,KAAK,KAAKE,EAAKkC,EAAG,EAAK,EACpCpC,EAAOA,EAAM,KAAK,KAAKG,EAAKgC,EAAG,EAAK,EACpCrD,EAAMA,EAAK,KAAK,KAAKqB,EAAKiC,EAAG,EAAK,EAClC,IAAI0B,IAAQzH,EAAIoD,EAAM,KAAOO,EAAM,OAAW,IAAO,EACrD3D,GAAOyC,GAAMkB,IAAQ,IAAO,IAAM8D,KAAO,IAAO,EAChDA,IAAM,SAENrE,EAAK,KAAK,KAAKe,EAAKwB,EAAG,EACvBhC,EAAM,KAAK,KAAKQ,EAAKyB,EAAG,EACxBjC,EAAOA,EAAM,KAAK,KAAKS,EAAKuB,EAAG,EAAK,EACpClD,EAAK,KAAK,KAAK2B,EAAKwB,EAAG,EACvBxC,EAAMA,EAAK,KAAK,KAAKY,EAAK8B,EAAG,EAAK,EAClCnC,EAAOA,EAAM,KAAK,KAAKK,EAAK+B,EAAG,EAAK,EACpCpC,EAAOA,EAAM,KAAK,KAAKM,EAAK6B,EAAG,EAAK,EACpCrD,EAAMA,EAAK,KAAK,KAAKwB,EAAK8B,EAAG,EAAK,EAClC3C,EAAMA,EAAK,KAAK,KAAKS,EAAKoC,EAAG,EAAK,EAClCtC,EAAOA,EAAM,KAAK,KAAKE,EAAKqC,EAAG,EAAK,EACpCvC,EAAOA,EAAM,KAAK,KAAKG,EAAKmC,EAAG,EAAK,EACpCxD,EAAMA,EAAK,KAAK,KAAKqB,EAAKoC,EAAG,EAAK,EAClC,IAAIwB,IAAQ1H,EAAIoD,EAAM,KAAOO,EAAM,OAAW,IAAO,EACrD3D,GAAOyC,GAAMkB,IAAQ,IAAO,IAAM+D,KAAO,IAAO,EAChDA,IAAM,SAENtE,EAAK,KAAK,KAAKkB,EAAKqB,EAAG,EACvBhC,EAAM,KAAK,KAAKW,EAAKsB,EAAG,EACxBjC,EAAOA,EAAM,KAAK,KAAKY,EAAKoB,EAAG,EAAK,EACpClD,EAAK,KAAK,KAAK8B,EAAKqB,EAAG,EACvBxC,EAAMA,EAAK,KAAK,KAAKe,EAAK2B,EAAG,EAAK,EAClCnC,EAAOA,EAAM,KAAK,KAAKQ,EAAK4B,EAAG,EAAK,EACpCpC,EAAOA,EAAM,KAAK,KAAKS,EAAK0B,EAAG,EAAK,EACpCrD,EAAMA,EAAK,KAAK,KAAK2B,EAAK2B,EAAG,EAAK,EAClC3C,EAAMA,EAAK,KAAK,KAAKY,EAAKiC,EAAG,EAAK,EAClCtC,EAAOA,EAAM,KAAK,KAAKK,EAAKkC,EAAG,EAAK,EACpCvC,EAAOA,EAAM,KAAK,KAAKM,EAAKgC,EAAG,EAAK,EACpCxD,EAAMA,EAAK,KAAK,KAAKwB,EAAKiC,EAAG,EAAK,EAClC9C,EAAMA,EAAK,KAAK,KAAKS,EAAKuC,EAAG,EAAK,EAClCzC,EAAOA,EAAM,KAAK,KAAKE,EAAKwC,EAAG,EAAK,EACpC1C,EAAOA,EAAM,KAAK,KAAKG,EAAKsC,EAAG,EAAK,EACpC3D,EAAMA,EAAK,KAAK,KAAKqB,EAAKuC,EAAG,EAAK,EAClC,IAAIsB,IAAQ3H,EAAIoD,EAAM,KAAOO,EAAM,OAAW,IAAO,EACrD3D,GAAOyC,GAAMkB,IAAQ,IAAO,IAAMgE,KAAO,IAAO,EAChDA,IAAM,SAENvE,EAAK,KAAK,KAAKqB,EAAKkB,EAAG,EACvBhC,EAAM,KAAK,KAAKc,EAAKmB,EAAG,EACxBjC,EAAOA,EAAM,KAAK,KAAKe,EAAKiB,EAAG,EAAK,EACpClD,EAAK,KAAK,KAAKiC,EAAKkB,EAAG,EACvBxC,EAAMA,EAAK,KAAK,KAAKkB,EAAKwB,EAAG,EAAK,EAClCnC,EAAOA,EAAM,KAAK,KAAKW,EAAKyB,EAAG,EAAK,EACpCpC,EAAOA,EAAM,KAAK,KAAKY,EAAKuB,EAAG,EAAK,EACpCrD,EAAMA,EAAK,KAAK,KAAK8B,EAAKwB,EAAG,EAAK,EAClC3C,EAAMA,EAAK,KAAK,KAAKe,EAAK8B,EAAG,EAAK,EAClCtC,EAAOA,EAAM,KAAK,KAAKQ,EAAK+B,EAAG,EAAK,EACpCvC,EAAOA,EAAM,KAAK,KAAKS,EAAK6B,EAAG,EAAK,EACpCxD,EAAMA,EAAK,KAAK,KAAK2B,EAAK8B,EAAG,EAAK,EAClC9C,EAAMA,EAAK,KAAK,KAAKY,EAAKoC,EAAG,EAAK,EAClCzC,EAAOA,EAAM,KAAK,KAAKK,EAAKqC,EAAG,EAAK,EACpC1C,EAAOA,EAAM,KAAK,KAAKM,EAAKmC,EAAG,EAAK,EACpC3D,EAAMA,EAAK,KAAK,KAAKwB,EAAKoC,EAAG,EAAK,EAClCjD,EAAMA,EAAK,KAAK,KAAKS,EAAK0C,EAAG,EAAK,EAClC5C,EAAOA,EAAM,KAAK,KAAKE,EAAK2C,EAAG,EAAK,EACpC7C,EAAOA,EAAM,KAAK,KAAKG,EAAKyC,EAAG,EAAK,EACpC9D,EAAMA,EAAK,KAAK,KAAKqB,EAAK0C,EAAG,EAAK,EAClC,IAAIoB,IAAQ5H,EAAIoD,EAAM,KAAOO,EAAM,OAAW,IAAO,EACrD3D,GAAOyC,GAAMkB,IAAQ,IAAO,IAAMiE,KAAO,IAAO,EAChDA,IAAM,SAENxE,EAAK,KAAK,KAAKwB,GAAKe,EAAG,EACvBhC,EAAM,KAAK,KAAKiB,GAAKgB,EAAG,EACxBjC,EAAOA,EAAM,KAAK,KAAKkB,GAAKc,EAAG,EAAK,EACpClD,EAAK,KAAK,KAAKoC,GAAKe,EAAG,EACvBxC,EAAMA,EAAK,KAAK,KAAKqB,EAAKqB,EAAG,EAAK,EAClCnC,EAAOA,EAAM,KAAK,KAAKc,EAAKsB,EAAG,EAAK,EACpCpC,EAAOA,EAAM,KAAK,KAAKe,EAAKoB,EAAG,EAAK,EACpCrD,EAAMA,EAAK,KAAK,KAAKiC,EAAKqB,EAAG,EAAK,EAClC3C,EAAMA,EAAK,KAAK,KAAKkB,EAAK2B,EAAG,EAAK,EAClCtC,EAAOA,EAAM,KAAK,KAAKW,EAAK4B,EAAG,EAAK,EACpCvC,EAAOA,EAAM,KAAK,KAAKY,EAAK0B,EAAG,EAAK,EACpCxD,EAAMA,EAAK,KAAK,KAAK8B,EAAK2B,EAAG,EAAK,EAClC9C,EAAMA,EAAK,KAAK,KAAKe,EAAKiC,EAAG,EAAK,EAClCzC,EAAOA,EAAM,KAAK,KAAKQ,EAAKkC,EAAG,EAAK,EACpC1C,EAAOA,EAAM,KAAK,KAAKS,EAAKgC,EAAG,EAAK,EACpC3D,EAAMA,EAAK,KAAK,KAAK2B,EAAKiC,EAAG,EAAK,EAClCjD,EAAMA,EAAK,KAAK,KAAKY,EAAKuC,EAAG,EAAK,EAClC5C,EAAOA,EAAM,KAAK,KAAKK,EAAKwC,EAAG,EAAK,EACpC7C,EAAOA,EAAM,KAAK,KAAKM,EAAKsC,EAAG,EAAK,EACpC9D,EAAMA,EAAK,KAAK,KAAKwB,EAAKuC,EAAG,EAAK,EAClCpD,EAAMA,EAAK,KAAK,KAAKS,EAAK6C,EAAG,EAAK,EAClC/C,EAAOA,EAAM,KAAK,KAAKE,EAAK8C,EAAG,EAAK,EACpChD,EAAOA,EAAM,KAAK,KAAKG,EAAK4C,EAAG,EAAK,EACpCjE,EAAMA,EAAK,KAAK,KAAKqB,EAAK6C,EAAG,EAAK,EAClC,IAAIkB,IAAQ7H,EAAIoD,EAAM,KAAOO,EAAM,OAAW,IAAO,EACrD3D,GAAOyC,GAAMkB,IAAQ,IAAO,IAAMkE,KAAO,IAAO,EAChDA,IAAM,SAENzE,EAAK,KAAK,KAAK2B,GAAKY,EAAG,EACvBhC,EAAM,KAAK,KAAKoB,GAAKa,EAAG,EACxBjC,EAAOA,EAAM,KAAK,KAAKqB,GAAKW,EAAG,EAAK,EACpClD,EAAK,KAAK,KAAKuC,GAAKY,EAAG,EACvBxC,EAAMA,EAAK,KAAK,KAAKwB,GAAKkB,EAAG,EAAK,EAClCnC,EAAOA,EAAM,KAAK,KAAKiB,GAAKmB,EAAG,EAAK,EACpCpC,EAAOA,EAAM,KAAK,KAAKkB,GAAKiB,EAAG,EAAK,EACpCrD,EAAMA,EAAK,KAAK,KAAKoC,GAAKkB,EAAG,EAAK,EAClC3C,EAAMA,EAAK,KAAK,KAAKqB,EAAKwB,EAAG,EAAK,EAClCtC,EAAOA,EAAM,KAAK,KAAKc,EAAKyB,EAAG,EAAK,EACpCvC,EAAOA,EAAM,KAAK,KAAKe,EAAKuB,EAAG,EAAK,EACpCxD,EAAMA,EAAK,KAAK,KAAKiC,EAAKwB,EAAG,EAAK,EAClC9C,EAAMA,EAAK,KAAK,KAAKkB,EAAK8B,EAAG,EAAK,EAClCzC,EAAOA,EAAM,KAAK,KAAKW,EAAK+B,EAAG,EAAK,EACpC1C,EAAOA,EAAM,KAAK,KAAKY,EAAK6B,EAAG,EAAK,EACpC3D,EAAMA,EAAK,KAAK,KAAK8B,EAAK8B,EAAG,EAAK,EAClCjD,EAAMA,EAAK,KAAK,KAAKe,EAAKoC,EAAG,EAAK,EAClC5C,EAAOA,EAAM,KAAK,KAAKQ,EAAKqC,EAAG,EAAK,EACpC7C,EAAOA,EAAM,KAAK,KAAKS,EAAKmC,EAAG,EAAK,EACpC9D,EAAMA,EAAK,KAAK,KAAK2B,EAAKoC,EAAG,EAAK,EAClCpD,EAAMA,EAAK,KAAK,KAAKY,EAAK0C,EAAG,EAAK,EAClC/C,EAAOA,EAAM,KAAK,KAAKK,EAAK2C,EAAG,EAAK,EACpChD,EAAOA,EAAM,KAAK,KAAKM,EAAKyC,EAAG,EAAK,EACpCjE,EAAMA,EAAK,KAAK,KAAKwB,EAAK0C,EAAG,EAAK,EAClCvD,EAAMA,EAAK,KAAK,KAAKS,EAAKgD,EAAG,EAAK,EAClClD,EAAOA,EAAM,KAAK,KAAKE,EAAKiD,EAAG,EAAK,EACpCnD,EAAOA,EAAM,KAAK,KAAKG,EAAK+C,EAAG,EAAK,EACpCpE,EAAMA,EAAK,KAAK,KAAKqB,EAAKgD,EAAG,EAAK,EAClC,IAAIgB,IAAQ9H,EAAIoD,EAAM,KAAOO,EAAM,OAAW,IAAO,EACrD3D,GAAOyC,GAAMkB,IAAQ,IAAO,IAAMmE,KAAO,IAAO,EAChDA,IAAM,SAEN1E,EAAK,KAAK,KAAK8B,GAAKS,EAAG,EACvBhC,EAAM,KAAK,KAAKuB,GAAKU,EAAG,EACxBjC,EAAOA,EAAM,KAAK,KAAKwB,GAAKQ,EAAG,EAAK,EACpClD,EAAK,KAAK,KAAK0C,GAAKS,EAAG,EACvBxC,EAAMA,EAAK,KAAK,KAAK2B,GAAKe,EAAG,EAAK,EAClCnC,EAAOA,EAAM,KAAK,KAAKoB,GAAKgB,EAAG,EAAK,EACpCpC,EAAOA,EAAM,KAAK,KAAKqB,GAAKc,EAAG,EAAK,EACpCrD,EAAMA,EAAK,KAAK,KAAKuC,GAAKe,EAAG,EAAK,EAClC3C,EAAMA,EAAK,KAAK,KAAKwB,GAAKqB,EAAG,EAAK,EAClCtC,EAAOA,EAAM,KAAK,KAAKiB,GAAKsB,EAAG,EAAK,EACpCvC,EAAOA,EAAM,KAAK,KAAKkB,GAAKoB,EAAG,EAAK,EACpCxD,EAAMA,EAAK,KAAK,KAAKoC,GAAKqB,EAAG,EAAK,EAClC9C,EAAMA,EAAK,KAAK,KAAKqB,EAAK2B,EAAG,EAAK,EAClCzC,EAAOA,EAAM,KAAK,KAAKc,EAAK4B,EAAG,EAAK,EACpC1C,EAAOA,EAAM,KAAK,KAAKe,EAAK0B,EAAG,EAAK,EACpC3D,EAAMA,EAAK,KAAK,KAAKiC,EAAK2B,EAAG,EAAK,EAClCjD,EAAMA,EAAK,KAAK,KAAKkB,EAAKiC,EAAG,EAAK,EAClC5C,EAAOA,EAAM,KAAK,KAAKW,EAAKkC,EAAG,EAAK,EACpC7C,EAAOA,EAAM,KAAK,KAAKY,EAAKgC,EAAG,EAAK,EACpC9D,EAAMA,EAAK,KAAK,KAAK8B,EAAKiC,EAAG,EAAK,EAClCpD,EAAMA,EAAK,KAAK,KAAKe,EAAKuC,EAAG,EAAK,EAClC/C,EAAOA,EAAM,KAAK,KAAKQ,EAAKwC,EAAG,EAAK,EACpChD,EAAOA,EAAM,KAAK,KAAKS,EAAKsC,EAAG,EAAK,EACpCjE,EAAMA,EAAK,KAAK,KAAK2B,EAAKuC,EAAG,EAAK,EAClCvD,EAAMA,EAAK,KAAK,KAAKY,EAAK6C,EAAG,EAAK,EAClClD,EAAOA,EAAM,KAAK,KAAKK,EAAK8C,EAAG,EAAK,EACpCnD,EAAOA,EAAM,KAAK,KAAKM,EAAK4C,EAAG,EAAK,EACpCpE,EAAMA,EAAK,KAAK,KAAKwB,EAAK6C,EAAG,EAAK,EAClC1D,EAAMA,EAAK,KAAK,KAAKS,EAAKmD,EAAG,EAAK,EAClCrD,EAAOA,EAAM,KAAK,KAAKE,EAAKoD,EAAG,EAAK,EACpCtD,EAAOA,EAAM,KAAK,KAAKG,EAAKkD,EAAG,EAAK,EACpCvE,EAAMA,EAAK,KAAK,KAAKqB,EAAKmD,EAAG,EAAK,EAClC,IAAIc,IAAQ/H,EAAIoD,EAAM,KAAOO,EAAM,OAAW,IAAO,EACrD3D,GAAOyC,GAAMkB,IAAQ,IAAO,IAAMoE,KAAO,IAAO,EAChDA,IAAM,SAEN3E,EAAK,KAAK,KAAKiC,GAAKM,EAAG,EACvBhC,EAAM,KAAK,KAAK0B,GAAKO,EAAG,EACxBjC,EAAOA,EAAM,KAAK,KAAK2B,GAAKK,EAAG,EAAK,EACpClD,EAAK,KAAK,KAAK6C,GAAKM,EAAG,EACvBxC,EAAMA,EAAK,KAAK,KAAK8B,GAAKY,EAAG,EAAK,EAClCnC,EAAOA,EAAM,KAAK,KAAKuB,GAAKa,EAAG,EAAK,EACpCpC,EAAOA,EAAM,KAAK,KAAKwB,GAAKW,EAAG,EAAK,EACpCrD,EAAMA,EAAK,KAAK,KAAK0C,GAAKY,EAAG,EAAK,EAClC3C,EAAMA,EAAK,KAAK,KAAK2B,GAAKkB,EAAG,EAAK,EAClCtC,EAAOA,EAAM,KAAK,KAAKoB,GAAKmB,EAAG,EAAK,EACpCvC,EAAOA,EAAM,KAAK,KAAKqB,GAAKiB,EAAG,EAAK,EACpCxD,EAAMA,EAAK,KAAK,KAAKuC,GAAKkB,EAAG,EAAK,EAClC9C,EAAMA,EAAK,KAAK,KAAKwB,GAAKwB,EAAG,EAAK,EAClCzC,EAAOA,EAAM,KAAK,KAAKiB,GAAKyB,EAAG,EAAK,EACpC1C,EAAOA,EAAM,KAAK,KAAKkB,GAAKuB,EAAG,EAAK,EACpC3D,EAAMA,EAAK,KAAK,KAAKoC,GAAKwB,EAAG,EAAK,EAClCjD,EAAMA,EAAK,KAAK,KAAKqB,EAAK8B,EAAG,EAAK,EAClC5C,EAAOA,EAAM,KAAK,KAAKc,EAAK+B,EAAG,EAAK,EACpC7C,EAAOA,EAAM,KAAK,KAAKe,EAAK6B,EAAG,EAAK,EACpC9D,EAAMA,EAAK,KAAK,KAAKiC,EAAK8B,EAAG,EAAK,EAClCpD,EAAMA,EAAK,KAAK,KAAKkB,EAAKoC,EAAG,EAAK,EAClC/C,EAAOA,EAAM,KAAK,KAAKW,EAAKqC,EAAG,EAAK,EACpChD,EAAOA,EAAM,KAAK,KAAKY,EAAKmC,EAAG,EAAK,EACpCjE,EAAMA,EAAK,KAAK,KAAK8B,EAAKoC,EAAG,EAAK,EAClCvD,EAAMA,EAAK,KAAK,KAAKe,EAAK0C,EAAG,EAAK,EAClClD,EAAOA,EAAM,KAAK,KAAKQ,EAAK2C,EAAG,EAAK,EACpCnD,EAAOA,EAAM,KAAK,KAAKS,EAAKyC,EAAG,EAAK,EACpCpE,EAAMA,EAAK,KAAK,KAAK2B,EAAK0C,EAAG,EAAK,EAClC1D,EAAMA,EAAK,KAAK,KAAKY,EAAKgD,EAAG,EAAK,EAClCrD,EAAOA,EAAM,KAAK,KAAKK,EAAKiD,EAAG,EAAK,EACpCtD,EAAOA,EAAM,KAAK,KAAKM,EAAK+C,EAAG,EAAK,EACpCvE,EAAMA,EAAK,KAAK,KAAKwB,EAAKgD,EAAG,EAAK,EAClC7D,EAAMA,EAAK,KAAK,KAAKS,EAAKsD,EAAG,EAAK,EAClCxD,EAAOA,EAAM,KAAK,KAAKE,EAAKuD,EAAG,EAAK,EACpCzD,EAAOA,EAAM,KAAK,KAAKG,EAAKqD,EAAG,EAAK,EACpC1E,EAAMA,EAAK,KAAK,KAAKqB,EAAKsD,EAAG,EAAK,EAClC,IAAIY,IAAQhI,EAAIoD,EAAM,KAAOO,EAAM,OAAW,IAAO,EACrD3D,GAAOyC,GAAMkB,IAAQ,IAAO,IAAMqE,KAAO,IAAO,EAChDA,IAAM,SAEN5E,EAAK,KAAK,KAAKoC,GAAKG,EAAG,EACvBhC,EAAM,KAAK,KAAK6B,GAAKI,EAAG,EACxBjC,EAAOA,EAAM,KAAK,KAAK8B,GAAKE,EAAG,EAAK,EACpClD,EAAK,KAAK,KAAKgD,GAAKG,EAAG,EACvBxC,EAAMA,EAAK,KAAK,KAAKiC,GAAKS,EAAG,EAAK,EAClCnC,EAAOA,EAAM,KAAK,KAAK0B,GAAKU,EAAG,EAAK,EACpCpC,EAAOA,EAAM,KAAK,KAAK2B,GAAKQ,EAAG,EAAK,EACpCrD,EAAMA,EAAK,KAAK,KAAK6C,GAAKS,EAAG,EAAK,EAClC3C,EAAMA,EAAK,KAAK,KAAK8B,GAAKe,EAAG,EAAK,EAClCtC,EAAOA,EAAM,KAAK,KAAKuB,GAAKgB,EAAG,EAAK,EACpCvC,EAAOA,EAAM,KAAK,KAAKwB,GAAKc,EAAG,EAAK,EACpCxD,EAAMA,EAAK,KAAK,KAAK0C,GAAKe,EAAG,EAAK,EAClC9C,EAAMA,EAAK,KAAK,KAAK2B,GAAKqB,EAAG,EAAK,EAClCzC,EAAOA,EAAM,KAAK,KAAKoB,GAAKsB,EAAG,EAAK,EACpC1C,EAAOA,EAAM,KAAK,KAAKqB,GAAKoB,EAAG,EAAK,EACpC3D,EAAMA,EAAK,KAAK,KAAKuC,GAAKqB,EAAG,EAAK,EAClCjD,EAAMA,EAAK,KAAK,KAAKwB,GAAK2B,EAAG,EAAK,EAClC5C,EAAOA,EAAM,KAAK,KAAKiB,GAAK4B,EAAG,EAAK,EACpC7C,EAAOA,EAAM,KAAK,KAAKkB,GAAK0B,EAAG,EAAK,EACpC9D,EAAMA,EAAK,KAAK,KAAKoC,GAAK2B,EAAG,EAAK,EAClCpD,EAAMA,EAAK,KAAK,KAAKqB,EAAKiC,EAAG,EAAK,EAClC/C,EAAOA,EAAM,KAAK,KAAKc,EAAKkC,EAAG,EAAK,EACpChD,EAAOA,EAAM,KAAK,KAAKe,EAAKgC,EAAG,EAAK,EACpCjE,EAAMA,EAAK,KAAK,KAAKiC,EAAKiC,EAAG,EAAK,EAClCvD,EAAMA,EAAK,KAAK,KAAKkB,EAAKuC,EAAG,EAAK,EAClClD,EAAOA,EAAM,KAAK,KAAKW,EAAKwC,EAAG,EAAK,EACpCnD,EAAOA,EAAM,KAAK,KAAKY,EAAKsC,EAAG,EAAK,EACpCpE,EAAMA,EAAK,KAAK,KAAK8B,EAAKuC,EAAG,EAAK,EAClC1D,EAAMA,EAAK,KAAK,KAAKe,EAAK6C,EAAG,EAAK,EAClCrD,EAAOA,EAAM,KAAK,KAAKQ,EAAK8C,EAAG,EAAK,EACpCtD,EAAOA,EAAM,KAAK,KAAKS,EAAK4C,EAAG,EAAK,EACpCvE,EAAMA,EAAK,KAAK,KAAK2B,EAAK6C,EAAG,EAAK,EAClC7D,EAAMA,EAAK,KAAK,KAAKY,EAAKmD,EAAG,EAAK,EAClCxD,EAAOA,EAAM,KAAK,KAAKK,EAAKoD,EAAG,EAAK,EACpCzD,EAAOA,EAAM,KAAK,KAAKM,EAAKkD,EAAG,EAAK,EACpC1E,EAAMA,EAAK,KAAK,KAAKwB,EAAKmD,EAAG,EAAK,EAClChE,EAAMA,EAAK,KAAK,KAAKS,EAAKyD,EAAG,EAAK,EAClC3D,EAAOA,EAAM,KAAK,KAAKE,EAAK0D,EAAG,EAAK,EACpC5D,EAAOA,EAAM,KAAK,KAAKG,EAAKwD,EAAG,EAAK,EACpC7E,EAAMA,EAAK,KAAK,KAAKqB,EAAKyD,EAAG,EAAK,EAClC,IAAIU,IAAQjI,EAAIoD,EAAM,KAAOO,EAAM,OAAW,IAAO,EACrD3D,GAAOyC,GAAMkB,IAAQ,IAAO,IAAMsE,KAAO,IAAO,EAChDA,IAAM,SAEN7E,EAAK,KAAK,KAAKoC,GAAKM,EAAG,EACvBnC,EAAM,KAAK,KAAK6B,GAAKO,EAAG,EACxBpC,EAAOA,EAAM,KAAK,KAAK8B,GAAKK,EAAG,EAAK,EACpCrD,EAAK,KAAK,KAAKgD,GAAKM,EAAG,EACvB3C,EAAMA,EAAK,KAAK,KAAKiC,GAAKY,EAAG,EAAK,EAClCtC,EAAOA,EAAM,KAAK,KAAK0B,GAAKa,EAAG,EAAK,EACpCvC,EAAOA,EAAM,KAAK,KAAK2B,GAAKW,EAAG,EAAK,EACpCxD,EAAMA,EAAK,KAAK,KAAK6C,GAAKY,EAAG,EAAK,EAClC9C,EAAMA,EAAK,KAAK,KAAK8B,GAAKkB,EAAG,EAAK,EAClCzC,EAAOA,EAAM,KAAK,KAAKuB,GAAKmB,EAAG,EAAK,EACpC1C,EAAOA,EAAM,KAAK,KAAKwB,GAAKiB,EAAG,EAAK,EACpC3D,EAAMA,EAAK,KAAK,KAAK0C,GAAKkB,EAAG,EAAK,EAClCjD,EAAMA,EAAK,KAAK,KAAK2B,GAAKwB,EAAG,EAAK,EAClC5C,EAAOA,EAAM,KAAK,KAAKoB,GAAKyB,EAAG,EAAK,EACpC7C,EAAOA,EAAM,KAAK,KAAKqB,GAAKuB,EAAG,EAAK,EACpC9D,EAAMA,EAAK,KAAK,KAAKuC,GAAKwB,EAAG,EAAK,EAClCpD,EAAMA,EAAK,KAAK,KAAKwB,GAAK8B,EAAG,EAAK,EAClC/C,EAAOA,EAAM,KAAK,KAAKiB,GAAK+B,EAAG,EAAK,EACpChD,EAAOA,EAAM,KAAK,KAAKkB,GAAK6B,EAAG,EAAK,EACpCjE,EAAMA,EAAK,KAAK,KAAKoC,GAAK8B,EAAG,EAAK,EAClCvD,EAAMA,EAAK,KAAK,KAAKqB,EAAKoC,EAAG,EAAK,EAClClD,EAAOA,EAAM,KAAK,KAAKc,EAAKqC,EAAG,EAAK,EACpCnD,EAAOA,EAAM,KAAK,KAAKe,EAAKmC,EAAG,EAAK,EACpCpE,EAAMA,EAAK,KAAK,KAAKiC,EAAKoC,EAAG,EAAK,EAClC1D,EAAMA,EAAK,KAAK,KAAKkB,EAAK0C,EAAG,EAAK,EAClCrD,EAAOA,EAAM,KAAK,KAAKW,EAAK2C,EAAG,EAAK,EACpCtD,EAAOA,EAAM,KAAK,KAAKY,EAAKyC,EAAG,EAAK,EACpCvE,EAAMA,EAAK,KAAK,KAAK8B,EAAK0C,EAAG,EAAK,EAClC7D,EAAMA,EAAK,KAAK,KAAKe,EAAKgD,EAAG,EAAK,EAClCxD,EAAOA,EAAM,KAAK,KAAKQ,EAAKiD,EAAG,EAAK,EACpCzD,EAAOA,EAAM,KAAK,KAAKS,EAAK+C,EAAG,EAAK,EACpC1E,EAAMA,EAAK,KAAK,KAAK2B,EAAKgD,EAAG,EAAK,EAClChE,EAAMA,EAAK,KAAK,KAAKY,EAAKsD,EAAG,EAAK,EAClC3D,EAAOA,EAAM,KAAK,KAAKK,EAAKuD,EAAG,EAAK,EACpC5D,EAAOA,EAAM,KAAK,KAAKM,EAAKqD,EAAG,EAAK,EACpC7E,EAAMA,EAAK,KAAK,KAAKwB,EAAKsD,EAAG,EAAK,EAClC,IAAIW,IAASlI,EAAIoD,EAAM,KAAOO,EAAM,OAAW,IAAO,EACtD3D,GAAOyC,GAAMkB,IAAQ,IAAO,IAAMuE,KAAQ,IAAO,EACjDA,IAAO,SAEP9E,EAAK,KAAK,KAAKoC,GAAKS,EAAG,EACvBtC,EAAM,KAAK,KAAK6B,GAAKU,EAAG,EACxBvC,EAAOA,EAAM,KAAK,KAAK8B,GAAKQ,EAAG,EAAK,EACpCxD,EAAK,KAAK,KAAKgD,GAAKS,EAAG,EACvB9C,EAAMA,EAAK,KAAK,KAAKiC,GAAKe,EAAG,EAAK,EAClCzC,EAAOA,EAAM,KAAK,KAAK0B,GAAKgB,EAAG,EAAK,EACpC1C,EAAOA,EAAM,KAAK,KAAK2B,GAAKc,EAAG,EAAK,EACpC3D,EAAMA,EAAK,KAAK,KAAK6C,GAAKe,EAAG,EAAK,EAClCjD,EAAMA,EAAK,KAAK,KAAK8B,GAAKqB,EAAG,EAAK,EAClC5C,EAAOA,EAAM,KAAK,KAAKuB,GAAKsB,EAAG,EAAK,EACpC7C,EAAOA,EAAM,KAAK,KAAKwB,GAAKoB,EAAG,EAAK,EACpC9D,EAAMA,EAAK,KAAK,KAAK0C,GAAKqB,EAAG,EAAK,EAClCpD,EAAMA,EAAK,KAAK,KAAK2B,GAAK2B,EAAG,EAAK,EAClC/C,EAAOA,EAAM,KAAK,KAAKoB,GAAK4B,EAAG,EAAK,EACpChD,EAAOA,EAAM,KAAK,KAAKqB,GAAK0B,EAAG,EAAK,EACpCjE,EAAMA,EAAK,KAAK,KAAKuC,GAAK2B,EAAG,EAAK,EAClCvD,EAAMA,EAAK,KAAK,KAAKwB,GAAKiC,EAAG,EAAK,EAClClD,EAAOA,EAAM,KAAK,KAAKiB,GAAKkC,EAAG,EAAK,EACpCnD,EAAOA,EAAM,KAAK,KAAKkB,GAAKgC,EAAG,EAAK,EACpCpE,EAAMA,EAAK,KAAK,KAAKoC,GAAKiC,EAAG,EAAK,EAClC1D,EAAMA,EAAK,KAAK,KAAKqB,EAAKuC,EAAG,EAAK,EAClCrD,EAAOA,EAAM,KAAK,KAAKc,EAAKwC,EAAG,EAAK,EACpCtD,EAAOA,EAAM,KAAK,KAAKe,EAAKsC,EAAG,EAAK,EACpCvE,EAAMA,EAAK,KAAK,KAAKiC,EAAKuC,EAAG,EAAK,EAClC7D,EAAMA,EAAK,KAAK,KAAKkB,EAAK6C,EAAG,EAAK,EAClCxD,EAAOA,EAAM,KAAK,KAAKW,EAAK8C,EAAG,EAAK,EACpCzD,EAAOA,EAAM,KAAK,KAAKY,EAAK4C,EAAG,EAAK,EACpC1E,EAAMA,EAAK,KAAK,KAAK8B,EAAK6C,EAAG,EAAK,EAClChE,EAAMA,EAAK,KAAK,KAAKe,EAAKmD,EAAG,EAAK,EAClC3D,EAAOA,EAAM,KAAK,KAAKQ,EAAKoD,EAAG,EAAK,EACpC5D,EAAOA,EAAM,KAAK,KAAKS,EAAKkD,EAAG,EAAK,EACpC7E,EAAMA,EAAK,KAAK,KAAK2B,EAAKmD,EAAG,EAAK,EAClC,IAAIY,IAASnI,EAAIoD,EAAM,KAAOO,EAAM,OAAW,IAAO,EACtD3D,GAAOyC,GAAMkB,IAAQ,IAAO,IAAMwE,KAAQ,IAAO,EACjDA,IAAO,SAEP/E,EAAK,KAAK,KAAKoC,GAAKY,EAAG,EACvBzC,EAAM,KAAK,KAAK6B,GAAKa,EAAG,EACxB1C,EAAOA,EAAM,KAAK,KAAK8B,GAAKW,EAAG,EAAK,EACpC3D,EAAK,KAAK,KAAKgD,GAAKY,EAAG,EACvBjD,EAAMA,EAAK,KAAK,KAAKiC,GAAKkB,EAAG,EAAK,EAClC5C,EAAOA,EAAM,KAAK,KAAK0B,GAAKmB,EAAG,EAAK,EACpC7C,EAAOA,EAAM,KAAK,KAAK2B,GAAKiB,EAAG,EAAK,EACpC9D,EAAMA,EAAK,KAAK,KAAK6C,GAAKkB,EAAG,EAAK,EAClCpD,EAAMA,EAAK,KAAK,KAAK8B,GAAKwB,EAAG,EAAK,EAClC/C,EAAOA,EAAM,KAAK,KAAKuB,GAAKyB,EAAG,EAAK,EACpChD,EAAOA,EAAM,KAAK,KAAKwB,GAAKuB,EAAG,EAAK,EACpCjE,EAAMA,EAAK,KAAK,KAAK0C,GAAKwB,EAAG,EAAK,EAClCvD,EAAMA,EAAK,KAAK,KAAK2B,GAAK8B,EAAG,EAAK,EAClClD,EAAOA,EAAM,KAAK,KAAKoB,GAAK+B,EAAG,EAAK,EACpCnD,EAAOA,EAAM,KAAK,KAAKqB,GAAK6B,EAAG,EAAK,EACpCpE,EAAMA,EAAK,KAAK,KAAKuC,GAAK8B,EAAG,EAAK,EAClC1D,EAAMA,EAAK,KAAK,KAAKwB,GAAKoC,EAAG,EAAK,EAClCrD,EAAOA,EAAM,KAAK,KAAKiB,GAAKqC,EAAG,EAAK,EACpCtD,EAAOA,EAAM,KAAK,KAAKkB,GAAKmC,EAAG,EAAK,EACpCvE,EAAMA,EAAK,KAAK,KAAKoC,GAAKoC,EAAG,EAAK,EAClC7D,EAAMA,EAAK,KAAK,KAAKqB,EAAK0C,EAAG,EAAK,EAClCxD,EAAOA,EAAM,KAAK,KAAKc,EAAK2C,EAAG,EAAK,EACpCzD,EAAOA,EAAM,KAAK,KAAKe,EAAKyC,EAAG,EAAK,EACpC1E,EAAMA,EAAK,KAAK,KAAKiC,EAAK0C,EAAG,EAAK,EAClChE,EAAMA,EAAK,KAAK,KAAKkB,EAAKgD,EAAG,EAAK,EAClC3D,EAAOA,EAAM,KAAK,KAAKW,EAAKiD,EAAG,EAAK,EACpC5D,EAAOA,EAAM,KAAK,KAAKY,EAAK+C,EAAG,EAAK,EACpC7E,EAAMA,EAAK,KAAK,KAAK8B,EAAKgD,EAAG,EAAK,EAClC,IAAIa,IAASpI,EAAIoD,EAAM,KAAOO,EAAM,OAAW,IAAO,EACtD3D,GAAOyC,GAAMkB,IAAQ,IAAO,IAAMyE,KAAQ,IAAO,EACjDA,IAAO,SAEPhF,EAAK,KAAK,KAAKoC,GAAKe,EAAG,EACvB5C,EAAM,KAAK,KAAK6B,GAAKgB,EAAG,EACxB7C,EAAOA,EAAM,KAAK,KAAK8B,GAAKc,EAAG,EAAK,EACpC9D,EAAK,KAAK,KAAKgD,GAAKe,EAAG,EACvBpD,EAAMA,EAAK,KAAK,KAAKiC,GAAKqB,EAAG,EAAK,EAClC/C,EAAOA,EAAM,KAAK,KAAK0B,GAAKsB,EAAG,EAAK,EACpChD,EAAOA,EAAM,KAAK,KAAK2B,GAAKoB,EAAG,EAAK,EACpCjE,EAAMA,EAAK,KAAK,KAAK6C,GAAKqB,EAAG,EAAK,EAClCvD,EAAMA,EAAK,KAAK,KAAK8B,GAAK2B,EAAG,EAAK,EAClClD,EAAOA,EAAM,KAAK,KAAKuB,GAAK4B,EAAG,EAAK,EACpCnD,EAAOA,EAAM,KAAK,KAAKwB,GAAK0B,EAAG,EAAK,EACpCpE,EAAMA,EAAK,KAAK,KAAK0C,GAAK2B,EAAG,EAAK,EAClC1D,EAAMA,EAAK,KAAK,KAAK2B,GAAKiC,EAAG,EAAK,EAClCrD,EAAOA,EAAM,KAAK,KAAKoB,GAAKkC,EAAG,EAAK,EACpCtD,EAAOA,EAAM,KAAK,KAAKqB,GAAKgC,EAAG,EAAK,EACpCvE,EAAMA,EAAK,KAAK,KAAKuC,GAAKiC,EAAG,EAAK,EAClC7D,EAAMA,EAAK,KAAK,KAAKwB,GAAKuC,EAAG,EAAK,EAClCxD,EAAOA,EAAM,KAAK,KAAKiB,GAAKwC,EAAG,EAAK,EACpCzD,EAAOA,EAAM,KAAK,KAAKkB,GAAKsC,EAAG,EAAK,EACpC1E,EAAMA,EAAK,KAAK,KAAKoC,GAAKuC,EAAG,EAAK,EAClChE,EAAMA,EAAK,KAAK,KAAKqB,EAAK6C,EAAG,EAAK,EAClC3D,EAAOA,EAAM,KAAK,KAAKc,EAAK8C,EAAG,EAAK,EACpC5D,EAAOA,EAAM,KAAK,KAAKe,EAAK4C,EAAG,EAAK,EACpC7E,EAAMA,EAAK,KAAK,KAAKiC,EAAK6C,EAAG,EAAK,EAClC,IAAIc,IAASrI,EAAIoD,EAAM,KAAOO,EAAM,OAAW,IAAO,EACtD3D,GAAOyC,GAAMkB,IAAQ,IAAO,IAAM0E,KAAQ,IAAO,EACjDA,IAAO,SAEPjF,EAAK,KAAK,KAAKoC,GAAKkB,EAAG,EACvB/C,EAAM,KAAK,KAAK6B,GAAKmB,EAAG,EACxBhD,EAAOA,EAAM,KAAK,KAAK8B,GAAKiB,EAAG,EAAK,EACpCjE,EAAK,KAAK,KAAKgD,GAAKkB,EAAG,EACvBvD,EAAMA,EAAK,KAAK,KAAKiC,GAAKwB,EAAG,EAAK,EAClClD,EAAOA,EAAM,KAAK,KAAK0B,GAAKyB,EAAG,EAAK,EACpCnD,EAAOA,EAAM,KAAK,KAAK2B,GAAKuB,EAAG,EAAK,EACpCpE,EAAMA,EAAK,KAAK,KAAK6C,GAAKwB,EAAG,EAAK,EAClC1D,EAAMA,EAAK,KAAK,KAAK8B,GAAK8B,EAAG,EAAK,EAClCrD,EAAOA,EAAM,KAAK,KAAKuB,GAAK+B,EAAG,EAAK,EACpCtD,EAAOA,EAAM,KAAK,KAAKwB,GAAK6B,EAAG,EAAK,EACpCvE,EAAMA,EAAK,KAAK,KAAK0C,GAAK8B,EAAG,EAAK,EAClC7D,EAAMA,EAAK,KAAK,KAAK2B,GAAKoC,EAAG,EAAK,EAClCxD,EAAOA,EAAM,KAAK,KAAKoB,GAAKqC,EAAG,EAAK,EACpCzD,EAAOA,EAAM,KAAK,KAAKqB,GAAKmC,EAAG,EAAK,EACpC1E,EAAMA,EAAK,KAAK,KAAKuC,GAAKoC,EAAG,EAAK,EAClChE,EAAMA,EAAK,KAAK,KAAKwB,GAAK0C,EAAG,EAAK,EAClC3D,EAAOA,EAAM,KAAK,KAAKiB,GAAK2C,EAAG,EAAK,EACpC5D,EAAOA,EAAM,KAAK,KAAKkB,GAAKyC,EAAG,EAAK,EACpC7E,EAAMA,EAAK,KAAK,KAAKoC,GAAK0C,EAAG,EAAK,EAClC,IAAIe,IAAStI,EAAIoD,EAAM,KAAOO,EAAM,OAAW,IAAO,EACtD3D,GAAOyC,GAAMkB,IAAQ,IAAO,IAAM2E,KAAQ,IAAO,EACjDA,IAAO,SAEPlF,EAAK,KAAK,KAAKoC,GAAKqB,EAAG,EACvBlD,EAAM,KAAK,KAAK6B,GAAKsB,EAAG,EACxBnD,EAAOA,EAAM,KAAK,KAAK8B,GAAKoB,EAAG,EAAK,EACpCpE,EAAK,KAAK,KAAKgD,GAAKqB,EAAG,EACvB1D,EAAMA,EAAK,KAAK,KAAKiC,GAAK2B,EAAG,EAAK,EAClCrD,EAAOA,EAAM,KAAK,KAAK0B,GAAK4B,EAAG,EAAK,EACpCtD,EAAOA,EAAM,KAAK,KAAK2B,GAAK0B,EAAG,EAAK,EACpCvE,EAAMA,EAAK,KAAK,KAAK6C,GAAK2B,EAAG,EAAK,EAClC7D,EAAMA,EAAK,KAAK,KAAK8B,GAAKiC,EAAG,EAAK,EAClCxD,EAAOA,EAAM,KAAK,KAAKuB,GAAKkC,EAAG,EAAK,EACpCzD,EAAOA,EAAM,KAAK,KAAKwB,GAAKgC,EAAG,EAAK,EACpC1E,EAAMA,EAAK,KAAK,KAAK0C,GAAKiC,EAAG,EAAK,EAClChE,EAAMA,EAAK,KAAK,KAAK2B,GAAKuC,EAAG,EAAK,EAClC3D,EAAOA,EAAM,KAAK,KAAKoB,GAAKwC,EAAG,EAAK,EACpC5D,EAAOA,EAAM,KAAK,KAAKqB,GAAKsC,EAAG,EAAK,EACpC7E,EAAMA,EAAK,KAAK,KAAKuC,GAAKuC,EAAG,EAAK,EAClC,IAAIgB,IAASvI,EAAIoD,EAAM,KAAOO,EAAM,OAAW,IAAO,EACtD3D,GAAOyC,GAAMkB,IAAQ,IAAO,IAAM4E,KAAQ,IAAO,EACjDA,IAAO,SAEPnF,EAAK,KAAK,KAAKoC,GAAKwB,EAAG,EACvBrD,EAAM,KAAK,KAAK6B,GAAKyB,EAAG,EACxBtD,EAAOA,EAAM,KAAK,KAAK8B,GAAKuB,EAAG,EAAK,EACpCvE,EAAK,KAAK,KAAKgD,GAAKwB,EAAG,EACvB7D,EAAMA,EAAK,KAAK,KAAKiC,GAAK8B,EAAG,EAAK,EAClCxD,EAAOA,EAAM,KAAK,KAAK0B,GAAK+B,EAAG,EAAK,EACpCzD,EAAOA,EAAM,KAAK,KAAK2B,GAAK6B,EAAG,EAAK,EACpC1E,EAAMA,EAAK,KAAK,KAAK6C,GAAK8B,EAAG,EAAK,EAClChE,EAAMA,EAAK,KAAK,KAAK8B,GAAKoC,EAAG,EAAK,EAClC3D,EAAOA,EAAM,KAAK,KAAKuB,GAAKqC,EAAG,EAAK,EACpC5D,EAAOA,EAAM,KAAK,KAAKwB,GAAKmC,EAAG,EAAK,EACpC7E,EAAMA,EAAK,KAAK,KAAK0C,GAAKoC,EAAG,EAAK,EAClC,IAAIiB,IAASxI,EAAIoD,EAAM,KAAOO,EAAM,OAAW,IAAO,EACtD3D,GAAOyC,GAAMkB,IAAQ,IAAO,IAAM6E,KAAQ,IAAO,EACjDA,IAAO,SAEPpF,EAAK,KAAK,KAAKoC,GAAK2B,EAAG,EACvBxD,EAAM,KAAK,KAAK6B,GAAK4B,EAAG,EACxBzD,EAAOA,EAAM,KAAK,KAAK8B,GAAK0B,EAAG,EAAK,EACpC1E,EAAK,KAAK,KAAKgD,GAAK2B,EAAG,EACvBhE,EAAMA,EAAK,KAAK,KAAKiC,GAAKiC,EAAG,EAAK,EAClC3D,EAAOA,EAAM,KAAK,KAAK0B,GAAKkC,EAAG,EAAK,EACpC5D,EAAOA,EAAM,KAAK,KAAK2B,GAAKgC,EAAG,EAAK,EACpC7E,EAAMA,EAAK,KAAK,KAAK6C,GAAKiC,EAAG,EAAK,EAClC,IAAIkB,IAASzI,EAAIoD,EAAM,KAAOO,EAAM,OAAW,IAAO,EACtD3D,GAAOyC,GAAMkB,IAAQ,IAAO,IAAM8E,KAAQ,IAAO,EACjDA,IAAO,SAEPrF,EAAK,KAAK,KAAKoC,GAAK8B,EAAG,EACvB3D,EAAM,KAAK,KAAK6B,GAAK+B,EAAG,EACxB5D,EAAOA,EAAM,KAAK,KAAK8B,GAAK6B,EAAG,EAAK,EACpC7E,EAAK,KAAK,KAAKgD,GAAK8B,EAAG,EACvB,IAAImB,IAAS1I,EAAIoD,EAAM,KAAOO,EAAM,OAAW,IAAO,EACtD,OAAA3D,GAAOyC,GAAMkB,IAAQ,IAAO,IAAM+E,KAAQ,IAAO,EACjDA,IAAO,SACPhF,EAAE,CAAC,EAAI8D,GACP9D,EAAE,CAAC,EAAI+D,GACP/D,EAAE,CAAC,EAAIgE,GACPhE,EAAE,CAAC,EAAIiE,GACPjE,EAAE,CAAC,EAAIkE,GACPlE,EAAE,CAAC,EAAImE,GACPnE,EAAE,CAAC,EAAIoE,GACPpE,EAAE,CAAC,EAAIqE,GACPrE,EAAE,CAAC,EAAIsE,GACPtE,EAAE,CAAC,EAAIuE,GACPvE,EAAE,EAAE,EAAIwE,GACRxE,EAAE,EAAE,EAAIyE,GACRzE,EAAE,EAAE,EAAI0E,GACR1E,EAAE,EAAE,EAAI2E,GACR3E,EAAE,EAAE,EAAI4E,GACR5E,EAAE,EAAE,EAAI6E,GACR7E,EAAE,EAAE,EAAI8E,GACR9E,EAAE,EAAE,EAAI+E,GACR/E,EAAE,EAAE,EAAIgF,GACJ1I,IAAM,IACR0D,EAAE,EAAE,EAAI1D,EACR0B,EAAI,UAECA,CACT,EAGK,KAAK,OACR+B,EAAcP,IAGhB,SAASyF,GAAUxF,EAAM9D,EAAKqC,EAAK,CACjCA,EAAI,SAAWrC,EAAI,SAAW8D,EAAK,SACnCzB,EAAI,OAASyB,EAAK,OAAS9D,EAAI,OAI/B,QAFIsC,EAAQ,EACRiH,EAAU,EACLvF,EAAI,EAAGA,EAAI3B,EAAI,OAAS,EAAG2B,IAAK,CAGvC,IAAIC,EAASsF,EACbA,EAAU,EAGV,QAFIrF,EAAQ5B,EAAQ,SAChB6B,EAAO,KAAK,IAAIH,EAAGhE,EAAI,OAAS,CAAC,EAC5BK,EAAI,KAAK,IAAI,EAAG2D,EAAIF,EAAK,OAAS,CAAC,EAAGzD,GAAK8D,EAAM9D,IAAK,CAC7D,IAAID,EAAI4D,EAAI3D,EACRoD,EAAIK,EAAK,MAAM1D,CAAC,EAAI,EACpBgB,EAAIpB,EAAI,MAAMK,CAAC,EAAI,EACnBS,EAAI2C,EAAIrC,EAER2C,EAAKjD,EAAI,SACbmD,EAAUA,GAAWnD,EAAI,SAAa,GAAM,EAC5CiD,EAAMA,EAAKG,EAAS,EACpBA,EAAQH,EAAK,SACbE,EAAUA,GAAUF,IAAO,IAAO,EAElCwF,GAAWtF,IAAW,GACtBA,GAAU,QACZ,CACA5B,EAAI,MAAM2B,CAAC,EAAIE,EACf5B,EAAQ2B,EACRA,EAASsF,CACX,CACA,OAAIjH,IAAU,EACZD,EAAI,MAAM2B,CAAC,EAAI1B,EAEfD,EAAI,SAGCA,EAAI,OAAO,CACpB,CAEA,SAASmH,EAAY1F,EAAM9D,EAAKqC,EAAK,CAInC,OAAOiH,GAASxF,EAAM9D,EAAKqC,CAAG,CAChC,CAEA1C,EAAG,UAAU,MAAQ,SAAgBK,EAAKqC,EAAK,CAC7C,IAAIU,EACA1B,EAAM,KAAK,OAASrB,EAAI,OAC5B,OAAI,KAAK,SAAW,IAAMA,EAAI,SAAW,GACvC+C,EAAMqB,EAAY,KAAMpE,EAAKqC,CAAG,EACvBhB,EAAM,GACf0B,EAAMc,GAAW,KAAM7D,EAAKqC,CAAG,EACtBhB,EAAM,KACf0B,EAAMuG,GAAS,KAAMtJ,EAAKqC,CAAG,EAE7BU,EAAMyG,EAAW,KAAMxJ,EAAKqC,CAAG,EAG1BU,CACT,EAKA,SAAS0G,EAAMC,EAAGC,EAAG,CACnB,KAAK,EAAID,EACT,KAAK,EAAIC,CACX,CAEAF,EAAK,UAAU,QAAU,SAAkBG,EAAG,CAG5C,QAFIzG,EAAI,IAAI,MAAMyG,CAAC,EACf,EAAIjK,EAAG,UAAU,WAAWiK,CAAC,EAAI,EAC5BxJ,EAAI,EAAGA,EAAIwJ,EAAGxJ,IACrB+C,EAAE/C,CAAC,EAAI,KAAK,OAAOA,EAAG,EAAGwJ,CAAC,EAG5B,OAAOzG,CACT,EAGAsG,EAAK,UAAU,OAAS,SAAiBC,EAAGG,EAAGD,EAAG,CAChD,GAAIF,IAAM,GAAKA,IAAME,EAAI,EAAG,OAAOF,EAGnC,QADII,EAAK,EACA1J,EAAI,EAAGA,EAAIyJ,EAAGzJ,IACrB0J,IAAOJ,EAAI,IAAOG,EAAIzJ,EAAI,EAC1BsJ,IAAM,EAGR,OAAOI,CACT,EAIAL,EAAK,UAAU,QAAU,SAAkBM,EAAKC,EAAKC,EAAKC,EAAMC,EAAMP,EAAG,CACvE,QAASxJ,EAAI,EAAGA,EAAIwJ,EAAGxJ,IACrB8J,EAAK9J,CAAC,EAAI4J,EAAID,EAAI3J,CAAC,CAAC,EACpB+J,EAAK/J,CAAC,EAAI6J,EAAIF,EAAI3J,CAAC,CAAC,CAExB,EAEAqJ,EAAK,UAAU,UAAY,SAAoBO,EAAKC,EAAKC,EAAMC,EAAMP,EAAGG,EAAK,CAC3E,KAAK,QAAQA,EAAKC,EAAKC,EAAKC,EAAMC,EAAMP,CAAC,EAEzC,QAASQ,EAAI,EAAGA,EAAIR,EAAGQ,IAAM,EAM3B,QALIP,EAAIO,GAAK,EAETC,EAAQ,KAAK,IAAI,EAAI,KAAK,GAAKR,CAAC,EAChCS,EAAQ,KAAK,IAAI,EAAI,KAAK,GAAKT,CAAC,EAE3BU,EAAI,EAAGA,EAAIX,EAAGW,GAAKV,EAI1B,QAHIW,EAASH,EACTI,EAASH,EAEJjK,EAAI,EAAGA,EAAI+J,EAAG/J,IAAK,CAC1B,IAAIqK,EAAKR,EAAKK,EAAIlK,CAAC,EACfsK,EAAKR,EAAKI,EAAIlK,CAAC,EAEfuK,GAAKV,EAAKK,EAAIlK,EAAI+J,CAAC,EACnBS,EAAKV,EAAKI,EAAIlK,EAAI+J,CAAC,EAEnBU,EAAKN,EAASI,GAAKH,EAASI,EAEhCA,EAAKL,EAASK,EAAKJ,EAASG,GAC5BA,GAAKE,EAELZ,EAAKK,EAAIlK,CAAC,EAAIqK,EAAKE,GACnBT,EAAKI,EAAIlK,CAAC,EAAIsK,EAAKE,EAEnBX,EAAKK,EAAIlK,EAAI+J,CAAC,EAAIM,EAAKE,GACvBT,EAAKI,EAAIlK,EAAI+J,CAAC,EAAIO,EAAKE,EAGnBxK,IAAMwJ,IACRiB,EAAKT,EAAQG,EAASF,EAAQG,EAE9BA,EAASJ,EAAQI,EAASH,EAAQE,EAClCA,EAASM,EAEb,CAGN,EAEArB,EAAK,UAAU,YAAc,SAAsBsB,EAAGC,EAAG,CACvD,IAAIpB,EAAI,KAAK,IAAIoB,EAAGD,CAAC,EAAI,EACrBE,EAAMrB,EAAI,EACVxJ,EAAI,EACR,IAAKwJ,EAAIA,EAAI,EAAI,EAAGA,EAAGA,EAAIA,IAAM,EAC/BxJ,IAGF,MAAO,IAAKA,EAAI,EAAI6K,CACtB,EAEAxB,EAAK,UAAU,UAAY,SAAoBO,EAAKC,EAAKL,EAAG,CAC1D,GAAI,EAAAA,GAAK,GAET,QAASxJ,EAAI,EAAGA,EAAIwJ,EAAI,EAAGxJ,IAAK,CAC9B,IAAI+C,EAAI6G,EAAI5J,CAAC,EAEb4J,EAAI5J,CAAC,EAAI4J,EAAIJ,EAAIxJ,EAAI,CAAC,EACtB4J,EAAIJ,EAAIxJ,EAAI,CAAC,EAAI+C,EAEjBA,EAAI8G,EAAI7J,CAAC,EAET6J,EAAI7J,CAAC,EAAI,CAAC6J,EAAIL,EAAIxJ,EAAI,CAAC,EACvB6J,EAAIL,EAAIxJ,EAAI,CAAC,EAAI,CAAC+C,CACpB,CACF,EAEAsG,EAAK,UAAU,aAAe,SAAuByB,EAAItB,EAAG,CAE1D,QADItH,EAAQ,EACHlC,EAAI,EAAGA,EAAIwJ,EAAI,EAAGxJ,IAAK,CAC9B,IAAIE,EAAI,KAAK,MAAM4K,EAAG,EAAI9K,EAAI,CAAC,EAAIwJ,CAAC,EAAI,KACtC,KAAK,MAAMsB,EAAG,EAAI9K,CAAC,EAAIwJ,CAAC,EACxBtH,EAEF4I,EAAG9K,CAAC,EAAIE,EAAI,SAERA,EAAI,SACNgC,EAAQ,EAERA,EAAQhC,EAAI,SAAY,CAE5B,CAEA,OAAO4K,CACT,EAEAzB,EAAK,UAAU,WAAa,SAAqByB,EAAI7J,EAAK2I,EAAKJ,EAAG,CAEhE,QADItH,EAAQ,EACHlC,EAAI,EAAGA,EAAIiB,EAAKjB,IACvBkC,EAAQA,GAAS4I,EAAG9K,CAAC,EAAI,GAEzB4J,EAAI,EAAI5J,CAAC,EAAIkC,EAAQ,KAAQA,EAAQA,IAAU,GAC/C0H,EAAI,EAAI5J,EAAI,CAAC,EAAIkC,EAAQ,KAAQA,EAAQA,IAAU,GAIrD,IAAKlC,EAAI,EAAIiB,EAAKjB,EAAIwJ,EAAG,EAAExJ,EACzB4J,EAAI5J,CAAC,EAAI,EAGXhB,EAAOkD,IAAU,CAAC,EAClBlD,GAAQkD,EAAQ,SAAa,CAAC,CAChC,EAEAmH,EAAK,UAAU,KAAO,SAAeG,EAAG,CAEtC,QADIuB,EAAK,IAAI,MAAMvB,CAAC,EACXxJ,EAAI,EAAGA,EAAIwJ,EAAGxJ,IACrB+K,EAAG/K,CAAC,EAAI,EAGV,OAAO+K,CACT,EAEA1B,EAAK,UAAU,KAAO,SAAeC,EAAGC,EAAGtH,EAAK,CAC9C,IAAIuH,EAAI,EAAI,KAAK,YAAYF,EAAE,OAAQC,EAAE,MAAM,EAE3CI,EAAM,KAAK,QAAQH,CAAC,EAEpBwB,EAAI,KAAK,KAAKxB,CAAC,EAEfI,EAAM,IAAI,MAAMJ,CAAC,EACjByB,EAAO,IAAI,MAAMzB,CAAC,EAClB0B,EAAO,IAAI,MAAM1B,CAAC,EAElB2B,EAAO,IAAI,MAAM3B,CAAC,EAClB4B,EAAQ,IAAI,MAAM5B,CAAC,EACnB6B,EAAQ,IAAI,MAAM7B,CAAC,EAEnB8B,EAAOrJ,EAAI,MACfqJ,EAAK,OAAS9B,EAEd,KAAK,WAAWF,EAAE,MAAOA,EAAE,OAAQM,EAAKJ,CAAC,EACzC,KAAK,WAAWD,EAAE,MAAOA,EAAE,OAAQ4B,EAAM3B,CAAC,EAE1C,KAAK,UAAUI,EAAKoB,EAAGC,EAAMC,EAAM1B,EAAGG,CAAG,EACzC,KAAK,UAAUwB,EAAMH,EAAGI,EAAOC,EAAO7B,EAAGG,CAAG,EAE5C,QAAS3J,EAAI,EAAGA,EAAIwJ,EAAGxJ,IAAK,CAC1B,IAAI0K,EAAKO,EAAKjL,CAAC,EAAIoL,EAAMpL,CAAC,EAAIkL,EAAKlL,CAAC,EAAIqL,EAAMrL,CAAC,EAC/CkL,EAAKlL,CAAC,EAAIiL,EAAKjL,CAAC,EAAIqL,EAAMrL,CAAC,EAAIkL,EAAKlL,CAAC,EAAIoL,EAAMpL,CAAC,EAChDiL,EAAKjL,CAAC,EAAI0K,CACZ,CAEA,YAAK,UAAUO,EAAMC,EAAM1B,CAAC,EAC5B,KAAK,UAAUyB,EAAMC,EAAMI,EAAMN,EAAGxB,EAAGG,CAAG,EAC1C,KAAK,UAAU2B,EAAMN,EAAGxB,CAAC,EACzB,KAAK,aAAa8B,EAAM9B,CAAC,EAEzBvH,EAAI,SAAWqH,EAAE,SAAWC,EAAE,SAC9BtH,EAAI,OAASqH,EAAE,OAASC,EAAE,OACnBtH,EAAI,OAAO,CACpB,EAGA1C,EAAG,UAAU,IAAM,SAAcK,EAAK,CACpC,IAAIqC,EAAM,IAAI1C,EAAG,IAAI,EACrB,OAAA0C,EAAI,MAAQ,IAAI,MAAM,KAAK,OAASrC,EAAI,MAAM,EACvC,KAAK,MAAMA,EAAKqC,CAAG,CAC5B,EAGA1C,EAAG,UAAU,KAAO,SAAeK,EAAK,CACtC,IAAIqC,EAAM,IAAI1C,EAAG,IAAI,EACrB,OAAA0C,EAAI,MAAQ,IAAI,MAAM,KAAK,OAASrC,EAAI,MAAM,EACvCwJ,EAAW,KAAMxJ,EAAKqC,CAAG,CAClC,EAGA1C,EAAG,UAAU,KAAO,SAAeK,EAAK,CACtC,OAAO,KAAK,MAAM,EAAE,MAAMA,EAAK,IAAI,CACrC,EAEAL,EAAG,UAAU,MAAQ,SAAgBK,EAAK,CACxC,IAAI2L,EAAW3L,EAAM,EACjB2L,IAAU3L,EAAM,CAACA,GAErBZ,EAAO,OAAOY,GAAQ,QAAQ,EAC9BZ,EAAOY,EAAM,QAAS,EAItB,QADIsC,EAAQ,EACHlC,EAAI,EAAGA,EAAI,KAAK,OAAQA,IAAK,CACpC,IAAIE,GAAK,KAAK,MAAMF,CAAC,EAAI,GAAKJ,EAC1B+D,GAAMzD,EAAI,WAAcgC,EAAQ,UACpCA,IAAU,GACVA,GAAUhC,EAAI,SAAa,EAE3BgC,GAASyB,IAAO,GAChB,KAAK,MAAM3D,CAAC,EAAI2D,EAAK,QACvB,CAEA,OAAIzB,IAAU,IACZ,KAAK,MAAMlC,CAAC,EAAIkC,EAChB,KAAK,UAGAqJ,EAAW,KAAK,KAAK,EAAI,IAClC,EAEAhM,EAAG,UAAU,KAAO,SAAeK,EAAK,CACtC,OAAO,KAAK,MAAM,EAAE,MAAMA,CAAG,CAC/B,EAGAL,EAAG,UAAU,IAAM,UAAgB,CACjC,OAAO,KAAK,IAAI,IAAI,CACtB,EAGAA,EAAG,UAAU,KAAO,UAAiB,CACnC,OAAO,KAAK,KAAK,KAAK,MAAM,CAAC,CAC/B,EAGAA,EAAG,UAAU,IAAM,SAAcK,EAAK,CACpC,IAAIM,EAAI+C,EAAWrD,CAAG,EACtB,GAAIM,EAAE,SAAW,EAAG,OAAO,IAAIX,EAAG,CAAC,EAInC,QADIoD,EAAM,KACD3C,EAAI,EAAGA,EAAIE,EAAE,QAChBA,EAAEF,CAAC,IAAM,EADeA,IAAK2C,EAAMA,EAAI,IAAI,EAC/C,CAGF,GAAI,EAAE3C,EAAIE,EAAE,OACV,QAASsL,EAAI7I,EAAI,IAAI,EAAG3C,EAAIE,EAAE,OAAQF,IAAKwL,EAAIA,EAAE,IAAI,EAC/CtL,EAAEF,CAAC,IAAM,IAEb2C,EAAMA,EAAI,IAAI6I,CAAC,GAInB,OAAO7I,CACT,EAGApD,EAAG,UAAU,OAAS,SAAiBkM,EAAM,CAC3CzM,EAAO,OAAOyM,GAAS,UAAYA,GAAQ,CAAC,EAC5C,IAAI/K,EAAI+K,EAAO,GACXzB,GAAKyB,EAAO/K,GAAK,GACjBgL,EAAa,WAAe,GAAKhL,GAAQ,GAAKA,EAC9CV,EAEJ,GAAIU,IAAM,EAAG,CACX,IAAIwB,EAAQ,EAEZ,IAAKlC,EAAI,EAAGA,EAAI,KAAK,OAAQA,IAAK,CAChC,IAAI2L,EAAW,KAAK,MAAM3L,CAAC,EAAI0L,EAC3BnL,GAAM,KAAK,MAAMP,CAAC,EAAI,GAAK2L,GAAajL,EAC5C,KAAK,MAAMV,CAAC,EAAIO,EAAI2B,EACpBA,EAAQyJ,IAAc,GAAKjL,CAC7B,CAEIwB,IACF,KAAK,MAAMlC,CAAC,EAAIkC,EAChB,KAAK,SAET,CAEA,GAAI8H,IAAM,EAAG,CACX,IAAKhK,EAAI,KAAK,OAAS,EAAGA,GAAK,EAAGA,IAChC,KAAK,MAAMA,EAAIgK,CAAC,EAAI,KAAK,MAAMhK,CAAC,EAGlC,IAAKA,EAAI,EAAGA,EAAIgK,EAAGhK,IACjB,KAAK,MAAMA,CAAC,EAAI,EAGlB,KAAK,QAAUgK,CACjB,CAEA,OAAO,KAAK,OAAO,CACrB,EAEAzK,EAAG,UAAU,MAAQ,SAAgBkM,EAAM,CAEzC,OAAAzM,EAAO,KAAK,WAAa,CAAC,EACnB,KAAK,OAAOyM,CAAI,CACzB,EAKAlM,EAAG,UAAU,OAAS,SAAiBkM,EAAMG,EAAMC,EAAU,CAC3D7M,EAAO,OAAOyM,GAAS,UAAYA,GAAQ,CAAC,EAC5C,IAAI,EACAG,EACF,GAAKA,EAAQA,EAAO,IAAO,GAE3B,EAAI,EAGN,IAAIlL,EAAI+K,EAAO,GACXzB,EAAI,KAAK,KAAKyB,EAAO/K,GAAK,GAAI,KAAK,MAAM,EACzCoL,EAAO,SAAc,WAAcpL,GAAMA,EACzCqL,EAAcF,EAMlB,GAJA,GAAK7B,EACL,EAAI,KAAK,IAAI,EAAG,CAAC,EAGb+B,EAAa,CACf,QAAS/L,EAAI,EAAGA,EAAIgK,EAAGhK,IACrB+L,EAAY,MAAM/L,CAAC,EAAI,KAAK,MAAMA,CAAC,EAErC+L,EAAY,OAAS/B,CACvB,CAEA,GAAIA,IAAM,EAEH,GAAI,KAAK,OAASA,EAEvB,IADA,KAAK,QAAUA,EACVhK,EAAI,EAAGA,EAAI,KAAK,OAAQA,IAC3B,KAAK,MAAMA,CAAC,EAAI,KAAK,MAAMA,EAAIgK,CAAC,OAGlC,KAAK,MAAM,CAAC,EAAI,EAChB,KAAK,OAAS,EAGhB,IAAI9H,EAAQ,EACZ,IAAKlC,EAAI,KAAK,OAAS,EAAGA,GAAK,IAAMkC,IAAU,GAAKlC,GAAK,GAAIA,IAAK,CAChE,IAAIsB,EAAO,KAAK,MAAMtB,CAAC,EAAI,EAC3B,KAAK,MAAMA,CAAC,EAAKkC,GAAU,GAAKxB,EAAOY,IAASZ,EAChDwB,EAAQZ,EAAOwK,CACjB,CAGA,OAAIC,GAAe7J,IAAU,IAC3B6J,EAAY,MAAMA,EAAY,QAAQ,EAAI7J,GAGxC,KAAK,SAAW,IAClB,KAAK,MAAM,CAAC,EAAI,EAChB,KAAK,OAAS,GAGT,KAAK,OAAO,CACrB,EAEA3C,EAAG,UAAU,MAAQ,SAAgBkM,EAAMG,EAAMC,EAAU,CAEzD,OAAA7M,EAAO,KAAK,WAAa,CAAC,EACnB,KAAK,OAAOyM,EAAMG,EAAMC,CAAQ,CACzC,EAGAtM,EAAG,UAAU,KAAO,SAAekM,EAAM,CACvC,OAAO,KAAK,MAAM,EAAE,MAAMA,CAAI,CAChC,EAEAlM,EAAG,UAAU,MAAQ,SAAgBkM,EAAM,CACzC,OAAO,KAAK,MAAM,EAAE,OAAOA,CAAI,CACjC,EAGAlM,EAAG,UAAU,KAAO,SAAekM,EAAM,CACvC,OAAO,KAAK,MAAM,EAAE,MAAMA,CAAI,CAChC,EAEAlM,EAAG,UAAU,MAAQ,SAAgBkM,EAAM,CACzC,OAAO,KAAK,MAAM,EAAE,OAAOA,CAAI,CACjC,EAGAlM,EAAG,UAAU,MAAQ,SAAgB2D,EAAK,CACxClE,EAAO,OAAOkE,GAAQ,UAAYA,GAAO,CAAC,EAC1C,IAAIxC,EAAIwC,EAAM,GACV8G,GAAK9G,EAAMxC,GAAK,GAChB8K,EAAI,GAAK9K,EAGb,GAAI,KAAK,QAAUsJ,EAAG,MAAO,GAG7B,IAAI9J,EAAI,KAAK,MAAM8J,CAAC,EAEpB,MAAO,CAAC,EAAE9J,EAAIsL,EAChB,EAGAjM,EAAG,UAAU,OAAS,SAAiBkM,EAAM,CAC3CzM,EAAO,OAAOyM,GAAS,UAAYA,GAAQ,CAAC,EAC5C,IAAI/K,EAAI+K,EAAO,GACXzB,GAAKyB,EAAO/K,GAAK,GAIrB,GAFA1B,EAAO,KAAK,WAAa,EAAG,yCAAyC,EAEjE,KAAK,QAAUgL,EACjB,OAAO,KAQT,GALItJ,IAAM,GACRsJ,IAEF,KAAK,OAAS,KAAK,IAAIA,EAAG,KAAK,MAAM,EAEjCtJ,IAAM,EAAG,CACX,IAAIoL,EAAO,SAAc,WAAcpL,GAAMA,EAC7C,KAAK,MAAM,KAAK,OAAS,CAAC,GAAKoL,CACjC,CAEA,OAAO,KAAK,OAAO,CACrB,EAGAvM,EAAG,UAAU,MAAQ,SAAgBkM,EAAM,CACzC,OAAO,KAAK,MAAM,EAAE,OAAOA,CAAI,CACjC,EAGAlM,EAAG,UAAU,MAAQ,SAAgBK,EAAK,CAGxC,OAFAZ,EAAO,OAAOY,GAAQ,QAAQ,EAC9BZ,EAAOY,EAAM,QAAS,EAClBA,EAAM,EAAU,KAAK,MAAM,CAACA,CAAG,EAG/B,KAAK,WAAa,EAChB,KAAK,SAAW,IAAM,KAAK,MAAM,CAAC,EAAI,IAAMA,GAC9C,KAAK,MAAM,CAAC,EAAIA,GAAO,KAAK,MAAM,CAAC,EAAI,GACvC,KAAK,SAAW,EACT,OAGT,KAAK,SAAW,EAChB,KAAK,MAAMA,CAAG,EACd,KAAK,SAAW,EACT,MAIF,KAAK,OAAOA,CAAG,CACxB,EAEAL,EAAG,UAAU,OAAS,SAAiBK,EAAK,CAC1C,KAAK,MAAM,CAAC,GAAKA,EAGjB,QAASI,EAAI,EAAGA,EAAI,KAAK,QAAU,KAAK,MAAMA,CAAC,GAAK,SAAWA,IAC7D,KAAK,MAAMA,CAAC,GAAK,SACbA,IAAM,KAAK,OAAS,EACtB,KAAK,MAAMA,EAAI,CAAC,EAAI,EAEpB,KAAK,MAAMA,EAAI,CAAC,IAGpB,YAAK,OAAS,KAAK,IAAI,KAAK,OAAQA,EAAI,CAAC,EAElC,IACT,EAGAT,EAAG,UAAU,MAAQ,SAAgBK,EAAK,CAGxC,GAFAZ,EAAO,OAAOY,GAAQ,QAAQ,EAC9BZ,EAAOY,EAAM,QAAS,EAClBA,EAAM,EAAG,OAAO,KAAK,MAAM,CAACA,CAAG,EAEnC,GAAI,KAAK,WAAa,EACpB,YAAK,SAAW,EAChB,KAAK,MAAMA,CAAG,EACd,KAAK,SAAW,EACT,KAKT,GAFA,KAAK,MAAM,CAAC,GAAKA,EAEb,KAAK,SAAW,GAAK,KAAK,MAAM,CAAC,EAAI,EACvC,KAAK,MAAM,CAAC,EAAI,CAAC,KAAK,MAAM,CAAC,EAC7B,KAAK,SAAW,MAGhB,SAASI,EAAI,EAAGA,EAAI,KAAK,QAAU,KAAK,MAAMA,CAAC,EAAI,EAAGA,IACpD,KAAK,MAAMA,CAAC,GAAK,SACjB,KAAK,MAAMA,EAAI,CAAC,GAAK,EAIzB,OAAO,KAAK,OAAO,CACrB,EAEAT,EAAG,UAAU,KAAO,SAAeK,EAAK,CACtC,OAAO,KAAK,MAAM,EAAE,MAAMA,CAAG,CAC/B,EAEAL,EAAG,UAAU,KAAO,SAAeK,EAAK,CACtC,OAAO,KAAK,MAAM,EAAE,MAAMA,CAAG,CAC/B,EAEAL,EAAG,UAAU,KAAO,UAAiB,CACnC,YAAK,SAAW,EAET,IACT,EAEAA,EAAG,UAAU,IAAM,UAAgB,CACjC,OAAO,KAAK,MAAM,EAAE,KAAK,CAC3B,EAEAA,EAAG,UAAU,aAAe,SAAuBK,EAAKmB,EAAK+B,EAAO,CAClE,IAAI7B,EAAMrB,EAAI,OAASkD,EACnB9C,EAEJ,KAAK,QAAQiB,CAAG,EAEhB,IAAIf,EACAgC,EAAQ,EACZ,IAAKlC,EAAI,EAAGA,EAAIJ,EAAI,OAAQI,IAAK,CAC/BE,GAAK,KAAK,MAAMF,EAAI8C,CAAK,EAAI,GAAKZ,EAClC,IAAIpC,GAASF,EAAI,MAAMI,CAAC,EAAI,GAAKe,EACjCb,GAAKJ,EAAQ,SACboC,GAAShC,GAAK,KAAQJ,EAAQ,SAAa,GAC3C,KAAK,MAAME,EAAI8C,CAAK,EAAI5C,EAAI,QAC9B,CACA,KAAOF,EAAI,KAAK,OAAS8C,EAAO9C,IAC9BE,GAAK,KAAK,MAAMF,EAAI8C,CAAK,EAAI,GAAKZ,EAClCA,EAAQhC,GAAK,GACb,KAAK,MAAMF,EAAI8C,CAAK,EAAI5C,EAAI,SAG9B,GAAIgC,IAAU,EAAG,OAAO,KAAK,OAAO,EAKpC,IAFAlD,EAAOkD,IAAU,EAAE,EACnBA,EAAQ,EACHlC,EAAI,EAAGA,EAAI,KAAK,OAAQA,IAC3BE,EAAI,EAAE,KAAK,MAAMF,CAAC,EAAI,GAAKkC,EAC3BA,EAAQhC,GAAK,GACb,KAAK,MAAMF,CAAC,EAAIE,EAAI,SAEtB,YAAK,SAAW,EAET,KAAK,OAAO,CACrB,EAEAX,EAAG,UAAU,SAAW,SAAmBK,EAAKoM,EAAM,CACpD,IAAIlJ,EAAQ,KAAK,OAASlD,EAAI,OAE1ByD,EAAI,KAAK,MAAM,EACfrC,EAAIpB,EAGJqM,EAAMjL,EAAE,MAAMA,EAAE,OAAS,CAAC,EAAI,EAC9BkL,EAAU,KAAK,WAAWD,CAAG,EACjCnJ,EAAQ,GAAKoJ,EACTpJ,IAAU,IACZ9B,EAAIA,EAAE,MAAM8B,CAAK,EACjBO,EAAE,OAAOP,CAAK,EACdmJ,EAAMjL,EAAE,MAAMA,EAAE,OAAS,CAAC,EAAI,GAIhC,IAAI4J,EAAIvH,EAAE,OAASrC,EAAE,OACjBwK,EAEJ,GAAIQ,IAAS,MAAO,CAClBR,EAAI,IAAIjM,EAAG,IAAI,EACfiM,EAAE,OAASZ,EAAI,EACfY,EAAE,MAAQ,IAAI,MAAMA,EAAE,MAAM,EAC5B,QAASxL,EAAI,EAAGA,EAAIwL,EAAE,OAAQxL,IAC5BwL,EAAE,MAAMxL,CAAC,EAAI,CAEjB,CAEA,IAAImM,EAAO9I,EAAE,MAAM,EAAE,aAAarC,EAAG,EAAG4J,CAAC,EACrCuB,EAAK,WAAa,IACpB9I,EAAI8I,EACAX,IACFA,EAAE,MAAMZ,CAAC,EAAI,IAIjB,QAAS3K,EAAI2K,EAAI,EAAG3K,GAAK,EAAGA,IAAK,CAC/B,IAAImM,GAAM/I,EAAE,MAAMrC,EAAE,OAASf,CAAC,EAAI,GAAK,UACpCoD,EAAE,MAAMrC,EAAE,OAASf,EAAI,CAAC,EAAI,GAO/B,IAHAmM,EAAK,KAAK,IAAKA,EAAKH,EAAO,EAAG,QAAS,EAEvC5I,EAAE,aAAarC,EAAGoL,EAAInM,CAAC,EAChBoD,EAAE,WAAa,GACpB+I,IACA/I,EAAE,SAAW,EACbA,EAAE,aAAarC,EAAG,EAAGf,CAAC,EACjBoD,EAAE,OAAO,IACZA,EAAE,UAAY,GAGdmI,IACFA,EAAE,MAAMvL,CAAC,EAAImM,EAEjB,CACA,OAAIZ,GACFA,EAAE,OAAO,EAEXnI,EAAE,OAAO,EAGL2I,IAAS,OAASlJ,IAAU,GAC9BO,EAAE,OAAOP,CAAK,EAGT,CACL,IAAK0I,GAAK,KACV,IAAKnI,CACP,CACF,EAMA9D,EAAG,UAAU,OAAS,SAAiBK,EAAKoM,EAAMK,EAAU,CAG1D,GAFArN,EAAO,CAACY,EAAI,OAAO,CAAC,EAEhB,KAAK,OAAO,EACd,MAAO,CACL,IAAK,IAAIL,EAAG,CAAC,EACb,IAAK,IAAIA,EAAG,CAAC,CACf,EAGF,IAAI+M,EAAKjL,EAAKsB,EACd,OAAI,KAAK,WAAa,GAAK/C,EAAI,WAAa,GAC1C+C,EAAM,KAAK,IAAI,EAAE,OAAO/C,EAAKoM,CAAI,EAE7BA,IAAS,QACXM,EAAM3J,EAAI,IAAI,IAAI,GAGhBqJ,IAAS,QACX3K,EAAMsB,EAAI,IAAI,IAAI,EACd0J,GAAYhL,EAAI,WAAa,GAC/BA,EAAI,KAAKzB,CAAG,GAIT,CACL,IAAK0M,EACL,IAAKjL,CACP,GAGE,KAAK,WAAa,GAAKzB,EAAI,WAAa,GAC1C+C,EAAM,KAAK,OAAO/C,EAAI,IAAI,EAAGoM,CAAI,EAE7BA,IAAS,QACXM,EAAM3J,EAAI,IAAI,IAAI,GAGb,CACL,IAAK2J,EACL,IAAK3J,EAAI,GACX,IAGG,KAAK,SAAW/C,EAAI,YAAc,GACrC+C,EAAM,KAAK,IAAI,EAAE,OAAO/C,EAAI,IAAI,EAAGoM,CAAI,EAEnCA,IAAS,QACX3K,EAAMsB,EAAI,IAAI,IAAI,EACd0J,GAAYhL,EAAI,WAAa,GAC/BA,EAAI,KAAKzB,CAAG,GAIT,CACL,IAAK+C,EAAI,IACT,IAAKtB,CACP,GAMEzB,EAAI,OAAS,KAAK,QAAU,KAAK,IAAIA,CAAG,EAAI,EACvC,CACL,IAAK,IAAIL,EAAG,CAAC,EACb,IAAK,IACP,EAIEK,EAAI,SAAW,EACboM,IAAS,MACJ,CACL,IAAK,KAAK,KAAKpM,EAAI,MAAM,CAAC,CAAC,EAC3B,IAAK,IACP,EAGEoM,IAAS,MACJ,CACL,IAAK,KACL,IAAK,IAAIzM,EAAG,KAAK,MAAMK,EAAI,MAAM,CAAC,CAAC,CAAC,CACtC,EAGK,CACL,IAAK,KAAK,KAAKA,EAAI,MAAM,CAAC,CAAC,EAC3B,IAAK,IAAIL,EAAG,KAAK,MAAMK,EAAI,MAAM,CAAC,CAAC,CAAC,CACtC,EAGK,KAAK,SAASA,EAAKoM,CAAI,CAChC,EAGAzM,EAAG,UAAU,IAAM,SAAcK,EAAK,CACpC,OAAO,KAAK,OAAOA,EAAK,MAAO,EAAK,EAAE,GACxC,EAGAL,EAAG,UAAU,IAAM,SAAcK,EAAK,CACpC,OAAO,KAAK,OAAOA,EAAK,MAAO,EAAK,EAAE,GACxC,EAEAL,EAAG,UAAU,KAAO,SAAeK,EAAK,CACtC,OAAO,KAAK,OAAOA,EAAK,MAAO,EAAI,EAAE,GACvC,EAGAL,EAAG,UAAU,SAAW,SAAmBK,EAAK,CAC9C,IAAI2M,EAAK,KAAK,OAAO3M,CAAG,EAGxB,GAAI2M,EAAG,IAAI,OAAO,EAAG,OAAOA,EAAG,IAE/B,IAAIlL,EAAMkL,EAAG,IAAI,WAAa,EAAIA,EAAG,IAAI,KAAK3M,CAAG,EAAI2M,EAAG,IAEpDC,EAAO5M,EAAI,MAAM,CAAC,EAClB6M,EAAK7M,EAAI,MAAM,CAAC,EAChB4D,EAAMnC,EAAI,IAAImL,CAAI,EAGtB,OAAIhJ,EAAM,GAAMiJ,IAAO,GAAKjJ,IAAQ,EAAW+I,EAAG,IAG3CA,EAAG,IAAI,WAAa,EAAIA,EAAG,IAAI,MAAM,CAAC,EAAIA,EAAG,IAAI,MAAM,CAAC,CACjE,EAEAhN,EAAG,UAAU,MAAQ,SAAgBK,EAAK,CACxC,IAAI2L,EAAW3L,EAAM,EACjB2L,IAAU3L,EAAM,CAACA,GAErBZ,EAAOY,GAAO,QAAS,EAIvB,QAHIuK,GAAK,GAAK,IAAMvK,EAEhB8M,EAAM,EACD1M,EAAI,KAAK,OAAS,EAAGA,GAAK,EAAGA,IACpC0M,GAAOvC,EAAIuC,GAAO,KAAK,MAAM1M,CAAC,EAAI,IAAMJ,EAG1C,OAAO2L,EAAW,CAACmB,EAAMA,CAC3B,EAGAnN,EAAG,UAAU,KAAO,SAAeK,EAAK,CACtC,OAAO,KAAK,MAAMA,CAAG,CACvB,EAGAL,EAAG,UAAU,MAAQ,SAAgBK,EAAK,CACxC,IAAI2L,EAAW3L,EAAM,EACjB2L,IAAU3L,EAAM,CAACA,GAErBZ,EAAOY,GAAO,QAAS,EAGvB,QADIsC,EAAQ,EACHlC,EAAI,KAAK,OAAS,EAAGA,GAAK,EAAGA,IAAK,CACzC,IAAIE,GAAK,KAAK,MAAMF,CAAC,EAAI,GAAKkC,EAAQ,SACtC,KAAK,MAAMlC,CAAC,EAAKE,EAAIN,EAAO,EAC5BsC,EAAQhC,EAAIN,CACd,CAEA,YAAK,OAAO,EACL2L,EAAW,KAAK,KAAK,EAAI,IAClC,EAEAhM,EAAG,UAAU,KAAO,SAAeK,EAAK,CACtC,OAAO,KAAK,MAAM,EAAE,MAAMA,CAAG,CAC/B,EAEAL,EAAG,UAAU,KAAO,SAAe4K,EAAG,CACpCnL,EAAOmL,EAAE,WAAa,CAAC,EACvBnL,EAAO,CAACmL,EAAE,OAAO,CAAC,EAElB,IAAIb,EAAI,KACJC,EAAIY,EAAE,MAAM,EAEZb,EAAE,WAAa,EACjBA,EAAIA,EAAE,KAAKa,CAAC,EAEZb,EAAIA,EAAE,MAAM,EAad,QATIqD,EAAI,IAAIpN,EAAG,CAAC,EACZqN,EAAI,IAAIrN,EAAG,CAAC,EAGZsN,EAAI,IAAItN,EAAG,CAAC,EACZuN,EAAI,IAAIvN,EAAG,CAAC,EAEZwN,EAAI,EAEDzD,EAAE,OAAO,GAAKC,EAAE,OAAO,GAC5BD,EAAE,OAAO,CAAC,EACVC,EAAE,OAAO,CAAC,EACV,EAAEwD,EAMJ,QAHIC,EAAKzD,EAAE,MAAM,EACb0D,EAAK3D,EAAE,MAAM,EAEV,CAACA,EAAE,OAAO,GAAG,CAClB,QAAStJ,EAAI,EAAGkN,EAAK,GAAI5D,EAAE,MAAM,CAAC,EAAI4D,KAAQ,GAAKlN,EAAI,GAAI,EAAEA,EAAGkN,IAAO,EAAE,CACzE,GAAIlN,EAAI,EAEN,IADAsJ,EAAE,OAAOtJ,CAAC,EACHA,KAAM,IACP2M,EAAE,MAAM,GAAKC,EAAE,MAAM,KACvBD,EAAE,KAAKK,CAAE,EACTJ,EAAE,KAAKK,CAAE,GAGXN,EAAE,OAAO,CAAC,EACVC,EAAE,OAAO,CAAC,EAId,QAAS3M,EAAI,EAAGkN,EAAK,GAAI5D,EAAE,MAAM,CAAC,EAAI4D,KAAQ,GAAKlN,EAAI,GAAI,EAAEA,EAAGkN,IAAO,EAAE,CACzE,GAAIlN,EAAI,EAEN,IADAsJ,EAAE,OAAOtJ,CAAC,EACHA,KAAM,IACP4M,EAAE,MAAM,GAAKC,EAAE,MAAM,KACvBD,EAAE,KAAKG,CAAE,EACTF,EAAE,KAAKG,CAAE,GAGXJ,EAAE,OAAO,CAAC,EACVC,EAAE,OAAO,CAAC,EAIVxD,EAAE,IAAIC,CAAC,GAAK,GACdD,EAAE,KAAKC,CAAC,EACRoD,EAAE,KAAKE,CAAC,EACRD,EAAE,KAAKE,CAAC,IAERvD,EAAE,KAAKD,CAAC,EACRuD,EAAE,KAAKF,CAAC,EACRG,EAAE,KAAKF,CAAC,EAEZ,CAEA,MAAO,CACL,EAAGC,EACH,EAAGC,EACH,IAAKvD,EAAE,OAAOwD,CAAC,CACjB,CACF,EAKAxN,EAAG,UAAU,OAAS,SAAiB4K,EAAG,CACxCnL,EAAOmL,EAAE,WAAa,CAAC,EACvBnL,EAAO,CAACmL,EAAE,OAAO,CAAC,EAElB,IAAI9G,EAAI,KACJrC,EAAImJ,EAAE,MAAM,EAEZ9G,EAAE,WAAa,EACjBA,EAAIA,EAAE,KAAK8G,CAAC,EAEZ9G,EAAIA,EAAE,MAAM,EAQd,QALI+J,EAAK,IAAI7N,EAAG,CAAC,EACb8N,EAAK,IAAI9N,EAAG,CAAC,EAEb+N,EAAQtM,EAAE,MAAM,EAEbqC,EAAE,KAAK,CAAC,EAAI,GAAKrC,EAAE,KAAK,CAAC,EAAI,GAAG,CACrC,QAAShB,EAAI,EAAGkN,EAAK,GAAI7J,EAAE,MAAM,CAAC,EAAI6J,KAAQ,GAAKlN,EAAI,GAAI,EAAEA,EAAGkN,IAAO,EAAE,CACzE,GAAIlN,EAAI,EAEN,IADAqD,EAAE,OAAOrD,CAAC,EACHA,KAAM,GACPoN,EAAG,MAAM,GACXA,EAAG,KAAKE,CAAK,EAGfF,EAAG,OAAO,CAAC,EAIf,QAASnN,EAAI,EAAGkN,EAAK,GAAInM,EAAE,MAAM,CAAC,EAAImM,KAAQ,GAAKlN,EAAI,GAAI,EAAEA,EAAGkN,IAAO,EAAE,CACzE,GAAIlN,EAAI,EAEN,IADAe,EAAE,OAAOf,CAAC,EACHA,KAAM,GACPoN,EAAG,MAAM,GACXA,EAAG,KAAKC,CAAK,EAGfD,EAAG,OAAO,CAAC,EAIXhK,EAAE,IAAIrC,CAAC,GAAK,GACdqC,EAAE,KAAKrC,CAAC,EACRoM,EAAG,KAAKC,CAAE,IAEVrM,EAAE,KAAKqC,CAAC,EACRgK,EAAG,KAAKD,CAAE,EAEd,CAEA,IAAIzK,EACJ,OAAIU,EAAE,KAAK,CAAC,IAAM,EAChBV,EAAMyK,EAENzK,EAAM0K,EAGJ1K,EAAI,KAAK,CAAC,EAAI,GAChBA,EAAI,KAAKwH,CAAC,EAGLxH,CACT,EAEApD,EAAG,UAAU,IAAM,SAAcK,EAAK,CACpC,GAAI,KAAK,OAAO,EAAG,OAAOA,EAAI,IAAI,EAClC,GAAIA,EAAI,OAAO,EAAG,OAAO,KAAK,IAAI,EAElC,IAAIyD,EAAI,KAAK,MAAM,EACfrC,EAAIpB,EAAI,MAAM,EAClByD,EAAE,SAAW,EACbrC,EAAE,SAAW,EAGb,QAAS8B,EAAQ,EAAGO,EAAE,OAAO,GAAKrC,EAAE,OAAO,EAAG8B,IAC5CO,EAAE,OAAO,CAAC,EACVrC,EAAE,OAAO,CAAC,EAGZ,EAAG,CACD,KAAOqC,EAAE,OAAO,GACdA,EAAE,OAAO,CAAC,EAEZ,KAAOrC,EAAE,OAAO,GACdA,EAAE,OAAO,CAAC,EAGZ,IAAIN,EAAI2C,EAAE,IAAIrC,CAAC,EACf,GAAIN,EAAI,EAAG,CAET,IAAIqC,EAAIM,EACRA,EAAIrC,EACJA,EAAI+B,CACN,SAAWrC,IAAM,GAAKM,EAAE,KAAK,CAAC,IAAM,EAClC,MAGFqC,EAAE,KAAKrC,CAAC,CACV,OAAS,IAET,OAAOA,EAAE,OAAO8B,CAAK,CACvB,EAGAvD,EAAG,UAAU,KAAO,SAAeK,EAAK,CACtC,OAAO,KAAK,KAAKA,CAAG,EAAE,EAAE,KAAKA,CAAG,CAClC,EAEAL,EAAG,UAAU,OAAS,UAAmB,CACvC,OAAQ,KAAK,MAAM,CAAC,EAAI,KAAO,CACjC,EAEAA,EAAG,UAAU,MAAQ,UAAkB,CACrC,OAAQ,KAAK,MAAM,CAAC,EAAI,KAAO,CACjC,EAGAA,EAAG,UAAU,MAAQ,SAAgBK,EAAK,CACxC,OAAO,KAAK,MAAM,CAAC,EAAIA,CACzB,EAGAL,EAAG,UAAU,MAAQ,SAAgB2D,EAAK,CACxClE,EAAO,OAAOkE,GAAQ,QAAQ,EAC9B,IAAIxC,EAAIwC,EAAM,GACV8G,GAAK9G,EAAMxC,GAAK,GAChB8K,EAAI,GAAK9K,EAGb,GAAI,KAAK,QAAUsJ,EACjB,YAAK,QAAQA,EAAI,CAAC,EAClB,KAAK,MAAMA,CAAC,GAAKwB,EACV,KAKT,QADItJ,EAAQsJ,EACHxL,EAAIgK,EAAG9H,IAAU,GAAKlC,EAAI,KAAK,OAAQA,IAAK,CACnD,IAAIE,EAAI,KAAK,MAAMF,CAAC,EAAI,EACxBE,GAAKgC,EACLA,EAAQhC,IAAM,GACdA,GAAK,SACL,KAAK,MAAMF,CAAC,EAAIE,CAClB,CACA,OAAIgC,IAAU,IACZ,KAAK,MAAMlC,CAAC,EAAIkC,EAChB,KAAK,UAEA,IACT,EAEA3C,EAAG,UAAU,OAAS,UAAmB,CACvC,OAAO,KAAK,SAAW,GAAK,KAAK,MAAM,CAAC,IAAM,CAChD,EAEAA,EAAG,UAAU,KAAO,SAAeK,EAAK,CACtC,IAAI2N,EAAW3N,EAAM,EAErB,GAAI,KAAK,WAAa,GAAK,CAAC2N,EAAU,MAAO,GAC7C,GAAI,KAAK,WAAa,GAAKA,EAAU,MAAO,GAE5C,KAAK,OAAO,EAEZ,IAAI5K,EACJ,GAAI,KAAK,OAAS,EAChBA,EAAM,MACD,CACD4K,IACF3N,EAAM,CAACA,GAGTZ,EAAOY,GAAO,SAAW,mBAAmB,EAE5C,IAAIM,EAAI,KAAK,MAAM,CAAC,EAAI,EACxByC,EAAMzC,IAAMN,EAAM,EAAIM,EAAIN,EAAM,GAAK,CACvC,CACA,OAAI,KAAK,WAAa,EAAU,CAAC+C,EAAM,EAChCA,CACT,EAMApD,EAAG,UAAU,IAAM,SAAcK,EAAK,CACpC,GAAI,KAAK,WAAa,GAAKA,EAAI,WAAa,EAAG,MAAO,GACtD,GAAI,KAAK,WAAa,GAAKA,EAAI,WAAa,EAAG,MAAO,GAEtD,IAAI+C,EAAM,KAAK,KAAK/C,CAAG,EACvB,OAAI,KAAK,WAAa,EAAU,CAAC+C,EAAM,EAChCA,CACT,EAGApD,EAAG,UAAU,KAAO,SAAeK,EAAK,CAEtC,GAAI,KAAK,OAASA,EAAI,OAAQ,MAAO,GACrC,GAAI,KAAK,OAASA,EAAI,OAAQ,MAAO,GAGrC,QADI+C,EAAM,EACD3C,EAAI,KAAK,OAAS,EAAGA,GAAK,EAAGA,IAAK,CACzC,IAAIqD,EAAI,KAAK,MAAMrD,CAAC,EAAI,EACpBgB,EAAIpB,EAAI,MAAMI,CAAC,EAAI,EAEvB,GAAIqD,IAAMrC,EACV,CAAIqC,EAAIrC,EACN2B,EAAM,GACGU,EAAIrC,IACb2B,EAAM,GAER,MACF,CACA,OAAOA,CACT,EAEApD,EAAG,UAAU,IAAM,SAAcK,EAAK,CACpC,OAAO,KAAK,KAAKA,CAAG,IAAM,CAC5B,EAEAL,EAAG,UAAU,GAAK,SAAaK,EAAK,CAClC,OAAO,KAAK,IAAIA,CAAG,IAAM,CAC3B,EAEAL,EAAG,UAAU,KAAO,SAAeK,EAAK,CACtC,OAAO,KAAK,KAAKA,CAAG,GAAK,CAC3B,EAEAL,EAAG,UAAU,IAAM,SAAcK,EAAK,CACpC,OAAO,KAAK,IAAIA,CAAG,GAAK,CAC1B,EAEAL,EAAG,UAAU,IAAM,SAAcK,EAAK,CACpC,OAAO,KAAK,KAAKA,CAAG,IAAM,EAC5B,EAEAL,EAAG,UAAU,GAAK,SAAaK,EAAK,CAClC,OAAO,KAAK,IAAIA,CAAG,IAAM,EAC3B,EAEAL,EAAG,UAAU,KAAO,SAAeK,EAAK,CACtC,OAAO,KAAK,KAAKA,CAAG,GAAK,CAC3B,EAEAL,EAAG,UAAU,IAAM,SAAcK,EAAK,CACpC,OAAO,KAAK,IAAIA,CAAG,GAAK,CAC1B,EAEAL,EAAG,UAAU,IAAM,SAAcK,EAAK,CACpC,OAAO,KAAK,KAAKA,CAAG,IAAM,CAC5B,EAEAL,EAAG,UAAU,GAAK,SAAaK,EAAK,CAClC,OAAO,KAAK,IAAIA,CAAG,IAAM,CAC3B,EAMAL,EAAG,IAAM,SAAcK,EAAK,CAC1B,OAAO,IAAI4N,EAAI5N,CAAG,CACpB,EAEAL,EAAG,UAAU,MAAQ,SAAgBkO,EAAK,CACxC,OAAAzO,EAAO,CAAC,KAAK,IAAK,uCAAuC,EACzDA,EAAO,KAAK,WAAa,EAAG,+BAA+B,EACpDyO,EAAI,UAAU,IAAI,EAAE,UAAUA,CAAG,CAC1C,EAEAlO,EAAG,UAAU,QAAU,UAAoB,CACzC,OAAAP,EAAO,KAAK,IAAK,sDAAsD,EAChE,KAAK,IAAI,YAAY,IAAI,CAClC,EAEAO,EAAG,UAAU,UAAY,SAAoBkO,EAAK,CAChD,YAAK,IAAMA,EACJ,IACT,EAEAlO,EAAG,UAAU,SAAW,SAAmBkO,EAAK,CAC9C,OAAAzO,EAAO,CAAC,KAAK,IAAK,uCAAuC,EAClD,KAAK,UAAUyO,CAAG,CAC3B,EAEAlO,EAAG,UAAU,OAAS,SAAiBK,EAAK,CAC1C,OAAAZ,EAAO,KAAK,IAAK,oCAAoC,EAC9C,KAAK,IAAI,IAAI,KAAMY,CAAG,CAC/B,EAEAL,EAAG,UAAU,QAAU,SAAkBK,EAAK,CAC5C,OAAAZ,EAAO,KAAK,IAAK,qCAAqC,EAC/C,KAAK,IAAI,KAAK,KAAMY,CAAG,CAChC,EAEAL,EAAG,UAAU,OAAS,SAAiBK,EAAK,CAC1C,OAAAZ,EAAO,KAAK,IAAK,oCAAoC,EAC9C,KAAK,IAAI,IAAI,KAAMY,CAAG,CAC/B,EAEAL,EAAG,UAAU,QAAU,SAAkBK,EAAK,CAC5C,OAAAZ,EAAO,KAAK,IAAK,qCAAqC,EAC/C,KAAK,IAAI,KAAK,KAAMY,CAAG,CAChC,EAEAL,EAAG,UAAU,OAAS,SAAiBK,EAAK,CAC1C,OAAAZ,EAAO,KAAK,IAAK,oCAAoC,EAC9C,KAAK,IAAI,IAAI,KAAMY,CAAG,CAC/B,EAEAL,EAAG,UAAU,OAAS,SAAiBK,EAAK,CAC1C,OAAAZ,EAAO,KAAK,IAAK,oCAAoC,EACrD,KAAK,IAAI,SAAS,KAAMY,CAAG,EACpB,KAAK,IAAI,IAAI,KAAMA,CAAG,CAC/B,EAEAL,EAAG,UAAU,QAAU,SAAkBK,EAAK,CAC5C,OAAAZ,EAAO,KAAK,IAAK,oCAAoC,EACrD,KAAK,IAAI,SAAS,KAAMY,CAAG,EACpB,KAAK,IAAI,KAAK,KAAMA,CAAG,CAChC,EAEAL,EAAG,UAAU,OAAS,UAAmB,CACvC,OAAAP,EAAO,KAAK,IAAK,oCAAoC,EACrD,KAAK,IAAI,SAAS,IAAI,EACf,KAAK,IAAI,IAAI,IAAI,CAC1B,EAEAO,EAAG,UAAU,QAAU,UAAoB,CACzC,OAAAP,EAAO,KAAK,IAAK,qCAAqC,EACtD,KAAK,IAAI,SAAS,IAAI,EACf,KAAK,IAAI,KAAK,IAAI,CAC3B,EAGAO,EAAG,UAAU,QAAU,UAAoB,CACzC,OAAAP,EAAO,KAAK,IAAK,qCAAqC,EACtD,KAAK,IAAI,SAAS,IAAI,EACf,KAAK,IAAI,KAAK,IAAI,CAC3B,EAEAO,EAAG,UAAU,QAAU,UAAoB,CACzC,OAAAP,EAAO,KAAK,IAAK,qCAAqC,EACtD,KAAK,IAAI,SAAS,IAAI,EACf,KAAK,IAAI,KAAK,IAAI,CAC3B,EAGAO,EAAG,UAAU,OAAS,UAAmB,CACvC,OAAAP,EAAO,KAAK,IAAK,oCAAoC,EACrD,KAAK,IAAI,SAAS,IAAI,EACf,KAAK,IAAI,IAAI,IAAI,CAC1B,EAEAO,EAAG,UAAU,OAAS,SAAiBK,EAAK,CAC1C,OAAAZ,EAAO,KAAK,KAAO,CAACY,EAAI,IAAK,mBAAmB,EAChD,KAAK,IAAI,SAAS,IAAI,EACf,KAAK,IAAI,IAAI,KAAMA,CAAG,CAC/B,EAGA,IAAI8N,GAAS,CACX,KAAM,KACN,KAAM,KACN,KAAM,KACN,OAAQ,IACV,EAGA,SAASC,EAAQC,EAAMzD,EAAG,CAExB,KAAK,KAAOyD,EACZ,KAAK,EAAI,IAAIrO,EAAG4K,EAAG,EAAE,EACrB,KAAK,EAAI,KAAK,EAAE,UAAU,EAC1B,KAAK,EAAI,IAAI5K,EAAG,CAAC,EAAE,OAAO,KAAK,CAAC,EAAE,KAAK,KAAK,CAAC,EAE7C,KAAK,IAAM,KAAK,KAAK,CACvB,CAEAoO,EAAO,UAAU,KAAO,UAAiB,CACvC,IAAIE,EAAM,IAAItO,EAAG,IAAI,EACrB,OAAAsO,EAAI,MAAQ,IAAI,MAAM,KAAK,KAAK,KAAK,EAAI,EAAE,CAAC,EACrCA,CACT,EAEAF,EAAO,UAAU,QAAU,SAAkB/N,EAAK,CAGhD,IAAIc,EAAId,EACJkO,EAEJ,GACE,KAAK,MAAMpN,EAAG,KAAK,GAAG,EACtBA,EAAI,KAAK,MAAMA,CAAC,EAChBA,EAAIA,EAAE,KAAK,KAAK,GAAG,EACnBoN,EAAOpN,EAAE,UAAU,QACZoN,EAAO,KAAK,GAErB,IAAItK,EAAMsK,EAAO,KAAK,EAAI,GAAKpN,EAAE,KAAK,KAAK,CAAC,EAC5C,OAAI8C,IAAQ,GACV9C,EAAE,MAAM,CAAC,EAAI,EACbA,EAAE,OAAS,GACF8C,EAAM,EACf9C,EAAE,KAAK,KAAK,CAAC,EAETA,EAAE,QAAU,OAEdA,EAAE,MAAM,EAGRA,EAAE,OAAO,EAINA,CACT,EAEAiN,EAAO,UAAU,MAAQ,SAAgBI,EAAO9L,EAAK,CACnD8L,EAAM,OAAO,KAAK,EAAG,EAAG9L,CAAG,CAC7B,EAEA0L,EAAO,UAAU,MAAQ,SAAgB/N,EAAK,CAC5C,OAAOA,EAAI,KAAK,KAAK,CAAC,CACxB,EAEA,SAASoO,IAAQ,CACfL,EAAO,KACL,KACA,OACA,yEAAyE,CAC7E,CACAxO,EAAS6O,GAAML,CAAM,EAErBK,GAAK,UAAU,MAAQ,SAAgBD,EAAOE,EAAQ,CAKpD,QAHInC,EAAO,QAEPoC,EAAS,KAAK,IAAIH,EAAM,OAAQ,CAAC,EAC5B/N,EAAI,EAAGA,EAAIkO,EAAQlO,IAC1BiO,EAAO,MAAMjO,CAAC,EAAI+N,EAAM,MAAM/N,CAAC,EAIjC,GAFAiO,EAAO,OAASC,EAEZH,EAAM,QAAU,EAAG,CACrBA,EAAM,MAAM,CAAC,EAAI,EACjBA,EAAM,OAAS,EACf,MACF,CAGA,IAAII,EAAOJ,EAAM,MAAM,CAAC,EAGxB,IAFAE,EAAO,MAAMA,EAAO,QAAQ,EAAIE,EAAOrC,EAElC9L,EAAI,GAAIA,EAAI+N,EAAM,OAAQ/N,IAAK,CAClC,IAAIoO,EAAOL,EAAM,MAAM/N,CAAC,EAAI,EAC5B+N,EAAM,MAAM/N,EAAI,EAAE,GAAMoO,EAAOtC,IAAS,EAAMqC,IAAS,GACvDA,EAAOC,CACT,CACAD,KAAU,GACVJ,EAAM,MAAM/N,EAAI,EAAE,EAAImO,EAClBA,IAAS,GAAKJ,EAAM,OAAS,GAC/BA,EAAM,QAAU,GAEhBA,EAAM,QAAU,CAEpB,EAEAC,GAAK,UAAU,MAAQ,SAAgBpO,EAAK,CAE1CA,EAAI,MAAMA,EAAI,MAAM,EAAI,EACxBA,EAAI,MAAMA,EAAI,OAAS,CAAC,EAAI,EAC5BA,EAAI,QAAU,EAId,QADI+D,EAAK,EACA3D,EAAI,EAAGA,EAAIJ,EAAI,OAAQI,IAAK,CACnC,IAAIE,EAAIN,EAAI,MAAMI,CAAC,EAAI,EACvB2D,GAAMzD,EAAI,IACVN,EAAI,MAAMI,CAAC,EAAI2D,EAAK,SACpBA,EAAKzD,EAAI,IAASyD,EAAK,SAAa,EACtC,CAGA,OAAI/D,EAAI,MAAMA,EAAI,OAAS,CAAC,IAAM,IAChCA,EAAI,SACAA,EAAI,MAAMA,EAAI,OAAS,CAAC,IAAM,GAChCA,EAAI,UAGDA,CACT,EAEA,SAASyO,IAAQ,CACfV,EAAO,KACL,KACA,OACA,gEAAgE,CACpE,CACAxO,EAASkP,GAAMV,CAAM,EAErB,SAASW,IAAQ,CACfX,EAAO,KACL,KACA,OACA,uDAAuD,CAC3D,CACAxO,EAASmP,GAAMX,CAAM,EAErB,SAASY,IAAU,CAEjBZ,EAAO,KACL,KACA,QACA,qEAAqE,CACzE,CACAxO,EAASoP,GAAQZ,CAAM,EAEvBY,GAAO,UAAU,MAAQ,SAAgB3O,EAAK,CAG5C,QADIsC,EAAQ,EACHlC,EAAI,EAAGA,EAAIJ,EAAI,OAAQI,IAAK,CACnC,IAAIgD,GAAMpD,EAAI,MAAMI,CAAC,EAAI,GAAK,GAAOkC,EACjCyB,EAAKX,EAAK,SACdA,KAAQ,GAERpD,EAAI,MAAMI,CAAC,EAAI2D,EACfzB,EAAQc,CACV,CACA,OAAId,IAAU,IACZtC,EAAI,MAAMA,EAAI,QAAQ,EAAIsC,GAErBtC,CACT,EAGAL,EAAG,OAAS,SAAgBqO,EAAM,CAEhC,GAAIF,GAAOE,CAAI,EAAG,OAAOF,GAAOE,CAAI,EAEpC,IAAIY,EACJ,GAAIZ,IAAS,OACXY,EAAQ,IAAIR,WACHJ,IAAS,OAClBY,EAAQ,IAAIH,WACHT,IAAS,OAClBY,EAAQ,IAAIF,WACHV,IAAS,SAClBY,EAAQ,IAAID,OAEZ,OAAM,IAAI,MAAM,iBAAmBX,CAAI,EAEzC,OAAAF,GAAOE,CAAI,EAAIY,EAERA,CACT,EAKA,SAAShB,EAAK5C,EAAG,CACf,GAAI,OAAOA,GAAM,SAAU,CACzB,IAAI4D,EAAQjP,EAAG,OAAOqL,CAAC,EACvB,KAAK,EAAI4D,EAAM,EACf,KAAK,MAAQA,CACf,MACExP,EAAO4L,EAAE,IAAI,CAAC,EAAG,gCAAgC,EACjD,KAAK,EAAIA,EACT,KAAK,MAAQ,IAEjB,CAEA4C,EAAI,UAAU,SAAW,SAAmBnK,EAAG,CAC7CrE,EAAOqE,EAAE,WAAa,EAAG,+BAA+B,EACxDrE,EAAOqE,EAAE,IAAK,iCAAiC,CACjD,EAEAmK,EAAI,UAAU,SAAW,SAAmBnK,EAAGrC,EAAG,CAChDhC,GAAQqE,EAAE,SAAWrC,EAAE,YAAc,EAAG,+BAA+B,EACvEhC,EAAOqE,EAAE,KAAOA,EAAE,MAAQrC,EAAE,IAC1B,iCAAiC,CACrC,EAEAwM,EAAI,UAAU,KAAO,SAAenK,EAAG,CACrC,OAAI,KAAK,MAAc,KAAK,MAAM,QAAQA,CAAC,EAAE,UAAU,IAAI,GAE3D5B,EAAK4B,EAAGA,EAAE,KAAK,KAAK,CAAC,EAAE,UAAU,IAAI,CAAC,EAC/BA,EACT,EAEAmK,EAAI,UAAU,IAAM,SAAcnK,EAAG,CACnC,OAAIA,EAAE,OAAO,EACJA,EAAE,MAAM,EAGV,KAAK,EAAE,IAAIA,CAAC,EAAE,UAAU,IAAI,CACrC,EAEAmK,EAAI,UAAU,IAAM,SAAcnK,EAAGrC,EAAG,CACtC,KAAK,SAASqC,EAAGrC,CAAC,EAElB,IAAI2B,EAAMU,EAAE,IAAIrC,CAAC,EACjB,OAAI2B,EAAI,IAAI,KAAK,CAAC,GAAK,GACrBA,EAAI,KAAK,KAAK,CAAC,EAEVA,EAAI,UAAU,IAAI,CAC3B,EAEA6K,EAAI,UAAU,KAAO,SAAenK,EAAGrC,EAAG,CACxC,KAAK,SAASqC,EAAGrC,CAAC,EAElB,IAAI2B,EAAMU,EAAE,KAAKrC,CAAC,EAClB,OAAI2B,EAAI,IAAI,KAAK,CAAC,GAAK,GACrBA,EAAI,KAAK,KAAK,CAAC,EAEVA,CACT,EAEA6K,EAAI,UAAU,IAAM,SAAcnK,EAAGrC,EAAG,CACtC,KAAK,SAASqC,EAAGrC,CAAC,EAElB,IAAI2B,EAAMU,EAAE,IAAIrC,CAAC,EACjB,OAAI2B,EAAI,KAAK,CAAC,EAAI,GAChBA,EAAI,KAAK,KAAK,CAAC,EAEVA,EAAI,UAAU,IAAI,CAC3B,EAEA6K,EAAI,UAAU,KAAO,SAAenK,EAAGrC,EAAG,CACxC,KAAK,SAASqC,EAAGrC,CAAC,EAElB,IAAI2B,EAAMU,EAAE,KAAKrC,CAAC,EAClB,OAAI2B,EAAI,KAAK,CAAC,EAAI,GAChBA,EAAI,KAAK,KAAK,CAAC,EAEVA,CACT,EAEA6K,EAAI,UAAU,IAAM,SAAcnK,EAAGzD,EAAK,CACxC,YAAK,SAASyD,CAAC,EACR,KAAK,KAAKA,EAAE,MAAMzD,CAAG,CAAC,CAC/B,EAEA4N,EAAI,UAAU,KAAO,SAAenK,EAAGrC,EAAG,CACxC,YAAK,SAASqC,EAAGrC,CAAC,EACX,KAAK,KAAKqC,EAAE,KAAKrC,CAAC,CAAC,CAC5B,EAEAwM,EAAI,UAAU,IAAM,SAAcnK,EAAGrC,EAAG,CACtC,YAAK,SAASqC,EAAGrC,CAAC,EACX,KAAK,KAAKqC,EAAE,IAAIrC,CAAC,CAAC,CAC3B,EAEAwM,EAAI,UAAU,KAAO,SAAenK,EAAG,CACrC,OAAO,KAAK,KAAKA,EAAGA,EAAE,MAAM,CAAC,CAC/B,EAEAmK,EAAI,UAAU,IAAM,SAAcnK,EAAG,CACnC,OAAO,KAAK,IAAIA,EAAGA,CAAC,CACtB,EAEAmK,EAAI,UAAU,KAAO,SAAenK,EAAG,CACrC,GAAIA,EAAE,OAAO,EAAG,OAAOA,EAAE,MAAM,EAE/B,IAAIoL,EAAO,KAAK,EAAE,MAAM,CAAC,EAIzB,GAHAzP,EAAOyP,EAAO,IAAM,CAAC,EAGjBA,IAAS,EAAG,CACd,IAAIlN,EAAM,KAAK,EAAE,IAAI,IAAIhC,EAAG,CAAC,CAAC,EAAE,OAAO,CAAC,EACxC,OAAO,KAAK,IAAI8D,EAAG9B,CAAG,CACxB,CAOA,QAFIiK,EAAI,KAAK,EAAE,KAAK,CAAC,EACjBxB,EAAI,EACD,CAACwB,EAAE,OAAO,GAAKA,EAAE,MAAM,CAAC,IAAM,GACnCxB,IACAwB,EAAE,OAAO,CAAC,EAEZxM,EAAO,CAACwM,EAAE,OAAO,CAAC,EAElB,IAAIkD,EAAM,IAAInP,EAAG,CAAC,EAAE,MAAM,IAAI,EAC1BoP,EAAOD,EAAI,OAAO,EAIlBE,EAAO,KAAK,EAAE,KAAK,CAAC,EAAE,OAAO,CAAC,EAC9BC,EAAI,KAAK,EAAE,UAAU,EAGzB,IAFAA,EAAI,IAAItP,EAAG,EAAIsP,EAAIA,CAAC,EAAE,MAAM,IAAI,EAEzB,KAAK,IAAIA,EAAGD,CAAI,EAAE,IAAID,CAAI,IAAM,GACrCE,EAAE,QAAQF,CAAI,EAOhB,QAJIpO,EAAI,KAAK,IAAIsO,EAAGrD,CAAC,EACjB9K,EAAI,KAAK,IAAI2C,EAAGmI,EAAE,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC,EACnCzI,EAAI,KAAK,IAAIM,EAAGmI,CAAC,EACjBZ,EAAIZ,EACDjH,EAAE,IAAI2L,CAAG,IAAM,GAAG,CAEvB,QADIb,EAAM9K,EACD/C,EAAI,EAAG6N,EAAI,IAAIa,CAAG,IAAM,EAAG1O,IAClC6N,EAAMA,EAAI,OAAO,EAEnB7O,EAAOgB,EAAI4K,CAAC,EACZ,IAAI5J,EAAI,KAAK,IAAIT,EAAG,IAAIhB,EAAG,CAAC,EAAE,OAAOqL,EAAI5K,EAAI,CAAC,CAAC,EAE/CU,EAAIA,EAAE,OAAOM,CAAC,EACdT,EAAIS,EAAE,OAAO,EACb+B,EAAIA,EAAE,OAAOxC,CAAC,EACdqK,EAAI5K,CACN,CAEA,OAAOU,CACT,EAEA8M,EAAI,UAAU,KAAO,SAAenK,EAAG,CACrC,IAAIyL,EAAMzL,EAAE,OAAO,KAAK,CAAC,EACzB,OAAIyL,EAAI,WAAa,GACnBA,EAAI,SAAW,EACR,KAAK,KAAKA,CAAG,EAAE,OAAO,GAEtB,KAAK,KAAKA,CAAG,CAExB,EAEAtB,EAAI,UAAU,IAAM,SAAcnK,EAAGzD,EAAK,CACxC,GAAIA,EAAI,OAAO,EAAG,OAAO,IAAIL,EAAG,CAAC,EAAE,MAAM,IAAI,EAC7C,GAAIK,EAAI,KAAK,CAAC,IAAM,EAAG,OAAOyD,EAAE,MAAM,EAEtC,IAAI0L,EAAa,EACbC,EAAM,IAAI,MAAM,GAAKD,CAAU,EACnCC,EAAI,CAAC,EAAI,IAAIzP,EAAG,CAAC,EAAE,MAAM,IAAI,EAC7ByP,EAAI,CAAC,EAAI3L,EACT,QAASrD,EAAI,EAAGA,EAAIgP,EAAI,OAAQhP,IAC9BgP,EAAIhP,CAAC,EAAI,KAAK,IAAIgP,EAAIhP,EAAI,CAAC,EAAGqD,CAAC,EAGjC,IAAIV,EAAMqM,EAAI,CAAC,EACXC,EAAU,EACVC,EAAa,EACbnP,EAAQH,EAAI,UAAU,EAAI,GAK9B,IAJIG,IAAU,IACZA,EAAQ,IAGLC,EAAIJ,EAAI,OAAS,EAAGI,GAAK,EAAGA,IAAK,CAEpC,QADIsB,EAAO1B,EAAI,MAAMI,CAAC,EACbC,EAAIF,EAAQ,EAAGE,GAAK,EAAGA,IAAK,CACnC,IAAIiD,EAAO5B,GAAQrB,EAAK,EAKxB,GAJI0C,IAAQqM,EAAI,CAAC,IACfrM,EAAM,KAAK,IAAIA,CAAG,GAGhBO,IAAQ,GAAK+L,IAAY,EAAG,CAC9BC,EAAa,EACb,QACF,CAEAD,IAAY,EACZA,GAAW/L,EACXgM,IACI,EAAAA,IAAeH,IAAe/O,IAAM,GAAKC,IAAM,MAEnD0C,EAAM,KAAK,IAAIA,EAAKqM,EAAIC,CAAO,CAAC,EAChCC,EAAa,EACbD,EAAU,EACZ,CACAlP,EAAQ,EACV,CAEA,OAAO4C,CACT,EAEA6K,EAAI,UAAU,UAAY,SAAoB5N,EAAK,CACjD,IAAIc,EAAId,EAAI,KAAK,KAAK,CAAC,EAEvB,OAAOc,IAAMd,EAAMc,EAAE,MAAM,EAAIA,CACjC,EAEA8M,EAAI,UAAU,YAAc,SAAsB5N,EAAK,CACrD,IAAI+C,EAAM/C,EAAI,MAAM,EACpB,OAAA+C,EAAI,IAAM,KACHA,CACT,EAMApD,EAAG,KAAO,SAAeK,EAAK,CAC5B,OAAO,IAAIuP,GAAKvP,CAAG,CACrB,EAEA,SAASuP,GAAMvE,EAAG,CAChB4C,EAAI,KAAK,KAAM5C,CAAC,EAEhB,KAAK,MAAQ,KAAK,EAAE,UAAU,EAC1B,KAAK,MAAQ,KAAO,IACtB,KAAK,OAAS,GAAM,KAAK,MAAQ,IAGnC,KAAK,EAAI,IAAIrL,EAAG,CAAC,EAAE,OAAO,KAAK,KAAK,EACpC,KAAK,GAAK,KAAK,KAAK,KAAK,EAAE,IAAI,CAAC,EAChC,KAAK,KAAO,KAAK,EAAE,OAAO,KAAK,CAAC,EAEhC,KAAK,KAAO,KAAK,KAAK,IAAI,KAAK,CAAC,EAAE,MAAM,CAAC,EAAE,IAAI,KAAK,CAAC,EACrD,KAAK,KAAO,KAAK,KAAK,KAAK,KAAK,CAAC,EACjC,KAAK,KAAO,KAAK,EAAE,IAAI,KAAK,IAAI,CAClC,CACAJ,EAASgQ,GAAM3B,CAAG,EAElB2B,GAAK,UAAU,UAAY,SAAoBvP,EAAK,CAClD,OAAO,KAAK,KAAKA,EAAI,MAAM,KAAK,KAAK,CAAC,CACxC,EAEAuP,GAAK,UAAU,YAAc,SAAsBvP,EAAK,CACtD,IAAIc,EAAI,KAAK,KAAKd,EAAI,IAAI,KAAK,IAAI,CAAC,EACpC,OAAAc,EAAE,IAAM,KACDA,CACT,EAEAyO,GAAK,UAAU,KAAO,SAAe9L,EAAGrC,EAAG,CACzC,GAAIqC,EAAE,OAAO,GAAKrC,EAAE,OAAO,EACzB,OAAAqC,EAAE,MAAM,CAAC,EAAI,EACbA,EAAE,OAAS,EACJA,EAGT,IAAIN,EAAIM,EAAE,KAAKrC,CAAC,EACZT,EAAIwC,EAAE,MAAM,KAAK,KAAK,EAAE,IAAI,KAAK,IAAI,EAAE,OAAO,KAAK,KAAK,EAAE,IAAI,KAAK,CAAC,EACpEqM,EAAIrM,EAAE,KAAKxC,CAAC,EAAE,OAAO,KAAK,KAAK,EAC/BoC,EAAMyM,EAEV,OAAIA,EAAE,IAAI,KAAK,CAAC,GAAK,EACnBzM,EAAMyM,EAAE,KAAK,KAAK,CAAC,EACVA,EAAE,KAAK,CAAC,EAAI,IACrBzM,EAAMyM,EAAE,KAAK,KAAK,CAAC,GAGdzM,EAAI,UAAU,IAAI,CAC3B,EAEAwM,GAAK,UAAU,IAAM,SAAc9L,EAAGrC,EAAG,CACvC,GAAIqC,EAAE,OAAO,GAAKrC,EAAE,OAAO,EAAG,OAAO,IAAIzB,EAAG,CAAC,EAAE,UAAU,IAAI,EAE7D,IAAIwD,EAAIM,EAAE,IAAIrC,CAAC,EACXT,EAAIwC,EAAE,MAAM,KAAK,KAAK,EAAE,IAAI,KAAK,IAAI,EAAE,OAAO,KAAK,KAAK,EAAE,IAAI,KAAK,CAAC,EACpEqM,EAAIrM,EAAE,KAAKxC,CAAC,EAAE,OAAO,KAAK,KAAK,EAC/BoC,EAAMyM,EACV,OAAIA,EAAE,IAAI,KAAK,CAAC,GAAK,EACnBzM,EAAMyM,EAAE,KAAK,KAAK,CAAC,EACVA,EAAE,KAAK,CAAC,EAAI,IACrBzM,EAAMyM,EAAE,KAAK,KAAK,CAAC,GAGdzM,EAAI,UAAU,IAAI,CAC3B,EAEAwM,GAAK,UAAU,KAAO,SAAe9L,EAAG,CAEtC,IAAIV,EAAM,KAAK,KAAKU,EAAE,OAAO,KAAK,CAAC,EAAE,IAAI,KAAK,EAAE,CAAC,EACjD,OAAOV,EAAI,UAAU,IAAI,CAC3B,CACF,GAAG,OAAO5D,GAAW,KAAeA,GAAQD,EAAI,IC19GhD,OAAS,qBAAAuQ,OAAyB,oBCgBlC,OAAS,aAAAC,OAAiB,qBAI1B,OAAS,uBAAAC,OAA2B,oBClB7B,IAAMC,GAAgB,IAChBC,GAAe,MAErB,SAASC,GAAcC,EAAkB,CAC9C,OAAO,KAAK,MAAM,IAAI,KAAK,EAAE,SAAS,CAAC,EAAIA,CAC7C,CAKO,IAAMC,GAAN,KAAoB,CAKzB,YAAYC,EAA2BC,EAAc,EAAG,CACtD,KAAK,YAAcA,EACnB,KAAK,MAAQD,CACf,CAEA,SAAmB,CACjB,OAAI,KAAK,QAAU,KACV,GAEL,KAAK,cAAgB,EAChB,GAEL,OAAK,MAAM,IAAI,KAAK,EAAE,SAAS,CAAC,EAAI,KAAK,YAI/C,CACF,EClCA,OAAS,kBAAAE,OAAsB,+BAC/B,OAAS,oBAAAC,OAAwB,iCACjC,OAAS,WAAAC,GAAS,cAAAC,GAAY,WAAAC,GAAS,WAAAC,GAAS,wBAAAC,OAA4B,oBCD5E,OAAS,mBAAAC,OAAuB,2BCAzB,IAAMC,GAAe,CAC1B,eAAgB,gBAChB,YAAa,YACf,EAQsBC,GAAf,MAAeC,UAAkB,KAAM,CAGlC,YACRC,EACgBC,EACAC,EAChB,CACA,MAAMF,CAAO,EAHG,UAAAC,EACA,aAAAC,EAGhB,KAAK,KAAO,KAAK,YAAY,IAC/B,CATA,YAAgB,aAAeL,GAc/B,QAA8B,CAC5B,MAAO,CACL,KAAM,KAAK,KACX,QAAS,KAAK,QACd,KAAM,KAAK,KACX,QAAS,KAAK,OAChB,CACF,CAKA,UAAmB,CACjB,OAAO,KAAK,UAAU,KAAK,OAAO,CAAC,CACrC,CAKA,OAAO,YAAiCM,EAAYF,EAA0B,CAC5E,OAAOE,aAAiBJ,GAAaI,EAAM,OAASF,CACtD,CACF,ECtCO,IAAMG,GAAN,cAA0BC,EAAU,CACzC,YAAYC,EAAiBC,EAA6BC,EAA+B,CACvF,MAAMF,EAASC,GAAa,eAAgBC,CAAO,CACrD,CAEA,OAAO,kBAAkB,EAAQC,EAAgC,CAC/D,OAAO,KAAK,YAAyB,EAAGA,CAAI,CAC9C,CACF,EAMO,IAAMC,GAAqB,CAACC,EAAuBC,EAAiBC,IAAkC,CAC3G,MAAM,IAAIC,GAAYF,EAASD,EAAME,CAAO,CAC9C,ECbA,IAAIE,GAAY,KAIdC,GAAa,IAGbC,GAAW,mBAGXC,GAAO,qgCAGPC,GAAK,qgCAILC,GAAW,CAOT,UAAW,GAiBX,SAAU,EAeV,OAAQ,EAIR,SAAU,GAIV,SAAW,GAIX,KAAM,CAACL,GAIP,KAAMA,GAGN,OAAQ,EACV,EAMAM,GAASC,GACTC,EAAW,GAEXC,GAAe,kBACfC,GAAkBD,GAAe,qBACjCE,GAAyBF,GAAe,2BACxCG,GAAoBH,GAAe,qBACnCI,GAAM,mBAENC,GAAY,KAAK,MACjBC,GAAU,KAAK,IAEfC,GAAW,6CACXC,GAAQ,yDACRC,GAAU,gDACVC,GAAY,qCAEZC,GAAO,IACPC,EAAW,EACXC,GAAmB,iBAEnBC,GAAiBpB,GAAK,OAAS,EAC/BqB,GAAepB,GAAG,OAAS,EAG3BqB,EAAI,CAAE,YAAaZ,EAAI,EA0EzBY,EAAE,cAAgBA,EAAE,IAAM,UAAY,CACpC,IAAIC,EAAI,IAAI,KAAK,YAAY,IAAI,EACjC,OAAIA,EAAE,EAAI,IAAGA,EAAE,EAAI,GACZC,EAASD,CAAC,CACnB,EAQAD,EAAE,KAAO,UAAY,CACnB,OAAOE,EAAS,IAAI,KAAK,YAAY,IAAI,EAAG,KAAK,EAAI,EAAG,CAAC,CAC3D,EAWAF,EAAE,UAAYA,EAAE,MAAQ,SAAUG,EAAKC,EAAK,CAC1C,IAAIC,EACFJ,EAAI,KACJK,EAAOL,EAAE,YAGX,GAFAE,EAAM,IAAIG,EAAKH,CAAG,EAClBC,EAAM,IAAIE,EAAKF,CAAG,EACd,CAACD,EAAI,GAAK,CAACC,EAAI,EAAG,OAAO,IAAIE,EAAK,GAAG,EACzC,GAAIH,EAAI,GAAGC,CAAG,EAAG,MAAM,MAAMnB,GAAkBmB,CAAG,EAClD,OAAAC,EAAIJ,EAAE,IAAIE,CAAG,EACNE,EAAI,EAAIF,EAAMF,EAAE,IAAIG,CAAG,EAAI,EAAIA,EAAM,IAAIE,EAAKL,CAAC,CACxD,EAWAD,EAAE,WAAaA,EAAE,IAAM,SAAUO,EAAG,CAClC,IAAIC,EAAGC,EAAGC,EAAKC,EACbV,EAAI,KACJW,EAAKX,EAAE,EACPY,GAAMN,EAAI,IAAIN,EAAE,YAAYM,CAAC,GAAG,EAChCO,EAAKb,EAAE,EACPc,EAAKR,EAAE,EAGT,GAAI,CAACK,GAAM,CAACC,EACV,MAAO,CAACC,GAAM,CAACC,EAAK,IAAMD,IAAOC,EAAKD,EAAKF,IAAOC,EAAK,EAAI,CAACD,EAAKE,EAAK,EAAI,EAAI,GAIhF,GAAI,CAACF,EAAG,CAAC,GAAK,CAACC,EAAG,CAAC,EAAG,OAAOD,EAAG,CAAC,EAAIE,EAAKD,EAAG,CAAC,EAAI,CAACE,EAAK,EAGxD,GAAID,IAAOC,EAAI,OAAOD,EAGtB,GAAIb,EAAE,IAAMM,EAAE,EAAG,OAAON,EAAE,EAAIM,EAAE,EAAIO,EAAK,EAAI,EAAI,GAMjD,IAJAJ,EAAME,EAAG,OACTD,EAAME,EAAG,OAGJL,EAAI,EAAGC,EAAIC,EAAMC,EAAMD,EAAMC,EAAKH,EAAIC,EAAG,EAAED,EAC9C,GAAII,EAAGJ,CAAC,IAAMK,EAAGL,CAAC,EAAG,OAAOI,EAAGJ,CAAC,EAAIK,EAAGL,CAAC,EAAIM,EAAK,EAAI,EAAI,GAI3D,OAAOJ,IAAQC,EAAM,EAAID,EAAMC,EAAMG,EAAK,EAAI,EAAI,EACpD,EAgBAd,EAAE,OAASA,EAAE,IAAM,UAAY,CAC7B,IAAIgB,EAAIC,EACNhB,EAAI,KACJK,EAAOL,EAAE,YAEX,OAAKA,EAAE,EAGFA,EAAE,EAAE,CAAC,GAEVe,EAAKV,EAAK,UACVW,EAAKX,EAAK,SACVA,EAAK,UAAYU,EAAK,KAAK,IAAIf,EAAE,EAAGA,EAAE,GAAG,CAAC,EAAIL,EAC9CU,EAAK,SAAW,EAEhBL,EAAIiB,GAAOZ,EAAMa,GAAiBb,EAAML,CAAC,CAAC,EAE1CK,EAAK,UAAYU,EACjBV,EAAK,SAAWW,EAETf,EAASpB,IAAY,GAAKA,IAAY,EAAImB,EAAE,IAAI,EAAIA,EAAGe,EAAIC,EAAI,EAAI,GAZtD,IAAIX,EAAK,CAAC,EAHb,IAAIA,EAAK,GAAG,CAgB/B,EAmBAN,EAAE,SAAWA,EAAE,KAAO,UAAY,CAChC,IAAIoB,EAAGC,EAAGC,EAAGC,EAAGC,EAAK,EAAGC,EAAIC,EAAGC,EAAIC,EACjC3B,EAAI,KACJK,EAAOL,EAAE,YAEX,GAAI,CAACA,EAAE,SAAS,GAAKA,EAAE,OAAO,EAAG,OAAO,IAAIK,EAAKL,CAAC,EAoClD,IAnCAlB,EAAW,GAGX,EAAIkB,EAAE,EAAIX,GAAQW,EAAE,EAAIA,EAAG,EAAI,CAAC,EAI5B,CAAC,GAAK,KAAK,IAAI,CAAC,GAAK,KACvBqB,EAAIO,GAAe5B,EAAE,CAAC,EACtBmB,EAAInB,EAAE,GAGF,GAAKmB,EAAIE,EAAE,OAAS,GAAK,KAAGA,GAAM,GAAK,GAAK,GAAK,GAAK,IAAM,MAChE,EAAIhC,GAAQgC,EAAG,EAAI,CAAC,EAGpBF,EAAI/B,IAAW+B,EAAI,GAAK,CAAC,GAAKA,EAAI,IAAMA,EAAI,EAAI,GAAK,IAEjD,GAAK,IACPE,EAAI,KAAOF,GAEXE,EAAI,EAAE,cAAc,EACpBA,EAAIA,EAAE,MAAM,EAAGA,EAAE,QAAQ,GAAG,EAAI,CAAC,EAAIF,GAGvCG,EAAI,IAAIjB,EAAKgB,CAAC,EACdC,EAAE,EAAItB,EAAE,GAERsB,EAAI,IAAIjB,EAAK,EAAE,SAAS,CAAC,EAG3BmB,GAAML,EAAId,EAAK,WAAa,IAW1B,GANAoB,EAAIH,EACJI,EAAKD,EAAE,MAAMA,CAAC,EAAE,MAAMA,CAAC,EACvBE,EAAUD,EAAG,KAAK1B,CAAC,EACnBsB,EAAIO,EAAOF,EAAQ,KAAK3B,CAAC,EAAE,MAAMyB,CAAC,EAAGE,EAAQ,KAAKD,CAAE,EAAGF,EAAK,EAAG,CAAC,EAG5DI,GAAeH,EAAE,CAAC,EAAE,MAAM,EAAGD,CAAE,KAAOH,EAAIO,GAAeN,EAAE,CAAC,GAAG,MAAM,EAAGE,CAAE,EAK5E,GAJAH,EAAIA,EAAE,MAAMG,EAAK,EAAGA,EAAK,CAAC,EAItBH,GAAK,QAAU,CAACE,GAAOF,GAAK,OAAQ,CAItC,GAAI,CAACE,IACHtB,EAASwB,EAAGN,EAAI,EAAG,CAAC,EAEhBM,EAAE,MAAMA,CAAC,EAAE,MAAMA,CAAC,EAAE,GAAGzB,CAAC,GAAG,CAC7BsB,EAAIG,EACJ,KACF,CAGFD,GAAM,EACND,EAAM,CACR,KAAO,EAID,CAAC,CAACF,GAAK,CAAC,CAACA,EAAE,MAAM,CAAC,GAAKA,EAAE,OAAO,CAAC,GAAK,OAGxCpB,EAASqB,EAAGH,EAAI,EAAG,CAAC,EACpBC,EAAI,CAACE,EAAE,MAAMA,CAAC,EAAE,MAAMA,CAAC,EAAE,GAAGtB,CAAC,GAG/B,KACF,CAIJ,OAAAlB,EAAW,GAEJmB,EAASqB,EAAGH,EAAGd,EAAK,SAAUe,CAAC,CACxC,EAOArB,EAAE,cAAgBA,EAAE,GAAK,UAAY,CACnC,IAAI+B,EACFC,EAAI,KAAK,EACTV,EAAI,IAEN,GAAIU,EAAG,CAML,GALAD,EAAIC,EAAE,OAAS,EACfV,GAAKS,EAAI1C,GAAU,KAAK,EAAIO,CAAQ,GAAKA,EAGzCmC,EAAIC,EAAED,CAAC,EACHA,EAAG,KAAOA,EAAI,IAAM,EAAGA,GAAK,GAAIT,IAChCA,EAAI,IAAGA,EAAI,EACjB,CAEA,OAAOA,CACT,EAwBAtB,EAAE,UAAYA,EAAE,IAAM,SAAUO,EAAG,CACjC,OAAOuB,EAAO,KAAM,IAAI,KAAK,YAAYvB,CAAC,CAAC,CAC7C,EAQAP,EAAE,mBAAqBA,EAAE,SAAW,SAAUO,EAAG,CAC/C,IAAIN,EAAI,KACNK,EAAOL,EAAE,YACX,OAAOC,EAAS4B,EAAO7B,EAAG,IAAIK,EAAKC,CAAC,EAAG,EAAG,EAAG,CAAC,EAAGD,EAAK,UAAWA,EAAK,QAAQ,CAChF,EAOAN,EAAE,OAASA,EAAE,GAAK,SAAUO,EAAG,CAC7B,OAAO,KAAK,IAAIA,CAAC,IAAM,CACzB,EAQAP,EAAE,MAAQ,UAAY,CACpB,OAAOE,EAAS,IAAI,KAAK,YAAY,IAAI,EAAG,KAAK,EAAI,EAAG,CAAC,CAC3D,EAQAF,EAAE,YAAcA,EAAE,GAAK,SAAUO,EAAG,CAClC,OAAO,KAAK,IAAIA,CAAC,EAAI,CACvB,EAQAP,EAAE,qBAAuBA,EAAE,IAAM,SAAUO,EAAG,CAC5C,IAAIF,EAAI,KAAK,IAAIE,CAAC,EAClB,OAAOF,GAAK,GAAKA,IAAM,CACzB,EA4BAL,EAAE,iBAAmBA,EAAE,KAAO,UAAY,CACxC,IAAIK,EAAGiB,EAAGN,EAAIC,EAAIgB,EAChBhC,EAAI,KACJK,EAAOL,EAAE,YACTiC,EAAM,IAAI5B,EAAK,CAAC,EAElB,GAAI,CAACL,EAAE,SAAS,EAAG,OAAO,IAAIK,EAAKL,EAAE,EAAI,IAAQ,GAAG,EACpD,GAAIA,EAAE,OAAO,EAAG,OAAOiC,EAEvBlB,EAAKV,EAAK,UACVW,EAAKX,EAAK,SACVA,EAAK,UAAYU,EAAK,KAAK,IAAIf,EAAE,EAAGA,EAAE,GAAG,CAAC,EAAI,EAC9CK,EAAK,SAAW,EAChB2B,EAAMhC,EAAE,EAAE,OAONgC,EAAM,IACR5B,EAAI,KAAK,KAAK4B,EAAM,CAAC,EACrBX,GAAK,EAAIa,GAAQ,EAAG9B,CAAC,GAAG,SAAS,IAEjCA,EAAI,GACJiB,EAAI,gCAGNrB,EAAImC,GAAa9B,EAAM,EAAGL,EAAE,MAAMqB,CAAC,EAAG,IAAIhB,EAAK,CAAC,EAAG,EAAI,EAMvD,QAHI+B,EACF7B,EAAIH,EACJiC,EAAK,IAAIhC,EAAK,CAAC,EACVE,KACL6B,EAAUpC,EAAE,MAAMA,CAAC,EACnBA,EAAIiC,EAAI,MAAMG,EAAQ,MAAMC,EAAG,MAAMD,EAAQ,MAAMC,CAAE,CAAC,CAAC,CAAC,EAG1D,OAAOpC,EAASD,EAAGK,EAAK,UAAYU,EAAIV,EAAK,SAAWW,EAAI,EAAI,CAClE,EAiCAjB,EAAE,eAAiBA,EAAE,KAAO,UAAY,CACtC,IAAIK,EAAGW,EAAIC,EAAIgB,EACbhC,EAAI,KACJK,EAAOL,EAAE,YAEX,GAAI,CAACA,EAAE,SAAS,GAAKA,EAAE,OAAO,EAAG,OAAO,IAAIK,EAAKL,CAAC,EAQlD,GANAe,EAAKV,EAAK,UACVW,EAAKX,EAAK,SACVA,EAAK,UAAYU,EAAK,KAAK,IAAIf,EAAE,EAAGA,EAAE,GAAG,CAAC,EAAI,EAC9CK,EAAK,SAAW,EAChB2B,EAAMhC,EAAE,EAAE,OAENgC,EAAM,EACRhC,EAAImC,GAAa9B,EAAM,EAAGL,EAAGA,EAAG,EAAI,MAC/B,CAWLI,EAAI,IAAM,KAAK,KAAK4B,CAAG,EACvB5B,EAAIA,EAAI,GAAK,GAAKA,EAAI,EAEtBJ,EAAIA,EAAE,MAAM,EAAIkC,GAAQ,EAAG9B,CAAC,CAAC,EAC7BJ,EAAImC,GAAa9B,EAAM,EAAGL,EAAGA,EAAG,EAAI,EAOpC,QAJIsC,EACFC,EAAK,IAAIlC,EAAK,CAAC,EACfmC,EAAM,IAAInC,EAAK,EAAE,EACjBoC,EAAM,IAAIpC,EAAK,EAAE,EACZD,KACLkC,EAAUtC,EAAE,MAAMA,CAAC,EACnBA,EAAIA,EAAE,MAAMuC,EAAG,KAAKD,EAAQ,MAAME,EAAI,MAAMF,CAAO,EAAE,KAAKG,CAAG,CAAC,CAAC,CAAC,CAEpE,CAEA,OAAApC,EAAK,UAAYU,EACjBV,EAAK,SAAWW,EAETf,EAASD,EAAGe,EAAIC,EAAI,EAAI,CACjC,EAmBAjB,EAAE,kBAAoBA,EAAE,KAAO,UAAY,CACzC,IAAIgB,EAAIC,EACNhB,EAAI,KACJK,EAAOL,EAAE,YAEX,OAAKA,EAAE,SAAS,EACZA,EAAE,OAAO,EAAU,IAAIK,EAAKL,CAAC,GAEjCe,EAAKV,EAAK,UACVW,EAAKX,EAAK,SACVA,EAAK,UAAYU,EAAK,EACtBV,EAAK,SAAW,EAETwB,EAAO7B,EAAE,KAAK,EAAGA,EAAE,KAAK,EAAGK,EAAK,UAAYU,EAAIV,EAAK,SAAWW,CAAE,GAR/C,IAAIX,EAAKL,EAAE,CAAC,CASxC,EAsBAD,EAAE,cAAgBA,EAAE,KAAO,UAAY,CACrC,IAAIC,EAAI,KACNK,EAAOL,EAAE,YACTI,EAAIJ,EAAE,IAAI,EAAE,IAAI,CAAC,EACjBe,EAAKV,EAAK,UACVW,EAAKX,EAAK,SAEZ,OAAID,IAAM,GACDA,IAAM,EAETJ,EAAE,MAAM,EAAI0C,GAAMrC,EAAMU,EAAIC,CAAE,EAAI,IAAIX,EAAK,CAAC,EAE5C,IAAIA,EAAK,GAAG,EAGdL,EAAE,OAAO,EAAU0C,GAAMrC,EAAMU,EAAK,EAAGC,CAAE,EAAE,MAAM,EAAG,GAIxDX,EAAK,UAAYU,EAAK,EACtBV,EAAK,SAAW,EAGhBL,EAAI,IAAIK,EAAK,CAAC,EAAE,MAAML,CAAC,EAAE,IAAIA,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAEpDK,EAAK,UAAYU,EACjBV,EAAK,SAAWW,EAEThB,EAAE,MAAM,CAAC,EAClB,EAsBAD,EAAE,wBAA0BA,EAAE,MAAQ,UAAY,CAChD,IAAIgB,EAAIC,EACNhB,EAAI,KACJK,EAAOL,EAAE,YAEX,OAAIA,EAAE,IAAI,CAAC,EAAU,IAAIK,EAAKL,EAAE,GAAG,CAAC,EAAI,EAAI,GAAG,EAC1CA,EAAE,SAAS,GAEhBe,EAAKV,EAAK,UACVW,EAAKX,EAAK,SACVA,EAAK,UAAYU,EAAK,KAAK,IAAI,KAAK,IAAIf,EAAE,CAAC,EAAGA,EAAE,GAAG,CAAC,EAAI,EACxDK,EAAK,SAAW,EAChBvB,EAAW,GAEXkB,EAAIA,EAAE,MAAMA,CAAC,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,KAAKA,CAAC,EAErClB,EAAW,GACXuB,EAAK,UAAYU,EACjBV,EAAK,SAAWW,EAEThB,EAAE,GAAG,GAdc,IAAIK,EAAKL,CAAC,CAetC,EAmBAD,EAAE,sBAAwBA,EAAE,MAAQ,UAAY,CAC9C,IAAIgB,EAAIC,EACNhB,EAAI,KACJK,EAAOL,EAAE,YAEX,MAAI,CAACA,EAAE,SAAS,GAAKA,EAAE,OAAO,EAAU,IAAIK,EAAKL,CAAC,GAElDe,EAAKV,EAAK,UACVW,EAAKX,EAAK,SACVA,EAAK,UAAYU,EAAK,EAAI,KAAK,IAAI,KAAK,IAAIf,EAAE,CAAC,EAAGA,EAAE,GAAG,CAAC,EAAI,EAC5DK,EAAK,SAAW,EAChBvB,EAAW,GAEXkB,EAAIA,EAAE,MAAMA,CAAC,EAAE,KAAK,CAAC,EAAE,KAAK,EAAE,KAAKA,CAAC,EAEpClB,EAAW,GACXuB,EAAK,UAAYU,EACjBV,EAAK,SAAWW,EAEThB,EAAE,GAAG,EACd,EAsBAD,EAAE,yBAA2BA,EAAE,MAAQ,UAAY,CACjD,IAAIgB,EAAIC,EAAI2B,EAAKC,EACf5C,EAAI,KACJK,EAAOL,EAAE,YAEX,OAAKA,EAAE,SAAS,EACZA,EAAE,GAAK,EAAU,IAAIK,EAAKL,EAAE,IAAI,EAAE,GAAG,CAAC,EAAIA,EAAE,EAAI,EAAIA,EAAE,OAAO,EAAIA,EAAI,GAAG,GAE5Ee,EAAKV,EAAK,UACVW,EAAKX,EAAK,SACVuC,EAAM5C,EAAE,GAAG,EAEP,KAAK,IAAI4C,EAAK7B,CAAE,EAAI,EAAI,CAACf,EAAE,EAAI,EAAUC,EAAS,IAAII,EAAKL,CAAC,EAAGe,EAAIC,EAAI,EAAI,GAE/EX,EAAK,UAAYsC,EAAMC,EAAM5C,EAAE,EAE/BA,EAAI6B,EAAO7B,EAAE,KAAK,CAAC,EAAG,IAAIK,EAAK,CAAC,EAAE,MAAML,CAAC,EAAG2C,EAAM5B,EAAI,CAAC,EAEvDV,EAAK,UAAYU,EAAK,EACtBV,EAAK,SAAW,EAEhBL,EAAIA,EAAE,GAAG,EAETK,EAAK,UAAYU,EACjBV,EAAK,SAAWW,EAEThB,EAAE,MAAM,EAAG,IArBQ,IAAIK,EAAK,GAAG,CAsBxC,EAwBAN,EAAE,YAAcA,EAAE,KAAO,UAAY,CACnC,IAAI8C,EAAQzC,EACVW,EAAIC,EACJhB,EAAI,KACJK,EAAOL,EAAE,YAEX,OAAIA,EAAE,OAAO,EAAU,IAAIK,EAAKL,CAAC,GAEjCI,EAAIJ,EAAE,IAAI,EAAE,IAAI,CAAC,EACjBe,EAAKV,EAAK,UACVW,EAAKX,EAAK,SAEND,IAAM,GAGJA,IAAM,GACRyC,EAASH,GAAMrC,EAAMU,EAAK,EAAGC,CAAE,EAAE,MAAM,EAAG,EAC1C6B,EAAO,EAAI7C,EAAE,EACN6C,GAIF,IAAIxC,EAAK,GAAG,GAKrBA,EAAK,UAAYU,EAAK,EACtBV,EAAK,SAAW,EAEhBL,EAAIA,EAAE,IAAI,IAAIK,EAAK,CAAC,EAAE,MAAML,EAAE,MAAMA,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,EAE7DK,EAAK,UAAYU,EACjBV,EAAK,SAAWW,EAEThB,EAAE,MAAM,CAAC,GAClB,EAqBAD,EAAE,eAAiBA,EAAE,KAAO,UAAY,CACtC,IAAIQ,EAAGC,EAAGJ,EAAG,EAAG0C,EAAIrB,EAAGH,EAAGqB,EAAKI,EAC7B/C,EAAI,KACJK,EAAOL,EAAE,YACTe,EAAKV,EAAK,UACVW,EAAKX,EAAK,SAEZ,GAAKL,EAAE,SAAS,EAOT,IAAIA,EAAE,OAAO,EAClB,OAAO,IAAIK,EAAKL,CAAC,EACZ,GAAIA,EAAE,IAAI,EAAE,GAAG,CAAC,GAAKe,EAAK,GAAKjB,GACpC,OAAAwB,EAAIoB,GAAMrC,EAAMU,EAAK,EAAGC,CAAE,EAAE,MAAM,GAAI,EACtCM,EAAE,EAAItB,EAAE,EACDsB,MAZU,CACjB,GAAI,CAACtB,EAAE,EAAG,OAAO,IAAIK,EAAK,GAAG,EAC7B,GAAIU,EAAK,GAAKjB,GACZ,OAAAwB,EAAIoB,GAAMrC,EAAMU,EAAK,EAAGC,CAAE,EAAE,MAAM,EAAG,EACrCM,EAAE,EAAItB,EAAE,EACDsB,CAEX,CAmBA,IAXAjB,EAAK,UAAYsC,EAAM5B,EAAK,GAC5BV,EAAK,SAAW,EAQhBD,EAAI,KAAK,IAAI,GAAIuC,EAAMhD,EAAW,EAAI,CAAC,EAElCY,EAAIH,EAAGG,EAAG,EAAEA,EAAGP,EAAIA,EAAE,IAAIA,EAAE,MAAMA,CAAC,EAAE,KAAK,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,EAW/D,IATAlB,EAAW,GAEX0B,EAAI,KAAK,KAAKmC,EAAMhD,CAAQ,EAC5B,EAAI,EACJoD,EAAK/C,EAAE,MAAMA,CAAC,EACdsB,EAAI,IAAIjB,EAAKL,CAAC,EACd8C,EAAK9C,EAGEO,IAAM,IAOX,GANAuC,EAAKA,EAAG,MAAMC,CAAE,EAChBtB,EAAIH,EAAE,MAAMwB,EAAG,IAAI,GAAK,CAAC,CAAC,EAE1BA,EAAKA,EAAG,MAAMC,CAAE,EAChBzB,EAAIG,EAAE,KAAKqB,EAAG,IAAI,GAAK,CAAC,CAAC,EAErBxB,EAAE,EAAEd,CAAC,IAAM,OAAQ,IAAKD,EAAIC,EAAGc,EAAE,EAAEf,CAAC,IAAMkB,EAAE,EAAElB,CAAC,GAAKA,KAAK,CAG/D,OAAIH,IAAGkB,EAAIA,EAAE,MAAM,GAAMlB,EAAI,CAAE,GAE/BtB,EAAW,GAEJmB,EAASqB,EAAGjB,EAAK,UAAYU,EAAIV,EAAK,SAAWW,EAAI,EAAI,CAClE,EAOAjB,EAAE,SAAW,UAAY,CACvB,MAAO,CAAC,CAAC,KAAK,CAChB,EAOAA,EAAE,UAAYA,EAAE,MAAQ,UAAY,CAClC,MAAO,CAAC,CAAC,KAAK,GAAKX,GAAU,KAAK,EAAIO,CAAQ,EAAI,KAAK,EAAE,OAAS,CACpE,EAOAI,EAAE,MAAQ,UAAY,CACpB,MAAO,CAAC,KAAK,CACf,EAOAA,EAAE,WAAaA,EAAE,MAAQ,UAAY,CACnC,OAAO,KAAK,EAAI,CAClB,EAOAA,EAAE,WAAaA,EAAE,MAAQ,UAAY,CACnC,OAAO,KAAK,EAAI,CAClB,EAOAA,EAAE,OAAS,UAAY,CACrB,MAAO,CAAC,CAAC,KAAK,GAAK,KAAK,EAAE,CAAC,IAAM,CACnC,EAOAA,EAAE,SAAWA,EAAE,GAAK,SAAUO,EAAG,CAC/B,OAAO,KAAK,IAAIA,CAAC,EAAI,CACvB,EAOAP,EAAE,kBAAoBA,EAAE,IAAM,SAAUO,EAAG,CACzC,OAAO,KAAK,IAAIA,CAAC,EAAI,CACvB,EAiCAP,EAAE,UAAYA,EAAE,IAAM,SAAUiD,EAAM,CACpC,IAAIC,EAAUlB,EAAGmB,EAAa9C,EAAG+C,EAAKC,EAAK5B,EAAIF,EAC7C+B,EAAM,KACNhD,EAAOgD,EAAI,YACXtC,EAAKV,EAAK,UACVW,EAAKX,EAAK,SACViD,EAAQ,EAGV,GAAIN,GAAQ,KACVA,EAAO,IAAI3C,EAAK,EAAE,EAClB4C,EAAW,OACN,CAKL,GAJAD,EAAO,IAAI3C,EAAK2C,CAAI,EACpBjB,EAAIiB,EAAK,EAGLA,EAAK,EAAI,GAAK,CAACjB,GAAK,CAACA,EAAE,CAAC,GAAKiB,EAAK,GAAG,CAAC,EAAG,OAAO,IAAI3C,EAAK,GAAG,EAEhE4C,EAAWD,EAAK,GAAG,EAAE,CACvB,CAKA,GAHAjB,EAAIsB,EAAI,EAGJA,EAAI,EAAI,GAAK,CAACtB,GAAK,CAACA,EAAE,CAAC,GAAKsB,EAAI,GAAG,CAAC,EACtC,OAAO,IAAIhD,EAAK0B,GAAK,CAACA,EAAE,CAAC,EAAI,KAASsB,EAAI,GAAK,EAAI,IAAMtB,EAAI,EAAI,GAAK,EAKxE,GAAIkB,EACF,GAAIlB,EAAE,OAAS,EACboB,EAAM,OACD,CACL,IAAK/C,EAAI2B,EAAE,CAAC,EAAG3B,EAAI,KAAO,GAAIA,GAAK,GACnC+C,EAAM/C,IAAM,CACd,CAyBF,GAtBAtB,EAAW,GACX0C,EAAKT,EAAKuC,EACVF,EAAMG,GAAiBF,EAAK7B,CAAE,EAC9B0B,EAAcD,EAAWO,GAAQnD,EAAMmB,EAAK,EAAE,EAAI+B,GAAiBP,EAAMxB,CAAE,EAG3EF,EAAIO,EAAOuB,EAAKF,EAAa1B,EAAI,CAAC,EAgB9BiC,GAAoBnC,EAAE,EAAGlB,EAAIW,EAAIC,CAAE,EAErC,EAME,IALAQ,GAAM,GACN4B,EAAMG,GAAiBF,EAAK7B,CAAE,EAC9B0B,EAAcD,EAAWO,GAAQnD,EAAMmB,EAAK,EAAE,EAAI+B,GAAiBP,EAAMxB,CAAE,EAC3EF,EAAIO,EAAOuB,EAAKF,EAAa1B,EAAI,CAAC,EAE9B,CAAC2B,EAAK,CAGJ,CAACvB,GAAeN,EAAE,CAAC,EAAE,MAAMlB,EAAI,EAAGA,EAAI,EAAE,EAAI,GAAK,OACnDkB,EAAIrB,EAASqB,EAAGP,EAAK,EAAG,CAAC,GAG3B,KACF,OACO0C,GAAoBnC,EAAE,EAAGlB,GAAK,GAAIY,CAAE,GAG/C,OAAAlC,EAAW,GAEJmB,EAASqB,EAAGP,EAAIC,CAAE,CAC3B,EAgDAjB,EAAE,MAAQA,EAAE,IAAM,SAAUO,EAAG,CAC7B,IAAIyB,EAAGZ,EAAGZ,EAAGC,EAAGJ,EAAG4B,EAAKjB,EAAIC,EAAIL,EAAI+C,EAAIC,EAAM/C,EAC5CZ,EAAI,KACJK,EAAOL,EAAE,YAKX,GAHAM,EAAI,IAAID,EAAKC,CAAC,EAGV,CAACN,EAAE,GAAK,CAACM,EAAE,EAGb,MAAI,CAACN,EAAE,GAAK,CAACM,EAAE,EAAGA,EAAI,IAAID,EAAK,GAAG,EAGzBL,EAAE,EAAGM,EAAE,EAAI,CAACA,EAAE,EAKlBA,EAAI,IAAID,EAAKC,EAAE,GAAKN,EAAE,IAAMM,EAAE,EAAIN,EAAI,GAAG,EAEvCM,EAIT,GAAIN,EAAE,GAAKM,EAAE,EACX,OAAAA,EAAE,EAAI,CAACA,EAAE,EACFN,EAAE,KAAKM,CAAC,EASjB,GANAK,EAAKX,EAAE,EACPY,EAAKN,EAAE,EACPS,EAAKV,EAAK,UACVW,EAAKX,EAAK,SAGN,CAACM,EAAG,CAAC,GAAK,CAACC,EAAG,CAAC,EAAG,CAGpB,GAAIA,EAAG,CAAC,EAAGN,EAAE,EAAI,CAACA,EAAE,UAGXK,EAAG,CAAC,EAAGL,EAAI,IAAID,EAAKL,CAAC,MAIzB,QAAO,IAAIK,EAAKW,IAAO,EAAI,GAAK,CAAC,EAEtC,OAAOlC,EAAWmB,EAASK,EAAGS,EAAIC,CAAE,EAAIV,CAC1C,CAYA,GAPAa,EAAI/B,GAAUkB,EAAE,EAAIX,CAAQ,EAC5B+D,EAAKtE,GAAUY,EAAE,EAAIL,CAAQ,EAE7BgB,EAAKA,EAAG,MAAM,EACdP,EAAIsD,EAAKvC,EAGLf,EAAG,CAyBL,IAxBAuD,EAAOvD,EAAI,EAEPuD,GACF5B,EAAIpB,EACJP,EAAI,CAACA,EACL4B,EAAMpB,EAAG,SAETmB,EAAInB,EACJO,EAAIuC,EACJ1B,EAAMrB,EAAG,QAMXJ,EAAI,KAAK,IAAI,KAAK,KAAKQ,EAAKpB,CAAQ,EAAGqC,CAAG,EAAI,EAE1C5B,EAAIG,IACNH,EAAIG,EACJwB,EAAE,OAAS,GAIbA,EAAE,QAAQ,EACLxB,EAAIH,EAAGG,KAAMwB,EAAE,KAAK,CAAC,EAC1BA,EAAE,QAAQ,CAGZ,KAAO,CASL,IALAxB,EAAII,EAAG,OACPqB,EAAMpB,EAAG,OACT+C,EAAOpD,EAAIyB,EACP2B,IAAM3B,EAAMzB,GAEXA,EAAI,EAAGA,EAAIyB,EAAKzB,IACnB,GAAII,EAAGJ,CAAC,GAAKK,EAAGL,CAAC,EAAG,CAClBoD,EAAOhD,EAAGJ,CAAC,EAAIK,EAAGL,CAAC,EACnB,KACF,CAGFH,EAAI,CACN,CAaA,IAXIuD,IACF5B,EAAIpB,EACJA,EAAKC,EACLA,EAAKmB,EACLzB,EAAE,EAAI,CAACA,EAAE,GAGX0B,EAAMrB,EAAG,OAIJJ,EAAIK,EAAG,OAASoB,EAAKzB,EAAI,EAAG,EAAEA,EAAGI,EAAGqB,GAAK,EAAI,EAGlD,IAAKzB,EAAIK,EAAG,OAAQL,EAAIH,GAAI,CAE1B,GAAIO,EAAG,EAAEJ,CAAC,EAAIK,EAAGL,CAAC,EAAG,CACnB,IAAKC,EAAID,EAAGC,GAAKG,EAAG,EAAEH,CAAC,IAAM,GAAIG,EAAGH,CAAC,EAAId,GAAO,EAChD,EAAEiB,EAAGH,CAAC,EACNG,EAAGJ,CAAC,GAAKb,EACX,CAEAiB,EAAGJ,CAAC,GAAKK,EAAGL,CAAC,CACf,CAGA,KAAOI,EAAG,EAAEqB,CAAG,IAAM,GAAIrB,EAAG,IAAI,EAGhC,KAAOA,EAAG,CAAC,IAAM,EAAGA,EAAG,MAAM,EAAG,EAAEQ,EAGlC,OAAKR,EAAG,CAAC,GAETL,EAAE,EAAIK,EACNL,EAAE,EAAIsD,GAAkBjD,EAAIQ,CAAC,EAEtBrC,EAAWmB,EAASK,EAAGS,EAAIC,CAAE,EAAIV,GALrB,IAAID,EAAKW,IAAO,EAAI,GAAK,CAAC,CAM/C,EA2BAjB,EAAE,OAASA,EAAE,IAAM,SAAUO,EAAG,CAC9B,IAAIuD,EACF7D,EAAI,KACJK,EAAOL,EAAE,YAKX,OAHAM,EAAI,IAAID,EAAKC,CAAC,EAGV,CAACN,EAAE,GAAK,CAACM,EAAE,GAAKA,EAAE,GAAK,CAACA,EAAE,EAAE,CAAC,EAAU,IAAID,EAAK,GAAG,EAGnD,CAACC,EAAE,GAAKN,EAAE,GAAK,CAACA,EAAE,EAAE,CAAC,EAChBC,EAAS,IAAII,EAAKL,CAAC,EAAGK,EAAK,UAAWA,EAAK,QAAQ,GAI5DvB,EAAW,GAEPuB,EAAK,QAAU,GAIjBwD,EAAIhC,EAAO7B,EAAGM,EAAE,IAAI,EAAG,EAAG,EAAG,CAAC,EAC9BuD,EAAE,GAAKvD,EAAE,GAETuD,EAAIhC,EAAO7B,EAAGM,EAAG,EAAGD,EAAK,OAAQ,CAAC,EAGpCwD,EAAIA,EAAE,MAAMvD,CAAC,EAEbxB,EAAW,GAEJkB,EAAE,MAAM6D,CAAC,EAClB,EASA9D,EAAE,mBAAqBA,EAAE,IAAM,UAAY,CACzC,OAAO+D,GAAmB,IAAI,CAChC,EAQA/D,EAAE,iBAAmBA,EAAE,GAAK,UAAY,CACtC,OAAOwD,GAAiB,IAAI,CAC9B,EAQAxD,EAAE,QAAUA,EAAE,IAAM,UAAY,CAC9B,IAAIC,EAAI,IAAI,KAAK,YAAY,IAAI,EACjC,OAAAA,EAAE,EAAI,CAACA,EAAE,EACFC,EAASD,CAAC,CACnB,EAwBAD,EAAE,KAAOA,EAAE,IAAM,SAAUO,EAAG,CAC5B,IAAIyD,EAAOhC,EAAGZ,EAAG,EAAGf,EAAG4B,EAAKjB,EAAIC,EAAIL,EAAIC,EACtCZ,EAAI,KACJK,EAAOL,EAAE,YAKX,GAHAM,EAAI,IAAID,EAAKC,CAAC,EAGV,CAACN,EAAE,GAAK,CAACM,EAAE,EAGb,MAAI,CAACN,EAAE,GAAK,CAACM,EAAE,EAAGA,EAAI,IAAID,EAAK,GAAG,EAMxBL,EAAE,IAAGM,EAAI,IAAID,EAAKC,EAAE,GAAKN,EAAE,IAAMM,EAAE,EAAIN,EAAI,GAAG,GAEjDM,EAIT,GAAIN,EAAE,GAAKM,EAAE,EACX,OAAAA,EAAE,EAAI,CAACA,EAAE,EACFN,EAAE,MAAMM,CAAC,EASlB,GANAK,EAAKX,EAAE,EACPY,EAAKN,EAAE,EACPS,EAAKV,EAAK,UACVW,EAAKX,EAAK,SAGN,CAACM,EAAG,CAAC,GAAK,CAACC,EAAG,CAAC,EAIjB,OAAKA,EAAG,CAAC,IAAGN,EAAI,IAAID,EAAKL,CAAC,GAEnBlB,EAAWmB,EAASK,EAAGS,EAAIC,CAAE,EAAIV,EAa1C,GAPAF,EAAIhB,GAAUY,EAAE,EAAIL,CAAQ,EAC5BwB,EAAI/B,GAAUkB,EAAE,EAAIX,CAAQ,EAE5BgB,EAAKA,EAAG,MAAM,EACd,EAAIP,EAAIe,EAGJ,EAAG,CAuBL,IArBI,EAAI,GACNY,EAAIpB,EACJ,EAAI,CAAC,EACLqB,EAAMpB,EAAG,SAETmB,EAAInB,EACJO,EAAIf,EACJ4B,EAAMrB,EAAG,QAIXP,EAAI,KAAK,KAAKW,EAAKpB,CAAQ,EAC3BqC,EAAM5B,EAAI4B,EAAM5B,EAAI,EAAI4B,EAAM,EAE1B,EAAIA,IACN,EAAIA,EACJD,EAAE,OAAS,GAIbA,EAAE,QAAQ,EACH,KAAMA,EAAE,KAAK,CAAC,EACrBA,EAAE,QAAQ,CACZ,CAcA,IAZAC,EAAMrB,EAAG,OACT,EAAIC,EAAG,OAGHoB,EAAM,EAAI,IACZ,EAAIA,EACJD,EAAInB,EACJA,EAAKD,EACLA,EAAKoB,GAIFgC,EAAQ,EAAG,GACdA,GAASpD,EAAG,EAAE,CAAC,EAAIA,EAAG,CAAC,EAAIC,EAAG,CAAC,EAAImD,GAASrE,GAAO,EACnDiB,EAAG,CAAC,GAAKjB,GAUX,IAPIqE,IACFpD,EAAG,QAAQoD,CAAK,EAChB,EAAE5C,GAKCa,EAAMrB,EAAG,OAAQA,EAAG,EAAEqB,CAAG,GAAK,GAAIrB,EAAG,IAAI,EAE9C,OAAAL,EAAE,EAAIK,EACNL,EAAE,EAAIsD,GAAkBjD,EAAIQ,CAAC,EAEtBrC,EAAWmB,EAASK,EAAGS,EAAIC,CAAE,EAAIV,CAC1C,EASAP,EAAE,UAAYA,EAAE,GAAK,SAAUiE,EAAG,CAChC,IAAI5D,EACFJ,EAAI,KAEN,GAAIgE,IAAM,QAAUA,IAAM,CAAC,CAACA,GAAKA,IAAM,GAAKA,IAAM,EAAG,MAAM,MAAMhF,GAAkBgF,CAAC,EAEpF,OAAIhE,EAAE,GACJI,EAAI6D,GAAajE,EAAE,CAAC,EAChBgE,GAAKhE,EAAE,EAAI,EAAII,IAAGA,EAAIJ,EAAE,EAAI,IAEhCI,EAAI,IAGCA,CACT,EAQAL,EAAE,MAAQ,UAAY,CACpB,IAAIC,EAAI,KACNK,EAAOL,EAAE,YAEX,OAAOC,EAAS,IAAII,EAAKL,CAAC,EAAGA,EAAE,EAAI,EAAGK,EAAK,QAAQ,CACrD,EAkBAN,EAAE,KAAOA,EAAE,IAAM,UAAY,CAC3B,IAAIgB,EAAIC,EACNhB,EAAI,KACJK,EAAOL,EAAE,YAEX,OAAKA,EAAE,SAAS,EACZA,EAAE,OAAO,EAAU,IAAIK,EAAKL,CAAC,GAEjCe,EAAKV,EAAK,UACVW,EAAKX,EAAK,SACVA,EAAK,UAAYU,EAAK,KAAK,IAAIf,EAAE,EAAGA,EAAE,GAAG,CAAC,EAAIL,EAC9CU,EAAK,SAAW,EAEhBL,EAAIkE,GAAK7D,EAAMa,GAAiBb,EAAML,CAAC,CAAC,EAExCK,EAAK,UAAYU,EACjBV,EAAK,SAAWW,EAETf,EAASpB,GAAW,EAAImB,EAAE,IAAI,EAAIA,EAAGe,EAAIC,EAAI,EAAI,GAb9B,IAAIX,EAAK,GAAG,CAcxC,EAeAN,EAAE,WAAaA,EAAE,KAAO,UAAY,CAClC,IAAIqB,EAAGC,EAAGG,EAAIF,EAAGC,EAAKE,EACpBzB,EAAI,KACJ+B,EAAI/B,EAAE,EACNmB,EAAInB,EAAE,EACNmE,EAAInE,EAAE,EACNK,EAAOL,EAAE,YAGX,GAAImE,IAAM,GAAK,CAACpC,GAAK,CAACA,EAAE,CAAC,EACvB,OAAO,IAAI1B,EAAK,CAAC8D,GAAKA,EAAI,IAAM,CAACpC,GAAKA,EAAE,CAAC,GAAK,IAAMA,EAAI/B,EAAI,GAAK,EAgCnE,IA7BAlB,EAAW,GAGXqF,EAAI,KAAK,KAAK,CAACnE,CAAC,EAIZmE,GAAK,GAAKA,GAAK,KACjB9C,EAAIO,GAAeG,CAAC,GAEfV,EAAE,OAASF,GAAK,GAAK,IAAGE,GAAK,KAClC8C,EAAI,KAAK,KAAK9C,CAAC,EACfF,EAAI/B,IAAW+B,EAAI,GAAK,CAAC,GAAKA,EAAI,GAAKA,EAAI,GAEvCgD,GAAK,IACP9C,EAAI,KAAOF,GAEXE,EAAI8C,EAAE,cAAc,EACpB9C,EAAIA,EAAE,MAAM,EAAGA,EAAE,QAAQ,GAAG,EAAI,CAAC,EAAIF,GAGvCG,EAAI,IAAIjB,EAAKgB,CAAC,GAEdC,EAAI,IAAIjB,EAAK8D,EAAE,SAAS,CAAC,EAG3B3C,GAAML,EAAId,EAAK,WAAa,IAQ1B,GAJAoB,EAAIH,EACJA,EAAIG,EAAE,KAAKI,EAAO7B,EAAGyB,EAAGD,EAAK,EAAG,CAAC,CAAC,EAAE,MAAM,EAAG,EAGzCI,GAAeH,EAAE,CAAC,EAAE,MAAM,EAAGD,CAAE,KAAOH,EAAIO,GAAeN,EAAE,CAAC,GAAG,MAAM,EAAGE,CAAE,EAK5E,GAJAH,EAAIA,EAAE,MAAMG,EAAK,EAAGA,EAAK,CAAC,EAItBH,GAAK,QAAU,CAACE,GAAOF,GAAK,OAAQ,CAItC,GAAI,CAACE,IACHtB,EAASwB,EAAGN,EAAI,EAAG,CAAC,EAEhBM,EAAE,MAAMA,CAAC,EAAE,GAAGzB,CAAC,GAAG,CACpBsB,EAAIG,EACJ,KACF,CAGFD,GAAM,EACND,EAAM,CACR,KAAO,EAID,CAAC,CAACF,GAAK,CAAC,CAACA,EAAE,MAAM,CAAC,GAAKA,EAAE,OAAO,CAAC,GAAK,OAGxCpB,EAASqB,EAAGH,EAAI,EAAG,CAAC,EACpBC,EAAI,CAACE,EAAE,MAAMA,CAAC,EAAE,GAAGtB,CAAC,GAGtB,KACF,CAIJ,OAAAlB,EAAW,GAEJmB,EAASqB,EAAGH,EAAGd,EAAK,SAAUe,CAAC,CACxC,EAgBArB,EAAE,QAAUA,EAAE,IAAM,UAAY,CAC9B,IAAIgB,EAAIC,EACNhB,EAAI,KACJK,EAAOL,EAAE,YAEX,OAAKA,EAAE,SAAS,EACZA,EAAE,OAAO,EAAU,IAAIK,EAAKL,CAAC,GAEjCe,EAAKV,EAAK,UACVW,EAAKX,EAAK,SACVA,EAAK,UAAYU,EAAK,GACtBV,EAAK,SAAW,EAEhBL,EAAIA,EAAE,IAAI,EACVA,EAAE,EAAI,EACNA,EAAI6B,EAAO7B,EAAG,IAAIK,EAAK,CAAC,EAAE,MAAML,EAAE,MAAMA,CAAC,CAAC,EAAE,KAAK,EAAGe,EAAK,GAAI,CAAC,EAE9DV,EAAK,UAAYU,EACjBV,EAAK,SAAWW,EAETf,EAASpB,IAAY,GAAKA,IAAY,EAAImB,EAAE,IAAI,EAAIA,EAAGe,EAAIC,EAAI,EAAI,GAfhD,IAAIX,EAAK,GAAG,CAgBxC,EAwBAN,EAAE,MAAQA,EAAE,IAAM,SAAUO,EAAG,CAC7B,IAAIyD,EAAO5C,EAAGZ,EAAGH,EAAGkB,EAAG8C,EAAI3C,EAAGhB,EAAKC,EACjCV,EAAI,KACJK,EAAOL,EAAE,YACTW,EAAKX,EAAE,EACPY,GAAMN,EAAI,IAAID,EAAKC,CAAC,GAAG,EAKzB,GAHAA,EAAE,GAAKN,EAAE,EAGL,CAACW,GAAM,CAACA,EAAG,CAAC,GAAK,CAACC,GAAM,CAACA,EAAG,CAAC,EAE/B,OAAO,IAAIP,EAAK,CAACC,EAAE,GAAKK,GAAM,CAACA,EAAG,CAAC,GAAK,CAACC,GAAMA,GAAM,CAACA,EAAG,CAAC,GAAK,CAACD,EAI5D,IAIA,CAACA,GAAM,CAACC,EAAKN,EAAE,EAAI,EAAIA,EAAE,EAAI,CAAC,EAoBpC,IAjBAa,EAAI/B,GAAUY,EAAE,EAAIL,CAAQ,EAAIP,GAAUkB,EAAE,EAAIX,CAAQ,EACxDc,EAAME,EAAG,OACTD,EAAME,EAAG,OAGLH,EAAMC,IACRY,EAAIX,EACJA,EAAKC,EACLA,EAAKU,EACL8C,EAAK3D,EACLA,EAAMC,EACNA,EAAM0D,GAIR9C,EAAI,CAAC,EACL8C,EAAK3D,EAAMC,EACNH,EAAI6D,EAAI7D,KAAMe,EAAE,KAAK,CAAC,EAG3B,IAAKf,EAAIG,EAAK,EAAEH,GAAK,GAAI,CAEvB,IADAwD,EAAQ,EACH3D,EAAIK,EAAMF,EAAGH,EAAIG,GACpBkB,EAAIH,EAAElB,CAAC,EAAIQ,EAAGL,CAAC,EAAII,EAAGP,EAAIG,EAAI,CAAC,EAAIwD,EACnCzC,EAAElB,GAAG,EAAIqB,EAAI/B,GAAO,EACpBqE,EAAQtC,EAAI/B,GAAO,EAGrB4B,EAAElB,CAAC,GAAKkB,EAAElB,CAAC,EAAI2D,GAASrE,GAAO,CACjC,CAGA,KAAO,CAAC4B,EAAE,EAAE8C,CAAE,GAAI9C,EAAE,IAAI,EAExB,OAAIyC,EAAO,EAAE5C,EACRG,EAAE,MAAM,EAEbhB,EAAE,EAAIgB,EACNhB,EAAE,EAAIsD,GAAkBtC,EAAGH,CAAC,EAErBrC,EAAWmB,EAASK,EAAGD,EAAK,UAAWA,EAAK,QAAQ,EAAIC,CACjE,EAaAP,EAAE,SAAW,SAAUyB,EAAIR,EAAI,CAC7B,OAAOqD,GAAe,KAAM,EAAG7C,EAAIR,CAAE,CACvC,EAaAjB,EAAE,gBAAkBA,EAAE,KAAO,SAAUuE,EAAItD,EAAI,CAC7C,IAAIhB,EAAI,KACNK,EAAOL,EAAE,YAGX,OADAA,EAAI,IAAIK,EAAKL,CAAC,EACVsE,IAAO,OAAetE,GAE1BuE,GAAWD,EAAI,EAAG/F,EAAU,EAExByC,IAAO,OAAQA,EAAKX,EAAK,SACxBkE,GAAWvD,EAAI,EAAG,CAAC,EAEjBf,EAASD,EAAGsE,EAAKtE,EAAE,EAAI,EAAGgB,CAAE,EACrC,EAWAjB,EAAE,cAAgB,SAAUuE,EAAItD,EAAI,CAClC,IAAIwD,EACFxE,EAAI,KACJK,EAAOL,EAAE,YAEX,OAAIsE,IAAO,OACTE,EAAMC,GAAezE,EAAG,EAAI,GAE5BuE,GAAWD,EAAI,EAAG/F,EAAU,EAExByC,IAAO,OAAQA,EAAKX,EAAK,SACxBkE,GAAWvD,EAAI,EAAG,CAAC,EAExBhB,EAAIC,EAAS,IAAII,EAAKL,CAAC,EAAGsE,EAAK,EAAGtD,CAAE,EACpCwD,EAAMC,GAAezE,EAAG,GAAMsE,EAAK,CAAC,GAG/BtE,EAAE,MAAM,GAAK,CAACA,EAAE,OAAO,EAAI,IAAMwE,EAAMA,CAChD,EAmBAzE,EAAE,QAAU,SAAUuE,EAAItD,EAAI,CAC5B,IAAIwD,EAAKlE,EACPN,EAAI,KACJK,EAAOL,EAAE,YAEX,OAAIsE,IAAO,OACTE,EAAMC,GAAezE,CAAC,GAEtBuE,GAAWD,EAAI,EAAG/F,EAAU,EAExByC,IAAO,OAAQA,EAAKX,EAAK,SACxBkE,GAAWvD,EAAI,EAAG,CAAC,EAExBV,EAAIL,EAAS,IAAII,EAAKL,CAAC,EAAGsE,EAAKtE,EAAE,EAAI,EAAGgB,CAAE,EAC1CwD,EAAMC,GAAenE,EAAG,GAAOgE,EAAKhE,EAAE,EAAI,CAAC,GAKtCN,EAAE,MAAM,GAAK,CAACA,EAAE,OAAO,EAAI,IAAMwE,EAAMA,CAChD,EAcAzE,EAAE,WAAa,SAAU2E,EAAM,CAC7B,IAAI3C,EAAG4C,EAAIC,EAAIC,EAAI1D,EAAGf,EAAGiB,EAAGyD,EAAIC,EAAIhE,EAAI8C,EAAGvC,EACzCtB,EAAI,KACJW,EAAKX,EAAE,EACPK,EAAOL,EAAE,YAEX,GAAI,CAACW,EAAI,OAAO,IAAIN,EAAKL,CAAC,EAU1B,GARA+E,EAAKJ,EAAK,IAAItE,EAAK,CAAC,EACpBuE,EAAKE,EAAK,IAAIzE,EAAK,CAAC,EAEpB0B,EAAI,IAAI1B,EAAKuE,CAAE,EACfzD,EAAIY,EAAE,EAAIkC,GAAatD,CAAE,EAAIX,EAAE,EAAI,EACnCI,EAAIe,EAAIxB,EACRoC,EAAE,EAAE,CAAC,EAAI1C,GAAQ,GAAIe,EAAI,EAAIT,EAAWS,EAAIA,CAAC,EAEzCsE,GAAQ,KAGVA,EAAOvD,EAAI,EAAIY,EAAIgD,MACd,CAEL,GADA1D,EAAI,IAAIhB,EAAKqE,CAAI,EACb,CAACrD,EAAE,MAAM,GAAKA,EAAE,GAAG0D,CAAE,EAAG,MAAM,MAAM/F,GAAkBqC,CAAC,EAC3DqD,EAAOrD,EAAE,GAAGU,CAAC,EAAKZ,EAAI,EAAIY,EAAIgD,EAAM1D,CACtC,CAOA,IALAvC,EAAW,GACXuC,EAAI,IAAIhB,EAAKuB,GAAejB,CAAE,CAAC,EAC/BI,EAAKV,EAAK,UACVA,EAAK,UAAYc,EAAIR,EAAG,OAAShB,EAAW,EAG1CkE,EAAIhC,EAAOR,EAAGU,EAAG,EAAG,EAAG,CAAC,EACxB8C,EAAKF,EAAG,KAAKd,EAAE,MAAMe,CAAE,CAAC,EACpBC,EAAG,IAAIH,CAAI,GAAK,GACpBC,EAAKC,EACLA,EAAKC,EACLA,EAAKE,EACLA,EAAKD,EAAG,KAAKjB,EAAE,MAAMgB,CAAE,CAAC,EACxBC,EAAKD,EACLA,EAAK9C,EACLA,EAAIV,EAAE,MAAMwC,EAAE,MAAMgB,CAAE,CAAC,EACvBxD,EAAIwD,EAGN,OAAAA,EAAKhD,EAAO6C,EAAK,MAAMC,CAAE,EAAGC,EAAI,EAAG,EAAG,CAAC,EACvCE,EAAKA,EAAG,KAAKD,EAAG,MAAME,CAAE,CAAC,EACzBJ,EAAKA,EAAG,KAAKE,EAAG,MAAMD,CAAE,CAAC,EACzBE,EAAG,EAAIC,EAAG,EAAI/E,EAAE,EAGhBsB,EAAIO,EAAOkD,EAAIH,EAAIzD,EAAG,CAAC,EAAE,MAAMnB,CAAC,EAAE,IAAI,EAAE,IAAI6B,EAAOiD,EAAIH,EAAIxD,EAAG,CAAC,EAAE,MAAMnB,CAAC,EAAE,IAAI,CAAC,EAAI,EAC7E,CAAC+E,EAAIH,CAAE,EAAI,CAACE,EAAIH,CAAE,EAExBtE,EAAK,UAAYU,EACjBjC,EAAW,GAEJwC,CACT,EAaAvB,EAAE,cAAgBA,EAAE,MAAQ,SAAUyB,EAAIR,EAAI,CAC5C,OAAOqD,GAAe,KAAM,GAAI7C,EAAIR,CAAE,CACxC,EAmBAjB,EAAE,UAAY,SAAUO,EAAGU,EAAI,CAC7B,IAAIhB,EAAI,KACNK,EAAOL,EAAE,YAIX,GAFAA,EAAI,IAAIK,EAAKL,CAAC,EAEVM,GAAK,KAAM,CAGb,GAAI,CAACN,EAAE,EAAG,OAAOA,EAEjBM,EAAI,IAAID,EAAK,CAAC,EACdW,EAAKX,EAAK,QACZ,KAAO,CASL,GARAC,EAAI,IAAID,EAAKC,CAAC,EACVU,IAAO,OACTA,EAAKX,EAAK,SAEVkE,GAAWvD,EAAI,EAAG,CAAC,EAIjB,CAAChB,EAAE,EAAG,OAAOM,EAAE,EAAIN,EAAIM,EAG3B,GAAI,CAACA,EAAE,EACL,OAAIA,EAAE,IAAGA,EAAE,EAAIN,EAAE,GACVM,CAEX,CAGA,OAAIA,EAAE,EAAE,CAAC,GACPxB,EAAW,GACXkB,EAAI6B,EAAO7B,EAAGM,EAAG,EAAGU,EAAI,CAAC,EAAE,MAAMV,CAAC,EAClCxB,EAAW,GACXmB,EAASD,CAAC,IAIVM,EAAE,EAAIN,EAAE,EACRA,EAAIM,GAGCN,CACT,EAQAD,EAAE,SAAW,UAAY,CACvB,MAAO,CAAC,IACV,EAaAA,EAAE,QAAU,SAAUyB,EAAIR,EAAI,CAC5B,OAAOqD,GAAe,KAAM,EAAG7C,EAAIR,CAAE,CACvC,EA8CAjB,EAAE,QAAUA,EAAE,IAAM,SAAUO,EAAG,CAC/B,IAAI,EAAGF,EAAGW,EAAIO,EAAGN,EAAImD,EACnBnE,EAAI,KACJK,EAAOL,EAAE,YACTgF,EAAK,EAAE1E,EAAI,IAAID,EAAKC,CAAC,GAGvB,GAAI,CAACN,EAAE,GAAK,CAACM,EAAE,GAAK,CAACN,EAAE,EAAE,CAAC,GAAK,CAACM,EAAE,EAAE,CAAC,EAAG,OAAO,IAAID,EAAKhB,GAAQ,CAACW,EAAGgF,CAAE,CAAC,EAIvE,GAFAhF,EAAI,IAAIK,EAAKL,CAAC,EAEVA,EAAE,GAAG,CAAC,EAAG,OAAOA,EAKpB,GAHAe,EAAKV,EAAK,UACVW,EAAKX,EAAK,SAENC,EAAE,GAAG,CAAC,EAAG,OAAOL,EAASD,EAAGe,EAAIC,CAAE,EAMtC,GAHA,EAAI5B,GAAUkB,EAAE,EAAIX,CAAQ,EAGxB,GAAKW,EAAE,EAAE,OAAS,IAAMF,EAAI4E,EAAK,EAAI,CAACA,EAAKA,IAAOpF,GACpD,OAAA0B,EAAI2D,GAAO5E,EAAML,EAAGI,EAAGW,CAAE,EAClBT,EAAE,EAAI,EAAI,IAAID,EAAK,CAAC,EAAE,IAAIiB,CAAC,EAAIrB,EAASqB,EAAGP,EAAIC,CAAE,EAM1D,GAHAmD,EAAInE,EAAE,EAGFmE,EAAI,EAAG,CAGT,GAAI,EAAI7D,EAAE,EAAE,OAAS,EAAG,OAAO,IAAID,EAAK,GAAG,EAM3C,IAHKC,EAAE,EAAE,CAAC,EAAI,IAAM,IAAG6D,EAAI,GAGvBnE,EAAE,GAAK,GAAKA,EAAE,EAAE,CAAC,GAAK,GAAKA,EAAE,EAAE,QAAU,EAC3C,OAAAA,EAAE,EAAImE,EACCnE,CAEX,CAcA,OARAI,EAAIf,GAAQ,CAACW,EAAGgF,CAAE,EAClB,EAAI5E,GAAK,GAAK,CAAC,SAASA,CAAC,EACrBhB,GAAU4F,GAAM,KAAK,IAAI,KAAOpD,GAAe5B,EAAE,CAAC,CAAC,EAAI,KAAK,KAAOA,EAAE,EAAI,EAAE,EAC3E,IAAIK,EAAKD,EAAI,EAAE,EAAE,EAKjB,EAAIC,EAAK,KAAO,GAAK,EAAIA,EAAK,KAAO,EAAU,IAAIA,EAAK,EAAI,EAAI8D,EAAI,EAAI,CAAC,GAE7ErF,EAAW,GACXuB,EAAK,SAAWL,EAAE,EAAI,EAMtBI,EAAI,KAAK,IAAI,IAAK,EAAI,IAAI,MAAM,EAGhCkB,EAAIwC,GAAmBxD,EAAE,MAAMiD,GAAiBvD,EAAGe,EAAKX,CAAC,CAAC,EAAGW,CAAE,EAG3DO,EAAE,IAGJA,EAAIrB,EAASqB,EAAGP,EAAK,EAAG,CAAC,EAIrB0C,GAAoBnC,EAAE,EAAGP,EAAIC,CAAE,IACjC,EAAID,EAAK,GAGTO,EAAIrB,EAAS6D,GAAmBxD,EAAE,MAAMiD,GAAiBvD,EAAG,EAAII,CAAC,CAAC,EAAG,CAAC,EAAG,EAAI,EAAG,CAAC,EAG7E,CAACwB,GAAeN,EAAE,CAAC,EAAE,MAAMP,EAAK,EAAGA,EAAK,EAAE,EAAI,GAAK,OACrDO,EAAIrB,EAASqB,EAAGP,EAAK,EAAG,CAAC,KAK/BO,EAAE,EAAI6C,EACNrF,EAAW,GACXuB,EAAK,SAAWW,EAETf,EAASqB,EAAGP,EAAIC,CAAE,EAC3B,EAcAjB,EAAE,YAAc,SAAUyB,EAAIR,EAAI,CAChC,IAAIwD,EACFxE,EAAI,KACJK,EAAOL,EAAE,YAEX,OAAIwB,IAAO,OACTgD,EAAMC,GAAezE,EAAGA,EAAE,GAAKK,EAAK,UAAYL,EAAE,GAAKK,EAAK,QAAQ,GAEpEkE,GAAW/C,EAAI,EAAGjD,EAAU,EAExByC,IAAO,OAAQA,EAAKX,EAAK,SACxBkE,GAAWvD,EAAI,EAAG,CAAC,EAExBhB,EAAIC,EAAS,IAAII,EAAKL,CAAC,EAAGwB,EAAIR,CAAE,EAChCwD,EAAMC,GAAezE,EAAGwB,GAAMxB,EAAE,GAAKA,EAAE,GAAKK,EAAK,SAAUmB,CAAE,GAGxDxB,EAAE,MAAM,GAAK,CAACA,EAAE,OAAO,EAAI,IAAMwE,EAAMA,CAChD,EAiBAzE,EAAE,oBAAsBA,EAAE,KAAO,SAAUyB,EAAIR,EAAI,CACjD,IAAIhB,EAAI,KACNK,EAAOL,EAAE,YAEX,OAAIwB,IAAO,QACTA,EAAKnB,EAAK,UACVW,EAAKX,EAAK,WAEVkE,GAAW/C,EAAI,EAAGjD,EAAU,EAExByC,IAAO,OAAQA,EAAKX,EAAK,SACxBkE,GAAWvD,EAAI,EAAG,CAAC,GAGnBf,EAAS,IAAII,EAAKL,CAAC,EAAGwB,EAAIR,CAAE,CACrC,EAUAjB,EAAE,SAAW,UAAY,CACvB,IAAIC,EAAI,KACNK,EAAOL,EAAE,YACTwE,EAAMC,GAAezE,EAAGA,EAAE,GAAKK,EAAK,UAAYL,EAAE,GAAKK,EAAK,QAAQ,EAEtE,OAAOL,EAAE,MAAM,GAAK,CAACA,EAAE,OAAO,EAAI,IAAMwE,EAAMA,CAChD,EAOAzE,EAAE,UAAYA,EAAE,MAAQ,UAAY,CAClC,OAAOE,EAAS,IAAI,KAAK,YAAY,IAAI,EAAG,KAAK,EAAI,EAAG,CAAC,CAC3D,EAQAF,EAAE,QAAUA,EAAE,OAAS,UAAY,CACjC,IAAIC,EAAI,KACNK,EAAOL,EAAE,YACTwE,EAAMC,GAAezE,EAAGA,EAAE,GAAKK,EAAK,UAAYL,EAAE,GAAKK,EAAK,QAAQ,EAEtE,OAAOL,EAAE,MAAM,EAAI,IAAMwE,EAAMA,CACjC,EAoDA,SAAS5C,GAAeG,EAAG,CACzB,IAAIxB,EAAGH,EAAG8E,EACRC,EAAkBpD,EAAE,OAAS,EAC7ByC,EAAM,GACN1C,EAAIC,EAAE,CAAC,EAET,GAAIoD,EAAkB,EAAG,CAEvB,IADAX,GAAO1C,EACFvB,EAAI,EAAGA,EAAI4E,EAAiB5E,IAC/B2E,EAAKnD,EAAExB,CAAC,EAAI,GACZH,EAAIT,EAAWuF,EAAG,OACd9E,IAAGoE,GAAOY,GAAchF,CAAC,GAC7BoE,GAAOU,EAGTpD,EAAIC,EAAExB,CAAC,EACP2E,EAAKpD,EAAI,GACT1B,EAAIT,EAAWuF,EAAG,OACd9E,IAAGoE,GAAOY,GAAchF,CAAC,EAC/B,SAAW0B,IAAM,EACf,MAAO,IAIT,KAAOA,EAAI,KAAO,GAAIA,GAAK,GAE3B,OAAO0C,EAAM1C,CACf,CAGA,SAASyC,GAAWhE,EAAGL,EAAKC,EAAK,CAC/B,GAAII,IAAM,CAAC,CAACA,GAAKA,EAAIL,GAAOK,EAAIJ,EAC9B,MAAM,MAAMnB,GAAkBuB,CAAC,CAEnC,CAQA,SAASkD,GAAoB1B,EAAGxB,EAAGS,EAAIqE,EAAW,CAChD,IAAIC,EAAIlF,EAAGkB,EAAGiE,EAGd,IAAKnF,EAAI2B,EAAE,CAAC,EAAG3B,GAAK,GAAIA,GAAK,GAAI,EAAEG,EAGnC,MAAI,EAAEA,EAAI,GACRA,GAAKZ,EACL2F,EAAK,IAELA,EAAK,KAAK,MAAM/E,EAAI,GAAKZ,CAAQ,EACjCY,GAAKZ,GAMPS,EAAIf,GAAQ,GAAIM,EAAWY,CAAC,EAC5BgF,EAAKxD,EAAEuD,CAAE,EAAIlF,EAAI,EAEbiF,GAAa,KACX9E,EAAI,GACFA,GAAK,EAAGgF,EAAKA,EAAK,IAAM,EACnBhF,GAAK,IAAGgF,EAAKA,EAAK,GAAK,GAChCjE,EAAIN,EAAK,GAAKuE,GAAM,OAASvE,EAAK,GAAKuE,GAAM,OAASA,GAAM,KAASA,GAAM,GAE3EjE,GAAKN,EAAK,GAAKuE,EAAK,GAAKnF,GAAKY,EAAK,GAAKuE,EAAK,GAAKnF,EAAI,KACnD2B,EAAEuD,EAAK,CAAC,EAAIlF,EAAI,IAAM,IAAMf,GAAQ,GAAIkB,EAAI,CAAC,EAAI,IAC/CgF,GAAMnF,EAAI,GAAKmF,GAAM,KAAOxD,EAAEuD,EAAK,CAAC,EAAIlF,EAAI,IAAM,IAAM,EAG3DG,EAAI,GACFA,GAAK,EAAGgF,EAAKA,EAAK,IAAO,EACpBhF,GAAK,EAAGgF,EAAKA,EAAK,IAAM,EACxBhF,GAAK,IAAGgF,EAAKA,EAAK,GAAK,GAChCjE,GAAK+D,GAAarE,EAAK,IAAMuE,GAAM,MAAQ,CAACF,GAAarE,EAAK,GAAKuE,GAAM,MAEzEjE,IAAM+D,GAAarE,EAAK,IAAMuE,EAAK,GAAKnF,GACvC,CAACiF,GAAarE,EAAK,GAAMuE,EAAK,GAAKnF,EAAI,KACrC2B,EAAEuD,EAAK,CAAC,EAAIlF,EAAI,IAAO,IAAMf,GAAQ,GAAIkB,EAAI,CAAC,EAAI,EAIlDe,CACT,CAMA,SAASkE,GAAYhB,EAAKiB,EAAQC,EAAS,CAOzC,QANIlF,EACFmF,EAAM,CAAC,CAAC,EACRC,EACArF,EAAI,EACJsF,EAAOrB,EAAI,OAENjE,EAAIsF,GAAO,CAChB,IAAKD,EAAOD,EAAI,OAAQC,KAASD,EAAIC,CAAI,GAAKH,EAE9C,IADAE,EAAI,CAAC,GAAKnH,GAAS,QAAQgG,EAAI,OAAOjE,GAAG,CAAC,EACrCC,EAAI,EAAGA,EAAImF,EAAI,OAAQnF,IACtBmF,EAAInF,CAAC,EAAIkF,EAAU,IACjBC,EAAInF,EAAI,CAAC,IAAM,SAAQmF,EAAInF,EAAI,CAAC,EAAI,GACxCmF,EAAInF,EAAI,CAAC,GAAKmF,EAAInF,CAAC,EAAIkF,EAAU,EACjCC,EAAInF,CAAC,GAAKkF,EAGhB,CAEA,OAAOC,EAAI,QAAQ,CACrB,CAQA,SAAS1E,GAAOZ,EAAML,EAAG,CACvB,IAAII,EAAG4B,EAAK1B,EAEZ,GAAIN,EAAE,OAAO,EAAG,OAAOA,EAMvBgC,EAAMhC,EAAE,EAAE,OACNgC,EAAM,IACR5B,EAAI,KAAK,KAAK4B,EAAM,CAAC,EACrB1B,GAAK,EAAI4B,GAAQ,EAAG9B,CAAC,GAAG,SAAS,IAEjCA,EAAI,GACJE,EAAI,gCAGND,EAAK,WAAaD,EAElBJ,EAAImC,GAAa9B,EAAM,EAAGL,EAAE,MAAMM,CAAC,EAAG,IAAID,EAAK,CAAC,CAAC,EAGjD,QAASE,EAAIH,EAAGG,KAAM,CACpB,IAAIuF,EAAQ9F,EAAE,MAAMA,CAAC,EACrBA,EAAI8F,EAAM,MAAMA,CAAK,EAAE,MAAMA,CAAK,EAAE,MAAM,CAAC,EAAE,KAAK,CAAC,CACrD,CAEA,OAAAzF,EAAK,WAAaD,EAEXJ,CACT,CAMA,IAAI6B,EAAU,UAAY,CAGxB,SAASkE,EAAgB/F,EAAGI,EAAG4C,EAAM,CACnC,IAAIgD,EACFjC,EAAQ,EACRxD,EAAIP,EAAE,OAER,IAAKA,EAAIA,EAAE,MAAM,EAAGO,KAClByF,EAAOhG,EAAEO,CAAC,EAAIH,EAAI2D,EAClB/D,EAAEO,CAAC,EAAIyF,EAAOhD,EAAO,EACrBe,EAAQiC,EAAOhD,EAAO,EAGxB,OAAIe,GAAO/D,EAAE,QAAQ+D,CAAK,EAEnB/D,CACT,CAEA,SAASiG,EAAQC,EAAGC,EAAGC,EAAIC,EAAI,CAC7B,IAAI9F,EAAGe,EAEP,GAAI8E,GAAMC,EACR/E,EAAI8E,EAAKC,EAAK,EAAI,OAElB,KAAK9F,EAAIe,EAAI,EAAGf,EAAI6F,EAAI7F,IACtB,GAAI2F,EAAE3F,CAAC,GAAK4F,EAAE5F,CAAC,EAAG,CAChBe,EAAI4E,EAAE3F,CAAC,EAAI4F,EAAE5F,CAAC,EAAI,EAAI,GACtB,KACF,CAIJ,OAAOe,CACT,CAEA,SAASgF,EAASJ,EAAGC,EAAGC,EAAIpD,EAAM,CAIhC,QAHIzC,EAAI,EAGD6F,KACLF,EAAEE,CAAE,GAAK7F,EACTA,EAAI2F,EAAEE,CAAE,EAAID,EAAEC,CAAE,EAAI,EAAI,EACxBF,EAAEE,CAAE,EAAI7F,EAAIyC,EAAOkD,EAAEE,CAAE,EAAID,EAAEC,CAAE,EAIjC,KAAO,CAACF,EAAE,CAAC,GAAKA,EAAE,OAAS,GAAIA,EAAE,MAAM,CACzC,CAEA,OAAO,SAAUlG,EAAGM,EAAGS,EAAIC,EAAIsD,EAAItB,EAAM,CACvC,IAAIuD,EAAKpF,EAAGZ,EAAGH,EAAGoG,EAASC,EAAMC,EAAMC,GAAO9C,EAAG+C,GAAIC,EAAKC,EAAMC,GAAMvF,EAAIC,GAAGuF,GAAIC,GAAIC,GACnFC,EAAIC,GACJ/G,EAAOL,EAAE,YACTqH,EAAOrH,EAAE,GAAKM,EAAE,EAAI,EAAI,GACxBK,EAAKX,EAAE,EACPY,EAAKN,EAAE,EAGT,GAAI,CAACK,GAAM,CAACA,EAAG,CAAC,GAAK,CAACC,GAAM,CAACA,EAAG,CAAC,EAE/B,OAAO,IAAIP,EACT,CAACL,EAAE,GAAK,CAACM,EAAE,IAAMK,EAAKC,GAAMD,EAAG,CAAC,GAAKC,EAAG,CAAC,EAAI,CAACA,GAAM,IAGpDD,GAAMA,EAAG,CAAC,GAAK,GAAK,CAACC,EAAKyG,EAAO,EAAIA,EAAO,CAAC,EAmBjD,IAhBIrE,GACFwD,EAAU,EACVrF,EAAInB,EAAE,EAAIM,EAAE,IAEZ0C,EAAOtD,GACP8G,EAAU7G,EACVwB,EAAI/B,GAAUY,EAAE,EAAIwG,CAAO,EAAIpH,GAAUkB,EAAE,EAAIkG,CAAO,GAGxDW,EAAKvG,EAAG,OACRqG,GAAKtG,EAAG,OACRkD,EAAI,IAAIxD,EAAKgH,CAAI,EACjBT,GAAK/C,EAAE,EAAI,CAAC,EAIPtD,EAAI,EAAGK,EAAGL,CAAC,IAAMI,EAAGJ,CAAC,GAAK,GAAIA,IAAI,CAavC,GAXIK,EAAGL,CAAC,GAAKI,EAAGJ,CAAC,GAAK,IAAIY,IAEtBJ,GAAM,MACRS,EAAKT,EAAKV,EAAK,UACfW,EAAKX,EAAK,UACDiE,EACT9C,EAAKT,GAAMf,EAAE,EAAIM,EAAE,GAAK,EAExBkB,EAAKT,EAGHS,EAAK,EACPoF,GAAG,KAAK,CAAC,EACTH,EAAO,OACF,CAOL,GAJAjF,EAAKA,EAAKgF,EAAU,EAAI,EACxBjG,EAAI,EAGA4G,GAAM,EAAG,CAMX,IALA/G,EAAI,EACJQ,EAAKA,EAAG,CAAC,EACTY,KAGQjB,EAAI0G,IAAM7G,IAAMoB,IAAMjB,IAC5BkB,GAAIrB,EAAI4C,GAAQrC,EAAGJ,CAAC,GAAK,GACzBqG,GAAGrG,CAAC,EAAIkB,GAAIb,EAAK,EACjBR,EAAIqB,GAAIb,EAAK,EAGf6F,EAAOrG,GAAKG,EAAI0G,EAGlB,KAAO,CAiBL,IAdA7G,EAAI4C,GAAQpC,EAAG,CAAC,EAAI,GAAK,EAErBR,EAAI,IACNQ,EAAKmF,EAAgBnF,EAAIR,EAAG4C,CAAI,EAChCrC,EAAKoF,EAAgBpF,EAAIP,EAAG4C,CAAI,EAChCmE,EAAKvG,EAAG,OACRqG,GAAKtG,EAAG,QAGVqG,GAAKG,EACLN,EAAMlG,EAAG,MAAM,EAAGwG,CAAE,EACpBL,EAAOD,EAAI,OAGJC,EAAOK,GAAKN,EAAIC,GAAM,EAAI,EAEjCM,GAAKxG,EAAG,MAAM,EACdwG,GAAG,QAAQ,CAAC,EACZF,GAAMtG,EAAG,CAAC,EAENA,EAAG,CAAC,GAAKoC,EAAO,GAAG,EAAEkE,GAEzB,GACE9G,EAAI,EAGJmG,EAAMN,EAAQrF,EAAIiG,EAAKM,EAAIL,CAAI,EAG3BP,EAAM,GAGRQ,GAAOF,EAAI,CAAC,EACRM,GAAML,IAAMC,GAAOA,GAAO/D,GAAQ6D,EAAI,CAAC,GAAK,IAGhDzG,EAAI2G,GAAOG,GAAM,EAUb9G,EAAI,GACFA,GAAK4C,IAAM5C,EAAI4C,EAAO,GAG1B0D,EAAOX,EAAgBnF,EAAIR,EAAG4C,CAAI,EAClC2D,GAAQD,EAAK,OACbI,EAAOD,EAAI,OAGXN,EAAMN,EAAQS,EAAMG,EAAKF,GAAOG,CAAI,EAGhCP,GAAO,IACTnG,IAGAkG,EAASI,EAAMS,EAAKR,GAAQS,GAAKxG,EAAI+F,GAAO3D,CAAI,KAO9C5C,GAAK,IAAGmG,EAAMnG,EAAI,GACtBsG,EAAO9F,EAAG,MAAM,GAGlB+F,GAAQD,EAAK,OACTC,GAAQG,GAAMJ,EAAK,QAAQ,CAAC,EAGhCJ,EAASO,EAAKH,EAAMI,EAAM9D,CAAI,EAG1BuD,GAAO,KACTO,EAAOD,EAAI,OAGXN,EAAMN,EAAQrF,EAAIiG,EAAKM,EAAIL,CAAI,EAG3BP,EAAM,IACRnG,IAGAkG,EAASO,EAAKM,EAAKL,EAAOM,GAAKxG,EAAIkG,EAAM9D,CAAI,IAIjD8D,EAAOD,EAAI,QACFN,IAAQ,IACjBnG,IACAyG,EAAM,CAAC,CAAC,GAIVD,GAAGrG,GAAG,EAAIH,EAGNmG,GAAOM,EAAI,CAAC,EACdA,EAAIC,GAAM,EAAInG,EAAGqG,EAAE,GAAK,GAExBH,EAAM,CAAClG,EAAGqG,EAAE,CAAC,EACbF,EAAO,UAGDE,KAAOC,IAAMJ,EAAI,CAAC,IAAM,SAAWrF,KAE7CiF,EAAOI,EAAI,CAAC,IAAM,MACpB,CAGKD,GAAG,CAAC,GAAGA,GAAG,MAAM,CACvB,CAGA,GAAIJ,GAAW,EACb3C,EAAE,EAAI1C,EACNvC,GAAU6H,MACL,CAGL,IAAKlG,EAAI,EAAGH,EAAIwG,GAAG,CAAC,EAAGxG,GAAK,GAAIA,GAAK,GAAIG,IACzCsD,EAAE,EAAItD,EAAIY,EAAIqF,EAAU,EAExBvG,EAAS4D,EAAGS,EAAKvD,EAAK8C,EAAE,EAAI,EAAI9C,EAAIC,EAAIyF,CAAI,CAC9C,CAEA,OAAO5C,CACT,CACF,EAAG,EAOF,SAAS5D,EAASD,EAAGwB,EAAIR,EAAIsG,EAAa,CACzC,IAAIC,EAAQhH,EAAGC,EAAGJ,EAAGmF,EAAIiC,EAAS1F,EAAGnB,EAAI8G,EACvCpH,EAAOL,EAAE,YAGX0H,EAAK,GAAIlG,GAAM,KAAM,CAInB,GAHAb,EAAKX,EAAE,EAGH,CAACW,EAAI,OAAOX,EAWhB,IAAKuH,EAAS,EAAGnH,EAAIO,EAAG,CAAC,EAAGP,GAAK,GAAIA,GAAK,GAAImH,IAI9C,GAHAhH,EAAIiB,EAAK+F,EAGLhH,EAAI,EACNA,GAAKZ,EACLa,EAAIgB,EACJM,EAAInB,EAAG8G,EAAM,CAAC,EAGdlC,EAAKzD,EAAIzC,GAAQ,GAAIkI,EAAS/G,EAAI,CAAC,EAAI,GAAK,UAE5CiH,EAAM,KAAK,MAAMlH,EAAI,GAAKZ,CAAQ,EAClCS,EAAIO,EAAG,OACH8G,GAAOrH,EACT,GAAIkH,EAAa,CAGf,KAAOlH,KAAOqH,GAAM9G,EAAG,KAAK,CAAC,EAC7BmB,EAAIyD,EAAK,EACTgC,EAAS,EACThH,GAAKZ,EACLa,EAAID,EAAIZ,EAAW,CACrB,KACE,OAAM+H,MAEH,CAIL,IAHA5F,EAAI1B,EAAIO,EAAG8G,CAAG,EAGTF,EAAS,EAAGnH,GAAK,GAAIA,GAAK,GAAImH,IAGnChH,GAAKZ,EAILa,EAAID,EAAIZ,EAAW4H,EAGnBhC,EAAK/E,EAAI,EAAI,EAAIsB,EAAIzC,GAAQ,GAAIkI,EAAS/G,EAAI,CAAC,EAAI,GAAK,CAC1D,CAmBF,GAfA8G,EAAcA,GAAe9F,EAAK,GAChCb,EAAG8G,EAAM,CAAC,IAAM,SAAWjH,EAAI,EAAIsB,EAAIA,EAAIzC,GAAQ,GAAIkI,EAAS/G,EAAI,CAAC,GAMvEgH,EAAUxG,EAAK,GACVuE,GAAM+B,KAAiBtG,GAAM,GAAKA,IAAOhB,EAAE,EAAI,EAAI,EAAI,IACxDuF,EAAK,GAAKA,GAAM,IAAMvE,GAAM,GAAKsG,GAAetG,GAAM,IAGpDT,EAAI,EAAIC,EAAI,EAAIsB,EAAIzC,GAAQ,GAAIkI,EAAS/G,CAAC,EAAI,EAAIG,EAAG8G,EAAM,CAAC,GAAK,GAAM,GACvEzG,IAAOhB,EAAE,EAAI,EAAI,EAAI,IAEvBwB,EAAK,GAAK,CAACb,EAAG,CAAC,EACjB,OAAAA,EAAG,OAAS,EACR6G,GAGFhG,GAAMxB,EAAE,EAAI,EAGZW,EAAG,CAAC,EAAItB,GAAQ,IAAKM,EAAW6B,EAAK7B,GAAYA,CAAQ,EACzDK,EAAE,EAAI,CAACwB,GAAM,GAIbb,EAAG,CAAC,EAAIX,EAAE,EAAI,EAGTA,EAiBT,GAbIO,GAAK,GACPI,EAAG,OAAS8G,EACZrH,EAAI,EACJqH,MAEA9G,EAAG,OAAS8G,EAAM,EAClBrH,EAAIf,GAAQ,GAAIM,EAAWY,CAAC,EAI5BI,EAAG8G,CAAG,EAAIjH,EAAI,GAAKsB,EAAIzC,GAAQ,GAAIkI,EAAS/G,CAAC,EAAInB,GAAQ,GAAImB,CAAC,EAAI,GAAKJ,EAAI,GAGzEoH,EACF,OAGE,GAAIC,GAAO,EAAG,CAGZ,IAAKlH,EAAI,EAAGC,EAAIG,EAAG,CAAC,EAAGH,GAAK,GAAIA,GAAK,GAAID,IAEzC,IADAC,EAAIG,EAAG,CAAC,GAAKP,EACRA,EAAI,EAAGI,GAAK,GAAIA,GAAK,GAAIJ,IAG1BG,GAAKH,IACPJ,EAAE,IACEW,EAAG,CAAC,GAAKjB,KAAMiB,EAAG,CAAC,EAAI,IAG7B,KACF,KAAO,CAEL,GADAA,EAAG8G,CAAG,GAAKrH,EACPO,EAAG8G,CAAG,GAAK/H,GAAM,MACrBiB,EAAG8G,GAAK,EAAI,EACZrH,EAAI,CACN,CAKJ,IAAKG,EAAII,EAAG,OAAQA,EAAG,EAAEJ,CAAC,IAAM,GAAII,EAAG,IAAI,CAC7C,CAEA,OAAI7B,IAGEkB,EAAE,EAAIK,EAAK,MAGbL,EAAE,EAAI,KACNA,EAAE,EAAI,KAGGA,EAAE,EAAIK,EAAK,OAGpBL,EAAE,EAAI,EACNA,EAAE,EAAI,CAAC,CAAC,IAKLA,CACT,CAGA,SAASyE,GAAezE,EAAG2H,EAAOnG,EAAI,CACpC,GAAI,CAACxB,EAAE,SAAS,EAAG,OAAO4H,GAAkB5H,CAAC,EAC7C,IAAII,EACFe,EAAInB,EAAE,EACNwE,EAAM5C,GAAe5B,EAAE,CAAC,EACxBgC,EAAMwC,EAAI,OAEZ,OAAImD,GACEnG,IAAOpB,EAAIoB,EAAKQ,GAAO,EACzBwC,EAAMA,EAAI,OAAO,CAAC,EAAI,IAAMA,EAAI,MAAM,CAAC,EAAIY,GAAchF,CAAC,EACjD4B,EAAM,IACfwC,EAAMA,EAAI,OAAO,CAAC,EAAI,IAAMA,EAAI,MAAM,CAAC,GAGzCA,EAAMA,GAAOxE,EAAE,EAAI,EAAI,IAAM,MAAQA,EAAE,GAC9BmB,EAAI,GACbqD,EAAM,KAAOY,GAAc,CAACjE,EAAI,CAAC,EAAIqD,EACjChD,IAAOpB,EAAIoB,EAAKQ,GAAO,IAAGwC,GAAOY,GAAchF,CAAC,IAC3Ce,GAAKa,GACdwC,GAAOY,GAAcjE,EAAI,EAAIa,CAAG,EAC5BR,IAAOpB,EAAIoB,EAAKL,EAAI,GAAK,IAAGqD,EAAMA,EAAM,IAAMY,GAAchF,CAAC,MAE5DA,EAAIe,EAAI,GAAKa,IAAKwC,EAAMA,EAAI,MAAM,EAAGpE,CAAC,EAAI,IAAMoE,EAAI,MAAMpE,CAAC,GAC5DoB,IAAOpB,EAAIoB,EAAKQ,GAAO,IACrBb,EAAI,IAAMa,IAAKwC,GAAO,KAC1BA,GAAOY,GAAchF,CAAC,IAInBoE,CACT,CAIA,SAASZ,GAAkB2D,EAAQ,EAAG,CACpC,IAAIzF,EAAIyF,EAAO,CAAC,EAGhB,IAAM,GAAK5H,EAAUmC,GAAK,GAAIA,GAAK,GAAI,IACvC,OAAO,CACT,CAGA,SAAS0B,GAAQnD,EAAMmB,EAAIT,EAAI,CAC7B,GAAIS,EAAK3B,GAGP,MAAAf,EAAW,GACPiC,IAAIV,EAAK,UAAYU,GACnB,MAAM9B,EAAsB,EAEpC,OAAOgB,EAAS,IAAII,EAAK5B,EAAI,EAAG+C,EAAI,EAAG,EAAI,CAC7C,CAGA,SAASkB,GAAMrC,EAAMmB,EAAIR,EAAI,CAC3B,GAAIQ,EAAK1B,GAAc,MAAM,MAAMb,EAAsB,EACzD,OAAOgB,EAAS,IAAII,EAAK3B,EAAE,EAAG8C,EAAIR,EAAI,EAAI,CAC5C,CAGA,SAASiD,GAAasD,EAAQ,CAC5B,IAAIzF,EAAIyF,EAAO,OAAS,EACtBvF,EAAMF,EAAInC,EAAW,EAKvB,GAHAmC,EAAIyF,EAAOzF,CAAC,EAGRA,EAAG,CAGL,KAAOA,EAAI,IAAM,EAAGA,GAAK,GAAIE,IAG7B,IAAKF,EAAIyF,EAAO,CAAC,EAAGzF,GAAK,GAAIA,GAAK,GAAIE,GACxC,CAEA,OAAOA,CACT,CAGA,SAASoD,GAAchF,EAAG,CAExB,QADIyH,EAAK,GACFzH,KAAMyH,GAAM,IACnB,OAAOA,CACT,CAUA,SAAS5C,GAAO5E,EAAML,EAAGqB,EAAGN,EAAI,CAC9B,IAAIuG,EACFhG,EAAI,IAAIjB,EAAK,CAAC,EAIdD,EAAI,KAAK,KAAKW,EAAKpB,EAAW,CAAC,EAIjC,IAFAb,EAAW,KAEF,CAOP,GANIuC,EAAI,IACNC,EAAIA,EAAE,MAAMtB,CAAC,EACT8H,GAASxG,EAAE,EAAGlB,CAAC,IAAGkH,EAAc,KAGtCjG,EAAIjC,GAAUiC,EAAI,CAAC,EACfA,IAAM,EAAG,CAGXA,EAAIC,EAAE,EAAE,OAAS,EACbgG,GAAehG,EAAE,EAAED,CAAC,IAAM,GAAG,EAAEC,EAAE,EAAED,CAAC,EACxC,KACF,CAEArB,EAAIA,EAAE,MAAMA,CAAC,EACb8H,GAAS9H,EAAE,EAAGI,CAAC,CACjB,CAEA,OAAAtB,EAAW,GAEJwC,CACT,CAGA,SAASyG,GAAM1G,EAAG,CAChB,OAAOA,EAAE,EAAEA,EAAE,EAAE,OAAS,CAAC,EAAI,CAC/B,CAMA,SAAS2G,GAAS3H,EAAM4H,EAAM5G,EAAG,CAK/B,QAJIjB,EAAGE,EACLN,EAAI,IAAIK,EAAK4H,EAAK,CAAC,CAAC,EACpB1H,EAAI,EAEC,EAAEA,EAAI0H,EAAK,QAAS,CAIzB,GAHA3H,EAAI,IAAID,EAAK4H,EAAK1H,CAAC,CAAC,EAGhB,CAACD,EAAE,EAAG,CACRN,EAAIM,EACJ,KACF,CAEAF,EAAIJ,EAAE,IAAIM,CAAC,GAEPF,IAAMiB,GAAKjB,IAAM,GAAKJ,EAAE,IAAMqB,KAChCrB,EAAIM,EAER,CAEA,OAAON,CACT,CAkCA,SAAS8D,GAAmB9D,EAAGwB,EAAI,CACjC,IAAI0B,EAAaI,EAAO9C,EAAG0H,EAAKC,EAAK1G,EAAGkB,EACtCpB,EAAM,EACNhB,EAAI,EACJH,EAAI,EACJC,EAAOL,EAAE,YACTgB,EAAKX,EAAK,SACVU,EAAKV,EAAK,UAGZ,GAAI,CAACL,EAAE,GAAK,CAACA,EAAE,EAAE,CAAC,GAAKA,EAAE,EAAI,GAE3B,OAAO,IAAIK,EAAKL,EAAE,EACbA,EAAE,EAAE,CAAC,EAAQA,EAAE,EAAI,EAAI,EAAI,IAAlB,EACVA,EAAE,EAAIA,EAAE,EAAI,EAAI,EAAIA,EAAI,GAAK,EAanC,IAVIwB,GAAM,MACR1C,EAAW,GACX6D,EAAM5B,GAEN4B,EAAMnB,EAGRC,EAAI,IAAIpB,EAAK,MAAO,EAGbL,EAAE,EAAI,IAGXA,EAAIA,EAAE,MAAMyB,CAAC,EACbrB,GAAK,EAUP,IALAkD,EAAQ,KAAK,IAAIjE,GAAQ,EAAGe,CAAC,CAAC,EAAI,KAAK,KAAO,EAAI,EAAI,EACtDuC,GAAOW,EACPJ,EAAcgF,EAAMC,EAAM,IAAI9H,EAAK,CAAC,EACpCA,EAAK,UAAYsC,IAER,CAKP,GAJAuF,EAAMjI,EAASiI,EAAI,MAAMlI,CAAC,EAAG2C,EAAK,CAAC,EACnCO,EAAcA,EAAY,MAAM,EAAE3C,CAAC,EACnCkB,EAAI0G,EAAI,KAAKtG,EAAOqG,EAAKhF,EAAaP,EAAK,CAAC,CAAC,EAEzCf,GAAeH,EAAE,CAAC,EAAE,MAAM,EAAGkB,CAAG,IAAMf,GAAeuG,EAAI,CAAC,EAAE,MAAM,EAAGxF,CAAG,EAAG,CAE7E,IADAnC,EAAIJ,EACGI,KAAK2H,EAAMlI,EAASkI,EAAI,MAAMA,CAAG,EAAGxF,EAAK,CAAC,EAOjD,GAAInB,GAAM,KAER,GAAID,EAAM,GAAKkC,GAAoB0E,EAAI,EAAGxF,EAAMW,EAAOtC,EAAIO,CAAG,EAC5DlB,EAAK,UAAYsC,GAAO,GACxBO,EAAcgF,EAAMzG,EAAI,IAAIpB,EAAK,CAAC,EAClCE,EAAI,EACJgB,QAEA,QAAOtB,EAASkI,EAAK9H,EAAK,UAAYU,EAAIC,EAAIlC,EAAW,EAAI,MAG/D,QAAAuB,EAAK,UAAYU,EACVoH,CAEX,CAEAA,EAAM1G,CACR,CACF,CAkBA,SAAS8B,GAAiBjD,EAAGkB,EAAI,CAC/B,IAAI4G,EAAGC,EAAInF,EAAa/B,EAAGmH,EAAW/G,EAAK4G,EAAK1G,EAAGkB,EAAK4F,EAAIxF,EAC1D1B,EAAI,EACJiC,EAAQ,GACRtD,EAAIM,EACJK,GAAKX,EAAE,EACPK,EAAOL,EAAE,YACTgB,GAAKX,EAAK,SACVU,EAAKV,EAAK,UAGZ,GAAIL,EAAE,EAAI,GAAK,CAACW,IAAM,CAACA,GAAG,CAAC,GAAK,CAACX,EAAE,GAAKW,GAAG,CAAC,GAAK,GAAKA,GAAG,QAAU,EACjE,OAAO,IAAIN,EAAKM,IAAM,CAACA,GAAG,CAAC,EAAI,KAASX,EAAE,GAAK,EAAI,IAAMW,GAAK,EAAIX,CAAC,EAcrE,GAXIwB,GAAM,MACR1C,EAAW,GACX6D,EAAM5B,GAEN4B,EAAMnB,EAGRnB,EAAK,UAAYsC,GAAOW,EACxB8E,EAAIxG,GAAejB,EAAE,EACrB0H,EAAKD,EAAE,OAAO,CAAC,EAEX,KAAK,IAAIjH,EAAInB,EAAE,CAAC,EAAI,MAAQ,CAa9B,KAAOqI,EAAK,GAAKA,GAAM,GAAKA,GAAM,GAAKD,EAAE,OAAO,CAAC,EAAI,GACnDpI,EAAIA,EAAE,MAAMM,CAAC,EACb8H,EAAIxG,GAAe5B,EAAE,CAAC,EACtBqI,EAAKD,EAAE,OAAO,CAAC,EACf/G,IAGFF,EAAInB,EAAE,EAEFqI,EAAK,GACPrI,EAAI,IAAIK,EAAK,KAAO+H,CAAC,EACrBjH,KAEAnB,EAAI,IAAIK,EAAKgI,EAAK,IAAMD,EAAE,MAAM,CAAC,CAAC,CAEtC,KAKE,QAAA3G,EAAI+B,GAAQnD,EAAMsC,EAAM,EAAG5B,CAAE,EAAE,MAAMI,EAAI,EAAE,EAC3CnB,EAAIuD,GAAiB,IAAIlD,EAAKgI,EAAK,IAAMD,EAAE,MAAM,CAAC,CAAC,EAAGzF,EAAMW,CAAK,EAAE,KAAK7B,CAAC,EACzEpB,EAAK,UAAYU,EAEVS,GAAM,KAAOvB,EAASD,EAAGe,EAAIC,GAAIlC,EAAW,EAAI,EAAIkB,EAa7D,IATAuI,EAAKvI,EAKLmI,EAAMG,EAAYtI,EAAI6B,EAAO7B,EAAE,MAAM,CAAC,EAAGA,EAAE,KAAK,CAAC,EAAG2C,EAAK,CAAC,EAC1DI,EAAK9C,EAASD,EAAE,MAAMA,CAAC,EAAG2C,EAAK,CAAC,EAChCO,EAAc,IAEL,CAIP,GAHAoF,EAAYrI,EAASqI,EAAU,MAAMvF,CAAE,EAAGJ,EAAK,CAAC,EAChDlB,EAAI0G,EAAI,KAAKtG,EAAOyG,EAAW,IAAIjI,EAAK6C,CAAW,EAAGP,EAAK,CAAC,CAAC,EAEzDf,GAAeH,EAAE,CAAC,EAAE,MAAM,EAAGkB,CAAG,IAAMf,GAAeuG,EAAI,CAAC,EAAE,MAAM,EAAGxF,CAAG,EAc1E,GAbAwF,EAAMA,EAAI,MAAM,CAAC,EAIbhH,IAAM,IAAGgH,EAAMA,EAAI,KAAK3E,GAAQnD,EAAMsC,EAAM,EAAG5B,CAAE,EAAE,MAAMI,EAAI,EAAE,CAAC,GACpEgH,EAAMtG,EAAOsG,EAAK,IAAI9H,EAAKgB,CAAC,EAAGsB,EAAK,CAAC,EAQjCnB,GAAM,KACR,GAAIiC,GAAoB0E,EAAI,EAAGxF,EAAMW,EAAOtC,GAAIO,CAAG,EACjDlB,EAAK,UAAYsC,GAAOW,EACxB7B,EAAI6G,EAAYtI,EAAI6B,EAAO0G,EAAG,MAAM,CAAC,EAAGA,EAAG,KAAK,CAAC,EAAG5F,EAAK,CAAC,EAC1DI,EAAK9C,EAASD,EAAE,MAAMA,CAAC,EAAG2C,EAAK,CAAC,EAChCO,EAAc3B,EAAM,MAEpB,QAAOtB,EAASkI,EAAK9H,EAAK,UAAYU,EAAIC,GAAIlC,EAAW,EAAI,MAG/D,QAAAuB,EAAK,UAAYU,EACVoH,EAIXA,EAAM1G,EACNyB,GAAe,CACjB,CACF,CAIA,SAAS0E,GAAkB5H,EAAG,CAE5B,OAAO,OAAOA,EAAE,EAAIA,EAAE,EAAI,CAAC,CAC7B,CAMA,SAASwI,GAAaxI,EAAGwE,EAAK,CAC5B,IAAIrD,EAAGZ,EAAGyB,EAoBV,KAhBKb,EAAIqD,EAAI,QAAQ,GAAG,GAAK,KAAIA,EAAMA,EAAI,QAAQ,IAAK,EAAE,IAGrDjE,EAAIiE,EAAI,OAAO,IAAI,GAAK,GAGvBrD,EAAI,IAAGA,EAAIZ,GACfY,GAAK,CAACqD,EAAI,MAAMjE,EAAI,CAAC,EACrBiE,EAAMA,EAAI,UAAU,EAAGjE,CAAC,GACfY,EAAI,IAGbA,EAAIqD,EAAI,QAILjE,EAAI,EAAGiE,EAAI,WAAWjE,CAAC,IAAM,GAAIA,IAAI,CAG1C,IAAKyB,EAAMwC,EAAI,OAAQA,EAAI,WAAWxC,EAAM,CAAC,IAAM,GAAI,EAAEA,EAAI,CAG7D,GAFAwC,EAAMA,EAAI,MAAMjE,EAAGyB,CAAG,EAElBwC,EAAK,CAYP,GAXAxC,GAAOzB,EACPP,EAAE,EAAImB,EAAIA,EAAIZ,EAAI,EAClBP,EAAE,EAAI,CAAC,EAMPO,GAAKY,EAAI,GAAKxB,EACVwB,EAAI,IAAGZ,GAAKZ,GAEZY,EAAIyB,EAAK,CAEX,IADIzB,GAAGP,EAAE,EAAE,KAAK,CAACwE,EAAI,MAAM,EAAGjE,CAAC,CAAC,EAC3ByB,GAAOrC,EAAUY,EAAIyB,GAAMhC,EAAE,EAAE,KAAK,CAACwE,EAAI,MAAMjE,EAAGA,GAAKZ,CAAQ,CAAC,EACrE6E,EAAMA,EAAI,MAAMjE,CAAC,EACjBA,EAAIZ,EAAW6E,EAAI,MACrB,MACEjE,GAAKyB,EAGP,KAAOzB,KAAMiE,GAAO,IACpBxE,EAAE,EAAE,KAAK,CAACwE,CAAG,EAET1F,IAGEkB,EAAE,EAAIA,EAAE,YAAY,MAGtBA,EAAE,EAAI,KACNA,EAAE,EAAI,KAGGA,EAAE,EAAIA,EAAE,YAAY,OAG7BA,EAAE,EAAI,EACNA,EAAE,EAAI,CAAC,CAAC,GAId,MAGEA,EAAE,EAAI,EACNA,EAAE,EAAI,CAAC,CAAC,EAGV,OAAOA,CACT,CAMA,SAASyI,GAAWzI,EAAGwE,EAAK,CAC1B,IAAIxB,EAAM3C,EAAMqI,EAASnI,EAAGoI,EAAS3G,EAAK4G,EAAGjI,EAAI+C,EAEjD,GAAIc,EAAI,QAAQ,GAAG,EAAI,IAErB,GADAA,EAAMA,EAAI,QAAQ,eAAgB,IAAI,EAClC/E,GAAU,KAAK+E,CAAG,EAAG,OAAOgE,GAAaxI,EAAGwE,CAAG,UAC1CA,IAAQ,YAAcA,IAAQ,MACvC,MAAK,CAACA,IAAKxE,EAAE,EAAI,KACjBA,EAAE,EAAI,IACNA,EAAE,EAAI,KACCA,EAGT,GAAIT,GAAM,KAAKiF,CAAG,EAChBxB,EAAO,GACPwB,EAAMA,EAAI,YAAY,UACblF,GAAS,KAAKkF,CAAG,EAC1BxB,EAAO,UACExD,GAAQ,KAAKgF,CAAG,EACzBxB,EAAO,MAEP,OAAM,MAAMhE,GAAkBwF,CAAG,EAgCnC,IA5BAjE,EAAIiE,EAAI,OAAO,IAAI,EAEfjE,EAAI,GACNqI,EAAI,CAACpE,EAAI,MAAMjE,EAAI,CAAC,EACpBiE,EAAMA,EAAI,UAAU,EAAGjE,CAAC,GAExBiE,EAAMA,EAAI,MAAM,CAAC,EAKnBjE,EAAIiE,EAAI,QAAQ,GAAG,EACnBmE,EAAUpI,GAAK,EACfF,EAAOL,EAAE,YAEL2I,IACFnE,EAAMA,EAAI,QAAQ,IAAK,EAAE,EACzBxC,EAAMwC,EAAI,OACVjE,EAAIyB,EAAMzB,EAGVmI,EAAUzD,GAAO5E,EAAM,IAAIA,EAAK2C,CAAI,EAAGzC,EAAGA,EAAI,CAAC,GAGjDI,EAAK6E,GAAYhB,EAAKxB,EAAMtD,EAAI,EAChCgE,EAAK/C,EAAG,OAAS,EAGZJ,EAAImD,EAAI/C,EAAGJ,CAAC,IAAM,EAAG,EAAEA,EAAGI,EAAG,IAAI,EACtC,OAAIJ,EAAI,EAAU,IAAIF,EAAKL,EAAE,EAAI,CAAC,GAClCA,EAAE,EAAI4D,GAAkBjD,EAAI+C,CAAE,EAC9B1D,EAAE,EAAIW,EACN7B,EAAW,GAQP6J,IAAS3I,EAAI6B,EAAO7B,EAAG0I,EAAS1G,EAAM,CAAC,GAGvC4G,IAAG5I,EAAIA,EAAE,MAAM,KAAK,IAAI4I,CAAC,EAAI,GAAKvJ,GAAQ,EAAGuJ,CAAC,EAAIC,GAAQ,IAAI,EAAGD,CAAC,CAAC,GACvE9J,EAAW,GAEJkB,EACT,CAQA,SAASkE,GAAK7D,EAAML,EAAG,CACrB,IAAII,EACF4B,EAAMhC,EAAE,EAAE,OAEZ,GAAIgC,EAAM,EACR,OAAOhC,EAAE,OAAO,EAAIA,EAAImC,GAAa9B,EAAM,EAAGL,EAAGA,CAAC,EAQpDI,EAAI,IAAM,KAAK,KAAK4B,CAAG,EACvB5B,EAAIA,EAAI,GAAK,GAAKA,EAAI,EAEtBJ,EAAIA,EAAE,MAAM,EAAIkC,GAAQ,EAAG9B,CAAC,CAAC,EAC7BJ,EAAImC,GAAa9B,EAAM,EAAGL,EAAGA,CAAC,EAO9B,QAJI8I,EACFvG,EAAK,IAAIlC,EAAK,CAAC,EACfmC,EAAM,IAAInC,EAAK,EAAE,EACjBoC,EAAM,IAAIpC,EAAK,EAAE,EACZD,KACL0I,EAAS9I,EAAE,MAAMA,CAAC,EAClBA,EAAIA,EAAE,MAAMuC,EAAG,KAAKuG,EAAO,MAAMtG,EAAI,MAAMsG,CAAM,EAAE,MAAMrG,CAAG,CAAC,CAAC,CAAC,EAGjE,OAAOzC,CACT,CAIA,SAASmC,GAAa9B,EAAMgB,EAAGrB,EAAGM,EAAGyI,EAAc,CACjD,IAAIvI,EAAGiB,EAAGuH,EAAGjG,EACXxC,EAAI,EACJQ,EAAKV,EAAK,UACVD,EAAI,KAAK,KAAKW,EAAKpB,CAAQ,EAM7B,IAJAb,EAAW,GACXiE,EAAK/C,EAAE,MAAMA,CAAC,EACdgJ,EAAI,IAAI3I,EAAKC,CAAC,IAEL,CAMP,GALAmB,EAAII,EAAOmH,EAAE,MAAMjG,CAAE,EAAG,IAAI1C,EAAKgB,IAAMA,GAAG,EAAGN,EAAI,CAAC,EAClDiI,EAAID,EAAezI,EAAE,KAAKmB,CAAC,EAAInB,EAAE,MAAMmB,CAAC,EACxCnB,EAAIuB,EAAOJ,EAAE,MAAMsB,CAAE,EAAG,IAAI1C,EAAKgB,IAAMA,GAAG,EAAGN,EAAI,CAAC,EAClDU,EAAIuH,EAAE,KAAK1I,CAAC,EAERmB,EAAE,EAAErB,CAAC,IAAM,OAAQ,CACrB,IAAKI,EAAIJ,EAAGqB,EAAE,EAAEjB,CAAC,IAAMwI,EAAE,EAAExI,CAAC,GAAKA,KAAK,CACtC,GAAIA,GAAK,GAAI,KACf,CAEAA,EAAIwI,EACJA,EAAI1I,EACJA,EAAImB,EACJA,EAAIjB,EACJD,GACF,CAEA,OAAAzB,EAAW,GACX2C,EAAE,EAAE,OAASrB,EAAI,EAEVqB,CACT,CAIA,SAASS,GAAQiE,EAAG,EAAG,CAErB,QADI9E,EAAI8E,EACD,EAAE,GAAG9E,GAAK8E,EACjB,OAAO9E,CACT,CAIA,SAASH,GAAiBb,EAAML,EAAG,CACjC,IAAIyB,EACFwH,EAAQjJ,EAAE,EAAI,EACdkJ,EAAKxG,GAAMrC,EAAMA,EAAK,UAAW,CAAC,EAClCwC,EAASqG,EAAG,MAAM,EAAG,EAIvB,GAFAlJ,EAAIA,EAAE,IAAI,EAENA,EAAE,IAAI6C,CAAM,EACd,OAAAhE,GAAWoK,EAAQ,EAAI,EAChBjJ,EAKT,GAFAyB,EAAIzB,EAAE,SAASkJ,CAAE,EAEbzH,EAAE,OAAO,EACX5C,GAAWoK,EAAQ,EAAI,MAClB,CAIL,GAHAjJ,EAAIA,EAAE,MAAMyB,EAAE,MAAMyH,CAAE,CAAC,EAGnBlJ,EAAE,IAAI6C,CAAM,EACd,OAAAhE,GAAWkJ,GAAMtG,CAAC,EAAKwH,EAAQ,EAAI,EAAMA,EAAQ,EAAI,EAC9CjJ,EAGTnB,GAAWkJ,GAAMtG,CAAC,EAAKwH,EAAQ,EAAI,EAAMA,EAAQ,EAAI,CACvD,CAEA,OAAOjJ,EAAE,MAAMkJ,CAAE,EAAE,IAAI,CACzB,CAQA,SAAS7E,GAAerE,EAAG0F,EAASlE,EAAIR,EAAI,CAC1C,IAAIgC,EAAM7B,EAAGZ,EAAGH,EAAG4B,EAAKwF,EAAShD,EAAK7D,EAAIL,EACxCD,EAAOL,EAAE,YACT2H,EAAQnG,IAAO,OAWjB,GATImG,GACFpD,GAAW/C,EAAI,EAAGjD,EAAU,EACxByC,IAAO,OAAQA,EAAKX,EAAK,SACxBkE,GAAWvD,EAAI,EAAG,CAAC,IAExBQ,EAAKnB,EAAK,UACVW,EAAKX,EAAK,UAGR,CAACL,EAAE,SAAS,EACdwE,EAAMoD,GAAkB5H,CAAC,MACpB,CAoCL,IAnCAwE,EAAMC,GAAezE,CAAC,EACtBO,EAAIiE,EAAI,QAAQ,GAAG,EAOfmD,GACF3E,EAAO,EACH0C,GAAW,GACblE,EAAKA,EAAK,EAAI,EACLkE,GAAW,IACpBlE,EAAKA,EAAK,EAAI,IAGhBwB,EAAO0C,EAOLnF,GAAK,IACPiE,EAAMA,EAAI,QAAQ,IAAK,EAAE,EACzBlE,EAAI,IAAID,EAAK,CAAC,EACdC,EAAE,EAAIkE,EAAI,OAASjE,EACnBD,EAAE,EAAIkF,GAAYf,GAAenE,CAAC,EAAG,GAAI0C,CAAI,EAC7C1C,EAAE,EAAIA,EAAE,EAAE,QAGZK,EAAK6E,GAAYhB,EAAK,GAAIxB,CAAI,EAC9B7B,EAAIa,EAAMrB,EAAG,OAGNA,EAAG,EAAEqB,CAAG,GAAK,GAAIrB,EAAG,IAAI,EAE/B,GAAI,CAACA,EAAG,CAAC,EACP6D,EAAMmD,EAAQ,OAAS,QAClB,CAyBL,GAxBIpH,EAAI,EACNY,KAEAnB,EAAI,IAAIK,EAAKL,CAAC,EACdA,EAAE,EAAIW,EACNX,EAAE,EAAImB,EACNnB,EAAI6B,EAAO7B,EAAGM,EAAGkB,EAAIR,EAAI,EAAGgC,CAAI,EAChCrC,EAAKX,EAAE,EACPmB,EAAInB,EAAE,EACNwH,EAAU5I,IAIZ2B,EAAII,EAAGa,CAAE,EACTpB,EAAI4C,EAAO,EACXwE,EAAUA,GAAW7G,EAAGa,EAAK,CAAC,IAAM,OAEpCgG,EAAUxG,EAAK,GACVT,IAAM,QAAUiH,KAAaxG,IAAO,GAAKA,KAAQhB,EAAE,EAAI,EAAI,EAAI,IAChEO,EAAIH,GAAKG,IAAMH,IAAMY,IAAO,GAAKwG,GAAWxG,IAAO,GAAKL,EAAGa,EAAK,CAAC,EAAI,GACrER,KAAQhB,EAAE,EAAI,EAAI,EAAI,IAE1BW,EAAG,OAASa,EAERgG,EAGF,KAAO,EAAE7G,EAAG,EAAEa,CAAE,EAAIwB,EAAO,GACzBrC,EAAGa,CAAE,EAAI,EACJA,IACH,EAAEL,EACFR,EAAG,QAAQ,CAAC,GAMlB,IAAKqB,EAAMrB,EAAG,OAAQ,CAACA,EAAGqB,EAAM,CAAC,EAAG,EAAEA,EAAI,CAG1C,IAAKzB,EAAI,EAAGiE,EAAM,GAAIjE,EAAIyB,EAAKzB,IAAKiE,GAAOhG,GAAS,OAAOmC,EAAGJ,CAAC,CAAC,EAGhE,GAAIoH,EAAO,CACT,GAAI3F,EAAM,EACR,GAAI0D,GAAW,IAAMA,GAAW,EAAG,CAEjC,IADAnF,EAAImF,GAAW,GAAK,EAAI,EACnB,EAAE1D,EAAKA,EAAMzB,EAAGyB,IAAOwC,GAAO,IAEnC,IADA7D,EAAK6E,GAAYhB,EAAKxB,EAAM0C,CAAO,EAC9B1D,EAAMrB,EAAG,OAAQ,CAACA,EAAGqB,EAAM,CAAC,EAAG,EAAEA,EAAI,CAG1C,IAAKzB,EAAI,EAAGiE,EAAM,KAAMjE,EAAIyB,EAAKzB,IAAKiE,GAAOhG,GAAS,OAAOmC,EAAGJ,CAAC,CAAC,CACpE,MACEiE,EAAMA,EAAI,OAAO,CAAC,EAAI,IAAMA,EAAI,MAAM,CAAC,EAI3CA,EAAOA,GAAOrD,EAAI,EAAI,IAAM,MAAQA,CACtC,SAAWA,EAAI,EAAG,CAChB,KAAO,EAAEA,GAAIqD,EAAM,IAAMA,EACzBA,EAAM,KAAOA,CACf,SACM,EAAErD,EAAIa,EAAK,IAAKb,GAAKa,EAAKb,KAAOqD,GAAO,SACnCrD,EAAIa,IAAKwC,EAAMA,EAAI,MAAM,EAAGrD,CAAC,EAAI,IAAMqD,EAAI,MAAMrD,CAAC,EAE/D,CAEAqD,GAAOkB,GAAW,GAAK,KAAOA,GAAW,EAAI,KAAOA,GAAW,EAAI,KAAO,IAAMlB,CAClF,CAEA,OAAOxE,EAAE,EAAI,EAAI,IAAMwE,EAAMA,CAC/B,CAIA,SAASsD,GAASnC,EAAK3D,EAAK,CAC1B,GAAI2D,EAAI,OAAS3D,EACf,OAAA2D,EAAI,OAAS3D,EACN,EAEX,CAyDA,SAASmH,GAAInJ,EAAG,CACd,OAAO,IAAI,KAAKA,CAAC,EAAE,IAAI,CACzB,CASA,SAASoJ,GAAKpJ,EAAG,CACf,OAAO,IAAI,KAAKA,CAAC,EAAE,KAAK,CAC1B,CAUA,SAASqJ,GAAMrJ,EAAG,CAChB,OAAO,IAAI,KAAKA,CAAC,EAAE,MAAM,CAC3B,CAWA,SAASsJ,GAAItJ,EAAGM,EAAG,CACjB,OAAO,IAAI,KAAKN,CAAC,EAAE,KAAKM,CAAC,CAC3B,CAUA,SAASiJ,GAAKvJ,EAAG,CACf,OAAO,IAAI,KAAKA,CAAC,EAAE,KAAK,CAC1B,CAUA,SAASwJ,GAAMxJ,EAAG,CAChB,OAAO,IAAI,KAAKA,CAAC,EAAE,MAAM,CAC3B,CAUA,SAASyJ,GAAKzJ,EAAG,CACf,OAAO,IAAI,KAAKA,CAAC,EAAE,KAAK,CAC1B,CAUA,SAAS0J,GAAM1J,EAAG,CAChB,OAAO,IAAI,KAAKA,CAAC,EAAE,MAAM,CAC3B,CA4BA,SAAS2J,GAAMrJ,EAAGN,EAAG,CACnBM,EAAI,IAAI,KAAKA,CAAC,EACdN,EAAI,IAAI,KAAKA,CAAC,EACd,IAAI,EACFe,EAAK,KAAK,UACVC,EAAK,KAAK,SACV2B,EAAM5B,EAAK,EAGb,MAAI,CAACT,EAAE,GAAK,CAACN,EAAE,EACb,EAAI,IAAI,KAAK,GAAG,EAGP,CAACM,EAAE,GAAK,CAACN,EAAE,GACpB,EAAI0C,GAAM,KAAMC,EAAK,CAAC,EAAE,MAAM3C,EAAE,EAAI,EAAI,IAAO,GAAI,EACnD,EAAE,EAAIM,EAAE,GAGC,CAACN,EAAE,GAAKM,EAAE,OAAO,GAC1B,EAAIN,EAAE,EAAI,EAAI0C,GAAM,KAAM3B,EAAIC,CAAE,EAAI,IAAI,KAAK,CAAC,EAC9C,EAAE,EAAIV,EAAE,GAGC,CAACA,EAAE,GAAKN,EAAE,OAAO,GAC1B,EAAI0C,GAAM,KAAMC,EAAK,CAAC,EAAE,MAAM,EAAG,EACjC,EAAE,EAAIrC,EAAE,GAGCN,EAAE,EAAI,GACf,KAAK,UAAY2C,EACjB,KAAK,SAAW,EAChB,EAAI,KAAK,KAAKd,EAAOvB,EAAGN,EAAG2C,EAAK,CAAC,CAAC,EAClC3C,EAAI0C,GAAM,KAAMC,EAAK,CAAC,EACtB,KAAK,UAAY5B,EACjB,KAAK,SAAWC,EAChB,EAAIV,EAAE,EAAI,EAAI,EAAE,MAAMN,CAAC,EAAI,EAAE,KAAKA,CAAC,GAEnC,EAAI,KAAK,KAAK6B,EAAOvB,EAAGN,EAAG2C,EAAK,CAAC,CAAC,EAG7B,CACT,CAUA,SAASiH,GAAK5J,EAAG,CACf,OAAO,IAAI,KAAKA,CAAC,EAAE,KAAK,CAC1B,CASA,SAAS6J,GAAK7J,EAAG,CACf,OAAOC,EAASD,EAAI,IAAI,KAAKA,CAAC,EAAGA,EAAE,EAAI,EAAG,CAAC,CAC7C,CAWA,SAAS8J,GAAM9J,EAAGE,EAAKC,EAAK,CAC1B,OAAO,IAAI,KAAKH,CAAC,EAAE,MAAME,EAAKC,CAAG,CACnC,CAqBA,SAAS4J,GAAOC,EAAK,CACnB,GAAI,CAACA,GAAO,OAAOA,GAAQ,SAAU,MAAM,MAAMjL,GAAe,iBAAiB,EACjF,IAAIwB,EAAGqI,EAAGqB,EACRC,EAAcF,EAAI,WAAa,GAC/BG,EAAK,CACH,YAAa,EAAG5L,GAChB,WAAY,EAAG,EACf,WAAY,CAACD,GAAW,EACxB,WAAY,EAAGA,GACf,OAAQ,EAAGA,GACX,OAAQ,CAACA,GAAW,EACpB,SAAU,EAAG,CACf,EAEF,IAAKiC,EAAI,EAAGA,EAAI4J,EAAG,OAAQ5J,GAAK,EAE9B,GADIqI,EAAIuB,EAAG5J,CAAC,EAAG2J,IAAa,KAAKtB,CAAC,EAAIjK,GAASiK,CAAC,IAC3CqB,EAAID,EAAIpB,CAAC,KAAO,OACnB,GAAIxJ,GAAU6K,CAAC,IAAMA,GAAKA,GAAKE,EAAG5J,EAAI,CAAC,GAAK0J,GAAKE,EAAG5J,EAAI,CAAC,EAAG,KAAKqI,CAAC,EAAIqB,MACjE,OAAM,MAAMjL,GAAkB4J,EAAI,KAAOqB,CAAC,EAKnD,GADIrB,EAAI,SAAUsB,IAAa,KAAKtB,CAAC,EAAIjK,GAASiK,CAAC,IAC9CqB,EAAID,EAAIpB,CAAC,KAAO,OACnB,GAAIqB,IAAM,IAAQA,IAAM,IAASA,IAAM,GAAKA,IAAM,EAChD,GAAIA,EACF,GAAI,OAAO,OAAU,KAAe,SACjC,OAAO,iBAAmB,OAAO,aAClC,KAAKrB,CAAC,EAAI,OAEV,OAAM,MAAM1J,EAAiB,OAG/B,KAAK0J,CAAC,EAAI,OAGZ,OAAM,MAAM5J,GAAkB4J,EAAI,KAAOqB,CAAC,EAI9C,OAAO,IACT,CAUA,SAASG,GAAIpK,EAAG,CACd,OAAO,IAAI,KAAKA,CAAC,EAAE,IAAI,CACzB,CAUA,SAASqK,GAAKrK,EAAG,CACf,OAAO,IAAI,KAAKA,CAAC,EAAE,KAAK,CAC1B,CAQA,SAASsK,GAAMN,EAAK,CAClB,IAAIzJ,EAAGqI,EAAGuB,EASV,SAAStB,EAAQoB,EAAG,CAClB,IAAI9I,EAAGZ,EAAGkB,EACRzB,EAAI,KAGN,GAAI,EAAEA,aAAa6I,GAAU,OAAO,IAAIA,EAAQoB,CAAC,EAMjD,GAFAjK,EAAE,YAAc6I,EAEZ0B,GAAkBN,CAAC,EAAG,CACxBjK,EAAE,EAAIiK,EAAE,EAEJnL,EACE,CAACmL,EAAE,GAAKA,EAAE,EAAIpB,EAAQ,MAGxB7I,EAAE,EAAI,IACNA,EAAE,EAAI,MACGiK,EAAE,EAAIpB,EAAQ,MAGvB7I,EAAE,EAAI,EACNA,EAAE,EAAI,CAAC,CAAC,IAERA,EAAE,EAAIiK,EAAE,EACRjK,EAAE,EAAIiK,EAAE,EAAE,MAAM,IAGlBjK,EAAE,EAAIiK,EAAE,EACRjK,EAAE,EAAIiK,EAAE,EAAIA,EAAE,EAAE,MAAM,EAAIA,EAAE,GAG9B,MACF,CAIA,GAFAxI,EAAI,OAAOwI,EAEPxI,IAAM,SAAU,CAClB,GAAIwI,IAAM,EAAG,CACXjK,EAAE,EAAI,EAAIiK,EAAI,EAAI,GAAK,EACvBjK,EAAE,EAAI,EACNA,EAAE,EAAI,CAAC,CAAC,EACR,MACF,CAUA,GARIiK,EAAI,GACNA,EAAI,CAACA,EACLjK,EAAE,EAAI,IAENA,EAAE,EAAI,EAIJiK,IAAM,CAAC,CAACA,GAAKA,EAAI,IAAK,CACxB,IAAK9I,EAAI,EAAGZ,EAAI0J,EAAG1J,GAAK,GAAIA,GAAK,GAAIY,IAEjCrC,EACEqC,EAAI0H,EAAQ,MACd7I,EAAE,EAAI,IACNA,EAAE,EAAI,MACGmB,EAAI0H,EAAQ,MACrB7I,EAAE,EAAI,EACNA,EAAE,EAAI,CAAC,CAAC,IAERA,EAAE,EAAImB,EACNnB,EAAE,EAAI,CAACiK,CAAC,IAGVjK,EAAE,EAAImB,EACNnB,EAAE,EAAI,CAACiK,CAAC,GAGV,MACF,CAGA,GAAIA,EAAI,IAAM,EAAG,CACVA,IAAGjK,EAAE,EAAI,KACdA,EAAE,EAAI,IACNA,EAAE,EAAI,KACN,MACF,CAEA,OAAOwI,GAAaxI,EAAGiK,EAAE,SAAS,CAAC,CACrC,CAEA,GAAIxI,IAAM,SACR,OAAKlB,EAAI0J,EAAE,WAAW,CAAC,KAAO,IAC5BA,EAAIA,EAAE,MAAM,CAAC,EACbjK,EAAE,EAAI,KAEFO,IAAM,KAAI0J,EAAIA,EAAE,MAAM,CAAC,GAC3BjK,EAAE,EAAI,GAGDP,GAAU,KAAKwK,CAAC,EAAIzB,GAAaxI,EAAGiK,CAAC,EAAIxB,GAAWzI,EAAGiK,CAAC,EAGjE,GAAIxI,IAAM,SACR,OAAIwI,EAAI,GACNA,EAAI,CAACA,EACLjK,EAAE,EAAI,IAENA,EAAE,EAAI,EAGDwI,GAAaxI,EAAGiK,EAAE,SAAS,CAAC,EAGrC,MAAM,MAAMjL,GAAkBiL,CAAC,CACjC,CA2DA,GAzDApB,EAAQ,UAAY9I,EAEpB8I,EAAQ,SAAW,EACnBA,EAAQ,WAAa,EACrBA,EAAQ,WAAa,EACrBA,EAAQ,YAAc,EACtBA,EAAQ,cAAgB,EACxBA,EAAQ,gBAAkB,EAC1BA,EAAQ,gBAAkB,EAC1BA,EAAQ,gBAAkB,EAC1BA,EAAQ,iBAAmB,EAC3BA,EAAQ,OAAS,EAEjBA,EAAQ,OAASA,EAAQ,IAAMkB,GAC/BlB,EAAQ,MAAQyB,GAChBzB,EAAQ,UAAY0B,GAEpB1B,EAAQ,IAAMM,GACdN,EAAQ,KAAOO,GACfP,EAAQ,MAAQQ,GAChBR,EAAQ,IAAMS,GACdT,EAAQ,KAAOU,GACfV,EAAQ,MAAQW,GAChBX,EAAQ,KAAOY,GACfZ,EAAQ,MAAQa,GAChBb,EAAQ,MAAQc,GAChBd,EAAQ,KAAOe,GACff,EAAQ,KAAOgB,GACfhB,EAAQ,MAAQiB,GAChBjB,EAAQ,IAAMuB,GACdvB,EAAQ,KAAOwB,GACfxB,EAAQ,IAAM2B,GACd3B,EAAQ,IAAM4B,GACd5B,EAAQ,MAAQ6B,GAChB7B,EAAQ,MAAQ8B,GAChB9B,EAAQ,GAAK+B,GACb/B,EAAQ,IAAMgC,GACdhC,EAAQ,MAAQiC,GAChBjC,EAAQ,KAAOkC,GACflC,EAAQ,IAAM1I,GACd0I,EAAQ,IAAM3I,GACd2I,EAAQ,IAAMmC,GACdnC,EAAQ,IAAMoC,GACdpC,EAAQ,IAAMX,GACdW,EAAQ,OAASqC,GACjBrC,EAAQ,MAAQsC,GAChBtC,EAAQ,KAAOxB,GACfwB,EAAQ,IAAMuC,GACdvC,EAAQ,KAAOwC,GACfxC,EAAQ,KAAOyC,GACfzC,EAAQ,IAAM0C,GACd1C,EAAQ,IAAMV,GACdU,EAAQ,IAAM2C,GACd3C,EAAQ,KAAO4C,GACf5C,EAAQ,MAAQ6C,GAEZ1B,IAAQ,SAAQA,EAAM,CAAC,GACvBA,GACEA,EAAI,WAAa,GAEnB,IADAG,EAAK,CAAC,YAAa,WAAY,WAAY,WAAY,OAAQ,OAAQ,SAAU,QAAQ,EACpF5J,EAAI,EAAGA,EAAI4J,EAAG,QAAcH,EAAI,eAAepB,EAAIuB,EAAG5J,GAAG,CAAC,IAAGyJ,EAAIpB,CAAC,EAAI,KAAKA,CAAC,GAIrF,OAAAC,EAAQ,OAAOmB,CAAG,EAEXnB,CACT,CAWA,SAAS2B,GAAIxK,EAAGM,EAAG,CACjB,OAAO,IAAI,KAAKN,CAAC,EAAE,IAAIM,CAAC,CAC1B,CAUA,SAASmK,GAAIzK,EAAG,CACd,OAAO,IAAI,KAAKA,CAAC,EAAE,IAAI,CACzB,CASA,SAAS0K,GAAM1K,EAAG,CAChB,OAAOC,EAASD,EAAI,IAAI,KAAKA,CAAC,EAAGA,EAAE,EAAI,EAAG,CAAC,CAC7C,CAYA,SAAS2K,IAAQ,CACf,IAAIpK,EAAGc,EACLI,EAAI,IAAI,KAAK,CAAC,EAIhB,IAFA3C,EAAW,GAENyB,EAAI,EAAGA,EAAI,UAAU,QAExB,GADAc,EAAI,IAAI,KAAK,UAAUd,GAAG,CAAC,EACtBc,EAAE,EAMII,EAAE,IACXA,EAAIA,EAAE,KAAKJ,EAAE,MAAMA,CAAC,CAAC,OAPb,CACR,GAAIA,EAAE,EACJ,OAAAvC,EAAW,GACJ,IAAI,KAAK,GAAK,EAEvB2C,EAAIJ,CACN,CAKF,OAAAvC,EAAW,GAEJ2C,EAAE,KAAK,CAChB,CAQA,SAAS8I,GAAkBP,EAAK,CAC9B,OAAOA,aAAenB,IAAWmB,GAAOA,EAAI,cAAgB7K,IAAO,EACrE,CAUA,SAASyL,GAAG5K,EAAG,CACb,OAAO,IAAI,KAAKA,CAAC,EAAE,GAAG,CACxB,CAaA,SAAS6K,GAAI7K,EAAGM,EAAG,CACjB,OAAO,IAAI,KAAKN,CAAC,EAAE,IAAIM,CAAC,CAC1B,CAUA,SAASyK,GAAK/K,EAAG,CACf,OAAO,IAAI,KAAKA,CAAC,EAAE,IAAI,CAAC,CAC1B,CAUA,SAAS8K,GAAM9K,EAAG,CAChB,OAAO,IAAI,KAAKA,CAAC,EAAE,IAAI,EAAE,CAC3B,CASA,SAASG,IAAM,CACb,OAAO6H,GAAS,KAAM,UAAW,EAAE,CACrC,CASA,SAAS9H,IAAM,CACb,OAAO8H,GAAS,KAAM,UAAW,CAAC,CACpC,CAWA,SAASgD,GAAIhL,EAAGM,EAAG,CACjB,OAAO,IAAI,KAAKN,CAAC,EAAE,IAAIM,CAAC,CAC1B,CAWA,SAAS2K,GAAIjL,EAAGM,EAAG,CACjB,OAAO,IAAI,KAAKN,CAAC,EAAE,IAAIM,CAAC,CAC1B,CAWA,SAAS4H,GAAIlI,EAAGM,EAAG,CACjB,OAAO,IAAI,KAAKN,CAAC,EAAE,IAAIM,CAAC,CAC1B,CAWA,SAAS4K,GAAO1J,EAAI,CAClB,IAAIO,EAAGZ,EAAGf,EAAGiB,EACXd,EAAI,EACJe,EAAI,IAAI,KAAK,CAAC,EACdiE,EAAK,CAAC,EAOR,GALI/D,IAAO,OAAQA,EAAK,KAAK,UACxB+C,GAAW/C,EAAI,EAAGjD,EAAU,EAEjC6B,EAAI,KAAK,KAAKoB,EAAK7B,CAAQ,EAEtB,KAAK,OAIH,GAAI,OAAO,gBAGhB,IAFAoC,EAAI,OAAO,gBAAgB,IAAI,YAAY3B,CAAC,CAAC,EAEtCG,EAAIH,GACTiB,EAAIU,EAAExB,CAAC,EAIHc,GAAK,MACPU,EAAExB,CAAC,EAAI,OAAO,gBAAgB,IAAI,YAAY,CAAC,CAAC,EAAE,CAAC,EAKnDgF,EAAGhF,GAAG,EAAIc,EAAI,YAKT,OAAO,YAAa,CAK7B,IAFAU,EAAI,OAAO,YAAY3B,GAAK,CAAC,EAEtBG,EAAIH,GAGTiB,EAAIU,EAAExB,CAAC,GAAKwB,EAAExB,EAAI,CAAC,GAAK,IAAMwB,EAAExB,EAAI,CAAC,GAAK,MAAQwB,EAAExB,EAAI,CAAC,EAAI,MAAS,IAGlEc,GAAK,MACP,OAAO,YAAY,CAAC,EAAE,KAAKU,EAAGxB,CAAC,GAK/BgF,EAAG,KAAKlE,EAAI,GAAG,EACfd,GAAK,GAITA,EAAIH,EAAI,CACV,KACE,OAAM,MAAMlB,EAAiB,MA9C7B,MAAOqB,EAAIH,GAAImF,EAAGhF,GAAG,EAAI,KAAK,OAAO,EAAI,IAAM,EA2DjD,IAVAH,EAAImF,EAAG,EAAEhF,CAAC,EACViB,GAAM7B,EAGFS,GAAKoB,IACPH,EAAIhC,GAAQ,GAAIM,EAAW6B,CAAE,EAC7B+D,EAAGhF,CAAC,GAAKH,EAAIiB,EAAI,GAAKA,GAIjBkE,EAAGhF,CAAC,IAAM,EAAGA,IAAKgF,EAAG,IAAI,EAGhC,GAAIhF,EAAI,EACNY,EAAI,EACJoE,EAAK,CAAC,CAAC,MACF,CAIL,IAHApE,EAAI,GAGGoE,EAAG,CAAC,IAAM,EAAGpE,GAAKxB,EAAU4F,EAAG,MAAM,EAG5C,IAAKnF,EAAI,EAAGiB,EAAIkE,EAAG,CAAC,EAAGlE,GAAK,GAAIA,GAAK,GAAIjB,IAGrCA,EAAIT,IAAUwB,GAAKxB,EAAWS,EACpC,CAEA,OAAAkB,EAAE,EAAIH,EACNG,EAAE,EAAIiE,EAECjE,CACT,CAWA,SAAS6J,GAAMnL,EAAG,CAChB,OAAOC,EAASD,EAAI,IAAI,KAAKA,CAAC,EAAGA,EAAE,EAAI,EAAG,KAAK,QAAQ,CACzD,CAcA,SAASqH,GAAKrH,EAAG,CACf,OAAAA,EAAI,IAAI,KAAKA,CAAC,EACPA,EAAE,EAAKA,EAAE,EAAE,CAAC,EAAIA,EAAE,EAAI,EAAIA,EAAE,EAAKA,EAAE,GAAK,GACjD,CAUA,SAASoL,GAAIpL,EAAG,CACd,OAAO,IAAI,KAAKA,CAAC,EAAE,IAAI,CACzB,CAUA,SAASqL,GAAKrL,EAAG,CACf,OAAO,IAAI,KAAKA,CAAC,EAAE,KAAK,CAC1B,CAUA,SAASsL,GAAKtL,EAAG,CACf,OAAO,IAAI,KAAKA,CAAC,EAAE,KAAK,CAC1B,CAWA,SAASuL,GAAIvL,EAAGM,EAAG,CACjB,OAAO,IAAI,KAAKN,CAAC,EAAE,IAAIM,CAAC,CAC1B,CAYA,SAAS6H,IAAM,CACb,IAAI5H,EAAI,EACN0H,EAAO,UACPjI,EAAI,IAAI,KAAKiI,EAAK1H,CAAC,CAAC,EAGtB,IADAzB,EAAW,GACJkB,EAAE,GAAK,EAAEO,EAAI0H,EAAK,QAASjI,EAAIA,EAAE,KAAKiI,EAAK1H,CAAC,CAAC,EACpD,OAAAzB,EAAW,GAEJmB,EAASD,EAAG,KAAK,UAAW,KAAK,QAAQ,CAClD,CAUA,SAASwL,GAAIxL,EAAG,CACd,OAAO,IAAI,KAAKA,CAAC,EAAE,IAAI,CACzB,CAUA,SAASyL,GAAKzL,EAAG,CACf,OAAO,IAAI,KAAKA,CAAC,EAAE,KAAK,CAC1B,CASA,SAAS0L,GAAM1L,EAAG,CAChB,OAAOC,EAASD,EAAI,IAAI,KAAKA,CAAC,EAAGA,EAAE,EAAI,EAAG,CAAC,CAC7C,CAGAD,EAAE,OAAO,IAAI,4BAA4B,CAAC,EAAIA,EAAE,SAChDA,EAAE,OAAO,WAAW,EAAI,UAGjB,IAAI8I,GAAU9I,EAAE,YAAcuK,GAAM3L,EAAQ,EAGnDF,GAAO,IAAIoK,GAAQpK,EAAI,EACvBC,GAAK,IAAImK,GAAQnK,EAAE,EAEnB,IAAOiN,GAAQ9C,GC1yJR,SAAS+C,EAAEC,EAAyC,CACzD,OAAIC,GAAQ,UAAUD,CAAK,EAClBA,EAGF,IAAIC,GAAQD,IAAU,OAAY,EAAIA,CAAK,CACpD,CAOO,SAASE,GAAmBC,EAA4C,CAC7E,OAAOJ,EAAE,EAAE,EAAE,IAAIA,EAAEI,CAAQ,EAAE,IAAI,CAAC,CACpC,CAQO,SAASC,GAAiBC,EAAyBF,EAAmC,CAC3F,IAAMG,EAAMJ,GAAmBH,EAAEI,CAAQ,CAAC,EAE1C,OAAO,OAAOJ,EAAEM,CAAM,EAAE,IAAIC,CAAG,CAAC,CAClC,CAQO,SAASC,GAAQC,EAAaC,EAAO,GAAI,CAC9C,OAAO,OAAO,QAAQA,EAAM,OAAOD,CAAG,CAAC,EAAE,SAAS,CACpD,CAQO,SAASE,GAAOF,EAAaC,EAAO,GAAI,CAC7C,OAAO,OAAO,OAAO,OAAOA,EAAM,OAAOD,CAAG,CAAC,CAAC,CAChD,CAQO,SAASG,GAAmBN,EAAyBF,EAAmC,CAC7F,IAAMG,EAAMJ,GAAmBH,EAAEI,CAAQ,CAAC,EAE1C,OAAO,OAAOJ,EAAEM,CAAM,EAAE,IAAIC,CAAG,CAAC,CAClC,CASA,IAAMM,GAAW,CAACC,EAAUC,EAAgBC,EAAU,KAAS,CAC7D,GAAI,GAAGF,CAAG,IAAO,IACf,MAAI,CAAC,WAAWC,CAAS,GAAK,CAACC,EAAgB,IACxC,KAAK,OAAOD,EAAY,EAAG,GAAG,EAEvC,GAAI,CAACD,EAAK,MAAO,KAEjB,IAAMG,EAAS,WAAWH,CAAG,EACvBI,EAAOJ,EAAI,SAAS,EACpBK,EAAOF,EAAS,EAClBG,EAASF,EAEb,GAAIA,EAAK,YAAY,EAAE,SAAS,GAAG,EAAG,CACpC,IAAMG,EAAIH,EAAK,MAAM,gCAAgC,EAErD,GAAI,CAACG,EACH,OAAOP,EAAI,SAAS,EAGtB,IAAMQ,EAAKD,EAAE,CAAC,GAAK,IACbE,EAAKF,EAAE,CAAC,GAAK,GACbG,EAAOH,EAAE,CAAC,EACVI,EAAS,SAASJ,EAAE,CAAC,EAAG,EAAE,EAE5BK,EAAS,GACTC,EAAKJ,EAAG,UAAUE,CAAM,GAAK,GAGjC,GAFIE,IAAIA,EAAK,IAAIA,CAAE,IAEfH,IAAS,IAAK,CAChB,QAASI,EAAI,EAAGA,EAAIH,EAAQG,IAC1BF,GAAUH,EAAGK,CAAC,GAAK,IAErBR,EAASE,EAAKI,EAASC,CACzB,KAAO,CACL,IAAIE,EAAO,IACX,QAASD,EAAI,EAAGA,EAAIH,EAAQG,IAC1BF,GAAUJ,EAAGA,EAAG,OAASM,EAAI,CAAC,GAAK,KAAOF,EAExCJ,EAAG,OAASG,IACdI,EAAOP,EAAG,UAAU,EAAGA,EAAG,OAASG,CAAM,GAE3CL,EAAS,GAAGS,CAAI,IAAIH,CAAM,GAAGH,CAAE,EACjC,CACF,CAEA,GAAIR,GAAaC,EAAS,CACxB,IAAIc,EAAM,GAAGV,EAAO,MAAM,GAAG,EAAE,CAAC,CAAC,IAC3BW,EAAMX,EAAO,MAAM,GAAG,EAAE,CAAC,GAAK,GAEpC,QAASQ,EAAI,EAAGA,EAAIb,EAAWa,IAC7BE,GAAOC,EAAIH,CAAC,GAAK,IAEnBR,EAASU,CACX,CAEA,MAAO,GAAGX,EAAO,IAAM,EAAE,GAAGC,CAAM,EACpC,EAQO,SAASY,GAA2BC,EAAiBlB,EAAY,EAAW,CACjF,GAAIkB,IAAW,OACb,MAAO,GAGT,IAAMC,EAASD,GAAQ,YAAY,EAGnC,GAAIC,EAAO,SAAS,GAAG,EAAG,CAExB,GAAIA,EAAO,SAAS,GAAG,EACrB,OAAOrB,GAASqB,EAAQnB,CAAS,EAInC,GAAM,CAACoB,EAAMC,CAAW,EAAIF,EAAO,MAAM,GAAG,EACxCG,EAAcF,EACZG,EAAW,KAAK,IAAI,SAASF,EAAa,EAAE,CAAC,EAC/CG,EAAQ,GACRC,EAAgBH,EAAY,OAGhC,GAAIF,EAAK,SAAS,GAAG,EAAG,CACtB,GAAM,CAACM,EAASC,CAAQ,EAAIP,EAAK,MAAM,GAAG,EAC1CE,EAAcI,EAAUC,EACxBF,EAAgBC,EAAQ,MAC1B,CAGA,QAASb,EAAI,EAAGA,EAAIU,EAAWE,EAAeZ,IAC5CW,GAAS,IAIX,MAAO,KAAKA,CAAK,GAAGF,CAAW,GAAG,MAAM,EAAGtB,EAAY,CAAC,CAC1D,CAGA,OAAOkB,CACT,CJ1KO,IAAMU,GAA+B,IAC/BC,GAA+B,IAC/BC,GAAkC,IAClCC,GAAsC,IACtCC,GAA+B,IAC/BC,GAAe,gBACfC,GAAoB,+EACpBC,GAAa,MACbC,GAA+B,IAC/BC,GAA6B,6CAI7BC,GAAN,MAAMC,CAAW,CAQtB,OAAc,aAAaC,EAAmBC,EAAqC,CACjF,IAAIC,EAAe,OAAO,CAAC,EAC3B,OAAAF,EAAK,QAASG,GAAQ,CAChBF,IAAgBE,EAAI,YACtBD,GAAgB,OAAOC,EAAI,OAAO,EAEtC,CAAC,EACMD,CACT,CASA,OAAc,cAAcE,EAAkBC,EAAyC,CACrF,IAAMC,EAAqB,CAAC,EAC5B,OAAAD,EAAc,QAASE,GAAU,CAC3BC,GAAkBD,EAAM,SAAS,IAAMC,GAAkBJ,CAAQ,GACnEE,EAAM,KAAKC,CAAK,CAEpB,CAAC,EACMD,CACT,CAQA,OAAc,UAAUL,EAA6B,CACnD,OAAOQ,GAAyBR,CAAW,EAAE,eAAiBR,EAChE,CAUA,OAAO,qCACLa,EACAI,EACAC,EAAoB,CAAC,EACuD,CAC5E,IAAMC,EAAiBb,EAAW,kCAAkCO,EAAOI,EAAQC,CAAO,EACpFE,EAAcD,EAAe,cAAc,IAAKE,GAASA,EAAK,cAAc,EAC5EC,EAAcH,EAAe,eAC7BI,EAAcJ,EAAe,cAAc,IAAKE,GAASA,EAAK,QAAQ,SAAS,CAAC,EACtF,MAAO,CAAE,YAAAD,EAAa,YAAAE,EAAa,YAAAC,CAAY,CACjD,CAUA,OAAO,kCACLV,EACAI,EACAC,EAAoB,CAAC,EACwC,CAC7D,IAAMM,EAAclB,EAAW,cAAcO,EAAM,OAAQY,GAAM,CAACP,EAAQ,SAASO,EAAE,cAAc,CAAC,CAAC,EAE/FC,EAAQpB,EAAW,sBAAsBkB,CAAW,EAE1D,GAAIE,EAAQT,EACV,MAAO,CAAE,cAAe,CAAC,EAAG,eAAgBO,CAAY,EAE1D,GAAIE,IAAUT,EACZ,MAAO,CAAE,cAAeO,EAAa,eAAgB,CAAC,CAAE,EAG1D,IAAIG,EAAM,OAAO,CAAC,EACZC,EAAgB,CAAC,EACjBC,EAAiB,CAAC,GAAGL,CAAW,EACtC,KAAOG,EAAMD,GAAO,CAClB,IAAMI,EAASb,EAASU,EAClBI,EAAyCF,EAAe,UAAWJ,GAAMA,EAAE,SAAWK,CAAM,EAClG,GAAIC,IAA2C,GAAI,CACjDH,EAAc,KAAKC,EAAeE,CAAsC,CAAC,EACzEF,EAAe,OAAOE,EAAwC,CAAC,EAC/D,KACF,CAEA,IAAMC,EAAyBH,EAAe,IAAI,EAC9CG,EAAuB,QAAU,IACnCJ,EAAc,KAAKI,CAAsB,EACzCL,GAAOK,EAAuB,QAElC,CACA,MAAO,CAAE,cAAe1B,EAAW,cAAcsB,CAAa,EAAG,eAAgBtB,EAAW,cAAcuB,CAAc,CAAE,CAC5H,CAQA,OAAO,cAAchB,EAAiC,CACpD,OAAOA,EAAM,KAAK,CAACoB,EAAGC,IAAOD,EAAE,QAAUC,EAAE,QAAU,GAAKD,EAAE,QAAUC,EAAE,QAAU,EAAI,CAAE,CAC1F,CAEA,OAAO,iBAAiBrB,EAAiC,CACvD,OAAOA,EAAM,KAAK,CAACoB,EAAGC,IAAOD,EAAE,QAAUC,EAAE,QAAU,GAAKD,EAAE,QAAUC,EAAE,QAAU,EAAI,CAAE,CAC1F,CAQA,OAAO,sBAAsBrB,EAA4B,CACvD,OAAOA,EAAM,OAAO,CAACsB,EAAYV,IAAMU,EAAaV,EAAE,QAAS,OAAO,CAAC,CAAC,CAC1E,CAEA,OAAc,mBACZW,EACAC,EACApB,EACAN,EACA2B,EAAc,GACdC,EAAY,GACK,CACjB,IAAMC,EAA0BlC,EAAW,cAAcK,EAAU0B,CAAQ,EAE3E,GAAIpB,IAAW,OAAO,CAAC,EACrB,OAAO,KAAK,mBAAmBoB,EAAUD,EAAIzB,EAAU2B,CAAW,EAEpE,IAAMG,EAAcnC,EAAW,sBAAsBkC,CAAU,EAC/D,GAAIC,EAAcxB,EAChB,MAAM,IAAI,MAAM,cAAcwB,CAAW,iCAAiC9B,CAAQ,aAAaM,CAAM,GAAG,EAG1G,OAAO,KAAK,UAAUmB,EAAIC,EAAUG,EAAYvB,EAAQN,EAAU2B,EAAaC,CAAS,CAC1F,CAEA,OAAc,qBAAqBtB,EAAgBN,EAAkByB,EAA4C,CAC/G,OAAInB,IAAW,OAAO,CAAC,GACjBX,EAAW,UAAUK,CAAQ,EACxByB,EAAG,IAAIM,GAAgB,CAAE,QAASzB,EAAQ,WAAY,EAAM,CAAC,CAAC,EAIlEmB,EAAG,IAAIM,GAAgB,CAAE,QAASzB,EAAQ,KAAMN,CAAS,CAAC,CAAC,CACpE,CAEA,OAAe,gBACbyB,EACAC,EACAG,EACAvB,EACAN,EACA4B,EAAY,GACK,CACjB,GAAIjC,EAAW,UAAUK,CAAQ,EAAG,CAClC,IAAMgC,EAAaP,EAAG,WAAWA,EAAG,IAAK,CAACA,EAAG,KAAK,IAAInB,CAAM,CAAC,CAAC,EAC9D,MAAO,CACL,eAAgB,CAAC,EACjB,YAAa0B,EACb,aAAcN,EACd,mBAAoBpB,EAAO,SAAS,EACpC,kBAAmB,GACnB,qBAAsBmB,EAAG,GAC3B,CACF,CAEA,GAAM,CAAE,qBAAAQ,EAAsB,YAAAC,EAAa,mBAAAC,EAAoB,aAAAC,EAAc,eAAAC,CAAe,EAAI,KAAK,mBACnGZ,EACAnB,EACAuB,EACAD,CACF,EAEA,OAAIA,EACK,CACL,YAAaH,EAAG,YAAY,CAAE,SAAU,CAACS,CAAW,CAAE,CAAC,EACvD,eAAgBG,EAChB,aAAcD,EACd,mBAAoBD,EACpB,kBAAmB,GACnB,qBAAsBF,CACxB,EAGK,CACL,eAAgBI,EAChB,YAAaZ,EAAG,YAAY,CAAE,SAAUY,EAAe,IAAKC,GAAOb,EAAG,OAAOa,CAAE,CAAC,CAAE,CAAC,EACnF,aAAcF,EACd,mBAAAD,EACA,kBAAmB,EACrB,CACF,CAEA,OAAe,aACbV,EACAI,EACAvB,EACAN,EACA4B,EAAY,GACK,CACjB,GAAIjC,EAAW,UAAUK,CAAQ,EAAG,CAClC,GAAIM,IAAW,IAAMuB,EAAW,OAAS,EAAG,CAC1C,IAAMU,EAAsB5C,EAAW,qCAAqCkC,EAAYvB,CAAM,EAE9F,MAAO,CACL,eAAgBiC,EAAoB,YACpC,YAAad,EAAG,OAAOc,EAAoB,YAAY,CAAC,CAAC,EACzD,aAAcA,EAAoB,YAClC,mBAAoBA,EAAoB,YAAY,CAAC,EACrD,kBAAmB,EACrB,CACF,CACA,IAAMA,EAAsB5C,EAAW,qCAAqCkC,EAAYvB,CAAM,EACxF0B,EAAaP,EAAG,WAAWA,EAAG,IAAK,CAACA,EAAG,KAAK,IAAInB,CAAM,CAAC,CAAC,EAE9D,MAAO,CACL,eAAgB,CAAC,EACjB,YAAa0B,EACb,aAAcO,EAAoB,YAClC,mBAAoBjC,EAAO,SAAS,EACpC,kBAAmB,GACnB,qBAAsBmB,EAAG,GAC3B,CACF,CAEA,OAAO,KAAK,mBAAmBA,EAAInB,EAAQuB,EAAYD,CAAS,CAClE,CAEA,OAAe,mBAAmBH,EAAiBnB,EAAgBuB,EAAyBD,EAAqC,CAC/H,IAAMW,EAAsB5C,EAAW,qCAAqCkC,EAAYvB,CAAM,EACxFkC,EAA0BD,EAAoB,YAAY,OAAO,CAACjB,EAAGC,IAAM,OAAOD,CAAC,EAAI,OAAOC,CAAC,EAAG,CAAC,EAAE,SAAS,EAC9GkB,EAAgBF,EAAoB,YAEpC,CAACG,EAAc,GAAGC,CAAW,EAAIF,EACjCG,EAAqBnB,EAAG,OAAOiB,CAAY,EAE7CG,EAAkBD,EAChBE,EAAmBP,EAAoB,YAAY,OAAO,CAACjB,EAAGC,IAAM,OAAOD,CAAC,EAAI,OAAOC,CAAC,EAAG,CAAC,EAAE,SAAS,EACzGwB,EACJ,OAAIJ,EAAY,OAAS,GACvBlB,EAAG,WACDmB,EACAD,EAAY,IAAKK,GAASvB,EAAG,OAAOuB,CAAI,CAAC,CAC3C,EAGEpB,GAAa,OAAOY,CAAuB,EAAI,OAAOlC,CAAM,IAC9DuC,EAAapB,EAAG,WAAWmB,EAAoB,CAACnB,EAAG,KAAK,IAAInB,CAAM,CAAC,CAAC,EACpEyC,EAAqBH,GAGhB,CACL,qBAAsBG,EACtB,YAAaF,EACb,mBAAoBC,EACpB,aAAcP,EAAoB,YAClC,eAAgBA,EAAoB,YACpC,kBAAmB,EACrB,CACF,CAEA,OAAe,UACbd,EACAC,EACAG,EACAvB,EACAN,EACA2B,EAAc,GACdC,EAAY,GACK,CACjB,OAAID,EACK,KAAK,gBAAgBF,EAAIC,EAAUG,EAAYvB,EAAQN,EAAU4B,CAAS,EAG5E,KAAK,aAAaH,EAAII,EAAYvB,EAAQN,EAAU4B,CAAS,CACtE,CAEA,OAAe,mBAAmBF,EAAuBD,EAAiBzB,EAAkB2B,EAAc,GAAuB,CAC/H,IAAMsB,EAAW,KAAK,sBAAsBxB,EAAIzB,CAAQ,EACpD6C,EACJ,OAAIlB,EACFkB,EAAapB,EAAG,YAAY,CAAE,SAAU,CAACwB,CAAQ,CAAE,CAAC,EAEpDJ,EAAaI,EAGR,CACL,YAAaJ,EACb,aAAcnB,EACd,eAAgB,CAAC,EACjB,kBAAmB,GACnB,mBAAoB,GACtB,CACF,CAEA,OAAc,2BACZD,EACAC,EACAwB,EACAlD,EACA2B,EAAc,GACdC,EAAY,GACK,CACjB,IAAMC,EAA0BlC,EAAW,cAAcK,EAAU0B,CAAQ,EAC3E,GAAIwB,EAAQ,eAAiB,OAAO,CAAC,EACnC,OAAIrB,EAAW,OAAS,EACf,KAAK,UAAUJ,EAAI,CAAC,GAAGC,CAAQ,EAAG,CAAC,GAAGG,CAAU,EAAGqB,EAAQ,aAAclD,EAAU2B,EAAaC,CAAS,EAE3G,KAAK,mBAAmBF,EAAUD,EAAIzB,EAAU2B,CAAW,EAGpE,IAAMG,EAAcnC,EAAW,sBAAsBkC,CAAU,EAE/D,GAAIC,GAAeoB,EAAQ,aACzB,OAAO,KAAK,UAAUzB,EAAI,CAAC,GAAGC,CAAQ,EAAG,CAAC,GAAGG,CAAU,EAAGqB,EAAQ,aAAclD,EAAU2B,EAAaC,CAAS,EAGlH,GAAIE,EAAcoB,EAAQ,cACxB,MAAM,IAAI,MAAM,cAAcpB,CAAW,iCAAiC9B,CAAQ,aAAakD,EAAQ,aAAa,GAAG,EAGzH,OAAO,KAAK,UAAUzB,EAAI,CAAC,GAAGC,CAAQ,EAAG,CAAC,GAAGG,CAAU,EAAGqB,EAAQ,cAAelD,EAAU2B,EAAaC,CAAS,CACnH,CAEA,YAAc,sBAAwB,CAACuB,EAAkBnD,IAChDmD,EAAI,SAAS,CAClB,OAAQ,kBACR,cAAe,CAACnD,CAAQ,CAC1B,CAAC,EAGH,OAAc,YAAYoD,EAAoCpD,EAAkByB,EAA4C,CAO1H,OANaA,EAAG,SAAS,CACvB,OAAQ,0BACR,cAAe,CAACzB,CAAQ,EACxB,UAAW,CAACoD,CAAO,CACrB,CAAC,CAGH,CAEA,OAAc,mBAAmBC,EAA2B/C,EAA2C,CACrG,IAAMgD,EAAUD,EAAU,kBAAkB,KAAML,GAC5C,CAACA,EAAK,MAAQO,EAAEP,EAAK,MAAM,EAAE,GAAG1C,CAAM,GACxC0C,EAAK,KAAO,GACL,IAEF,EACR,EACD,OAAKM,EAGEA,EAAQ,eAFNE,kBAAiD,sBAAsBlD,CAAM,IAAI+C,EAAU,SAAS,EAAE,CAGjH,CAEA,OAAc,oBAAoB5B,EAAiBgC,EAA4BzD,EAAkB0D,EAAqC,CACpI,IAAM7B,EAAalC,EAAW,cAAcK,EAAUyD,CAAa,EACnE,GAAI9D,EAAW,UAAUK,CAAQ,EAAG,CAClC,IAAM2D,EAAclC,EAAG,WACrBA,EAAG,IACHiC,EAAU,IAAKpD,GAAWmB,EAAG,KAAK,IAAInB,CAAM,CAAC,CAC/C,EAUA,MAAO,CACL,kBATsBoD,EAAU,IAAI,CAACpD,EAAQsD,KACtC,CACL,eAAgBD,EAAYC,CAAK,EACjC,OAAQtD,EAAO,SAAS,EACxB,KAAM,EACR,EACD,EAIC,UAAWN,EACX,aAAc6B,CAChB,CACF,CACA,IAAMgC,EAAcH,EAAU,OAAO,CAACI,EAAKC,IAASD,EAAMC,EAAM,OAAO,CAAC,CAAC,EACnExB,EAAsB5C,EAAW,qCAAqCkC,EAAYgC,CAAW,EACnG,GAAItB,EAAoB,YAAY,SAAW,EAC7C,OAAOiB,yBAEL,uBAAuBxD,CAAQ,WAAW6D,CAAW,WAAWlE,EAAW,sBAAsBkC,CAAU,CAAC,EAC9G,EAEF,GAAM,CAACgB,EAAY,GAAGmB,CAAU,EAAIzB,EAAoB,YACpDyB,EAAW,OAAS,GACtBvC,EAAG,WAAWoB,EAAY,CAAC,GAAGmB,CAAU,CAAC,EAG3C,IAAML,EAAclC,EAAG,WACrBoB,EACAa,EAAU,IAAKpD,GAAWmB,EAAG,KAAK,IAAInB,CAAM,CAAC,CAC/C,EAUA,MAAO,CACL,kBATsBoD,EAAU,IAAI,CAACpD,EAAQsD,KACtC,CACL,eAAgBD,EAAYC,CAAK,EACjC,OAAQtD,EAAO,SAAS,EACxB,KAAM,EACR,EACD,EAIC,aAAciC,EAAoB,YAClC,UAAWvC,CACb,CACF,CACF,EK/bA,IAAMiE,GAAa,sCAEZ,SAASC,GAAaC,EAAqB,CAChD,OAAQA,EAAI,WAAW,IAAI,EAAiBA,EAAb,KAAKA,CAAG,EACzC,CAEO,SAASC,GAAgBD,EAAqB,CACnD,OAAOA,EAAI,WAAW,IAAI,EAAI,GAAGA,EAAI,MAAM,CAAC,CAAC,GAAKA,CACpD,CAEO,SAASE,GAAYC,EAAaC,EAAQ,EAAGC,EAAM,EAAG,CAC3D,IAAMC,EAAO,KAAK,IAAIF,EAAO,CAAC,EACxBG,EAAO,KAAK,IAAIF,EAAK,CAAC,EAE5B,MAAO,GAAGF,EAAI,MAAM,EAAGG,EAAO,CAAC,CAAC,QAAQH,EAAI,MAAM,CAACI,CAAI,CAAC,EAC1D,CAEO,SAASC,GAAaC,EAAiBL,EAAQ,EAAGC,EAAM,EAAG,CAChE,OAAOH,GAAYH,GAAaU,CAAO,EAAGL,EAAOC,CAAG,CACtD,CAEO,SAASK,GAAaD,EAAcE,EAAoC,CAAE,YAAa,EAAK,EAAY,CAC7G,GAAI,OAAOF,GAAY,SACrB,MAAO,GAET,IAAIN,EAAMM,EAEV,GAAIE,EAAQ,YAAa,CACvB,GAAI,CAACF,EAAQ,WAAW,IAAI,EAC1B,MAAO,GAETN,EAAMA,EAAI,UAAU,CAAC,CACvB,CAEA,OAAOL,GAAW,KAAKK,CAAG,CAC5B,CAMO,SAASS,GAASC,EAAgB,CACvC,GAAI,CAAC,OAAO,SAASA,CAAC,EACpB,GAAI,MAAM,QAAQA,CAAC,EACjBA,EAAI,OAAO,KAAKA,CAAC,UACR,OAAOA,GAAM,SAClB,QAAQ,YAAYA,CAAC,EACvBA,EAAI,OAAO,KAAK,QAAQ,UAAU,QAAQ,eAAeA,CAAC,CAAC,EAAG,KAAK,EAEnEA,EAAI,OAAO,KAAKA,CAAC,UAEV,OAAOA,GAAM,SACtBA,EAAI,QAAQ,YAAYA,CAAC,UAChBA,GAAM,KACfA,EAAI,OAAO,YAAY,CAAC,UACfA,EAAE,QAEXA,EAAI,OAAO,KAAKA,EAAE,QAAQ,CAAC,MAE3B,OAAM,IAAI,MAAM,cAAc,EAGlC,OAAOA,CACT,CAEO,SAASC,GAAYC,EAAwB,CAClD,OAAOhB,GAAaa,GAASG,CAAM,EAAE,SAAS,KAAK,CAAC,CACtD,CAKO,SAASC,GAAYC,EAAoB,CAC9C,IAAMF,EAAS,IAAI,YAAY,CAAC,EAC1BG,EAAO,IAAI,SAASH,CAAM,EAEhC,QAAS,EAAI,EAAG,EAAIE,EAAW,OAAQ,IACrCC,EAAK,SAAS,EAAGD,EAAW,WAAW,CAAC,CAAC,EAK3C,OAFeC,EAAK,UAAU,EAAG,EAAI,CAGvC,CAEO,SAASC,GAAShB,EAAa,CACpC,IAAIiB,EACAC,EACAC,EACAC,EACAC,EACJJ,EAAM,GACN,IAAMK,EAAMtB,EAAI,OAEhB,IADAkB,EAAI,EACGA,EAAII,GAET,OADAH,EAAInB,EAAI,WAAWkB,GAAG,EACdC,GAAK,EAAG,CACd,IAAK,GACL,IAAK,GACL,IAAK,GACL,IAAK,GACL,IAAK,GACL,IAAK,GACL,IAAK,GACL,IAAK,GACHF,GAAOjB,EAAI,OAAOkB,EAAI,CAAC,EACvB,MACF,IAAK,IACL,IAAK,IACHE,EAAQpB,EAAI,WAAWkB,GAAG,EAC1BD,GAAO,OAAO,cAAeE,EAAI,KAAS,EAAMC,EAAQ,EAAK,EAC7D,MACF,IAAK,IACHA,EAAQpB,EAAI,WAAWkB,GAAG,EAC1BG,EAAQrB,EAAI,WAAWkB,GAAG,EAC1BD,GAAO,OAAO,cAAeE,EAAI,KAAS,IAAQC,EAAQ,KAAS,GAAOC,EAAQ,KAAS,CAAE,EAC7F,KACJ,CAEF,OAAOJ,CACT,CAEO,SAASM,GAAYvB,EAAa,CACvC,IAAIwB,EAAM,GACJC,EAAS3B,GAAgBE,CAAG,EAE5BsB,EAAMG,EAAO,OAAS,EAC5B,QAAS,EAAI,EAAG,EAAIH,EAAK,IACvBE,GAAO,OAAO,aAAa,SAASC,EAAO,OAAO,EAAI,EAAG,CAAC,EAAG,EAAE,CAAC,EAElE,OAAOT,GAASQ,CAAG,CACrB,CAEO,SAASE,GAAyBC,EAAyB,CAChE,GAAIA,EAAM,SAAW,EACnB,MAAM,IAAI,MAAM,+BAA+B,EAEjD,IAAMC,EAAYD,EACf,IAAKE,GAAMA,EAAE,SAAS,EAAE,EAAE,SAAS,EAAG,GAAG,CAAC,EAC1C,QAAQ,EACR,KAAK,EAAE,EACV,OAAO,OAAO,KAAKD,CAAS,EAAE,EAAE,SAAS,CAC3C,CNzIA,IAAME,GAAQ,EACRC,GAAY,EACZC,GAAe,EAErB,SAASC,GAAIC,EAAWC,EAAW,CACjC,OAAID,IAAMC,EACDL,GAELI,EAAIC,EACCJ,GAEFC,EACT,CAEA,SAASI,GAAQC,EAAiBC,EAAiB,CACjD,IAAIC,EAAI,EAEFC,EAAMH,EAAQ,QAAUC,EAAQ,OAASD,EAAQ,OAASC,EAAQ,OAElEG,EAASR,GAAII,EAAQ,OAAQC,EAAQ,MAAM,EACjD,KAAOC,EAAIC,GAAK,CACd,IAAME,EAAUT,GAAII,EAAQ,WAAWE,CAAC,EAAGD,EAAQ,WAAWC,CAAC,CAAC,EAEhE,GADAA,GAAK,EACDG,IAAY,EACd,OAAOA,CAEX,CAEA,OAAOD,CACT,CAEO,SAASE,GAAgBN,EAAiBC,EAAiB,CAChE,OAAOF,GAAQC,EAASC,CAAO,IAAMP,EACvC,CAKO,SAASa,GAAYC,KAAoBC,EAAiC,CAC/E,IAAMC,EAAqB,MAAM,QAAQD,EAAKA,EAAK,OAAS,CAAC,CAAC,EAAKA,EAAK,IAAI,EAAiB,CAAC,EAG1FE,EAFW,CAACH,EAAS,GAAGC,CAAI,EAAE,OAAO,OAAO,EAEpB,KAAK,IAAI,EAErC,OAAIC,GAAYA,EAAS,SACvBC,GAAU,IAAID,EAAS,KAAK,IAAI,CAAC,KAG5BC,CACT,CAEO,SAASC,GAAuBC,EAAc,CACnD,OAAOA,EAAK,MAAM,IAAI,EAAE,CAAC,CAC3B,CAEO,SAASC,GAAyBD,EAA4B,CACnE,GAAI,CACF,IAAIE,EAAQF,EAAK,QAAQ,MAAO,EAAE,EAG5BH,EADiBK,EAAM,MAAM,SAAS,IACV,CAAC,GAAG,MAAM,iCAAiC,EAC7E,GAAIL,EAAU,CACZK,EAAQA,EAAM,MAAM,EAAGA,EAAM,QAAQ,GAAG,CAAC,EAEzC,IAAMC,EAA0B,CAC9B,GAFUF,GAAyBC,CAAK,EAGxC,eAAgBL,EAAS,IAAKO,GAASH,GAAyBG,CAAI,EAAE,cAAc,CACtF,EACA,OAAAD,EAAU,eAAiBA,EAAU,eAAe,IAAKC,GAChDC,GAAW,UAAUD,CAAI,EAAIA,EAAOH,GAAyBG,CAAI,EAAE,cAC3E,EACDD,EAAU,eAAiBT,GAAYS,EAAU,aAAcA,EAAU,cAAc,EAChFA,CACT,CACA,IAAMG,EAAQJ,EAAM,MAAM,IAAI,EAIxBC,EAA0B,CAC9B,aAAcD,EACd,QAJgBA,IAAUK,IAAgBL,IAAUM,GAI/B,MAAQC,GAAqBH,EAAM,CAAC,CAAC,EAC1D,OAAQA,EAAM,CAAC,EACf,KAAMA,EAAM,CAAC,EACb,eAAgB,CAAC,EACjB,eAAgB,EAClB,EACA,OAAAH,EAAU,aAAe,GAAGA,EAAU,OAAO,KAAKA,EAAU,MAAM,KAAKA,EAAU,IAAI,GACrFA,EAAU,eAAiBT,GAAYS,EAAU,aAAcA,EAAU,cAAc,EAChFA,CACT,MAAgB,CACd,MAAO,CACL,aAAcH,EACd,QAAS,GACT,OAAQ,GACR,KAAM,GACN,eAAgB,CAAC,EACjB,eAAgBA,CAClB,CACF,CACF,CAEO,SAASU,GAAkBC,EAA0B,CAC1D,OAAOV,GAAyBU,CAAQ,EAAE,cAC5C,CAEO,SAASC,GAAeC,EAAuB,CACpD,OAAIA,EAAM,YAAY,EAAE,WAAW,IAAI,EAC9BJ,GAAqBI,CAAK,EAE5BA,CACT,CASO,IAAMC,GAAc,CAACH,EAAkBI,EAAe,KAAS,CACpE,IAAMC,EAAML,EAAS,MAAM,IAAI,EACzBhB,EAAUqB,EAAI,MAAM,EACtBC,EAAmBR,GAAqBd,CAAO,EACnD,OAAIoB,IACFE,EAAmBC,GAAgBD,CAAgB,GAE9C,GAAGA,CAAgB,KAAKD,EAAI,KAAK,IAAI,CAAC,EAC/C,EAOO,SAASG,GAAoBC,EAAW,CAC7C,QAAWC,KAAOD,EAAM,CACtB,IAAMpB,EAAO,OAAOoB,EAAKC,CAAG,EAC5B,GAAIrB,IAAS,SACXmB,GAAoBC,EAAKC,CAAG,CAAC,UACpBrB,IAAS,SAAU,CAC5B,IAAMa,EAAQO,EAAKC,CAAG,EAClBR,GAAS,CAACA,EAAM,SAAS,IAAI,IAC/BO,EAAKC,CAAG,EAAIT,GAAeC,CAAK,EAEpC,CACF,CACF,CAQO,SAASS,GAA0BC,EAAgCC,EAA0B,MAAuB,CACzH,GAAID,aAAqB,WAAY,CACnC,IAAMF,EAAM,OAAO,KAAKE,CAAS,EACjC,OAAOE,GAAe,cAAc,IAAI,WAAWJ,CAAG,CAAC,CACzD,CAEA,IAAMK,EAASF,IAAU,MAAQG,GAAQJ,CAAS,EAAIK,GAAWL,CAAS,EAC1E,OAAOE,GAAe,cAAcC,CAAM,CAC5C,CAQO,SAASG,GAA4BN,EAAgCC,EAA0B,MAAyB,CAC7H,GAAID,aAAqB,WAAY,CACnC,IAAMF,EAAM,OAAO,KAAKE,CAAS,EACjC,OAAOO,GAAiB,cAAc,IAAI,WAAWT,CAAG,CAAC,CAC3D,CACA,IAAMK,EAASF,IAAU,MAAQO,GAAQR,CAAS,EAAIS,GAAQT,CAAS,EACvE,OAAOO,GAAiB,cAAcJ,CAAM,CAC9C,CF3JO,IAAMO,GAAN,cAAwBC,EAAU,CAAlC,kCACL,KAAS,OAAwC,CAAC,EAElD,MAAM,kBAAkBC,EAAgD,CACtE,IAAMC,EAAW,iBAAiBD,CAAQ,GACpCE,EAAa,KAAK,SAAuBD,CAAQ,EACvD,GAAIC,EACF,OAAOA,EAET,IAAMC,EAAM,MAAM,KAAK,gBAAgB,CAAE,SAAAH,CAAS,CAAC,EACnD,YAAK,YAAYC,EAAUE,CAAG,EACvBA,CACT,CAQA,MAAM,0BAA0BC,EAA6D,CAC3F,IAAIC,EACJ,GAAI,CACFA,EAAW,MAAM,KAAK,oBAAoB,CACxC,OAAAD,EACA,QAAS,CACP,WAAY,GACZ,YAAa,GACb,mBAAoB,GACpB,UAAW,GACX,kBAAmB,EACrB,CACF,CAAC,CACH,MAAgB,CACdC,EAAW,MAAM,KAAK,oBAAoB,CACxC,OAAAD,EACA,QAAS,CACP,WAAY,GACZ,YAAa,EACf,CACF,CAAC,CACH,CAEA,OAAOC,CACT,CAQA,MAAM,kBAAkBC,EAAuBC,EAAiC,MAA+B,CAC7G,IAAIC,EAAc,CAAC,EACfC,EAAc,GACZC,EAAWH,IAAmB,MAChCI,EAAaD,EAAW,KAAOH,EAAe,OAElD,EAAG,CACD,IAAMJ,EAAuB,MAAM,KAAK,YAAY,CAClD,MAAAG,EACA,OAAQK,EACR,MAAOD,EAAW,KAAOH,EAAe,KAC1C,CAAC,EACGJ,EAAI,MACNK,EAAS,CAAC,GAAGA,EAAQ,GAAGL,EAAI,IAAI,EAChCM,EAAcN,EAAI,YAClBQ,EAAaR,EAAI,YAEjBM,EAAc,EAElB,OAASC,GAAYD,GAErB,MAAO,CAAE,KAAMD,EAAQ,YAAaG,EAAY,cAAeF,CAAY,CAC7E,CAEA,MAAM,6BACJG,EACAL,EAAiC,MACjCM,EAAuD,YACP,CAChD,IAAIL,EAAc,CAAC,EACfC,EAAc,GACZC,EAAWH,IAAmB,MAChCI,EAAaD,EAAW,KAAOH,EAAe,OAElD,EAAG,CACD,IAAMJ,EAAoC,MAAM,KAAK,uBAAuB,CAC1E,OAAAS,EACA,OAAQD,EACR,MAAAE,EACA,MAAOH,EAAW,KAAOH,EAAe,MACxC,QAAS,CAAE,WAAY,EAAK,CAC9B,CAAC,EACGJ,EAAI,MACNK,EAAS,CAAC,GAAGA,EAAQ,GAAGL,EAAI,IAAI,EAChCM,EAAcN,EAAI,YAClBQ,EAAaR,EAAI,YAEjBM,EAAc,EAElB,OAASC,GAAYD,GAErB,MAAO,CAAE,KAAMD,EAAQ,YAAaG,EAAY,cAAeF,CAAY,CAC7E,CASA,MAAM,sBACJK,EACAR,EACAC,EAAiC,MACT,CACxB,IAAIC,EAAc,CAAC,EACfC,EAAc,GACZC,EAAWH,IAAmB,MAChCI,EAAaD,EAAW,KAAOH,EAAe,OAClD,EAAG,CACD,IAAMJ,EAAgC,MAAM,KAAK,gBAAgB,CAC/D,MAAAW,EACA,GAAGR,EACH,OAAQK,EACR,MAAOD,EAAW,KAAOH,EAAe,KAC1C,CAAC,EACGJ,EAAI,MACNK,EAAS,CAAC,GAAGA,EAAQ,GAAGL,EAAI,IAAI,EAChCM,EAAcN,EAAI,YAClBQ,EAAaR,EAAI,YAEjBM,EAAc,EAElB,OAASC,GAAYD,GAErB,MAAO,CAAE,KAAMD,EAAQ,YAAaG,EAAY,cAAeF,CAAY,CAC7E,CAQA,MAAM,uBAAuBM,EAA2BR,EAAiC,MAA+B,CACtH,IAAIC,EAAc,CAAC,EACfC,EAAc,GACZC,EAAWH,IAAmB,MAChCI,EAAaD,EAAW,KAAOH,EAAe,OAClD,EAAG,CACD,IAAMJ,EAAwB,MAAM,KAAK,iBAAiB,CACxD,SAAAY,EACA,OAAQJ,EACR,MAAOD,EAAW,KAAOH,EAAe,KAC1C,CAAC,EAEGJ,EAAI,MACNK,EAAS,CAAC,GAAGA,EAAQ,GAAGL,EAAI,IAAI,EAChCM,EAAcN,EAAI,YAClBQ,EAAaR,EAAI,YAEjBM,EAAc,EAElB,OAASC,GAAYD,GAErB,MAAO,CAAE,KAAMD,EAAQ,YAAaG,EAAY,cAAeF,CAAY,CAC7E,CASA,MAAM,gBAAgBO,EAAwBC,EAAgCC,EAAQ,GAAkC,CACtH,IAAIC,EAA2C,CAAC,EAEhD,GAAI,CACF,QAASC,EAAI,EAAGA,EAAI,KAAK,KAAKJ,EAAI,OAASE,CAAK,EAAGE,IAAK,CACtD,IAAMjB,EAAM,MAAM,KAAK,gBAAgB,CACrC,IAAKa,EAAI,MAAMI,EAAIF,EAAOA,GAASE,EAAI,EAAE,EACzC,QAAAH,CACF,CAAC,EACDE,EAAsB,CAAC,GAAGA,EAAqB,GAAGhB,CAAG,CACvD,CACF,OAASkB,EAAO,CACd,QAAQ,IAAIA,CAAK,CACnB,CAEA,OAAOF,CACT,CAQA,MAAM,iBAAiBG,EAAkC,CACvD,GAAM,CAAE,OAAAC,CAAO,EAAID,EAAG,UAEtB,GAAIC,IAAW,OACb,MAAM,MAAM,qBAAqB,EAGnC,IAAMC,EAAY,MAAM,KAAK,2BAA2B,CACtD,iBAAkBF,EAClB,OAAAC,CACF,CAAC,EACK,CAAE,QAAAE,CAAQ,EAAID,EAAU,QAG9B,OADoB,OAAOC,EAAQ,eAAe,EAAI,OAAOA,EAAQ,WAAW,EAAI,OAAOA,EAAQ,aAAa,CAElH,CASA,MAAM,gBAAgBC,EAA4CJ,EAAmE,CACnI,GAAI,CASF,OARuB,MAAM,KAAK,0BAA0B,CAC1D,YAAaA,EACb,OAAQI,EACR,QAAS,CACP,YAAa,GACb,WAAY,EACd,CACF,CAAC,CAEH,OAASL,EAAO,CACd,QAAQ,IAAI,UAAWA,CAAK,CAC9B,CAEF,CASA,MAAM,0BAA0BC,EAAiBK,EAAgF,CAC/H,GAAI,CACF,OAAAL,EAAG,UAAUK,CAAiB,EACV,MAAM,KAAK,uBAAuB,CACpD,iBAAkB,MAAML,EAAG,MAAM,CAC/B,OAAQ,IACV,CAAC,CACH,CAAC,CAMH,OAASD,EAAO,CACd,QAAQ,IAAI,mCAAoCA,CAAK,CACvD,CAGF,CAEA,MAAM,UAAUK,EAA4CJ,EAAiBM,EAAiC,CAC5G,GAAIA,EAAU,CACZ,IAAMzB,EAAM,MAAM,KAAK,0BAA0BmB,EAAIO,GAAoBH,EAAQ,aAAa,EAAE,aAAa,CAAC,CAAC,EAE/G,OAAOvB,EAAK,OAAO,OAAS,EAAIA,EAAK,OAASA,CAChD,KAEE,QADiB,MAAM,KAAK,gBAAgBuB,EAASJ,CAAE,CAG3D,CASA,MAAM,mBAAmBQ,EAAoB9B,EAAgD,CAC3F,IAAM+B,EAA4B,CAAC,EAC/BpB,EAAwC,KAE5C,OAAa,CACX,IAAMqB,EAAqB,MAAOhC,EAC9B,KAAK,SAAS,CACZ,MAAO8B,EACP,SAAA9B,EACA,OAAQW,CACV,CAAC,EACD,KAAK,YAAY,CACf,MAAOmB,EACP,OAAQnB,CACV,CAAC,GAaL,GAXAqB,EAAc,KAAK,QAASC,GAAc,CACpC,OAAOA,EAAK,OAAO,EAAI,GACzBF,EAAa,KAAK,CAChB,UAAWG,GAAyBD,EAAK,QAAQ,EAAE,eACnD,eAAgBA,EAAK,aACrB,QAAS,OAAOA,EAAK,OAAO,CAC9B,CAAC,CAEL,CAAC,EACDtB,EAAaqB,EAAc,WAEvB,CAACA,EAAc,YACjB,KAEJ,CACA,OAAOD,CACT,CASA,MAAM,qBAAqBD,EAAoB9B,EAAkD,CAC/F,IAAImC,EAAgC,CAAC,EAErC,OAAInC,EAKFmC,EAAiB,CAJL,MAAM,KAAK,WAAW,CAChC,MAAOL,EACP,SAAA9B,CACF,CAAC,CACoB,EAKrBmC,EAAiB,CAAC,GAHN,MAAM,KAAK,eAAe,CACpC,MAAOL,CACT,CAAC,CACuB,EAEnBK,CACT,CASQ,YAAYC,EAAaC,EAAmBC,EAAO,MAAoB,CAC7E,IAAIC,EAAY,KAAK,OAAOH,CAAG,EAC3BG,GACFA,EAAU,YAAcC,GAAcF,CAAI,EAC1CC,EAAU,MAAQF,GAElBE,EAAY,IAAIE,GAAcJ,EAAMG,GAAcF,CAAI,CAAC,EAEzD,KAAK,OAAOF,CAAG,EAAIG,CACrB,CASQ,SAAYH,EAAaM,EAAe,GAAsB,CACpE,IAAMH,EAAY,KAAK,OAAOH,CAAG,EAC3BO,EAAUJ,GAAW,QAAQ,EACnC,GAAI,CAACG,GAAgBC,EACnB,OAAOJ,EAAU,MAEdI,GACH,OAAO,KAAK,OAAOP,CAAG,CAG1B,CACF,EDrZO,IAAeQ,GAAf,KAAoD,CASzD,YAAYC,EAAY,CARxB,KAAS,OAAwC,CAAC,EAElD,KAAQ,eAAiC,GAOvC,KAAK,YAAc,IAAIC,GAAU,CAAE,IAAKD,EAAQ,YAAa,CAAC,EAE9DE,GAAoBF,CAAO,EAC3B,KAAK,YAAcA,CACrB,CAMA,IAAI,YAAgB,CAClB,OAAO,KAAK,WACd,CAEA,IAAI,YAAwB,CAC1B,OAAO,KAAK,WACd,CAQA,OAAO,UAAUA,EAA8BG,EAAoB,CACjE,MAAM,IAAI,MAAM,gDAAgD,CAClE,CAOA,OAAO,gBAA0CH,EAAYG,EAAoB,CAC/E,MAAM,IAAI,MAAM,sDAAsD,CACxE,CAOA,iBAAiBC,EAAW,GAAM,CAChC,OAAIA,GAAY,CAACC,GAAkB,KAAK,cAAc,GACpDC,0BAEE,gHACF,EAEK,KAAK,cACd,CAMA,iBAAiBC,EAAe,CAC9B,KAAK,eAAiBA,CACxB,CASA,YAAYC,EAAaC,EAAmBC,EAAO,MAAoB,CACrE,IAAIC,EAAY,KAAK,OAAOH,CAAG,EAC3BG,GACFA,EAAU,YAAcC,GAAcF,CAAI,EAC1CC,EAAU,MAAQF,GAElBE,EAAY,IAAIE,GAAcJ,EAAMG,GAAcF,CAAI,CAAC,EAEzD,KAAK,OAAOF,CAAG,EAAIG,CACrB,CASA,SAAYH,EAAaM,EAAe,GAAsB,CAC5D,IAAMH,EAAY,KAAK,OAAOH,CAAG,EAC3BO,EAAUJ,GAAW,QAAQ,EACnC,GAAI,CAACG,GAAgBC,EACnB,OAAOJ,EAAU,MAEdI,GACH,OAAO,KAAK,OAAOP,CAAG,CAG1B,CACF,EUhHA,IAAAQ,GAAe,SAOFC,GAAiB,OAMjBC,GAAiB,QAMjBC,GAAiB,gCAMjBC,GAAkB,GAMlBC,GAAiB,aAMjBC,GAAuB,IAAI,GAAAC,QAAG,GAAS,EAkFxCC,QACVA,IAAA,2BACAA,IAAA,qBACAA,IAAA,2BAHUA,QAAA,ICtGL,IAAMC,GAAgB,qEAKhBC,GAAkB,sBAIlBC,GAAmB,uBAOnBC,GAAoB,sCACpBC,GAAoB,sCACpBC,GAAmB,CAC9B,QACA,SACA,SACA,YACA,SACA,QACA,YACA,UACA,UACA,aACA,OACA,UACA,QACA,UACA,aACA,QACA,WACA,UACA,YACA,OACF,ECzDA,IAAAC,GAAe,SAIR,IAAMC,EAAO,IAAI,GAAAC,QAAG,CAAC,EAEfC,GAAM,IAAI,GAAAD,QAAG,CAAC,EAEdE,GAAM,IAAI,GAAAF,QAAG,CAAC,EAEdG,GAAOD,GAAI,IAAI,IAAI,GAAAF,QAAG,GAAG,CAAC,EAE1BI,GAAUF,GAAI,IAAI,IAAI,GAAAF,QAAG,EAAE,CAAC,EAAE,IAAIC,EAAG,EAErCI,GAAWH,GAAI,IAAI,IAAI,GAAAF,QAAG,GAAG,CAAC,EAAE,IAAIC,EAAG,EAKvCK,GAAN,KAAe,CACpB,OAAO,QAAQC,EAAa,CAC1B,OAAOA,EAAI,IAAI,IAAI,GAAAP,QAAG,CAAC,EAAE,IAAI,IAAI,GAAAA,QAAG,EAAE,CAAC,CAAC,CAC1C,CAEA,OAAO,aAAaO,EAAuB,CACzC,OAAOA,EAAI,IAAIC,GAAQ,IAAI,EAAG,EAAE,CAAC,CACnC,CAEA,OAAO,MAAMD,EAAkB,CAC7B,OAAO,IAAI,GAAAP,QAAGO,EAAI,IAAIC,GAAQ,IAAI,EAAG,EAAE,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,CAC7D,CAEA,OAAO,QAAQD,EAAkB,CAC/B,OAAO,IAAIC,GAAQD,EAAI,SAAS,CAAC,EAAE,IAAIC,GAAQ,IAAI,EAAG,GAAG,CAAC,CAC5D,CAEA,OAAO,eAAeD,EAAuB,CAC3C,OAAOA,EAAI,IAAIC,GAAQ,IAAI,EAAG,GAAG,CAAC,CACpC,CAEA,OAAO,UAAUD,EAAa,CAC5B,OAAOA,EAAI,IAAI,IAAI,GAAAP,QAAG,CAAC,EAAE,IAAI,IAAI,GAAAA,QAAG,EAAE,CAAC,CAAC,CAC1C,CAEA,OAAO,kBAAkBS,EAAW,CAClC,IAAIC,EAASD,EAAE,KAAK,EAAE,EAEtB,OAAIA,EAAE,IAAIL,EAAO,EAAE,GAAGL,CAAI,IACxBW,EAASA,EAAO,IAAIT,EAAG,GAGlBS,CACT,CAEA,OAAO,WAAWC,EAAQC,EAAY,CAEpC,OADsBD,EAAG,IAAIC,CAAE,EAAE,GAAGb,CAAI,EAIjCY,EAAG,IAAIC,CAAE,EAFPD,EAAG,IAAIC,CAAE,EAAE,IAAI,IAAI,GAAAZ,QAAG,CAAC,CAAC,CAGnC,CAEA,OAAO,iBAAiBW,EAAQC,EAAY,CAC1C,OAAID,EAAG,GAAGC,CAAE,EACHD,EAAG,IAAIC,CAAE,EAAE,IAAIP,EAAQ,EAGzBM,EAAG,IAAIC,CAAE,CAClB,CAEA,OAAO,iBAAiBD,EAAQC,EAAY,CAC1C,IAAM,EAAID,EAAG,IAAIC,CAAE,EACnB,GAAI,EAAE,MAAM,EACV,MAAM,IAAI,MAAM,+BAA+B,EAEjD,OAAO,CACT,CAEA,OAAO,SAASD,EAAQC,EAAQC,EAAmB,CACjD,IAAMJ,EAAIE,EAAG,IAAIC,CAAE,EACnB,OAAI,KAAK,WAAWH,EAAGI,CAAK,GAC1BC,4BAA2D,yBAAyB,EAE/EL,CACT,CAEA,OAAO,iBAAiBE,EAAQC,EAAQG,EAAWF,EAAmB,CAChEE,EAAM,GAAGhB,CAAI,GACfe,oBAAmD,gBAAgB,EAErE,IAAML,EAAIE,EAAG,IAAIC,CAAE,EAAE,IAAIG,CAAK,EAC9B,OAAI,KAAK,WAAWN,EAAGI,CAAK,GAC1BC,4BAA2D,6BAA6B,EAEnFL,CACT,CAEA,OAAO,gBAAgBE,EAAQC,EAAQG,EAAWF,EAAmB,CACnE,GAAIE,EAAM,GAAGhB,CAAI,EACf,MAAM,IAAI,MAAM,gBAAgB,EAElC,IAAMU,EAAIE,EAAG,IAAIC,CAAE,EAAE,IAAIG,EAAM,IAAId,EAAG,CAAC,EAAE,IAAIc,CAAK,EAClD,GAAI,KAAK,WAAWN,EAAGI,CAAK,EAC1B,MAAM,IAAI,MAAM,6BAA6B,EAE/C,OAAOJ,CACT,CAEA,OAAO,iBAAiBE,EAAQC,EAAQG,EAAWF,EAAmB,CAChEE,EAAM,GAAGhB,CAAI,GACfe,oBAAmD,gBAAgB,EAErE,IAAML,EAAIE,EAAG,IAAIC,EAAG,IAAIG,EAAM,KAAK,CAAC,CAAC,CAAC,EAAE,IAAIA,CAAK,EACjD,OAAI,KAAK,WAAWN,EAAGI,CAAK,GAC1BC,4BAA2D,6BAA6B,EAEnFL,CACT,CAEA,OAAO,mBAAmBE,EAAQC,EAAQI,EAAeH,EAAmB,CAC1E,IAAMJ,EAAIE,EAAG,IAAIC,CAAE,EAAE,IAAI,IAAI,GAAAZ,QAAG,CAAC,EAAE,IAAI,IAAI,GAAAA,QAAGgB,CAAK,CAAC,CAAC,EAErD,OAAI,KAAK,WAAWP,EAAGI,CAAK,GAC1BC,4BAA2D,qCAAqC,EAE3FL,CACT,CAEA,OAAO,8BAA8BE,EAAQC,EAAQC,EAAeI,EAAsB,CACxF,IAAMC,EAAIP,EAAG,IAAIC,CAAE,EAEbF,EADgBO,GAAWC,EAAE,IAAId,EAAO,EAAE,GAAGL,CAAI,EACxBmB,EAAE,KAAK,EAAE,EAAE,IAAIjB,EAAG,EAAIiB,EAAE,KAAK,EAAE,EAC9D,OAAI,KAAK,WAAWR,EAAQG,CAAK,GAC/BC,4BAA2D,qCAAqC,EAE3FJ,CACT,CAEA,OAAO,kBAAkBC,EAAQC,EAAQI,EAAeH,EAAmB,CACzE,IAAMJ,EAAIE,EAAG,IAAIC,CAAE,EAAE,KAAKI,CAAK,EAC/B,OAAI,KAAK,WAAWP,EAAGI,CAAK,GAC1BC,4BAA2D,oCAAoC,EAE1FL,CACT,CAEA,OAAO,kBAAkBE,EAAQC,EAAQK,EAAsB,CAI7D,OAHIL,EAAG,GAAGb,CAAI,GACZe,oBAAmD,gBAAgB,EAEjEG,EACK,KAAK,WAAWN,EAAIC,CAAE,EAExBD,EAAG,IAAIC,CAAE,CAClB,CAEA,OAAO,WAAWH,EAAOU,EAAsB,CAC7C,OAAOV,EAAE,IAAIP,GAAI,IAAI,IAAI,GAAAF,QAAGmB,CAAG,CAAC,CAAC,CACnC,CAEA,OAAO,KAAKC,EAAe,CAEzB,OADgBA,EAAE,MAAM,GAAG,EAAI,EAAI,CAErC,CAEA,OAAO,OAAOA,EAAgB,CAC5B,OAAO,KAAK,KAAKA,CAAC,IAAM,CAC1B,CAEA,OAAO,SAASA,EAAW,CACzB,OAAIA,EAAE,GAAGrB,CAAI,EACJqB,EAEF,KAAK,QAAQA,EAAE,KAAK,CAAC,CAAC,CAC/B,CAEA,OAAO,QAAQA,EAAW,CACxB,OAAOA,EAAE,KAAK,IAAI,GAAApB,QAAG,mCAAoC,EAAE,CAAC,CAC9D,CAEA,OAAO,IAAIoB,EAAW,CACpB,OAAI,KAAK,OAAOA,CAAC,EACRA,EAAE,IAAI,EAER,KAAK,QAAQA,CAAC,CACvB,CAEA,OAAO,IAAIA,EAAW,CACpB,OAAI,KAAK,KAAKA,CAAC,IAAM,EACZA,EAEF,KAAK,QAAQA,EAAE,IAAI,IAAI,GAAApB,QAAG,CAAC,CAAC,CAAC,CACtC,CAEA,OAAO,QAAQoB,EAAW,CACxB,OAAIA,EAAE,GAAGrB,CAAI,EACJqB,EAEF,KAAK,QAAQA,CAAC,EAAE,IAAI,IAAI,GAAApB,QAAG,CAAC,CAAC,EAAE,GAAG,IAAI,GAAAA,QAAG,CAAC,EAAE,KAAK,GAAG,CAAC,CAC9D,CACF,ECtMO,IAAMqB,GAAN,KAAe,CAMpB,OAAO,YAAYC,EAA6B,CAC9C,OAAOC,GAAkB,KAAK,IAAIA,EAAc,EAAID,CACtD,CAQA,OAAO,YAAYA,EAA6B,CAC9C,OAAOE,GAAkBA,GAAiBF,CAC5C,CACF,EAUO,SAASG,GAAqBC,EAAmBJ,EAA6B,CACnF,IAAMK,EAAM,KAAK,IAAID,CAAS,EAAIJ,EAClC,OAAII,EAAY,EACVC,EAAML,EAAc,EACfI,EAAYJ,EAAcK,EAE5BD,EAAYC,EAEjBA,EAAML,EAAc,EACfI,EAAYJ,EAAcK,EAE5BD,EAAYC,CACrB,CAQO,SAASC,GAAyBC,EAAsB,CAC7D,OAAOA,EAAMC,GAAiBC,EAChC,CAEO,SAASC,GAAYC,EAAmBC,EAAmBC,EAAmB,CACnF,OAAIF,GAAaC,GAAaD,GAAaE,EAClC,UAELF,EAAYC,EACP,OAEF,OACT,CC7CO,SAASE,GAAiBC,EAA2D,CAC1F,OAAOA,EAAK,IACd,CAEO,SAASC,GAAyBD,EAAmD,CAC1F,GAAIA,EAAK,OAAS,cAAeA,EAAK,OAAS,YAAaA,EAAK,OAAS,WAAYA,EAAK,MAAO,CAChG,GAAM,CAAE,MAAAE,CAAM,EAAIF,EAClB,MAAO,CACL,SAAUE,EAAM,UAChB,QAASA,EAAM,QACf,OAAQA,EAAM,MAChB,CACF,CAGF,CAEO,SAASC,GAA2BH,EAA6C,CACtF,GAAIA,EAAK,OAAS,cAAeA,EAAK,OAAS,EAAE,YAAaA,EAAK,QAAU,EAAE,WAAYA,EAAK,OAC9F,OAAOA,EAAK,MAAM,SAItB,CAEO,SAASI,GAAmBJ,EAAoE,CACrG,GAAI,cAAeA,EACjB,OAAOA,EAAK,UAEd,IAAMK,EAASN,GAAiBC,CAAI,EACpC,OAAIK,EACK,CACL,SAAUA,EAAO,SACjB,QAASA,EAAO,QAChB,OAAQA,EAAO,MACjB,EAEKJ,GAAyBD,CAAI,CACtC,CAIO,SAASM,GAAYC,EAAiE,CAC3F,MAAI,aAAcA,EACTA,EAAK,SAEPH,GAAmBG,CAAI,GAAG,UAAYJ,GAA2BI,CAAyB,CACnG,CAEO,SAASC,GAAiBD,EAAqF,CACpH,MAAI,YAAaA,EACRA,EAAK,QAEPH,GAAmBG,CAAI,GAAG,OACnC,CAIO,SAASE,GAAoBT,EAAoE,CACtG,OAAQA,EAA2B,OAAS,MAC9C,CAEA,SAASU,GAA2BH,EAAuD,CACzF,OAAOA,EAAK,UAAY,MAC1B,CAEO,SAASI,GAAsBJ,EAA0C,CAC9E,IAAMK,EAAYb,GAAiBQ,CAAI,EACvC,GAAIK,GAAW,SAAS,WAAa,UAGrC,OAAOA,EAAU,QAAQ,YAC3B,CACO,SAASC,GAAcN,EAAoE,CAChG,IAAMK,EAAY,SAAUL,EAAOR,GAAiBQ,CAAI,EAAKA,EAE7D,GAAI,GAACK,GAAa,CAACF,GAA2BE,CAAS,GAAKA,EAAU,QAAQ,WAAa,cAI3F,OAAOA,EAAU,OACnB,CAEO,SAASE,GAAkBd,EAA6C,CAC7E,OAAOa,GAAcb,CAAI,GAAG,IAC9B,CAOO,SAASe,GAAcf,EAAoE,CAChG,IAAMO,EAAOE,GAAoBT,CAAI,EAAIA,EAAK,KAAOA,EAErD,MAAI,CAACO,GAAM,MAAQ,SAAUP,EACvBO,GAAM,SAAS,WAAa,UACvB,UAEFO,GAAkBd,CAAI,EAExBO,GAAM,IACf,CAEO,SAASS,GAAmChB,EAAoD,CACrG,OAAOD,GAAiBC,CAAI,GAAG,mBACjC,CAEO,SAASiB,GAAejB,EAAyD,CACtF,OAAOD,GAAiBC,CAAI,GAAG,KACjC,CAEO,SAASkB,GAAiBlB,EAAgD,CAC/E,IAAMmB,EAAUpB,GAAiBC,CAAI,GAAG,QACxC,OAAKmB,GACI,CAAE,KAAM,KAAM,MAAO,IAAK,CAGrC,CAOO,SAASC,GAAgBC,EAAgD,CAC9E,IAAMC,EAAST,GAAcQ,CAAM,GAAG,OACtC,GAAIC,EACF,MAAI,WAAYA,EACPA,EAAO,OAETA,CAGX,CAWO,SAASC,GAAkBhB,EAAkD,CAClF,OAAOM,GAAcN,CAAI,GAAG,mBAAqB,EACnD,CASO,SAASiB,GAASC,EAAmB,CAC1C,IAAMH,EAASJ,GAAiBO,CAAO,EAAE,KACnCC,EAAW,CACf,QAAS,GACT,YAAa,GACb,UAAW,GACX,KAAM,GACN,KAAM,GACN,YAAa,EACf,EACA,OAAIJ,IACFI,EAAI,QAAUJ,EAAO,QACrBI,EAAI,YAAcJ,EAAO,YACzBI,EAAI,UAAYJ,EAAO,UACvBI,EAAI,KAAOJ,EAAO,KAClBI,EAAI,KAAOJ,EAAO,KAClBI,EAAI,YAAcJ,EAAO,aAEpBI,CACT,CC/LAC,GAAQ,OAAO,CACb,UAAW,GACX,SAAUA,GAAQ,WAClB,SAAU,IACV,SAAU,EACZ,CAAC,EAED,IAAOA,GAAQA,GCRf,IAAAC,EAAe,SCCf,IAAAC,EAAe,SAMf,IAAMC,GAAgB,GAChBC,GAAc,iBACdC,GAA+B,qBAC/BC,GAA+B,uBAC/BC,GAAa,OAEnB,SAASC,GAAgBC,EAAQC,EAAiBC,EAAkB,CAClE,IAAMC,EAASH,EAAG,OAAOE,CAAQ,EAAE,KAAKD,CAAO,EAC/C,OAAAE,EAAO,OAAOD,EAAW,CAAC,EACnBC,EAAO,SAASD,CAAQ,CACjC,CAEA,SAASE,EAAiBJ,EAAQC,EAAiBC,EAAkB,CACnE,IAAMG,EAAQL,EAAG,OAAOE,CAAQ,EAAE,KAAKD,CAAO,EAC9C,OAAAI,EAAM,OAAOH,EAAWD,EAAU,CAAC,EAC5BI,EAAM,SAASH,EAAWD,CAAO,CAC1C,CAEA,SAASK,GAA6BC,EAAc,CAClD,IAAIC,EAEJ,OAAKD,EAAO,KAAO,EACjBC,EAAQ,IAAI,EAAAC,QAAG,+BAA+B,EAE9CD,EAAQ,IAAI,EAAAC,QAAG,+BAA+B,GAG3CF,EAAO,KAAO,IACjBC,EAAQJ,EAAiBI,EAAM,IAAI,IAAI,EAAAC,QAAG,+BAA+B,CAAC,EAAG,GAAI,GAAG,IAEjFF,EAAO,KAAO,IACjBC,EAAQJ,EAAiBI,EAAM,IAAI,IAAI,EAAAC,QAAG,+BAA+B,CAAC,EAAG,GAAI,GAAG,IAEjFF,EAAO,KAAO,IACjBC,EAAQJ,EAAiBI,EAAM,IAAI,IAAI,EAAAC,QAAG,+BAA+B,CAAC,EAAG,GAAI,GAAG,IAEjFF,EAAO,MAAQ,IAClBC,EAAQJ,EAAiBI,EAAM,IAAI,IAAI,EAAAC,QAAG,+BAA+B,CAAC,EAAG,GAAI,GAAG,IAEjFF,EAAO,MAAQ,IAClBC,EAAQJ,EAAiBI,EAAM,IAAI,IAAI,EAAAC,QAAG,+BAA+B,CAAC,EAAG,GAAI,GAAG,IAEjFF,EAAO,MAAQ,IAClBC,EAAQJ,EAAiBI,EAAM,IAAI,IAAI,EAAAC,QAAG,+BAA+B,CAAC,EAAG,GAAI,GAAG,IAEjFF,EAAO,OAAS,IACnBC,EAAQJ,EAAiBI,EAAM,IAAI,IAAI,EAAAC,QAAG,+BAA+B,CAAC,EAAG,GAAI,GAAG,IAEjFF,EAAO,OAAS,IACnBC,EAAQJ,EAAiBI,EAAM,IAAI,IAAI,EAAAC,QAAG,+BAA+B,CAAC,EAAG,GAAI,GAAG,IAEjFF,EAAO,OAAS,IACnBC,EAAQJ,EAAiBI,EAAM,IAAI,IAAI,EAAAC,QAAG,+BAA+B,CAAC,EAAG,GAAI,GAAG,IAEjFF,EAAO,QAAU,IACpBC,EAAQJ,EAAiBI,EAAM,IAAI,IAAI,EAAAC,QAAG,+BAA+B,CAAC,EAAG,GAAI,GAAG,IAEjFF,EAAO,QAAU,IACpBC,EAAQJ,EAAiBI,EAAM,IAAI,IAAI,EAAAC,QAAG,+BAA+B,CAAC,EAAG,GAAI,GAAG,IAEjFF,EAAO,QAAU,IACpBC,EAAQJ,EAAiBI,EAAM,IAAI,IAAI,EAAAC,QAAG,+BAA+B,CAAC,EAAG,GAAI,GAAG,IAEjFF,EAAO,QAAU,IACpBC,EAAQJ,EAAiBI,EAAM,IAAI,IAAI,EAAAC,QAAG,gCAAgC,CAAC,EAAG,GAAI,GAAG,IAElFF,EAAO,SAAW,IACrBC,EAAQJ,EAAiBI,EAAM,IAAI,IAAI,EAAAC,QAAG,gCAAgC,CAAC,EAAG,GAAI,GAAG,IAElFF,EAAO,SAAW,IACrBC,EAAQJ,EAAiBI,EAAM,IAAI,IAAI,EAAAC,QAAG,gCAAgC,CAAC,EAAG,GAAI,GAAG,IAElFF,EAAO,SAAW,IACrBC,EAAQJ,EAAiBI,EAAM,IAAI,IAAI,EAAAC,QAAG,iCAAiC,CAAC,EAAG,GAAI,GAAG,IAEnFF,EAAO,UAAY,IACtBC,EAAQJ,EAAiBI,EAAM,IAAI,IAAI,EAAAC,QAAG,kCAAkC,CAAC,EAAG,GAAI,GAAG,IAEpFF,EAAO,UAAY,IACtBC,EAAQJ,EAAiBI,EAAM,IAAI,IAAI,EAAAC,QAAG,qCAAqC,CAAC,EAAG,GAAI,GAAG,GAGrFL,EAAiBI,EAAO,GAAI,GAAG,CACxC,CAEA,SAASE,GAA6BC,EAAmB,CACvD,IAAMJ,EAAO,KAAK,IAAII,CAAS,EAC3BH,EAEJ,OAAKD,EAAO,KAAO,EACjBC,EAAQ,IAAI,EAAAC,QAAG,sBAAsB,EAErCD,EAAQ,IAAI,EAAAC,QAAG,sBAAsB,GAGlCF,EAAO,KAAO,IACjBC,EAAQJ,EAAiBI,EAAM,IAAI,IAAI,EAAAC,QAAG,sBAAsB,CAAC,EAAG,GAAI,GAAG,IAExEF,EAAO,KAAO,IACjBC,EAAQJ,EAAiBI,EAAM,IAAI,IAAI,EAAAC,QAAG,sBAAsB,CAAC,EAAG,GAAI,GAAG,IAExEF,EAAO,KAAO,IACjBC,EAAQJ,EAAiBI,EAAM,IAAI,IAAI,EAAAC,QAAG,sBAAsB,CAAC,EAAG,GAAI,GAAG,IAExEF,EAAO,MAAQ,IAClBC,EAAQJ,EAAiBI,EAAM,IAAI,IAAI,EAAAC,QAAG,sBAAsB,CAAC,EAAG,GAAI,GAAG,IAExEF,EAAO,MAAQ,IAClBC,EAAQJ,EAAiBI,EAAM,IAAI,IAAI,EAAAC,QAAG,sBAAsB,CAAC,EAAG,GAAI,GAAG,IAExEF,EAAO,MAAQ,IAClBC,EAAQJ,EAAiBI,EAAM,IAAI,IAAI,EAAAC,QAAG,sBAAsB,CAAC,EAAG,GAAI,GAAG,IAExEF,EAAO,OAAS,IACnBC,EAAQJ,EAAiBI,EAAM,IAAI,IAAI,EAAAC,QAAG,sBAAsB,CAAC,EAAG,GAAI,GAAG,IAExEF,EAAO,OAAS,IACnBC,EAAQJ,EAAiBI,EAAM,IAAI,IAAI,EAAAC,QAAG,sBAAsB,CAAC,EAAG,GAAI,GAAG,IAExEF,EAAO,OAAS,IACnBC,EAAQJ,EAAiBI,EAAM,IAAI,IAAI,EAAAC,QAAG,sBAAsB,CAAC,EAAG,GAAI,GAAG,IAExEF,EAAO,QAAU,IACpBC,EAAQJ,EAAiBI,EAAM,IAAI,IAAI,EAAAC,QAAG,sBAAsB,CAAC,EAAG,GAAI,GAAG,IAExEF,EAAO,QAAU,IACpBC,EAAQJ,EAAiBI,EAAM,IAAI,IAAI,EAAAC,QAAG,sBAAsB,CAAC,EAAG,GAAI,GAAG,IAExEF,EAAO,QAAU,IACpBC,EAAQJ,EAAiBI,EAAM,IAAI,IAAI,EAAAC,QAAG,sBAAsB,CAAC,EAAG,GAAI,GAAG,IAExEF,EAAO,QAAU,IACpBC,EAAQJ,EAAiBI,EAAM,IAAI,IAAI,EAAAC,QAAG,sBAAsB,CAAC,EAAG,GAAI,GAAG,IAExEF,EAAO,SAAW,IACrBC,EAAQJ,EAAiBI,EAAM,IAAI,IAAI,EAAAC,QAAG,qBAAqB,CAAC,EAAG,GAAI,GAAG,IAEvEF,EAAO,SAAW,IACrBC,EAAQJ,EAAiBI,EAAM,IAAI,IAAI,EAAAC,QAAG,qBAAqB,CAAC,EAAG,GAAI,GAAG,IAEvEF,EAAO,SAAW,IACrBC,EAAQJ,EAAiBI,EAAM,IAAI,IAAI,EAAAC,QAAG,oBAAoB,CAAC,EAAG,GAAI,GAAG,IAEtEF,EAAO,UAAY,IACtBC,EAAQJ,EAAiBI,EAAM,IAAI,IAAI,EAAAC,QAAG,mBAAmB,CAAC,EAAG,GAAI,GAAG,IAErEF,EAAO,UAAY,IACtBC,EAAQJ,EAAiBI,EAAM,IAAI,IAAI,EAAAC,QAAG,gBAAgB,CAAC,EAAG,GAAI,GAAG,GAGhED,CACT,CAEO,IAAMI,GAAN,MAAMC,CAAS,CACpB,OAAO,oBAAoBC,EAAgBC,EAAmBC,EAAuB,CACnF,OAAOC,GAAS,MAAMH,EAAM,IAAII,GAAQ,IAAI,GAAIF,EAAYD,CAAS,CAAC,EAAE,KAAK,CAAC,CAChF,CAEA,OAAO,oBAAoBI,EAAkBJ,EAAmBC,EAA4B,CAC1F,OAAOC,GAAS,QAAQE,CAAY,EACjC,IAAI,CAAC,EACL,IAAID,GAAQ,IAAI,GAAIH,EAAYC,CAAS,CAAC,CAC/C,CAEA,OAAO,wBAAwBL,EAAuB,CACpD,OAAIA,EAAY,EACP,IAAI,EAAAF,QAAGH,GAA6BK,CAAS,CAAC,EAEhD,IAAI,EAAAF,QAAGC,GAA6BC,CAAS,CAAC,CACvD,CAEA,OAAO,wBAAwBQ,EAA0B,CACvD,GAAIA,EAAa,GAAG,IAAI,EAAAV,QAAGW,EAAc,CAAC,GAAKD,EAAa,GAAG,IAAI,EAAAV,QAAGY,EAAc,CAAC,EACnF,MAAM,IAAI,MAAM,iEAAiE,EAGnF,IAAMC,EAAMH,EAAa,UAAU,EAAI,EACjCI,EAAc,IAAI,EAAAd,QAAGa,EAAM,EAAE,EAC7BE,EAAkBzB,GAAgBwB,EAAa,GAAI,GAAG,EAExDE,EAAM,IAAI,EAAAhB,QAAG,mBAAoB,KAAK,EACtCiB,EAAY,EACZC,EAAmB,IAAI,EAAAlB,QAAG,CAAC,EAE3BmB,EAAIN,GAAO,GAAKH,EAAa,KAAKG,EAAM,EAAE,EAAIH,EAAa,KAAK,GAAKG,CAAG,EAE5E,KAAOG,EAAI,GAAG,IAAI,EAAAhB,QAAG,CAAC,CAAC,GAAKiB,EAAYhC,IAAe,CACrDkC,EAAIA,EAAE,IAAIA,CAAC,EACX,IAAMC,EAAeD,EAAE,KAAK,GAAG,EAC/BA,EAAIA,EAAE,KAAK,GAAKC,EAAa,SAAS,CAAC,EACvCF,EAAmBA,EAAiB,IAAIF,EAAI,IAAII,CAAY,CAAC,EAC7DJ,EAAMA,EAAI,KAAK,CAAC,EAChBC,GAAa,CACf,CAEA,IAAMI,EAAmBH,EAAiB,KAAK,EAAE,EAG3CI,EADWP,EAAgB,IAAIM,CAAgB,EAC3B,IAAI,IAAI,EAAArB,QAAGd,EAAW,CAAC,EAE3CqC,EAAU5B,EAAiB2B,EAAS,IAAI,IAAI,EAAAtB,QAAGb,EAA4B,CAAC,EAAG,GAAI,GAAG,EAAE,SAAS,EACjGqC,EAAW7B,EAAiB2B,EAAS,IAAI,IAAI,EAAAtB,QAAGZ,EAA4B,CAAC,EAAG,GAAI,GAAG,EAAE,SAAS,EAExG,OAAImC,IAAYC,EACPD,EAE2BnB,EAAS,wBAAwBoB,CAAQ,EAC7C,IAAId,CAAY,EACvCc,EAEFD,CACT,CAEA,OAAO,iBAAiBrB,EAAmBI,EAAmBC,EAA4B,CACxF,OAAOH,EAAS,oBAAoBA,EAAS,wBAAwBF,CAAS,EAAGI,EAAWC,CAAS,CACvG,CAEA,OAAO,iBAAiBF,EAAgBC,EAAmBC,EAA2B,CACpF,OAAOH,EAAS,wBAAwBA,EAAS,oBAAoBC,EAAOC,EAAWC,CAAS,CAAC,CACnG,CAEA,OAAO,2BAA2BF,EAAgBC,EAAmBC,EAAmBkB,EAA6B,CACnH,OAAOrB,EAAS,uBAAuBA,EAAS,iBAAiBC,EAAOC,EAAWC,CAAS,EAAGkB,CAAW,CAC5G,CAEA,OAAO,uBAAuBvB,EAAmBuB,EAA6B,CAC5E,OAAOvB,EAAaA,EAAYuB,CAClC,CAQA,OAAO,2BAA2BvB,EAAmBuB,EAAqB,CACxE,OAAOrB,EAAS,uBAAuBF,EAAWuB,CAAW,EAAIA,CACnE,CAEA,OAAO,2BAA2BvB,EAAmBuB,EAAqB,CACxE,OAAOrB,EAAS,uBAAuBF,EAAWuB,CAAW,EAAIA,CACnE,CACF,EAEO,SAASC,GAAUxB,EAAmB,CAC3C,OAAOyB,EAAEzB,CAAS,EAAE,IAAIyB,EAAEtC,EAAU,CAAC,CACvC,CDxOO,SAASuC,GAAUC,EAAgBC,EAAgBC,EAAeC,EAAsB,CAC7F,IAAMC,EAAgBJ,EAAW,GAAGC,CAAU,EAAID,EAAW,IAAIC,CAAU,EAAIA,EAAW,IAAID,CAAU,EAClGK,EAAYH,EAAU,IAAIE,CAAa,EAAE,KAAK,EAAE,EAChDE,EAAcN,EAAW,IAAIC,CAAU,EACvCM,EAAWF,EAAU,IAAIC,CAAW,EACpCE,EAAYH,EAAU,IAAIC,CAAW,EAE3C,OADeH,GAAW,CAACK,EAAU,GAAGC,CAAI,EAAIF,EAAS,IAAI,IAAI,EAAAG,QAAG,CAAC,CAAC,EAAIH,CAE5E,CAYO,SAASI,GAAUX,EAAgBC,EAAgBC,EAAeC,EAAsB,CAC7F,IAAMC,EAAgBJ,EAAW,GAAGC,CAAU,EAAID,EAAW,IAAIC,CAAU,EAAIA,EAAW,IAAID,CAAU,EACxG,GAAIE,EAAU,GAAGO,CAAI,GAAKL,EAAc,GAAGK,CAAI,EAC7C,OAAOA,EAET,IAAMG,EAAIV,EAAU,IAAIE,CAAa,EAE/BS,EADgBV,GAAWS,EAAE,IAAIE,EAAO,EAAE,GAAGL,CAAI,EACxBG,EAAE,KAAK,EAAE,EAAE,IAAIG,EAAG,EAAIH,EAAE,KAAK,EAAE,EAC9D,GAAII,GAAS,WAAWH,EAAQ,EAAE,EAChC,MAAM,IAAI,MAAM,2BAA2B,EAE7C,OAAOA,CACT,CAWO,SAASI,GAAoBC,EAAehB,EAAeiB,EAAYC,EAAyB,CACrG,GAAID,EAAO,GAAGV,CAAI,EAChB,OAAOS,EAET,IAAMb,EAAYW,GAAS,kBAAkBE,EAAWhB,EAAW,GAAI,GAAG,EACpEmB,EAAiBnB,EAAU,KAAK,EAAE,EAClCoB,EAAUN,GAAS,SAASE,EAAWC,EAAQ,GAAG,EACxD,GAAI,CAACC,GAAcC,EAAe,IAAIC,CAAO,EAC3C,MAAM,IAAI,MAAM,kEAAkE,EAEpF,IAAMC,EAAgBH,EAClBJ,GAAS,kBAAkBX,EAAWgB,EAAe,IAAIC,CAAO,EAAG,EAAI,EACvEN,GAAS,kBAAkBX,EAAWgB,EAAe,IAAIC,CAAO,EAAG,EAAI,EAC3E,GAAIC,EAAc,GAAG,IAAI,EAAAb,QAAGc,EAAc,CAAC,EACzC,MAAM,IAAI,MAAM,gEAAgE,EAElF,GAAID,EAAc,GAAG,IAAI,EAAAb,QAAGe,EAAc,CAAC,EACzC,MAAM,IAAI,MAAM,mEAAmE,EAGrF,OAAOF,CACT,CAWO,SAASG,GAAsBR,EAAehB,EAAeiB,EAAYC,EAAyB,CACvG,IAAMO,EAAiBX,GAAS,kBAAkBG,EAAO,KAAK,EAAE,EAAGjB,EAAW,CAACkB,CAAU,EACnFG,EAAgBH,EAAaF,EAAU,IAAIS,CAAc,EAAIT,EAAU,IAAIS,CAAc,EAE/F,GAAIJ,EAAc,GAAG,IAAI,EAAAb,QAAGc,EAAc,CAAC,GAAKD,EAAc,GAAG,IAAI,EAAAb,QAAGe,EAAc,CAAC,EACrF,MAAM,IAAI,MAAM,qDAAqD,EAGvE,OAAOF,CACT,CAWO,SAASK,GAA0BV,EAAehB,EAAeiB,EAAYU,EAAmB,CACrG,OAAOA,EAAOZ,GAAoBC,EAAWhB,EAAWiB,EAAQ,EAAI,EAAIO,GAAsBR,EAAWhB,EAAWiB,EAAQ,EAAI,CAClI,CAWO,SAASW,GAA2BZ,EAAehB,EAAeiB,EAAYY,EAAkB,CACrG,OAAOA,EAAML,GAAsBR,EAAWhB,EAAWiB,EAAQ,EAAK,EAAIF,GAAoBC,EAAWhB,EAAWiB,EAAQ,EAAK,CACnI,CAWO,SAASa,GAAoBC,EAAsBC,EAAqBhC,EAAe6B,EAAkB,CAC9G,IAAM3B,EAAgB6B,EAAiB,GAAGC,CAAe,EAAID,EAAiB,IAAIC,CAAe,EAAIA,EAAgB,IAAID,CAAgB,EAEzI,GAAI/B,EAAU,IAAIO,CAAI,GAAKL,EAAc,GAAGK,CAAI,EAC9C,OAAOA,EAGT,IAAII,EACJ,GAAIkB,EAAK,CACP,IAAM1B,EAAY,IAAI,EAAAK,QAAGR,CAAS,EAAE,IAAI,IAAI,EAAAQ,QAAGN,CAAa,CAAC,EAAE,KAAK,EAAE,EAChEE,EAAc4B,EAAgB,IAAID,CAAgB,EAClD1B,EAAWF,EAAU,IAAIC,CAAW,EAE1CO,EADkBR,EAAU,IAAIC,CAAW,EACvB,GAAGG,CAAI,EAAwBF,EAApBA,EAAS,IAAIQ,EAAG,CACjD,KAAO,CACL,IAAMO,EAAU,IAAI,EAAAZ,QAAGR,CAAS,EAAE,IAAI,IAAI,EAAAQ,QAAGN,CAAa,CAAC,EAE3DS,EADsBS,EAAQ,IAAIR,EAAO,EAAE,GAAGL,CAAI,EACzBa,EAAQ,KAAK,EAAE,EAAE,IAAIP,EAAG,EAAIO,EAAQ,KAAK,EAAE,CACtE,CACA,OAAOT,CACT,CAWO,SAASsB,GAAuBF,EAAsBC,EAAqBhC,EAAe6B,EAAkB,CACjH,IAAM3B,EAAgB6B,EAAiB,GAAGC,CAAe,EAAID,EAAiB,IAAIC,CAAe,EAAIA,EAAgB,IAAID,CAAgB,EAEzI,GAAI/B,EAAU,IAAIO,CAAI,GAAKL,EAAc,GAAGK,CAAI,EAC9C,OAAOA,EAGT,IAAII,EACJ,GAAIkB,EAEFlB,EADgBX,EAAU,IAAIE,CAAa,EAC1B,KAAK,EAAE,MACnB,CACL,IAAMC,EAAYH,EAAU,IAAIE,CAAa,EAAE,KAAK,EAAE,EAChDE,EAAc4B,EAAgB,IAAID,CAAgB,EACxDpB,EAASR,EAAU,IAAIC,CAAW,CACpC,CACA,OAAOO,CACT,CASO,SAASuB,GAA0BC,EAAgBC,EAAgBC,EAAgB,CACxF,IAAMC,EAAoB,EAAA9B,QAAG,IAAI2B,EAAYC,CAAU,EACjDG,EAAoB,EAAA/B,QAAG,IAAI2B,EAAYC,CAAU,EACjDI,EAAM1B,GAAS,UAAUuB,EAAW,IAAIE,CAAiB,EAAE,IAAID,CAAiB,CAAC,EACjFG,EAAMF,EAAkB,IAAID,CAAiB,EACnD,MAAO,CAACE,EAAI,OAAO,GAAK,CAACC,EAAI,OAAO,EAAID,EAAI,IAAIC,CAAG,EAAI,IAAI,EAAAjC,QAAG,CAAC,CACjE,CASO,SAASkC,GAA0BP,EAAgBC,EAAgBC,EAAgB,CACxF,IAAMC,EAAoB,EAAA9B,QAAG,IAAI2B,EAAYC,CAAU,EAEjDO,EADoB,EAAAnC,QAAG,IAAI2B,EAAYC,CAAU,EACvB,IAAIE,CAAiB,EACrD,OAAQK,EAAM,OAAO,EAAqC,IAAI,EAAAnC,QAAG,CAAC,EAAzC6B,EAAW,KAAK,EAAE,EAAE,IAAIM,CAAK,CACxD,CAEO,IAAMC,GAAN,MAAMC,CAAa,CAUxB,OAAO,2BACL7C,EACA8C,EACAC,EACAC,EACA/C,EACa,CACb,IAAMgD,EAAM,IAAIC,GAAQlD,EAAU,SAAS,CAAC,EACtCmD,EAAkB,IAAID,GAAQJ,EAAa,SAAS,CAAC,EACrDM,EAAgB,IAAIF,GAAQH,EAAe,SAAS,CAAC,EACrDM,EAAgB,IAAIH,GAAQF,EAAe,SAAS,CAAC,EACvDM,EACAC,EAYJ,OAXIT,EAAa,GAAGC,CAAc,GAChCO,EAAQxC,GAAS,aAAamC,CAAG,EAAE,IAAII,EAAc,IAAID,CAAa,CAAC,EAAE,IAAIA,EAAc,IAAIC,CAAa,CAAC,EAC7GE,EAAQ,IAAIL,GAAQ,CAAC,GACZJ,EAAa,GAAGE,CAAc,GACvCM,EAAQxC,GAAS,aAAamC,CAAG,EAAE,IAAII,EAAc,IAAIF,CAAe,CAAC,EAAE,IAAIA,EAAgB,IAAIE,CAAa,CAAC,EAEjHE,EAAQzC,GAAS,eAAemC,EAAI,IAAIE,EAAgB,IAAIC,CAAa,CAAC,CAAC,IAE3EE,EAAQ,IAAIJ,GAAQ,CAAC,EACrBK,EAAQzC,GAAS,eAAemC,EAAI,IAAII,EAAc,IAAID,CAAa,CAAC,CAAC,GAEvEnD,EACK,CACL,cAAeqD,EAAM,KAAK,EAAE,SAAS,EACrC,cAAeC,EAAM,KAAK,EAAE,SAAS,CACvC,EAEK,CACL,cAAeD,EAAM,MAAM,EAAE,SAAS,EACtC,cAAeC,EAAM,MAAM,EAAE,SAAS,CACxC,CACF,CAcA,OAAO,wCACLC,EACAC,EACApB,EACAqB,EACAzD,EACA0D,EACAb,EACgB,CAChB,IAAMc,EAAcC,GAAS,wBAAwBf,CAAY,EAC3DC,EAAiBc,GAAS,wBAAwBL,CAAS,EAC3DR,EAAiBa,GAAS,wBAAwBJ,CAAS,EAC7DzD,EACJ,GAAI4D,EAAcJ,EAAW,CAC3B,GAAI,CAACE,EACH,MAAM,IAAI,MAAM,gDAAgD,EAElE1D,EAAYkC,GAA0Ba,EAAgBC,EAAgBX,CAAU,CAClF,SAAWuB,EAAcH,EAAW,CAClC,GAAIC,EACF,MAAM,IAAI,MAAM,gDAAgD,EAElE1D,EAAY0C,GAA0BM,EAAgBD,EAAgBV,CAAU,CAClF,MAAWqB,EACT1D,EAAYkC,GAA0BY,EAAcE,EAAgBX,CAAU,EAE9ErC,EAAY0C,GAA0BI,EAAcC,EAAgBV,CAAU,EAEhF,IAAMyB,EAAcjB,EAAa,2BAA2B7C,EAAW8C,EAAcC,EAAgBC,EAAgB/C,CAAO,EACtH8D,EAAc9D,EAChB+D,EAAEF,EAAY,cAAc,SAAS,CAAC,EACnC,IAAI,EAAIH,CAAQ,EAChB,SAAS,EACZK,EAAEF,EAAY,cAAc,SAAS,CAAC,EACnC,IAAI,EAAIH,CAAQ,EAChB,SAAS,EAEVM,EAAchE,EAChB+D,EAAEF,EAAY,cAAc,SAAS,CAAC,EACnC,IAAI,EAAIH,CAAQ,EAChB,SAAS,EACZK,EAAEF,EAAY,cAAc,SAAS,CAAC,EACnC,IAAI,EAAIH,CAAQ,EAChB,SAAS,EAEhB,MAAO,CACL,cAAeG,EAAY,cAC3B,cAAeA,EAAY,cAC3B,oBAAqB7D,EAAUiD,GAAQ,KAAKa,CAAW,EAAE,SAAS,EAAIb,GAAQ,MAAMa,CAAW,EAAE,SAAS,EAC1G,oBAAqB9D,EAAUiD,GAAQ,KAAKe,CAAW,EAAE,SAAS,EAAIf,GAAQ,MAAMe,CAAW,EAAE,SAAS,EAC1G,iBAAkBjE,EAAU,SAAS,EACrC,aAAc0D,CAChB,CACF,CAUA,OAAO,iCAAiCZ,EAAkBU,EAAmBC,EAAmBS,EAAkC,CAChI,GAAIV,EAAYC,EACd,OAAOU,iBAAgD,+CAAgD,CACrG,CAACC,GAAa,WAAW,EAAG,mCAC5B,CAACA,GAAa,cAAc,EAAG,CAC7B,UAAAZ,EACA,UAAAC,EACA,YAAAS,CACF,CACF,CAAC,EAEH,IAAMG,EAAWR,GAAS,wBAAwBf,CAAY,EACxDC,EAAiBc,GAAS,wBAAwBL,CAAS,EAC3DR,EAAiBa,GAAS,wBAAwBJ,CAAS,EACjE,GAAIY,EAAWb,EACb,OAAOtB,GAA0Ba,EAAgBC,EAAgB,IAAI,EAAAxC,QAAG0D,EAAY,aAAa,CAAC,EAAE,SAAS,EAE/G,GAAIG,GAAYZ,EACd,OAAOf,GAA0BM,EAAgBD,EAAgB,IAAI,EAAAvC,QAAG0D,EAAY,aAAa,CAAC,EAAE,SAAS,EAE/G,IAAMI,EAA2BpC,GAA0BY,EAAcE,EAAgB,IAAI,EAAAxC,QAAG0D,EAAY,aAAa,CAAC,EACpHK,EAA2B7B,GAA0BI,EAAcC,EAAgB,IAAI,EAAAvC,QAAG0D,EAAY,aAAa,CAAC,EAC1H,OAAO,EAAA1D,QAAG,IAAI8D,EAA0BC,CAAwB,EAAE,SAAS,CAC7E,CAEA,OAAO,sBAAsBf,EAAmBC,EAAmBX,EAAkB,CAEnF,IAAM0B,EAAc,IAAI,EAAAhE,QAAG,GAAS,EAC9B,CAAE,cAAAiE,CAAc,EAAI5B,EAAa,wCACrCW,EACAC,EACAe,EACA,GACA,GACA,EACA1B,CACF,EAEM4B,EAAYb,GAAS,oBAAoBf,EAAc,EAAG,CAAC,EAE3D6B,EAAmBX,EAAEQ,EAAY,SAAS,CAAC,EAAE,IAAIE,CAAS,EAE1DE,EAAcD,EAAiB,IAAIF,EAAc,SAAS,CAAC,EAC3DI,EAASF,EAAiB,IAAIC,CAAW,EACzCE,EAASd,EAAES,EAAc,SAAS,CAAC,EAAE,IAAIG,CAAW,EAE1D,MAAO,CAAE,OAAAC,EAAQ,OAAAC,CAAO,CAC1B,CAEA,OAAO,4BACLtB,EACAC,EACAX,EACAiC,EACAC,EACA,CACA,IAAMN,EAAYb,GAAS,oBAAoBf,EAAciC,EAAgBC,CAAc,EACrFpB,EAAcC,GAAS,wBAAwBf,CAAY,EACjE,GAAIc,EAAcJ,EAChB,MAAO,CAAE,OAAQ,IAAIN,GAAQ,CAAC,EAAG,OAAQ,IAAIA,GAAQ,CAAC,EAAG,UAAAwB,CAAU,EAErE,GAAId,EAAcH,EAChB,MAAO,CAAE,OAAQ,IAAIP,GAAQ,CAAC,EAAG,OAAQ,IAAIA,GAAQ,CAAC,EAAG,UAAAwB,CAAU,EAErE,IAAMF,EAAc,IAAI,EAAAhE,QAAGyE,GAAiB,EAAGF,CAAc,CAAC,EACxD,CAAE,cAAeG,CAAY,EAAIrC,EAAa,wCAClDW,EACAC,EACAe,EACA,GACA,GACA,EACA1B,CACF,EAEMqC,EAAUC,GAAmBZ,EAAY,SAAS,EAAGO,CAAc,EACnEM,EAAUD,GAAmBF,EAAY,SAAS,EAAGF,CAAc,EACnEJ,EAAcZ,EAAEmB,CAAO,EAAE,IAAIE,CAAO,EAEpCR,EAASb,EAAEmB,CAAO,EAAE,IAAIP,CAAW,EAEnCE,EAASd,EAAEqB,CAAO,EAAE,IAAIT,CAAW,EAEzC,MAAO,CAAE,OAAAC,EAAQ,OAAAC,EAAQ,UAAAJ,CAAU,CACrC,CAEA,OAAO,wBACLG,EACAC,EACAQ,EACAC,EACAC,EACAC,EACAC,EACA,CACA,IAAMP,EAAUnB,EAAEiB,GAAiBjB,EAAEsB,CAAU,EAAE,IAAIT,CAAM,EAAE,IAAIU,CAAW,EAAE,SAAS,EAAGE,CAAS,CAAC,EAAE,QAAQ,CAAC,EACzGJ,EAAUrB,EAAEiB,GAAiBjB,EAAEsB,CAAU,EAAE,IAAIR,CAAM,EAAE,IAAIU,CAAW,EAAE,SAAS,EAAGE,CAAS,CAAC,EAAE,QAAQ,CAAC,EAE/G,MAAO,CAAE,QAAAP,EAAS,QAAAE,CAAQ,CAC5B,CAcA,OAAO,8BACL7B,EACAC,EACAX,EACAwC,EACAC,EACAC,EACAC,EACAC,EACA,CACA,GAAM,CAAE,OAAAb,EAAQ,OAAAC,CAAO,EAAIjC,EAAa,sBAAsBW,EAAWC,EAAWX,CAAY,EAEhG,OAAOD,EAAa,wBAAwBgC,EAAQC,EAAQQ,EAAYC,EAAaC,EAAaC,EAAWC,CAAS,CACxH,CAUA,OAAO,kBAAkBC,EAA0BC,EAAwBC,EAAwC,CACjH,OAAIF,EAAmBC,IAGnBD,EAAmBE,KAKzB,CACF,EAQO,SAASC,GAA2CC,EAAuD,CAChH,GAAIA,EAAW,SAAW,OACxB,MAAM,IAAI,MAAM,YAAYA,EAAW,UAAU,gCAAgC,EAEnF,OAAOA,EAAW,MACpB,CAEA,eAAsBC,GAAiBC,EAAiBC,EAAU,GAAM,CACtE,QAAQ,IAAI,SAAUD,EAAG,QAAQ,EAAE,MAAM,EACzCA,EAAG,QAAQ,EAAE,SAAS,QAAQ,CAACE,EAAMC,IAAU,CACzCF,GACF,QAAQ,IAAI,eAAeE,CAAK,KAAM,KAAK,UAAUD,EAAM,KAAM,CAAC,CAAC,CAEvE,CAAC,CACH,CE/fA,IAAAE,GAAe,SAOR,IAAMC,GAAN,MAAMC,CAAW,CAKtB,YAAYC,EAAeC,EAAiB,CAC1C,KAAK,SAAW,IACP,GAAG,KAAK,UAAU,SAAS,CAAC,IAAI,KAAK,YAAY,SAAS,CAAC,GAEpE,KAAK,UAAYD,EACjB,KAAK,YAAcC,CACrB,CAQA,OAAO,YAAYC,EAA6B,CAC9C,OAAOH,EAAW,aAAaG,EAAO,gBAAgB,CAAC,EAAE,IAAI,EAAE,EAAE,SAAS,EAAG,GAAI,CACnF,CAOA,WAAqB,CACnB,OAAO,IAAIC,GAAQ,KAAK,UAAU,SAAS,CAAC,EAAE,IAAI,KAAK,YAAY,SAAS,CAAC,EAAE,IAAI,GAAG,CACxF,CASA,OAAO,aAAaH,EAAwBC,EAAsC,CAChF,IAAMG,EAAM,OAAOJ,GAAc,SAAW,IAAI,GAAAK,QAAGL,EAAU,SAAS,CAAC,EAAIA,EACrEM,EAAQ,OAAOL,GAAgB,SAAW,IAAI,GAAAI,QAAGJ,EAAY,SAAS,CAAC,EAAIA,EACjF,OAAO,IAAIF,EAAWK,EAAKE,CAAK,CAClC,CACF,EAEO,SAASC,GAAkBC,EAAO,CAAE,UAAAR,EAAW,YAAAC,CAAY,EAAeQ,EAAuB,CACtG,OAAIA,EACKD,EAAE,IAAIP,EAAY,IAAID,CAAS,CAAC,EAAE,IAAIC,CAAW,EAEnDO,EAAE,IAAIP,CAAW,EAAE,IAAIA,EAAY,IAAID,CAAS,CAAC,CAC1D,CAUO,SAASU,GACdC,EACAC,EACAH,EAC8D,CAC9D,GAAI,CAACE,GAAa,eAAiB,CAACA,GAAa,cAC/C,MAAM,IAAI,MAAM,uBAAuB,EAGzC,GAAI,CACF,IAAME,EAAaN,GAAkB,IAAI,GAAAF,QAAGM,EAAY,aAAa,EAAGC,EAAUH,CAAQ,EACpFK,EAAaP,GAAkB,IAAI,GAAAF,QAAGM,EAAY,aAAa,EAAGC,EAAUH,CAAQ,EAE1F,MAAO,CACL,oBAAqBI,EAAW,SAAS,EACzC,oBAAqBC,EAAW,SAAS,CAC3C,CACF,OAASC,EAAgB,CACvB,IAAMC,EAAeD,aAAiB,MAAQA,EAAM,QAAU,gBAC9D,MAAM,IAAI,MAAM,kCAAkCC,CAAY,EAAE,CAClE,CACF","names":["require_bn","__commonJSMin","exports","module","assert","val","msg","inherits","ctor","superCtor","TempCtor","BN","number","base","endian","Buffer","num","left","right","start","i","j","w","off","parseHex4Bits","string","index","c","parseHexByte","lowerBound","r","parseLength","parseBase","str","end","mul","b","len","limbLen","limbPow","total","mod","word","pow","dest","move","src","size","inspect","zeros","groupSizes","groupBases","padding","out","carry","groupSize","groupBase","ret","length","allocate","ArrayType","byteLength","reqLength","res","postfix","position","shift","t","hi","toBitArray","bit","wbit","width","a","bytesNeeded","bitsLeft","cmp","smallMulTo","self","lo","k","ncarry","rword","maxJ","comb10MulTo","o","mid","a0","al0","ah0","a1","al1","ah1","a2","al2","ah2","a3","al3","ah3","a4","al4","ah4","a5","al5","ah5","a6","al6","ah6","a7","al7","ah7","a8","al8","ah8","a9","al9","ah9","b0","bl0","bh0","b1","bl1","bh1","b2","bl2","bh2","b3","bl3","bh3","b4","bl4","bh4","b5","bl5","bh5","b6","bl6","bh6","b7","bl7","bh7","b8","bl8","bh8","b9","bl9","bh9","w0","w1","w2","w3","w4","w5","w6","w7","w8","w9","w10","w11","w12","w13","w14","w15","w16","w17","w18","bigMulTo","hncarry","jumboMulTo","FFTM","x","y","N","l","rb","rbt","rws","iws","rtws","itws","s","rtwdf","itwdf","p","rtwdf_","itwdf_","re","ie","ro","io","rx","n","m","odd","ws","ph","_","rwst","iwst","nrws","nrwst","niwst","rmws","isNegNum","q","bits","carryMask","newCarry","hint","extended","mask","maskedWords","mode","bhi","bhiBits","diff","qj","positive","div","dm","half","r2","acc","A","B","C","D","g","yp","xp","im","jm","x1","x2","delta","negative","Red","ctx","primes","MPrime","name","tmp","rlen","input","K256","output","outLen","prev","next","P224","P192","P25519","prime","mod3","one","nOne","lpow","z","inv","windowSize","wnd","current","currentLen","Mont","u","isValidSuiAddress","SuiClient","normalizeSuiAddress","cacheTime5min","cacheTime24h","getFutureTime","interval","CachedContent","value","overdueTime","Ed25519Keypair","Secp256k1Keypair","fromB64","fromBase64","fromHex","fromHEX","normalizeSuiObjectId","coinWithBalance","DETAILS_KEYS","BaseError","_BaseError","message","code","details","error","CommonError","BaseError","message","errorCode","details","code","handleMessageError","code","message","details","CommonError","EXP_LIMIT","MAX_DIGITS","NUMERALS","LN10","PI","DEFAULTS","inexact","quadrant","external","decimalError","invalidArgument","precisionLimitExceeded","cryptoUnavailable","tag","mathfloor","mathpow","isBinary","isHex","isOctal","isDecimal","BASE","LOG_BASE","MAX_SAFE_INTEGER","LN10_PRECISION","PI_PRECISION","P","x","finalise","min","max","k","Ctor","y","i","j","xdL","ydL","xd","yd","xs","ys","pr","rm","cosine","toLessThanHalfPi","e","m","n","r","rep","sd","t","t3","t3plusx","digitsToString","divide","w","d","len","one","tinyPow","taylorSeries","cosh2_x","d8","sinh2_x","d5","d16","d20","getPi","wpr","xsd","halfPi","px","x2","base","isBase10","denominator","inf","num","arg","guard","naturalLogarithm","getLn10","checkRoundingDigits","xe","xLTy","getBase10Exponent","q","naturalExponential","carry","z","getPrecision","sine","s","rL","toStringBinary","dp","checkInt32","str","finiteToString","maxD","d0","d1","d2","n0","n1","yn","intPow","ws","indexOfLastWord","getZeroString","repeating","di","rd","convertBase","baseIn","baseOut","arr","arrL","strL","cos2x","multiplyInteger","temp","compare","a","b","aL","bL","subtract","cmp","logBase","more","prod","prodL","qd","rem","remL","rem0","xi","xL","yd0","yL","yz","sign","isTruncated","digits","roundUp","xdi","out","isExp","nonFiniteToString","zs","truncate","isOdd","maxOrMin","args","pow","sum","c","c0","numerator","x1","parseDecimal","parseOther","divisor","isFloat","p","Decimal","sin2_x","isHyperbolic","u","isNeg","pi","abs","acos","acosh","add","asin","asinh","atan","atanh","atan2","cbrt","ceil","clamp","config","obj","v","useDefaults","ps","cos","cosh","clone","isDecimalInstance","div","exp","floor","hypot","ln","log","log10","log2","mod","mul","random","round","sin","sinh","sqrt","sub","tan","tanh","trunc","decimal_default","d","value","decimal_default","decimalsMultiplier","decimals","toDecimalsAmount","amount","mul","asUintN","int","bits","asIntN","fromDecimalsAmount","fixDEAdd","num","precision","autoFix","number","strN","flag","result","n","nl","nr","type","floatN","params","pr","i","strL","pal","par","convertScientificToDecimal","numStr","newNum","base","exponentStr","integerPart","exponent","zeros","integerLength","intPart","fracPart","DEFAULT_GAS_BUDGET_FOR_SPLIT","DEFAULT_GAS_BUDGET_FOR_MERGE","DEFAULT_GAS_BUDGET_FOR_TRANSFER","DEFAULT_GAS_BUDGET_FOR_TRANSFER_SUI","DEFAULT_GAS_BUDGET_FOR_STAKE","GAS_TYPE_ARG","GAS_TYPE_ARG_LONG","GAS_SYMBOL","DEFAULT_NFT_TRANSFER_GAS_FEE","SUI_SYSTEM_STATE_OBJECT_ID","CoinAssist","_CoinAssist","objs","coinAddress","balanceTotal","obj","coinType","allSuiObjects","coins","anObj","normalizeCoinType","extractStructTagFromType","amount","exclude","selectedResult","objectArray","item","remainCoins","amountArray","sortedCoins","c","total","sum","selectedCoins","remainingCoins","target","coinWithSmallestSufficientBalanceIndex","coinWithLargestBalance","a","b","partialSum","tx","allCoins","buildVector","fixAmount","coinAssets","amountTotal","coinWithBalance","amountCoin","original_spited_coin","target_coin","target_coin_amount","remain_coins","selected_coins","id","selectedCoinsResult","totalSelectedCoinAmount","coinObjectIds","primaryCoinA","mergeCoinAs","primaryCoinAObject","targetCoin","targetCoinAmount","originalSpitedCoin","coin","zeroCoin","amounts","txb","balance","coinInput","coinObj","d","handleMessageError","allCoinAssets","amountArr","amountCoins","index","totalAmount","acc","curr","otherCoins","HEX_REGEXP","addHexPrefix","hex","removeHexPrefix","shortString","str","start","end","slen","elen","shortAddress","address","checkAddress","options","toBuffer","v","bufferToHex","buffer","hexToNumber","binaryData","view","utf8to16","out","i","c","char2","char3","len","hexToString","val","newStr","convertU64BytesToDecimal","bytes","hexString","b","EQUAL","LESS_THAN","GREATER_THAN","cmp","a","b","compare","symbolX","symbolY","i","len","lenCmp","elemCmp","isSortedSymbols","composeType","address","args","generics","result","extractAddressFromType","type","extractStructTagFromType","_type","structTag","item","CoinAssist","parts","GAS_TYPE_ARG","GAS_TYPE_ARG_LONG","normalizeSuiObjectId","normalizeCoinType","coinType","fixSuiObjectId","value","fixCoinType","removePrefix","arr","normalizeAddress","removeHexPrefix","patchFixSuiObjectId","data","key","secretKeyToEd25519Keypair","secretKey","ecode","Ed25519Keypair","hexKey","fromHex","fromBase64","secretKeyToSecp256k1Keypair","Secp256k1Keypair","fromHEX","fromB64","RpcModule","SuiClient","coinType","cacheKey","cachedData","res","digest","objects","query","paginationArgs","result","hasNextPage","queryAll","nextCursor","filter","order","owner","parentId","ids","options","limit","objectDataResponses","i","error","tx","sender","devResult","gasUsed","keypair","simulationAccount","simulate","normalizeSuiAddress","suiAddress","allCoinAsset","allCoinObject","coin","extractStructTagFromType","allCoinBalance","key","data","time","cacheData","getFutureTime","CachedContent","forceRefresh","isValid","SdkWrapper","options","RpcModule","patchFixSuiObjectId","clmmSDK","validate","isValidSuiAddress","handleMessageError","value","key","data","time","cacheData","getFutureTime","CachedContent","forceRefresh","isValid","import_bn","MAX_TICK_INDEX","MIN_TICK_INDEX","MAX_SQRT_PRICE","TICK_ARRAY_SIZE","MIN_SQRT_PRICE","FEE_RATE_DENOMINATOR","BN","PositionStatus","CLOCK_ADDRESS","CoinInfoAddress","CoinStoreAddress","FullRpcUrlMainnet","FullRpcUrlTestnet","DefaultProviders","import_bn","ZERO","BN","ONE","TWO","U128","U64_MAX","U128_MAX","MathUtil","num","decimal_default","n","result","n0","n1","limit","handleMessageError","denom","shift","roundUp","p","bit","v","TickUtil","tickSpacing","MIN_TICK_INDEX","MAX_TICK_INDEX","getNearestTickByTick","tickIndex","mod","getDefaultSqrtPriceLimit","a2b","MIN_SQRT_PRICE","MAX_SQRT_PRICE","getTickSide","afterTick","lowerTick","upperTick","getSuiObjectData","resp","getObjectDeletedResponse","error","getObjectNotExistsResponse","getObjectReference","exists","getObjectId","data","getObjectVersion","isSuiObjectResponse","isSuiObjectDataWithContent","getMovePackageContent","suiObject","getMoveObject","getMoveObjectType","getObjectType","getObjectPreviousTransactionDigest","getObjectOwner","getObjectDisplay","display","getObjectFields","object","fields","hasPublicTransfer","buildNFT","objects","nft","decimal_default","import_bn","import_bn","BIT_PRECISION","LOG_B_2_X32","LOG_B_P_ERR_MARGIN_LOWER_X64","LOG_B_P_ERR_MARGIN_UPPER_X64","TICK_BOUND","signedShiftLeft","n0","shiftBy","bitWidth","twosN0","signedShiftRight","twoN0","tickIndexToSqrtPricePositive","tick","ratio","BN","tickIndexToSqrtPriceNegative","tickIndex","TickMath","_TickMath","price","decimalsA","decimalsB","MathUtil","decimal_default","sqrtPriceX64","MAX_SQRT_PRICE","MIN_SQRT_PRICE","msb","adjustedMsb","log2pIntegerX32","bit","precision","log2pFractionX64","r","rMoreThanTwo","log2pFractionX32","logbpX64","tickLow","tickHigh","tickSpacing","tickScore","d","getDeltaA","sqrtPrice0","sqrtPrice1","liquidity","roundUp","sqrtPriceDiff","numerator","denominator","quotient","remainder","ZERO","BN","getDeltaB","p","result","U64_MAX","ONE","MathUtil","getNextSqrtPriceAUp","sqrtPrice","amount","byAmountIn","liquidityShl64","product","nextSqrtPrice","MIN_SQRT_PRICE","MAX_SQRT_PRICE","getNextSqrtPriceBDown","deltaSqrtPrice","getNextSqrtPriceFromInput","aToB","getNextSqrtPriceFromOutput","a2b","getDeltaUpFromInput","currentSqrtPrice","targetSqrtPrice","getDeltaDownFromOutput","estimateLiquidityForCoinA","sqrtPriceX","sqrtPriceY","coinAmount","lowerSqrtPriceX64","upperSqrtPriceX64","num","dem","estimateLiquidityForCoinB","delta","ClmmPoolUtil","_ClmmPoolUtil","curSqrtPrice","lowerSqrtPrice","upperSqrtPrice","liq","decimal_default","curSqrtPriceStr","lowerPriceStr","upperPriceStr","coinA","coinB","lowerTick","upperTick","isCoinA","slippage","currentTick","TickMath","coinAmounts","tokenLimitA","d","tokenLimitB","tokenAmount","handleMessageError","DETAILS_KEYS","currTick","estimateLiquidityAmountA","estimateLiquidityAmountB","coinAmountA","coin_amount_b","currPrice","transformAmountB","totalAmount","ratioA","ratioB","coin_decimal_a","coin_decimal_b","toDecimalsAmount","coinAmountB","amountA","fromDecimalsAmount","amountB","totalValue","tokenPriceA","tokenPriceB","decimalsA","decimalsB","currentTickIndex","lowerTickIndex","upperTickIndex","getPackagerConfigs","packageObj","printTransaction","tx","isPrint","item","index","import_bn","Percentage","_Percentage","numerator","denominator","number","Decimal","num","BN","denom","adjustForSlippage","n","adjustUp","adjustForCoinSlippage","tokenAmount","slippage","coinLimitA","coinLimitB","error","errorMessage"]}