{
  "address": "0x868a44F9d9F09331da425539a174a2128b85D672",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_stargateBridgeAddress",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_stgTokenAddress",
          "type": "address"
        },
        {
          "internalType": "uint16",
          "name": "_localChainId",
          "type": "uint16"
        },
        {
          "internalType": "address",
          "name": "_ulnAddress",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_relayerAddress",
          "type": "address"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "inputs": [],
      "name": "PACKET_SIGNATURE",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "uint16",
              "name": "srcChainId",
              "type": "uint16"
            },
            {
              "internalType": "uint16",
              "name": "dstChainId",
              "type": "uint16"
            },
            {
              "internalType": "uint64",
              "name": "nonce",
              "type": "uint64"
            },
            {
              "internalType": "address",
              "name": "dstAddress",
              "type": "address"
            },
            {
              "internalType": "bytes",
              "name": "srcAddress",
              "type": "bytes"
            },
            {
              "internalType": "bytes32",
              "name": "ulnAddress",
              "type": "bytes32"
            },
            {
              "internalType": "bytes",
              "name": "payload",
              "type": "bytes"
            }
          ],
          "internalType": "struct LayerZeroPacket.Packet",
          "name": "packet",
          "type": "tuple"
        },
        {
          "internalType": "bytes32",
          "name": "blockHash",
          "type": "bytes32"
        },
        {
          "internalType": "bytes32",
          "name": "receiptsRoot",
          "type": "bytes32"
        }
      ],
      "name": "assertMessagePath",
      "outputs": [],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        },
        {
          "internalType": "uint16",
          "name": "srcChain",
          "type": "uint16"
        },
        {
          "internalType": "uint256",
          "name": "sizeOfSrcAddress",
          "type": "uint256"
        },
        {
          "internalType": "bytes32",
          "name": "ulnAddress",
          "type": "bytes32"
        }
      ],
      "name": "getPacket",
      "outputs": [
        {
          "components": [
            {
              "internalType": "uint16",
              "name": "srcChainId",
              "type": "uint16"
            },
            {
              "internalType": "uint16",
              "name": "dstChainId",
              "type": "uint16"
            },
            {
              "internalType": "uint64",
              "name": "nonce",
              "type": "uint64"
            },
            {
              "internalType": "address",
              "name": "dstAddress",
              "type": "address"
            },
            {
              "internalType": "bytes",
              "name": "srcAddress",
              "type": "bytes"
            },
            {
              "internalType": "bytes32",
              "name": "ulnAddress",
              "type": "bytes32"
            },
            {
              "internalType": "bytes",
              "name": "payload",
              "type": "bytes"
            }
          ],
          "internalType": "struct LayerZeroPacket.Packet",
          "name": "",
          "type": "tuple"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getUtilsVersion",
      "outputs": [
        {
          "internalType": "uint8",
          "name": "",
          "type": "uint8"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "hashRoot",
          "type": "bytes32"
        },
        {
          "internalType": "uint256[]",
          "name": "receiptSlotIndex",
          "type": "uint256[]"
        },
        {
          "internalType": "uint256",
          "name": "logIndex",
          "type": "uint256"
        },
        {
          "internalType": "bytes[]",
          "name": "proof",
          "type": "bytes[]"
        }
      ],
      "name": "getVerifyLog",
      "outputs": [
        {
          "components": [
            {
              "internalType": "bytes32",
              "name": "contractAddress",
              "type": "bytes32"
            },
            {
              "internalType": "bytes32",
              "name": "topicZeroSig",
              "type": "bytes32"
            },
            {
              "internalType": "bytes",
              "name": "data",
              "type": "bytes"
            }
          ],
          "internalType": "struct IValidationLibraryHelper.ULNLog",
          "name": "",
          "type": "tuple"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "localChainId",
      "outputs": [
        {
          "internalType": "uint16",
          "name": "",
          "type": "uint16"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "relayerAddress",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes",
          "name": "_payload",
          "type": "bytes"
        }
      ],
      "name": "secureStgPayload",
      "outputs": [
        {
          "internalType": "bytes",
          "name": "",
          "type": "bytes"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes",
          "name": "_payload",
          "type": "bytes"
        }
      ],
      "name": "secureStgTokenPayload",
      "outputs": [
        {
          "internalType": "bytes",
          "name": "",
          "type": "bytes"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "stargateBridgeAddress",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "stgTokenAddress",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "uln",
      "outputs": [
        {
          "internalType": "contract IUltraLightNode",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "utilsVersion",
      "outputs": [
        {
          "internalType": "uint8",
          "name": "",
          "type": "uint8"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "_receiptsRoot",
          "type": "bytes32"
        },
        {
          "internalType": "bytes",
          "name": "_transactionProof",
          "type": "bytes"
        },
        {
          "internalType": "uint256",
          "name": "_remoteAddressSize",
          "type": "uint256"
        }
      ],
      "name": "validateProof",
      "outputs": [
        {
          "components": [
            {
              "internalType": "uint16",
              "name": "srcChainId",
              "type": "uint16"
            },
            {
              "internalType": "uint16",
              "name": "dstChainId",
              "type": "uint16"
            },
            {
              "internalType": "uint64",
              "name": "nonce",
              "type": "uint64"
            },
            {
              "internalType": "address",
              "name": "dstAddress",
              "type": "address"
            },
            {
              "internalType": "bytes",
              "name": "srcAddress",
              "type": "bytes"
            },
            {
              "internalType": "bytes32",
              "name": "ulnAddress",
              "type": "bytes32"
            },
            {
              "internalType": "bytes",
              "name": "payload",
              "type": "bytes"
            }
          ],
          "internalType": "struct LayerZeroPacket.Packet",
          "name": "",
          "type": "tuple"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    }
  ],
  "transactionHash": "0x845d68659434cea62d9a84ee37ff94105d4e109cb212f8c447716f35d0aa7ba1",
  "receipt": {
    "to": null,
    "from": "0x9F403140Bc0574D7d36eA472b82DAa1Bbd4eF327",
    "contractAddress": "0x868a44F9d9F09331da425539a174a2128b85D672",
    "transactionIndex": 27,
    "gasUsed": "2236839",
    "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000008000000000000000000000000000000000000000000000000000000000800000000000000000000100000000000000000000000000000000000000000000000000000000000080000000000100000000000000000000000000000000000000000000000000000000010000000000200000000000000000000000000000000000000200000000000000000000004000000000000000000001000000000000000000000000000000100000000000000000000000000000100000000000000000000000000000200000000000100000",
    "blockHash": "0xe244746ddc5933c626a8137a0ee1f6444e39a20faeab237912b787d85a6adee1",
    "transactionHash": "0x845d68659434cea62d9a84ee37ff94105d4e109cb212f8c447716f35d0aa7ba1",
    "logs": [
      {
        "transactionIndex": 27,
        "blockNumber": 28692983,
        "transactionHash": "0x845d68659434cea62d9a84ee37ff94105d4e109cb212f8c447716f35d0aa7ba1",
        "address": "0x0000000000000000000000000000000000001010",
        "topics": [
          "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63",
          "0x0000000000000000000000000000000000000000000000000000000000001010",
          "0x0000000000000000000000009f403140bc0574d7d36ea472b82daa1bbd4ef327",
          "0x000000000000000000000000b9ede6f94d192073d8eaf85f8db677133d483249"
        ],
        "data": "0x00000000000000000000000000000000000000000000000000fe4c953d45985800000000000000000000000000000000000000000000002b40d4e3e9057b74b3000000000000000000000000000000000000000000003cf79162aa986fb5a4b800000000000000000000000000000000000000000000002b3fd69753c835dc5b000000000000000000000000000000000000000000003cf79260f72dacfb3d10",
        "logIndex": 138,
        "blockHash": "0xe244746ddc5933c626a8137a0ee1f6444e39a20faeab237912b787d85a6adee1"
      }
    ],
    "blockNumber": 28692983,
    "cumulativeGasUsed": "17119461",
    "status": 1,
    "byzantium": true
  },
  "args": [
    "0x9d1B1669c73b033DFe47ae5a0164Ab96df25B944",
    "0x2F6F07CDcf3588944Bf4C42aC74ff24bF56e7590",
    9,
    "0x66A71Dcef29A0fFBDBE3c6a460a3B5BC225Cd675",
    "0xFe7C30860D01e28371D40434806F4A8fcDD3A098"
  ],
  "numDeployments": 1,
  "solcInputHash": "e08677fd8c43357136289d3b3524eac3",
  "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_stargateBridgeAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_stgTokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"_localChainId\",\"type\":\"uint16\"},{\"internalType\":\"address\",\"name\":\"_ulnAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_relayerAddress\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"PACKET_SIGNATURE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint16\",\"name\":\"srcChainId\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"dstChainId\",\"type\":\"uint16\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"dstAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"srcAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"ulnAddress\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"payload\",\"type\":\"bytes\"}],\"internalType\":\"struct LayerZeroPacket.Packet\",\"name\":\"packet\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"blockHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"receiptsRoot\",\"type\":\"bytes32\"}],\"name\":\"assertMessagePath\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"uint16\",\"name\":\"srcChain\",\"type\":\"uint16\"},{\"internalType\":\"uint256\",\"name\":\"sizeOfSrcAddress\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"ulnAddress\",\"type\":\"bytes32\"}],\"name\":\"getPacket\",\"outputs\":[{\"components\":[{\"internalType\":\"uint16\",\"name\":\"srcChainId\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"dstChainId\",\"type\":\"uint16\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"dstAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"srcAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"ulnAddress\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"payload\",\"type\":\"bytes\"}],\"internalType\":\"struct LayerZeroPacket.Packet\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getUtilsVersion\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"hashRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256[]\",\"name\":\"receiptSlotIndex\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256\",\"name\":\"logIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes[]\",\"name\":\"proof\",\"type\":\"bytes[]\"}],\"name\":\"getVerifyLog\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"contractAddress\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"topicZeroSig\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"struct IValidationLibraryHelper.ULNLog\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"localChainId\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"relayerAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_payload\",\"type\":\"bytes\"}],\"name\":\"secureStgPayload\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_payload\",\"type\":\"bytes\"}],\"name\":\"secureStgTokenPayload\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"stargateBridgeAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"stgTokenAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"uln\",\"outputs\":[{\"internalType\":\"contract IUltraLightNode\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"utilsVersion\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_receiptsRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"_transactionProof\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_remoteAddressSize\",\"type\":\"uint256\"}],\"name\":\"validateProof\",\"outputs\":[{\"components\":[{\"internalType\":\"uint16\",\"name\":\"srcChainId\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"dstChainId\",\"type\":\"uint16\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"dstAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"srcAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"ulnAddress\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"payload\",\"type\":\"bytes\"}],\"internalType\":\"struct LayerZeroPacket.Packet\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/MPTValidatorV5.sol\":\"MPTValidatorV5\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":100000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/math/SafeMath.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.7.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary SafeMath {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        uint256 c = a + b;\\n        if (c < a) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b > a) return (false, 0);\\n        return (true, a - b);\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n        // benefit is lost if 'b' is also tested.\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n        if (a == 0) return (true, 0);\\n        uint256 c = a * b;\\n        if (c / a != b) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a / b);\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a % b);\\n    }\\n\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        uint256 c = a + b;\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        if (a == 0) return 0;\\n        uint256 c = a * b;\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: division by zero\\\");\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: modulo by zero\\\");\\n        return a % b;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {trySub}.\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b <= a, errorMessage);\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryDiv}.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting with custom message when dividing by zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryMod}.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a % b;\\n    }\\n}\\n\",\"keccak256\":\"0xe22a1fc7400ae196eba2ad1562d0386462b00a6363b742d55a2fd2021a58586f\",\"license\":\"MIT\"},\"contracts/MPTValidatorV5.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\n\\npragma solidity 0.7.6;\\npragma abicoder v2;\\n\\nimport \\\"./interfaces/IValidationLibraryHelper.sol\\\";\\nimport \\\"./utility/LayerZeroPacket.sol\\\";\\nimport \\\"./utility/PacketDecoder.sol\\\";\\nimport \\\"./utility/UltraLightNodeEVMDecoder.sol\\\";\\n\\ninterface IUltraLightNode {\\n    struct BlockData {\\n        uint confirmations;\\n        bytes32 data;\\n    }\\n\\n    struct ApplicationConfiguration {\\n        uint16 inboundProofLibraryVersion;\\n        uint64 inboundBlockConfirmations;\\n        address relayer;\\n        uint16 outboundProofType;\\n        uint64 outboundBlockConfirmations;\\n        address oracle;\\n    }\\n\\n    function getAppConfig(uint16 _chainId, address userApplicationAddress) external view returns (ApplicationConfiguration memory);\\n    function getBlockHeaderData(address _oracle, uint16 _remoteChainId, bytes32 _lookupHash) external view returns (BlockData memory blockData);\\n}\\n\\ninterface IStargate {\\n    // Stargate objects for abi encoding / decoding\\n    struct SwapObj {\\n        uint256 amount;\\n        uint256 eqFee;\\n        uint256 eqReward;\\n        uint256 lpFee;\\n        uint256 protocolFee;\\n        uint256 lkbRemove;\\n    }\\n\\n    struct CreditObj {\\n        uint256 credits;\\n        uint256 idealBalance;\\n    }\\n}\\n\\ncontract MPTValidatorV5 is ILayerZeroValidationLibrary, IValidationLibraryHelper {\\n    using RLPDecode for RLPDecode.RLPItem;\\n    using RLPDecode for RLPDecode.Iterator;\\n    using PacketDecoder for bytes;\\n\\n    uint8 public utilsVersion = 3;\\n    bytes32 public constant PACKET_SIGNATURE = 0xe8d23d927749ec8e512eb885679c2977d57068839d8cca1a85685dbbea0648f6;\\n\\n    address immutable public stargateBridgeAddress;\\n    address immutable public stgTokenAddress;\\n    address immutable public relayerAddress;\\n    uint16 immutable public localChainId;\\n    IUltraLightNode immutable public uln;\\n\\n    constructor (address _stargateBridgeAddress, address _stgTokenAddress, uint16 _localChainId, address _ulnAddress, address _relayerAddress) {\\n        stargateBridgeAddress = _stargateBridgeAddress;\\n        stgTokenAddress = _stgTokenAddress;\\n        localChainId = _localChainId;\\n        uln = IUltraLightNode(_ulnAddress);\\n        relayerAddress = _relayerAddress;\\n    }\\n\\n    function validateProof(bytes32 _receiptsRoot, bytes calldata _transactionProof, uint _remoteAddressSize) external view override returns (LayerZeroPacket.Packet memory) {\\n        require(_remoteAddressSize > 0, \\\"ProofLib: invalid address size\\\");\\n\\n        (uint16 remoteChainId, bytes32 blockHash, bytes[] memory proof, uint[] memory receiptSlotIndex, uint logIndex) = abi.decode(_transactionProof, (uint16, bytes32, bytes[], uint[], uint));\\n\\n        ULNLog memory log = _getVerifiedLog(_receiptsRoot, receiptSlotIndex, logIndex, proof);\\n        require(log.topicZeroSig == PACKET_SIGNATURE, \\\"ProofLib: packet not recognized\\\"); //data\\n\\n        LayerZeroPacket.Packet memory packet = log.data.getPacket(remoteChainId, _remoteAddressSize, log.contractAddress);\\n\\n        _assertMessagePath(packet, blockHash, _receiptsRoot);\\n\\n        if (packet.dstAddress == stargateBridgeAddress) packet.payload = _secureStgPayload(packet.payload);\\n\\n        if (packet.dstAddress == stgTokenAddress) packet.payload = _secureStgTokenPayload(packet.payload);\\n\\n        return packet;\\n    }\\n\\n    function _assertMessagePath(LayerZeroPacket.Packet memory packet, bytes32 blockHash, bytes32 receiptsRoot) internal view {\\n        require(packet.dstChainId == localChainId, \\\"ProofLib: invalid destination chain ID\\\");\\n\\n        IUltraLightNode.ApplicationConfiguration memory appConfig = uln.getAppConfig(packet.srcChainId, packet.dstAddress);\\n        IUltraLightNode.BlockData memory blockData = uln.getBlockHeaderData(appConfig.oracle, packet.srcChainId, blockHash);\\n        require(appConfig.relayer == relayerAddress, \\\"ProofLib: invalid relayer\\\");\\n\\n        require(blockData.data == receiptsRoot, \\\"ProofLib: invalid receipt root\\\");\\n\\n        require(blockData.confirmations >= appConfig.inboundBlockConfirmations, \\\"ProofLib: not enough block confirmations\\\");\\n    }\\n\\n    function _secureStgTokenPayload(bytes memory _payload) internal pure returns (bytes memory) {\\n        (bytes memory toAddressBytes, uint256 qty) = abi.decode(_payload, (bytes, uint256));\\n\\n        address toAddress = address(0);\\n        if (toAddressBytes.length > 0) {\\n            assembly { toAddress := mload(add(toAddressBytes, 20))}\\n        }\\n\\n        if (toAddress == address(0)) {\\n            address deadAddress = address(0x000000000000000000000000000000000000dEaD);\\n            bytes memory newToAddressBytes = abi.encodePacked(deadAddress);\\n            return abi.encode(newToAddressBytes, qty);\\n        }\\n\\n        // default to return the original payload\\n        return _payload;\\n    }\\n\\n    function _secureStgPayload(bytes memory _payload) internal view returns (bytes memory) {\\n        // functionType is uint8 even though the encoding will take up the side of uint256\\n        uint8 functionType;\\n        assembly { functionType := mload(add(_payload, 32)) }\\n\\n        // TYPE_SWAP_REMOTE == 1 && only if the payload has a payload\\n        // only swapRemote inside of stargate can call sgReceive on an user supplied to address\\n        // thus we do not care about the other type functions even if the toAddress is overly long.\\n        if (functionType == 1) {\\n            // decode the _payload with its types\\n            (\\n                ,\\n                uint256 srcPoolId,\\n                uint256 dstPoolId,\\n                uint256 dstGasForCall,\\n                IStargate.CreditObj memory c,\\n                IStargate.SwapObj memory s,\\n                bytes memory toAddressBytes,\\n                bytes memory contractCallPayload\\n            ) = abi.decode(_payload, (uint8, uint256, uint256, uint256, IStargate.CreditObj, IStargate.SwapObj, bytes, bytes));\\n\\n            // if contractCallPayload.length > 0 need to check if the to address is a contract or not\\n            if (contractCallPayload.length > 0) {\\n                // otherwise, need to check if the payload can be delivered to the toAddress\\n                address toAddress = address(0);\\n                if (toAddressBytes.length > 0) {\\n                    assembly { toAddress := mload(add(toAddressBytes, 20)) }\\n                }\\n\\n                // check if the toAddress is a contract. We are not concerned about addresses that pretend to be wallets. because worst case we just delete their payload if being malicious\\n                // we can guarantee that if a size > 0, then the contract is definitely a contract address in this context\\n                uint size;\\n                assembly { size := extcodesize(toAddress) }\\n\\n                if (size == 0) {\\n                    // size == 0 indicates its not a contract, payload wont be delivered\\n                    // secure the _payload to make sure funds can be delivered to the toAddress\\n                    bytes memory newToAddressBytes = abi.encodePacked(toAddress);\\n                    bytes memory securePayload = abi.encode(functionType, srcPoolId, dstPoolId, dstGasForCall, c, s, newToAddressBytes, bytes(\\\"\\\"));\\n                    return securePayload;\\n                }\\n            }\\n        }\\n\\n        // default to return the original payload\\n        return _payload;\\n    }\\n\\n    function secureStgTokenPayload(bytes memory _payload) external pure returns(bytes memory) {\\n        return _secureStgTokenPayload(_payload);\\n    }\\n\\n    function secureStgPayload(bytes memory _payload) external view returns(bytes memory) {\\n        return _secureStgPayload(_payload);\\n    }\\n\\n    function _getVerifiedLog(bytes32 hashRoot, uint[] memory paths, uint logIndex, bytes[] memory proof) internal pure returns(ULNLog memory) {\\n        require(paths.length == proof.length, \\\"ProofLib: invalid proof size\\\");\\n        require(proof.length >0, \\\"ProofLib: proof size must > 0\\\");\\n        RLPDecode.RLPItem memory item;\\n        bytes memory proofBytes;\\n\\n        for (uint i = 0; i < proof.length; i++) {\\n            proofBytes = proof[i];\\n            require(hashRoot == keccak256(proofBytes), \\\"ProofLib: invalid hashlink\\\");\\n            item = RLPDecode.toRlpItem(proofBytes).safeGetItemByIndex(paths[i]);\\n            if (i < proof.length - 1) hashRoot = bytes32(item.toUint());\\n        }\\n\\n        // burning status + gasUsed + logBloom\\n        RLPDecode.RLPItem memory logItem = item.typeOffset().safeGetItemByIndex(3);\\n        RLPDecode.Iterator memory it =  logItem.safeGetItemByIndex(logIndex).iterator();\\n        ULNLog memory log;\\n        log.contractAddress = bytes32(it.next().toUint());\\n        log.topicZeroSig = bytes32(it.next().safeGetItemByIndex(0).toUint());\\n        log.data = it.next().toBytes();\\n\\n        return log;\\n    }\\n\\n    function getUtilsVersion() external override view returns(uint8) {\\n        return utilsVersion;\\n    }\\n\\n    function getVerifyLog(bytes32 hashRoot, uint[] memory receiptSlotIndex, uint logIndex, bytes[] memory proof) external override pure returns(ULNLog memory){\\n        return _getVerifiedLog(hashRoot, receiptSlotIndex, logIndex, proof);\\n    }\\n\\n    function getPacket(bytes memory data, uint16 srcChain, uint sizeOfSrcAddress, bytes32 ulnAddress) external override pure returns(LayerZeroPacket.Packet memory){\\n        return data.getPacket(srcChain, sizeOfSrcAddress, ulnAddress);\\n    }\\n\\n    // profiling and test\\n    function assertMessagePath(LayerZeroPacket.Packet memory packet, bytes32 blockHash, bytes32 receiptsRoot) external view {\\n        _assertMessagePath(packet, blockHash, receiptsRoot);\\n    }\\n}\\n\",\"keccak256\":\"0x7d0b72d0a8b43ac0a330537e7b808a1fbdc5a88f7557c12bda00dbf78ae3550f\",\"license\":\"BUSL-1.1\"},\"contracts/interfaces/ILayerZeroValidationLibrary.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\n\\npragma solidity >=0.7.0;\\npragma abicoder v2;\\n\\nimport \\\"../utility/LayerZeroPacket.sol\\\";\\n\\ninterface ILayerZeroValidationLibrary {\\n    function validateProof(bytes32 blockData, bytes calldata _data, uint _remoteAddressSize) external returns (LayerZeroPacket.Packet memory packet);\\n}\\n\",\"keccak256\":\"0x8143e501d169a928c580c4aed06d67438d4ae5689ba9516c0a32b55b2aaf4e96\",\"license\":\"BUSL-1.1\"},\"contracts/interfaces/IValidationLibraryHelper.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\n\\npragma solidity >=0.7.0;\\npragma abicoder v2;\\n\\nimport \\\"../utility/LayerZeroPacket.sol\\\";\\nimport \\\"./ILayerZeroValidationLibrary.sol\\\";\\n\\ninterface IValidationLibraryHelper {\\n    struct ULNLog{\\n        bytes32 contractAddress;\\n        bytes32 topicZeroSig;\\n        bytes data;\\n    }\\n\\n    function getVerifyLog(bytes32 hashRoot, uint[] memory receiptSlotIndex, uint logIndex, bytes[] memory proof) external pure returns(ULNLog memory);\\n    function getPacket(bytes memory data, uint16 srcChain, uint sizeOfSrcAddress, bytes32 ulnAddress) external pure returns(LayerZeroPacket.Packet memory);\\n    function getUtilsVersion() external view returns(uint8);\\n}\\n\",\"keccak256\":\"0x40033cf7ccff290e714e4747436ead52a3c5fa3f12fbdf7644c95bcf6e3139e1\",\"license\":\"BUSL-1.1\"},\"contracts/utility/Buffer.sol\":{\"content\":\"// SPDX-License-Identifier: BSD-2-Clause\\n// https://github.com/ensdomains/buffer\\n\\npragma solidity ^0.7.0;\\n\\n/**\\n * @dev A library for working with mutable byte buffers in Solidity.\\n *\\n * Byte buffers are mutable and expandable, and provide a variety of primitives\\n * for writing to them. At any time you can fetch a bytes object containing the\\n * current contents of the buffer. The bytes object should not be stored between\\n * operations, as it may change due to resizing of the buffer.\\n */\\nlibrary Buffer {\\n    /**\\n     * @dev Represents a mutable buffer. Buffers have a current value (buf) and\\n     *      a capacity. The capacity may be longer than the current value, in\\n     *      which case it can be extended without the need to allocate more memory.\\n     */\\n    struct buffer {\\n        bytes buf;\\n        uint capacity;\\n    }\\n\\n    /**\\n     * @dev Initializes a buffer with an initial capacity.a co\\n     * @param buf The buffer to initialize.\\n     * @param capacity The number of bytes of space to allocate the buffer.\\n     * @return The buffer, for chaining.\\n     */\\n    function init(buffer memory buf, uint capacity) internal pure returns (buffer memory) {\\n        if (capacity % 32 != 0) {\\n            capacity += 32 - (capacity % 32);\\n        }\\n        // Allocate space for the buffer data\\n        buf.capacity = capacity;\\n        assembly {\\n            let ptr := mload(0x40)\\n            mstore(buf, ptr)\\n            mstore(ptr, 0)\\n            mstore(0x40, add(32, add(ptr, capacity)))\\n        }\\n        return buf;\\n    }\\n\\n\\n    /**\\n     * @dev Writes a byte string to a buffer. Resizes if doing so would exceed\\n     *      the capacity of the buffer.\\n     * @param buf The buffer to append to.\\n     * @param off The start offset to write to.\\n     * @param rawData The data to append.\\n     * @param len The number of bytes to copy.\\n     * @return The original buffer, for chaining.\\n     */\\n    function writeRawBytes(\\n        buffer memory buf,\\n        uint off,\\n        bytes memory rawData,\\n        uint offData,\\n        uint len\\n    ) internal pure returns (buffer memory) {\\n        if (off + len > buf.capacity) {\\n            resize(buf, max(buf.capacity, len + off) * 2);\\n        }\\n\\n        uint dest;\\n        uint src;\\n        assembly {\\n            // Memory address of the buffer data\\n            let bufptr := mload(buf)\\n            // Length of existing buffer data\\n            let buflen := mload(bufptr)\\n            // Start address = buffer address + offset + sizeof(buffer length)\\n            dest := add(add(bufptr, 32), off)\\n            // Update buffer length if we're extending it\\n            if gt(add(len, off), buflen) {\\n                mstore(bufptr, add(len, off))\\n            }\\n            src := add(rawData, offData)\\n        }\\n\\n        // Copy word-length chunks while possible\\n        for (; len >= 32; len -= 32) {\\n            assembly {\\n                mstore(dest, mload(src))\\n            }\\n            dest += 32;\\n            src += 32;\\n        }\\n\\n        // Copy remaining bytes\\n        uint mask = 256**(32 - len) - 1;\\n        assembly {\\n            let srcpart := and(mload(src), not(mask))\\n            let destpart := and(mload(dest), mask)\\n            mstore(dest, or(destpart, srcpart))\\n        }\\n\\n        return buf;\\n    }\\n\\n    /**\\n     * @dev Writes a byte string to a buffer. Resizes if doing so would exceed\\n     *      the capacity of the buffer.\\n     * @param buf The buffer to append to.\\n     * @param off The start offset to write to.\\n     * @param data The data to append.\\n     * @param len The number of bytes to copy.\\n     * @return The original buffer, for chaining.\\n     */\\n    function write(buffer memory buf, uint off, bytes memory data, uint len) internal pure returns (buffer memory) {\\n        require(len <= data.length);\\n\\n        if (off + len > buf.capacity) {\\n            resize(buf, max(buf.capacity, len + off) * 2);\\n        }\\n\\n        uint dest;\\n        uint src;\\n        assembly {\\n        // Memory address of the buffer data\\n            let bufptr := mload(buf)\\n        // Length of existing buffer data\\n            let buflen := mload(bufptr)\\n        // Start address = buffer address + offset + sizeof(buffer length)\\n            dest := add(add(bufptr, 32), off)\\n        // Update buffer length if we're extending it\\n            if gt(add(len, off), buflen) {\\n                mstore(bufptr, add(len, off))\\n            }\\n            src := add(data, 32)\\n        }\\n\\n        // Copy word-length chunks while possible\\n        for (; len >= 32; len -= 32) {\\n            assembly {\\n                mstore(dest, mload(src))\\n            }\\n            dest += 32;\\n            src += 32;\\n        }\\n\\n        // Copy remaining bytes\\n        uint mask = 256**(32 - len) - 1;\\n        assembly {\\n            let srcpart := and(mload(src), not(mask))\\n            let destpart := and(mload(dest), mask)\\n            mstore(dest, or(destpart, srcpart))\\n        }\\n\\n        return buf;\\n    }\\n\\n    function append(buffer memory buf, bytes memory data) internal pure returns (buffer memory) {\\n        return write(buf, buf.buf.length, data, data.length);\\n    }\\n\\n    function resize(buffer memory buf, uint capacity) private pure {\\n        bytes memory oldbuf = buf.buf;\\n        init(buf, capacity);\\n        append(buf, oldbuf);\\n    }\\n\\n    function max(uint a, uint b) private pure returns (uint) {\\n        if (a > b) {\\n            return a;\\n        }\\n        return b;\\n    }\\n}\\n\",\"keccak256\":\"0x4fb738133f8453cd2d28d530ee66b3b45a7969ba6372c008bcb0479fa3f6e8f9\",\"license\":\"BSD-2-Clause\"},\"contracts/utility/LayerZeroPacket.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\n\\npragma solidity 0.7.6;\\n\\nimport \\\"./Buffer.sol\\\";\\nimport \\\"@openzeppelin/contracts/math/SafeMath.sol\\\";\\n\\nlibrary LayerZeroPacket {\\n    using Buffer for Buffer.buffer;\\n    using SafeMath for uint;\\n\\n    struct Packet {\\n        uint16 srcChainId;\\n        uint16 dstChainId;\\n        uint64 nonce;\\n        address dstAddress;\\n        bytes srcAddress;\\n        bytes32 ulnAddress;\\n        bytes payload;\\n    }\\n\\n    function getPacket(\\n        bytes memory data,\\n        uint16 srcChain,\\n        uint sizeOfSrcAddress,\\n        bytes32 ulnAddress\\n    ) internal pure returns (LayerZeroPacket.Packet memory) {\\n        uint16 dstChainId;\\n        address dstAddress;\\n        uint size;\\n        uint64 nonce;\\n\\n        // The log consists of the destination chain id and then a bytes payload\\n        //      0--------------------------------------------31\\n        // 0   |  total bytes size\\n        // 32  |  destination chain id\\n        // 64  |  bytes offset\\n        // 96  |  bytes array size\\n        // 128 |  payload\\n        assembly {\\n            dstChainId := mload(add(data, 32))\\n            size := mload(add(data, 96)) /// size of the byte array\\n            nonce := mload(add(data, 104)) // offset to convert to uint64  128  is index -24\\n            dstAddress := mload(add(data, sub(add(128, sizeOfSrcAddress), 4))) // offset to convert to address 12 -8\\n        }\\n\\n        Buffer.buffer memory srcAddressBuffer;\\n        srcAddressBuffer.init(sizeOfSrcAddress);\\n        srcAddressBuffer.writeRawBytes(0, data, 136, sizeOfSrcAddress); // 128 + 8\\n\\n        uint payloadSize = size.sub(28).sub(sizeOfSrcAddress);\\n        Buffer.buffer memory payloadBuffer;\\n        payloadBuffer.init(payloadSize);\\n        payloadBuffer.writeRawBytes(0, data, sizeOfSrcAddress.add(156), payloadSize); // 148 + 8\\n        return LayerZeroPacket.Packet(srcChain, dstChainId, nonce, dstAddress, srcAddressBuffer.buf, ulnAddress, payloadBuffer.buf);\\n    }\\n}\\n\",\"keccak256\":\"0x5b91aad8bce172ea386a3314e89d8798affdb8c75193918a62c1fc9c6b61b263\",\"license\":\"BUSL-1.1\"},\"contracts/utility/PacketDecoder.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\n\\npragma solidity 0.7.6;\\npragma abicoder v2;\\n\\nimport \\\"./LayerZeroPacket.sol\\\";\\n\\nlibrary PacketDecoder {\\n    using Buffer for Buffer.buffer;\\n    using SafeMath for uint;\\n\\n    function getPacket(\\n        bytes memory data,\\n        uint16 srcChain,\\n        uint sizeOfSrcAddress,\\n        bytes32 ulnAddress\\n    ) internal pure returns (LayerZeroPacket.Packet memory) {\\n        uint16 dstChainId;\\n        address dstAddress;\\n        uint size;\\n        uint64 nonce;\\n\\n        // The log consists of the destination chain id and then a bytes payload\\n        //      0--------------------------------------------31\\n        // 0   |  total bytes size\\n        // 32  |  destination chain id\\n        // 64  |  bytes offset\\n        // 96  |  bytes array size\\n        // 128 |  payload\\n        assembly {\\n            dstChainId := mload(add(data, 32))\\n            size := mload(add(data, 96)) /// size of the byte array\\n            nonce := mload(add(data, 104)) // offset to convert to uint64  128  is index -24\\n            dstAddress := mload(add(data, sub(add(128, sizeOfSrcAddress), 4))) // offset to convert to address 12 -8\\n        }\\n\\n        Buffer.buffer memory srcAddressBuffer;\\n        srcAddressBuffer.init(sizeOfSrcAddress);\\n        srcAddressBuffer.writeRawBytes(0, data, 136, sizeOfSrcAddress); // 128 + 8\\n\\n        uint payloadSize = size.sub(28).sub(sizeOfSrcAddress);\\n        Buffer.buffer memory payloadBuffer;\\n        payloadBuffer.init(payloadSize);\\n        payloadBuffer.writeRawBytes(0, data, sizeOfSrcAddress.add(156), payloadSize); // 148 + 8\\n        return LayerZeroPacket.Packet(srcChain, dstChainId, nonce, dstAddress, srcAddressBuffer.buf, ulnAddress, payloadBuffer.buf);\\n    }\\n}\\n\",\"keccak256\":\"0x37348878d5f63bbea4532adf2bdb0a5ece602e7199d12124d800db137a38dee9\",\"license\":\"BUSL-1.1\"},\"contracts/utility/RLPDecode.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\n// https://github.com/hamdiallam/solidity-rlp\\n\\npragma solidity ^0.7.0;\\n\\nlibrary RLPDecode {\\n    uint8 constant STRING_SHORT_START = 0x80;\\n    uint8 constant STRING_LONG_START = 0xb8;\\n    uint8 constant LIST_SHORT_START = 0xc0;\\n    uint8 constant LIST_LONG_START = 0xf8;\\n    uint8 constant WORD_SIZE = 32;\\n\\n    struct RLPItem {\\n        uint len;\\n        uint memPtr;\\n    }\\n\\n    struct Iterator {\\n        RLPItem item; // Item that's being iterated over.\\n        uint nextPtr; // Position of the next item in the list.\\n    }\\n\\n    /*\\n     * @dev Returns the next element in the iteration. Reverts if it has not next element.\\n     * @param self The iterator.\\n     * @return The next element in the iteration.\\n     */\\n    function next(Iterator memory self) internal pure returns (RLPItem memory) {\\n        require(hasNext(self), \\\"RLPDecoder iterator has no next\\\");\\n\\n        uint ptr = self.nextPtr;\\n        uint itemLength = _itemLength(ptr);\\n        self.nextPtr = ptr + itemLength;\\n\\n        return RLPItem(itemLength, ptr);\\n    }\\n\\n    /*\\n     * @dev Returns true if the iteration has more elements.\\n     * @param self The iterator.\\n     * @return true if the iteration has more elements.\\n     */\\n    function hasNext(Iterator memory self) internal pure returns (bool) {\\n        RLPItem memory item = self.item;\\n        return self.nextPtr < item.memPtr + item.len;\\n    }\\n\\n    /*\\n     * @param item RLP encoded bytes\\n     */\\n\\n    function toRlpItem(bytes memory item) internal pure returns (RLPItem memory) {\\n        uint memPtr;\\n        assembly {\\n            memPtr := add(item, 0x20)\\n        }\\n        // offset the pointer if the first byte\\n\\n        uint8 byte0;\\n        assembly {\\n            byte0 := byte(0, mload(memPtr))\\n        }\\n        uint len = item.length;\\n        if (len > 0 && byte0 < LIST_SHORT_START) {\\n            assembly {\\n                memPtr := add(memPtr, 0x01)\\n            }\\n            len -= 1;\\n        }\\n        return RLPItem(len, memPtr);\\n    }\\n\\n    /*\\n     * @dev Create an iterator. Reverts if item is not a list.\\n     * @param self The RLP item.\\n     * @return An 'Iterator' over the item.\\n     */\\n    function iterator(RLPItem memory self) internal pure returns (Iterator memory) {\\n        require(isList(self), \\\"RLPDecoder iterator is not list\\\");\\n\\n        uint ptr = self.memPtr + _payloadOffset(self.memPtr);\\n        return Iterator(self, ptr);\\n    }\\n\\n    /*\\n     * @param item RLP encoded bytes\\n     */\\n    function rlpLen(RLPItem memory item) internal pure returns (uint) {\\n        return item.len;\\n    }\\n\\n    /*\\n     * @param item RLP encoded bytes\\n     */\\n    function payloadLen(RLPItem memory item) internal pure returns (uint) {\\n        uint offset = _payloadOffset(item.memPtr);\\n        require(item.len >= offset, \\\"RLPDecoder: invalid uint RLP item offset size\\\");\\n        return item.len - offset;\\n    }\\n\\n    /*\\n     * @param item RLP encoded list in bytes\\n     */\\n    function toList(RLPItem memory item) internal pure returns (RLPItem[] memory) {\\n        require(isList(item), \\\"RLPDecoder iterator is not a list\\\");\\n\\n        uint items = numItems(item);\\n        RLPItem[] memory result = new RLPItem[](items);\\n\\n        uint memPtr = item.memPtr + _payloadOffset(item.memPtr);\\n        uint dataLen;\\n        for (uint i = 0; i < items; i++) {\\n            dataLen = _itemLength(memPtr);\\n            result[i] = RLPItem(dataLen, memPtr);\\n            memPtr = memPtr + dataLen;\\n        }\\n\\n        return result;\\n    }\\n\\n    /*\\n     * @param get the RLP item by index. save gas.\\n     */\\n    function getItemByIndex(RLPItem memory item, uint idx) internal pure returns (RLPItem memory) {\\n        require(isList(item), \\\"RLPDecoder iterator is not a list\\\");\\n\\n        uint memPtr = item.memPtr + _payloadOffset(item.memPtr);\\n        uint dataLen;\\n        for (uint i = 0; i < idx; i++) {\\n            dataLen = _itemLength(memPtr);\\n            memPtr = memPtr + dataLen;\\n        }\\n        dataLen = _itemLength(memPtr);\\n        return RLPItem(dataLen, memPtr);\\n    }\\n\\n\\n    /*\\n     * @param get the RLP item by index. save gas.\\n     */\\n    function safeGetItemByIndex(RLPItem memory item, uint idx) internal pure returns (RLPItem memory) {\\n        require(isList(item), \\\"RLPDecoder iterator is not a list\\\");\\n        require(idx < numItems(item), \\\"RLP item out of bounds\\\");\\n        uint endPtr = item.memPtr + item.len;\\n\\n        uint memPtr = item.memPtr + _payloadOffset(item.memPtr);\\n        uint dataLen;\\n        for (uint i = 0; i < idx; i++) {\\n            dataLen = _itemLength(memPtr);\\n            memPtr = memPtr + dataLen;\\n        }\\n        dataLen = _itemLength(memPtr);\\n\\n        require(memPtr + dataLen <= endPtr, \\\"RLP item overflow\\\");\\n        return RLPItem(dataLen, memPtr);\\n    }\\n\\n    /*\\n     * @param offset the receipt bytes item\\n     */\\n    function typeOffset(RLPItem memory item) internal pure returns (RLPItem memory) {\\n        uint offset = _payloadOffset(item.memPtr);\\n        uint8 byte0;\\n        uint memPtr = item.memPtr;\\n        uint len = item.len;\\n        assembly {\\n            memPtr := add(memPtr, offset)\\n            byte0 := byte(0, mload(memPtr))\\n        }\\n        if (len >0 && byte0 < LIST_SHORT_START) {\\n            assembly {\\n                memPtr := add(memPtr, 0x01)\\n            }\\n            len -= 1;\\n        }\\n        return RLPItem(len, memPtr);\\n    }\\n\\n    // @return indicator whether encoded payload is a list. negate this function call for isData.\\n    function isList(RLPItem memory item) internal pure returns (bool) {\\n        if (item.len == 0) return false;\\n\\n        uint8 byte0;\\n        uint memPtr = item.memPtr;\\n        assembly {\\n            byte0 := byte(0, mload(memPtr))\\n        }\\n\\n        if (byte0 < LIST_SHORT_START) return false;\\n        return true;\\n    }\\n\\n    /** RLPItem conversions into data types **/\\n\\n    // @returns raw rlp encoding in bytes\\n    function toRlpBytes(RLPItem memory item) internal pure returns (bytes memory) {\\n        bytes memory result = new bytes(item.len);\\n        if (result.length == 0) return result;\\n\\n        uint ptr;\\n        assembly {\\n            ptr := add(0x20, result)\\n        }\\n\\n        copy(item.memPtr, ptr, item.len);\\n        return result;\\n    }\\n\\n    // any non-zero byte except \\\"0x80\\\" is considered true\\n    function toBoolean(RLPItem memory item) internal pure returns (bool) {\\n        require(item.len == 1, \\\"RLPDecoder toBoolean invalid length\\\");\\n        uint result;\\n        uint memPtr = item.memPtr;\\n        assembly {\\n            result := byte(0, mload(memPtr))\\n        }\\n\\n        // SEE Github Issue #5.\\n        // Summary: Most commonly used RLP libraries (i.e Geth) will encode\\n        // \\\"0\\\" as \\\"0x80\\\" instead of as \\\"0\\\". We handle this edge case explicitly\\n        // here.\\n        if (result == 0 || result == STRING_SHORT_START) {\\n            return false;\\n        } else {\\n            return true;\\n        }\\n    }\\n\\n    function toAddress(RLPItem memory item) internal pure returns (address) {\\n        // 1 byte for the length prefix\\n        require(item.len == 21, \\\"RLPDecoder toAddress invalid length\\\");\\n\\n        return address(toUint(item));\\n    }\\n\\n    function toUint(RLPItem memory item) internal pure returns (uint) {\\n        require(item.len > 0 && item.len <= 33, \\\"RLPDecoder toUint invalid length\\\");\\n\\n        uint offset = _payloadOffset(item.memPtr);\\n        require(item.len >= offset, \\\"RLPDecoder: invalid RLP item offset size\\\");\\n        uint len = item.len - offset;\\n\\n        uint result;\\n        uint memPtr = item.memPtr + offset;\\n        assembly {\\n            result := mload(memPtr)\\n\\n            // shift to the correct location if necessary\\n            if lt(len, 32) {\\n                result := div(result, exp(256, sub(32, len)))\\n            }\\n        }\\n\\n        return result;\\n    }\\n\\n    // enforces 32 byte length\\n    function toUintStrict(RLPItem memory item) internal pure returns (uint) {\\n        // one byte prefix\\n        require(item.len == 33, \\\"RLPDecoder toUintStrict invalid length\\\");\\n\\n        uint result;\\n        uint memPtr = item.memPtr + 1;\\n        assembly {\\n            result := mload(memPtr)\\n        }\\n\\n        return result;\\n    }\\n\\n    function toBytes(RLPItem memory item) internal pure returns (bytes memory) {\\n        require(item.len > 0, \\\"RLPDecoder toBytes invalid length\\\");\\n\\n        uint offset = _payloadOffset(item.memPtr);\\n        require(item.len >= offset, \\\"RLPDecoder: invalid RLP item offset size\\\");\\n        uint len = item.len - offset; // data length\\n        bytes memory result = new bytes(len);\\n\\n        uint destPtr;\\n        assembly {\\n            destPtr := add(0x20, result)\\n        }\\n\\n        copy(item.memPtr + offset, destPtr, len);\\n        return result;\\n    }\\n\\n    /*\\n     * Private Helpers\\n     */\\n\\n    // @return number of payload items inside an encoded list.\\n    function numItems(RLPItem memory item) internal pure returns (uint) {\\n        if (item.len == 0) return 0;\\n\\n        uint count = 0;\\n        uint currPtr = item.memPtr + _payloadOffset(item.memPtr);\\n        uint endPtr = item.memPtr + item.len;\\n        while (currPtr < endPtr) {\\n            currPtr = currPtr + _itemLength(currPtr); // skip over an item\\n            count++;\\n        }\\n\\n        return count;\\n    }\\n\\n    // @return entire rlp item byte length\\n    function _itemLength(uint memPtr) private pure returns (uint) {\\n        uint itemLen;\\n        uint byte0;\\n        assembly {\\n            byte0 := byte(0, mload(memPtr))\\n        }\\n\\n        if (byte0 < STRING_SHORT_START) itemLen = 1;\\n        else if (byte0 < STRING_LONG_START) itemLen = byte0 - STRING_SHORT_START + 1;\\n        else if (byte0 < LIST_SHORT_START) {\\n            assembly {\\n                let byteLen := sub(byte0, 0xb7) // # of bytes the actual length is\\n                memPtr := add(memPtr, 1) // skip over the first byte\\n\\n                /* 32 byte word size */\\n                let dataLen := div(mload(memPtr), exp(256, sub(32, byteLen))) // right shifting to get the len\\n                itemLen := add(dataLen, add(byteLen, 1))\\n            }\\n        } else if (byte0 < LIST_LONG_START) {\\n            itemLen = byte0 - LIST_SHORT_START + 1;\\n        } else {\\n            assembly {\\n                let byteLen := sub(byte0, 0xf7)\\n                memPtr := add(memPtr, 1)\\n\\n                let dataLen := div(mload(memPtr), exp(256, sub(32, byteLen))) // right shifting to the correct length\\n                itemLen := add(dataLen, add(byteLen, 1))\\n            }\\n        }\\n\\n        return itemLen;\\n    }\\n\\n    // @return number of bytes until the data\\n    function _payloadOffset(uint memPtr) private pure returns (uint) {\\n        uint byte0;\\n        assembly {\\n            byte0 := byte(0, mload(memPtr))\\n        }\\n\\n        if (byte0 < STRING_SHORT_START) return 0;\\n        else if (byte0 < STRING_LONG_START || (byte0 >= LIST_SHORT_START && byte0 < LIST_LONG_START)) return 1;\\n        else if (byte0 < LIST_SHORT_START)\\n            // being explicit\\n            return byte0 - (STRING_LONG_START - 1) + 1;\\n        else return byte0 - (LIST_LONG_START - 1) + 1;\\n    }\\n\\n    /*\\n     * @param src Pointer to source\\n     * @param dest Pointer to destination\\n     * @param len Amount of memory to copy from the source\\n     */\\n    function copy(\\n        uint src,\\n        uint dest,\\n        uint len\\n    ) private pure {\\n        if (len == 0) return;\\n\\n        // copy as many word sizes as possible\\n        for (; len >= WORD_SIZE; len -= WORD_SIZE) {\\n            assembly {\\n                mstore(dest, mload(src))\\n            }\\n\\n            src += WORD_SIZE;\\n            dest += WORD_SIZE;\\n        }\\n\\n        // left over bytes. Mask is used to remove unwanted bytes from the word\\n        uint mask = 256**(WORD_SIZE - len) - 1;\\n        assembly {\\n            let srcpart := and(mload(src), not(mask)) // zero out src\\n            let destpart := and(mload(dest), mask) // retrieve the bytes\\n            mstore(dest, or(destpart, srcpart))\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x8a04c67df135e410959ee6198785223703f152b49c9ced79c6847ee391026e58\",\"license\":\"Apache-2.0\"},\"contracts/utility/UltraLightNodeEVMDecoder.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\n\\npragma solidity ^0.7.0;\\npragma abicoder v2;\\n\\nimport \\\"./RLPDecode.sol\\\";\\n\\nlibrary UltraLightNodeEVMDecoder {\\n    using RLPDecode for RLPDecode.RLPItem;\\n    using RLPDecode for RLPDecode.Iterator;\\n\\n    struct Log {\\n        address contractAddress;\\n        bytes32 topicZero;\\n        bytes data;\\n    }\\n\\n    function getReceiptLog(bytes memory data, uint logIndex) internal pure returns (Log memory) {\\n        RLPDecode.Iterator memory it = RLPDecode.toRlpItem(data).iterator();\\n        uint idx;\\n        while (it.hasNext()) {\\n            if (idx == 3) {\\n                return toReceiptLog(it.next().getItemByIndex(logIndex).toRlpBytes());\\n            } else it.next();\\n            idx++;\\n        }\\n        revert(\\\"no log index in receipt\\\");\\n    }\\n\\n    function toReceiptLog(bytes memory data) internal pure returns (Log memory) {\\n        RLPDecode.Iterator memory it = RLPDecode.toRlpItem(data).iterator();\\n        Log memory log;\\n\\n        uint idx;\\n        while (it.hasNext()) {\\n            if (idx == 0) {\\n                log.contractAddress = it.next().toAddress();\\n            } else if (idx == 1) {\\n                RLPDecode.RLPItem memory item = it.next().getItemByIndex(0);\\n                log.topicZero = bytes32(item.toUint());\\n            } else if (idx == 2) log.data = it.next().toBytes();\\n            else it.next();\\n            idx++;\\n        }\\n        return log;\\n    }\\n}\\n\",\"keccak256\":\"0xa5a921e346276438893241fb9719b074bed6e215d37e372f91b2712cb9f46567\",\"license\":\"BUSL-1.1\"}},\"version\":1}",
  "bytecode": "0x6101206040526000805460ff191660031790553480156200001f57600080fd5b50604051620028b2380380620028b28339810160408190526200004291620000a3565b606094851b6001600160601b031990811660805293851b841660a05260f09290921b6001600160f01b03191660e052831b82166101005290911b1660c05262000119565b80516001600160a01b03811681146200009e57600080fd5b919050565b600080600080600060a08688031215620000bb578081fd5b620000c68662000086565b9450620000d66020870162000086565b9350604086015161ffff81168114620000ed578182fd5b9250620000fd6060870162000086565b91506200010d6080870162000086565b90509295509295909350565b60805160601c60a05160601c60c05160601c60e05160f01c6101005160601c61272c62000186600039806102d252806108ab528061097a52508061028a52806108015250806102265280610a0252508061024a528061046b5250806102ae5280610400525061272c6000f3fe608060405234801561001057600080fd5b50600436106100ea5760003560e01c80636c473aff1161008c578063be9d395e11610066578063be9d395e146101c4578063d633ad61146101d9578063e0cabadd146101e1578063ea455df9146101f4576100ea565b80636c473aff1461018757806378d823f71461018f578063b71e0f71146101a4576100ea565b806347713b39116100c857806347713b39146101355780635711c2a81461014a5780635b056da51461016a5780636348d2691461017f576100ea565b80630f222e65146100ef57806318a7cca8146101185780633fc18d4c1461012d575b600080fd5b6101026100fd366004611bf2565b610207565b60405161010f919061248a565b60405180910390f35b610120610224565b60405161010f9190612119565b610120610248565b61013d61026c565b60405161010f91906124f2565b61015d610158366004611ce3565b610275565b60405161010f9190612175565b610172610288565b60405161010f91906124b9565b6101206102ac565b6101206102d0565b6101a261019d366004611e56565b6102f4565b005b6101b76101b2366004611c66565b610304565b60405161010f91906123e5565b6101cc6104e3565b60405161010f919061216c565b61013d610507565b6101b76101ef366004611d16565b610510565b61015d610202366004611ce3565b610524565b61020f6118ec565b61021b8585858561052f565b95945050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b60005460ff1681565b6060610280826106de565b90505b919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b6102ff8383836107ff565b505050565b61030c61190b565b6000821161034f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610346906123ae565b60405180910390fd5b600080808080610361888a018a611f43565b9450945094509450945060006103798b84848761052f565b60208101519091507fe8d23d927749ec8e512eb885679c2977d57068839d8cca1a85685dbbea0648f6146103d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103469061224f565b805160408201516000916103f1919089908c90610b19565b90506103fe81878e6107ff565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16816060015173ffffffffffffffffffffffffffffffffffffffff161415610469576104638160c001516106de565b60c08201525b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16816060015173ffffffffffffffffffffffffffffffffffffffff1614156104d4576104ce8160c00151610c0f565b60c08201525b9b9a5050505050505050505050565b7fe8d23d927749ec8e512eb885679c2977d57068839d8cca1a85685dbbea0648f681565b60005460ff1690565b61051861190b565b61021b85858585610b19565b606061028082610c0f565b6105376118ec565b8151845114610572576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610346906121aa565b60008251116105ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103469061231a565b6105b5611949565b606060005b8451811015610661578481815181106105cf57fe5b6020026020010151915081805190602001208814610619576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161034690612218565b61063f87828151811061062857fe5b602002602001015161063984610cb9565b90610d2d565b925060018551038110156106595761065683610ee9565b97505b6001016105ba565b506000610672600361063985611006565b905060006106886106838389610d2d565b611092565b90506106926118ec565b6106a361069e8361113e565b610ee9565b81526106b661069e60006106398561113e565b60208201526106cc6106c78361113e565b6111ee565b60408201529998505050505050505050565b6020810151606090600160ff821614156107f8576000806000806000806000898060200190518101906107119190611fc8565b9750975097509750975097509750506000815111156107f05781516000901561073b575060148201515b803b806107ed5760008260405160200161075591906120e9565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152602083810183526000808552925191945091926107ab928f928f928f928f928f928f928b9201612500565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529c506102839b505050505050505050505050565b50505b505050505050505b5090919050565b7f000000000000000000000000000000000000000000000000000000000000000061ffff16836020015161ffff1614610864576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161034690612286565b825160608401516040517fa466222200000000000000000000000000000000000000000000000000000000815260009273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169263a4662222926108e09291906004016124c8565b60c06040518083038186803b1580156108f857600080fd5b505afa15801561090c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109309190611db8565b60a081015185516040517febfa08e900000000000000000000000000000000000000000000000000000000815292935060009273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169263ebfa08e9926109af92899060040161213a565b604080518083038186803b1580156109c657600080fd5b505afa1580156109da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109fe9190611b0b565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16826040015173ffffffffffffffffffffffffffffffffffffffff1614610a89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610346906122e3565b82816020015114610ac6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610346906121e1565b816020015167ffffffffffffffff1681600001511015610b12576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161034690612351565b5050505050565b610b2161190b565b602085015160608601516068870151858801607c01519190610b41611963565b610b4b818961131b565b50610b5b8160008c60888c611355565b506000610b7389610b6d86601c61142f565b9061142f565b9050610b7d611963565b610b87818361131b565b50610ba360008d610b998d609c6114a6565b8492919086611355565b506040805160e08101825261ffff808e16825298909816602089015267ffffffffffffffff909416938701939093525073ffffffffffffffffffffffffffffffffffffffff9093166060850152915160808401525060a082018490525160c08201529050949350505050565b606060008083806020019051810190610c289190611d73565b9150915060008083511115610c3e575060148201515b73ffffffffffffffffffffffffffffffffffffffff8116610cb05760405161dead90600090610c719083906020016120e9565b60405160208183030381529060405290508084604051602001610c95929190612188565b60405160208183030381529060405295505050505050610283565b50929392505050565b610cc1611949565b602082018051835160009190911a908015801590610ce2575060c060ff8316105b15610d1157600192909201917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff015b6040805180820190915290815260208101929092525092915050565b610d35611949565b610d3e83611521565b610d93576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806126b56021913960400191505060405180910390fd5b610d9c8361155b565b8210610e0957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f524c50206974656d206f7574206f6620626f756e647300000000000000000000604482015290519081900360640190fd5b8251602084015190810190600090610e20906115b3565b60208601510190506000805b85811015610e4b57610e3d83611652565b928301929150600101610e2c565b50610e5582611652565b9050828183011115610ec857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f524c50206974656d206f766572666c6f77000000000000000000000000000000604482015290519081900360640190fd5b60405180604001604052808281526020018381525093505050505b92915050565b805160009015801590610efe57508151602110155b610f6957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f524c504465636f64657220746f55696e7420696e76616c6964206c656e677468604482015290519081900360640190fd5b6000610f7883602001516115b3565b90508083600001511015610fd7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602881526020018061268d6028913960400191505060405180910390fd5b825160208085015183018051928490039291831015610ffd57826020036101000a820491505b50949350505050565b61100e611949565b600061101d83602001516115b3565b60208401518451908201805192935060009290921a91908015801590611046575060c060ff8416105b1561107557600191909101907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff015b604080518082019091529081526020810191909152949350505050565b61109a61197d565b6110a382611521565b61110e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f524c504465636f646572206974657261746f72206973206e6f74206c69737400604482015290519081900360640190fd5b600061111d83602001516115b3565b60208085015160408051808201909152868152920190820152915050919050565b611146611949565b61114f82611727565b6111ba57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f524c504465636f646572206974657261746f7220686173206e6f206e65787400604482015290519081900360640190fd5b602082015160006111ca82611652565b80830160209586015260408051808201909152908152938401919091525090919050565b8051606090611248576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806126d66021913960400191505060405180910390fd5b600061125783602001516115b3565b905080836000015110156112b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602881526020018061268d6028913960400191505060405180910390fd5b825181900360008167ffffffffffffffff811180156112d457600080fd5b506040519080825280601f01601f1916602001820160405280156112ff576020820181803683370190505b5090506000816020019050610ffd84876020015101828561173c565b611323611963565b60208206156113385760208206602003820191505b506020828101829052604080518085526000815290920101905290565b61135d611963565b85602001518286011115611387576113878661137f88602001518886016117c3565b6002026117da565b6000808751805188602083010193508089870111156113a65788860182525b5050508484015b602084106113ea57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090930192602091820191016113ad565b5181517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60208690036101000a01908116901991909116179052508495945050505050565b6000828211156114a057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b60008282018381101561151a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b805160009061153257506000610283565b6020820151805160001a9060c082101561155157600092505050610283565b5060019392505050565b805160009061156c57506000610283565b60008061157c84602001516115b3565b602085015185519181019250015b808210156115aa5761159b82611652565b6001909301929091019061158a565b50909392505050565b8051600090811a60808110156115cd576000915050610283565b60b88110806115e8575060c081108015906115e8575060f881105b156115f7576001915050610283565b60c0811015611629577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4a019050610283565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0a019050610283565b80516000908190811a608081101561166d5760019150611720565b60b88110156116a0577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8181019150611720565b60c08110156116cd5760b78103600185019450806020036101000a85510460018201810193505050611720565b60f8811015611700577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4181019150611720565b60f78103600185019450806020036101000a855104600182018101935050505b5092915050565b80518051602091820151919092015191011190565b80611746576102ff565b5b602081106117845782518252602092830192909101907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001611747565b915181516020939093036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169216919091179052565b6000818311156117d4575081610ee3565b50919050565b81516117e6838361131b565b506117f183826117f7565b50505050565b6117ff611963565b61151a83846000015151848551611814611963565b825182111561182257600080fd5b84602001518285011115611844576118448561137f87602001518786016117c3565b6000808651805187602083010193508088870111156118635787860182525b505050602084015b602084106118a857805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909301926020918201910161186b565b5181517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60208690036101000a019081169019919091161790525083949350505050565b6040805160608082018352600080835260208301529181019190915290565b6040805160e08101825260008082526020820181905291810182905260608082018390526080820181905260a082019290925260c081019190915290565b604051806040016040528060008152602001600081525090565b604051806040016040528060608152602001600081525090565b6040518060400160405280611990611949565b8152602001600081525090565b803561028381612641565b805161028381612641565b600082601f8301126119c3578081fd5b813560206119d86119d3836125b7565b612593565b82815281810190858301855b85811015611a0d576119fb898684358b0101611a74565b845292840192908401906001016119e4565b5090979650505050505050565b600082601f830112611a2a578081fd5b81356020611a3a6119d3836125b7565b8281528181019085830183850287018401881015611a56578586fd5b855b85811015611a0d57813584529284019290840190600101611a58565b600082601f830112611a84578081fd5b8135611a926119d3826125d5565b818152846020838601011115611aa6578283fd5b816020850160208301379081016020019190915292915050565b600082601f830112611ad0578081fd5b8151611ade6119d3826125d5565b818152846020838601011115611af2578283fd5b611b03826020830160208701612615565b949350505050565b600060408284031215611b1c578081fd5b6040516040810181811067ffffffffffffffff82111715611b3957fe5b604052825181526020928301519281019290925250919050565b600060c08284031215611b64578081fd5b60405160c0810181811067ffffffffffffffff82111715611b8157fe5b8060405250809150825181526020830151602082015260408301516040820152606083015160608201526080830151608082015260a083015160a08201525092915050565b803561028381612666565b805161028381612666565b803561028381612676565b805161028381612676565b60008060008060808587031215611c07578384fd5b84359350602085013567ffffffffffffffff80821115611c25578485fd5b611c3188838901611a1a565b9450604087013593506060870135915080821115611c4d578283fd5b50611c5a878288016119b3565b91505092959194509250565b60008060008060608587031215611c7b578182fd5b84359350602085013567ffffffffffffffff80821115611c99578384fd5b818701915087601f830112611cac578384fd5b813581811115611cba578485fd5b886020828501011115611ccb578485fd5b95986020929092019750949560400135945092505050565b600060208284031215611cf4578081fd5b813567ffffffffffffffff811115611d0a578182fd5b611b0384828501611a74565b60008060008060808587031215611d2b578182fd5b843567ffffffffffffffff811115611d41578283fd5b611d4d87828801611a74565b9450506020850135611d5e81612666565b93969395505050506040820135916060013590565b60008060408385031215611d85578182fd5b825167ffffffffffffffff811115611d9b578283fd5b611da785828601611ac0565b925050602083015190509250929050565b600060c08284031215611dc9578081fd5b60405160c0810181811067ffffffffffffffff82111715611de657fe5b6040528251611df481612666565b81526020830151611e0481612676565b60208201526040830151611e1781612641565b6040820152611e2860608401611bd1565b6060820152611e3960808401611be7565b6080820152611e4a60a084016119a8565b60a08201529392505050565b600080600060608486031215611e6a578081fd5b833567ffffffffffffffff80821115611e81578283fd5b9085019060e08288031215611e94578283fd5b611e9e60e0612593565b611ea783611bc6565b8152611eb560208401611bc6565b6020820152611ec660408401611bdc565b6040820152611ed76060840161199d565b6060820152608083013582811115611eed578485fd5b611ef989828601611a74565b60808301525060a083013560a082015260c083013582811115611f1a578485fd5b611f2689828601611a74565b60c083015250976020870135975060409096013595945050505050565b600080600080600060a08688031215611f5a578283fd5b8535611f6581612666565b945060208601359350604086013567ffffffffffffffff80821115611f88578485fd5b611f9489838a016119b3565b94506060880135915080821115611fa9578283fd5b50611fb688828901611a1a565b95989497509295608001359392505050565b6000806000806000806000806101c0898b031215611fe4578586fd5b885160ff81168114611ff4578687fd5b8098505060208901519650604089015195506060890151945061201a8a60808b01611b0b565b93506120298a60c08b01611b53565b925061018089015167ffffffffffffffff80821115612046578384fd5b6120528c838d01611ac0565b93506101a08b0151915080821115612068578283fd5b506120758b828c01611ac0565b9150509295985092959890939650565b73ffffffffffffffffffffffffffffffffffffffff169052565b600081518084526120b7816020860160208601612615565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60609190911b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016815260140190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff93909316835261ffff919091166020830152604082015260600190565b90815260200190565b60006020825261151a602083018461209f565b60006040825261219b604083018561209f565b90508260208301529392505050565b6020808252601c908201527f50726f6f664c69623a20696e76616c69642070726f6f662073697a6500000000604082015260600190565b6020808252601e908201527f50726f6f664c69623a20696e76616c6964207265636569707420726f6f740000604082015260600190565b6020808252601a908201527f50726f6f664c69623a20696e76616c696420686173686c696e6b000000000000604082015260600190565b6020808252601f908201527f50726f6f664c69623a207061636b6574206e6f74207265636f676e697a656400604082015260600190565b60208082526026908201527f50726f6f664c69623a20696e76616c69642064657374696e6174696f6e20636860408201527f61696e2049440000000000000000000000000000000000000000000000000000606082015260800190565b60208082526019908201527f50726f6f664c69623a20696e76616c69642072656c6179657200000000000000604082015260600190565b6020808252601d908201527f50726f6f664c69623a2070726f6f662073697a65206d757374203e2030000000604082015260600190565b60208082526028908201527f50726f6f664c69623a206e6f7420656e6f75676820626c6f636b20636f6e666960408201527f726d6174696f6e73000000000000000000000000000000000000000000000000606082015260800190565b6020808252601e908201527f50726f6f664c69623a20696e76616c696420616464726573732073697a650000604082015260600190565b60006020825261ffff8084511660208401528060208501511660408401525067ffffffffffffffff6040840151166060830152606083015161242a6080840182612085565b50608083015160e060a084015261244561010084018261209f565b905060a084015160c084015260c08401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08483030160e085015261021b828261209f565b60006020825282516020830152602083015160408301526040830151606080840152611b03608084018261209f565b61ffff91909116815260200190565b61ffff92909216825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b60ff91909116815260200190565b60006101c060ff8b16835289602084015288604084015287606084015286516080840152602087015160a0840152855160c0840152602086015160e084015260408601516101008401526060860151610120840152608086015161014084015260a08601516101608401528061018084015261257e8184018661209f565b90508281036101a08401526104d4818561209f565b60405181810167ffffffffffffffff811182821017156125af57fe5b604052919050565b600067ffffffffffffffff8211156125cb57fe5b5060209081020190565b600067ffffffffffffffff8211156125e957fe5b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b83811015612630578181015183820152602001612618565b838111156117f15750506000910152565b73ffffffffffffffffffffffffffffffffffffffff8116811461266357600080fd5b50565b61ffff8116811461266357600080fd5b67ffffffffffffffff8116811461266357600080fdfe524c504465636f6465723a20696e76616c696420524c50206974656d206f66667365742073697a65524c504465636f646572206974657261746f72206973206e6f742061206c697374524c504465636f64657220746f427974657320696e76616c6964206c656e677468a2646970667358221220e05db307eef7efe5b23be1bea53750eb0992943554a8729deaebd6dc8be36f0f64736f6c63430007060033",
  "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100ea5760003560e01c80636c473aff1161008c578063be9d395e11610066578063be9d395e146101c4578063d633ad61146101d9578063e0cabadd146101e1578063ea455df9146101f4576100ea565b80636c473aff1461018757806378d823f71461018f578063b71e0f71146101a4576100ea565b806347713b39116100c857806347713b39146101355780635711c2a81461014a5780635b056da51461016a5780636348d2691461017f576100ea565b80630f222e65146100ef57806318a7cca8146101185780633fc18d4c1461012d575b600080fd5b6101026100fd366004611bf2565b610207565b60405161010f919061248a565b60405180910390f35b610120610224565b60405161010f9190612119565b610120610248565b61013d61026c565b60405161010f91906124f2565b61015d610158366004611ce3565b610275565b60405161010f9190612175565b610172610288565b60405161010f91906124b9565b6101206102ac565b6101206102d0565b6101a261019d366004611e56565b6102f4565b005b6101b76101b2366004611c66565b610304565b60405161010f91906123e5565b6101cc6104e3565b60405161010f919061216c565b61013d610507565b6101b76101ef366004611d16565b610510565b61015d610202366004611ce3565b610524565b61020f6118ec565b61021b8585858561052f565b95945050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b60005460ff1681565b6060610280826106de565b90505b919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b6102ff8383836107ff565b505050565b61030c61190b565b6000821161034f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610346906123ae565b60405180910390fd5b600080808080610361888a018a611f43565b9450945094509450945060006103798b84848761052f565b60208101519091507fe8d23d927749ec8e512eb885679c2977d57068839d8cca1a85685dbbea0648f6146103d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103469061224f565b805160408201516000916103f1919089908c90610b19565b90506103fe81878e6107ff565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16816060015173ffffffffffffffffffffffffffffffffffffffff161415610469576104638160c001516106de565b60c08201525b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16816060015173ffffffffffffffffffffffffffffffffffffffff1614156104d4576104ce8160c00151610c0f565b60c08201525b9b9a5050505050505050505050565b7fe8d23d927749ec8e512eb885679c2977d57068839d8cca1a85685dbbea0648f681565b60005460ff1690565b61051861190b565b61021b85858585610b19565b606061028082610c0f565b6105376118ec565b8151845114610572576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610346906121aa565b60008251116105ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103469061231a565b6105b5611949565b606060005b8451811015610661578481815181106105cf57fe5b6020026020010151915081805190602001208814610619576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161034690612218565b61063f87828151811061062857fe5b602002602001015161063984610cb9565b90610d2d565b925060018551038110156106595761065683610ee9565b97505b6001016105ba565b506000610672600361063985611006565b905060006106886106838389610d2d565b611092565b90506106926118ec565b6106a361069e8361113e565b610ee9565b81526106b661069e60006106398561113e565b60208201526106cc6106c78361113e565b6111ee565b60408201529998505050505050505050565b6020810151606090600160ff821614156107f8576000806000806000806000898060200190518101906107119190611fc8565b9750975097509750975097509750506000815111156107f05781516000901561073b575060148201515b803b806107ed5760008260405160200161075591906120e9565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152602083810183526000808552925191945091926107ab928f928f928f928f928f928f928b9201612500565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529c506102839b505050505050505050505050565b50505b505050505050505b5090919050565b7f000000000000000000000000000000000000000000000000000000000000000061ffff16836020015161ffff1614610864576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161034690612286565b825160608401516040517fa466222200000000000000000000000000000000000000000000000000000000815260009273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169263a4662222926108e09291906004016124c8565b60c06040518083038186803b1580156108f857600080fd5b505afa15801561090c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109309190611db8565b60a081015185516040517febfa08e900000000000000000000000000000000000000000000000000000000815292935060009273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169263ebfa08e9926109af92899060040161213a565b604080518083038186803b1580156109c657600080fd5b505afa1580156109da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109fe9190611b0b565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16826040015173ffffffffffffffffffffffffffffffffffffffff1614610a89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610346906122e3565b82816020015114610ac6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610346906121e1565b816020015167ffffffffffffffff1681600001511015610b12576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161034690612351565b5050505050565b610b2161190b565b602085015160608601516068870151858801607c01519190610b41611963565b610b4b818961131b565b50610b5b8160008c60888c611355565b506000610b7389610b6d86601c61142f565b9061142f565b9050610b7d611963565b610b87818361131b565b50610ba360008d610b998d609c6114a6565b8492919086611355565b506040805160e08101825261ffff808e16825298909816602089015267ffffffffffffffff909416938701939093525073ffffffffffffffffffffffffffffffffffffffff9093166060850152915160808401525060a082018490525160c08201529050949350505050565b606060008083806020019051810190610c289190611d73565b9150915060008083511115610c3e575060148201515b73ffffffffffffffffffffffffffffffffffffffff8116610cb05760405161dead90600090610c719083906020016120e9565b60405160208183030381529060405290508084604051602001610c95929190612188565b60405160208183030381529060405295505050505050610283565b50929392505050565b610cc1611949565b602082018051835160009190911a908015801590610ce2575060c060ff8316105b15610d1157600192909201917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff015b6040805180820190915290815260208101929092525092915050565b610d35611949565b610d3e83611521565b610d93576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806126b56021913960400191505060405180910390fd5b610d9c8361155b565b8210610e0957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f524c50206974656d206f7574206f6620626f756e647300000000000000000000604482015290519081900360640190fd5b8251602084015190810190600090610e20906115b3565b60208601510190506000805b85811015610e4b57610e3d83611652565b928301929150600101610e2c565b50610e5582611652565b9050828183011115610ec857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f524c50206974656d206f766572666c6f77000000000000000000000000000000604482015290519081900360640190fd5b60405180604001604052808281526020018381525093505050505b92915050565b805160009015801590610efe57508151602110155b610f6957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f524c504465636f64657220746f55696e7420696e76616c6964206c656e677468604482015290519081900360640190fd5b6000610f7883602001516115b3565b90508083600001511015610fd7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602881526020018061268d6028913960400191505060405180910390fd5b825160208085015183018051928490039291831015610ffd57826020036101000a820491505b50949350505050565b61100e611949565b600061101d83602001516115b3565b60208401518451908201805192935060009290921a91908015801590611046575060c060ff8416105b1561107557600191909101907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff015b604080518082019091529081526020810191909152949350505050565b61109a61197d565b6110a382611521565b61110e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f524c504465636f646572206974657261746f72206973206e6f74206c69737400604482015290519081900360640190fd5b600061111d83602001516115b3565b60208085015160408051808201909152868152920190820152915050919050565b611146611949565b61114f82611727565b6111ba57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f524c504465636f646572206974657261746f7220686173206e6f206e65787400604482015290519081900360640190fd5b602082015160006111ca82611652565b80830160209586015260408051808201909152908152938401919091525090919050565b8051606090611248576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806126d66021913960400191505060405180910390fd5b600061125783602001516115b3565b905080836000015110156112b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602881526020018061268d6028913960400191505060405180910390fd5b825181900360008167ffffffffffffffff811180156112d457600080fd5b506040519080825280601f01601f1916602001820160405280156112ff576020820181803683370190505b5090506000816020019050610ffd84876020015101828561173c565b611323611963565b60208206156113385760208206602003820191505b506020828101829052604080518085526000815290920101905290565b61135d611963565b85602001518286011115611387576113878661137f88602001518886016117c3565b6002026117da565b6000808751805188602083010193508089870111156113a65788860182525b5050508484015b602084106113ea57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090930192602091820191016113ad565b5181517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60208690036101000a01908116901991909116179052508495945050505050565b6000828211156114a057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b60008282018381101561151a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b805160009061153257506000610283565b6020820151805160001a9060c082101561155157600092505050610283565b5060019392505050565b805160009061156c57506000610283565b60008061157c84602001516115b3565b602085015185519181019250015b808210156115aa5761159b82611652565b6001909301929091019061158a565b50909392505050565b8051600090811a60808110156115cd576000915050610283565b60b88110806115e8575060c081108015906115e8575060f881105b156115f7576001915050610283565b60c0811015611629577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4a019050610283565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0a019050610283565b80516000908190811a608081101561166d5760019150611720565b60b88110156116a0577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8181019150611720565b60c08110156116cd5760b78103600185019450806020036101000a85510460018201810193505050611720565b60f8811015611700577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4181019150611720565b60f78103600185019450806020036101000a855104600182018101935050505b5092915050565b80518051602091820151919092015191011190565b80611746576102ff565b5b602081106117845782518252602092830192909101907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001611747565b915181516020939093036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169216919091179052565b6000818311156117d4575081610ee3565b50919050565b81516117e6838361131b565b506117f183826117f7565b50505050565b6117ff611963565b61151a83846000015151848551611814611963565b825182111561182257600080fd5b84602001518285011115611844576118448561137f87602001518786016117c3565b6000808651805187602083010193508088870111156118635787860182525b505050602084015b602084106118a857805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909301926020918201910161186b565b5181517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60208690036101000a019081169019919091161790525083949350505050565b6040805160608082018352600080835260208301529181019190915290565b6040805160e08101825260008082526020820181905291810182905260608082018390526080820181905260a082019290925260c081019190915290565b604051806040016040528060008152602001600081525090565b604051806040016040528060608152602001600081525090565b6040518060400160405280611990611949565b8152602001600081525090565b803561028381612641565b805161028381612641565b600082601f8301126119c3578081fd5b813560206119d86119d3836125b7565b612593565b82815281810190858301855b85811015611a0d576119fb898684358b0101611a74565b845292840192908401906001016119e4565b5090979650505050505050565b600082601f830112611a2a578081fd5b81356020611a3a6119d3836125b7565b8281528181019085830183850287018401881015611a56578586fd5b855b85811015611a0d57813584529284019290840190600101611a58565b600082601f830112611a84578081fd5b8135611a926119d3826125d5565b818152846020838601011115611aa6578283fd5b816020850160208301379081016020019190915292915050565b600082601f830112611ad0578081fd5b8151611ade6119d3826125d5565b818152846020838601011115611af2578283fd5b611b03826020830160208701612615565b949350505050565b600060408284031215611b1c578081fd5b6040516040810181811067ffffffffffffffff82111715611b3957fe5b604052825181526020928301519281019290925250919050565b600060c08284031215611b64578081fd5b60405160c0810181811067ffffffffffffffff82111715611b8157fe5b8060405250809150825181526020830151602082015260408301516040820152606083015160608201526080830151608082015260a083015160a08201525092915050565b803561028381612666565b805161028381612666565b803561028381612676565b805161028381612676565b60008060008060808587031215611c07578384fd5b84359350602085013567ffffffffffffffff80821115611c25578485fd5b611c3188838901611a1a565b9450604087013593506060870135915080821115611c4d578283fd5b50611c5a878288016119b3565b91505092959194509250565b60008060008060608587031215611c7b578182fd5b84359350602085013567ffffffffffffffff80821115611c99578384fd5b818701915087601f830112611cac578384fd5b813581811115611cba578485fd5b886020828501011115611ccb578485fd5b95986020929092019750949560400135945092505050565b600060208284031215611cf4578081fd5b813567ffffffffffffffff811115611d0a578182fd5b611b0384828501611a74565b60008060008060808587031215611d2b578182fd5b843567ffffffffffffffff811115611d41578283fd5b611d4d87828801611a74565b9450506020850135611d5e81612666565b93969395505050506040820135916060013590565b60008060408385031215611d85578182fd5b825167ffffffffffffffff811115611d9b578283fd5b611da785828601611ac0565b925050602083015190509250929050565b600060c08284031215611dc9578081fd5b60405160c0810181811067ffffffffffffffff82111715611de657fe5b6040528251611df481612666565b81526020830151611e0481612676565b60208201526040830151611e1781612641565b6040820152611e2860608401611bd1565b6060820152611e3960808401611be7565b6080820152611e4a60a084016119a8565b60a08201529392505050565b600080600060608486031215611e6a578081fd5b833567ffffffffffffffff80821115611e81578283fd5b9085019060e08288031215611e94578283fd5b611e9e60e0612593565b611ea783611bc6565b8152611eb560208401611bc6565b6020820152611ec660408401611bdc565b6040820152611ed76060840161199d565b6060820152608083013582811115611eed578485fd5b611ef989828601611a74565b60808301525060a083013560a082015260c083013582811115611f1a578485fd5b611f2689828601611a74565b60c083015250976020870135975060409096013595945050505050565b600080600080600060a08688031215611f5a578283fd5b8535611f6581612666565b945060208601359350604086013567ffffffffffffffff80821115611f88578485fd5b611f9489838a016119b3565b94506060880135915080821115611fa9578283fd5b50611fb688828901611a1a565b95989497509295608001359392505050565b6000806000806000806000806101c0898b031215611fe4578586fd5b885160ff81168114611ff4578687fd5b8098505060208901519650604089015195506060890151945061201a8a60808b01611b0b565b93506120298a60c08b01611b53565b925061018089015167ffffffffffffffff80821115612046578384fd5b6120528c838d01611ac0565b93506101a08b0151915080821115612068578283fd5b506120758b828c01611ac0565b9150509295985092959890939650565b73ffffffffffffffffffffffffffffffffffffffff169052565b600081518084526120b7816020860160208601612615565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60609190911b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016815260140190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff93909316835261ffff919091166020830152604082015260600190565b90815260200190565b60006020825261151a602083018461209f565b60006040825261219b604083018561209f565b90508260208301529392505050565b6020808252601c908201527f50726f6f664c69623a20696e76616c69642070726f6f662073697a6500000000604082015260600190565b6020808252601e908201527f50726f6f664c69623a20696e76616c6964207265636569707420726f6f740000604082015260600190565b6020808252601a908201527f50726f6f664c69623a20696e76616c696420686173686c696e6b000000000000604082015260600190565b6020808252601f908201527f50726f6f664c69623a207061636b6574206e6f74207265636f676e697a656400604082015260600190565b60208082526026908201527f50726f6f664c69623a20696e76616c69642064657374696e6174696f6e20636860408201527f61696e2049440000000000000000000000000000000000000000000000000000606082015260800190565b60208082526019908201527f50726f6f664c69623a20696e76616c69642072656c6179657200000000000000604082015260600190565b6020808252601d908201527f50726f6f664c69623a2070726f6f662073697a65206d757374203e2030000000604082015260600190565b60208082526028908201527f50726f6f664c69623a206e6f7420656e6f75676820626c6f636b20636f6e666960408201527f726d6174696f6e73000000000000000000000000000000000000000000000000606082015260800190565b6020808252601e908201527f50726f6f664c69623a20696e76616c696420616464726573732073697a650000604082015260600190565b60006020825261ffff8084511660208401528060208501511660408401525067ffffffffffffffff6040840151166060830152606083015161242a6080840182612085565b50608083015160e060a084015261244561010084018261209f565b905060a084015160c084015260c08401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08483030160e085015261021b828261209f565b60006020825282516020830152602083015160408301526040830151606080840152611b03608084018261209f565b61ffff91909116815260200190565b61ffff92909216825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b60ff91909116815260200190565b60006101c060ff8b16835289602084015288604084015287606084015286516080840152602087015160a0840152855160c0840152602086015160e084015260408601516101008401526060860151610120840152608086015161014084015260a08601516101608401528061018084015261257e8184018661209f565b90508281036101a08401526104d4818561209f565b60405181810167ffffffffffffffff811182821017156125af57fe5b604052919050565b600067ffffffffffffffff8211156125cb57fe5b5060209081020190565b600067ffffffffffffffff8211156125e957fe5b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b83811015612630578181015183820152602001612618565b838111156117f15750506000910152565b73ffffffffffffffffffffffffffffffffffffffff8116811461266357600080fd5b50565b61ffff8116811461266357600080fd5b67ffffffffffffffff8116811461266357600080fdfe524c504465636f6465723a20696e76616c696420524c50206974656d206f66667365742073697a65524c504465636f646572206974657261746f72206973206e6f742061206c697374524c504465636f64657220746f427974657320696e76616c6964206c656e677468a2646970667358221220e05db307eef7efe5b23be1bea53750eb0992943554a8729deaebd6dc8be36f0f64736f6c63430007060033",
  "devdoc": {
    "kind": "dev",
    "methods": {},
    "version": 1
  },
  "userdoc": {
    "kind": "user",
    "methods": {},
    "version": 1
  },
  "storageLayout": {
    "storage": [
      {
        "astId": 3224,
        "contract": "contracts/MPTValidatorV5.sol:MPTValidatorV5",
        "label": "utilsVersion",
        "offset": 0,
        "slot": "0",
        "type": "t_uint8"
      }
    ],
    "types": {
      "t_uint8": {
        "encoding": "inplace",
        "label": "uint8",
        "numberOfBytes": "1"
      }
    }
  }
}