{
  "_format": "hh-sol-artifact-1",
  "contractName": "TestERC4626",
  "sourceName": "contracts/TestERC4626.sol",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "name_",
          "type": "string"
        },
        {
          "internalType": "string",
          "name": "symbol_",
          "type": "string"
        },
        {
          "internalType": "contract IERC20Metadata",
          "name": "asset_",
          "type": "address"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "spender",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "allowance",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "needed",
          "type": "uint256"
        }
      ],
      "name": "ERC20InsufficientAllowance",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "sender",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "balance",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "needed",
          "type": "uint256"
        }
      ],
      "name": "ERC20InsufficientBalance",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "approver",
          "type": "address"
        }
      ],
      "name": "ERC20InvalidApprover",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "receiver",
          "type": "address"
        }
      ],
      "name": "ERC20InvalidReceiver",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "sender",
          "type": "address"
        }
      ],
      "name": "ERC20InvalidSender",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "spender",
          "type": "address"
        }
      ],
      "name": "ERC20InvalidSpender",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "receiver",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "assets",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "max",
          "type": "uint256"
        }
      ],
      "name": "ERC4626ExceededMaxDeposit",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "receiver",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "shares",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "max",
          "type": "uint256"
        }
      ],
      "name": "ERC4626ExceededMaxMint",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "shares",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "max",
          "type": "uint256"
        }
      ],
      "name": "ERC4626ExceededMaxRedeem",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "assets",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "max",
          "type": "uint256"
        }
      ],
      "name": "ERC4626ExceededMaxWithdraw",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "token",
          "type": "address"
        }
      ],
      "name": "SafeERC20FailedOperation",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "bytes4",
          "name": "selector",
          "type": "bytes4"
        }
      ],
      "name": "VaultIsBroken",
      "type": "error"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "spender",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "Approval",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "sender",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "assets",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "shares",
          "type": "uint256"
        }
      ],
      "name": "Deposit",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "Transfer",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "sender",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "receiver",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "assets",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "shares",
          "type": "uint256"
        }
      ],
      "name": "Withdraw",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "OVERRIDE_UNSET",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "spender",
          "type": "address"
        }
      ],
      "name": "allowance",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "spender",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "approve",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "asset",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "balanceOf",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "broken",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "shares",
          "type": "uint256"
        }
      ],
      "name": "convertToAssets",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "assets",
          "type": "uint256"
        }
      ],
      "name": "convertToShares",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "decimals",
      "outputs": [
        {
          "internalType": "uint8",
          "name": "",
          "type": "uint8"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "assets",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "receiver",
          "type": "address"
        }
      ],
      "name": "deposit",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "int256",
          "name": "assets",
          "type": "int256"
        }
      ],
      "name": "discreteEarning",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        }
      ],
      "name": "maxDeposit",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        }
      ],
      "name": "maxMint",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        }
      ],
      "name": "maxRedeem",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        }
      ],
      "name": "maxWithdraw",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "shares",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "receiver",
          "type": "address"
        }
      ],
      "name": "mint",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "name",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "overrideMaxDeposit",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "overrideMaxMint",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "overrideMaxRedeem",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "overrideMaxWithdraw",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "assets",
          "type": "uint256"
        }
      ],
      "name": "previewDeposit",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "shares",
          "type": "uint256"
        }
      ],
      "name": "previewMint",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "shares",
          "type": "uint256"
        }
      ],
      "name": "previewRedeem",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "assets",
          "type": "uint256"
        }
      ],
      "name": "previewWithdraw",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "shares",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "receiver",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        }
      ],
      "name": "redeem",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bool",
          "name": "broken_",
          "type": "bool"
        }
      ],
      "name": "setBroken",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "enum TestERC4626.OverrideOption",
          "name": "option",
          "type": "uint8"
        },
        {
          "internalType": "uint256",
          "name": "newValue",
          "type": "uint256"
        }
      ],
      "name": "setOverride",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "symbol",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "totalAssets",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "totalSupply",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "transfer",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "transferFrom",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "assets",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "receiver",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        }
      ],
      "name": "withdraw",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "bytecode": "0x60c060405234801561001057600080fd5b50604051611b9f380380611b9f83398101604081905261002f9161024d565b808383600361003e8382610361565b50600461004b8282610361565b505050600080610060836100ae60201b60201c565b9150915081610070576012610072565b805b60ff1660a05250506001600160a01b0316608052610093606360001961041f565b6006819055600781905560088190556009555061047b915050565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b17905290516000918291829182916001600160a01b038716916100f591610446565b600060405180830381855afa9150503d8060008114610130576040519150601f19603f3d011682016040523d82523d6000602084013e610135565b606091505b509150915081801561014957506020815110155b1561017d576000818060200190518101906101649190610462565b905060ff811161017b576001969095509350505050565b505b5060009485945092505050565b634e487b7160e01b600052604160045260246000fd5b60005b838110156101bb5781810151838201526020016101a3565b50506000910152565b600082601f8301126101d557600080fd5b81516001600160401b038111156101ee576101ee61018a565b604051601f8201601f19908116603f011681016001600160401b038111828210171561021c5761021c61018a565b60405281815283820160200185101561023457600080fd5b6102458260208301602087016101a0565b949350505050565b60008060006060848603121561026257600080fd5b83516001600160401b0381111561027857600080fd5b610284868287016101c4565b602086015190945090506001600160401b038111156102a257600080fd5b6102ae868287016101c4565b604086015190935090506001600160a01b03811681146102cd57600080fd5b809150509250925092565b600181811c908216806102ec57607f821691505b60208210810361030c57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111561035c57806000526020600020601f840160051c810160208510156103395750805b601f840160051c820191505b818110156103595760008155600101610345565b50505b505050565b81516001600160401b0381111561037a5761037a61018a565b61038e8161038884546102d8565b84610312565b6020601f8211600181146103c257600083156103aa5750848201515b600019600385901b1c1916600184901b178455610359565b600084815260208120601f198516915b828110156103f257878501518255602094850194600190920191016103d2565b50848210156104105786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b8181038181111561044057634e487b7160e01b600052601160045260246000fd5b92915050565b600082516104588184602087016101a0565b9190910192915050565b60006020828403121561047457600080fd5b5051919050565b60805160a0516116dc6104c360003960006106350152600081816102d8015281816104af01528181610857015281816108b901528181610e6c0152610f1e01526116dc6000f3fe608060405234801561001057600080fd5b50600436106102065760003560e01c806386de9e4f1161011a578063c6e6f592116100ad578063d6dd02341161007c578063d6dd023414610444578063d905777e14610457578063dd62ed3e1461046a578063ef8b30f714610402578063f3c0b892146104a357600080fd5b8063c6e6f59214610402578063c7361ed214610415578063cc7fcc6014610428578063ce96cb771461043157600080fd5b8063b3d7f6b9116100e9578063b3d7f6b9146103b6578063b460af94146103c9578063ba087652146103dc578063c63d75b6146103ef57600080fd5b806386de9e4f1461036557806394bf804d1461038857806395d89b411461039b578063a9059cbb146103a357600080fd5b8063313ce5671161019d578063402d267d1161016c578063402d267d1461030b5780634cdad506146102445780636e553f651461031e57806370a08231146103315780637fb1ad621461035a57600080fd5b8063313ce567146102a857806338359018146102c257806338d52e0f146102cb57806339d88aff1461030257600080fd5b8063095ea7b3116101d9578063095ea7b3146102575780630a28a4771461027a57806318160ddd1461028d57806323b872dd1461029557600080fd5b806301e1d1141461020b578063034548cd1461022657806306fdde031461022f57806307a2d13a14610244575b600080fd5b6102136104ab565b6040519081526020015b60405180910390f35b61021360075481565b61023761053d565b60405161021d9190611232565b610213610252366004611280565b6105cf565b61026a6102653660046112b5565b6105e2565b604051901515815260200161021d565b610213610288366004611280565b6105fa565b600254610213565b61026a6102a33660046112df565b610607565b6102b061062d565b60405160ff909116815260200161021d565b61021360085481565b6040516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016815260200161021d565b61021360065481565b61021361031936600461131c565b610659565b61021361032c366004611337565b610680565b61021361033f36600461131c565b6001600160a01b031660009081526020819052604090205490565b60055460ff1661026a565b610386610373366004611363565b6005805460ff1916911515919091179055565b005b610213610396366004611337565b6106df565b61023761072d565b61026a6103b13660046112b5565b61073c565b6102136103c4366004611280565b61074a565b6102136103d7366004611385565b610757565b6102136103ea366004611385565b6107af565b6102136103fd36600461131c565b6107fe565b610213610410366004611280565b61081d565b610386610423366004611280565b61082a565b61021360095481565b61021361043f36600461131c565b610921565b6103866104523660046113c1565b610949565b61021361046536600461131c565b6109c9565b6102136104783660046113e3565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6102136109f1565b60007f00000000000000000000000000000000000000000000000000000000000000006040516370a0823160e01b81523060048201526001600160a01b0391909116906370a0823190602401602060405180830381865afa158015610514573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610538919061140d565b905090565b60606003805461054c90611426565b80601f016020809104026020016040519081016040528092919081815260200182805461057890611426565b80156105c55780601f1061059a576101008083540402835291602001916105c5565b820191906000526020600020905b8154815290600101906020018083116105a857829003601f168201915b5050505050905090565b60006105dc826000610a01565b92915050565b6000336105f0818585610a3b565b5060019392505050565b60006105dc826001610a4d565b600033610615858285610a7d565b610620858585610ae9565b60019150505b9392505050565b6000610538817f0000000000000000000000000000000000000000000000000000000000000000611476565b6000610668606360001961148f565b60065414610678576006546105dc565b6000196105dc565b60008061068c83610659565b9050808411156106be57828482604051633c8097d960e11b81526004016106b5939291906114a2565b60405180910390fd5b60006106c98561081d565b90506106d733858784610b48565b949350505050565b6000806106eb836107fe565b9050808411156107145782848260405163284ff66760e01b81526004016106b5939291906114a2565b600061071f8561074a565b90506106d733858388610b48565b60606004805461054c90611426565b6000336105f0818585610ae9565b60006105dc826001610a01565b60008061076383610921565b90508085111561078c57828582604051633fa733bb60e21b81526004016106b5939291906114a2565b6000610797866105fa565b90506107a63386868985610b9e565b95945050505050565b6000806107bb836109c9565b9050808511156107e457828582604051632e52afbb60e21b81526004016106b5939291906114a2565b60006107ef866105cf565b90506107a6338686848a610b9e565b600061080d606360001961148f565b60075414610678576007546105dc565b60006105dc826000610a4d565b60008113156108b7576040516340c10f1960e01b8152306004820152602481018290526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906340c10f19906044015b600060405180830381600087803b15801561089c57600080fd5b505af11580156108b0573d6000803e3d6000fd5b5050505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639dc29fac306108f0846114c3565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401610882565b6000610930606360001961148f565b60085414610940576008546105dc565b6105dc82610bf5565b600082600381111561095d5761095d6114df565b036109685760068190555b600182600381111561097c5761097c6114df565b036109875760078190555b600282600381111561099b5761099b6114df565b036109a65760088190555b60038260038111156109ba576109ba6114df565b036109c55760098190555b5050565b60006109d8606360001961148f565b600954146109e8576009546105dc565b6105dc82610c19565b6109fe606360001961148f565b81565b6000610626610a0e6104ab565b610a199060016114f5565b610a256000600a6115ef565b600254610a3291906114f5565b85919085610c37565b610a488383836001610c7b565b505050565b6000610626610a5d82600a6115ef565b600254610a6a91906114f5565b610a726104ab565b610a329060016114f5565b6001600160a01b03838116600090815260016020908152604080832093861683529290522054600019811015610ae35781811015610ad457828183604051637dc7a0d960e11b81526004016106b5939291906114a2565b610ae384848484036000610c7b565b50505050565b6001600160a01b038316610b1357604051634b637e8f60e11b8152600060048201526024016106b5565b6001600160a01b038216610b3d5760405163ec442f0560e01b8152600060048201526024016106b5565b610a48838383610d50565b60055460ff1615610b5d6004600036816115fe565b610b6691611628565b90610b91576040516340c2fd5360e11b81526001600160e01b031990911660048201526024016106b5565b50610ae384848484610e67565b60055460ff1615610bb36004600036816115fe565b610bbc91611628565b90610be7576040516340c2fd5360e11b81526001600160e01b031990911660048201526024016106b5565b506108b08585858585610eeb565b6001600160a01b0381166000908152602081905260408120546105dc906000610a01565b6001600160a01b0381166000908152602081905260408120546105dc565b6000610c66610c4583610fab565b8015610c61575060008480610c5c57610c5c611660565b868809115b151590565b610c71868686610fd8565b6107a691906114f5565b6001600160a01b038416610ca55760405163e602df0560e01b8152600060048201526024016106b5565b6001600160a01b038316610ccf57604051634a1406b160e11b8152600060048201526024016106b5565b6001600160a01b0380851660009081526001602090815260408083209387168352929052208290558015610ae357826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610d4291815260200190565b60405180910390a350505050565b6001600160a01b038316610d7b578060026000828254610d7091906114f5565b90915550610dda9050565b6001600160a01b03831660009081526020819052604090205481811015610dbb5783818360405163391434e360e21b81526004016106b5939291906114a2565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b038216610df657600280548290039055610e15565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610e5a91815260200190565b60405180910390a3505050565b610e937f000000000000000000000000000000000000000000000000000000000000000085308561108d565b610e9d83826110f4565b826001600160a01b0316846001600160a01b03167fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d78484604051610d42929190918252602082015260400190565b826001600160a01b0316856001600160a01b031614610f0f57610f0f838683610a7d565b610f19838261112a565b610f447f00000000000000000000000000000000000000000000000000000000000000008584611160565b826001600160a01b0316846001600160a01b0316866001600160a01b03167ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db8585604051610f9c929190918252602082015260400190565b60405180910390a45050505050565b60006002826003811115610fc157610fc16114df565b610fcb9190611676565b60ff166001149050919050565b6000806000610fe78686611191565b915091508160000361100c5783818161100257611002611660565b0492505050610626565b8184116110235761102360038515026011186111af565b6000848688096000868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010185841190960395909502919093039390930492909217029150509392505050565b6040516001600160a01b038481166024830152838116604483015260648201839052610ae39186918216906323b872dd906084015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506111c1565b6001600160a01b03821661111e5760405163ec442f0560e01b8152600060048201526024016106b5565b6109c560008383610d50565b6001600160a01b03821661115457604051634b637e8f60e11b8152600060048201526024016106b5565b6109c582600083610d50565b6040516001600160a01b03838116602483015260448201839052610a4891859182169063a9059cbb906064016110c2565b60008060001983850993909202808410938190039390930393915050565b634e487b71600052806020526024601cfd5b600080602060008451602086016000885af1806111e4576040513d6000823e3d81fd5b50506000513d915081156111fc578060011415611209565b6001600160a01b0384163b155b15610ae357604051635274afe760e01b81526001600160a01b03851660048201526024016106b5565b602081526000825180602084015260005b818110156112605760208186018101516040868401015201611243565b506000604082850101526040601f19601f83011684010191505092915050565b60006020828403121561129257600080fd5b5035919050565b80356001600160a01b03811681146112b057600080fd5b919050565b600080604083850312156112c857600080fd5b6112d183611299565b946020939093013593505050565b6000806000606084860312156112f457600080fd5b6112fd84611299565b925061130b60208501611299565b929592945050506040919091013590565b60006020828403121561132e57600080fd5b61062682611299565b6000806040838503121561134a57600080fd5b8235915061135a60208401611299565b90509250929050565b60006020828403121561137557600080fd5b8135801515811461062657600080fd5b60008060006060848603121561139a57600080fd5b833592506113aa60208501611299565b91506113b860408501611299565b90509250925092565b600080604083850312156113d457600080fd5b8235600481106112d157600080fd5b600080604083850312156113f657600080fd5b6113ff83611299565b915061135a60208401611299565b60006020828403121561141f57600080fd5b5051919050565b600181811c9082168061143a57607f821691505b60208210810361145a57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b60ff81811683821601908111156105dc576105dc611460565b818103818111156105dc576105dc611460565b6001600160a01b039390931683526020830191909152604082015260600190565b6000600160ff1b82016114d8576114d8611460565b5060000390565b634e487b7160e01b600052602160045260246000fd5b808201808211156105dc576105dc611460565b6001815b60018411156115435780850481111561152757611527611460565b600184161561153557908102905b60019390931c92800261150c565b935093915050565b60008261155a575060016105dc565b81611567575060006105dc565b816001811461157d5760028114611587576115a3565b60019150506105dc565b60ff84111561159857611598611460565b50506001821b6105dc565b5060208310610133831016604e8410600b84101617156115c6575081810a6105dc565b6115d36000198484611508565b80600019048211156115e7576115e7611460565b029392505050565b600061062660ff84168361154b565b6000808585111561160e57600080fd5b8386111561161b57600080fd5b5050820193919092039150565b80356001600160e01b03198116906004841015611659576001600160e01b0319600485900360031b81901b82161691505b5092915050565b634e487b7160e01b600052601260045260246000fd5b600060ff83168061169757634e487b7160e01b600052601260045260246000fd5b8060ff8416069150509291505056fea2646970667358221220e2863f8549e6c5d23a38bd8d5f485b1581f6d07eacceeb89d7c1aadcfcb6cd0464736f6c634300081c0033",
  "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106102065760003560e01c806386de9e4f1161011a578063c6e6f592116100ad578063d6dd02341161007c578063d6dd023414610444578063d905777e14610457578063dd62ed3e1461046a578063ef8b30f714610402578063f3c0b892146104a357600080fd5b8063c6e6f59214610402578063c7361ed214610415578063cc7fcc6014610428578063ce96cb771461043157600080fd5b8063b3d7f6b9116100e9578063b3d7f6b9146103b6578063b460af94146103c9578063ba087652146103dc578063c63d75b6146103ef57600080fd5b806386de9e4f1461036557806394bf804d1461038857806395d89b411461039b578063a9059cbb146103a357600080fd5b8063313ce5671161019d578063402d267d1161016c578063402d267d1461030b5780634cdad506146102445780636e553f651461031e57806370a08231146103315780637fb1ad621461035a57600080fd5b8063313ce567146102a857806338359018146102c257806338d52e0f146102cb57806339d88aff1461030257600080fd5b8063095ea7b3116101d9578063095ea7b3146102575780630a28a4771461027a57806318160ddd1461028d57806323b872dd1461029557600080fd5b806301e1d1141461020b578063034548cd1461022657806306fdde031461022f57806307a2d13a14610244575b600080fd5b6102136104ab565b6040519081526020015b60405180910390f35b61021360075481565b61023761053d565b60405161021d9190611232565b610213610252366004611280565b6105cf565b61026a6102653660046112b5565b6105e2565b604051901515815260200161021d565b610213610288366004611280565b6105fa565b600254610213565b61026a6102a33660046112df565b610607565b6102b061062d565b60405160ff909116815260200161021d565b61021360085481565b6040516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016815260200161021d565b61021360065481565b61021361031936600461131c565b610659565b61021361032c366004611337565b610680565b61021361033f36600461131c565b6001600160a01b031660009081526020819052604090205490565b60055460ff1661026a565b610386610373366004611363565b6005805460ff1916911515919091179055565b005b610213610396366004611337565b6106df565b61023761072d565b61026a6103b13660046112b5565b61073c565b6102136103c4366004611280565b61074a565b6102136103d7366004611385565b610757565b6102136103ea366004611385565b6107af565b6102136103fd36600461131c565b6107fe565b610213610410366004611280565b61081d565b610386610423366004611280565b61082a565b61021360095481565b61021361043f36600461131c565b610921565b6103866104523660046113c1565b610949565b61021361046536600461131c565b6109c9565b6102136104783660046113e3565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6102136109f1565b60007f00000000000000000000000000000000000000000000000000000000000000006040516370a0823160e01b81523060048201526001600160a01b0391909116906370a0823190602401602060405180830381865afa158015610514573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610538919061140d565b905090565b60606003805461054c90611426565b80601f016020809104026020016040519081016040528092919081815260200182805461057890611426565b80156105c55780601f1061059a576101008083540402835291602001916105c5565b820191906000526020600020905b8154815290600101906020018083116105a857829003601f168201915b5050505050905090565b60006105dc826000610a01565b92915050565b6000336105f0818585610a3b565b5060019392505050565b60006105dc826001610a4d565b600033610615858285610a7d565b610620858585610ae9565b60019150505b9392505050565b6000610538817f0000000000000000000000000000000000000000000000000000000000000000611476565b6000610668606360001961148f565b60065414610678576006546105dc565b6000196105dc565b60008061068c83610659565b9050808411156106be57828482604051633c8097d960e11b81526004016106b5939291906114a2565b60405180910390fd5b60006106c98561081d565b90506106d733858784610b48565b949350505050565b6000806106eb836107fe565b9050808411156107145782848260405163284ff66760e01b81526004016106b5939291906114a2565b600061071f8561074a565b90506106d733858388610b48565b60606004805461054c90611426565b6000336105f0818585610ae9565b60006105dc826001610a01565b60008061076383610921565b90508085111561078c57828582604051633fa733bb60e21b81526004016106b5939291906114a2565b6000610797866105fa565b90506107a63386868985610b9e565b95945050505050565b6000806107bb836109c9565b9050808511156107e457828582604051632e52afbb60e21b81526004016106b5939291906114a2565b60006107ef866105cf565b90506107a6338686848a610b9e565b600061080d606360001961148f565b60075414610678576007546105dc565b60006105dc826000610a4d565b60008113156108b7576040516340c10f1960e01b8152306004820152602481018290526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906340c10f19906044015b600060405180830381600087803b15801561089c57600080fd5b505af11580156108b0573d6000803e3d6000fd5b5050505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639dc29fac306108f0846114c3565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401610882565b6000610930606360001961148f565b60085414610940576008546105dc565b6105dc82610bf5565b600082600381111561095d5761095d6114df565b036109685760068190555b600182600381111561097c5761097c6114df565b036109875760078190555b600282600381111561099b5761099b6114df565b036109a65760088190555b60038260038111156109ba576109ba6114df565b036109c55760098190555b5050565b60006109d8606360001961148f565b600954146109e8576009546105dc565b6105dc82610c19565b6109fe606360001961148f565b81565b6000610626610a0e6104ab565b610a199060016114f5565b610a256000600a6115ef565b600254610a3291906114f5565b85919085610c37565b610a488383836001610c7b565b505050565b6000610626610a5d82600a6115ef565b600254610a6a91906114f5565b610a726104ab565b610a329060016114f5565b6001600160a01b03838116600090815260016020908152604080832093861683529290522054600019811015610ae35781811015610ad457828183604051637dc7a0d960e11b81526004016106b5939291906114a2565b610ae384848484036000610c7b565b50505050565b6001600160a01b038316610b1357604051634b637e8f60e11b8152600060048201526024016106b5565b6001600160a01b038216610b3d5760405163ec442f0560e01b8152600060048201526024016106b5565b610a48838383610d50565b60055460ff1615610b5d6004600036816115fe565b610b6691611628565b90610b91576040516340c2fd5360e11b81526001600160e01b031990911660048201526024016106b5565b50610ae384848484610e67565b60055460ff1615610bb36004600036816115fe565b610bbc91611628565b90610be7576040516340c2fd5360e11b81526001600160e01b031990911660048201526024016106b5565b506108b08585858585610eeb565b6001600160a01b0381166000908152602081905260408120546105dc906000610a01565b6001600160a01b0381166000908152602081905260408120546105dc565b6000610c66610c4583610fab565b8015610c61575060008480610c5c57610c5c611660565b868809115b151590565b610c71868686610fd8565b6107a691906114f5565b6001600160a01b038416610ca55760405163e602df0560e01b8152600060048201526024016106b5565b6001600160a01b038316610ccf57604051634a1406b160e11b8152600060048201526024016106b5565b6001600160a01b0380851660009081526001602090815260408083209387168352929052208290558015610ae357826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610d4291815260200190565b60405180910390a350505050565b6001600160a01b038316610d7b578060026000828254610d7091906114f5565b90915550610dda9050565b6001600160a01b03831660009081526020819052604090205481811015610dbb5783818360405163391434e360e21b81526004016106b5939291906114a2565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b038216610df657600280548290039055610e15565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610e5a91815260200190565b60405180910390a3505050565b610e937f000000000000000000000000000000000000000000000000000000000000000085308561108d565b610e9d83826110f4565b826001600160a01b0316846001600160a01b03167fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d78484604051610d42929190918252602082015260400190565b826001600160a01b0316856001600160a01b031614610f0f57610f0f838683610a7d565b610f19838261112a565b610f447f00000000000000000000000000000000000000000000000000000000000000008584611160565b826001600160a01b0316846001600160a01b0316866001600160a01b03167ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db8585604051610f9c929190918252602082015260400190565b60405180910390a45050505050565b60006002826003811115610fc157610fc16114df565b610fcb9190611676565b60ff166001149050919050565b6000806000610fe78686611191565b915091508160000361100c5783818161100257611002611660565b0492505050610626565b8184116110235761102360038515026011186111af565b6000848688096000868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010185841190960395909502919093039390930492909217029150509392505050565b6040516001600160a01b038481166024830152838116604483015260648201839052610ae39186918216906323b872dd906084015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506111c1565b6001600160a01b03821661111e5760405163ec442f0560e01b8152600060048201526024016106b5565b6109c560008383610d50565b6001600160a01b03821661115457604051634b637e8f60e11b8152600060048201526024016106b5565b6109c582600083610d50565b6040516001600160a01b03838116602483015260448201839052610a4891859182169063a9059cbb906064016110c2565b60008060001983850993909202808410938190039390930393915050565b634e487b71600052806020526024601cfd5b600080602060008451602086016000885af1806111e4576040513d6000823e3d81fd5b50506000513d915081156111fc578060011415611209565b6001600160a01b0384163b155b15610ae357604051635274afe760e01b81526001600160a01b03851660048201526024016106b5565b602081526000825180602084015260005b818110156112605760208186018101516040868401015201611243565b506000604082850101526040601f19601f83011684010191505092915050565b60006020828403121561129257600080fd5b5035919050565b80356001600160a01b03811681146112b057600080fd5b919050565b600080604083850312156112c857600080fd5b6112d183611299565b946020939093013593505050565b6000806000606084860312156112f457600080fd5b6112fd84611299565b925061130b60208501611299565b929592945050506040919091013590565b60006020828403121561132e57600080fd5b61062682611299565b6000806040838503121561134a57600080fd5b8235915061135a60208401611299565b90509250929050565b60006020828403121561137557600080fd5b8135801515811461062657600080fd5b60008060006060848603121561139a57600080fd5b833592506113aa60208501611299565b91506113b860408501611299565b90509250925092565b600080604083850312156113d457600080fd5b8235600481106112d157600080fd5b600080604083850312156113f657600080fd5b6113ff83611299565b915061135a60208401611299565b60006020828403121561141f57600080fd5b5051919050565b600181811c9082168061143a57607f821691505b60208210810361145a57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b60ff81811683821601908111156105dc576105dc611460565b818103818111156105dc576105dc611460565b6001600160a01b039390931683526020830191909152604082015260600190565b6000600160ff1b82016114d8576114d8611460565b5060000390565b634e487b7160e01b600052602160045260246000fd5b808201808211156105dc576105dc611460565b6001815b60018411156115435780850481111561152757611527611460565b600184161561153557908102905b60019390931c92800261150c565b935093915050565b60008261155a575060016105dc565b81611567575060006105dc565b816001811461157d5760028114611587576115a3565b60019150506105dc565b60ff84111561159857611598611460565b50506001821b6105dc565b5060208310610133831016604e8410600b84101617156115c6575081810a6105dc565b6115d36000198484611508565b80600019048211156115e7576115e7611460565b029392505050565b600061062660ff84168361154b565b6000808585111561160e57600080fd5b8386111561161b57600080fd5b5050820193919092039150565b80356001600160e01b03198116906004841015611659576001600160e01b0319600485900360031b81901b82161691505b5092915050565b634e487b7160e01b600052601260045260246000fd5b600060ff83168061169757634e487b7160e01b600052601260045260246000fd5b8060ff8416069150509291505056fea2646970667358221220e2863f8549e6c5d23a38bd8d5f485b1581f6d07eacceeb89d7c1aadcfcb6cd0464736f6c634300081c0033",
  "linkReferences": {},
  "deployedLinkReferences": {}
}
