{
  "address": "0x5e6Ad71c85712fb32791Ebf3Cee1646d6cbaDfC6",
  "abi": [
    {
      "inputs": [],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "sender",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "Claim",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "cIndex",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "sender",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "enum MVM_Verifier.SETTLEMENT",
          "name": "result",
          "type": "uint8"
        }
      ],
      "name": "Finalize",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "cIndex",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "chainID",
          "type": "uint256"
        },
        {
          "components": [
            {
              "internalType": "uint256",
              "name": "batchIndex",
              "type": "uint256"
            },
            {
              "internalType": "bytes32",
              "name": "batchRoot",
              "type": "bytes32"
            },
            {
              "internalType": "uint256",
              "name": "batchSize",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "prevTotalElements",
              "type": "uint256"
            },
            {
              "internalType": "bytes",
              "name": "extraData",
              "type": "bytes"
            }
          ],
          "indexed": false,
          "internalType": "struct Lib_OVMCodec.ChainBatchHeader",
          "name": "header",
          "type": "tuple"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "timestamp",
          "type": "uint256"
        }
      ],
      "name": "NewChallenge",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "sender",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "stakeLost",
          "type": "uint256"
        }
      ],
      "name": "Penalize",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "Reward",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "chainID",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "seq",
          "type": "address"
        }
      ],
      "name": "SlashSequencer",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "verifier",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "Stake",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "cIndex",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "verifier",
          "type": "address"
        }
      ],
      "name": "Verify1",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "cIndex",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "verifier",
          "type": "address"
        }
      ],
      "name": "Verify2",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "sender",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "Withdraw",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "CONFIG_OWNER_KEY",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "absence_strikes",
      "outputs": [
        {
          "internalType": "uint8",
          "name": "",
          "type": "uint8"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "activeChallenges",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "name": "chain_under_challenge",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "name": "challenges",
      "outputs": [
        {
          "internalType": "address",
          "name": "challenger",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "chainID",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "index",
          "type": "uint256"
        },
        {
          "components": [
            {
              "internalType": "uint256",
              "name": "batchIndex",
              "type": "uint256"
            },
            {
              "internalType": "bytes32",
              "name": "batchRoot",
              "type": "bytes32"
            },
            {
              "internalType": "uint256",
              "name": "batchSize",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "prevTotalElements",
              "type": "uint256"
            },
            {
              "internalType": "bytes",
              "name": "extraData",
              "type": "bytes"
            }
          ],
          "internalType": "struct Lib_OVMCodec.ChainBatchHeader",
          "name": "header",
          "type": "tuple"
        },
        {
          "internalType": "uint256",
          "name": "timestamp",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "numQualifiedVerifiers",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "numVerifiers",
          "type": "uint256"
        },
        {
          "internalType": "bool",
          "name": "done",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "claim",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "consensus_strikes",
      "outputs": [
        {
          "internalType": "uint8",
          "name": "",
          "type": "uint8"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        },
        {
          "internalType": "bytes",
          "name": "key",
          "type": "bytes"
        }
      ],
      "name": "decrypt",
      "outputs": [
        {
          "internalType": "bytes",
          "name": "",
          "type": "bytes"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "depositSeqStake",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "disableWhiteList",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        },
        {
          "internalType": "bytes",
          "name": "key",
          "type": "bytes"
        }
      ],
      "name": "encrypt",
      "outputs": [
        {
          "internalType": "bytes",
          "name": "",
          "type": "bytes"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32[]",
          "name": "elements",
          "type": "bytes32[]"
        }
      ],
      "name": "getMerkleRoot",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        }
      ],
      "name": "isSufficientlyStaked",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "verifier",
          "type": "address"
        }
      ],
      "name": "isWhiteListed",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "libAddressManager",
      "outputs": [
        {
          "internalType": "contract Lib_AddressManager",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "metis",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "minStake",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "chainID",
          "type": "uint256"
        },
        {
          "components": [
            {
              "internalType": "uint256",
              "name": "batchIndex",
              "type": "uint256"
            },
            {
              "internalType": "bytes32",
              "name": "batchRoot",
              "type": "bytes32"
            },
            {
              "internalType": "uint256",
              "name": "batchSize",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "prevTotalElements",
              "type": "uint256"
            },
            {
              "internalType": "bytes",
              "name": "extraData",
              "type": "bytes"
            }
          ],
          "internalType": "struct Lib_OVMCodec.ChainBatchHeader",
          "name": "header",
          "type": "tuple"
        },
        {
          "internalType": "bytes",
          "name": "proposedHash",
          "type": "bytes"
        },
        {
          "internalType": "bytes",
          "name": "keyhash",
          "type": "bytes"
        }
      ],
      "name": "newChallenge",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "numQualifiedVerifiers",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "_name",
          "type": "string"
        }
      ],
      "name": "resolve",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "rewards",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "seqStake",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_minStake",
          "type": "uint256"
        }
      ],
      "name": "setMinStake",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "absence_threshold",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "fail_threshold",
          "type": "uint256"
        }
      ],
      "name": "setThreshold",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "window",
          "type": "uint256"
        }
      ],
      "name": "setVerifyWindow",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "verifier",
          "type": "address"
        },
        {
          "internalType": "bool",
          "name": "allowed",
          "type": "bool"
        }
      ],
      "name": "setWhiteList",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "stake",
          "type": "uint256"
        }
      ],
      "name": "verifierStake",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "verifier_stakes",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "name": "verifiers",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "cIndex",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "hash",
          "type": "bytes"
        },
        {
          "internalType": "bytes",
          "name": "keyhash",
          "type": "bytes"
        }
      ],
      "name": "verify1",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "cIndex",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "key",
          "type": "bytes"
        }
      ],
      "name": "verify2",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "verifyWindow",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "whitelist",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "withdraw",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        }
      ],
      "name": "withdrawSeqStake",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "transactionHash": "0xf91c26502a226ff5a1df1484967c8f1de522750d26d69a87ef6aebba2cbe1f5b",
  "receipt": {
    "to": null,
    "from": "0x012347D9D1cC9df8d53289d43d84b5bCdED7F480",
    "contractAddress": "0x5e6Ad71c85712fb32791Ebf3Cee1646d6cbaDfC6",
    "transactionIndex": 0,
    "gasUsed": "4582988",
    "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
    "blockHash": "0xb60480a535cf61f388e3c754f67001e8637bdd923917bdfdfcdd77b492978850",
    "transactionHash": "0xf91c26502a226ff5a1df1484967c8f1de522750d26d69a87ef6aebba2cbe1f5b",
    "logs": [],
    "blockNumber": 125,
    "cumulativeGasUsed": "4582988",
    "status": 1,
    "byzantium": true
  },
  "args": [],
  "numDeployments": 1,
  "solcInputHash": "452b4108adbe7ec4e50c9cf8a60feb9d",
  "metadata": "{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Claim\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"cIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"enum MVM_Verifier.SETTLEMENT\",\"name\":\"result\",\"type\":\"uint8\"}],\"name\":\"Finalize\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"cIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"chainID\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"indexed\":false,\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"header\",\"type\":\"tuple\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"NewChallenge\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"stakeLost\",\"type\":\"uint256\"}],\"name\":\"Penalize\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Reward\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"chainID\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"seq\",\"type\":\"address\"}],\"name\":\"SlashSequencer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Stake\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"cIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"}],\"name\":\"Verify1\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"cIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"}],\"name\":\"Verify2\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Withdraw\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"CONFIG_OWNER_KEY\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"absence_strikes\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"activeChallenges\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"chain_under_challenge\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"challenges\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"challenger\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"chainID\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"header\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"numQualifiedVerifiers\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"numVerifiers\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"done\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"claim\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"consensus_strikes\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"key\",\"type\":\"bytes\"}],\"name\":\"decrypt\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"depositSeqStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"disableWhiteList\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"key\",\"type\":\"bytes\"}],\"name\":\"encrypt\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"elements\",\"type\":\"bytes32[]\"}],\"name\":\"getMerkleRoot\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"isSufficientlyStaked\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"}],\"name\":\"isWhiteListed\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"metis\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"minStake\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"chainID\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"struct Lib_OVMCodec.ChainBatchHeader\",\"name\":\"header\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"proposedHash\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"keyhash\",\"type\":\"bytes\"}],\"name\":\"newChallenge\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"numQualifiedVerifiers\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"rewards\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"seqStake\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_minStake\",\"type\":\"uint256\"}],\"name\":\"setMinStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"absence_threshold\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"fail_threshold\",\"type\":\"uint256\"}],\"name\":\"setThreshold\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"window\",\"type\":\"uint256\"}],\"name\":\"setVerifyWindow\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"}],\"name\":\"setWhiteList\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"}],\"name\":\"verifierStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"verifier_stakes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"verifiers\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"cIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"hash\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"keyhash\",\"type\":\"bytes\"}],\"name\":\"verify1\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"cIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"key\",\"type\":\"bytes\"}],\"name\":\"verify2\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"verifyWindow\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"whitelist\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"withdrawSeqStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"resolve(string)\":{\"params\":{\"_name\":\"Name to resolve an address for.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"resolve(string)\":{\"notice\":\"Resolves the address associated with a given name.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/MVM/MVM_Verifier.sol\":\"MVM_Verifier\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":5000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n    address private _owner;\\n\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /**\\n     * @dev Initializes the contract setting the deployer as the initial owner.\\n     */\\n    constructor() {\\n        _transferOwnership(_msgSender());\\n    }\\n\\n    /**\\n     * @dev Throws if called by any account other than the owner.\\n     */\\n    modifier onlyOwner() {\\n        _checkOwner();\\n        _;\\n    }\\n\\n    /**\\n     * @dev Returns the address of the current owner.\\n     */\\n    function owner() public view virtual returns (address) {\\n        return _owner;\\n    }\\n\\n    /**\\n     * @dev Throws if the sender is not the owner.\\n     */\\n    function _checkOwner() internal view virtual {\\n        require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n    }\\n\\n    /**\\n     * @dev Leaves the contract without owner. It will not be possible to call\\n     * `onlyOwner` functions anymore. Can only be called by the current owner.\\n     *\\n     * NOTE: Renouncing ownership will leave the contract without an owner,\\n     * thereby removing any functionality that is only available to the owner.\\n     */\\n    function renounceOwnership() public virtual onlyOwner {\\n        _transferOwnership(address(0));\\n    }\\n\\n    /**\\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n     * Can only be called by the current owner.\\n     */\\n    function transferOwnership(address newOwner) public virtual onlyOwner {\\n        require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n        _transferOwnership(newOwner);\\n    }\\n\\n    /**\\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n     * Internal function without access restriction.\\n     */\\n    function _transferOwnership(address newOwner) internal virtual {\\n        address oldOwner = _owner;\\n        _owner = newOwner;\\n        emit OwnershipTransferred(oldOwner, newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0xa94b34880e3c1b0b931662cb1c09e5dfa6662f31cba80e07c5ee71cd135c9673\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20 {\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /**\\n     * @dev Returns the amount of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the amount of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves `amount` tokens from the caller's account to `to`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address to, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Moves `amount` tokens from `from` to `to` using the\\n     * allowance mechanism. `amount` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(\\n        address from,\\n        address to,\\n        uint256 amount\\n    ) external returns (bool);\\n}\\n\",\"keccak256\":\"0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n    function _msgSender() internal view virtual returns (address) {\\n        return msg.sender;\\n    }\\n\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"contracts/L1/rollup/IChainStorageContainer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/**\\n * @title IChainStorageContainer\\n */\\ninterface IChainStorageContainer {\\n    /********************\\n     * Public Functions *\\n     ********************/\\n\\n    /**\\n     * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n     * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n     * 27 bytes to store arbitrary data.\\n     * @param _globalMetadata New global metadata to set.\\n     */\\n    function setGlobalMetadata(bytes27 _globalMetadata) external;\\n\\n    /**\\n     * Retrieves the container's global metadata field.\\n     * @return Container global metadata field.\\n     */\\n    function getGlobalMetadata() external view returns (bytes27);\\n\\n    /**\\n     * Retrieves the number of objects stored in the container.\\n     * @return Number of objects in the container.\\n     */\\n    function length() external view returns (uint256);\\n\\n    /**\\n     * Pushes an object into the container.\\n     * @param _object A 32 byte value to insert into the container.\\n     */\\n    function push(bytes32 _object) external;\\n\\n    /**\\n     * Pushes an object into the container. Function allows setting the global metadata since\\n     * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n     * metadata (it's an optimization).\\n     * @param _object A 32 byte value to insert into the container.\\n     * @param _globalMetadata New global metadata for the container.\\n     */\\n    function push(bytes32 _object, bytes27 _globalMetadata) external;\\n\\n    /**\\n     * Set an object into the container. Function allows setting the global metadata since\\n     * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n     * metadata (it's an optimization).\\n     * @param _index position.\\n     * @param _object A 32 byte value to insert into the container.\\n     */\\n    function setByChainId(\\n        uint256 _chainId,\\n        uint256 _index,\\n        bytes32 _object\\n    ) external;\\n\\n    /**\\n     * Retrieves an object from the container.\\n     * @param _index Index of the particular object to access.\\n     * @return 32 byte object value.\\n     */\\n    function get(uint256 _index) external view returns (bytes32);\\n\\n    /**\\n     * Removes all objects after and including a given index.\\n     * @param _index Object index to delete from.\\n     */\\n    function deleteElementsAfterInclusive(uint256 _index) external;\\n\\n    /**\\n     * Removes all objects after and including a given index. Also allows setting the global\\n     * metadata field.\\n     * @param _index Object index to delete from.\\n     * @param _globalMetadata New global metadata for the container.\\n     */\\n    function deleteElementsAfterInclusive(uint256 _index, bytes27 _globalMetadata) external;\\n\\n    /**\\n     * Sets the container's global metadata field. We're using `bytes27` here because we use five\\n     * bytes to maintain the length of the underlying data structure, meaning we have an extra\\n     * 27 bytes to store arbitrary data.\\n     * @param _chainId identity for the l2 chain.\\n     * @param _globalMetadata New global metadata to set.\\n     */\\n    function setGlobalMetadataByChainId(uint256 _chainId, bytes27 _globalMetadata) external;\\n\\n    /**\\n     * Retrieves the container's global metadata field.\\n     * @param _chainId identity for the l2 chain.\\n     * @return Container global metadata field.\\n     */\\n    function getGlobalMetadataByChainId(uint256 _chainId) external view returns (bytes27);\\n\\n    /**\\n     * Retrieves the number of objects stored in the container.\\n     * @param _chainId identity for the l2 chain.\\n     * @return Number of objects in the container.\\n     */\\n    function lengthByChainId(uint256 _chainId) external view returns (uint256);\\n\\n    /**\\n     * Pushes an object into the container.\\n     * @param _chainId identity for the l2 chain.\\n     * @param _object A 32 byte value to insert into the container.\\n     */\\n    function pushByChainId(uint256 _chainId, bytes32 _object) external;\\n\\n    /**\\n     * Pushes an object into the container. Function allows setting the global metadata since\\n     * we'll need to touch the \\\"length\\\" storage slot anyway, which also contains the global\\n     * metadata (it's an optimization).\\n     * @param _chainId identity for the l2 chain.\\n     * @param _object A 32 byte value to insert into the container.\\n     * @param _globalMetadata New global metadata for the container.\\n     */\\n    function pushByChainId(\\n        uint256 _chainId,\\n        bytes32 _object,\\n        bytes27 _globalMetadata\\n    ) external;\\n\\n    /**\\n     * Retrieves an object from the container.\\n     * @param _chainId identity for the l2 chain.\\n     * @param _index Index of the particular object to access.\\n     * @return 32 byte object value.\\n     */\\n    function getByChainId(uint256 _chainId, uint256 _index) external view returns (bytes32);\\n\\n    /**\\n     * Removes all objects after and including a given index.\\n     * @param _chainId identity for the l2 chain.\\n     * @param _index Object index to delete from.\\n     */\\n    function deleteElementsAfterInclusiveByChainId(uint256 _chainId, uint256 _index) external;\\n\\n    /**\\n     * Removes all objects after and including a given index. Also allows setting the global\\n     * metadata field.\\n     * @param _chainId identity for the l2 chain.\\n     * @param _index Object index to delete from.\\n     * @param _globalMetadata New global metadata for the container.\\n     */\\n    function deleteElementsAfterInclusiveByChainId(\\n        uint256 _chainId,\\n        uint256 _index,\\n        bytes27 _globalMetadata\\n    ) external;\\n}\\n\",\"keccak256\":\"0x6e5473cd0f460bd5386c5f111c03d091b165b1b9391394d25326d30174b17fa4\",\"license\":\"MIT\"},\"contracts/L1/rollup/IStateCommitmentChain.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >0.5.0 <0.9.0;\\n\\n/* Library Imports */\\nimport { Lib_OVMCodec } from \\\"../../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { IChainStorageContainer } from \\\"./IChainStorageContainer.sol\\\";\\n\\n/**\\n * @title IStateCommitmentChain\\n */\\ninterface IStateCommitmentChain {\\n    /**********\\n     * Events *\\n     **********/\\n\\n    event StateBatchAppended(\\n        uint256 _chainId,\\n        uint256 indexed _batchIndex,\\n        bytes32 _batchRoot,\\n        uint256 _batchSize,\\n        uint256 _prevTotalElements,\\n        bytes _extraData\\n    );\\n\\n    event StateBatchDeleted(uint256 _chainId, uint256 indexed _batchIndex, bytes32 _batchRoot);\\n\\n    /********************\\n     * Public Functions *\\n     ********************/\\n\\n    function batches() external view returns (IChainStorageContainer);\\n\\n    /**\\n     * Retrieves the total number of elements submitted.\\n     * @return _totalElements Total submitted elements.\\n     */\\n    function getTotalElements() external view returns (uint256 _totalElements);\\n\\n    /**\\n     * Retrieves the total number of batches submitted.\\n     * @return _totalBatches Total submitted batches.\\n     */\\n    function getTotalBatches() external view returns (uint256 _totalBatches);\\n\\n    /**\\n     * Retrieves the timestamp of the last batch submitted by the sequencer.\\n     * @return _lastSequencerTimestamp Last sequencer batch timestamp.\\n     */\\n    function getLastSequencerTimestamp() external view returns (uint256 _lastSequencerTimestamp);\\n\\n    /**\\n     * Appends a batch of state roots to the chain.\\n     * @param _batch Batch of state roots.\\n     * @param _shouldStartAtElement Index of the element at which this batch should start.\\n     */\\n    function appendStateBatch(bytes32[] calldata _batch, uint256 _shouldStartAtElement) external;\\n\\n    /**\\n     * Deletes all state roots after (and including) a given batch.\\n     * @param _batchHeader Header of the batch to start deleting from.\\n     */\\n    function deleteStateBatch(Lib_OVMCodec.ChainBatchHeader memory _batchHeader) external;\\n\\n    /**\\n     * Verifies a batch inclusion proof.\\n     * @param _element Hash of the element to verify a proof for.\\n     * @param _batchHeader Header of the batch in which the element was included.\\n     * @param _proof Merkle inclusion proof for the element.\\n     */\\n    function verifyStateCommitment(\\n        bytes32 _element,\\n        Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n        Lib_OVMCodec.ChainInclusionProof memory _proof\\n    ) external view returns (bool _verified);\\n\\n    /**\\n     * Checks whether a given batch is still inside its fraud proof window.\\n     * @param _batchHeader Header of the batch to check.\\n     * @return _inside Whether or not the batch is inside the fraud proof window.\\n     */\\n    function insideFraudProofWindow(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n        external\\n        view\\n        returns (bool _inside);\\n\\n    /********************\\n     * chain id added func *\\n     ********************/\\n\\n    /**\\n     * Retrieves the total number of elements submitted.\\n     * @param _chainId identity for the l2 chain.\\n     * @return _totalElements Total submitted elements.\\n     */\\n    function getTotalElementsByChainId(uint256 _chainId)\\n        external\\n        view\\n        returns (uint256 _totalElements);\\n\\n    /**\\n     * Retrieves the total number of batches submitted.\\n     * @param _chainId identity for the l2 chain.\\n     * @return _totalBatches Total submitted batches.\\n     */\\n    function getTotalBatchesByChainId(uint256 _chainId)\\n        external\\n        view\\n        returns (uint256 _totalBatches);\\n\\n    /**\\n     * Retrieves the timestamp of the last batch submitted by the sequencer.\\n     * @param _chainId identity for the l2 chain.\\n     * @return _lastSequencerTimestamp Last sequencer batch timestamp.\\n     */\\n    function getLastSequencerTimestampByChainId(uint256 _chainId)\\n        external\\n        view\\n        returns (uint256 _lastSequencerTimestamp);\\n\\n    /**\\n     * Appends a batch of state roots to the chain.\\n     * @param _chainId identity for the l2 chain.\\n     * @param _batch Batch of state roots.\\n     * @param _shouldStartAtElement Index of the element at which this batch should start.\\n     */\\n    function appendStateBatchByChainId(\\n        uint256 _chainId,\\n        bytes32[] calldata _batch,\\n        uint256 _shouldStartAtElement,\\n        string calldata proposer\\n    ) external;\\n\\n    /**\\n     * Deletes all state roots after (and including) a given batch.\\n     * @param _chainId identity for the l2 chain.\\n     * @param _batchHeader Header of the batch to start deleting from.\\n     */\\n    function deleteStateBatchByChainId(\\n        uint256 _chainId,\\n        Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n    ) external;\\n\\n    /**\\n     * Verifies a batch inclusion proof.\\n     * @param _chainId identity for the l2 chain.\\n     * @param _element Hash of the element to verify a proof for.\\n     * @param _batchHeader Header of the batch in which the element was included.\\n     * @param _proof Merkle inclusion proof for the element.\\n     */\\n    function verifyStateCommitmentByChainId(\\n        uint256 _chainId,\\n        bytes32 _element,\\n        Lib_OVMCodec.ChainBatchHeader memory _batchHeader,\\n        Lib_OVMCodec.ChainInclusionProof memory _proof\\n    ) external view returns (bool _verified);\\n\\n    /**\\n     * Checks whether a given batch is still inside its fraud proof window.\\n     * @param _chainId identity for the l2 chain.\\n     * @param _batchHeader Header of the batch to check.\\n     * @return _inside Whether or not the batch is inside the fraud proof window.\\n     */\\n    function insideFraudProofWindowByChainId(\\n        uint256 _chainId,\\n        Lib_OVMCodec.ChainBatchHeader memory _batchHeader\\n    ) external view returns (bool _inside);\\n}\\n\",\"keccak256\":\"0xa7e8ab4f2dca0197e1a37ef99fe615449e7c3adabece3677ab9a5aee91510c07\",\"license\":\"MIT\"},\"contracts/MVM/MVM_Verifier.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n/* Contract Imports */\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\nimport { IERC20 } from \\\"@openzeppelin/contracts/token/ERC20/IERC20.sol\\\";\\nimport { iMVM_DiscountOracle } from \\\"./iMVM_DiscountOracle.sol\\\";\\nimport { Lib_AddressResolver } from \\\"../libraries/resolver/Lib_AddressResolver.sol\\\";\\nimport { Lib_OVMCodec } from \\\"../libraries/codec/Lib_OVMCodec.sol\\\";\\nimport { Lib_MerkleTree } from \\\"../libraries/utils/Lib_MerkleTree.sol\\\";\\nimport { IStateCommitmentChain } from \\\"../L1/rollup/IStateCommitmentChain.sol\\\";\\n\\ncontract MVM_Verifier is Lib_AddressResolver {\\n    // second slot\\n    address public metis;\\n\\n    enum SETTLEMENT {\\n        NOT_ENOUGH_VERIFIER,\\n        SAME_ROOT,\\n        AGREE,\\n        DISAGREE,\\n        PASS\\n    }\\n\\n    event NewChallenge(\\n        uint256 cIndex,\\n        uint256 chainID,\\n        Lib_OVMCodec.ChainBatchHeader header,\\n        uint256 timestamp\\n    );\\n    event Verify1(uint256 cIndex, address verifier);\\n    event Verify2(uint256 cIndex, address verifier);\\n    event Finalize(uint256 cIndex, address sender, SETTLEMENT result);\\n    event Penalize(address sender, uint256 stakeLost);\\n    event Reward(address target, uint256 amount);\\n    event Claim(address sender, uint256 amount);\\n    event Withdraw(address sender, uint256 amount);\\n    event Stake(address verifier, uint256 amount);\\n    event SlashSequencer(uint256 chainID, address seq);\\n\\n    /*************\\n     * Constants *\\n     *************/\\n    string public constant CONFIG_OWNER_KEY = \\\"METIS_MANAGER\\\";\\n\\n    //challenge info\\n    struct Challenge {\\n        address challenger;\\n        uint256 chainID;\\n        uint256 index;\\n        Lib_OVMCodec.ChainBatchHeader header;\\n        uint256 timestamp;\\n        uint256 numQualifiedVerifiers;\\n        uint256 numVerifiers;\\n        address[] verifiers;\\n        bool done;\\n    }\\n\\n    mapping(address => uint256) public verifier_stakes;\\n    mapping(uint256 => mapping(address => bytes)) private challenge_keys;\\n    mapping(uint256 => mapping(address => bytes)) private challenge_key_hashes;\\n    mapping(uint256 => mapping(address => bytes)) private challenge_hashes;\\n\\n    mapping(address => uint256) public rewards;\\n    mapping(address => uint8) public absence_strikes;\\n    mapping(address => uint8) public consensus_strikes;\\n\\n    // only one active challenge for each chain  chainid=>cIndex\\n    mapping(uint256 => uint256) public chain_under_challenge;\\n\\n    // white list\\n    mapping(address => bool) public whitelist;\\n    bool useWhiteList;\\n\\n    address[] public verifiers;\\n    Challenge[] public challenges;\\n\\n    uint256 public verifyWindow = 3600 * 24; // 24 hours of window to complete the each verify phase\\n    uint256 public activeChallenges;\\n\\n    uint256 public minStake;\\n    uint256 public seqStake;\\n\\n    uint256 public numQualifiedVerifiers;\\n\\n    uint256 FAIL_THRESHOLD = 2; // 1 time grace\\n    uint256 ABSENCE_THRESHOLD = 4; // 2 times grace\\n\\n    modifier onlyManager() {\\n        require(\\n            msg.sender == resolve(CONFIG_OWNER_KEY),\\n            \\\"MVM_Verifier: Function can only be called by the METIS_MANAGER.\\\"\\n        );\\n        _;\\n    }\\n\\n    modifier onlyWhitelisted() {\\n        require(isWhiteListed(msg.sender), \\\"only whitelisted verifiers can call\\\");\\n        _;\\n    }\\n\\n    modifier onlyStaked() {\\n        require(isSufficientlyStaked(msg.sender), \\\"insufficient stake\\\");\\n        _;\\n    }\\n\\n    constructor() Lib_AddressResolver(address(0)) {}\\n\\n    // add stake as a verifier\\n    function verifierStake(uint256 stake) public onlyWhitelisted {\\n        require(activeChallenges == 0, \\\"stake is currently prohibited\\\"); //ongoing challenge\\n        require(stake > 0, \\\"zero stake not allowed\\\");\\n        require(\\n            IERC20(metis).transferFrom(msg.sender, address(this), stake),\\n            \\\"transfer metis failed\\\"\\n        );\\n\\n        uint256 previousBalance = verifier_stakes[msg.sender];\\n        verifier_stakes[msg.sender] += stake;\\n\\n        require(isSufficientlyStaked(msg.sender), \\\"insufficient stake to qualify as a verifier\\\");\\n\\n        if (previousBalance == 0) {\\n            numQualifiedVerifiers++;\\n            verifiers.push(msg.sender);\\n        }\\n\\n        emit Stake(msg.sender, stake);\\n    }\\n\\n    // start a new challenge\\n    // @param chainID chainid\\n    // @param header chainbatch header\\n    // @param proposedHash encrypted hash of the correct state\\n    // @param keyhash hash of the decryption key\\n    //\\n    // @dev why do we ask for key and keyhash? because we want verifiers compute the state instead\\n    // of just copying from other verifiers.\\n    function newChallenge(\\n        uint256 chainID,\\n        Lib_OVMCodec.ChainBatchHeader calldata header,\\n        bytes calldata proposedHash,\\n        bytes calldata keyhash\\n    ) public onlyWhitelisted onlyStaked {\\n        uint256 tempIndex = chain_under_challenge[chainID] - 1;\\n        require(\\n            tempIndex == 0 || block.timestamp - challenges[tempIndex].timestamp > verifyWindow * 2,\\n            \\\"there is an ongoing challenge\\\"\\n        );\\n        if (tempIndex > 0) {\\n            finalize(tempIndex);\\n        }\\n        IStateCommitmentChain stateChain = IStateCommitmentChain(resolve(\\\"StateCommitmentChain\\\"));\\n\\n        // while the root is encrypted, the timestamp is available in the extradata field of the header\\n        require(\\n            stateChain.insideFraudProofWindow(header),\\n            \\\"the batch is outside of the fraud proof window\\\"\\n        );\\n\\n        Challenge memory c;\\n        c.chainID = chainID;\\n        c.challenger = msg.sender;\\n        c.timestamp = block.timestamp;\\n        c.header = header;\\n\\n        challenges.push(c);\\n        uint256 cIndex = challenges.length - 1;\\n\\n        // house keeping\\n        challenge_hashes[cIndex][msg.sender] = proposedHash;\\n        challenge_key_hashes[cIndex][msg.sender] = keyhash;\\n        challenges[cIndex].numVerifiers++; // the challenger\\n\\n        // this will prevent stake change\\n        activeChallenges++;\\n\\n        chain_under_challenge[chainID] = cIndex + 1; // +1 because 0 means no in-progress challenge\\n        emit NewChallenge(cIndex, chainID, header, block.timestamp);\\n    }\\n\\n    // phase 1 of the verify, provide an encrypted hash and the hash of the decryption key\\n    // @param cIndex index of the challenge\\n    // @param hash encrypted hash of the correct state (for the index referred in the challenge)\\n    // @param keyhash hash of the decryption key\\n    function verify1(\\n        uint256 cIndex,\\n        bytes calldata hash,\\n        bytes calldata keyhash\\n    ) public onlyWhitelisted onlyStaked {\\n        require(\\n            challenge_hashes[cIndex][msg.sender].length == 0,\\n            \\\"verify1 already completed for the sender\\\"\\n        );\\n        challenge_hashes[cIndex][msg.sender] = hash;\\n        challenge_key_hashes[cIndex][msg.sender] = keyhash;\\n        challenges[cIndex].numVerifiers++;\\n        emit Verify1(cIndex, msg.sender);\\n    }\\n\\n    // phase 2 of the verify, provide the actual key to decrypt the hash\\n    // @param cIndex index of the challenge\\n    // @param key the decryption key\\n    function verify2(uint256 cIndex, bytes calldata key) public onlyStaked onlyWhitelisted {\\n        require(\\n            challenges[cIndex].numVerifiers == numQualifiedVerifiers ||\\n                block.timestamp - challenges[cIndex].timestamp > verifyWindow,\\n            \\\"phase 2 not ready\\\"\\n        );\\n        require(\\n            challenge_hashes[cIndex][msg.sender].length > 0,\\n            \\\"you didn't participate in phase 1\\\"\\n        );\\n        if (challenge_keys[cIndex][msg.sender].length > 0) {\\n            finalize(cIndex);\\n            return;\\n        }\\n\\n        //verify whether the key matches the keyhash initially provided.\\n        require(\\n            sha256(key) == bytes32(challenge_key_hashes[cIndex][msg.sender]),\\n            \\\"key and keyhash don't match\\\"\\n        );\\n\\n        if (msg.sender == challenges[cIndex].challenger) {\\n            //decode the root in the header too\\n            challenges[cIndex].header.batchRoot = bytes32(\\n                decrypt(abi.encodePacked(challenges[cIndex].header.batchRoot), key)\\n            );\\n        }\\n        challenge_keys[cIndex][msg.sender] = key;\\n        challenge_hashes[cIndex][msg.sender] = decrypt(challenge_hashes[cIndex][msg.sender], key);\\n        challenges[cIndex].verifiers.push(msg.sender);\\n        emit Verify2(cIndex, msg.sender);\\n\\n        finalize(cIndex);\\n    }\\n\\n    function finalize(uint256 cIndex) internal {\\n        Challenge storage challenge = challenges[cIndex];\\n\\n        require(challenge.done == false, \\\"challenge is closed\\\");\\n\\n        if (\\n            challenge.verifiers.length != challenge.numVerifiers &&\\n            block.timestamp - challenge.timestamp < verifyWindow * 2\\n        ) {\\n            // not ready to finalize. do nothing\\n            return;\\n        }\\n\\n        IStateCommitmentChain stateChain = IStateCommitmentChain(resolve(\\\"StateCommitmentChain\\\"));\\n        bytes32 proposedHash = bytes32(challenge_hashes[cIndex][challenge.challenger]);\\n\\n        uint256 reward = 0;\\n\\n        address[] memory agrees = new address[](challenge.verifiers.length);\\n        uint256 numAgrees = 0;\\n        address[] memory disagrees = new address[](challenge.verifiers.length);\\n        uint256 numDisagrees = 0;\\n        address[] memory penalized = new address[](challenge.verifiers.length);\\n        uint256 numPenalized = 0;\\n\\n        for (uint256 i = 0; i < verifiers.length; i++) {\\n            if (!isSufficientlyStaked(verifiers[i]) || !isWhiteListed(verifiers[i])) {\\n                // not qualified as a verifier\\n                continue;\\n            }\\n\\n            //record the agreement\\n            if (bytes32(challenge_hashes[cIndex][verifiers[i]]) == proposedHash) {\\n                //agree with the challenger\\n                if (absence_strikes[verifiers[i]] > 0) {\\n                    absence_strikes[verifiers[i]] -= 1; // slowly clear the strike\\n                }\\n                agrees[numAgrees] = verifiers[i];\\n                numAgrees++;\\n            } else if (challenge_keys[cIndex][verifiers[i]].length == 0) {\\n                //absent\\n                absence_strikes[verifiers[i]] += 2;\\n                if (absence_strikes[verifiers[i]] > ABSENCE_THRESHOLD) {\\n                    reward += verifier_stakes[verifiers[i]];\\n                    penalized[numPenalized] = verifiers[i];\\n                    numPenalized++;\\n                }\\n            } else {\\n                //disagree with the challenger\\n                if (absence_strikes[verifiers[i]] > 0) {\\n                    absence_strikes[verifiers[i]] -= 1; // slowly clear the strike\\n                }\\n                disagrees[numDisagrees] = verifiers[i];\\n                numDisagrees++;\\n            }\\n        }\\n        for (uint256 i = 0; i < numPenalized; i++) {\\n            penalize(penalized[i]);\\n        }\\n\\n        if (\\n            Lib_OVMCodec.hashBatchHeader(challenge.header) !=\\n            stateChain.batches().getByChainId(challenge.chainID, challenge.header.batchIndex)\\n        ) {\\n            // wrong header, penalize the challenger\\n            reward += penalize(challenge.challenger);\\n\\n            // reward the disagrees. but no penalty on agrees because the input\\n            // is garbage.\\n            distributeReward(reward, disagrees, challenge.verifiers.length - 1);\\n            emit Finalize(cIndex, msg.sender, SETTLEMENT.DISAGREE);\\n        } else if (challenge.verifiers.length < (numQualifiedVerifiers * 75) / 100) {\\n            // the absent verifiers get a absense strike. no other penalties. already done\\n            emit Finalize(cIndex, msg.sender, SETTLEMENT.NOT_ENOUGH_VERIFIER);\\n        } else if (proposedHash != challenge.header.batchRoot) {\\n            if (numAgrees <= numDisagrees) {\\n                // no consensus, challenge failed.\\n                for (uint256 i = 0; i < numAgrees; i++) {\\n                    consensus_strikes[agrees[i]] += 2;\\n                    if (consensus_strikes[agrees[i]] > FAIL_THRESHOLD) {\\n                        reward += penalize(agrees[i]);\\n                    }\\n                }\\n                distributeReward(reward, disagrees, disagrees.length);\\n                emit Finalize(cIndex, msg.sender, SETTLEMENT.DISAGREE);\\n            } else {\\n                // reached agreement. delete the batch root and slash the sequencer if the header is still valid\\n                if (stateChain.insideFraudProofWindow(challenge.header)) {\\n                    // this header needs to be within the window\\n                    stateChain.deleteStateBatchByChainId(challenge.chainID, challenge.header);\\n\\n                    // temporary for the p1 of the decentralization roadmap\\n                    if (seqStake > 0) {\\n                        reward += seqStake;\\n\\n                        for (uint256 i = 0; i < numDisagrees; i++) {\\n                            consensus_strikes[disagrees[i]] += 2;\\n                            if (consensus_strikes[disagrees[i]] > FAIL_THRESHOLD) {\\n                                reward += penalize(disagrees[i]);\\n                            }\\n                        }\\n                        distributeReward(reward, agrees, agrees.length);\\n                    }\\n                    emit Finalize(cIndex, msg.sender, SETTLEMENT.AGREE);\\n                } else {\\n                    //not in the window anymore. let it pass... no penalty\\n                    emit Finalize(cIndex, msg.sender, SETTLEMENT.PASS);\\n                }\\n            }\\n        } else {\\n            //wasteful challenge, add consensus_strikes to the challenger\\n            consensus_strikes[challenge.challenger] += 2;\\n            if (consensus_strikes[challenge.challenger] > FAIL_THRESHOLD) {\\n                reward += penalize(challenge.challenger);\\n            }\\n            distributeReward(reward, challenge.verifiers, challenge.verifiers.length - 1);\\n            emit Finalize(cIndex, msg.sender, SETTLEMENT.SAME_ROOT);\\n        }\\n\\n        challenge.done = true;\\n        activeChallenges--;\\n        chain_under_challenge[challenge.chainID] = 0;\\n    }\\n\\n    function depositSeqStake(uint256 amount) public onlyManager {\\n        require(\\n            IERC20(metis).transferFrom(msg.sender, address(this), amount),\\n            \\\"transfer metis failed\\\"\\n        );\\n        seqStake += amount;\\n        emit Stake(msg.sender, amount);\\n    }\\n\\n    function withdrawSeqStake(address to) public onlyManager {\\n        require(seqStake > 0, \\\"no stake\\\");\\n        emit Withdraw(msg.sender, seqStake);\\n        uint256 amount = seqStake;\\n        seqStake = 0;\\n\\n        require(IERC20(metis).transfer(to, amount), \\\"transfer metis failed\\\");\\n    }\\n\\n    function claim() public {\\n        require(rewards[msg.sender] > 0, \\\"no reward to claim\\\");\\n        uint256 amount = rewards[msg.sender];\\n        rewards[msg.sender] = 0;\\n\\n        require(IERC20(metis).transfer(msg.sender, amount), \\\"token transfer failed\\\");\\n\\n        emit Claim(msg.sender, amount);\\n    }\\n\\n    function withdraw(uint256 amount) public {\\n        require(activeChallenges == 0, \\\"withdraw is currently prohibited\\\"); //ongoing challenge\\n\\n        uint256 balance = verifier_stakes[msg.sender];\\n        require(balance >= amount, \\\"insufficient stake to withdraw\\\");\\n\\n        if (balance - amount < minStake && balance >= minStake) {\\n            numQualifiedVerifiers--;\\n            deleteVerifier(msg.sender);\\n        }\\n        verifier_stakes[msg.sender] -= amount;\\n\\n        require(IERC20(metis).transfer(msg.sender, amount), \\\"token transfer failed\\\");\\n    }\\n\\n    function setMinStake(uint256 _minStake) public onlyManager {\\n        minStake = _minStake;\\n        uint256 num = 0;\\n        if (verifiers.length > 0) {\\n            address[] memory arr = new address[](verifiers.length);\\n            for (uint256 i = 0; i < verifiers.length; ++i) {\\n                if (verifier_stakes[verifiers[i]] >= minStake) {\\n                    arr[num] = verifiers[i];\\n                    num++;\\n                }\\n            }\\n            if (num < verifiers.length) {\\n                delete verifiers;\\n                for (uint256 i = 0; i < num; i++) {\\n                    verifiers.push(arr[i]);\\n                }\\n            }\\n        }\\n        numQualifiedVerifiers = num;\\n    }\\n\\n    // helper\\n    function isWhiteListed(address verifier) public view returns (bool) {\\n        return !useWhiteList || whitelist[verifier];\\n    }\\n\\n    function isSufficientlyStaked(address target) public view returns (bool) {\\n        return (verifier_stakes[target] >= minStake);\\n    }\\n\\n    // set the length of the time windows for each verification phase\\n    function setVerifyWindow(uint256 window) public onlyManager {\\n        verifyWindow = window;\\n    }\\n\\n    // add the verifier to the whitelist\\n    function setWhiteList(address verifier, bool allowed) public onlyManager {\\n        whitelist[verifier] = allowed;\\n        useWhiteList = true;\\n    }\\n\\n    // allow everyone to be the verifier\\n    function disableWhiteList() public onlyManager {\\n        useWhiteList = false;\\n    }\\n\\n    function setThreshold(uint256 absence_threshold, uint256 fail_threshold) public onlyManager {\\n        ABSENCE_THRESHOLD = absence_threshold;\\n        FAIL_THRESHOLD = fail_threshold;\\n    }\\n\\n    function getMerkleRoot(bytes32[] calldata elements) public pure returns (bytes32) {\\n        return Lib_MerkleTree.getMerkleRoot(elements);\\n    }\\n\\n    //helper fucntion to encrypt data\\n    function encrypt(bytes calldata data, bytes calldata key) public pure returns (bytes memory) {\\n        bytes memory encryptedData = data;\\n        uint256 j = 0;\\n\\n        for (uint256 i = 0; i < encryptedData.length; i++) {\\n            if (j == key.length) {\\n                j = 0;\\n            }\\n            encryptedData[i] = encryptByte(encryptedData[i], uint8(key[j]));\\n            j++;\\n        }\\n\\n        return encryptedData;\\n    }\\n\\n    function encryptByte(bytes1 b, uint8 k) internal pure returns (bytes1) {\\n        uint16 temp16 = uint16(uint8(b));\\n        temp16 += k;\\n\\n        if (temp16 > 255) {\\n            temp16 -= 256;\\n        }\\n        return bytes1(uint8(temp16));\\n    }\\n\\n    // helper fucntion to decrypt the data\\n    function decrypt(bytes memory data, bytes memory key) public pure returns (bytes memory) {\\n        bytes memory decryptedData = data;\\n        uint256 j = 0;\\n\\n        for (uint256 i = 0; i < decryptedData.length; i++) {\\n            if (j == key.length) {\\n                j = 0;\\n            }\\n\\n            decryptedData[i] = decryptByte(decryptedData[i], uint8(key[j]));\\n\\n            j++;\\n        }\\n\\n        return decryptedData;\\n    }\\n\\n    function decryptByte(bytes1 b, uint8 k) internal pure returns (bytes1) {\\n        uint16 temp16 = uint16(uint8(b));\\n        if (temp16 > k) {\\n            temp16 -= k;\\n        } else {\\n            temp16 = 256 - k;\\n        }\\n\\n        return bytes1(uint8(temp16));\\n    }\\n\\n    // calculate the rewards\\n    function distributeReward(\\n        uint256 amount,\\n        address[] memory list,\\n        uint256 num\\n    ) internal {\\n        uint256 reward = amount / num;\\n        if (reward == 0) {\\n            return;\\n        }\\n        uint256 total = 0;\\n        for (uint256 i; i < list.length; i++) {\\n            if (isSufficientlyStaked(list[i])) {\\n                rewards[list[i]] += reward;\\n                total += reward;\\n                emit Reward(list[i], reward);\\n            }\\n        }\\n\\n        if (total < amount) {\\n            if (isSufficientlyStaked(list[0])) {\\n                rewards[list[0]] += total - amount;\\n                emit Reward(list[0], total - amount);\\n            } else {\\n                rewards[list[1]] += total - amount;\\n                emit Reward(list[1], total - amount);\\n            }\\n        }\\n    }\\n\\n    // slash the verifier stake\\n    function penalize(address target) internal returns (uint256) {\\n        uint256 stake = verifier_stakes[target];\\n        verifier_stakes[target] = 0;\\n        numQualifiedVerifiers--;\\n        deleteVerifier(target);\\n        emit Penalize(target, stake);\\n\\n        return stake;\\n    }\\n\\n    function deleteVerifier(address target) internal {\\n        bool hasVerifier = false;\\n        uint256 pos = 0;\\n        for (uint256 i = 0; i < verifiers.length; i++) {\\n            if (verifiers[i] == target) {\\n                hasVerifier = true;\\n                pos = i;\\n                break;\\n            }\\n        }\\n        if (hasVerifier) {\\n            for (uint256 i = pos; i < verifiers.length - 1; i++) {\\n                verifiers[i] = verifiers[i + 1];\\n            }\\n            verifiers.pop();\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xbf57f2abd1746a0dab78fd6dc6c96bd92ca6786d8acc1aedbe1c697c2f056a9e\",\"license\":\"MIT\"},\"contracts/MVM/iMVM_DiscountOracle.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\ninterface iMVM_DiscountOracle {\\n    function setDiscount(uint256 _discount) external;\\n\\n    function setMinL2Gas(uint256 _minL2Gas) external;\\n\\n    function setWhitelistedXDomainSender(address _sender, bool _isWhitelisted) external;\\n\\n    function isXDomainSenderAllowed(address _sender) external view returns (bool);\\n\\n    function setAllowAllXDomainSenders(bool _allowAllXDomainSenders) external;\\n\\n    function getMinL2Gas() external view returns (uint256);\\n\\n    function getDiscount() external view returns (uint256);\\n\\n    function processL2SeqGas(address sender, uint256 _chainId) external payable;\\n\\n    function withdrawToSeq(uint256 _amount, uint256 _chainId) external;\\n}\\n\",\"keccak256\":\"0x5fae2a8ff4190e28fc8a9bb6a0f258e21d07b1487f734b634c692f732c313f37\",\"license\":\"MIT\"},\"contracts/libraries/codec/Lib_OVMCodec.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_RLPReader } from \\\"../rlp/Lib_RLPReader.sol\\\";\\n\\n/**\\n * @title Lib_OVMCodec\\n */\\nlibrary Lib_OVMCodec {\\n    /*********\\n     * Enums *\\n     *********/\\n\\n    enum QueueOrigin {\\n        SEQUENCER_QUEUE,\\n        L1TOL2_QUEUE\\n    }\\n\\n    /***********\\n     * Structs *\\n     ***********/\\n\\n    struct EVMAccount {\\n        uint256 nonce;\\n        uint256 balance;\\n        bytes32 storageRoot;\\n        bytes32 codeHash;\\n    }\\n\\n    struct ChainBatchHeader {\\n        uint256 batchIndex;\\n        bytes32 batchRoot;\\n        uint256 batchSize;\\n        uint256 prevTotalElements;\\n        bytes extraData;\\n    }\\n\\n    struct ChainInclusionProof {\\n        uint256 index;\\n        bytes32[] siblings;\\n    }\\n\\n    struct Transaction {\\n        uint256 timestamp;\\n        uint256 blockNumber;\\n        QueueOrigin l1QueueOrigin;\\n        address l1TxOrigin;\\n        address entrypoint;\\n        uint256 gasLimit;\\n        bytes data;\\n    }\\n\\n    struct TransactionChainElement {\\n        bool isSequenced;\\n        uint256 queueIndex; // QUEUED TX ONLY\\n        uint256 timestamp; // SEQUENCER TX ONLY\\n        uint256 blockNumber; // SEQUENCER TX ONLY\\n        bytes txData; // SEQUENCER TX ONLY\\n    }\\n\\n    struct QueueElement {\\n        bytes32 transactionHash;\\n        uint40 timestamp;\\n        uint40 blockNumber;\\n    }\\n\\n    /**********************\\n     * Internal Functions *\\n     **********************/\\n\\n    /**\\n     * Encodes a standard OVM transaction.\\n     * @param _transaction OVM transaction to encode.\\n     * @return Encoded transaction bytes.\\n     */\\n    function encodeTransaction(Transaction memory _transaction)\\n        internal\\n        pure\\n        returns (bytes memory)\\n    {\\n        return\\n            abi.encodePacked(\\n                _transaction.timestamp,\\n                _transaction.blockNumber,\\n                _transaction.l1QueueOrigin,\\n                _transaction.l1TxOrigin,\\n                _transaction.entrypoint,\\n                _transaction.gasLimit,\\n                _transaction.data\\n            );\\n    }\\n\\n    /**\\n     * Hashes a standard OVM transaction.\\n     * @param _transaction OVM transaction to encode.\\n     * @return Hashed transaction\\n     */\\n    function hashTransaction(Transaction memory _transaction) internal pure returns (bytes32) {\\n        return keccak256(encodeTransaction(_transaction));\\n    }\\n\\n    /**\\n     * @notice Decodes an RLP-encoded account state into a useful struct.\\n     * @param _encoded RLP-encoded account state.\\n     * @return Account state struct.\\n     */\\n    function decodeEVMAccount(bytes memory _encoded) internal pure returns (EVMAccount memory) {\\n        Lib_RLPReader.RLPItem[] memory accountState = Lib_RLPReader.readList(_encoded);\\n\\n        return\\n            EVMAccount({\\n                nonce: Lib_RLPReader.readUint256(accountState[0]),\\n                balance: Lib_RLPReader.readUint256(accountState[1]),\\n                storageRoot: Lib_RLPReader.readBytes32(accountState[2]),\\n                codeHash: Lib_RLPReader.readBytes32(accountState[3])\\n            });\\n    }\\n\\n    /**\\n     * Calculates a hash for a given batch header.\\n     * @param _batchHeader Header to hash.\\n     * @return Hash of the header.\\n     */\\n    function hashBatchHeader(Lib_OVMCodec.ChainBatchHeader memory _batchHeader)\\n        internal\\n        pure\\n        returns (bytes32)\\n    {\\n        return\\n            keccak256(\\n                abi.encode(\\n                    _batchHeader.batchRoot,\\n                    _batchHeader.batchSize,\\n                    _batchHeader.prevTotalElements,\\n                    _batchHeader.extraData\\n                )\\n            );\\n    }\\n}\\n\",\"keccak256\":\"0xd727df7cc99ff84e9c5722120163e7bf0077170758a4c9b0aa90b8e3abb0e134\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n    /**********\\n     * Events *\\n     **********/\\n\\n    event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n    /*************\\n     * Variables *\\n     *************/\\n\\n    mapping(bytes32 => address) private addresses;\\n\\n    /********************\\n     * Public Functions *\\n     ********************/\\n\\n    /**\\n     * Changes the address associated with a particular name.\\n     * @param _name String name to associate an address with.\\n     * @param _address Address to associate with the name.\\n     */\\n    function setAddress(string memory _name, address _address) external onlyOwner {\\n        bytes32 nameHash = _getNameHash(_name);\\n        address oldAddress = addresses[nameHash];\\n        addresses[nameHash] = _address;\\n\\n        emit AddressSet(_name, _address, oldAddress);\\n    }\\n\\n    /**\\n     * Retrieves the address associated with a given name.\\n     * @param _name Name to retrieve an address for.\\n     * @return Address associated with the given name.\\n     */\\n    function getAddress(string memory _name) external view returns (address) {\\n        return addresses[_getNameHash(_name)];\\n    }\\n\\n    /**********************\\n     * Internal Functions *\\n     **********************/\\n\\n    /**\\n     * Computes the hash of a name.\\n     * @param _name Name to compute a hash for.\\n     * @return Hash of the given name.\\n     */\\n    function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n        return keccak256(abi.encodePacked(_name));\\n    }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"contracts/libraries/resolver/Lib_AddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* Library Imports */\\nimport { Lib_AddressManager } from \\\"./Lib_AddressManager.sol\\\";\\n\\n/**\\n * @title Lib_AddressResolver\\n */\\nabstract contract Lib_AddressResolver {\\n    /*************\\n     * Variables *\\n     *************/\\n\\n    Lib_AddressManager public libAddressManager;\\n\\n    /***************\\n     * Constructor *\\n     ***************/\\n\\n    /**\\n     * @param _libAddressManager Address of the Lib_AddressManager.\\n     */\\n    constructor(address _libAddressManager) {\\n        libAddressManager = Lib_AddressManager(_libAddressManager);\\n    }\\n\\n    /********************\\n     * Public Functions *\\n     ********************/\\n\\n    /**\\n     * Resolves the address associated with a given name.\\n     * @param _name Name to resolve an address for.\\n     * @return Address associated with the given name.\\n     */\\n    function resolve(string memory _name) public view returns (address) {\\n        return libAddressManager.getAddress(_name);\\n    }\\n}\\n\",\"keccak256\":\"0x515c4db671a28e2fe180201f6d11c0208c05f582ca3489fb6b8e81c27659bc62\",\"license\":\"MIT\"},\"contracts/libraries/rlp/Lib_RLPReader.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_RLPReader\\n * @dev Adapted from \\\"RLPReader\\\" by Hamdi Allam (hamdi.allam97@gmail.com).\\n */\\nlibrary Lib_RLPReader {\\n    /*************\\n     * Constants *\\n     *************/\\n\\n    uint256 internal constant MAX_LIST_LENGTH = 32;\\n\\n    /*********\\n     * Enums *\\n     *********/\\n\\n    enum RLPItemType {\\n        DATA_ITEM,\\n        LIST_ITEM\\n    }\\n\\n    /***********\\n     * Structs *\\n     ***********/\\n\\n    struct RLPItem {\\n        uint256 length;\\n        uint256 ptr;\\n    }\\n\\n    /**********************\\n     * Internal Functions *\\n     **********************/\\n\\n    /**\\n     * Converts bytes to a reference to memory position and length.\\n     * @param _in Input bytes to convert.\\n     * @return Output memory reference.\\n     */\\n    function toRLPItem(bytes memory _in) internal pure returns (RLPItem memory) {\\n        uint256 ptr;\\n        assembly {\\n            ptr := add(_in, 32)\\n        }\\n\\n        return RLPItem({ length: _in.length, ptr: ptr });\\n    }\\n\\n    /**\\n     * Reads an RLP list value into a list of RLP items.\\n     * @param _in RLP list value.\\n     * @return Decoded RLP list items.\\n     */\\n    function readList(RLPItem memory _in) internal pure returns (RLPItem[] memory) {\\n        (uint256 listOffset, , RLPItemType itemType) = _decodeLength(_in);\\n\\n        require(itemType == RLPItemType.LIST_ITEM, \\\"Invalid RLP list value.\\\");\\n\\n        // Solidity in-memory arrays can't be increased in size, but *can* be decreased in size by\\n        // writing to the length. Since we can't know the number of RLP items without looping over\\n        // the entire input, we'd have to loop twice to accurately size this array. It's easier to\\n        // simply set a reasonable maximum list length and decrease the size before we finish.\\n        RLPItem[] memory out = new RLPItem[](MAX_LIST_LENGTH);\\n\\n        uint256 itemCount = 0;\\n        uint256 offset = listOffset;\\n        while (offset < _in.length) {\\n            require(itemCount < MAX_LIST_LENGTH, \\\"Provided RLP list exceeds max list length.\\\");\\n\\n            (uint256 itemOffset, uint256 itemLength, ) = _decodeLength(\\n                RLPItem({ length: _in.length - offset, ptr: _in.ptr + offset })\\n            );\\n\\n            out[itemCount] = RLPItem({ length: itemLength + itemOffset, ptr: _in.ptr + offset });\\n\\n            itemCount += 1;\\n            offset += itemOffset + itemLength;\\n        }\\n\\n        // Decrease the array size to match the actual item count.\\n        assembly {\\n            mstore(out, itemCount)\\n        }\\n\\n        return out;\\n    }\\n\\n    /**\\n     * Reads an RLP list value into a list of RLP items.\\n     * @param _in RLP list value.\\n     * @return Decoded RLP list items.\\n     */\\n    function readList(bytes memory _in) internal pure returns (RLPItem[] memory) {\\n        return readList(toRLPItem(_in));\\n    }\\n\\n    /**\\n     * Reads an RLP bytes value into bytes.\\n     * @param _in RLP bytes value.\\n     * @return Decoded bytes.\\n     */\\n    function readBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n        (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n        require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes value.\\\");\\n\\n        return _copy(_in.ptr, itemOffset, itemLength);\\n    }\\n\\n    /**\\n     * Reads an RLP bytes value into bytes.\\n     * @param _in RLP bytes value.\\n     * @return Decoded bytes.\\n     */\\n    function readBytes(bytes memory _in) internal pure returns (bytes memory) {\\n        return readBytes(toRLPItem(_in));\\n    }\\n\\n    /**\\n     * Reads an RLP string value into a string.\\n     * @param _in RLP string value.\\n     * @return Decoded string.\\n     */\\n    function readString(RLPItem memory _in) internal pure returns (string memory) {\\n        return string(readBytes(_in));\\n    }\\n\\n    /**\\n     * Reads an RLP string value into a string.\\n     * @param _in RLP string value.\\n     * @return Decoded string.\\n     */\\n    function readString(bytes memory _in) internal pure returns (string memory) {\\n        return readString(toRLPItem(_in));\\n    }\\n\\n    /**\\n     * Reads an RLP bytes32 value into a bytes32.\\n     * @param _in RLP bytes32 value.\\n     * @return Decoded bytes32.\\n     */\\n    function readBytes32(RLPItem memory _in) internal pure returns (bytes32) {\\n        require(_in.length <= 33, \\\"Invalid RLP bytes32 value.\\\");\\n\\n        (uint256 itemOffset, uint256 itemLength, RLPItemType itemType) = _decodeLength(_in);\\n\\n        require(itemType == RLPItemType.DATA_ITEM, \\\"Invalid RLP bytes32 value.\\\");\\n\\n        uint256 ptr = _in.ptr + itemOffset;\\n        bytes32 out;\\n        assembly {\\n            out := mload(ptr)\\n\\n            // Shift the bytes over to match the item size.\\n            if lt(itemLength, 32) {\\n                out := div(out, exp(256, sub(32, itemLength)))\\n            }\\n        }\\n\\n        return out;\\n    }\\n\\n    /**\\n     * Reads an RLP bytes32 value into a bytes32.\\n     * @param _in RLP bytes32 value.\\n     * @return Decoded bytes32.\\n     */\\n    function readBytes32(bytes memory _in) internal pure returns (bytes32) {\\n        return readBytes32(toRLPItem(_in));\\n    }\\n\\n    /**\\n     * Reads an RLP uint256 value into a uint256.\\n     * @param _in RLP uint256 value.\\n     * @return Decoded uint256.\\n     */\\n    function readUint256(RLPItem memory _in) internal pure returns (uint256) {\\n        return uint256(readBytes32(_in));\\n    }\\n\\n    /**\\n     * Reads an RLP uint256 value into a uint256.\\n     * @param _in RLP uint256 value.\\n     * @return Decoded uint256.\\n     */\\n    function readUint256(bytes memory _in) internal pure returns (uint256) {\\n        return readUint256(toRLPItem(_in));\\n    }\\n\\n    /**\\n     * Reads an RLP bool value into a bool.\\n     * @param _in RLP bool value.\\n     * @return Decoded bool.\\n     */\\n    function readBool(RLPItem memory _in) internal pure returns (bool) {\\n        require(_in.length == 1, \\\"Invalid RLP boolean value.\\\");\\n\\n        uint256 ptr = _in.ptr;\\n        uint256 out;\\n        assembly {\\n            out := byte(0, mload(ptr))\\n        }\\n\\n        require(out == 0 || out == 1, \\\"Lib_RLPReader: Invalid RLP boolean value, must be 0 or 1\\\");\\n\\n        return out != 0;\\n    }\\n\\n    /**\\n     * Reads an RLP bool value into a bool.\\n     * @param _in RLP bool value.\\n     * @return Decoded bool.\\n     */\\n    function readBool(bytes memory _in) internal pure returns (bool) {\\n        return readBool(toRLPItem(_in));\\n    }\\n\\n    /**\\n     * Reads an RLP address value into a address.\\n     * @param _in RLP address value.\\n     * @return Decoded address.\\n     */\\n    function readAddress(RLPItem memory _in) internal pure returns (address) {\\n        if (_in.length == 1) {\\n            return address(0);\\n        }\\n\\n        require(_in.length == 21, \\\"Invalid RLP address value.\\\");\\n\\n        return address(uint160(readUint256(_in)));\\n    }\\n\\n    /**\\n     * Reads an RLP address value into a address.\\n     * @param _in RLP address value.\\n     * @return Decoded address.\\n     */\\n    function readAddress(bytes memory _in) internal pure returns (address) {\\n        return readAddress(toRLPItem(_in));\\n    }\\n\\n    /**\\n     * Reads the raw bytes of an RLP item.\\n     * @param _in RLP item to read.\\n     * @return Raw RLP bytes.\\n     */\\n    function readRawBytes(RLPItem memory _in) internal pure returns (bytes memory) {\\n        return _copy(_in);\\n    }\\n\\n    /*********************\\n     * Private Functions *\\n     *********************/\\n\\n    /**\\n     * Decodes the length of an RLP item.\\n     * @param _in RLP item to decode.\\n     * @return Offset of the encoded data.\\n     * @return Length of the encoded data.\\n     * @return RLP item type (LIST_ITEM or DATA_ITEM).\\n     */\\n    function _decodeLength(RLPItem memory _in)\\n        private\\n        pure\\n        returns (\\n            uint256,\\n            uint256,\\n            RLPItemType\\n        )\\n    {\\n        require(_in.length > 0, \\\"RLP item cannot be null.\\\");\\n\\n        uint256 ptr = _in.ptr;\\n        uint256 prefix;\\n        assembly {\\n            prefix := byte(0, mload(ptr))\\n        }\\n\\n        if (prefix <= 0x7f) {\\n            // Single byte.\\n\\n            return (0, 1, RLPItemType.DATA_ITEM);\\n        } else if (prefix <= 0xb7) {\\n            // Short string.\\n\\n            uint256 strLen = prefix - 0x80;\\n\\n            require(_in.length > strLen, \\\"Invalid RLP short string.\\\");\\n\\n            return (1, strLen, RLPItemType.DATA_ITEM);\\n        } else if (prefix <= 0xbf) {\\n            // Long string.\\n            uint256 lenOfStrLen = prefix - 0xb7;\\n\\n            require(_in.length > lenOfStrLen, \\\"Invalid RLP long string length.\\\");\\n\\n            uint256 strLen;\\n            assembly {\\n                // Pick out the string length.\\n                strLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfStrLen)))\\n            }\\n\\n            require(_in.length > lenOfStrLen + strLen, \\\"Invalid RLP long string.\\\");\\n\\n            return (1 + lenOfStrLen, strLen, RLPItemType.DATA_ITEM);\\n        } else if (prefix <= 0xf7) {\\n            // Short list.\\n            uint256 listLen = prefix - 0xc0;\\n\\n            require(_in.length > listLen, \\\"Invalid RLP short list.\\\");\\n\\n            return (1, listLen, RLPItemType.LIST_ITEM);\\n        } else {\\n            // Long list.\\n            uint256 lenOfListLen = prefix - 0xf7;\\n\\n            require(_in.length > lenOfListLen, \\\"Invalid RLP long list length.\\\");\\n\\n            uint256 listLen;\\n            assembly {\\n                // Pick out the list length.\\n                listLen := div(mload(add(ptr, 1)), exp(256, sub(32, lenOfListLen)))\\n            }\\n\\n            require(_in.length > lenOfListLen + listLen, \\\"Invalid RLP long list.\\\");\\n\\n            return (1 + lenOfListLen, listLen, RLPItemType.LIST_ITEM);\\n        }\\n    }\\n\\n    /**\\n     * Copies the bytes from a memory location.\\n     * @param _src Pointer to the location to read from.\\n     * @param _offset Offset to start reading from.\\n     * @param _length Number of bytes to read.\\n     * @return Copied bytes.\\n     */\\n    function _copy(\\n        uint256 _src,\\n        uint256 _offset,\\n        uint256 _length\\n    ) private pure returns (bytes memory) {\\n        bytes memory out = new bytes(_length);\\n        if (out.length == 0) {\\n            return out;\\n        }\\n\\n        uint256 src = _src + _offset;\\n        uint256 dest;\\n        assembly {\\n            dest := add(out, 32)\\n        }\\n\\n        // Copy over as many complete words as we can.\\n        for (uint256 i = 0; i < _length / 32; i++) {\\n            assembly {\\n                mstore(dest, mload(src))\\n            }\\n\\n            src += 32;\\n            dest += 32;\\n        }\\n\\n        // Pick out the remaining bytes.\\n        uint256 mask;\\n        unchecked {\\n            mask = 256**(32 - (_length % 32)) - 1;\\n        }\\n\\n        assembly {\\n            mstore(dest, or(and(mload(src), not(mask)), and(mload(dest), mask)))\\n        }\\n        return out;\\n    }\\n\\n    /**\\n     * Copies an RLP item into bytes.\\n     * @param _in RLP item to copy.\\n     * @return Copied bytes.\\n     */\\n    function _copy(RLPItem memory _in) private pure returns (bytes memory) {\\n        return _copy(_in.ptr, 0, _in.length);\\n    }\\n}\\n\",\"keccak256\":\"0xde4a27577a23b2b11b21e8af3e1a0df50b0b27f08864795f7a84b1e3c230da33\",\"license\":\"MIT\"},\"contracts/libraries/utils/Lib_MerkleTree.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Lib_MerkleTree\\n * @author River Keefer\\n */\\nlibrary Lib_MerkleTree {\\n    /**********************\\n     * Internal Functions *\\n     **********************/\\n\\n    /**\\n     * Calculates a merkle root for a list of 32-byte leaf hashes.  WARNING: If the number\\n     * of leaves passed in is not a power of two, it pads out the tree with zero hashes.\\n     * If you do not know the original length of elements for the tree you are verifying, then\\n     * this may allow empty leaves past _elements.length to pass a verification check down the line.\\n     * Note that the _elements argument is modified, therefore it must not be used again afterwards\\n     * @param _elements Array of hashes from which to generate a merkle root.\\n     * @return Merkle root of the leaves, with zero hashes for non-powers-of-two (see above).\\n     */\\n    function getMerkleRoot(bytes32[] memory _elements) internal pure returns (bytes32) {\\n        require(_elements.length > 0, \\\"Lib_MerkleTree: Must provide at least one leaf hash.\\\");\\n\\n        if (_elements.length == 1) {\\n            return _elements[0];\\n        }\\n\\n        uint256[16] memory defaults = [\\n            0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563,\\n            0x633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d,\\n            0x890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d,\\n            0x3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd8,\\n            0xecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da,\\n            0xdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da5,\\n            0x617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d7,\\n            0x292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead,\\n            0xe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e10,\\n            0x7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f82,\\n            0xe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e83636516,\\n            0x3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c,\\n            0xad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e,\\n            0xa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab,\\n            0x4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c862,\\n            0x2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf10\\n        ];\\n\\n        // Reserve memory space for our hashes.\\n        bytes memory buf = new bytes(64);\\n\\n        // We'll need to keep track of left and right siblings.\\n        bytes32 leftSibling;\\n        bytes32 rightSibling;\\n\\n        // Number of non-empty nodes at the current depth.\\n        uint256 rowSize = _elements.length;\\n\\n        // Current depth, counting from 0 at the leaves\\n        uint256 depth = 0;\\n\\n        // Common sub-expressions\\n        uint256 halfRowSize; // rowSize / 2\\n        bool rowSizeIsOdd; // rowSize % 2 == 1\\n\\n        while (rowSize > 1) {\\n            halfRowSize = rowSize / 2;\\n            rowSizeIsOdd = rowSize % 2 == 1;\\n\\n            for (uint256 i = 0; i < halfRowSize; i++) {\\n                leftSibling = _elements[(2 * i)];\\n                rightSibling = _elements[(2 * i) + 1];\\n                assembly {\\n                    mstore(add(buf, 32), leftSibling)\\n                    mstore(add(buf, 64), rightSibling)\\n                }\\n\\n                _elements[i] = keccak256(buf);\\n            }\\n\\n            if (rowSizeIsOdd) {\\n                leftSibling = _elements[rowSize - 1];\\n                rightSibling = bytes32(defaults[depth]);\\n                assembly {\\n                    mstore(add(buf, 32), leftSibling)\\n                    mstore(add(buf, 64), rightSibling)\\n                }\\n\\n                _elements[halfRowSize] = keccak256(buf);\\n            }\\n\\n            rowSize = halfRowSize + (rowSizeIsOdd ? 1 : 0);\\n            depth++;\\n        }\\n\\n        return _elements[0];\\n    }\\n\\n    /**\\n     * Verifies a merkle branch for the given leaf hash.  Assumes the original length\\n     * of leaves generated is a known, correct input, and does not return true for indices\\n     * extending past that index (even if _siblings would be otherwise valid.)\\n     * @param _root The Merkle root to verify against.\\n     * @param _leaf The leaf hash to verify inclusion of.\\n     * @param _index The index in the tree of this leaf.\\n     * @param _siblings Array of sibline nodes in the inclusion proof, starting from depth 0\\n     * (bottom of the tree).\\n     * @param _totalLeaves The total number of leaves originally passed into.\\n     * @return Whether or not the merkle branch and leaf passes verification.\\n     */\\n    function verify(\\n        bytes32 _root,\\n        bytes32 _leaf,\\n        uint256 _index,\\n        bytes32[] memory _siblings,\\n        uint256 _totalLeaves\\n    ) internal pure returns (bool) {\\n        require(_totalLeaves > 0, \\\"Lib_MerkleTree: Total leaves must be greater than zero.\\\");\\n\\n        require(_index < _totalLeaves, \\\"Lib_MerkleTree: Index out of bounds.\\\");\\n\\n        require(\\n            _siblings.length == _ceilLog2(_totalLeaves),\\n            \\\"Lib_MerkleTree: Total siblings does not correctly correspond to total leaves.\\\"\\n        );\\n\\n        bytes32 computedRoot = _leaf;\\n\\n        for (uint256 i = 0; i < _siblings.length; i++) {\\n            if ((_index & 1) == 1) {\\n                computedRoot = keccak256(abi.encodePacked(_siblings[i], computedRoot));\\n            } else {\\n                computedRoot = keccak256(abi.encodePacked(computedRoot, _siblings[i]));\\n            }\\n\\n            _index >>= 1;\\n        }\\n\\n        return _root == computedRoot;\\n    }\\n\\n    /*********************\\n     * Private Functions *\\n     *********************/\\n\\n    /**\\n     * Calculates the integer ceiling of the log base 2 of an input.\\n     * @param _in Unsigned input to calculate the log.\\n     * @return ceil(log_base_2(_in))\\n     */\\n    function _ceilLog2(uint256 _in) private pure returns (uint256) {\\n        require(_in > 0, \\\"Lib_MerkleTree: Cannot compute ceil(log_2) of 0.\\\");\\n\\n        if (_in == 1) {\\n            return 0;\\n        }\\n\\n        // Find the highest set bit (will be floor(log_2)).\\n        // Borrowed with <3 from https://github.com/ethereum/solidity-examples\\n        uint256 val = _in;\\n        uint256 highest = 0;\\n        for (uint256 i = 128; i >= 1; i >>= 1) {\\n            if (val & (((uint256(1) << i) - 1) << i) != 0) {\\n                highest += i;\\n                val >>= i;\\n            }\\n        }\\n\\n        // Increment by one if this is not a perfect logarithm.\\n        if ((uint256(1) << highest) != _in) {\\n            highest += 1;\\n        }\\n\\n        return highest;\\n    }\\n}\\n\",\"keccak256\":\"0x84351e7b8be5007b77a67c1e3f34f46ed0c1ddc67e4e76797fd06f01ca9325aa\",\"license\":\"MIT\"}},\"version\":1}",
  "bytecode": "0x608060405262015180600e556002601355600460145534801561002157600080fd5b50600080546001600160a01b03191690556150d8806100416000396000f3fe608060405234801561001057600080fd5b50600436106102415760003560e01c80636f9170f611610145578063b4b6de38116100bd578063e59745541161008c578063ef53b04111610071578063ef53b0411461056c578063fca0fd6c1461057f578063ffa444ec1461058857600080fd5b8063e597455414610529578063eab0fca31461053c57600080fd5b8063b4b6de38146104f2578063b646c02514610505578063b9c362091461050e578063dcd836161461052157600080fd5b8063939f59fe1161011457806398fe9dfb116100f957806398fe9dfb146104a95780639b19251a146104bc578063ac1eff68146104df57600080fd5b8063939f59fe14610473578063966df42b1461048657600080fd5b80636f9170f6146104035780638c80fd90146104265780638d14e127146104395780638f1d37761461044c57600080fd5b8063461a4478116101d857806353dec0e8116101a75780635cc38c021161018c5780635cc38c02146103945780636593363f146103b4578063669fdeb5146103c757600080fd5b806353dec0e81461036e5780635bf0f25d1461038157600080fd5b8063461a4478146103375780634869bfb61461034a5780634d4127af1461035d5780634e71d92d1461036657600080fd5b80632e1a7d4d116102145780632e1a7d4d146102d1578063375b3c0a146102e6578063383e5e69146102ef57806340a89eae1461030257600080fd5b8063015cfec7146102465780630700037d1461026f57806315b90cb21461029d578063299ca478146102a6575b600080fd5b6102596102543660046143fb565b6105a8565b60405161026691906144b4565b60405180910390f35b61028f61027d3660046144dc565b60066020526000908152604090205481565b604051908152602001610266565b61028f60115481565b6000546102b9906001600160a01b031681565b6040516001600160a01b039091168152602001610266565b6102e46102df3660046144f9565b6106c6565b005b61028f60105481565b6102e46102fd3660046144dc565b6108bc565b6103256103103660046144dc565b60076020526000908152604090205460ff1681565b60405160ff9091168152602001610266565b6102b961034536600461459e565b610af4565b61028f6103583660046145ef565b610b85565b61028f60125481565b6102e4610bca565b6102e461037c3660046144f9565b610d55565b6102e461038f3660046144f9565b610f46565b61028f6103a23660046144f9565b60096020526000908152604090205481565b6102e46103c2366004614664565b611296565b6102596040518060400160405280600d81526020017f4d455449535f4d414e414745520000000000000000000000000000000000000081525081565b6104166104113660046144dc565b611873565b6040519015158152602001610266565b6102e46104343660046144f9565b6118a2565b6102e46104473660046146be565b611b24565b61045f61045a3660046144f9565b611c1d565b6040516102669897969594939291906146f7565b6102e461048136600461478d565b611d52565b6103256104943660046144dc565b60086020526000908152604090205460ff1681565b6102596104b7366004614827565b611f87565b6104166104ca3660046144dc565b600a6020526000908152604090205460ff1681565b6102b96104ed3660046144f9565b61204e565b6102e461050036600461488b565b612078565b61028f600f5481565b6102e461051c366004614931565b612672565b6102e4612741565b6001546102b9906001600160a01b031681565b61041661054a3660046144dc565b6010546001600160a01b03909116600090815260026020526040902054101590565b6102e461057a3660046144f9565b612811565b61028f600e5481565b61028f6105963660046144dc565b60026020526000908152604090205481565b6060600085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525093945083925050505b82518110156106ba578482036105fc57600091505b61065983828151811061061157610611614953565b01602001517fff000000000000000000000000000000000000000000000000000000000000001687878581811061064a5761064a614953565b919091013560f81c90506128da565b83828151811061066b5761066b614953565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350816106a48161497f565b92505080806106b29061497f565b9150506105e7565b50909695505050505050565b600f541561071b5760405162461bcd60e51b815260206004820181905260248201527f77697468647261772069732063757272656e746c792070726f6869626974656460448201526064015b60405180910390fd5b336000908152600260205260409020548181101561077b5760405162461bcd60e51b815260206004820152601e60248201527f696e73756666696369656e74207374616b6520746f20776974686472617700006044820152606401610712565b6010546107888383614999565b10801561079757506010548110155b156107ba57601280549060006107ac836149b0565b91905055506107ba33612916565b33600090815260026020526040812080548492906107d9908490614999565b90915550506001546040517fa9059cbb000000000000000000000000000000000000000000000000000000008152336004820152602481018490526001600160a01b039091169063a9059cbb906044016020604051808303816000875af1158015610848573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061086c91906149c7565b6108b85760405162461bcd60e51b815260206004820152601560248201527f746f6b656e207472616e73666572206661696c656400000000000000000000006044820152606401610712565b5050565b6108fa6040518060400160405280600d81526020017f4d455449535f4d414e4147455200000000000000000000000000000000000000815250610af4565b6001600160a01b0316336001600160a01b0316146109805760405162461bcd60e51b815260206004820152603f60248201527f4d564d5f56657269666965723a2046756e6374696f6e2063616e206f6e6c792060448201527f62652063616c6c656420627920746865204d455449535f4d414e414745522e006064820152608401610712565b6000601154116109d25760405162461bcd60e51b815260206004820152600860248201527f6e6f207374616b650000000000000000000000000000000000000000000000006044820152606401610712565b6011546040805133815260208101929092527f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364910160405180910390a16011805460009091556001546040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b038481166004830152602482018490529091169063a9059cbb906044016020604051808303816000875af1158015610a84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aa891906149c7565b6108b85760405162461bcd60e51b815260206004820152601560248201527f7472616e73666572206d65746973206661696c656400000000000000000000006044820152606401610712565b600080546040517fbf40fac10000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063bf40fac190610b3e9085906004016144b4565b602060405180830381865afa158015610b5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7f91906149e4565b92915050565b6000610bc3838380806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612a7192505050565b9392505050565b33600090815260066020526040902054610c265760405162461bcd60e51b815260206004820152601260248201527f6e6f2072657761726420746f20636c61696d00000000000000000000000000006044820152606401610712565b33600081815260066020526040808220805492905560015490517fa9059cbb00000000000000000000000000000000000000000000000000000000815260048101939093526024830182905290916001600160a01b039091169063a9059cbb906044016020604051808303816000875af1158015610ca8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ccc91906149c7565b610d185760405162461bcd60e51b815260206004820152601560248201527f746f6b656e207472616e73666572206661696c656400000000000000000000006044820152606401610712565b60408051338152602081018390527f47cee97cb7acd717b3c0aa1435d004cd5b3c8c57d70dbceb4e4458bbd60e39d491015b60405180910390a150565b610d936040518060400160405280600d81526020017f4d455449535f4d414e4147455200000000000000000000000000000000000000815250610af4565b6001600160a01b0316336001600160a01b031614610e195760405162461bcd60e51b815260206004820152603f60248201527f4d564d5f56657269666965723a2046756e6374696f6e2063616e206f6e6c792060448201527f62652063616c6c656420627920746865204d455449535f4d414e414745522e006064820152608401610712565b6001546040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018390526001600160a01b03909116906323b872dd906064016020604051808303816000875af1158015610e89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ead91906149c7565b610ef95760405162461bcd60e51b815260206004820152601560248201527f7472616e73666572206d65746973206661696c656400000000000000000000006044820152606401610712565b8060116000828254610f0b9190614a01565b909155505060408051338152602081018390527febedb8b3c678666e7f36970bc8f57abf6d8fa2e828c0da91ea5b75bf68ed101a9101610d4a565b610f4f33611873565b610fc15760405162461bcd60e51b815260206004820152602360248201527f6f6e6c792077686974656c6973746564207665726966696572732063616e206360448201527f616c6c00000000000000000000000000000000000000000000000000000000006064820152608401610712565b600f54156110115760405162461bcd60e51b815260206004820152601d60248201527f7374616b652069732063757272656e746c792070726f686962697465640000006044820152606401610712565b600081116110615760405162461bcd60e51b815260206004820152601660248201527f7a65726f207374616b65206e6f7420616c6c6f776564000000000000000000006044820152606401610712565b6001546040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018390526001600160a01b03909116906323b872dd906064016020604051808303816000875af11580156110d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110f591906149c7565b6111415760405162461bcd60e51b815260206004820152601560248201527f7472616e73666572206d65746973206661696c656400000000000000000000006044820152606401610712565b3360009081526002602052604081208054918391906111608385614a01565b90915550506010543360009081526002602052604090205410156111ec5760405162461bcd60e51b815260206004820152602b60248201527f696e73756666696369656e74207374616b6520746f207175616c69667920617360448201527f20612076657269666965720000000000000000000000000000000000000000006064820152608401610712565b8060000361125957601280549060006112048361497f565b9091555050600c80546001810182556000919091527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c701805473ffffffffffffffffffffffffffffffffffffffff1916331790555b60408051338152602081018490527febedb8b3c678666e7f36970bc8f57abf6d8fa2e828c0da91ea5b75bf68ed101a910160405180910390a15050565b6010543360009081526002602052604090205410156112f75760405162461bcd60e51b815260206004820152601260248201527f696e73756666696369656e74207374616b6500000000000000000000000000006044820152606401610712565b61130033611873565b6113725760405162461bcd60e51b815260206004820152602360248201527f6f6e6c792077686974656c6973746564207665726966696572732063616e206360448201527f616c6c00000000000000000000000000000000000000000000000000000000006064820152608401610712565b601254600d848154811061138857611388614953565b90600052602060002090600d0201600a015414806113d65750600e54600d84815481106113b7576113b7614953565b90600052602060002090600d020160080154426113d49190614999565b115b6114225760405162461bcd60e51b815260206004820152601160248201527f70686173652032206e6f742072656164790000000000000000000000000000006044820152606401610712565b60008381526005602090815260408083203384529091528120805461144690614a19565b9050116114bb5760405162461bcd60e51b815260206004820152602160248201527f796f75206469646e277420706172746963697061746520696e2070686173652060448201527f31000000000000000000000000000000000000000000000000000000000000006064820152608401610712565b6000838152600360209081526040808320338452909152812080546114df90614a19565b905011156114f5576114f083612f54565b505050565b6000838152600460209081526040808320338452909152902061151790614a53565b60028383604051611529929190614a94565b602060405180830381855afa158015611546573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906115699190614aa4565b146115b65760405162461bcd60e51b815260206004820152601b60248201527f6b657920616e64206b65796861736820646f6e2774206d6174636800000000006044820152606401610712565b600d83815481106115c9576115c9614953565b60009182526020909120600d90910201546001600160a01b0316330361169b5761166a600d84815481106115ff576115ff614953565b90600052602060002090600d02016003016001015460405160200161162691815260200190565b60408051601f198184030181526020601f860181900481028401810190925284835291908590859081908401838280828437600092019190915250611f8792505050565b61167390614abd565b600d848154811061168657611686614953565b600091825260209091206004600d9092020101555b600083815260036020908152604080832033845290915290206116bf828483614b2f565b506000838152600560209081526040808320338452909152902080546117a391906116e990614a19565b80601f016020809104026020016040519081016040528092919081815260200182805461171590614a19565b80156117625780601f1061173757610100808354040283529160200191611762565b820191906000526020600020905b81548152906001019060200180831161174557829003601f168201915b505050505083838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611f8792505050565b60008481526005602090815260408083203384529091529020906117c79082614bef565b50600d83815481106117db576117db614953565b60009182526020808320600b600d90930201919091018054600181018255908352912001805473ffffffffffffffffffffffffffffffffffffffff1916339081179091556040517fcd699b485caf6a8424399921287eff9b6648355e67560923d33b3f9d8551726391611862918691909182526001600160a01b0316602082015260400190565b60405180910390a16114f083612f54565b600b5460009060ff161580610b7f5750506001600160a01b03166000908152600a602052604090205460ff1690565b6118e06040518060400160405280600d81526020017f4d455449535f4d414e4147455200000000000000000000000000000000000000815250610af4565b6001600160a01b0316336001600160a01b0316146119665760405162461bcd60e51b815260206004820152603f60248201527f4d564d5f56657269666965723a2046756e6374696f6e2063616e206f6e6c792060448201527f62652063616c6c656420627920746865204d455449535f4d414e414745522e006064820152608401610712565b6010819055600c5460009015611b1e57600c5460009067ffffffffffffffff81111561199457611994614512565b6040519080825280602002602001820160405280156119bd578160200160208202803683370190505b50905060005b600c54811015611a8a5760105460026000600c84815481106119e7576119e7614953565b60009182526020808320909101546001600160a01b0316835282019290925260400190205410611a7a57600c8181548110611a2457611a24614953565b9060005260206000200160009054906101000a90046001600160a01b0316828481518110611a5457611a54614953565b6001600160a01b039092166020928302919091019091015282611a768161497f565b9350505b611a838161497f565b90506119c3565b50600c54821015611b1c57611aa1600c6000614280565b60005b82811015611b1a57600c828281518110611ac057611ac0614953565b602090810291909101810151825460018101845560009384529190922001805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0390921691909117905580611b128161497f565b915050611aa4565b505b505b60125550565b611b626040518060400160405280600d81526020017f4d455449535f4d414e4147455200000000000000000000000000000000000000815250610af4565b6001600160a01b0316336001600160a01b031614611be85760405162461bcd60e51b815260206004820152603f60248201527f4d564d5f56657269666965723a2046756e6374696f6e2063616e206f6e6c792060448201527f62652063616c6c656420627920746865204d455449535f4d414e414745522e006064820152608401610712565b6001600160a01b039091166000908152600a60205260409020805491151560ff19928316179055600b80549091166001179055565b600d8181548110611c2d57600080fd5b90600052602060002090600d02016000915090508060000160009054906101000a90046001600160a01b031690806001015490806002015490806003016040518060a001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482018054611cad90614a19565b80601f0160208091040260200160405190810160405280929190818152602001828054611cd990614a19565b8015611d265780601f10611cfb57610100808354040283529160200191611d26565b820191906000526020600020905b815481529060010190602001808311611d0957829003601f168201915b5050509190925250505060088201546009830154600a840154600c909401549293919290919060ff1688565b611d5b33611873565b611dcd5760405162461bcd60e51b815260206004820152602360248201527f6f6e6c792077686974656c6973746564207665726966696572732063616e206360448201527f616c6c00000000000000000000000000000000000000000000000000000000006064820152608401610712565b601054336000908152600260205260409020541015611e2e5760405162461bcd60e51b815260206004820152601260248201527f696e73756666696369656e74207374616b6500000000000000000000000000006044820152606401610712565b600085815260056020908152604080832033845290915290208054611e5290614a19565b159050611ec75760405162461bcd60e51b815260206004820152602860248201527f7665726966793120616c726561647920636f6d706c6574656420666f7220746860448201527f652073656e6465720000000000000000000000000000000000000000000000006064820152608401610712565b60008581526005602090815260408083203384529091529020611eeb848683614b2f565b5060008581526004602090815260408083203384529091529020611f10828483614b2f565b50600d8581548110611f2457611f24614953565b600091825260208220600a600d9092020101805491611f428361497f565b9091555050604080518681523360208201527f6f8abfaae8c5cb428b362c84259e542ab1f6424d0717b3495b02c4126e92943291015b60405180910390a15050505050565b6060826000805b82518110156120445784518203611fa457600091505b611fe3838281518110611fb957611fb9614953565b602001015160f81c60f81b868481518110611fd657611fd6614953565b016020015160f81c613e7d565b838281518110611ff557611ff5614953565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508161202e8161497f565b925050808061203c9061497f565b915050611f8e565b5090949350505050565b600c818154811061205e57600080fd5b6000918252602090912001546001600160a01b0316905081565b61208133611873565b6120f35760405162461bcd60e51b815260206004820152602360248201527f6f6e6c792077686974656c6973746564207665726966696572732063616e206360448201527f616c6c00000000000000000000000000000000000000000000000000000000006064820152608401610712565b6010543360009081526002602052604090205410156121545760405162461bcd60e51b815260206004820152601260248201527f696e73756666696369656e74207374616b6500000000000000000000000000006044820152606401610712565b60008681526009602052604081205461216f90600190614999565b90508015806121b95750600e54612187906002614caf565b600d828154811061219a5761219a614953565b90600052602060002090600d020160080154426121b79190614999565b115b6122055760405162461bcd60e51b815260206004820152601d60248201527f746865726520697320616e206f6e676f696e67206368616c6c656e67650000006044820152606401610712565b80156122145761221481612f54565b60006122546040518060400160405280601481526020017f5374617465436f6d6d69746d656e74436861696e000000000000000000000000815250610af4565b6040517f9418bddd0000000000000000000000000000000000000000000000000000000081529091506001600160a01b03821690639418bddd9061229c908a90600401614d9c565b602060405180830381865afa1580156122b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122dd91906149c7565b61234f5760405162461bcd60e51b815260206004820152602e60248201527f746865206261746368206973206f757473696465206f6620746865206672617560448201527f642070726f6f662077696e646f770000000000000000000000000000000000006064820152608401610712565b6123576142a1565b6020810189905233815242608082015261237088614daf565b6060808301918252600d80546001810182556000829052845191027fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb5810180546001600160a01b0390931673ffffffffffffffffffffffffffffffffffffffff199093169290921782556020808601517fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb68301556040808701517fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb7840155945180517fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb88401908155918101517fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb9840155948501517fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eba830155928401517fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1ebb820155608084015185949293917fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1ebc01906125079082614bef565b5050506080820151600882015560a0820151600982015560c0820151600a82015560e0820151805161254391600b84019160209091019061432b565b506101009190910151600c909101805460ff1916911515919091179055600d5460009061257290600190614999565b60008181526005602090815260408083203384529091529020909150612599888a83614b2f565b50600081815260046020908152604080832033845290915290206125be868883614b2f565b50600d81815481106125d2576125d2614953565b600091825260208220600a600d90920201018054916125f08361497f565b9091555050600f80549060006126058361497f565b909155506126169050816001614a01565b60008b8152600960205260409081902091909155517f441214906ecb1ed44d085cb85ab8071c4734e7b4975b38397b9a5df89dec72689061265e9083908d908d904290614e38565b60405180910390a150505050505050505050565b6126b06040518060400160405280600d81526020017f4d455449535f4d414e4147455200000000000000000000000000000000000000815250610af4565b6001600160a01b0316336001600160a01b0316146127365760405162461bcd60e51b815260206004820152603f60248201527f4d564d5f56657269666965723a2046756e6374696f6e2063616e206f6e6c792060448201527f62652063616c6c656420627920746865204d455449535f4d414e414745522e006064820152608401610712565b601491909155601355565b61277f6040518060400160405280600d81526020017f4d455449535f4d414e4147455200000000000000000000000000000000000000815250610af4565b6001600160a01b0316336001600160a01b0316146128055760405162461bcd60e51b815260206004820152603f60248201527f4d564d5f56657269666965723a2046756e6374696f6e2063616e206f6e6c792060448201527f62652063616c6c656420627920746865204d455449535f4d414e414745522e006064820152608401610712565b600b805460ff19169055565b61284f6040518060400160405280600d81526020017f4d455449535f4d414e4147455200000000000000000000000000000000000000815250610af4565b6001600160a01b0316336001600160a01b0316146128d55760405162461bcd60e51b815260206004820152603f60248201527f4d564d5f56657269666965723a2046756e6374696f6e2063616e206f6e6c792060448201527f62652063616c6c656420627920746865204d455449535f4d414e414745522e006064820152608401610712565b600e55565b600060f883901c6128ee60ff841682614e68565b905060ff8161ffff16111561290c5761290961010082614e8e565b90505b60f81b9392505050565b60008060005b600c5481101561297b57836001600160a01b0316600c828154811061294357612943614953565b6000918252602090912001546001600160a01b031603612969576001925080915061297b565b806129738161497f565b91505061291c565b5081156114f057805b600c5461299390600190614999565b811015612a2b57600c6129a7826001614a01565b815481106129b7576129b7614953565b600091825260209091200154600c80546001600160a01b0390921691839081106129e3576129e3614953565b6000918252602090912001805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039290921691909117905580612a238161497f565b915050612984565b50600c805480612a3d57612a3d614eb1565b6000828152602090208101600019908101805473ffffffffffffffffffffffffffffffffffffffff19169055019055505050565b600080825111612ae95760405162461bcd60e51b815260206004820152603460248201527f4c69625f4d65726b6c65547265653a204d7573742070726f766964652061742060448201527f6c65617374206f6e65206c65616620686173682e0000000000000000000000006064820152608401610712565b8151600103612b145781600081518110612b0557612b05614953565b60200260200101519050919050565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b6001841115612f2a57612dc5600285614edd565b9150612dd2600285614ef1565b600114905060005b82811015612e7e578a612dee826002614caf565b81518110612dfe57612dfe614953565b602002602001015196508a816002612e169190614caf565b612e21906001614a01565b81518110612e3157612e31614953565b6020026020010151955086602089015285604089015287805190602001208b8281518110612e6157612e61614953565b602090810291909101015280612e768161497f565b915050612dda565b508015612efa5789612e91600186614999565b81518110612ea157612ea1614953565b60200260200101519550878360108110612ebd57612ebd614953565b602002015160001b945085602088015284604088015286805190602001208a8381518110612eed57612eed614953565b6020026020010181815250505b80612f06576000612f09565b60015b612f169060ff1683614a01565b935082612f228161497f565b935050612db1565b89600081518110612f3d57612f3d614953565b602002602001015198505050505050505050919050565b6000600d8281548110612f6957612f69614953565b60009182526020909120600d90910201600c81015490915060ff1615612fd15760405162461bcd60e51b815260206004820152601360248201527f6368616c6c656e676520697320636c6f736564000000000000000000000000006044820152606401610712565b600a810154600b820154148015906130035750600e54612ff2906002614caf565b60088201546130019042614999565b105b1561300c575050565b600061304c6040518060400160405280601481526020017f5374617465436f6d6d69746d656e74436861696e000000000000000000000000815250610af4565b600084815260056020908152604080832086546001600160a01b0316845290915281209192509061307c90614a53565b905060008084600b018054905067ffffffffffffffff8111156130a1576130a1614512565b6040519080825280602002602001820160405280156130ca578160200160208202803683370190505b50905060008086600b018054905067ffffffffffffffff8111156130f0576130f0614512565b604051908082528060200260200182016040528015613119578160200160208202803683370190505b50905060008088600b018054905067ffffffffffffffff81111561313f5761313f614512565b604051908082528060200260200182016040528015613168578160200160208202803683370190505b5090506000805b600c54811015613666576131c6600c828154811061318f5761318f614953565b6000918252602090912001546001600160a01b03166010546001600160a01b03909116600090815260026020526040902054101590565b15806131ff57506131fd600c82815481106131e3576131e3614953565b6000918252602090912001546001600160a01b0316611873565b155b6136545760008c8152600560205260408120600c80548c9391908590811061322957613229614953565b60009182526020808320909101546001600160a01b03168352820192909252604001902061325690614a53565b0361337857600060076000600c848154811061327457613274614953565b60009182526020808320909101546001600160a01b0316835282019290925260400190205460ff16111561330b57600160076000600c84815481106132bb576132bb614953565b60009182526020808320909101546001600160a01b03168352820192909252604001812080549091906132f290849060ff16614f05565b92506101000a81548160ff021916908360ff1602179055505b600c818154811061331e5761331e614953565b9060005260206000200160009054906101000a90046001600160a01b031687878151811061334e5761334e614953565b6001600160a01b0390921660209283029190910190910152856133708161497f565b965050613654565b60008c8152600360205260408120600c80549192918490811061339d5761339d614953565b60009182526020808320909101546001600160a01b03168352820192909252604001902080546133cc90614a19565b905060000361353b57600260076000600c84815481106133ee576133ee614953565b60009182526020808320909101546001600160a01b031683528201929092526040018120805490919061342590849060ff16614f28565b92506101000a81548160ff021916908360ff16021790555060145460076000600c848154811061345757613457614953565b60009182526020808320909101546001600160a01b0316835282019290925260400190205460ff1611156135365760026000600c838154811061349c5761349c614953565b60009182526020808320909101546001600160a01b031683528201929092526040019020546134cb9089614a01565b9750600c81815481106134e0576134e0614953565b9060005260206000200160009054906101000a90046001600160a01b031683838151811061351057613510614953565b6001600160a01b0390921660209283029190910190910152816135328161497f565b9250505b613654565b600060076000600c848154811061355457613554614953565b60009182526020808320909101546001600160a01b0316835282019290925260400190205460ff1611156135eb57600160076000600c848154811061359b5761359b614953565b60009182526020808320909101546001600160a01b03168352820192909252604001812080549091906135d290849060ff16614f05565b92506101000a81548160ff021916908360ff1602179055505b600c81815481106135fe576135fe614953565b9060005260206000200160009054906101000a90046001600160a01b031685858151811061362e5761362e614953565b6001600160a01b0390921660209283029190910190910152836136508161497f565b9450505b8061365e8161497f565b91505061316f565b5060005b818110156136a75761369483828151811061368757613687614953565b6020026020010151613eb2565b508061369f8161497f565b91505061366a565b50886001600160a01b031663cfdf677e6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156136e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061370a91906149e4565b60018b015460038c01546040517f67d18b9b000000000000000000000000000000000000000000000000000000008152600481019290925260248201526001600160a01b0391909116906367d18b9b90604401602060405180830381865afa15801561377a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061379e9190614aa4565b61386f8b6003016040518060a0016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820180546137e890614a19565b80601f016020809104026020016040519081016040528092919081815260200182805461381490614a19565b80156138615780601f1061383657610100808354040283529160200191613861565b820191906000526020600020905b81548152906001019060200180831161384457829003601f168201915b505050505081525050613f35565b146138f3578954613888906001600160a01b0316613eb2565b6138929088614a01565b96506138b2878560018d600b01805490506138ad9190614999565b613f7b565b7fd1f2f16cb8824bf0d832b207b27728846938ede14202c2335406d9c3509995f78b3360036040516138e693929190614f4d565b60405180910390a1613e38565b6064601254604b6139049190614caf565b61390e9190614edd565b600b8b0154101561394d577fd1f2f16cb8824bf0d832b207b27728846938ede14202c2335406d9c3509995f78b3360006040516138e693929190614f4d565b60048a01548814613cf957828511613a645760005b85811015613a575760026008600089848151811061398257613982614953565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060008282829054906101000a900460ff166139c59190614f28565b92506101000a81548160ff021916908360ff160217905550601354600860008984815181106139f6576139f6614953565b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff161115613a4557613a3887828151811061368757613687614953565b613a429089614a01565b97505b80613a4f8161497f565b915050613962565b506138b287858651613f7b565b6040517f9418bddd0000000000000000000000000000000000000000000000000000000081526001600160a01b038a1690639418bddd90613aac9060038e0190600401615047565b602060405180830381865afa158015613ac9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613aed91906149c7565b15613cc55760018a01546040517f2ab65ec70000000000000000000000000000000000000000000000000000000081526001600160a01b038b1691632ab65ec791613b40919060038f019060040161505a565b600060405180830381600087803b158015613b5a57600080fd5b505af1158015613b6e573d6000803e3d6000fd5b5050505060006011541115613c9157601154613b8a9088614a01565b965060005b83811015613c8457600260086000878481518110613baf57613baf614953565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060008282829054906101000a900460ff16613bf29190614f28565b92506101000a81548160ff021916908360ff16021790555060135460086000878481518110613c2357613c23614953565b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff161115613c7257613c6585828151811061368757613687614953565b613c6f9089614a01565b97505b80613c7c8161497f565b915050613b8f565b50613c9187878851613f7b565b7fd1f2f16cb8824bf0d832b207b27728846938ede14202c2335406d9c3509995f78b3360026040516138e693929190614f4d565b7fd1f2f16cb8824bf0d832b207b27728846938ede14202c2335406d9c3509995f78b3360046040516138e693929190614f4d565b89546001600160a01b03166000908152600860205260408120805460029290613d2690849060ff16614f28565b82546101009290920a60ff8181021990931691831602179091556013548c546001600160a01b031660009081526008602052604090205490911611159050613d89578954613d7c906001600160a01b0316613eb2565b613d869088614a01565b96505b613dfb878b600b01805480602002602001604051908101604052809291908181526020018280548015613de557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311613dc7575b505050600b8f01546138ad925060019150614999565b7fd1f2f16cb8824bf0d832b207b27728846938ede14202c2335406d9c3509995f78b336001604051613e2f93929190614f4d565b60405180910390a15b600c8a01805460ff19166001179055600f8054906000613e57836149b0565b909155505050600190980154600090815260096020526040812055505050505050505050565b600060f883901c60ff8316811115613ea357613e9c60ff841682614e8e565b905061290c565b61290960ff8416610100614e8e565b6001600160a01b0381166000908152600260205260408120805490829055601280549083613edf836149b0565b9190505550613eed83612916565b604080516001600160a01b0385168152602081018390527f39505629e9ffd84b4cea98325402ef1c5a184b431c9a7314a352e064f6658bed910160405180910390a192915050565b60008160200151826040015183606001518460800151604051602001613f5e9493929190615073565b604051602081830303815290604052805190602001209050919050565b6000613f878285614edd565b905080600003613f975750505050565b6000805b84518110156140c157613fe3858281518110613fb957613fb9614953565b60200260200101516010546001600160a01b03909116600090815260026020526040902054101590565b156140af578260066000878481518110613fff57613fff614953565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060008282546140369190614a01565b9091555061404690508383614a01565b91507f619caafabdd75649b302ba8419e48cccf64f37f1983ac4727cfb38b57703ffc985828151811061407b5761407b614953565b6020026020010151846040516140a69291906001600160a01b03929092168252602082015260400190565b60405180910390a15b806140b98161497f565b915050613f9b565b5084811015614279576140e084600081518110613fb957613fb9614953565b156141b3576140ef8582614999565b600660008660008151811061410657614106614953565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020600082825461413d9190614a01565b925050819055507f619caafabdd75649b302ba8419e48cccf64f37f1983ac4727cfb38b57703ffc98460008151811061417857614178614953565b6020026020010151868361418c9190614999565b604080516001600160a01b03909316835260208301919091520160405180910390a1614279565b6141bd8582614999565b60066000866001815181106141d4576141d4614953565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020600082825461420b9190614a01565b925050819055507f619caafabdd75649b302ba8419e48cccf64f37f1983ac4727cfb38b57703ffc98460018151811061424657614246614953565b6020026020010151868361425a9190614999565b604080516001600160a01b039093168352602083019190915201611f78565b5050505050565b508054600082559060005260206000209081019061429e919061439d565b50565b60405180610120016040528060006001600160a01b0316815260200160008152602001600081526020016143006040518060a0016040528060008152602001600080191681526020016000815260200160008152602001606081525090565b8152602001600081526020016000815260200160008152602001606081526020016000151581525090565b82805482825590600052602060002090810192821561438d579160200282015b8281111561438d578251825473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0390911617825560209092019160019091019061434b565b5061439992915061439d565b5090565b5b80821115614399576000815560010161439e565b60008083601f8401126143c457600080fd5b50813567ffffffffffffffff8111156143dc57600080fd5b6020830191508360208285010111156143f457600080fd5b9250929050565b6000806000806040858703121561441157600080fd5b843567ffffffffffffffff8082111561442957600080fd5b614435888389016143b2565b9096509450602087013591508082111561444e57600080fd5b5061445b878288016143b2565b95989497509550505050565b6000815180845260005b8181101561448d57602081850181015186830182015201614471565b8181111561449f576000602083870101525b50601f01601f19169290920160200192915050565b602081526000610bc36020830184614467565b6001600160a01b038116811461429e57600080fd5b6000602082840312156144ee57600080fd5b8135610bc3816144c7565b60006020828403121561450b57600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff8084111561454357614543614512565b604051601f8501601f19908116603f0116810190828211818310171561456b5761456b614512565b8160405280935085815286868601111561458457600080fd5b858560208301376000602087830101525050509392505050565b6000602082840312156145b057600080fd5b813567ffffffffffffffff8111156145c757600080fd5b8201601f810184136145d857600080fd5b6145e784823560208401614528565b949350505050565b6000806020838503121561460257600080fd5b823567ffffffffffffffff8082111561461a57600080fd5b818501915085601f83011261462e57600080fd5b81358181111561463d57600080fd5b8660208260051b850101111561465257600080fd5b60209290920196919550909350505050565b60008060006040848603121561467957600080fd5b83359250602084013567ffffffffffffffff81111561469757600080fd5b6146a3868287016143b2565b9497909650939450505050565b801515811461429e57600080fd5b600080604083850312156146d157600080fd5b82356146dc816144c7565b915060208301356146ec816146b0565b809150509250929050565b60006101006001600160a01b038b16835289602084015288604084015280606084015287518184015250602087015161012083015260408701516101408301526060870151610160830152608087015160a061018084015261475d6101a0840182614467565b9150508560808301528460a08301528360c083015261478060e083018415159052565b9998505050505050505050565b6000806000806000606086880312156147a557600080fd5b85359450602086013567ffffffffffffffff808211156147c457600080fd5b6147d089838a016143b2565b909650945060408801359150808211156147e957600080fd5b506147f6888289016143b2565b969995985093965092949392505050565b600082601f83011261481857600080fd5b610bc383833560208501614528565b6000806040838503121561483a57600080fd5b823567ffffffffffffffff8082111561485257600080fd5b61485e86838701614807565b9350602085013591508082111561487457600080fd5b5061488185828601614807565b9150509250929050565b600080600080600080608087890312156148a457600080fd5b86359550602087013567ffffffffffffffff808211156148c357600080fd5b9088019060a0828b0312156148d757600080fd5b909550604088013590808211156148ed57600080fd5b6148f98a838b016143b2565b9096509450606089013591508082111561491257600080fd5b5061491f89828a016143b2565b979a9699509497509295939492505050565b6000806040838503121561494457600080fd5b50508035926020909101359150565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019820361499257614992614969565b5060010190565b6000828210156149ab576149ab614969565b500390565b6000816149bf576149bf614969565b506000190190565b6000602082840312156149d957600080fd5b8151610bc3816146b0565b6000602082840312156149f657600080fd5b8151610bc3816144c7565b60008219821115614a1457614a14614969565b500190565b600181811c90821680614a2d57607f821691505b602082108103614a4d57634e487b7160e01b600052602260045260246000fd5b50919050565b6000614a5f8254614a19565b82601f821115614a755783600052602060002090505b5491506020811015614a4d5760001960209190910360031b1b16919050565b8183823760009101908152919050565b600060208284031215614ab657600080fd5b5051919050565b80516020808301519190811015614a4d5760001960209190910360031b1b16919050565b601f8211156114f057600081815260208120601f850160051c81016020861015614b085750805b601f850160051c820191505b81811015614b2757828155600101614b14565b505050505050565b67ffffffffffffffff831115614b4757614b47614512565b614b5b83614b558354614a19565b83614ae1565b6000601f841160018114614b8f5760008515614b775750838201355b600019600387901b1c1916600186901b178355614279565b600083815260209020601f19861690835b82811015614bc05786850135825560209485019460019092019101614ba0565b5086821015614bdd5760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b815167ffffffffffffffff811115614c0957614c09614512565b614c1d81614c178454614a19565b84614ae1565b602080601f831160018114614c525760008415614c3a5750858301515b600019600386901b1c1916600185901b178555614b27565b600085815260208120601f198616915b82811015614c8157888601518255948401946001909101908401614c62565b5085821015614c9f5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000816000190483118215151615614cc957614cc9614969565b500290565b818352818160208501375060006020828401015260006020601f19601f840116840101905092915050565b80358252602081013560208301526040810135604083015260608101356060830152600060808201357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1833603018112614d5257600080fd5b820160208101903567ffffffffffffffff811115614d6f57600080fd5b803603821315614d7e57600080fd5b60a06080860152614d9360a086018284614cce565b95945050505050565b602081526000610bc36020830184614cf9565b600060a08236031215614dc157600080fd5b60405160a0810167ffffffffffffffff8282108183111715614de557614de5614512565b81604052843583526020850135602084015260408501356040840152606085013560608401526080850135915080821115614e1f57600080fd5b50614e2c36828601614807565b60808301525092915050565b848152836020820152608060408201526000614e576080830185614cf9565b905082606083015295945050505050565b600061ffff808316818516808303821115614e8557614e85614969565b01949350505050565b600061ffff83811690831681811015614ea957614ea9614969565b039392505050565b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b600082614eec57614eec614ec7565b500490565b600082614f0057614f00614ec7565b500690565b600060ff821660ff841680821015614f1f57614f1f614969565b90039392505050565b600060ff821660ff84168060ff03821115614f4557614f45614969565b019392505050565b8381526001600160a01b03831660208201526060810160058310614f8157634e487b7160e01b600052602160045260246000fd5b826040830152949350505050565b80548252600060018083015460208181870152600285015460408701526003850154606087015260048501915060a0608087015260008254614fd081614a19565b8060a08a015260c086831660008114614ff0576001811461500a57615038565b60ff198416828c01528183151560051b8c01019450615038565b866000528560002060005b848110156150305781548d8201850152908901908701615015565b8c0183019550505b50929998505050505050505050565b602081526000610bc36020830184614f8f565b8281526040602082015260006145e76040830184614f8f565b8481528360208201528260408201526080606082015260006150986080830184614467565b969550505050505056fea2646970667358221220ccb43705a238e81db2fa2d88c2fc81e76f89b3f50ba06dd69f6cf627fd5f9ad064736f6c634300080f0033",
  "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106102415760003560e01c80636f9170f611610145578063b4b6de38116100bd578063e59745541161008c578063ef53b04111610071578063ef53b0411461056c578063fca0fd6c1461057f578063ffa444ec1461058857600080fd5b8063e597455414610529578063eab0fca31461053c57600080fd5b8063b4b6de38146104f2578063b646c02514610505578063b9c362091461050e578063dcd836161461052157600080fd5b8063939f59fe1161011457806398fe9dfb116100f957806398fe9dfb146104a95780639b19251a146104bc578063ac1eff68146104df57600080fd5b8063939f59fe14610473578063966df42b1461048657600080fd5b80636f9170f6146104035780638c80fd90146104265780638d14e127146104395780638f1d37761461044c57600080fd5b8063461a4478116101d857806353dec0e8116101a75780635cc38c021161018c5780635cc38c02146103945780636593363f146103b4578063669fdeb5146103c757600080fd5b806353dec0e81461036e5780635bf0f25d1461038157600080fd5b8063461a4478146103375780634869bfb61461034a5780634d4127af1461035d5780634e71d92d1461036657600080fd5b80632e1a7d4d116102145780632e1a7d4d146102d1578063375b3c0a146102e6578063383e5e69146102ef57806340a89eae1461030257600080fd5b8063015cfec7146102465780630700037d1461026f57806315b90cb21461029d578063299ca478146102a6575b600080fd5b6102596102543660046143fb565b6105a8565b60405161026691906144b4565b60405180910390f35b61028f61027d3660046144dc565b60066020526000908152604090205481565b604051908152602001610266565b61028f60115481565b6000546102b9906001600160a01b031681565b6040516001600160a01b039091168152602001610266565b6102e46102df3660046144f9565b6106c6565b005b61028f60105481565b6102e46102fd3660046144dc565b6108bc565b6103256103103660046144dc565b60076020526000908152604090205460ff1681565b60405160ff9091168152602001610266565b6102b961034536600461459e565b610af4565b61028f6103583660046145ef565b610b85565b61028f60125481565b6102e4610bca565b6102e461037c3660046144f9565b610d55565b6102e461038f3660046144f9565b610f46565b61028f6103a23660046144f9565b60096020526000908152604090205481565b6102e46103c2366004614664565b611296565b6102596040518060400160405280600d81526020017f4d455449535f4d414e414745520000000000000000000000000000000000000081525081565b6104166104113660046144dc565b611873565b6040519015158152602001610266565b6102e46104343660046144f9565b6118a2565b6102e46104473660046146be565b611b24565b61045f61045a3660046144f9565b611c1d565b6040516102669897969594939291906146f7565b6102e461048136600461478d565b611d52565b6103256104943660046144dc565b60086020526000908152604090205460ff1681565b6102596104b7366004614827565b611f87565b6104166104ca3660046144dc565b600a6020526000908152604090205460ff1681565b6102b96104ed3660046144f9565b61204e565b6102e461050036600461488b565b612078565b61028f600f5481565b6102e461051c366004614931565b612672565b6102e4612741565b6001546102b9906001600160a01b031681565b61041661054a3660046144dc565b6010546001600160a01b03909116600090815260026020526040902054101590565b6102e461057a3660046144f9565b612811565b61028f600e5481565b61028f6105963660046144dc565b60026020526000908152604090205481565b6060600085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525093945083925050505b82518110156106ba578482036105fc57600091505b61065983828151811061061157610611614953565b01602001517fff000000000000000000000000000000000000000000000000000000000000001687878581811061064a5761064a614953565b919091013560f81c90506128da565b83828151811061066b5761066b614953565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350816106a48161497f565b92505080806106b29061497f565b9150506105e7565b50909695505050505050565b600f541561071b5760405162461bcd60e51b815260206004820181905260248201527f77697468647261772069732063757272656e746c792070726f6869626974656460448201526064015b60405180910390fd5b336000908152600260205260409020548181101561077b5760405162461bcd60e51b815260206004820152601e60248201527f696e73756666696369656e74207374616b6520746f20776974686472617700006044820152606401610712565b6010546107888383614999565b10801561079757506010548110155b156107ba57601280549060006107ac836149b0565b91905055506107ba33612916565b33600090815260026020526040812080548492906107d9908490614999565b90915550506001546040517fa9059cbb000000000000000000000000000000000000000000000000000000008152336004820152602481018490526001600160a01b039091169063a9059cbb906044016020604051808303816000875af1158015610848573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061086c91906149c7565b6108b85760405162461bcd60e51b815260206004820152601560248201527f746f6b656e207472616e73666572206661696c656400000000000000000000006044820152606401610712565b5050565b6108fa6040518060400160405280600d81526020017f4d455449535f4d414e4147455200000000000000000000000000000000000000815250610af4565b6001600160a01b0316336001600160a01b0316146109805760405162461bcd60e51b815260206004820152603f60248201527f4d564d5f56657269666965723a2046756e6374696f6e2063616e206f6e6c792060448201527f62652063616c6c656420627920746865204d455449535f4d414e414745522e006064820152608401610712565b6000601154116109d25760405162461bcd60e51b815260206004820152600860248201527f6e6f207374616b650000000000000000000000000000000000000000000000006044820152606401610712565b6011546040805133815260208101929092527f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364910160405180910390a16011805460009091556001546040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b038481166004830152602482018490529091169063a9059cbb906044016020604051808303816000875af1158015610a84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aa891906149c7565b6108b85760405162461bcd60e51b815260206004820152601560248201527f7472616e73666572206d65746973206661696c656400000000000000000000006044820152606401610712565b600080546040517fbf40fac10000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063bf40fac190610b3e9085906004016144b4565b602060405180830381865afa158015610b5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7f91906149e4565b92915050565b6000610bc3838380806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612a7192505050565b9392505050565b33600090815260066020526040902054610c265760405162461bcd60e51b815260206004820152601260248201527f6e6f2072657761726420746f20636c61696d00000000000000000000000000006044820152606401610712565b33600081815260066020526040808220805492905560015490517fa9059cbb00000000000000000000000000000000000000000000000000000000815260048101939093526024830182905290916001600160a01b039091169063a9059cbb906044016020604051808303816000875af1158015610ca8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ccc91906149c7565b610d185760405162461bcd60e51b815260206004820152601560248201527f746f6b656e207472616e73666572206661696c656400000000000000000000006044820152606401610712565b60408051338152602081018390527f47cee97cb7acd717b3c0aa1435d004cd5b3c8c57d70dbceb4e4458bbd60e39d491015b60405180910390a150565b610d936040518060400160405280600d81526020017f4d455449535f4d414e4147455200000000000000000000000000000000000000815250610af4565b6001600160a01b0316336001600160a01b031614610e195760405162461bcd60e51b815260206004820152603f60248201527f4d564d5f56657269666965723a2046756e6374696f6e2063616e206f6e6c792060448201527f62652063616c6c656420627920746865204d455449535f4d414e414745522e006064820152608401610712565b6001546040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018390526001600160a01b03909116906323b872dd906064016020604051808303816000875af1158015610e89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ead91906149c7565b610ef95760405162461bcd60e51b815260206004820152601560248201527f7472616e73666572206d65746973206661696c656400000000000000000000006044820152606401610712565b8060116000828254610f0b9190614a01565b909155505060408051338152602081018390527febedb8b3c678666e7f36970bc8f57abf6d8fa2e828c0da91ea5b75bf68ed101a9101610d4a565b610f4f33611873565b610fc15760405162461bcd60e51b815260206004820152602360248201527f6f6e6c792077686974656c6973746564207665726966696572732063616e206360448201527f616c6c00000000000000000000000000000000000000000000000000000000006064820152608401610712565b600f54156110115760405162461bcd60e51b815260206004820152601d60248201527f7374616b652069732063757272656e746c792070726f686962697465640000006044820152606401610712565b600081116110615760405162461bcd60e51b815260206004820152601660248201527f7a65726f207374616b65206e6f7420616c6c6f776564000000000000000000006044820152606401610712565b6001546040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018390526001600160a01b03909116906323b872dd906064016020604051808303816000875af11580156110d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110f591906149c7565b6111415760405162461bcd60e51b815260206004820152601560248201527f7472616e73666572206d65746973206661696c656400000000000000000000006044820152606401610712565b3360009081526002602052604081208054918391906111608385614a01565b90915550506010543360009081526002602052604090205410156111ec5760405162461bcd60e51b815260206004820152602b60248201527f696e73756666696369656e74207374616b6520746f207175616c69667920617360448201527f20612076657269666965720000000000000000000000000000000000000000006064820152608401610712565b8060000361125957601280549060006112048361497f565b9091555050600c80546001810182556000919091527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c701805473ffffffffffffffffffffffffffffffffffffffff1916331790555b60408051338152602081018490527febedb8b3c678666e7f36970bc8f57abf6d8fa2e828c0da91ea5b75bf68ed101a910160405180910390a15050565b6010543360009081526002602052604090205410156112f75760405162461bcd60e51b815260206004820152601260248201527f696e73756666696369656e74207374616b6500000000000000000000000000006044820152606401610712565b61130033611873565b6113725760405162461bcd60e51b815260206004820152602360248201527f6f6e6c792077686974656c6973746564207665726966696572732063616e206360448201527f616c6c00000000000000000000000000000000000000000000000000000000006064820152608401610712565b601254600d848154811061138857611388614953565b90600052602060002090600d0201600a015414806113d65750600e54600d84815481106113b7576113b7614953565b90600052602060002090600d020160080154426113d49190614999565b115b6114225760405162461bcd60e51b815260206004820152601160248201527f70686173652032206e6f742072656164790000000000000000000000000000006044820152606401610712565b60008381526005602090815260408083203384529091528120805461144690614a19565b9050116114bb5760405162461bcd60e51b815260206004820152602160248201527f796f75206469646e277420706172746963697061746520696e2070686173652060448201527f31000000000000000000000000000000000000000000000000000000000000006064820152608401610712565b6000838152600360209081526040808320338452909152812080546114df90614a19565b905011156114f5576114f083612f54565b505050565b6000838152600460209081526040808320338452909152902061151790614a53565b60028383604051611529929190614a94565b602060405180830381855afa158015611546573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906115699190614aa4565b146115b65760405162461bcd60e51b815260206004820152601b60248201527f6b657920616e64206b65796861736820646f6e2774206d6174636800000000006044820152606401610712565b600d83815481106115c9576115c9614953565b60009182526020909120600d90910201546001600160a01b0316330361169b5761166a600d84815481106115ff576115ff614953565b90600052602060002090600d02016003016001015460405160200161162691815260200190565b60408051601f198184030181526020601f860181900481028401810190925284835291908590859081908401838280828437600092019190915250611f8792505050565b61167390614abd565b600d848154811061168657611686614953565b600091825260209091206004600d9092020101555b600083815260036020908152604080832033845290915290206116bf828483614b2f565b506000838152600560209081526040808320338452909152902080546117a391906116e990614a19565b80601f016020809104026020016040519081016040528092919081815260200182805461171590614a19565b80156117625780601f1061173757610100808354040283529160200191611762565b820191906000526020600020905b81548152906001019060200180831161174557829003601f168201915b505050505083838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611f8792505050565b60008481526005602090815260408083203384529091529020906117c79082614bef565b50600d83815481106117db576117db614953565b60009182526020808320600b600d90930201919091018054600181018255908352912001805473ffffffffffffffffffffffffffffffffffffffff1916339081179091556040517fcd699b485caf6a8424399921287eff9b6648355e67560923d33b3f9d8551726391611862918691909182526001600160a01b0316602082015260400190565b60405180910390a16114f083612f54565b600b5460009060ff161580610b7f5750506001600160a01b03166000908152600a602052604090205460ff1690565b6118e06040518060400160405280600d81526020017f4d455449535f4d414e4147455200000000000000000000000000000000000000815250610af4565b6001600160a01b0316336001600160a01b0316146119665760405162461bcd60e51b815260206004820152603f60248201527f4d564d5f56657269666965723a2046756e6374696f6e2063616e206f6e6c792060448201527f62652063616c6c656420627920746865204d455449535f4d414e414745522e006064820152608401610712565b6010819055600c5460009015611b1e57600c5460009067ffffffffffffffff81111561199457611994614512565b6040519080825280602002602001820160405280156119bd578160200160208202803683370190505b50905060005b600c54811015611a8a5760105460026000600c84815481106119e7576119e7614953565b60009182526020808320909101546001600160a01b0316835282019290925260400190205410611a7a57600c8181548110611a2457611a24614953565b9060005260206000200160009054906101000a90046001600160a01b0316828481518110611a5457611a54614953565b6001600160a01b039092166020928302919091019091015282611a768161497f565b9350505b611a838161497f565b90506119c3565b50600c54821015611b1c57611aa1600c6000614280565b60005b82811015611b1a57600c828281518110611ac057611ac0614953565b602090810291909101810151825460018101845560009384529190922001805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0390921691909117905580611b128161497f565b915050611aa4565b505b505b60125550565b611b626040518060400160405280600d81526020017f4d455449535f4d414e4147455200000000000000000000000000000000000000815250610af4565b6001600160a01b0316336001600160a01b031614611be85760405162461bcd60e51b815260206004820152603f60248201527f4d564d5f56657269666965723a2046756e6374696f6e2063616e206f6e6c792060448201527f62652063616c6c656420627920746865204d455449535f4d414e414745522e006064820152608401610712565b6001600160a01b039091166000908152600a60205260409020805491151560ff19928316179055600b80549091166001179055565b600d8181548110611c2d57600080fd5b90600052602060002090600d02016000915090508060000160009054906101000a90046001600160a01b031690806001015490806002015490806003016040518060a001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482018054611cad90614a19565b80601f0160208091040260200160405190810160405280929190818152602001828054611cd990614a19565b8015611d265780601f10611cfb57610100808354040283529160200191611d26565b820191906000526020600020905b815481529060010190602001808311611d0957829003601f168201915b5050509190925250505060088201546009830154600a840154600c909401549293919290919060ff1688565b611d5b33611873565b611dcd5760405162461bcd60e51b815260206004820152602360248201527f6f6e6c792077686974656c6973746564207665726966696572732063616e206360448201527f616c6c00000000000000000000000000000000000000000000000000000000006064820152608401610712565b601054336000908152600260205260409020541015611e2e5760405162461bcd60e51b815260206004820152601260248201527f696e73756666696369656e74207374616b6500000000000000000000000000006044820152606401610712565b600085815260056020908152604080832033845290915290208054611e5290614a19565b159050611ec75760405162461bcd60e51b815260206004820152602860248201527f7665726966793120616c726561647920636f6d706c6574656420666f7220746860448201527f652073656e6465720000000000000000000000000000000000000000000000006064820152608401610712565b60008581526005602090815260408083203384529091529020611eeb848683614b2f565b5060008581526004602090815260408083203384529091529020611f10828483614b2f565b50600d8581548110611f2457611f24614953565b600091825260208220600a600d9092020101805491611f428361497f565b9091555050604080518681523360208201527f6f8abfaae8c5cb428b362c84259e542ab1f6424d0717b3495b02c4126e92943291015b60405180910390a15050505050565b6060826000805b82518110156120445784518203611fa457600091505b611fe3838281518110611fb957611fb9614953565b602001015160f81c60f81b868481518110611fd657611fd6614953565b016020015160f81c613e7d565b838281518110611ff557611ff5614953565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508161202e8161497f565b925050808061203c9061497f565b915050611f8e565b5090949350505050565b600c818154811061205e57600080fd5b6000918252602090912001546001600160a01b0316905081565b61208133611873565b6120f35760405162461bcd60e51b815260206004820152602360248201527f6f6e6c792077686974656c6973746564207665726966696572732063616e206360448201527f616c6c00000000000000000000000000000000000000000000000000000000006064820152608401610712565b6010543360009081526002602052604090205410156121545760405162461bcd60e51b815260206004820152601260248201527f696e73756666696369656e74207374616b6500000000000000000000000000006044820152606401610712565b60008681526009602052604081205461216f90600190614999565b90508015806121b95750600e54612187906002614caf565b600d828154811061219a5761219a614953565b90600052602060002090600d020160080154426121b79190614999565b115b6122055760405162461bcd60e51b815260206004820152601d60248201527f746865726520697320616e206f6e676f696e67206368616c6c656e67650000006044820152606401610712565b80156122145761221481612f54565b60006122546040518060400160405280601481526020017f5374617465436f6d6d69746d656e74436861696e000000000000000000000000815250610af4565b6040517f9418bddd0000000000000000000000000000000000000000000000000000000081529091506001600160a01b03821690639418bddd9061229c908a90600401614d9c565b602060405180830381865afa1580156122b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122dd91906149c7565b61234f5760405162461bcd60e51b815260206004820152602e60248201527f746865206261746368206973206f757473696465206f6620746865206672617560448201527f642070726f6f662077696e646f770000000000000000000000000000000000006064820152608401610712565b6123576142a1565b6020810189905233815242608082015261237088614daf565b6060808301918252600d80546001810182556000829052845191027fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb5810180546001600160a01b0390931673ffffffffffffffffffffffffffffffffffffffff199093169290921782556020808601517fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb68301556040808701517fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb7840155945180517fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb88401908155918101517fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb9840155948501517fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eba830155928401517fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1ebb820155608084015185949293917fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1ebc01906125079082614bef565b5050506080820151600882015560a0820151600982015560c0820151600a82015560e0820151805161254391600b84019160209091019061432b565b506101009190910151600c909101805460ff1916911515919091179055600d5460009061257290600190614999565b60008181526005602090815260408083203384529091529020909150612599888a83614b2f565b50600081815260046020908152604080832033845290915290206125be868883614b2f565b50600d81815481106125d2576125d2614953565b600091825260208220600a600d90920201018054916125f08361497f565b9091555050600f80549060006126058361497f565b909155506126169050816001614a01565b60008b8152600960205260409081902091909155517f441214906ecb1ed44d085cb85ab8071c4734e7b4975b38397b9a5df89dec72689061265e9083908d908d904290614e38565b60405180910390a150505050505050505050565b6126b06040518060400160405280600d81526020017f4d455449535f4d414e4147455200000000000000000000000000000000000000815250610af4565b6001600160a01b0316336001600160a01b0316146127365760405162461bcd60e51b815260206004820152603f60248201527f4d564d5f56657269666965723a2046756e6374696f6e2063616e206f6e6c792060448201527f62652063616c6c656420627920746865204d455449535f4d414e414745522e006064820152608401610712565b601491909155601355565b61277f6040518060400160405280600d81526020017f4d455449535f4d414e4147455200000000000000000000000000000000000000815250610af4565b6001600160a01b0316336001600160a01b0316146128055760405162461bcd60e51b815260206004820152603f60248201527f4d564d5f56657269666965723a2046756e6374696f6e2063616e206f6e6c792060448201527f62652063616c6c656420627920746865204d455449535f4d414e414745522e006064820152608401610712565b600b805460ff19169055565b61284f6040518060400160405280600d81526020017f4d455449535f4d414e4147455200000000000000000000000000000000000000815250610af4565b6001600160a01b0316336001600160a01b0316146128d55760405162461bcd60e51b815260206004820152603f60248201527f4d564d5f56657269666965723a2046756e6374696f6e2063616e206f6e6c792060448201527f62652063616c6c656420627920746865204d455449535f4d414e414745522e006064820152608401610712565b600e55565b600060f883901c6128ee60ff841682614e68565b905060ff8161ffff16111561290c5761290961010082614e8e565b90505b60f81b9392505050565b60008060005b600c5481101561297b57836001600160a01b0316600c828154811061294357612943614953565b6000918252602090912001546001600160a01b031603612969576001925080915061297b565b806129738161497f565b91505061291c565b5081156114f057805b600c5461299390600190614999565b811015612a2b57600c6129a7826001614a01565b815481106129b7576129b7614953565b600091825260209091200154600c80546001600160a01b0390921691839081106129e3576129e3614953565b6000918252602090912001805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039290921691909117905580612a238161497f565b915050612984565b50600c805480612a3d57612a3d614eb1565b6000828152602090208101600019908101805473ffffffffffffffffffffffffffffffffffffffff19169055019055505050565b600080825111612ae95760405162461bcd60e51b815260206004820152603460248201527f4c69625f4d65726b6c65547265653a204d7573742070726f766964652061742060448201527f6c65617374206f6e65206c65616620686173682e0000000000000000000000006064820152608401610712565b8151600103612b145781600081518110612b0557612b05614953565b60200260200101519050919050565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b6001841115612f2a57612dc5600285614edd565b9150612dd2600285614ef1565b600114905060005b82811015612e7e578a612dee826002614caf565b81518110612dfe57612dfe614953565b602002602001015196508a816002612e169190614caf565b612e21906001614a01565b81518110612e3157612e31614953565b6020026020010151955086602089015285604089015287805190602001208b8281518110612e6157612e61614953565b602090810291909101015280612e768161497f565b915050612dda565b508015612efa5789612e91600186614999565b81518110612ea157612ea1614953565b60200260200101519550878360108110612ebd57612ebd614953565b602002015160001b945085602088015284604088015286805190602001208a8381518110612eed57612eed614953565b6020026020010181815250505b80612f06576000612f09565b60015b612f169060ff1683614a01565b935082612f228161497f565b935050612db1565b89600081518110612f3d57612f3d614953565b602002602001015198505050505050505050919050565b6000600d8281548110612f6957612f69614953565b60009182526020909120600d90910201600c81015490915060ff1615612fd15760405162461bcd60e51b815260206004820152601360248201527f6368616c6c656e676520697320636c6f736564000000000000000000000000006044820152606401610712565b600a810154600b820154148015906130035750600e54612ff2906002614caf565b60088201546130019042614999565b105b1561300c575050565b600061304c6040518060400160405280601481526020017f5374617465436f6d6d69746d656e74436861696e000000000000000000000000815250610af4565b600084815260056020908152604080832086546001600160a01b0316845290915281209192509061307c90614a53565b905060008084600b018054905067ffffffffffffffff8111156130a1576130a1614512565b6040519080825280602002602001820160405280156130ca578160200160208202803683370190505b50905060008086600b018054905067ffffffffffffffff8111156130f0576130f0614512565b604051908082528060200260200182016040528015613119578160200160208202803683370190505b50905060008088600b018054905067ffffffffffffffff81111561313f5761313f614512565b604051908082528060200260200182016040528015613168578160200160208202803683370190505b5090506000805b600c54811015613666576131c6600c828154811061318f5761318f614953565b6000918252602090912001546001600160a01b03166010546001600160a01b03909116600090815260026020526040902054101590565b15806131ff57506131fd600c82815481106131e3576131e3614953565b6000918252602090912001546001600160a01b0316611873565b155b6136545760008c8152600560205260408120600c80548c9391908590811061322957613229614953565b60009182526020808320909101546001600160a01b03168352820192909252604001902061325690614a53565b0361337857600060076000600c848154811061327457613274614953565b60009182526020808320909101546001600160a01b0316835282019290925260400190205460ff16111561330b57600160076000600c84815481106132bb576132bb614953565b60009182526020808320909101546001600160a01b03168352820192909252604001812080549091906132f290849060ff16614f05565b92506101000a81548160ff021916908360ff1602179055505b600c818154811061331e5761331e614953565b9060005260206000200160009054906101000a90046001600160a01b031687878151811061334e5761334e614953565b6001600160a01b0390921660209283029190910190910152856133708161497f565b965050613654565b60008c8152600360205260408120600c80549192918490811061339d5761339d614953565b60009182526020808320909101546001600160a01b03168352820192909252604001902080546133cc90614a19565b905060000361353b57600260076000600c84815481106133ee576133ee614953565b60009182526020808320909101546001600160a01b031683528201929092526040018120805490919061342590849060ff16614f28565b92506101000a81548160ff021916908360ff16021790555060145460076000600c848154811061345757613457614953565b60009182526020808320909101546001600160a01b0316835282019290925260400190205460ff1611156135365760026000600c838154811061349c5761349c614953565b60009182526020808320909101546001600160a01b031683528201929092526040019020546134cb9089614a01565b9750600c81815481106134e0576134e0614953565b9060005260206000200160009054906101000a90046001600160a01b031683838151811061351057613510614953565b6001600160a01b0390921660209283029190910190910152816135328161497f565b9250505b613654565b600060076000600c848154811061355457613554614953565b60009182526020808320909101546001600160a01b0316835282019290925260400190205460ff1611156135eb57600160076000600c848154811061359b5761359b614953565b60009182526020808320909101546001600160a01b03168352820192909252604001812080549091906135d290849060ff16614f05565b92506101000a81548160ff021916908360ff1602179055505b600c81815481106135fe576135fe614953565b9060005260206000200160009054906101000a90046001600160a01b031685858151811061362e5761362e614953565b6001600160a01b0390921660209283029190910190910152836136508161497f565b9450505b8061365e8161497f565b91505061316f565b5060005b818110156136a75761369483828151811061368757613687614953565b6020026020010151613eb2565b508061369f8161497f565b91505061366a565b50886001600160a01b031663cfdf677e6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156136e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061370a91906149e4565b60018b015460038c01546040517f67d18b9b000000000000000000000000000000000000000000000000000000008152600481019290925260248201526001600160a01b0391909116906367d18b9b90604401602060405180830381865afa15801561377a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061379e9190614aa4565b61386f8b6003016040518060a0016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820180546137e890614a19565b80601f016020809104026020016040519081016040528092919081815260200182805461381490614a19565b80156138615780601f1061383657610100808354040283529160200191613861565b820191906000526020600020905b81548152906001019060200180831161384457829003601f168201915b505050505081525050613f35565b146138f3578954613888906001600160a01b0316613eb2565b6138929088614a01565b96506138b2878560018d600b01805490506138ad9190614999565b613f7b565b7fd1f2f16cb8824bf0d832b207b27728846938ede14202c2335406d9c3509995f78b3360036040516138e693929190614f4d565b60405180910390a1613e38565b6064601254604b6139049190614caf565b61390e9190614edd565b600b8b0154101561394d577fd1f2f16cb8824bf0d832b207b27728846938ede14202c2335406d9c3509995f78b3360006040516138e693929190614f4d565b60048a01548814613cf957828511613a645760005b85811015613a575760026008600089848151811061398257613982614953565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060008282829054906101000a900460ff166139c59190614f28565b92506101000a81548160ff021916908360ff160217905550601354600860008984815181106139f6576139f6614953565b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff161115613a4557613a3887828151811061368757613687614953565b613a429089614a01565b97505b80613a4f8161497f565b915050613962565b506138b287858651613f7b565b6040517f9418bddd0000000000000000000000000000000000000000000000000000000081526001600160a01b038a1690639418bddd90613aac9060038e0190600401615047565b602060405180830381865afa158015613ac9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613aed91906149c7565b15613cc55760018a01546040517f2ab65ec70000000000000000000000000000000000000000000000000000000081526001600160a01b038b1691632ab65ec791613b40919060038f019060040161505a565b600060405180830381600087803b158015613b5a57600080fd5b505af1158015613b6e573d6000803e3d6000fd5b5050505060006011541115613c9157601154613b8a9088614a01565b965060005b83811015613c8457600260086000878481518110613baf57613baf614953565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060008282829054906101000a900460ff16613bf29190614f28565b92506101000a81548160ff021916908360ff16021790555060135460086000878481518110613c2357613c23614953565b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff161115613c7257613c6585828151811061368757613687614953565b613c6f9089614a01565b97505b80613c7c8161497f565b915050613b8f565b50613c9187878851613f7b565b7fd1f2f16cb8824bf0d832b207b27728846938ede14202c2335406d9c3509995f78b3360026040516138e693929190614f4d565b7fd1f2f16cb8824bf0d832b207b27728846938ede14202c2335406d9c3509995f78b3360046040516138e693929190614f4d565b89546001600160a01b03166000908152600860205260408120805460029290613d2690849060ff16614f28565b82546101009290920a60ff8181021990931691831602179091556013548c546001600160a01b031660009081526008602052604090205490911611159050613d89578954613d7c906001600160a01b0316613eb2565b613d869088614a01565b96505b613dfb878b600b01805480602002602001604051908101604052809291908181526020018280548015613de557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311613dc7575b505050600b8f01546138ad925060019150614999565b7fd1f2f16cb8824bf0d832b207b27728846938ede14202c2335406d9c3509995f78b336001604051613e2f93929190614f4d565b60405180910390a15b600c8a01805460ff19166001179055600f8054906000613e57836149b0565b909155505050600190980154600090815260096020526040812055505050505050505050565b600060f883901c60ff8316811115613ea357613e9c60ff841682614e8e565b905061290c565b61290960ff8416610100614e8e565b6001600160a01b0381166000908152600260205260408120805490829055601280549083613edf836149b0565b9190505550613eed83612916565b604080516001600160a01b0385168152602081018390527f39505629e9ffd84b4cea98325402ef1c5a184b431c9a7314a352e064f6658bed910160405180910390a192915050565b60008160200151826040015183606001518460800151604051602001613f5e9493929190615073565b604051602081830303815290604052805190602001209050919050565b6000613f878285614edd565b905080600003613f975750505050565b6000805b84518110156140c157613fe3858281518110613fb957613fb9614953565b60200260200101516010546001600160a01b03909116600090815260026020526040902054101590565b156140af578260066000878481518110613fff57613fff614953565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060008282546140369190614a01565b9091555061404690508383614a01565b91507f619caafabdd75649b302ba8419e48cccf64f37f1983ac4727cfb38b57703ffc985828151811061407b5761407b614953565b6020026020010151846040516140a69291906001600160a01b03929092168252602082015260400190565b60405180910390a15b806140b98161497f565b915050613f9b565b5084811015614279576140e084600081518110613fb957613fb9614953565b156141b3576140ef8582614999565b600660008660008151811061410657614106614953565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020600082825461413d9190614a01565b925050819055507f619caafabdd75649b302ba8419e48cccf64f37f1983ac4727cfb38b57703ffc98460008151811061417857614178614953565b6020026020010151868361418c9190614999565b604080516001600160a01b03909316835260208301919091520160405180910390a1614279565b6141bd8582614999565b60066000866001815181106141d4576141d4614953565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020600082825461420b9190614a01565b925050819055507f619caafabdd75649b302ba8419e48cccf64f37f1983ac4727cfb38b57703ffc98460018151811061424657614246614953565b6020026020010151868361425a9190614999565b604080516001600160a01b039093168352602083019190915201611f78565b5050505050565b508054600082559060005260206000209081019061429e919061439d565b50565b60405180610120016040528060006001600160a01b0316815260200160008152602001600081526020016143006040518060a0016040528060008152602001600080191681526020016000815260200160008152602001606081525090565b8152602001600081526020016000815260200160008152602001606081526020016000151581525090565b82805482825590600052602060002090810192821561438d579160200282015b8281111561438d578251825473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0390911617825560209092019160019091019061434b565b5061439992915061439d565b5090565b5b80821115614399576000815560010161439e565b60008083601f8401126143c457600080fd5b50813567ffffffffffffffff8111156143dc57600080fd5b6020830191508360208285010111156143f457600080fd5b9250929050565b6000806000806040858703121561441157600080fd5b843567ffffffffffffffff8082111561442957600080fd5b614435888389016143b2565b9096509450602087013591508082111561444e57600080fd5b5061445b878288016143b2565b95989497509550505050565b6000815180845260005b8181101561448d57602081850181015186830182015201614471565b8181111561449f576000602083870101525b50601f01601f19169290920160200192915050565b602081526000610bc36020830184614467565b6001600160a01b038116811461429e57600080fd5b6000602082840312156144ee57600080fd5b8135610bc3816144c7565b60006020828403121561450b57600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff8084111561454357614543614512565b604051601f8501601f19908116603f0116810190828211818310171561456b5761456b614512565b8160405280935085815286868601111561458457600080fd5b858560208301376000602087830101525050509392505050565b6000602082840312156145b057600080fd5b813567ffffffffffffffff8111156145c757600080fd5b8201601f810184136145d857600080fd5b6145e784823560208401614528565b949350505050565b6000806020838503121561460257600080fd5b823567ffffffffffffffff8082111561461a57600080fd5b818501915085601f83011261462e57600080fd5b81358181111561463d57600080fd5b8660208260051b850101111561465257600080fd5b60209290920196919550909350505050565b60008060006040848603121561467957600080fd5b83359250602084013567ffffffffffffffff81111561469757600080fd5b6146a3868287016143b2565b9497909650939450505050565b801515811461429e57600080fd5b600080604083850312156146d157600080fd5b82356146dc816144c7565b915060208301356146ec816146b0565b809150509250929050565b60006101006001600160a01b038b16835289602084015288604084015280606084015287518184015250602087015161012083015260408701516101408301526060870151610160830152608087015160a061018084015261475d6101a0840182614467565b9150508560808301528460a08301528360c083015261478060e083018415159052565b9998505050505050505050565b6000806000806000606086880312156147a557600080fd5b85359450602086013567ffffffffffffffff808211156147c457600080fd5b6147d089838a016143b2565b909650945060408801359150808211156147e957600080fd5b506147f6888289016143b2565b969995985093965092949392505050565b600082601f83011261481857600080fd5b610bc383833560208501614528565b6000806040838503121561483a57600080fd5b823567ffffffffffffffff8082111561485257600080fd5b61485e86838701614807565b9350602085013591508082111561487457600080fd5b5061488185828601614807565b9150509250929050565b600080600080600080608087890312156148a457600080fd5b86359550602087013567ffffffffffffffff808211156148c357600080fd5b9088019060a0828b0312156148d757600080fd5b909550604088013590808211156148ed57600080fd5b6148f98a838b016143b2565b9096509450606089013591508082111561491257600080fd5b5061491f89828a016143b2565b979a9699509497509295939492505050565b6000806040838503121561494457600080fd5b50508035926020909101359150565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019820361499257614992614969565b5060010190565b6000828210156149ab576149ab614969565b500390565b6000816149bf576149bf614969565b506000190190565b6000602082840312156149d957600080fd5b8151610bc3816146b0565b6000602082840312156149f657600080fd5b8151610bc3816144c7565b60008219821115614a1457614a14614969565b500190565b600181811c90821680614a2d57607f821691505b602082108103614a4d57634e487b7160e01b600052602260045260246000fd5b50919050565b6000614a5f8254614a19565b82601f821115614a755783600052602060002090505b5491506020811015614a4d5760001960209190910360031b1b16919050565b8183823760009101908152919050565b600060208284031215614ab657600080fd5b5051919050565b80516020808301519190811015614a4d5760001960209190910360031b1b16919050565b601f8211156114f057600081815260208120601f850160051c81016020861015614b085750805b601f850160051c820191505b81811015614b2757828155600101614b14565b505050505050565b67ffffffffffffffff831115614b4757614b47614512565b614b5b83614b558354614a19565b83614ae1565b6000601f841160018114614b8f5760008515614b775750838201355b600019600387901b1c1916600186901b178355614279565b600083815260209020601f19861690835b82811015614bc05786850135825560209485019460019092019101614ba0565b5086821015614bdd5760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b815167ffffffffffffffff811115614c0957614c09614512565b614c1d81614c178454614a19565b84614ae1565b602080601f831160018114614c525760008415614c3a5750858301515b600019600386901b1c1916600185901b178555614b27565b600085815260208120601f198616915b82811015614c8157888601518255948401946001909101908401614c62565b5085821015614c9f5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000816000190483118215151615614cc957614cc9614969565b500290565b818352818160208501375060006020828401015260006020601f19601f840116840101905092915050565b80358252602081013560208301526040810135604083015260608101356060830152600060808201357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1833603018112614d5257600080fd5b820160208101903567ffffffffffffffff811115614d6f57600080fd5b803603821315614d7e57600080fd5b60a06080860152614d9360a086018284614cce565b95945050505050565b602081526000610bc36020830184614cf9565b600060a08236031215614dc157600080fd5b60405160a0810167ffffffffffffffff8282108183111715614de557614de5614512565b81604052843583526020850135602084015260408501356040840152606085013560608401526080850135915080821115614e1f57600080fd5b50614e2c36828601614807565b60808301525092915050565b848152836020820152608060408201526000614e576080830185614cf9565b905082606083015295945050505050565b600061ffff808316818516808303821115614e8557614e85614969565b01949350505050565b600061ffff83811690831681811015614ea957614ea9614969565b039392505050565b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b600082614eec57614eec614ec7565b500490565b600082614f0057614f00614ec7565b500690565b600060ff821660ff841680821015614f1f57614f1f614969565b90039392505050565b600060ff821660ff84168060ff03821115614f4557614f45614969565b019392505050565b8381526001600160a01b03831660208201526060810160058310614f8157634e487b7160e01b600052602160045260246000fd5b826040830152949350505050565b80548252600060018083015460208181870152600285015460408701526003850154606087015260048501915060a0608087015260008254614fd081614a19565b8060a08a015260c086831660008114614ff0576001811461500a57615038565b60ff198416828c01528183151560051b8c01019450615038565b866000528560002060005b848110156150305781548d8201850152908901908701615015565b8c0183019550505b50929998505050505050505050565b602081526000610bc36020830184614f8f565b8281526040602082015260006145e76040830184614f8f565b8481528360208201528260408201526080606082015260006150986080830184614467565b969550505050505056fea2646970667358221220ccb43705a238e81db2fa2d88c2fc81e76f89b3f50ba06dd69f6cf627fd5f9ad064736f6c634300080f0033",
  "devdoc": {
    "kind": "dev",
    "methods": {
      "resolve(string)": {
        "params": {
          "_name": "Name to resolve an address for."
        },
        "returns": {
          "_0": "Address associated with the given name."
        }
      }
    },
    "version": 1
  },
  "userdoc": {
    "kind": "user",
    "methods": {
      "resolve(string)": {
        "notice": "Resolves the address associated with a given name."
      }
    },
    "version": 1
  },
  "storageLayout": {
    "storage": [
      {
        "astId": 33414,
        "contract": "contracts/MVM/MVM_Verifier.sol:MVM_Verifier",
        "label": "libAddressManager",
        "offset": 0,
        "slot": "0",
        "type": "t_contract(Lib_AddressManager)33406"
      },
      {
        "astId": 29154,
        "contract": "contracts/MVM/MVM_Verifier.sol:MVM_Verifier",
        "label": "metis",
        "offset": 0,
        "slot": "1",
        "type": "t_address"
      },
      {
        "astId": 29256,
        "contract": "contracts/MVM/MVM_Verifier.sol:MVM_Verifier",
        "label": "verifier_stakes",
        "offset": 0,
        "slot": "2",
        "type": "t_mapping(t_address,t_uint256)"
      },
      {
        "astId": 29262,
        "contract": "contracts/MVM/MVM_Verifier.sol:MVM_Verifier",
        "label": "challenge_keys",
        "offset": 0,
        "slot": "3",
        "type": "t_mapping(t_uint256,t_mapping(t_address,t_bytes_storage))"
      },
      {
        "astId": 29268,
        "contract": "contracts/MVM/MVM_Verifier.sol:MVM_Verifier",
        "label": "challenge_key_hashes",
        "offset": 0,
        "slot": "4",
        "type": "t_mapping(t_uint256,t_mapping(t_address,t_bytes_storage))"
      },
      {
        "astId": 29274,
        "contract": "contracts/MVM/MVM_Verifier.sol:MVM_Verifier",
        "label": "challenge_hashes",
        "offset": 0,
        "slot": "5",
        "type": "t_mapping(t_uint256,t_mapping(t_address,t_bytes_storage))"
      },
      {
        "astId": 29278,
        "contract": "contracts/MVM/MVM_Verifier.sol:MVM_Verifier",
        "label": "rewards",
        "offset": 0,
        "slot": "6",
        "type": "t_mapping(t_address,t_uint256)"
      },
      {
        "astId": 29282,
        "contract": "contracts/MVM/MVM_Verifier.sol:MVM_Verifier",
        "label": "absence_strikes",
        "offset": 0,
        "slot": "7",
        "type": "t_mapping(t_address,t_uint8)"
      },
      {
        "astId": 29286,
        "contract": "contracts/MVM/MVM_Verifier.sol:MVM_Verifier",
        "label": "consensus_strikes",
        "offset": 0,
        "slot": "8",
        "type": "t_mapping(t_address,t_uint8)"
      },
      {
        "astId": 29290,
        "contract": "contracts/MVM/MVM_Verifier.sol:MVM_Verifier",
        "label": "chain_under_challenge",
        "offset": 0,
        "slot": "9",
        "type": "t_mapping(t_uint256,t_uint256)"
      },
      {
        "astId": 29294,
        "contract": "contracts/MVM/MVM_Verifier.sol:MVM_Verifier",
        "label": "whitelist",
        "offset": 0,
        "slot": "10",
        "type": "t_mapping(t_address,t_bool)"
      },
      {
        "astId": 29296,
        "contract": "contracts/MVM/MVM_Verifier.sol:MVM_Verifier",
        "label": "useWhiteList",
        "offset": 0,
        "slot": "11",
        "type": "t_bool"
      },
      {
        "astId": 29299,
        "contract": "contracts/MVM/MVM_Verifier.sol:MVM_Verifier",
        "label": "verifiers",
        "offset": 0,
        "slot": "12",
        "type": "t_array(t_address)dyn_storage"
      },
      {
        "astId": 29303,
        "contract": "contracts/MVM/MVM_Verifier.sol:MVM_Verifier",
        "label": "challenges",
        "offset": 0,
        "slot": "13",
        "type": "t_array(t_struct(Challenge)29252_storage)dyn_storage"
      },
      {
        "astId": 29308,
        "contract": "contracts/MVM/MVM_Verifier.sol:MVM_Verifier",
        "label": "verifyWindow",
        "offset": 0,
        "slot": "14",
        "type": "t_uint256"
      },
      {
        "astId": 29310,
        "contract": "contracts/MVM/MVM_Verifier.sol:MVM_Verifier",
        "label": "activeChallenges",
        "offset": 0,
        "slot": "15",
        "type": "t_uint256"
      },
      {
        "astId": 29312,
        "contract": "contracts/MVM/MVM_Verifier.sol:MVM_Verifier",
        "label": "minStake",
        "offset": 0,
        "slot": "16",
        "type": "t_uint256"
      },
      {
        "astId": 29314,
        "contract": "contracts/MVM/MVM_Verifier.sol:MVM_Verifier",
        "label": "seqStake",
        "offset": 0,
        "slot": "17",
        "type": "t_uint256"
      },
      {
        "astId": 29316,
        "contract": "contracts/MVM/MVM_Verifier.sol:MVM_Verifier",
        "label": "numQualifiedVerifiers",
        "offset": 0,
        "slot": "18",
        "type": "t_uint256"
      },
      {
        "astId": 29319,
        "contract": "contracts/MVM/MVM_Verifier.sol:MVM_Verifier",
        "label": "FAIL_THRESHOLD",
        "offset": 0,
        "slot": "19",
        "type": "t_uint256"
      },
      {
        "astId": 29322,
        "contract": "contracts/MVM/MVM_Verifier.sol:MVM_Verifier",
        "label": "ABSENCE_THRESHOLD",
        "offset": 0,
        "slot": "20",
        "type": "t_uint256"
      }
    ],
    "types": {
      "t_address": {
        "encoding": "inplace",
        "label": "address",
        "numberOfBytes": "20"
      },
      "t_array(t_address)dyn_storage": {
        "base": "t_address",
        "encoding": "dynamic_array",
        "label": "address[]",
        "numberOfBytes": "32"
      },
      "t_array(t_struct(Challenge)29252_storage)dyn_storage": {
        "base": "t_struct(Challenge)29252_storage",
        "encoding": "dynamic_array",
        "label": "struct MVM_Verifier.Challenge[]",
        "numberOfBytes": "32"
      },
      "t_bool": {
        "encoding": "inplace",
        "label": "bool",
        "numberOfBytes": "1"
      },
      "t_bytes32": {
        "encoding": "inplace",
        "label": "bytes32",
        "numberOfBytes": "32"
      },
      "t_bytes_storage": {
        "encoding": "bytes",
        "label": "bytes",
        "numberOfBytes": "32"
      },
      "t_contract(Lib_AddressManager)33406": {
        "encoding": "inplace",
        "label": "contract Lib_AddressManager",
        "numberOfBytes": "20"
      },
      "t_mapping(t_address,t_bool)": {
        "encoding": "mapping",
        "key": "t_address",
        "label": "mapping(address => bool)",
        "numberOfBytes": "32",
        "value": "t_bool"
      },
      "t_mapping(t_address,t_bytes_storage)": {
        "encoding": "mapping",
        "key": "t_address",
        "label": "mapping(address => bytes)",
        "numberOfBytes": "32",
        "value": "t_bytes_storage"
      },
      "t_mapping(t_address,t_uint256)": {
        "encoding": "mapping",
        "key": "t_address",
        "label": "mapping(address => uint256)",
        "numberOfBytes": "32",
        "value": "t_uint256"
      },
      "t_mapping(t_address,t_uint8)": {
        "encoding": "mapping",
        "key": "t_address",
        "label": "mapping(address => uint8)",
        "numberOfBytes": "32",
        "value": "t_uint8"
      },
      "t_mapping(t_uint256,t_mapping(t_address,t_bytes_storage))": {
        "encoding": "mapping",
        "key": "t_uint256",
        "label": "mapping(uint256 => mapping(address => bytes))",
        "numberOfBytes": "32",
        "value": "t_mapping(t_address,t_bytes_storage)"
      },
      "t_mapping(t_uint256,t_uint256)": {
        "encoding": "mapping",
        "key": "t_uint256",
        "label": "mapping(uint256 => uint256)",
        "numberOfBytes": "32",
        "value": "t_uint256"
      },
      "t_struct(ChainBatchHeader)33009_storage": {
        "encoding": "inplace",
        "label": "struct Lib_OVMCodec.ChainBatchHeader",
        "members": [
          {
            "astId": 33000,
            "contract": "contracts/MVM/MVM_Verifier.sol:MVM_Verifier",
            "label": "batchIndex",
            "offset": 0,
            "slot": "0",
            "type": "t_uint256"
          },
          {
            "astId": 33002,
            "contract": "contracts/MVM/MVM_Verifier.sol:MVM_Verifier",
            "label": "batchRoot",
            "offset": 0,
            "slot": "1",
            "type": "t_bytes32"
          },
          {
            "astId": 33004,
            "contract": "contracts/MVM/MVM_Verifier.sol:MVM_Verifier",
            "label": "batchSize",
            "offset": 0,
            "slot": "2",
            "type": "t_uint256"
          },
          {
            "astId": 33006,
            "contract": "contracts/MVM/MVM_Verifier.sol:MVM_Verifier",
            "label": "prevTotalElements",
            "offset": 0,
            "slot": "3",
            "type": "t_uint256"
          },
          {
            "astId": 33008,
            "contract": "contracts/MVM/MVM_Verifier.sol:MVM_Verifier",
            "label": "extraData",
            "offset": 0,
            "slot": "4",
            "type": "t_bytes_storage"
          }
        ],
        "numberOfBytes": "160"
      },
      "t_struct(Challenge)29252_storage": {
        "encoding": "inplace",
        "label": "struct MVM_Verifier.Challenge",
        "members": [
          {
            "astId": 29233,
            "contract": "contracts/MVM/MVM_Verifier.sol:MVM_Verifier",
            "label": "challenger",
            "offset": 0,
            "slot": "0",
            "type": "t_address"
          },
          {
            "astId": 29235,
            "contract": "contracts/MVM/MVM_Verifier.sol:MVM_Verifier",
            "label": "chainID",
            "offset": 0,
            "slot": "1",
            "type": "t_uint256"
          },
          {
            "astId": 29237,
            "contract": "contracts/MVM/MVM_Verifier.sol:MVM_Verifier",
            "label": "index",
            "offset": 0,
            "slot": "2",
            "type": "t_uint256"
          },
          {
            "astId": 29240,
            "contract": "contracts/MVM/MVM_Verifier.sol:MVM_Verifier",
            "label": "header",
            "offset": 0,
            "slot": "3",
            "type": "t_struct(ChainBatchHeader)33009_storage"
          },
          {
            "astId": 29242,
            "contract": "contracts/MVM/MVM_Verifier.sol:MVM_Verifier",
            "label": "timestamp",
            "offset": 0,
            "slot": "8",
            "type": "t_uint256"
          },
          {
            "astId": 29244,
            "contract": "contracts/MVM/MVM_Verifier.sol:MVM_Verifier",
            "label": "numQualifiedVerifiers",
            "offset": 0,
            "slot": "9",
            "type": "t_uint256"
          },
          {
            "astId": 29246,
            "contract": "contracts/MVM/MVM_Verifier.sol:MVM_Verifier",
            "label": "numVerifiers",
            "offset": 0,
            "slot": "10",
            "type": "t_uint256"
          },
          {
            "astId": 29249,
            "contract": "contracts/MVM/MVM_Verifier.sol:MVM_Verifier",
            "label": "verifiers",
            "offset": 0,
            "slot": "11",
            "type": "t_array(t_address)dyn_storage"
          },
          {
            "astId": 29251,
            "contract": "contracts/MVM/MVM_Verifier.sol:MVM_Verifier",
            "label": "done",
            "offset": 0,
            "slot": "12",
            "type": "t_bool"
          }
        ],
        "numberOfBytes": "416"
      },
      "t_uint256": {
        "encoding": "inplace",
        "label": "uint256",
        "numberOfBytes": "32"
      },
      "t_uint8": {
        "encoding": "inplace",
        "label": "uint8",
        "numberOfBytes": "1"
      }
    }
  }
}