{
    "schemaVersion": "2.0.0",
    "contractName": "TestKyberBridge",
    "compilerOutput": {
        "abi": [
            {
                "inputs": [],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "constructor"
            },
            {
                "anonymous": false,
                "inputs": [
                    {
                        "indexed": false,
                        "internalType": "address",
                        "name": "inputToken",
                        "type": "address"
                    },
                    {
                        "indexed": false,
                        "internalType": "address",
                        "name": "outputToken",
                        "type": "address"
                    },
                    {
                        "indexed": false,
                        "internalType": "uint256",
                        "name": "inputTokenAmount",
                        "type": "uint256"
                    },
                    {
                        "indexed": false,
                        "internalType": "uint256",
                        "name": "outputTokenAmount",
                        "type": "uint256"
                    },
                    {
                        "indexed": false,
                        "internalType": "address",
                        "name": "from",
                        "type": "address"
                    },
                    {
                        "indexed": false,
                        "internalType": "address",
                        "name": "to",
                        "type": "address"
                    }
                ],
                "name": "ERC20BridgeTransfer",
                "type": "event"
            },
            {
                "anonymous": false,
                "inputs": [
                    {
                        "indexed": false,
                        "internalType": "address",
                        "name": "tokenAddress",
                        "type": "address"
                    },
                    {
                        "indexed": false,
                        "internalType": "address",
                        "name": "ownerAddress",
                        "type": "address"
                    },
                    {
                        "indexed": false,
                        "internalType": "address",
                        "name": "spenderAddress",
                        "type": "address"
                    },
                    {
                        "indexed": false,
                        "internalType": "uint256",
                        "name": "allowance",
                        "type": "uint256"
                    }
                ],
                "name": "KyberBridgeTokenApprove",
                "type": "event"
            },
            {
                "anonymous": false,
                "inputs": [
                    {
                        "indexed": false,
                        "internalType": "address",
                        "name": "tokenAddress",
                        "type": "address"
                    },
                    {
                        "indexed": false,
                        "internalType": "address",
                        "name": "ownerAddress",
                        "type": "address"
                    },
                    {
                        "indexed": false,
                        "internalType": "address",
                        "name": "recipientAddress",
                        "type": "address"
                    },
                    {
                        "indexed": false,
                        "internalType": "uint256",
                        "name": "amount",
                        "type": "uint256"
                    }
                ],
                "name": "KyberBridgeTokenTransfer",
                "type": "event"
            },
            {
                "anonymous": false,
                "inputs": [
                    {
                        "indexed": false,
                        "internalType": "uint256",
                        "name": "msgValue",
                        "type": "uint256"
                    },
                    {
                        "indexed": false,
                        "internalType": "address",
                        "name": "sellTokenAddress",
                        "type": "address"
                    },
                    {
                        "indexed": false,
                        "internalType": "uint256",
                        "name": "sellAmount",
                        "type": "uint256"
                    },
                    {
                        "indexed": false,
                        "internalType": "address",
                        "name": "buyTokenAddress",
                        "type": "address"
                    },
                    {
                        "indexed": false,
                        "internalType": "address payable",
                        "name": "recipientAddress",
                        "type": "address"
                    },
                    {
                        "indexed": false,
                        "internalType": "uint256",
                        "name": "maxBuyTokenAmount",
                        "type": "uint256"
                    },
                    {
                        "indexed": false,
                        "internalType": "uint256",
                        "name": "minConversionRate",
                        "type": "uint256"
                    },
                    {
                        "indexed": false,
                        "internalType": "address",
                        "name": "walletId",
                        "type": "address"
                    }
                ],
                "name": "KyberBridgeTrade",
                "type": "event"
            },
            {
                "anonymous": false,
                "inputs": [
                    {
                        "indexed": false,
                        "internalType": "uint256",
                        "name": "msgValue",
                        "type": "uint256"
                    },
                    {
                        "indexed": false,
                        "internalType": "address",
                        "name": "ownerAddress",
                        "type": "address"
                    },
                    {
                        "indexed": false,
                        "internalType": "uint256",
                        "name": "amount",
                        "type": "uint256"
                    }
                ],
                "name": "KyberBridgeWethDeposit",
                "type": "event"
            },
            {
                "anonymous": false,
                "inputs": [
                    {
                        "indexed": false,
                        "internalType": "address",
                        "name": "ownerAddress",
                        "type": "address"
                    },
                    {
                        "indexed": false,
                        "internalType": "uint256",
                        "name": "amount",
                        "type": "uint256"
                    }
                ],
                "name": "KyberBridgeWethWithdraw",
                "type": "event"
            },
            {
                "payable": true,
                "stateMutability": "payable",
                "type": "fallback"
            },
            {
                "constant": true,
                "inputs": [],
                "name": "KYBER_ETH_ADDRESS",
                "outputs": [
                    {
                        "internalType": "address",
                        "name": "",
                        "type": "address"
                    }
                ],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    {
                        "internalType": "address",
                        "name": "toTokenAddress",
                        "type": "address"
                    },
                    {
                        "internalType": "address",
                        "name": "from",
                        "type": "address"
                    },
                    {
                        "internalType": "address",
                        "name": "to",
                        "type": "address"
                    },
                    {
                        "internalType": "uint256",
                        "name": "amount",
                        "type": "uint256"
                    },
                    {
                        "internalType": "bytes",
                        "name": "bridgeData",
                        "type": "bytes"
                    }
                ],
                "name": "bridgeTransferFrom",
                "outputs": [
                    {
                        "internalType": "bytes4",
                        "name": "success",
                        "type": "bytes4"
                    }
                ],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    {
                        "internalType": "uint8",
                        "name": "decimals",
                        "type": "uint8"
                    }
                ],
                "name": "createToken",
                "outputs": [
                    {
                        "internalType": "address",
                        "name": "tokenAddress",
                        "type": "address"
                    }
                ],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    {
                        "internalType": "address",
                        "name": "tokenAddress",
                        "type": "address"
                    },
                    {
                        "internalType": "address",
                        "name": "ownerAddress",
                        "type": "address"
                    },
                    {
                        "internalType": "uint256",
                        "name": "amount",
                        "type": "uint256"
                    }
                ],
                "name": "grantTokensTo",
                "outputs": [],
                "payable": true,
                "stateMutability": "payable",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [
                    {
                        "internalType": "bytes32",
                        "name": "",
                        "type": "bytes32"
                    },
                    {
                        "internalType": "bytes",
                        "name": "",
                        "type": "bytes"
                    }
                ],
                "name": "isValidSignature",
                "outputs": [
                    {
                        "internalType": "bytes4",
                        "name": "magicValue",
                        "type": "bytes4"
                    }
                ],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    {
                        "internalType": "uint256",
                        "name": "amount",
                        "type": "uint256"
                    }
                ],
                "name": "setNextFillAmount",
                "outputs": [],
                "payable": true,
                "stateMutability": "payable",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    {
                        "internalType": "address",
                        "name": "ownerAddress",
                        "type": "address"
                    },
                    {
                        "internalType": "address",
                        "name": "spenderAddress",
                        "type": "address"
                    },
                    {
                        "internalType": "uint256",
                        "name": "allowance",
                        "type": "uint256"
                    }
                ],
                "name": "tokenApprove",
                "outputs": [
                    {
                        "internalType": "bool",
                        "name": "success",
                        "type": "bool"
                    }
                ],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [
                    {
                        "internalType": "address",
                        "name": "ownerAddress",
                        "type": "address"
                    }
                ],
                "name": "tokenBalanceOf",
                "outputs": [
                    {
                        "internalType": "uint256",
                        "name": "balance",
                        "type": "uint256"
                    }
                ],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    {
                        "internalType": "address",
                        "name": "ownerAddress",
                        "type": "address"
                    },
                    {
                        "internalType": "address",
                        "name": "recipientAddress",
                        "type": "address"
                    },
                    {
                        "internalType": "uint256",
                        "name": "amount",
                        "type": "uint256"
                    }
                ],
                "name": "tokenTransfer",
                "outputs": [
                    {
                        "internalType": "bool",
                        "name": "success",
                        "type": "bool"
                    }
                ],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    {
                        "internalType": "address",
                        "name": "sellTokenAddress",
                        "type": "address"
                    },
                    {
                        "internalType": "uint256",
                        "name": "sellAmount",
                        "type": "uint256"
                    },
                    {
                        "internalType": "address",
                        "name": "buyTokenAddress",
                        "type": "address"
                    },
                    {
                        "internalType": "address payable",
                        "name": "recipientAddress",
                        "type": "address"
                    },
                    {
                        "internalType": "uint256",
                        "name": "maxBuyTokenAmount",
                        "type": "uint256"
                    },
                    {
                        "internalType": "uint256",
                        "name": "minConversionRate",
                        "type": "uint256"
                    },
                    {
                        "internalType": "address",
                        "name": "walletId",
                        "type": "address"
                    }
                ],
                "name": "trade",
                "outputs": [
                    {
                        "internalType": "uint256",
                        "name": "boughtAmount",
                        "type": "uint256"
                    }
                ],
                "payable": true,
                "stateMutability": "payable",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    {
                        "internalType": "address",
                        "name": "sellTokenAddress",
                        "type": "address"
                    },
                    {
                        "internalType": "uint256",
                        "name": "sellAmount",
                        "type": "uint256"
                    },
                    {
                        "internalType": "address",
                        "name": "buyTokenAddress",
                        "type": "address"
                    },
                    {
                        "internalType": "address payable",
                        "name": "recipientAddress",
                        "type": "address"
                    },
                    {
                        "internalType": "uint256",
                        "name": "maxBuyTokenAmount",
                        "type": "uint256"
                    },
                    {
                        "internalType": "uint256",
                        "name": "minConversionRate",
                        "type": "uint256"
                    },
                    {
                        "internalType": "address payable",
                        "name": "walletId",
                        "type": "address"
                    },
                    {
                        "internalType": "bytes",
                        "name": "hint",
                        "type": "bytes"
                    }
                ],
                "name": "tradeWithHint",
                "outputs": [
                    {
                        "internalType": "uint256",
                        "name": "boughtAmount",
                        "type": "uint256"
                    }
                ],
                "payable": true,
                "stateMutability": "payable",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [],
                "name": "weth",
                "outputs": [
                    {
                        "internalType": "contract IEtherToken",
                        "name": "",
                        "type": "address"
                    }
                ],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    {
                        "internalType": "address",
                        "name": "ownerAddress",
                        "type": "address"
                    }
                ],
                "name": "wethDeposit",
                "outputs": [],
                "payable": true,
                "stateMutability": "payable",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    {
                        "internalType": "address payable",
                        "name": "ownerAddress",
                        "type": "address"
                    },
                    {
                        "internalType": "uint256",
                        "name": "amount",
                        "type": "uint256"
                    }
                ],
                "name": "wethWithdraw",
                "outputs": [],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            }
        ],
        "devdoc": {
            "details": "KyberBridge overridden to mock tokens and implement IKyberBridge.",
            "methods": {
                "bridgeTransferFrom(address,address,address,uint256,bytes)": {
                    "details": "Callback for `IKyberBridge`. Tries to buy `amount` of      `toTokenAddress` tokens by selling the entirety of the opposing asset      to the `KyberNetworkProxy` contract, then transfers the bought      tokens to `to`.",
                    "params": {
                        "amount": "Minimum amount of `toTokenAddress` tokens to buy.",
                        "bridgeData": "The abi-encoeded \"from\" token address.",
                        "from": "The maker (this contract).",
                        "to": "The recipient of the bought tokens.",
                        "toTokenAddress": "The token to give to `to`."
                    },
                    "return": "success The magic bytes if successful."
                },
                "isValidSignature(bytes32,bytes)": {
                    "details": "`SignatureType.Wallet` callback, so that this bridge can be the maker      and sign for itself in orders. Always succeeds.",
                    "return": "magicValue Magic success bytes, always."
                },
                "trade(address,uint256,address,address,uint256,uint256,address)": {
                    "details": "Implementation of `IKyberNetworkProxy.trade()`"
                }
            }
        },
        "evm": {
            "bytecode": {
                "linkReferences": {},
                "object": "0x608060405234801561001057600080fd5b50601260405161001f9061006b565b6100299190610079565b604051809103906000f080158015610045573d6000803e3d6000fd5b50600080546001600160a01b0319166001600160a01b0392909216919091179055610087565b6106a0806200202a83390190565b60ff91909116815260200190565b611f9380620000976000396000f3fe6080604052600436106100dd5760003560e01c806363b5ac411161007f578063cb3c28c711610059578063cb3c28c71461021d578063d08533d014610230578063e42c08f214610250578063fb3f4d2914610270576100dd565b806363b5ac41146101d757806365c53a03146101ea578063c2df82e6146101fd576100dd565b806329589f61116100bb57806329589f611461016057806329f7fc9e146101805780633fc8cef3146101a25780635aed4ec3146101b7576100dd565b806315eaef6b146100ea5780631626ba7e1461012057806320b6d5bc1461014d575b36156100e857600080fd5b005b3480156100f657600080fd5b5061010a61010536600461132c565b610290565b60405161011791906116f9565b60405180910390f35b34801561012c57600080fd5b5061014061013b3660046114b1565b61031d565b6040516101179190611704565b6100e861015b36600461132c565b610345565b61017361016e3660046113e6565b610400565b60405161011791906117c1565b34801561018c57600080fd5b50610195610458565b6040516101179190611568565b3480156101ae57600080fd5b50610195610470565b3480156101c357600080fd5b506101956101d236600461152b565b61048c565b6100e86101e5366004611194565b6104c8565b6100e86101f83660046114fb565b61057b565b34801561020957600080fd5b506101406102183660046112a9565b6105e3565b61017361022b36600461136c565b610b68565b34801561023c57600080fd5b506100e861024b36600461127e565b610bbe565b34801561025c57600080fd5b5061017361026b366004611194565b610cb4565b34801561027c57600080fd5b5061010a61028b36600461132c565b610ce9565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff888116855292528083208054869003905590851682528082208054850190555190917f585bc061c1fb99029ae845359d195a4e868890b2566636c927533576e9a89f619161030b9190879087908790611589565b60405180910390a15060019392505050565b7fb0671381000000000000000000000000000000000000000000000000000000009392505050565b73ffffffffffffffffffffffffffffffffffffffff80841660008181526001602090815260408083208786168452909152812080548501905554909116146103b95760405133903480156108fc02916000818181858888f193505050501580156103b3573d6000803e3d6000fd5b506103fb565b8034146103fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103f29061178a565b60405180910390fd5b505050565b60007f59ac183f99ea1126881a40dad44fe910c20477829dc17810fc6b6d468aea52b2348b8b8b8b8b8b8b60405161043f9897969594939291906117f6565b60405180910390a1506002549998505050505050505050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b60008160405161049b906110c1565b6104a59190611845565b604051809103906000f0801580156104c1573d6000803e3d6000fd5b5092915050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610519576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103f290611753565b60005461053d9073ffffffffffffffffffffffffffffffffffffffff168234610345565b7f493b326af1902255740bfd4716a9196f808baee3482695e1cc52bf038d12f60d348234604051610570939291906117ca565b60405180910390a150565b34156105de573481146105ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103f29061178a565b6000546105de9073ffffffffffffffffffffffffffffffffffffffff163034610345565b600255565b60006105ed6110ce565b6105f5610d20565b73ffffffffffffffffffffffffffffffffffffffff168152610615610d24565b73ffffffffffffffffffffffffffffffffffffffff16602082015261063c838501856111b0565b60c083015273ffffffffffffffffffffffffffffffffffffffff166040808301829052517f70a082310000000000000000000000000000000000000000000000000000000081526370a0823190610697903090600401611568565b60206040518083038186803b1580156106af57600080fd5b505afa1580156106c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506106e79190810190611513565b606082018190526106fc575060009050610b5e565b8773ffffffffffffffffffffffffffffffffffffffff16816040015173ffffffffffffffffffffffffffffffffffffffff161415610770576107478160400151878360600151610d40565b507fdc1600f3000000000000000000000000000000000000000000000000000000009050610b5e565b806020015173ffffffffffffffffffffffffffffffffffffffff16816040015173ffffffffffffffffffffffffffffffffffffffff1614156108625773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee604082810191909152606082015160808301819052602083015191517f2e1a7d4d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90921691632e1a7d4d9161082b916004016117c1565b600060405180830381600087803b15801561084557600080fd5b505af1158015610859573d6000803e3d6000fd5b50505050610879565b610879816040015182600001518360600151610e07565b6000816020015173ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff161490506000826000015173ffffffffffffffffffffffffffffffffffffffff166329589f61846080015185604001518660600151866108ec578e610902565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee5b8761090d578d61090f565b305b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600160008c60c001516040518a63ffffffff1660e01b815260040161095c989796959493929190611654565b6020604051808303818588803b15801561097557600080fd5b505af1158015610989573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052506109ae9190810190611513565b90508115610aae57826020015173ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015610a0257600080fd5b505af1158015610a16573d6000803e3d6000fd5b5050505050826020015173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb89836040518363ffffffff1660e01b8152600401610a5a9291906115c0565b602060405180830381600087803b158015610a7457600080fd5b505af1158015610a88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610aac9190810190611491565b505b60408301517f349fc08071558d8e3aa92dec9396e4e9f2dfecd6bb9065759d1932e7da43b8a99073ffffffffffffffffffffffffffffffffffffffff1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14610b0f578360400151610b15565b83602001515b6060850151604051610b2f92918e9186908f908f9061160d565b60405180910390a1507fdc1600f300000000000000000000000000000000000000000000000000000000925050505b9695505050505050565b60007f59ac183f99ea1126881a40dad44fe910c20477829dc17810fc6b6d468aea52b23489898989898989604051610ba79897969594939291906117f6565b60405180910390a150600254979650505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610c0f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103f290611753565b6000805473ffffffffffffffffffffffffffffffffffffffff9081168252600160209081526040808420928616808552929091528083208054859003905551909183156108fc02918491818181858888f19350505050158015610c76573d6000803e3d6000fd5b507ff952181f7dc65f02b4be7610895c88da3f0ae66b3a0109ad34efdbd9a74d039d8282604051610ca89291906115c0565b60405180910390a15050565b33600090815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff949094168352929052205490565b60007f9eba1462601f8272038ef8765c03e22d58589df272104d304d4fe8e2c92cab153385858560405161030b9493929190611589565b3090565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b6040516060907fa9059cbb0000000000000000000000000000000000000000000000000000000090610d7890859085906024016115c0565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050610e018482610ede565b50505050565b6040517fdd62ed3e000000000000000000000000000000000000000000000000000000008152819073ffffffffffffffffffffffffffffffffffffffff85169063dd62ed3e90610e5d90309087906004016115e6565b60206040518083038186803b158015610e7557600080fd5b505afa158015610e89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610ead9190810190611513565b10156103fb576103fb83837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610f9a565b600060608373ffffffffffffffffffffffffffffffffffffffff1683604051610f07919061154c565b6000604051808303816000865af19150503d8060008114610f44576040519150601f19603f3d011682016040523d82523d6000602084013e610f49565b606091505b50915091508115610f8d578051610f61575050610f96565b805160201415610f8d576000610f78826000610fd2565b90508060011415610f8b57505050610f96565b505b610e0181610fe5565b5050565b6040516060907f095ea7b30000000000000000000000000000000000000000000000000000000090610d7890859085906024016115c0565b6000610fde8383610fed565b9392505050565b805160208201fd5b600081602001835110156110135761101361100e600585518560200161101c565b610fe5565b50016020015190565b6060632800659560e01b84848460405160240161103b93929190611731565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290509392505050565b6106a0806118b183390190565b6040518060e00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815260200160008152602001606081525090565b60008083601f84011261115e578182fd5b50813567ffffffffffffffff811115611175578182fd5b60208301915083602082850101111561118d57600080fd5b9250929050565b6000602082840312156111a5578081fd5b8135610fde8161188b565b600080604083850312156111c2578081fd5b82356111cd8161188b565b9150602083013567ffffffffffffffff808211156111e9578283fd5b81850186601f8201126111fa578384fd5b803592508183111561120a578384fd5b60405160207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8601168201018181108482111715611248578586fd5b60405283815281840160200188101561125f578485fd5b611270846020830160208501611853565b809450505050509250929050565b60008060408385031215611290578182fd5b823561129b8161188b565b946020939093013593505050565b60008060008060008060a087890312156112c1578182fd5b86356112cc8161188b565b955060208701356112dc8161188b565b945060408701356112ec8161188b565b935060608701359250608087013567ffffffffffffffff81111561130e578283fd5b61131a89828a0161114d565b979a9699509497509295939492505050565b600080600060608486031215611340578283fd5b833561134b8161188b565b9250602084013561135b8161188b565b929592945050506040919091013590565b600080600080600080600060e0888a031215611386578081fd5b87356113918161188b565b96506020880135955060408801356113a88161188b565b945060608801356113b88161188b565b93506080880135925060a0880135915060c08801356113d68161188b565b8091505092959891949750929550565b60008060008060008060008060006101008a8c031215611404578182fd5b893561140f8161188b565b985060208a0135975060408a01356114268161188b565b965060608a01356114368161188b565b955060808a0135945060a08a0135935060c08a01356114548161188b565b925060e08a013567ffffffffffffffff81111561146f578283fd5b61147b8c828d0161114d565b8194508093505050509295985092959850929598565b6000602082840312156114a2578081fd5b81518015158114610fde578182fd5b6000806000604084860312156114c5578283fd5b83359250602084013567ffffffffffffffff8111156114e2578283fd5b6114ee8682870161114d565b9497909650939450505050565b60006020828403121561150c578081fd5b5035919050565b600060208284031215611524578081fd5b5051919050565b60006020828403121561153c578081fd5b813560ff81168114610fde578182fd5b6000825161155e81846020870161185f565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff9485168152928416602084015292166040820152606081019190915260800190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff96871681529486166020860152604085019390935260608401919091528316608083015290911660a082015260c00190565b600061010073ffffffffffffffffffffffffffffffffffffffff808c1684528a6020850152808a16604085015280891660608501528760808501528660a085015280861660c0850152508060e08401528351808285015261012091506116c0818386016020880161185f565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092019091019998505050505050505050565b901515815260200190565b7fffffffff0000000000000000000000000000000000000000000000000000000091909116815260200190565b606081016008851061173f57fe5b938152602081019290925260409091015290565b60208082526009908201527f4f4e4c595f574554480000000000000000000000000000000000000000000000604082015260600190565b60208082526015908201527f56414c55455f414d4f554e545f4d49534d415443480000000000000000000000604082015260600190565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff919091166020830152604082015260600190565b97885273ffffffffffffffffffffffffffffffffffffffff968716602089015260408801959095529285166060870152908416608086015260a085015260c08401521660e08201526101000190565b60ff91909116815260200190565b82818337506000910152565b60005b8381101561187a578181015183820152602001611862565b83811115610e015750506000910152565b73ffffffffffffffffffffffffffffffffffffffff811681146118ad57600080fd5b5056fe608060405234801561001057600080fd5b506040516106a03803806106a083398101604081905261002f91610059565b6000805460ff191660ff9290921691909117610100600160a81b0319166101003302179055610081565b60006020828403121561006a578081fd5b815160ff8116811461007a578182fd5b9392505050565b610610806100906000396000f3fe6080604052600436106100705760003560e01c806370a082311161004e57806370a08231146100ef578063a9059cbb1461011c578063d0e30db01461013c578063dd62ed3e1461014457610070565b8063095ea7b3146100755780632e1a7d4d146100ab578063313ce567146100cd575b600080fd5b34801561008157600080fd5b506100956100903660046104b2565b610164565b6040516100a291906105ab565b60405180910390f35b3480156100b757600080fd5b506100cb6100c6366004610503565b61021e565b005b3480156100d957600080fd5b506100e26102af565b6040516100a291906105bf565b3480156100fb57600080fd5b5061010f61010a366004610463565b6102b8565b6040516100a291906105b6565b34801561012857600080fd5b506100956101373660046104b2565b610363565b6100cb6103c2565b34801561015057600080fd5b5061010f61015f36600461047e565b610437565b600080546040517ffb3f4d2900000000000000000000000000000000000000000000000000000000815261010090910473ffffffffffffffffffffffffffffffffffffffff169063fb3f4d29906101c390339087908790600401610554565b602060405180830381600087803b1580156101dd57600080fd5b505af11580156101f1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061021591908101906104dc565b90505b92915050565b6000546040517fd08533d000000000000000000000000000000000000000000000000000000000815261010090910473ffffffffffffffffffffffffffffffffffffffff169063d08533d09061027a9033908590600401610585565b600060405180830381600087803b15801561029457600080fd5b505af11580156102a8573d6000803e3d6000fd5b5050505050565b60005460ff1681565b600080546040517fe42c08f200000000000000000000000000000000000000000000000000000000815261010090910473ffffffffffffffffffffffffffffffffffffffff169063e42c08f290610313908590600401610533565b60206040518083038186803b15801561032b57600080fd5b505afa15801561033f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610218919081019061051b565b600080546040517f15eaef6b00000000000000000000000000000000000000000000000000000000815261010090910473ffffffffffffffffffffffffffffffffffffffff16906315eaef6b906101c390339087908790600401610554565b6000546040517f63b5ac4100000000000000000000000000000000000000000000000000000000815261010090910473ffffffffffffffffffffffffffffffffffffffff16906363b5ac4190349061041e903390600401610533565b6000604051808303818588803b15801561029457600080fd5b600092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461021857600080fd5b600060208284031215610474578081fd5b610215838361043f565b60008060408385031215610490578081fd5b61049a848461043f565b91506104a9846020850161043f565b90509250929050565b600080604083850312156104c4578182fd5b6104ce848461043f565b946020939093013593505050565b6000602082840312156104ed578081fd5b815180151581146104fc578182fd5b9392505050565b600060208284031215610514578081fd5b5035919050565b60006020828403121561052c578081fd5b5051919050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b901515815260200190565b90815260200190565b60ff9190911681526020019056fea365627a7a723158200173a8e486c52745246cbc85f97b01353fa40436f235d3317b6d0d8ea9737c396c6578706572696d656e74616cf564736f6c63430005110040a365627a7a723158202bc32c9a08b9b7b14e08eff638b1d682d2905a97c99056af326e7155d086d1676c6578706572696d656e74616cf564736f6c63430005110040608060405234801561001057600080fd5b506040516106a03803806106a083398101604081905261002f91610059565b6000805460ff191660ff9290921691909117610100600160a81b0319166101003302179055610081565b60006020828403121561006a578081fd5b815160ff8116811461007a578182fd5b9392505050565b610610806100906000396000f3fe6080604052600436106100705760003560e01c806370a082311161004e57806370a08231146100ef578063a9059cbb1461011c578063d0e30db01461013c578063dd62ed3e1461014457610070565b8063095ea7b3146100755780632e1a7d4d146100ab578063313ce567146100cd575b600080fd5b34801561008157600080fd5b506100956100903660046104b2565b610164565b6040516100a291906105ab565b60405180910390f35b3480156100b757600080fd5b506100cb6100c6366004610503565b61021e565b005b3480156100d957600080fd5b506100e26102af565b6040516100a291906105bf565b3480156100fb57600080fd5b5061010f61010a366004610463565b6102b8565b6040516100a291906105b6565b34801561012857600080fd5b506100956101373660046104b2565b610363565b6100cb6103c2565b34801561015057600080fd5b5061010f61015f36600461047e565b610437565b600080546040517ffb3f4d2900000000000000000000000000000000000000000000000000000000815261010090910473ffffffffffffffffffffffffffffffffffffffff169063fb3f4d29906101c390339087908790600401610554565b602060405180830381600087803b1580156101dd57600080fd5b505af11580156101f1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061021591908101906104dc565b90505b92915050565b6000546040517fd08533d000000000000000000000000000000000000000000000000000000000815261010090910473ffffffffffffffffffffffffffffffffffffffff169063d08533d09061027a9033908590600401610585565b600060405180830381600087803b15801561029457600080fd5b505af11580156102a8573d6000803e3d6000fd5b5050505050565b60005460ff1681565b600080546040517fe42c08f200000000000000000000000000000000000000000000000000000000815261010090910473ffffffffffffffffffffffffffffffffffffffff169063e42c08f290610313908590600401610533565b60206040518083038186803b15801561032b57600080fd5b505afa15801561033f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610218919081019061051b565b600080546040517f15eaef6b00000000000000000000000000000000000000000000000000000000815261010090910473ffffffffffffffffffffffffffffffffffffffff16906315eaef6b906101c390339087908790600401610554565b6000546040517f63b5ac4100000000000000000000000000000000000000000000000000000000815261010090910473ffffffffffffffffffffffffffffffffffffffff16906363b5ac4190349061041e903390600401610533565b6000604051808303818588803b15801561029457600080fd5b600092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461021857600080fd5b600060208284031215610474578081fd5b610215838361043f565b60008060408385031215610490578081fd5b61049a848461043f565b91506104a9846020850161043f565b90509250929050565b600080604083850312156104c4578182fd5b6104ce848461043f565b946020939093013593505050565b6000602082840312156104ed578081fd5b815180151581146104fc578182fd5b9392505050565b600060208284031215610514578081fd5b5035919050565b60006020828403121561052c578081fd5b5051919050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b901515815260200190565b90815260200190565b60ff9190911681526020019056fea365627a7a723158200173a8e486c52745246cbc85f97b01353fa40436f235d3317b6d0d8ea9737c396c6578706572696d656e74616cf564736f6c63430005110040",
                "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x12 PUSH1 0x40 MLOAD PUSH2 0x1F SWAP1 PUSH2 0x6B JUMP JUMPDEST PUSH2 0x29 SWAP2 SWAP1 PUSH2 0x79 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 PUSH1 0x0 CREATE DUP1 ISZERO DUP1 ISZERO PUSH2 0x45 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH2 0x87 JUMP JUMPDEST PUSH2 0x6A0 DUP1 PUSH3 0x202A DUP4 CODECOPY ADD SWAP1 JUMP JUMPDEST PUSH1 0xFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH2 0x1F93 DUP1 PUSH3 0x97 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xDD JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x63B5AC41 GT PUSH2 0x7F JUMPI DUP1 PUSH4 0xCB3C28C7 GT PUSH2 0x59 JUMPI DUP1 PUSH4 0xCB3C28C7 EQ PUSH2 0x21D JUMPI DUP1 PUSH4 0xD08533D0 EQ PUSH2 0x230 JUMPI DUP1 PUSH4 0xE42C08F2 EQ PUSH2 0x250 JUMPI DUP1 PUSH4 0xFB3F4D29 EQ PUSH2 0x270 JUMPI PUSH2 0xDD JUMP JUMPDEST DUP1 PUSH4 0x63B5AC41 EQ PUSH2 0x1D7 JUMPI DUP1 PUSH4 0x65C53A03 EQ PUSH2 0x1EA JUMPI DUP1 PUSH4 0xC2DF82E6 EQ PUSH2 0x1FD JUMPI PUSH2 0xDD JUMP JUMPDEST DUP1 PUSH4 0x29589F61 GT PUSH2 0xBB JUMPI DUP1 PUSH4 0x29589F61 EQ PUSH2 0x160 JUMPI DUP1 PUSH4 0x29F7FC9E EQ PUSH2 0x180 JUMPI DUP1 PUSH4 0x3FC8CEF3 EQ PUSH2 0x1A2 JUMPI DUP1 PUSH4 0x5AED4EC3 EQ PUSH2 0x1B7 JUMPI PUSH2 0xDD JUMP JUMPDEST DUP1 PUSH4 0x15EAEF6B EQ PUSH2 0xEA JUMPI DUP1 PUSH4 0x1626BA7E EQ PUSH2 0x120 JUMPI DUP1 PUSH4 0x20B6D5BC EQ PUSH2 0x14D JUMPI JUMPDEST CALLDATASIZE ISZERO PUSH2 0xE8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xF6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x10A PUSH2 0x105 CALLDATASIZE PUSH1 0x4 PUSH2 0x132C JUMP JUMPDEST PUSH2 0x290 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x117 SWAP2 SWAP1 PUSH2 0x16F9 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x12C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x140 PUSH2 0x13B CALLDATASIZE PUSH1 0x4 PUSH2 0x14B1 JUMP JUMPDEST PUSH2 0x31D JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x117 SWAP2 SWAP1 PUSH2 0x1704 JUMP JUMPDEST PUSH2 0xE8 PUSH2 0x15B CALLDATASIZE PUSH1 0x4 PUSH2 0x132C JUMP JUMPDEST PUSH2 0x345 JUMP JUMPDEST PUSH2 0x173 PUSH2 0x16E CALLDATASIZE PUSH1 0x4 PUSH2 0x13E6 JUMP JUMPDEST PUSH2 0x400 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x117 SWAP2 SWAP1 PUSH2 0x17C1 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x18C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x195 PUSH2 0x458 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x117 SWAP2 SWAP1 PUSH2 0x1568 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1AE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x195 PUSH2 0x470 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1C3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x195 PUSH2 0x1D2 CALLDATASIZE PUSH1 0x4 PUSH2 0x152B JUMP JUMPDEST PUSH2 0x48C JUMP JUMPDEST PUSH2 0xE8 PUSH2 0x1E5 CALLDATASIZE PUSH1 0x4 PUSH2 0x1194 JUMP JUMPDEST PUSH2 0x4C8 JUMP JUMPDEST PUSH2 0xE8 PUSH2 0x1F8 CALLDATASIZE PUSH1 0x4 PUSH2 0x14FB JUMP JUMPDEST PUSH2 0x57B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x209 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x140 PUSH2 0x218 CALLDATASIZE PUSH1 0x4 PUSH2 0x12A9 JUMP JUMPDEST PUSH2 0x5E3 JUMP JUMPDEST PUSH2 0x173 PUSH2 0x22B CALLDATASIZE PUSH1 0x4 PUSH2 0x136C JUMP JUMPDEST PUSH2 0xB68 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x23C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xE8 PUSH2 0x24B CALLDATASIZE PUSH1 0x4 PUSH2 0x127E JUMP JUMPDEST PUSH2 0xBBE JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x25C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x173 PUSH2 0x26B CALLDATASIZE PUSH1 0x4 PUSH2 0x1194 JUMP JUMPDEST PUSH2 0xCB4 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x27C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x10A PUSH2 0x28B CALLDATASIZE PUSH1 0x4 PUSH2 0x132C JUMP JUMPDEST PUSH2 0xCE9 JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 DUP2 AND DUP6 MSTORE SWAP3 MSTORE DUP1 DUP4 KECCAK256 DUP1 SLOAD DUP7 SWAP1 SUB SWAP1 SSTORE SWAP1 DUP6 AND DUP3 MSTORE DUP1 DUP3 KECCAK256 DUP1 SLOAD DUP6 ADD SWAP1 SSTORE MLOAD SWAP1 SWAP2 PUSH32 0x585BC061C1FB99029AE845359D195A4E868890B2566636C927533576E9A89F61 SWAP2 PUSH2 0x30B SWAP2 SWAP1 DUP8 SWAP1 DUP8 SWAP1 DUP8 SWAP1 PUSH2 0x1589 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP PUSH1 0x1 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH32 0xB067138100000000000000000000000000000000000000000000000000000000 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP8 DUP7 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE DUP2 KECCAK256 DUP1 SLOAD DUP6 ADD SWAP1 SSTORE SLOAD SWAP1 SWAP2 AND EQ PUSH2 0x3B9 JUMPI PUSH1 0x40 MLOAD CALLER SWAP1 CALLVALUE DUP1 ISZERO PUSH2 0x8FC MUL SWAP2 PUSH1 0x0 DUP2 DUP2 DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0x3B3 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP PUSH2 0x3FB JUMP JUMPDEST DUP1 CALLVALUE EQ PUSH2 0x3FB JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x3F2 SWAP1 PUSH2 0x178A JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH32 0x59AC183F99EA1126881A40DAD44FE910C20477829DC17810FC6B6D468AEA52B2 CALLVALUE DUP12 DUP12 DUP12 DUP12 DUP12 DUP12 DUP12 PUSH1 0x40 MLOAD PUSH2 0x43F SWAP9 SWAP8 SWAP7 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x17F6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP PUSH1 0x2 SLOAD SWAP10 SWAP9 POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH20 0xEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x40 MLOAD PUSH2 0x49B SWAP1 PUSH2 0x10C1 JUMP JUMPDEST PUSH2 0x4A5 SWAP2 SWAP1 PUSH2 0x1845 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 PUSH1 0x0 CREATE DUP1 ISZERO DUP1 ISZERO PUSH2 0x4C1 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x519 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x3F2 SWAP1 PUSH2 0x1753 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x53D SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP3 CALLVALUE PUSH2 0x345 JUMP JUMPDEST PUSH32 0x493B326AF1902255740BFD4716A9196F808BAEE3482695E1CC52BF038D12F60D CALLVALUE DUP3 CALLVALUE PUSH1 0x40 MLOAD PUSH2 0x570 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x17CA JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP JUMP JUMPDEST CALLVALUE ISZERO PUSH2 0x5DE JUMPI CALLVALUE DUP2 EQ PUSH2 0x5BA JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x3F2 SWAP1 PUSH2 0x178A JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x5DE SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ADDRESS CALLVALUE PUSH2 0x345 JUMP JUMPDEST PUSH1 0x2 SSTORE JUMP JUMPDEST PUSH1 0x0 PUSH2 0x5ED PUSH2 0x10CE JUMP JUMPDEST PUSH2 0x5F5 PUSH2 0xD20 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH2 0x615 PUSH2 0xD24 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x63C DUP4 DUP6 ADD DUP6 PUSH2 0x11B0 JUMP JUMPDEST PUSH1 0xC0 DUP4 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x40 DUP1 DUP4 ADD DUP3 SWAP1 MSTORE MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH4 0x70A08231 SWAP1 PUSH2 0x697 SWAP1 ADDRESS SWAP1 PUSH1 0x4 ADD PUSH2 0x1568 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x6AF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x6C3 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x6E7 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x1513 JUMP JUMPDEST PUSH1 0x60 DUP3 ADD DUP2 SWAP1 MSTORE PUSH2 0x6FC JUMPI POP PUSH1 0x0 SWAP1 POP PUSH2 0xB5E JUMP JUMPDEST DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 PUSH1 0x40 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x770 JUMPI PUSH2 0x747 DUP2 PUSH1 0x40 ADD MLOAD DUP8 DUP4 PUSH1 0x60 ADD MLOAD PUSH2 0xD40 JUMP JUMPDEST POP PUSH32 0xDC1600F300000000000000000000000000000000000000000000000000000000 SWAP1 POP PUSH2 0xB5E JUMP JUMPDEST DUP1 PUSH1 0x20 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 PUSH1 0x40 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x862 JUMPI PUSH20 0xEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE PUSH1 0x40 DUP3 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 DUP3 ADD MLOAD PUSH1 0x80 DUP4 ADD DUP2 SWAP1 MSTORE PUSH1 0x20 DUP4 ADD MLOAD SWAP2 MLOAD PUSH32 0x2E1A7D4D00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND SWAP2 PUSH4 0x2E1A7D4D SWAP2 PUSH2 0x82B SWAP2 PUSH1 0x4 ADD PUSH2 0x17C1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x845 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x859 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH2 0x879 JUMP JUMPDEST PUSH2 0x879 DUP2 PUSH1 0x40 ADD MLOAD DUP3 PUSH1 0x0 ADD MLOAD DUP4 PUSH1 0x60 ADD MLOAD PUSH2 0xE07 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x20 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP10 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 POP PUSH1 0x0 DUP3 PUSH1 0x0 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x29589F61 DUP5 PUSH1 0x80 ADD MLOAD DUP6 PUSH1 0x40 ADD MLOAD DUP7 PUSH1 0x60 ADD MLOAD DUP7 PUSH2 0x8EC JUMPI DUP15 PUSH2 0x902 JUMP JUMPDEST PUSH20 0xEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE JUMPDEST DUP8 PUSH2 0x90D JUMPI DUP14 PUSH2 0x90F JUMP JUMPDEST ADDRESS JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x1 PUSH1 0x0 DUP13 PUSH1 0xC0 ADD MLOAD PUSH1 0x40 MLOAD DUP11 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x95C SWAP9 SWAP8 SWAP7 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x1654 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x975 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x989 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x9AE SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x1513 JUMP JUMPDEST SWAP1 POP DUP2 ISZERO PUSH2 0xAAE JUMPI DUP3 PUSH1 0x20 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xD0E30DB0 DUP3 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xA02 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xA16 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP DUP3 PUSH1 0x20 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xA9059CBB DUP10 DUP4 PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xA5A SWAP3 SWAP2 SWAP1 PUSH2 0x15C0 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xA74 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xA88 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0xAAC SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x1491 JUMP JUMPDEST POP JUMPDEST PUSH1 0x40 DUP4 ADD MLOAD PUSH32 0x349FC08071558D8E3AA92DEC9396E4E9F2DFECD6BB9065759D1932E7DA43B8A9 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE EQ PUSH2 0xB0F JUMPI DUP4 PUSH1 0x40 ADD MLOAD PUSH2 0xB15 JUMP JUMPDEST DUP4 PUSH1 0x20 ADD MLOAD JUMPDEST PUSH1 0x60 DUP6 ADD MLOAD PUSH1 0x40 MLOAD PUSH2 0xB2F SWAP3 SWAP2 DUP15 SWAP2 DUP7 SWAP1 DUP16 SWAP1 DUP16 SWAP1 PUSH2 0x160D JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP PUSH32 0xDC1600F300000000000000000000000000000000000000000000000000000000 SWAP3 POP POP POP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH32 0x59AC183F99EA1126881A40DAD44FE910C20477829DC17810FC6B6D468AEA52B2 CALLVALUE DUP10 DUP10 DUP10 DUP10 DUP10 DUP10 DUP10 PUSH1 0x40 MLOAD PUSH2 0xBA7 SWAP9 SWAP8 SWAP7 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x17F6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP PUSH1 0x2 SLOAD SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0xC0F JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x3F2 SWAP1 PUSH2 0x1753 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND DUP3 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP3 DUP7 AND DUP1 DUP6 MSTORE SWAP3 SWAP1 SWAP2 MSTORE DUP1 DUP4 KECCAK256 DUP1 SLOAD DUP6 SWAP1 SUB SWAP1 SSTORE MLOAD SWAP1 SWAP2 DUP4 ISZERO PUSH2 0x8FC MUL SWAP2 DUP5 SWAP2 DUP2 DUP2 DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0xC76 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP PUSH32 0xF952181F7DC65F02B4BE7610895C88DA3F0AE66B3A0109AD34EFDBD9A74D039D DUP3 DUP3 PUSH1 0x40 MLOAD PUSH2 0xCA8 SWAP3 SWAP2 SWAP1 PUSH2 0x15C0 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH32 0x9EBA1462601F8272038EF8765C03E22D58589DF272104D304D4FE8E2C92CAB15 CALLER DUP6 DUP6 DUP6 PUSH1 0x40 MLOAD PUSH2 0x30B SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x1589 JUMP JUMPDEST ADDRESS SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x60 SWAP1 PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 SWAP1 PUSH2 0xD78 SWAP1 DUP6 SWAP1 DUP6 SWAP1 PUSH1 0x24 ADD PUSH2 0x15C0 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE SWAP1 POP PUSH2 0xE01 DUP5 DUP3 PUSH2 0xEDE JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xDD62ED3E00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE DUP2 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND SWAP1 PUSH4 0xDD62ED3E SWAP1 PUSH2 0xE5D SWAP1 ADDRESS SWAP1 DUP8 SWAP1 PUSH1 0x4 ADD PUSH2 0x15E6 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xE75 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xE89 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0xEAD SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x1513 JUMP JUMPDEST LT ISZERO PUSH2 0x3FB JUMPI PUSH2 0x3FB DUP4 DUP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xF9A JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH1 0x40 MLOAD PUSH2 0xF07 SWAP2 SWAP1 PUSH2 0x154C JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0xF44 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0xF49 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 ISZERO PUSH2 0xF8D JUMPI DUP1 MLOAD PUSH2 0xF61 JUMPI POP POP PUSH2 0xF96 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x20 EQ ISZERO PUSH2 0xF8D JUMPI PUSH1 0x0 PUSH2 0xF78 DUP3 PUSH1 0x0 PUSH2 0xFD2 JUMP JUMPDEST SWAP1 POP DUP1 PUSH1 0x1 EQ ISZERO PUSH2 0xF8B JUMPI POP POP POP PUSH2 0xF96 JUMP JUMPDEST POP JUMPDEST PUSH2 0xE01 DUP2 PUSH2 0xFE5 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x60 SWAP1 PUSH32 0x95EA7B300000000000000000000000000000000000000000000000000000000 SWAP1 PUSH2 0xD78 SWAP1 DUP6 SWAP1 DUP6 SWAP1 PUSH1 0x24 ADD PUSH2 0x15C0 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xFDE DUP4 DUP4 PUSH2 0xFED JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP1 MLOAD PUSH1 0x20 DUP3 ADD REVERT JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x20 ADD DUP4 MLOAD LT ISZERO PUSH2 0x1013 JUMPI PUSH2 0x1013 PUSH2 0x100E PUSH1 0x5 DUP6 MLOAD DUP6 PUSH1 0x20 ADD PUSH2 0x101C JUMP JUMPDEST PUSH2 0xFE5 JUMP JUMPDEST POP ADD PUSH1 0x20 ADD MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x60 PUSH4 0x28006595 PUSH1 0xE0 SHL DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x103B SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x1731 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE SWAP1 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x6A0 DUP1 PUSH2 0x18B1 DUP4 CODECOPY ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0xE0 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x115E JUMPI DUP2 DUP3 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1175 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x118D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x11A5 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0xFDE DUP2 PUSH2 0x188B JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x11C2 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x11CD DUP2 PUSH2 0x188B JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x11E9 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP2 DUP6 ADD DUP7 PUSH1 0x1F DUP3 ADD SLT PUSH2 0x11FA JUMPI DUP4 DUP5 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP3 POP DUP2 DUP4 GT ISZERO PUSH2 0x120A JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP7 ADD AND DUP3 ADD ADD DUP2 DUP2 LT DUP5 DUP3 GT OR ISZERO PUSH2 0x1248 JUMPI DUP6 DUP7 REVERT JUMPDEST PUSH1 0x40 MSTORE DUP4 DUP2 MSTORE DUP2 DUP5 ADD PUSH1 0x20 ADD DUP9 LT ISZERO PUSH2 0x125F JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH2 0x1270 DUP5 PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP6 ADD PUSH2 0x1853 JUMP JUMPDEST DUP1 SWAP5 POP POP POP POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1290 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x129B DUP2 PUSH2 0x188B JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xA0 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x12C1 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP7 CALLDATALOAD PUSH2 0x12CC DUP2 PUSH2 0x188B JUMP JUMPDEST SWAP6 POP PUSH1 0x20 DUP8 ADD CALLDATALOAD PUSH2 0x12DC DUP2 PUSH2 0x188B JUMP JUMPDEST SWAP5 POP PUSH1 0x40 DUP8 ADD CALLDATALOAD PUSH2 0x12EC DUP2 PUSH2 0x188B JUMP JUMPDEST SWAP4 POP PUSH1 0x60 DUP8 ADD CALLDATALOAD SWAP3 POP PUSH1 0x80 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x130E JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0x131A DUP10 DUP3 DUP11 ADD PUSH2 0x114D JUMP JUMPDEST SWAP8 SWAP11 SWAP7 SWAP10 POP SWAP5 SWAP8 POP SWAP3 SWAP6 SWAP4 SWAP5 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x1340 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x134B DUP2 PUSH2 0x188B JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x135B DUP2 PUSH2 0x188B JUMP JUMPDEST SWAP3 SWAP6 SWAP3 SWAP5 POP POP POP PUSH1 0x40 SWAP2 SWAP1 SWAP2 ADD CALLDATALOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xE0 DUP9 DUP11 SUB SLT ISZERO PUSH2 0x1386 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP8 CALLDATALOAD PUSH2 0x1391 DUP2 PUSH2 0x188B JUMP JUMPDEST SWAP7 POP PUSH1 0x20 DUP9 ADD CALLDATALOAD SWAP6 POP PUSH1 0x40 DUP9 ADD CALLDATALOAD PUSH2 0x13A8 DUP2 PUSH2 0x188B JUMP JUMPDEST SWAP5 POP PUSH1 0x60 DUP9 ADD CALLDATALOAD PUSH2 0x13B8 DUP2 PUSH2 0x188B JUMP JUMPDEST SWAP4 POP PUSH1 0x80 DUP9 ADD CALLDATALOAD SWAP3 POP PUSH1 0xA0 DUP9 ADD CALLDATALOAD SWAP2 POP PUSH1 0xC0 DUP9 ADD CALLDATALOAD PUSH2 0x13D6 DUP2 PUSH2 0x188B JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 SWAP6 SWAP9 SWAP2 SWAP5 SWAP8 POP SWAP3 SWAP6 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x100 DUP11 DUP13 SUB SLT ISZERO PUSH2 0x1404 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP10 CALLDATALOAD PUSH2 0x140F DUP2 PUSH2 0x188B JUMP JUMPDEST SWAP9 POP PUSH1 0x20 DUP11 ADD CALLDATALOAD SWAP8 POP PUSH1 0x40 DUP11 ADD CALLDATALOAD PUSH2 0x1426 DUP2 PUSH2 0x188B JUMP JUMPDEST SWAP7 POP PUSH1 0x60 DUP11 ADD CALLDATALOAD PUSH2 0x1436 DUP2 PUSH2 0x188B JUMP JUMPDEST SWAP6 POP PUSH1 0x80 DUP11 ADD CALLDATALOAD SWAP5 POP PUSH1 0xA0 DUP11 ADD CALLDATALOAD SWAP4 POP PUSH1 0xC0 DUP11 ADD CALLDATALOAD PUSH2 0x1454 DUP2 PUSH2 0x188B JUMP JUMPDEST SWAP3 POP PUSH1 0xE0 DUP11 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x146F JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0x147B DUP13 DUP3 DUP14 ADD PUSH2 0x114D JUMP JUMPDEST DUP2 SWAP5 POP DUP1 SWAP4 POP POP POP POP SWAP3 SWAP6 SWAP9 POP SWAP3 SWAP6 SWAP9 POP SWAP3 SWAP6 SWAP9 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x14A2 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0xFDE JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x40 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x14C5 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 CALLDATALOAD SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x14E2 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0x14EE DUP7 DUP3 DUP8 ADD PUSH2 0x114D JUMP JUMPDEST SWAP5 SWAP8 SWAP1 SWAP7 POP SWAP4 SWAP5 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x150C JUMPI DUP1 DUP2 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1524 JUMPI DUP1 DUP2 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x153C JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH1 0xFF DUP2 AND DUP2 EQ PUSH2 0xFDE JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH2 0x155E DUP2 DUP5 PUSH1 0x20 DUP8 ADD PUSH2 0x185F JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 DUP6 AND DUP2 MSTORE SWAP3 DUP5 AND PUSH1 0x20 DUP5 ADD MSTORE SWAP3 AND PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP4 AND DUP2 MSTORE SWAP2 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP7 DUP8 AND DUP2 MSTORE SWAP5 DUP7 AND PUSH1 0x20 DUP7 ADD MSTORE PUSH1 0x40 DUP6 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x60 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP4 AND PUSH1 0x80 DUP4 ADD MSTORE SWAP1 SWAP2 AND PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xC0 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x100 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP13 AND DUP5 MSTORE DUP11 PUSH1 0x20 DUP6 ADD MSTORE DUP1 DUP11 AND PUSH1 0x40 DUP6 ADD MSTORE DUP1 DUP10 AND PUSH1 0x60 DUP6 ADD MSTORE DUP8 PUSH1 0x80 DUP6 ADD MSTORE DUP7 PUSH1 0xA0 DUP6 ADD MSTORE DUP1 DUP7 AND PUSH1 0xC0 DUP6 ADD MSTORE POP DUP1 PUSH1 0xE0 DUP5 ADD MSTORE DUP4 MLOAD DUP1 DUP3 DUP6 ADD MSTORE PUSH2 0x120 SWAP2 POP PUSH2 0x16C0 DUP2 DUP4 DUP7 ADD PUSH1 0x20 DUP9 ADD PUSH2 0x185F JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP3 SWAP1 SWAP3 ADD SWAP1 SWAP2 ADD SWAP10 SWAP9 POP POP POP POP POP POP POP POP POP JUMP JUMPDEST SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH1 0x8 DUP6 LT PUSH2 0x173F JUMPI INVALID JUMPDEST SWAP4 DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x40 SWAP1 SWAP2 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x9 SWAP1 DUP3 ADD MSTORE PUSH32 0x4F4E4C595F574554480000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x15 SWAP1 DUP3 ADD MSTORE PUSH32 0x56414C55455F414D4F554E545F4D49534D415443480000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 DUP4 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST SWAP8 DUP9 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP7 DUP8 AND PUSH1 0x20 DUP10 ADD MSTORE PUSH1 0x40 DUP9 ADD SWAP6 SWAP1 SWAP6 MSTORE SWAP3 DUP6 AND PUSH1 0x60 DUP8 ADD MSTORE SWAP1 DUP5 AND PUSH1 0x80 DUP7 ADD MSTORE PUSH1 0xA0 DUP6 ADD MSTORE PUSH1 0xC0 DUP5 ADD MSTORE AND PUSH1 0xE0 DUP3 ADD MSTORE PUSH2 0x100 ADD SWAP1 JUMP JUMPDEST PUSH1 0xFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x187A JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1862 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0xE01 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x18AD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH2 0x6A0 CODESIZE SUB DUP1 PUSH2 0x6A0 DUP4 CODECOPY DUP2 ADD PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH2 0x2F SWAP2 PUSH2 0x59 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0xFF SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR PUSH2 0x100 PUSH1 0x1 PUSH1 0xA8 SHL SUB NOT AND PUSH2 0x100 CALLER MUL OR SWAP1 SSTORE PUSH2 0x81 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x6A JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH1 0xFF DUP2 AND DUP2 EQ PUSH2 0x7A JUMPI DUP2 DUP3 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x610 DUP1 PUSH2 0x90 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x70 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x70A08231 GT PUSH2 0x4E JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0xEF JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x11C JUMPI DUP1 PUSH4 0xD0E30DB0 EQ PUSH2 0x13C JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x144 JUMPI PUSH2 0x70 JUMP JUMPDEST DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x75 JUMPI DUP1 PUSH4 0x2E1A7D4D EQ PUSH2 0xAB JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH2 0xCD JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x81 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x95 PUSH2 0x90 CALLDATASIZE PUSH1 0x4 PUSH2 0x4B2 JUMP JUMPDEST PUSH2 0x164 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xA2 SWAP2 SWAP1 PUSH2 0x5AB JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xB7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xCB PUSH2 0xC6 CALLDATASIZE PUSH1 0x4 PUSH2 0x503 JUMP JUMPDEST PUSH2 0x21E JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xD9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xE2 PUSH2 0x2AF JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xA2 SWAP2 SWAP1 PUSH2 0x5BF JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xFB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x10F PUSH2 0x10A CALLDATASIZE PUSH1 0x4 PUSH2 0x463 JUMP JUMPDEST PUSH2 0x2B8 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xA2 SWAP2 SWAP1 PUSH2 0x5B6 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x128 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x95 PUSH2 0x137 CALLDATASIZE PUSH1 0x4 PUSH2 0x4B2 JUMP JUMPDEST PUSH2 0x363 JUMP JUMPDEST PUSH2 0xCB PUSH2 0x3C2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x150 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x10F PUSH2 0x15F CALLDATASIZE PUSH1 0x4 PUSH2 0x47E JUMP JUMPDEST PUSH2 0x437 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH32 0xFB3F4D2900000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH2 0x100 SWAP1 SWAP2 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0xFB3F4D29 SWAP1 PUSH2 0x1C3 SWAP1 CALLER SWAP1 DUP8 SWAP1 DUP8 SWAP1 PUSH1 0x4 ADD PUSH2 0x554 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1DD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1F1 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x215 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x4DC JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x40 MLOAD PUSH32 0xD08533D000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH2 0x100 SWAP1 SWAP2 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0xD08533D0 SWAP1 PUSH2 0x27A SWAP1 CALLER SWAP1 DUP6 SWAP1 PUSH1 0x4 ADD PUSH2 0x585 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x294 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2A8 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH32 0xE42C08F200000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH2 0x100 SWAP1 SWAP2 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0xE42C08F2 SWAP1 PUSH2 0x313 SWAP1 DUP6 SWAP1 PUSH1 0x4 ADD PUSH2 0x533 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x32B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x33F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x218 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x51B JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH32 0x15EAEF6B00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH2 0x100 SWAP1 SWAP2 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0x15EAEF6B SWAP1 PUSH2 0x1C3 SWAP1 CALLER SWAP1 DUP8 SWAP1 DUP8 SWAP1 PUSH1 0x4 ADD PUSH2 0x554 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x40 MLOAD PUSH32 0x63B5AC4100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH2 0x100 SWAP1 SWAP2 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0x63B5AC41 SWAP1 CALLVALUE SWAP1 PUSH2 0x41E SWAP1 CALLER SWAP1 PUSH1 0x4 ADD PUSH2 0x533 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x294 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x218 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x474 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x215 DUP4 DUP4 PUSH2 0x43F JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x490 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x49A DUP5 DUP5 PUSH2 0x43F JUMP JUMPDEST SWAP2 POP PUSH2 0x4A9 DUP5 PUSH1 0x20 DUP6 ADD PUSH2 0x43F JUMP JUMPDEST SWAP1 POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x4C4 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x4CE DUP5 DUP5 PUSH2 0x43F JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4ED JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x4FC JUMPI DUP2 DUP3 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x514 JUMPI DUP1 DUP2 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x52C JUMPI DUP1 DUP2 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP4 DUP5 AND DUP2 MSTORE SWAP2 SWAP1 SWAP3 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0xFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP INVALID LOG3 PUSH6 0x627A7A723158 KECCAK256 ADD PUSH20 0xA8E486C52745246CBC85F97B01353FA40436F235 0xD3 BALANCE PUSH28 0x6D0D8EA9737C396C6578706572696D656E74616CF564736F6C634300 SDIV GT STOP BLOCKHASH LOG3 PUSH6 0x627A7A723158 KECCAK256 0x2B 0xC3 0x2C SWAP11 ADDMOD 0xB9 0xB7 0xB1 0x4E ADDMOD 0xEF 0xF6 CODESIZE 0xB1 0xD6 DUP3 0xD2 SWAP1 GAS SWAP8 0xC9 SWAP1 JUMP 0xAF ORIGIN PUSH15 0x7155D086D1676C6578706572696D65 PUSH15 0x74616CF564736F6C63430005110040 PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH2 0x6A0 CODESIZE SUB DUP1 PUSH2 0x6A0 DUP4 CODECOPY DUP2 ADD PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH2 0x2F SWAP2 PUSH2 0x59 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0xFF SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR PUSH2 0x100 PUSH1 0x1 PUSH1 0xA8 SHL SUB NOT AND PUSH2 0x100 CALLER MUL OR SWAP1 SSTORE PUSH2 0x81 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x6A JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH1 0xFF DUP2 AND DUP2 EQ PUSH2 0x7A JUMPI DUP2 DUP3 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x610 DUP1 PUSH2 0x90 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x70 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x70A08231 GT PUSH2 0x4E JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0xEF JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x11C JUMPI DUP1 PUSH4 0xD0E30DB0 EQ PUSH2 0x13C JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x144 JUMPI PUSH2 0x70 JUMP JUMPDEST DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x75 JUMPI DUP1 PUSH4 0x2E1A7D4D EQ PUSH2 0xAB JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH2 0xCD JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x81 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x95 PUSH2 0x90 CALLDATASIZE PUSH1 0x4 PUSH2 0x4B2 JUMP JUMPDEST PUSH2 0x164 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xA2 SWAP2 SWAP1 PUSH2 0x5AB JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xB7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xCB PUSH2 0xC6 CALLDATASIZE PUSH1 0x4 PUSH2 0x503 JUMP JUMPDEST PUSH2 0x21E JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xD9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xE2 PUSH2 0x2AF JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xA2 SWAP2 SWAP1 PUSH2 0x5BF JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xFB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x10F PUSH2 0x10A CALLDATASIZE PUSH1 0x4 PUSH2 0x463 JUMP JUMPDEST PUSH2 0x2B8 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xA2 SWAP2 SWAP1 PUSH2 0x5B6 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x128 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x95 PUSH2 0x137 CALLDATASIZE PUSH1 0x4 PUSH2 0x4B2 JUMP JUMPDEST PUSH2 0x363 JUMP JUMPDEST PUSH2 0xCB PUSH2 0x3C2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x150 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x10F PUSH2 0x15F CALLDATASIZE PUSH1 0x4 PUSH2 0x47E JUMP JUMPDEST PUSH2 0x437 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH32 0xFB3F4D2900000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH2 0x100 SWAP1 SWAP2 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0xFB3F4D29 SWAP1 PUSH2 0x1C3 SWAP1 CALLER SWAP1 DUP8 SWAP1 DUP8 SWAP1 PUSH1 0x4 ADD PUSH2 0x554 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1DD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1F1 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x215 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x4DC JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x40 MLOAD PUSH32 0xD08533D000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH2 0x100 SWAP1 SWAP2 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0xD08533D0 SWAP1 PUSH2 0x27A SWAP1 CALLER SWAP1 DUP6 SWAP1 PUSH1 0x4 ADD PUSH2 0x585 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x294 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2A8 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH32 0xE42C08F200000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH2 0x100 SWAP1 SWAP2 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0xE42C08F2 SWAP1 PUSH2 0x313 SWAP1 DUP6 SWAP1 PUSH1 0x4 ADD PUSH2 0x533 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x32B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x33F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x218 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x51B JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH32 0x15EAEF6B00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH2 0x100 SWAP1 SWAP2 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0x15EAEF6B SWAP1 PUSH2 0x1C3 SWAP1 CALLER SWAP1 DUP8 SWAP1 DUP8 SWAP1 PUSH1 0x4 ADD PUSH2 0x554 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x40 MLOAD PUSH32 0x63B5AC4100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH2 0x100 SWAP1 SWAP2 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0x63B5AC41 SWAP1 CALLVALUE SWAP1 PUSH2 0x41E SWAP1 CALLER SWAP1 PUSH1 0x4 ADD PUSH2 0x533 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x294 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x218 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x474 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x215 DUP4 DUP4 PUSH2 0x43F JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x490 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x49A DUP5 DUP5 PUSH2 0x43F JUMP JUMPDEST SWAP2 POP PUSH2 0x4A9 DUP5 PUSH1 0x20 DUP6 ADD PUSH2 0x43F JUMP JUMPDEST SWAP1 POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x4C4 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x4CE DUP5 DUP5 PUSH2 0x43F JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4ED JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x4FC JUMPI DUP2 DUP3 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x514 JUMPI DUP1 DUP2 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x52C JUMPI DUP1 DUP2 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP4 DUP5 AND DUP2 MSTORE SWAP2 SWAP1 SWAP3 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0xFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP INVALID LOG3 PUSH6 0x627A7A723158 KECCAK256 ADD PUSH20 0xA8E486C52745246CBC85F97B01353FA40436F235 0xD3 BALANCE PUSH28 0x6D0D8EA9737C396C6578706572696D656E74616CF564736F6C634300 SDIV GT STOP BLOCKHASH ",
                "sourceMap": "2891:5536:55:-;;;3962:84;8:9:-1;5:2;;;30:1;27;20:12;5:2;3962:84:55;4034:2;4020:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;3993:4:55;:46;;-1:-1:-1;;;;;;3993:46:55;-1:-1:-1;;;;;3993:46:55;;;;;;;;;;2891:5536;;;;;;;;;;:::o;152:227:-1:-;457:4;446:16;;;;83:57;;277:2;262:18;;248:131;;2891:5536:55;;;;;;"
            },
            "deployedBytecode": {
                "linkReferences": {},
                "object": "0x6080604052600436106100dd5760003560e01c806363b5ac411161007f578063cb3c28c711610059578063cb3c28c71461021d578063d08533d014610230578063e42c08f214610250578063fb3f4d2914610270576100dd565b806363b5ac41146101d757806365c53a03146101ea578063c2df82e6146101fd576100dd565b806329589f61116100bb57806329589f611461016057806329f7fc9e146101805780633fc8cef3146101a25780635aed4ec3146101b7576100dd565b806315eaef6b146100ea5780631626ba7e1461012057806320b6d5bc1461014d575b36156100e857600080fd5b005b3480156100f657600080fd5b5061010a61010536600461132c565b610290565b60405161011791906116f9565b60405180910390f35b34801561012c57600080fd5b5061014061013b3660046114b1565b61031d565b6040516101179190611704565b6100e861015b36600461132c565b610345565b61017361016e3660046113e6565b610400565b60405161011791906117c1565b34801561018c57600080fd5b50610195610458565b6040516101179190611568565b3480156101ae57600080fd5b50610195610470565b3480156101c357600080fd5b506101956101d236600461152b565b61048c565b6100e86101e5366004611194565b6104c8565b6100e86101f83660046114fb565b61057b565b34801561020957600080fd5b506101406102183660046112a9565b6105e3565b61017361022b36600461136c565b610b68565b34801561023c57600080fd5b506100e861024b36600461127e565b610bbe565b34801561025c57600080fd5b5061017361026b366004611194565b610cb4565b34801561027c57600080fd5b5061010a61028b36600461132c565b610ce9565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff888116855292528083208054869003905590851682528082208054850190555190917f585bc061c1fb99029ae845359d195a4e868890b2566636c927533576e9a89f619161030b9190879087908790611589565b60405180910390a15060019392505050565b7fb0671381000000000000000000000000000000000000000000000000000000009392505050565b73ffffffffffffffffffffffffffffffffffffffff80841660008181526001602090815260408083208786168452909152812080548501905554909116146103b95760405133903480156108fc02916000818181858888f193505050501580156103b3573d6000803e3d6000fd5b506103fb565b8034146103fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103f29061178a565b60405180910390fd5b505050565b60007f59ac183f99ea1126881a40dad44fe910c20477829dc17810fc6b6d468aea52b2348b8b8b8b8b8b8b60405161043f9897969594939291906117f6565b60405180910390a1506002549998505050505050505050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b60008160405161049b906110c1565b6104a59190611845565b604051809103906000f0801580156104c1573d6000803e3d6000fd5b5092915050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610519576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103f290611753565b60005461053d9073ffffffffffffffffffffffffffffffffffffffff168234610345565b7f493b326af1902255740bfd4716a9196f808baee3482695e1cc52bf038d12f60d348234604051610570939291906117ca565b60405180910390a150565b34156105de573481146105ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103f29061178a565b6000546105de9073ffffffffffffffffffffffffffffffffffffffff163034610345565b600255565b60006105ed6110ce565b6105f5610d20565b73ffffffffffffffffffffffffffffffffffffffff168152610615610d24565b73ffffffffffffffffffffffffffffffffffffffff16602082015261063c838501856111b0565b60c083015273ffffffffffffffffffffffffffffffffffffffff166040808301829052517f70a082310000000000000000000000000000000000000000000000000000000081526370a0823190610697903090600401611568565b60206040518083038186803b1580156106af57600080fd5b505afa1580156106c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506106e79190810190611513565b606082018190526106fc575060009050610b5e565b8773ffffffffffffffffffffffffffffffffffffffff16816040015173ffffffffffffffffffffffffffffffffffffffff161415610770576107478160400151878360600151610d40565b507fdc1600f3000000000000000000000000000000000000000000000000000000009050610b5e565b806020015173ffffffffffffffffffffffffffffffffffffffff16816040015173ffffffffffffffffffffffffffffffffffffffff1614156108625773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee604082810191909152606082015160808301819052602083015191517f2e1a7d4d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90921691632e1a7d4d9161082b916004016117c1565b600060405180830381600087803b15801561084557600080fd5b505af1158015610859573d6000803e3d6000fd5b50505050610879565b610879816040015182600001518360600151610e07565b6000816020015173ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff161490506000826000015173ffffffffffffffffffffffffffffffffffffffff166329589f61846080015185604001518660600151866108ec578e610902565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee5b8761090d578d61090f565b305b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600160008c60c001516040518a63ffffffff1660e01b815260040161095c989796959493929190611654565b6020604051808303818588803b15801561097557600080fd5b505af1158015610989573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052506109ae9190810190611513565b90508115610aae57826020015173ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015610a0257600080fd5b505af1158015610a16573d6000803e3d6000fd5b5050505050826020015173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb89836040518363ffffffff1660e01b8152600401610a5a9291906115c0565b602060405180830381600087803b158015610a7457600080fd5b505af1158015610a88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610aac9190810190611491565b505b60408301517f349fc08071558d8e3aa92dec9396e4e9f2dfecd6bb9065759d1932e7da43b8a99073ffffffffffffffffffffffffffffffffffffffff1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14610b0f578360400151610b15565b83602001515b6060850151604051610b2f92918e9186908f908f9061160d565b60405180910390a1507fdc1600f300000000000000000000000000000000000000000000000000000000925050505b9695505050505050565b60007f59ac183f99ea1126881a40dad44fe910c20477829dc17810fc6b6d468aea52b23489898989898989604051610ba79897969594939291906117f6565b60405180910390a150600254979650505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610c0f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103f290611753565b6000805473ffffffffffffffffffffffffffffffffffffffff9081168252600160209081526040808420928616808552929091528083208054859003905551909183156108fc02918491818181858888f19350505050158015610c76573d6000803e3d6000fd5b507ff952181f7dc65f02b4be7610895c88da3f0ae66b3a0109ad34efdbd9a74d039d8282604051610ca89291906115c0565b60405180910390a15050565b33600090815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff949094168352929052205490565b60007f9eba1462601f8272038ef8765c03e22d58589df272104d304d4fe8e2c92cab153385858560405161030b9493929190611589565b3090565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b6040516060907fa9059cbb0000000000000000000000000000000000000000000000000000000090610d7890859085906024016115c0565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050610e018482610ede565b50505050565b6040517fdd62ed3e000000000000000000000000000000000000000000000000000000008152819073ffffffffffffffffffffffffffffffffffffffff85169063dd62ed3e90610e5d90309087906004016115e6565b60206040518083038186803b158015610e7557600080fd5b505afa158015610e89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610ead9190810190611513565b10156103fb576103fb83837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610f9a565b600060608373ffffffffffffffffffffffffffffffffffffffff1683604051610f07919061154c565b6000604051808303816000865af19150503d8060008114610f44576040519150601f19603f3d011682016040523d82523d6000602084013e610f49565b606091505b50915091508115610f8d578051610f61575050610f96565b805160201415610f8d576000610f78826000610fd2565b90508060011415610f8b57505050610f96565b505b610e0181610fe5565b5050565b6040516060907f095ea7b30000000000000000000000000000000000000000000000000000000090610d7890859085906024016115c0565b6000610fde8383610fed565b9392505050565b805160208201fd5b600081602001835110156110135761101361100e600585518560200161101c565b610fe5565b50016020015190565b6060632800659560e01b84848460405160240161103b93929190611731565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290509392505050565b6106a0806118b183390190565b6040518060e00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815260200160008152602001606081525090565b60008083601f84011261115e578182fd5b50813567ffffffffffffffff811115611175578182fd5b60208301915083602082850101111561118d57600080fd5b9250929050565b6000602082840312156111a5578081fd5b8135610fde8161188b565b600080604083850312156111c2578081fd5b82356111cd8161188b565b9150602083013567ffffffffffffffff808211156111e9578283fd5b81850186601f8201126111fa578384fd5b803592508183111561120a578384fd5b60405160207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8601168201018181108482111715611248578586fd5b60405283815281840160200188101561125f578485fd5b611270846020830160208501611853565b809450505050509250929050565b60008060408385031215611290578182fd5b823561129b8161188b565b946020939093013593505050565b60008060008060008060a087890312156112c1578182fd5b86356112cc8161188b565b955060208701356112dc8161188b565b945060408701356112ec8161188b565b935060608701359250608087013567ffffffffffffffff81111561130e578283fd5b61131a89828a0161114d565b979a9699509497509295939492505050565b600080600060608486031215611340578283fd5b833561134b8161188b565b9250602084013561135b8161188b565b929592945050506040919091013590565b600080600080600080600060e0888a031215611386578081fd5b87356113918161188b565b96506020880135955060408801356113a88161188b565b945060608801356113b88161188b565b93506080880135925060a0880135915060c08801356113d68161188b565b8091505092959891949750929550565b60008060008060008060008060006101008a8c031215611404578182fd5b893561140f8161188b565b985060208a0135975060408a01356114268161188b565b965060608a01356114368161188b565b955060808a0135945060a08a0135935060c08a01356114548161188b565b925060e08a013567ffffffffffffffff81111561146f578283fd5b61147b8c828d0161114d565b8194508093505050509295985092959850929598565b6000602082840312156114a2578081fd5b81518015158114610fde578182fd5b6000806000604084860312156114c5578283fd5b83359250602084013567ffffffffffffffff8111156114e2578283fd5b6114ee8682870161114d565b9497909650939450505050565b60006020828403121561150c578081fd5b5035919050565b600060208284031215611524578081fd5b5051919050565b60006020828403121561153c578081fd5b813560ff81168114610fde578182fd5b6000825161155e81846020870161185f565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff9485168152928416602084015292166040820152606081019190915260800190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff96871681529486166020860152604085019390935260608401919091528316608083015290911660a082015260c00190565b600061010073ffffffffffffffffffffffffffffffffffffffff808c1684528a6020850152808a16604085015280891660608501528760808501528660a085015280861660c0850152508060e08401528351808285015261012091506116c0818386016020880161185f565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092019091019998505050505050505050565b901515815260200190565b7fffffffff0000000000000000000000000000000000000000000000000000000091909116815260200190565b606081016008851061173f57fe5b938152602081019290925260409091015290565b60208082526009908201527f4f4e4c595f574554480000000000000000000000000000000000000000000000604082015260600190565b60208082526015908201527f56414c55455f414d4f554e545f4d49534d415443480000000000000000000000604082015260600190565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff919091166020830152604082015260600190565b97885273ffffffffffffffffffffffffffffffffffffffff968716602089015260408801959095529285166060870152908416608086015260a085015260c08401521660e08201526101000190565b60ff91909116815260200190565b82818337506000910152565b60005b8381101561187a578181015183820152602001611862565b83811115610e015750506000910152565b73ffffffffffffffffffffffffffffffffffffffff811681146118ad57600080fd5b5056fe608060405234801561001057600080fd5b506040516106a03803806106a083398101604081905261002f91610059565b6000805460ff191660ff9290921691909117610100600160a81b0319166101003302179055610081565b60006020828403121561006a578081fd5b815160ff8116811461007a578182fd5b9392505050565b610610806100906000396000f3fe6080604052600436106100705760003560e01c806370a082311161004e57806370a08231146100ef578063a9059cbb1461011c578063d0e30db01461013c578063dd62ed3e1461014457610070565b8063095ea7b3146100755780632e1a7d4d146100ab578063313ce567146100cd575b600080fd5b34801561008157600080fd5b506100956100903660046104b2565b610164565b6040516100a291906105ab565b60405180910390f35b3480156100b757600080fd5b506100cb6100c6366004610503565b61021e565b005b3480156100d957600080fd5b506100e26102af565b6040516100a291906105bf565b3480156100fb57600080fd5b5061010f61010a366004610463565b6102b8565b6040516100a291906105b6565b34801561012857600080fd5b506100956101373660046104b2565b610363565b6100cb6103c2565b34801561015057600080fd5b5061010f61015f36600461047e565b610437565b600080546040517ffb3f4d2900000000000000000000000000000000000000000000000000000000815261010090910473ffffffffffffffffffffffffffffffffffffffff169063fb3f4d29906101c390339087908790600401610554565b602060405180830381600087803b1580156101dd57600080fd5b505af11580156101f1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061021591908101906104dc565b90505b92915050565b6000546040517fd08533d000000000000000000000000000000000000000000000000000000000815261010090910473ffffffffffffffffffffffffffffffffffffffff169063d08533d09061027a9033908590600401610585565b600060405180830381600087803b15801561029457600080fd5b505af11580156102a8573d6000803e3d6000fd5b5050505050565b60005460ff1681565b600080546040517fe42c08f200000000000000000000000000000000000000000000000000000000815261010090910473ffffffffffffffffffffffffffffffffffffffff169063e42c08f290610313908590600401610533565b60206040518083038186803b15801561032b57600080fd5b505afa15801561033f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610218919081019061051b565b600080546040517f15eaef6b00000000000000000000000000000000000000000000000000000000815261010090910473ffffffffffffffffffffffffffffffffffffffff16906315eaef6b906101c390339087908790600401610554565b6000546040517f63b5ac4100000000000000000000000000000000000000000000000000000000815261010090910473ffffffffffffffffffffffffffffffffffffffff16906363b5ac4190349061041e903390600401610533565b6000604051808303818588803b15801561029457600080fd5b600092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461021857600080fd5b600060208284031215610474578081fd5b610215838361043f565b60008060408385031215610490578081fd5b61049a848461043f565b91506104a9846020850161043f565b90509250929050565b600080604083850312156104c4578182fd5b6104ce848461043f565b946020939093013593505050565b6000602082840312156104ed578081fd5b815180151581146104fc578182fd5b9392505050565b600060208284031215610514578081fd5b5035919050565b60006020828403121561052c578081fd5b5051919050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b901515815260200190565b90815260200190565b60ff9190911681526020019056fea365627a7a723158200173a8e486c52745246cbc85f97b01353fa40436f235d3317b6d0d8ea9737c396c6578706572696d656e74616cf564736f6c63430005110040a365627a7a723158202bc32c9a08b9b7b14e08eff638b1d682d2905a97c99056af326e7155d086d1676c6578706572696d656e74616cf564736f6c63430005110040",
                "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xDD JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x63B5AC41 GT PUSH2 0x7F JUMPI DUP1 PUSH4 0xCB3C28C7 GT PUSH2 0x59 JUMPI DUP1 PUSH4 0xCB3C28C7 EQ PUSH2 0x21D JUMPI DUP1 PUSH4 0xD08533D0 EQ PUSH2 0x230 JUMPI DUP1 PUSH4 0xE42C08F2 EQ PUSH2 0x250 JUMPI DUP1 PUSH4 0xFB3F4D29 EQ PUSH2 0x270 JUMPI PUSH2 0xDD JUMP JUMPDEST DUP1 PUSH4 0x63B5AC41 EQ PUSH2 0x1D7 JUMPI DUP1 PUSH4 0x65C53A03 EQ PUSH2 0x1EA JUMPI DUP1 PUSH4 0xC2DF82E6 EQ PUSH2 0x1FD JUMPI PUSH2 0xDD JUMP JUMPDEST DUP1 PUSH4 0x29589F61 GT PUSH2 0xBB JUMPI DUP1 PUSH4 0x29589F61 EQ PUSH2 0x160 JUMPI DUP1 PUSH4 0x29F7FC9E EQ PUSH2 0x180 JUMPI DUP1 PUSH4 0x3FC8CEF3 EQ PUSH2 0x1A2 JUMPI DUP1 PUSH4 0x5AED4EC3 EQ PUSH2 0x1B7 JUMPI PUSH2 0xDD JUMP JUMPDEST DUP1 PUSH4 0x15EAEF6B EQ PUSH2 0xEA JUMPI DUP1 PUSH4 0x1626BA7E EQ PUSH2 0x120 JUMPI DUP1 PUSH4 0x20B6D5BC EQ PUSH2 0x14D JUMPI JUMPDEST CALLDATASIZE ISZERO PUSH2 0xE8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xF6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x10A PUSH2 0x105 CALLDATASIZE PUSH1 0x4 PUSH2 0x132C JUMP JUMPDEST PUSH2 0x290 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x117 SWAP2 SWAP1 PUSH2 0x16F9 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x12C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x140 PUSH2 0x13B CALLDATASIZE PUSH1 0x4 PUSH2 0x14B1 JUMP JUMPDEST PUSH2 0x31D JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x117 SWAP2 SWAP1 PUSH2 0x1704 JUMP JUMPDEST PUSH2 0xE8 PUSH2 0x15B CALLDATASIZE PUSH1 0x4 PUSH2 0x132C JUMP JUMPDEST PUSH2 0x345 JUMP JUMPDEST PUSH2 0x173 PUSH2 0x16E CALLDATASIZE PUSH1 0x4 PUSH2 0x13E6 JUMP JUMPDEST PUSH2 0x400 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x117 SWAP2 SWAP1 PUSH2 0x17C1 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x18C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x195 PUSH2 0x458 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x117 SWAP2 SWAP1 PUSH2 0x1568 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1AE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x195 PUSH2 0x470 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1C3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x195 PUSH2 0x1D2 CALLDATASIZE PUSH1 0x4 PUSH2 0x152B JUMP JUMPDEST PUSH2 0x48C JUMP JUMPDEST PUSH2 0xE8 PUSH2 0x1E5 CALLDATASIZE PUSH1 0x4 PUSH2 0x1194 JUMP JUMPDEST PUSH2 0x4C8 JUMP JUMPDEST PUSH2 0xE8 PUSH2 0x1F8 CALLDATASIZE PUSH1 0x4 PUSH2 0x14FB JUMP JUMPDEST PUSH2 0x57B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x209 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x140 PUSH2 0x218 CALLDATASIZE PUSH1 0x4 PUSH2 0x12A9 JUMP JUMPDEST PUSH2 0x5E3 JUMP JUMPDEST PUSH2 0x173 PUSH2 0x22B CALLDATASIZE PUSH1 0x4 PUSH2 0x136C JUMP JUMPDEST PUSH2 0xB68 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x23C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xE8 PUSH2 0x24B CALLDATASIZE PUSH1 0x4 PUSH2 0x127E JUMP JUMPDEST PUSH2 0xBBE JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x25C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x173 PUSH2 0x26B CALLDATASIZE PUSH1 0x4 PUSH2 0x1194 JUMP JUMPDEST PUSH2 0xCB4 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x27C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x10A PUSH2 0x28B CALLDATASIZE PUSH1 0x4 PUSH2 0x132C JUMP JUMPDEST PUSH2 0xCE9 JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 DUP2 AND DUP6 MSTORE SWAP3 MSTORE DUP1 DUP4 KECCAK256 DUP1 SLOAD DUP7 SWAP1 SUB SWAP1 SSTORE SWAP1 DUP6 AND DUP3 MSTORE DUP1 DUP3 KECCAK256 DUP1 SLOAD DUP6 ADD SWAP1 SSTORE MLOAD SWAP1 SWAP2 PUSH32 0x585BC061C1FB99029AE845359D195A4E868890B2566636C927533576E9A89F61 SWAP2 PUSH2 0x30B SWAP2 SWAP1 DUP8 SWAP1 DUP8 SWAP1 DUP8 SWAP1 PUSH2 0x1589 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP PUSH1 0x1 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH32 0xB067138100000000000000000000000000000000000000000000000000000000 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP8 DUP7 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE DUP2 KECCAK256 DUP1 SLOAD DUP6 ADD SWAP1 SSTORE SLOAD SWAP1 SWAP2 AND EQ PUSH2 0x3B9 JUMPI PUSH1 0x40 MLOAD CALLER SWAP1 CALLVALUE DUP1 ISZERO PUSH2 0x8FC MUL SWAP2 PUSH1 0x0 DUP2 DUP2 DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0x3B3 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP PUSH2 0x3FB JUMP JUMPDEST DUP1 CALLVALUE EQ PUSH2 0x3FB JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x3F2 SWAP1 PUSH2 0x178A JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH32 0x59AC183F99EA1126881A40DAD44FE910C20477829DC17810FC6B6D468AEA52B2 CALLVALUE DUP12 DUP12 DUP12 DUP12 DUP12 DUP12 DUP12 PUSH1 0x40 MLOAD PUSH2 0x43F SWAP9 SWAP8 SWAP7 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x17F6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP PUSH1 0x2 SLOAD SWAP10 SWAP9 POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH20 0xEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x40 MLOAD PUSH2 0x49B SWAP1 PUSH2 0x10C1 JUMP JUMPDEST PUSH2 0x4A5 SWAP2 SWAP1 PUSH2 0x1845 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 PUSH1 0x0 CREATE DUP1 ISZERO DUP1 ISZERO PUSH2 0x4C1 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x519 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x3F2 SWAP1 PUSH2 0x1753 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x53D SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP3 CALLVALUE PUSH2 0x345 JUMP JUMPDEST PUSH32 0x493B326AF1902255740BFD4716A9196F808BAEE3482695E1CC52BF038D12F60D CALLVALUE DUP3 CALLVALUE PUSH1 0x40 MLOAD PUSH2 0x570 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x17CA JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP JUMP JUMPDEST CALLVALUE ISZERO PUSH2 0x5DE JUMPI CALLVALUE DUP2 EQ PUSH2 0x5BA JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x3F2 SWAP1 PUSH2 0x178A JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x5DE SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ADDRESS CALLVALUE PUSH2 0x345 JUMP JUMPDEST PUSH1 0x2 SSTORE JUMP JUMPDEST PUSH1 0x0 PUSH2 0x5ED PUSH2 0x10CE JUMP JUMPDEST PUSH2 0x5F5 PUSH2 0xD20 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH2 0x615 PUSH2 0xD24 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x63C DUP4 DUP6 ADD DUP6 PUSH2 0x11B0 JUMP JUMPDEST PUSH1 0xC0 DUP4 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x40 DUP1 DUP4 ADD DUP3 SWAP1 MSTORE MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH4 0x70A08231 SWAP1 PUSH2 0x697 SWAP1 ADDRESS SWAP1 PUSH1 0x4 ADD PUSH2 0x1568 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x6AF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x6C3 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x6E7 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x1513 JUMP JUMPDEST PUSH1 0x60 DUP3 ADD DUP2 SWAP1 MSTORE PUSH2 0x6FC JUMPI POP PUSH1 0x0 SWAP1 POP PUSH2 0xB5E JUMP JUMPDEST DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 PUSH1 0x40 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x770 JUMPI PUSH2 0x747 DUP2 PUSH1 0x40 ADD MLOAD DUP8 DUP4 PUSH1 0x60 ADD MLOAD PUSH2 0xD40 JUMP JUMPDEST POP PUSH32 0xDC1600F300000000000000000000000000000000000000000000000000000000 SWAP1 POP PUSH2 0xB5E JUMP JUMPDEST DUP1 PUSH1 0x20 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 PUSH1 0x40 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x862 JUMPI PUSH20 0xEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE PUSH1 0x40 DUP3 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 DUP3 ADD MLOAD PUSH1 0x80 DUP4 ADD DUP2 SWAP1 MSTORE PUSH1 0x20 DUP4 ADD MLOAD SWAP2 MLOAD PUSH32 0x2E1A7D4D00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND SWAP2 PUSH4 0x2E1A7D4D SWAP2 PUSH2 0x82B SWAP2 PUSH1 0x4 ADD PUSH2 0x17C1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x845 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x859 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH2 0x879 JUMP JUMPDEST PUSH2 0x879 DUP2 PUSH1 0x40 ADD MLOAD DUP3 PUSH1 0x0 ADD MLOAD DUP4 PUSH1 0x60 ADD MLOAD PUSH2 0xE07 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x20 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP10 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 POP PUSH1 0x0 DUP3 PUSH1 0x0 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x29589F61 DUP5 PUSH1 0x80 ADD MLOAD DUP6 PUSH1 0x40 ADD MLOAD DUP7 PUSH1 0x60 ADD MLOAD DUP7 PUSH2 0x8EC JUMPI DUP15 PUSH2 0x902 JUMP JUMPDEST PUSH20 0xEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE JUMPDEST DUP8 PUSH2 0x90D JUMPI DUP14 PUSH2 0x90F JUMP JUMPDEST ADDRESS JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x1 PUSH1 0x0 DUP13 PUSH1 0xC0 ADD MLOAD PUSH1 0x40 MLOAD DUP11 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x95C SWAP9 SWAP8 SWAP7 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x1654 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x975 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x989 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x9AE SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x1513 JUMP JUMPDEST SWAP1 POP DUP2 ISZERO PUSH2 0xAAE JUMPI DUP3 PUSH1 0x20 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xD0E30DB0 DUP3 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xA02 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xA16 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP DUP3 PUSH1 0x20 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xA9059CBB DUP10 DUP4 PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xA5A SWAP3 SWAP2 SWAP1 PUSH2 0x15C0 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xA74 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xA88 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0xAAC SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x1491 JUMP JUMPDEST POP JUMPDEST PUSH1 0x40 DUP4 ADD MLOAD PUSH32 0x349FC08071558D8E3AA92DEC9396E4E9F2DFECD6BB9065759D1932E7DA43B8A9 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE EQ PUSH2 0xB0F JUMPI DUP4 PUSH1 0x40 ADD MLOAD PUSH2 0xB15 JUMP JUMPDEST DUP4 PUSH1 0x20 ADD MLOAD JUMPDEST PUSH1 0x60 DUP6 ADD MLOAD PUSH1 0x40 MLOAD PUSH2 0xB2F SWAP3 SWAP2 DUP15 SWAP2 DUP7 SWAP1 DUP16 SWAP1 DUP16 SWAP1 PUSH2 0x160D JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP PUSH32 0xDC1600F300000000000000000000000000000000000000000000000000000000 SWAP3 POP POP POP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH32 0x59AC183F99EA1126881A40DAD44FE910C20477829DC17810FC6B6D468AEA52B2 CALLVALUE DUP10 DUP10 DUP10 DUP10 DUP10 DUP10 DUP10 PUSH1 0x40 MLOAD PUSH2 0xBA7 SWAP9 SWAP8 SWAP7 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x17F6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP PUSH1 0x2 SLOAD SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0xC0F JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x3F2 SWAP1 PUSH2 0x1753 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND DUP3 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP3 DUP7 AND DUP1 DUP6 MSTORE SWAP3 SWAP1 SWAP2 MSTORE DUP1 DUP4 KECCAK256 DUP1 SLOAD DUP6 SWAP1 SUB SWAP1 SSTORE MLOAD SWAP1 SWAP2 DUP4 ISZERO PUSH2 0x8FC MUL SWAP2 DUP5 SWAP2 DUP2 DUP2 DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0xC76 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP PUSH32 0xF952181F7DC65F02B4BE7610895C88DA3F0AE66B3A0109AD34EFDBD9A74D039D DUP3 DUP3 PUSH1 0x40 MLOAD PUSH2 0xCA8 SWAP3 SWAP2 SWAP1 PUSH2 0x15C0 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH32 0x9EBA1462601F8272038EF8765C03E22D58589DF272104D304D4FE8E2C92CAB15 CALLER DUP6 DUP6 DUP6 PUSH1 0x40 MLOAD PUSH2 0x30B SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x1589 JUMP JUMPDEST ADDRESS SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x60 SWAP1 PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 SWAP1 PUSH2 0xD78 SWAP1 DUP6 SWAP1 DUP6 SWAP1 PUSH1 0x24 ADD PUSH2 0x15C0 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE SWAP1 POP PUSH2 0xE01 DUP5 DUP3 PUSH2 0xEDE JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xDD62ED3E00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE DUP2 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND SWAP1 PUSH4 0xDD62ED3E SWAP1 PUSH2 0xE5D SWAP1 ADDRESS SWAP1 DUP8 SWAP1 PUSH1 0x4 ADD PUSH2 0x15E6 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xE75 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xE89 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0xEAD SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x1513 JUMP JUMPDEST LT ISZERO PUSH2 0x3FB JUMPI PUSH2 0x3FB DUP4 DUP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0xF9A JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH1 0x40 MLOAD PUSH2 0xF07 SWAP2 SWAP1 PUSH2 0x154C JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0xF44 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0xF49 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 ISZERO PUSH2 0xF8D JUMPI DUP1 MLOAD PUSH2 0xF61 JUMPI POP POP PUSH2 0xF96 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x20 EQ ISZERO PUSH2 0xF8D JUMPI PUSH1 0x0 PUSH2 0xF78 DUP3 PUSH1 0x0 PUSH2 0xFD2 JUMP JUMPDEST SWAP1 POP DUP1 PUSH1 0x1 EQ ISZERO PUSH2 0xF8B JUMPI POP POP POP PUSH2 0xF96 JUMP JUMPDEST POP JUMPDEST PUSH2 0xE01 DUP2 PUSH2 0xFE5 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x60 SWAP1 PUSH32 0x95EA7B300000000000000000000000000000000000000000000000000000000 SWAP1 PUSH2 0xD78 SWAP1 DUP6 SWAP1 DUP6 SWAP1 PUSH1 0x24 ADD PUSH2 0x15C0 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xFDE DUP4 DUP4 PUSH2 0xFED JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP1 MLOAD PUSH1 0x20 DUP3 ADD REVERT JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x20 ADD DUP4 MLOAD LT ISZERO PUSH2 0x1013 JUMPI PUSH2 0x1013 PUSH2 0x100E PUSH1 0x5 DUP6 MLOAD DUP6 PUSH1 0x20 ADD PUSH2 0x101C JUMP JUMPDEST PUSH2 0xFE5 JUMP JUMPDEST POP ADD PUSH1 0x20 ADD MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x60 PUSH4 0x28006595 PUSH1 0xE0 SHL DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x103B SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x1731 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE SWAP1 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x6A0 DUP1 PUSH2 0x18B1 DUP4 CODECOPY ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0xE0 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x115E JUMPI DUP2 DUP3 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1175 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x118D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x11A5 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0xFDE DUP2 PUSH2 0x188B JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x11C2 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x11CD DUP2 PUSH2 0x188B JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x11E9 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP2 DUP6 ADD DUP7 PUSH1 0x1F DUP3 ADD SLT PUSH2 0x11FA JUMPI DUP4 DUP5 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP3 POP DUP2 DUP4 GT ISZERO PUSH2 0x120A JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP7 ADD AND DUP3 ADD ADD DUP2 DUP2 LT DUP5 DUP3 GT OR ISZERO PUSH2 0x1248 JUMPI DUP6 DUP7 REVERT JUMPDEST PUSH1 0x40 MSTORE DUP4 DUP2 MSTORE DUP2 DUP5 ADD PUSH1 0x20 ADD DUP9 LT ISZERO PUSH2 0x125F JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH2 0x1270 DUP5 PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP6 ADD PUSH2 0x1853 JUMP JUMPDEST DUP1 SWAP5 POP POP POP POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1290 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x129B DUP2 PUSH2 0x188B JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xA0 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x12C1 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP7 CALLDATALOAD PUSH2 0x12CC DUP2 PUSH2 0x188B JUMP JUMPDEST SWAP6 POP PUSH1 0x20 DUP8 ADD CALLDATALOAD PUSH2 0x12DC DUP2 PUSH2 0x188B JUMP JUMPDEST SWAP5 POP PUSH1 0x40 DUP8 ADD CALLDATALOAD PUSH2 0x12EC DUP2 PUSH2 0x188B JUMP JUMPDEST SWAP4 POP PUSH1 0x60 DUP8 ADD CALLDATALOAD SWAP3 POP PUSH1 0x80 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x130E JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0x131A DUP10 DUP3 DUP11 ADD PUSH2 0x114D JUMP JUMPDEST SWAP8 SWAP11 SWAP7 SWAP10 POP SWAP5 SWAP8 POP SWAP3 SWAP6 SWAP4 SWAP5 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x1340 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x134B DUP2 PUSH2 0x188B JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x135B DUP2 PUSH2 0x188B JUMP JUMPDEST SWAP3 SWAP6 SWAP3 SWAP5 POP POP POP PUSH1 0x40 SWAP2 SWAP1 SWAP2 ADD CALLDATALOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xE0 DUP9 DUP11 SUB SLT ISZERO PUSH2 0x1386 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP8 CALLDATALOAD PUSH2 0x1391 DUP2 PUSH2 0x188B JUMP JUMPDEST SWAP7 POP PUSH1 0x20 DUP9 ADD CALLDATALOAD SWAP6 POP PUSH1 0x40 DUP9 ADD CALLDATALOAD PUSH2 0x13A8 DUP2 PUSH2 0x188B JUMP JUMPDEST SWAP5 POP PUSH1 0x60 DUP9 ADD CALLDATALOAD PUSH2 0x13B8 DUP2 PUSH2 0x188B JUMP JUMPDEST SWAP4 POP PUSH1 0x80 DUP9 ADD CALLDATALOAD SWAP3 POP PUSH1 0xA0 DUP9 ADD CALLDATALOAD SWAP2 POP PUSH1 0xC0 DUP9 ADD CALLDATALOAD PUSH2 0x13D6 DUP2 PUSH2 0x188B JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 SWAP6 SWAP9 SWAP2 SWAP5 SWAP8 POP SWAP3 SWAP6 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x100 DUP11 DUP13 SUB SLT ISZERO PUSH2 0x1404 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP10 CALLDATALOAD PUSH2 0x140F DUP2 PUSH2 0x188B JUMP JUMPDEST SWAP9 POP PUSH1 0x20 DUP11 ADD CALLDATALOAD SWAP8 POP PUSH1 0x40 DUP11 ADD CALLDATALOAD PUSH2 0x1426 DUP2 PUSH2 0x188B JUMP JUMPDEST SWAP7 POP PUSH1 0x60 DUP11 ADD CALLDATALOAD PUSH2 0x1436 DUP2 PUSH2 0x188B JUMP JUMPDEST SWAP6 POP PUSH1 0x80 DUP11 ADD CALLDATALOAD SWAP5 POP PUSH1 0xA0 DUP11 ADD CALLDATALOAD SWAP4 POP PUSH1 0xC0 DUP11 ADD CALLDATALOAD PUSH2 0x1454 DUP2 PUSH2 0x188B JUMP JUMPDEST SWAP3 POP PUSH1 0xE0 DUP11 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x146F JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0x147B DUP13 DUP3 DUP14 ADD PUSH2 0x114D JUMP JUMPDEST DUP2 SWAP5 POP DUP1 SWAP4 POP POP POP POP SWAP3 SWAP6 SWAP9 POP SWAP3 SWAP6 SWAP9 POP SWAP3 SWAP6 SWAP9 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x14A2 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0xFDE JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x40 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x14C5 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 CALLDATALOAD SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x14E2 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0x14EE DUP7 DUP3 DUP8 ADD PUSH2 0x114D JUMP JUMPDEST SWAP5 SWAP8 SWAP1 SWAP7 POP SWAP4 SWAP5 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x150C JUMPI DUP1 DUP2 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1524 JUMPI DUP1 DUP2 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x153C JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH1 0xFF DUP2 AND DUP2 EQ PUSH2 0xFDE JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH2 0x155E DUP2 DUP5 PUSH1 0x20 DUP8 ADD PUSH2 0x185F JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 DUP6 AND DUP2 MSTORE SWAP3 DUP5 AND PUSH1 0x20 DUP5 ADD MSTORE SWAP3 AND PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP4 AND DUP2 MSTORE SWAP2 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP7 DUP8 AND DUP2 MSTORE SWAP5 DUP7 AND PUSH1 0x20 DUP7 ADD MSTORE PUSH1 0x40 DUP6 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x60 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP4 AND PUSH1 0x80 DUP4 ADD MSTORE SWAP1 SWAP2 AND PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xC0 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x100 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP13 AND DUP5 MSTORE DUP11 PUSH1 0x20 DUP6 ADD MSTORE DUP1 DUP11 AND PUSH1 0x40 DUP6 ADD MSTORE DUP1 DUP10 AND PUSH1 0x60 DUP6 ADD MSTORE DUP8 PUSH1 0x80 DUP6 ADD MSTORE DUP7 PUSH1 0xA0 DUP6 ADD MSTORE DUP1 DUP7 AND PUSH1 0xC0 DUP6 ADD MSTORE POP DUP1 PUSH1 0xE0 DUP5 ADD MSTORE DUP4 MLOAD DUP1 DUP3 DUP6 ADD MSTORE PUSH2 0x120 SWAP2 POP PUSH2 0x16C0 DUP2 DUP4 DUP7 ADD PUSH1 0x20 DUP9 ADD PUSH2 0x185F JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP3 SWAP1 SWAP3 ADD SWAP1 SWAP2 ADD SWAP10 SWAP9 POP POP POP POP POP POP POP POP POP JUMP JUMPDEST SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH1 0x8 DUP6 LT PUSH2 0x173F JUMPI INVALID JUMPDEST SWAP4 DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x40 SWAP1 SWAP2 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x9 SWAP1 DUP3 ADD MSTORE PUSH32 0x4F4E4C595F574554480000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x15 SWAP1 DUP3 ADD MSTORE PUSH32 0x56414C55455F414D4F554E545F4D49534D415443480000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 DUP4 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST SWAP8 DUP9 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP7 DUP8 AND PUSH1 0x20 DUP10 ADD MSTORE PUSH1 0x40 DUP9 ADD SWAP6 SWAP1 SWAP6 MSTORE SWAP3 DUP6 AND PUSH1 0x60 DUP8 ADD MSTORE SWAP1 DUP5 AND PUSH1 0x80 DUP7 ADD MSTORE PUSH1 0xA0 DUP6 ADD MSTORE PUSH1 0xC0 DUP5 ADD MSTORE AND PUSH1 0xE0 DUP3 ADD MSTORE PUSH2 0x100 ADD SWAP1 JUMP JUMPDEST PUSH1 0xFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x187A JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1862 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0xE01 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x18AD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH2 0x6A0 CODESIZE SUB DUP1 PUSH2 0x6A0 DUP4 CODECOPY DUP2 ADD PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH2 0x2F SWAP2 PUSH2 0x59 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0xFF SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR PUSH2 0x100 PUSH1 0x1 PUSH1 0xA8 SHL SUB NOT AND PUSH2 0x100 CALLER MUL OR SWAP1 SSTORE PUSH2 0x81 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x6A JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH1 0xFF DUP2 AND DUP2 EQ PUSH2 0x7A JUMPI DUP2 DUP3 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x610 DUP1 PUSH2 0x90 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x70 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x70A08231 GT PUSH2 0x4E JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0xEF JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x11C JUMPI DUP1 PUSH4 0xD0E30DB0 EQ PUSH2 0x13C JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x144 JUMPI PUSH2 0x70 JUMP JUMPDEST DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x75 JUMPI DUP1 PUSH4 0x2E1A7D4D EQ PUSH2 0xAB JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH2 0xCD JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x81 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x95 PUSH2 0x90 CALLDATASIZE PUSH1 0x4 PUSH2 0x4B2 JUMP JUMPDEST PUSH2 0x164 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xA2 SWAP2 SWAP1 PUSH2 0x5AB JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xB7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xCB PUSH2 0xC6 CALLDATASIZE PUSH1 0x4 PUSH2 0x503 JUMP JUMPDEST PUSH2 0x21E JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xD9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xE2 PUSH2 0x2AF JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xA2 SWAP2 SWAP1 PUSH2 0x5BF JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xFB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x10F PUSH2 0x10A CALLDATASIZE PUSH1 0x4 PUSH2 0x463 JUMP JUMPDEST PUSH2 0x2B8 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xA2 SWAP2 SWAP1 PUSH2 0x5B6 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x128 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x95 PUSH2 0x137 CALLDATASIZE PUSH1 0x4 PUSH2 0x4B2 JUMP JUMPDEST PUSH2 0x363 JUMP JUMPDEST PUSH2 0xCB PUSH2 0x3C2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x150 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x10F PUSH2 0x15F CALLDATASIZE PUSH1 0x4 PUSH2 0x47E JUMP JUMPDEST PUSH2 0x437 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH32 0xFB3F4D2900000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH2 0x100 SWAP1 SWAP2 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0xFB3F4D29 SWAP1 PUSH2 0x1C3 SWAP1 CALLER SWAP1 DUP8 SWAP1 DUP8 SWAP1 PUSH1 0x4 ADD PUSH2 0x554 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1DD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1F1 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x215 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x4DC JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x40 MLOAD PUSH32 0xD08533D000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH2 0x100 SWAP1 SWAP2 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0xD08533D0 SWAP1 PUSH2 0x27A SWAP1 CALLER SWAP1 DUP6 SWAP1 PUSH1 0x4 ADD PUSH2 0x585 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x294 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2A8 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH32 0xE42C08F200000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH2 0x100 SWAP1 SWAP2 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0xE42C08F2 SWAP1 PUSH2 0x313 SWAP1 DUP6 SWAP1 PUSH1 0x4 ADD PUSH2 0x533 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x32B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x33F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x218 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x51B JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH32 0x15EAEF6B00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH2 0x100 SWAP1 SWAP2 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0x15EAEF6B SWAP1 PUSH2 0x1C3 SWAP1 CALLER SWAP1 DUP8 SWAP1 DUP8 SWAP1 PUSH1 0x4 ADD PUSH2 0x554 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x40 MLOAD PUSH32 0x63B5AC4100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH2 0x100 SWAP1 SWAP2 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0x63B5AC41 SWAP1 CALLVALUE SWAP1 PUSH2 0x41E SWAP1 CALLER SWAP1 PUSH1 0x4 ADD PUSH2 0x533 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x294 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x218 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x474 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x215 DUP4 DUP4 PUSH2 0x43F JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x490 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x49A DUP5 DUP5 PUSH2 0x43F JUMP JUMPDEST SWAP2 POP PUSH2 0x4A9 DUP5 PUSH1 0x20 DUP6 ADD PUSH2 0x43F JUMP JUMPDEST SWAP1 POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x4C4 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x4CE DUP5 DUP5 PUSH2 0x43F JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4ED JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x4FC JUMPI DUP2 DUP3 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x514 JUMPI DUP1 DUP2 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x52C JUMPI DUP1 DUP2 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP4 DUP5 AND DUP2 MSTORE SWAP2 SWAP1 SWAP3 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0xFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP INVALID LOG3 PUSH6 0x627A7A723158 KECCAK256 ADD PUSH20 0xA8E486C52745246CBC85F97B01353FA40436F235 0xD3 BALANCE PUSH28 0x6D0D8EA9737C396C6578706572696D656E74616CF564736F6C634300 SDIV GT STOP BLOCKHASH LOG3 PUSH6 0x627A7A723158 KECCAK256 0x2B 0xC3 0x2C SWAP11 ADDMOD 0xB9 0xB7 0xB1 0x4E ADDMOD 0xEF 0xF6 CODESIZE 0xB1 0xD6 DUP3 0xD2 SWAP1 GAS SWAP8 0xC9 SWAP1 JUMP 0xAF ORIGIN PUSH15 0x7155D086D1676C6578706572696D65 PUSH15 0x74616CF564736F6C63430005110040 ",
                "sourceMap": "2891:5536:55:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2127:8:19;:20;2119:29;;;;;;2891:5536:55;6968:470;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;6968:470:55;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;5918:192:19;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;5918:192:19;;;;;;;;:::i;:::-;;;;;;;;7642:414:55;;;;;;;;;:::i;4747:675::-;;;;;;;;;:::i;:::-;;;;;;;;1630:86:19;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1630:86:19;;;:::i;:::-;;;;;;;;3817:23:55;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3817:23:55;;;:::i;5428:153::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;5428:153:55;;;;;;;;:::i;5889:342::-;;;;;;;;;:::i;5587:296::-;;;;;;;;;:::i;2766:2946:19:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2766:2946:19;;;;;;;;:::i;4112:629:55:-;;;;;;;;;:::i;6237:373::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;6237:373:55;;;;;;;;:::i;7444:192::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;7444:192:55;;;;;;;;:::i;6616:346::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;6616:346:55;;;;;;;;:::i;6968:470::-;7162:10;7119:12;7147:26;;;:14;:26;;;;;;;;;:40;;;;;;;;;;:50;;;;;;;7207:44;;;;;;;;:54;;;;;;7276:134;7119:12;;7276:134;;;;7162:10;7147:40;;7207:44;;7147:50;;7276:134;;;;;;;;;;-1:-1:-1;7427:4:55;6968:470;;;;;:::o;5918:192:19:-;6078:25;5918:192;;;;;:::o;7642:414:55:-;7770:28;;;;;;;;:14;:28;;;;;;;;:42;;;;;;;;;;:52;;;;;;7860:4;;;;7836:29;7832:218;;7925:30;;:10;;7945:9;7925:30;;;;;;;;;7945:9;7925:10;:30;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;7925:30:55;7832:218;;;8007:6;7994:9;:19;7986:53;;;;;;;;;;;;;;;;;;;;;;7642:414;;;:::o;4747:675::-;5096:20;5137:246;5167:9;5190:16;5220:10;5244:15;5273:16;5303:17;5334;5365:8;5137:246;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5400:15:55;;4747:675;;;;;;;;;;;:::o;1630:86:19:-;1674:42;1630:86;:::o;3817:23:55:-;;;;;;:::o;5428:153::-;5499:20;5564:8;5550:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;5535:39:55;5428:153;-1:-1:-1;;5428:153:55:o;5889:342::-;6023:4;;;;6001:10;:27;5993:49;;;;;;;;;;;;;;6074:4;;6052:53;;6074:4;;6081:12;6095:9;6052:13;:53::i;:::-;6120:104;6156:9;6179:12;6205:9;6120:104;;;;;;;;;;;;;;;;;5889:342;:::o;5587:296::-;5681:9;:14;5677:166;;5729:9;5719:6;:19;5711:53;;;;;;;;;;;;;;5800:4;;5778:54;;5800:4;;5815;5822:9;5778:13;:54::i;:::-;5852:15;:24;5587:296::o;2766:2946:19:-;2967:14;2997:23;;:::i;:::-;3063:30;:28;:30::i;:::-;3030:64;;;;3129:17;:15;:17::i;:::-;3104:43;;:10;;;:43;3261:40;;;;3272:10;3261:40;;;3247:10;;;3222:79;;;3223:22;;;;3222:79;;;3383:60;;;;:45;;:60;;3437:4;;3383:60;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3383:60:19;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3383:60:19;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;3383:60:19;;;;;;;;;3358:22;;;:85;;;3453:128;;-1:-1:-1;1814:3:19;;-1:-1:-1;3550:20:19;;3453:128;3620:14;3594:40;;:5;:22;;;:40;;;3590:241;;;3711:74;3734:5;:22;;;3758:2;3762:5;:22;;;3711;:74::i;:::-;-1:-1:-1;3806:14:19;;-1:-1:-1;3799:21:19;;3590:241;3878:5;:10;;;3844:45;;:5;:22;;;:45;;;3840:449;;;1674:42;3930:22;;;;:42;;;;4008:22;;;;3986:19;;;:44;;;4044:10;;;;:43;;;;;3930:42;4044:19;;;;;;:43;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4044:43:19;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;4044:43:19;;;;3840:449;;;4118:160;4164:5;:22;;;4212:5;:11;;;4242:5;:22;;;4118:28;:160::i;:::-;4298:18;4345:5;:10;;;4319:37;;:14;:37;;;4298:58;;4481:20;4504:5;:11;;;:25;;;4536:5;:19;;;4598:5;:22;;;4662:5;:22;;;4727:13;:50;;4763:14;4727:50;;;1674:42;4727:50;4915:13;:70;;4981:2;4915:70;;;4955:4;4915:70;5047:2;5107:1;5167;5183:5;:10;;;4504:699;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4504:699:19;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;4504:699:19;;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;4504:699:19;;;;;;;;;4481:722;;5271:13;5267:135;;;5300:5;:10;;;:18;;;5325:12;5300:40;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5300:40:19;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;5300:40:19;;;;;5354:5;:10;;;:19;;;5374:2;5378:12;5354:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5354:37:19;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;5354:37:19;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;5354:37:19;;;;;;;;;;5267:135;5450:22;;;;5417:257;;5450:43;;1674:42;5450:43;:90;;5518:5;:22;;;5450:90;;;5504:5;:10;;;5450:90;5582:22;;;;5417:257;;;;;5554:14;;5618:12;;5644:4;;5662:2;;5417:257;;;;;;;;;;-1:-1:-1;5691:14:19;;-1:-1:-1;;;2766:2946:19;;;;;;;;;:::o;4112:629:55:-;4415:20;4456:246;4486:9;4509:16;4539:10;4563:15;4592:16;4622:17;4653;4684:8;4456:246;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4719:15:55;;4112:629;;;;;;;;;:::o;6237:373::-;6388:4;;;;6366:10;:27;6358:49;;;;;;;;;;;;;;6417:29;6440:4;;;;;;6417:29;;:14;:29;;;;;;;;:43;;;;;;;;;;;;;:53;;;;;;;6480:29;6417:43;;6480:29;;;;;6464:6;;6480:29;6417;6480;6464:6;6417:43;6480:29;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;6480:29:55;6524:79;6561:12;6587:6;6524:79;;;;;;;;;;;;;;;;6237:373;;:::o;7444:192::-;7604:10;7551:15;7589:26;;;:14;:26;;;;;;;;;:40;;;;;;;;;;;;7444:192::o;6616:346::-;6767:12;6800:134;6837:10;6861:12;6887:14;6915:9;6800:134;;;;;;;;;;8112:137;8237:4;8112:137;:::o;8301:124::-;8375:7;8413:4;;;8301:124;:::o;2581:324:61:-;2727:114;;2703:21;;2763:32;;2727:114;;2809:2;;2825:6;;2727:114;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;2727:114:61;;;49:4:-1;25:18;;61:17;;2727:114:61;182:15:-1;2727:114:61;;;;179:29:-1;;;;160:49;;;2727:114:61;-1:-1:-1;2851:47:61;2882:5;2727:114;2851:30;:47::i;:::-;2581:324;;;;:::o;1978:267::-;2115:52;;;;;2170:6;;2115:28;;;;;;:52;;2152:4;;2159:7;;2115:52;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2115:52:61;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2115:52:61;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;2115:52:61;;;;;;;;;:61;2111:128;;;2192:36;2200:5;2207:7;2224:2;2192:7;:36::i;6120:571::-;6252:15;6269:23;6296:6;:11;;6308:8;6296:21;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;6251:66:61;;;;6331:10;6327:315;;;6361:17;;6357:67;;6403:7;;;;6357:67;6441:10;:17;6462:2;6441:23;6437:195;;;6484:14;6501:35;6522:10;6534:1;6501:20;:35::i;:::-;6484:52;;6558:6;6568:1;6558:11;6554:64;;;6593:7;;;;;6554:64;6437:195;;6651:33;6673:10;6651:21;:33::i;6120:571::-;;;:::o;1194:338::-;1347:121;;1323:21;;1383:31;;1347:121;;1428:7;;1449:9;;1347:121;;;;15929:220:72;16050:14;16097:21;16109:1;16112:5;16097:11;:21::i;:::-;16089:30;15929:220;-1:-1:-1;;;15929:220:72:o;1511:170:75:-;1654:9;1648:16;1641:4;1630:9;1626:20;1619:46;14133:679:72;14254:14;14299:5;14307:2;14299:10;14288:1;:8;:21;14284:297;;;14325:245;14347:222;14409:92;14519:1;:8;14545:5;14553:2;14545:10;14347:44;:222::i;:::-;14325:21;:245::i;:::-;-1:-1:-1;14759:13:72;14661:2;14759:13;14753:20;;14133:679::o;1292:378:73:-;1480:12;1232:10;1551:37;;1602:9;1625:6;1645:8;1515:148;;;;;;;;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;1515:148:73;;;49:4:-1;25:18;;61:17;;1515:148:73;182:15:-1;1515:148:73;;;;179:29:-1;;;;160:49;;;1515:148:73;-1:-1:-1;1292:378:73;;;;;:::o;2891:5536:55:-;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;581:336:-1:-;;;695:3;688:4;680:6;676:17;672:27;662:2;;-1:-1;;703:12;662:2;-1:-1;733:20;;773:18;762:30;;759:2;;;-1:-1;;795:12;759:2;839:4;831:6;827:17;815:29;;890:3;839:4;870:17;831:6;856:32;;853:41;850:2;;;907:1;;897:12;850:2;655:262;;;;;;1777:241;;1881:2;1869:9;1860:7;1856:23;1852:32;1849:2;;;-1:-1;;1887:12;1849:2;85:6;72:20;97:33;124:5;97:33;;2025:478;;;2159:2;2147:9;2138:7;2134:23;2130:32;2127:2;;;-1:-1;;2165:12;2127:2;230:6;217:20;242:41;277:5;242:41;;;2217:71;-1:-1;2353:2;2338:18;;2325:32;2377:18;2366:30;;;2363:2;;;-1:-1;;2399:12;2363:2;2470:6;2459:9;2455:22;1023:3;1016:4;1008:6;1004:17;1000:27;990:2;;-1:-1;;1031:12;990:2;1078:6;1065:20;1051:34;;2377:18;20460:6;20457:30;20454:2;;;-1:-1;;20490:12;20454:2;2159;20122:9;2353:2;20563:9;1016:4;20548:6;20544:17;20540:33;20158:6;20154:17;;20265:6;20253:10;20250:22;2377:18;20217:10;20214:34;20211:62;20208:2;;;-1:-1;;20276:12;20208:2;2159;20295:22;1166:21;;;1266:16;;;2353:2;1266:16;1263:25;-1:-1;1260:2;;;-1:-1;;1291:12;1260:2;1311:41;1345:6;2353:2;1242:5;1238:16;2353:2;1208:6;1204:17;1311:41;;;2419:68;;;;;;;2121:382;;;;;;2510;;;2639:2;2627:9;2618:7;2614:23;2610:32;2607:2;;;-1:-1;;2645:12;2607:2;230:6;217:20;242:41;277:5;242:41;;;2697:71;2805:2;2844:22;;;;1433:20;;-1:-1;;;2601:291;2899:867;;;;;;;3090:3;3078:9;3069:7;3065:23;3061:33;3058:2;;;-1:-1;;3097:12;3058:2;85:6;72:20;97:33;124:5;97:33;;;3149:63;-1:-1;3249:2;3288:22;;72:20;97:33;72:20;97:33;;;3257:63;-1:-1;3357:2;3396:22;;72:20;97:33;72:20;97:33;;;3365:63;-1:-1;3465:2;3504:22;;1433:20;;-1:-1;3601:3;3586:19;;3573:33;3626:18;3615:30;;3612:2;;;-1:-1;;3648:12;3612:2;3686:64;3742:7;3733:6;3722:9;3718:22;3686:64;;;3052:714;;;;-1:-1;3052:714;;-1:-1;3052:714;;3676:74;;3052:714;-1:-1;;;3052:714;3773:491;;;;3911:2;3899:9;3890:7;3886:23;3882:32;3879:2;;;-1:-1;;3917:12;3879:2;85:6;72:20;97:33;124:5;97:33;;;3969:63;-1:-1;4069:2;4108:22;;72:20;97:33;72:20;97:33;;;3873:391;;4077:63;;-1:-1;;;4177:2;4216:22;;;;1433:20;;3873:391;4271:1011;;;;;;;;4485:3;4473:9;4464:7;4460:23;4456:33;4453:2;;;-1:-1;;4492:12;4453:2;85:6;72:20;97:33;124:5;97:33;;;4544:63;-1:-1;4644:2;4683:22;;1433:20;;-1:-1;4752:2;4791:22;;72:20;97:33;72:20;97:33;;;4760:63;-1:-1;4860:2;4907:22;;217:20;242:41;217:20;242:41;;;4868:71;-1:-1;4976:3;5016:22;;1433:20;;-1:-1;5085:3;5125:22;;1433:20;;-1:-1;5194:3;5234:22;;72:20;97:33;72:20;97:33;;;5203:63;;;;4447:835;;;;;;;;;;;5289:1277;;;;;;;;;;5547:3;5535:9;5526:7;5522:23;5518:33;5515:2;;;-1:-1;;5554:12;5515:2;85:6;72:20;97:33;124:5;97:33;;;5606:63;-1:-1;5706:2;5745:22;;1433:20;;-1:-1;5814:2;5853:22;;72:20;97:33;72:20;97:33;;;5822:63;-1:-1;5922:2;5969:22;;217:20;242:41;217:20;242:41;;;5930:71;-1:-1;6038:3;6078:22;;1433:20;;-1:-1;6147:3;6187:22;;1433:20;;-1:-1;6256:3;6304:22;;217:20;242:41;217:20;242:41;;;6265:71;-1:-1;6401:3;6386:19;;6373:33;6426:18;6415:30;;6412:2;;;-1:-1;;6448:12;6412:2;6486:64;6542:7;6533:6;6522:9;6518:22;6486:64;;;6476:74;;;;;;;;;5509:1057;;;;;;;;;;;;6573:257;;6685:2;6673:9;6664:7;6660:23;6656:32;6653:2;;;-1:-1;;6691:12;6653:2;376:6;370:13;24412:5;21671:13;21664:21;24390:5;24387:32;24377:2;;-1:-1;;24423:12;6837:490;;;;6977:2;6965:9;6956:7;6952:23;6948:32;6945:2;;;-1:-1;;6983:12;6945:2;510:6;497:20;7035:63;;7163:2;7152:9;7148:18;7135:32;7187:18;7179:6;7176:30;7173:2;;;-1:-1;;7209:12;7173:2;7247:64;7303:7;7294:6;7283:9;7279:22;7247:64;;;6939:388;;7237:74;;-1:-1;7237:74;;-1:-1;;;;6939:388;7334:241;;7438:2;7426:9;7417:7;7413:23;7409:32;7406:2;;;-1:-1;;7444:12;7406:2;-1:-1;1433:20;;7400:175;-1:-1;7400:175;7582:263;;7697:2;7685:9;7676:7;7672:23;7668:32;7665:2;;;-1:-1;;7703:12;7665:2;-1:-1;1581:13;;7659:186;-1:-1;7659:186;7852:237;;7954:2;7942:9;7933:7;7929:23;7925:32;7922:2;;;-1:-1;;7960:12;7922:2;1722:6;1709:20;22390:4;24780:5;22379:16;24757:5;24754:33;24744:2;;-1:-1;;24791:12;10846:262;;8897:5;20736:12;9008:52;9053:6;9048:3;9041:4;9034:5;9030:16;9008:52;;;9072:16;;;;;10971:137;-1:-1;;10971:137;11115:213;22185:42;22174:54;;;;8332:45;;11233:2;11218:18;;11204:124;11571:563;22185:42;22174:54;;;8175:58;;22174:54;;;11954:2;11939:18;;8332:45;22174:54;;12037:2;12022:18;;8332:45;12120:2;12105:18;;10683:37;;;;11781:3;11766:19;;11752:382;12141:340;22185:42;22174:54;;;;8175:58;;12467:2;12452:18;;10683:37;12295:2;12280:18;;12266:215;12488:324;22185:42;22174:54;;;8332:45;;22174:54;;12798:2;12783:18;;8332:45;12634:2;12619:18;;12605:207;12819:771;22185:42;22174:54;;;8332:45;;22174:54;;;13242:2;13227:18;;8332:45;13325:2;13310:18;;10683:37;;;;13408:2;13393:18;;10683:37;;;;22174:54;;13491:3;13476:19;;8332:45;22174:54;;;13575:3;13560:19;;8332:45;13077:3;13062:19;;13048:542;13928:1151;;14296:3;22185:42;;21481:5;22174:54;8339:3;8332:45;10713:5;14461:2;14450:9;14446:18;10683:37;22185:42;21481:5;22174:54;14544:2;14533:9;14529:18;8332:45;22185:42;21481:5;22174:54;14643:2;14632:9;14628:18;8332:45;10713:5;14726:3;14715:9;14711:19;10683:37;23118:24;14818:3;14807:9;14803:19;9895:58;22185:42;21481:5;22174:54;14918:3;14907:9;14903:19;8332:45;;14296:3;14956;14945:9;14941:19;14934:49;9234:5;20736:12;21020:6;14296:3;14285:9;14281:19;21008;21048:14;;;9327:52;9372:6;21048:14;14285:9;21048:14;14461:2;9353:5;9349:16;9327:52;;;23916:2;23896:14;23912:7;23892:28;9391:39;;;;;;;;14267:812;-1:-1;;;;;;;;;14267:812;15086:201;21671:13;;21664:21;8574:34;;15198:2;15183:18;;15169:118;15294:209;21848:66;21837:78;;;;8689:36;;15410:2;15395:18;;15381:122;15770:503;15978:2;15963:18;;24038:1;24028:12;;24018:2;;24044:9;24018:2;9720:84;;;16176:2;16161:18;;10683:37;;;;16259:2;16244:18;;;10683:37;15949:324;;16280:407;16471:2;16485:47;;;10190:1;16456:18;;;21008:19;10225:11;21048:14;;;10205:32;10256:12;;;16442:245;16694:407;16885:2;16899:47;;;10507:2;16870:18;;;21008:19;10543:23;21048:14;;;10523:44;10586:12;;;16856:245;17108:213;10683:37;;;17226:2;17211:18;;17197:124;17328:435;10683:37;;;22185:42;22174:54;;;;17666:2;17651:18;;8332:45;17749:2;17734:18;;10683:37;17502:2;17487:18;;17473:290;17770:1027;10683:37;;;22185:42;22174:54;;;18265:2;18250:18;;8332:45;18348:2;18333:18;;10683:37;;;;22174:54;;;18431:2;18416:18;;8332:45;22174:54;;;18530:3;18515:19;;8332:45;18614:3;18599:19;;10683:37;18698:3;18683:19;;10683:37;22174:54;18782:3;18767:19;;8332:45;18100:3;18085:19;;18071:726;19854:205;22390:4;22379:16;;;;10799:35;;19968:2;19953:18;;19939:120;23398:145;23479:6;23474:3;23469;23456:30;-1:-1;23535:1;23517:16;;23510:27;23449:94;23552:268;23617:1;23624:101;23638:6;23635:1;23632:13;23624:101;;;23705:11;;;23699:18;23686:11;;;23679:39;23660:2;23653:10;23624:101;;;23740:6;23737:1;23734:13;23731:2;;;-1:-1;;23617:1;23787:16;;23780:27;23601:219;24067:117;22185:42;24154:5;22174:54;24129:5;24126:35;24116:2;;24175:1;;24165:12;24116:2;24110:74;"
            }
        }
    },
    "sourceTreeHashHex": "0xf59be337e34f873fcc7d0d8c2be891029d201dc926aa55e541b3b1ce275fb9b3",
    "sources": {
        "./TestKyberBridge.sol": {
            "id": 55,
            "content": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-erc20/contracts/src/interfaces/IERC20Token.sol\";\nimport \"../src/bridges/KyberBridge.sol\";\nimport \"../src/interfaces/IKyberNetworkProxy.sol\";\n\n\n// solhint-disable no-simple-event-func-name\ninterface ITestContract {\n\n    function wethWithdraw(\n        address payable ownerAddress,\n        uint256 amount\n    )\n        external;\n\n    function wethDeposit(\n        address ownerAddress\n    )\n        external\n        payable;\n\n    function tokenTransfer(\n        address ownerAddress,\n        address recipientAddress,\n        uint256 amount\n    )\n        external\n        returns (bool success);\n\n    function tokenApprove(\n        address ownerAddress,\n        address spenderAddress,\n        uint256 allowance\n    )\n        external\n        returns (bool success);\n\n    function tokenBalanceOf(\n        address ownerAddress\n    )\n        external\n        view\n        returns (uint256 balance);\n}\n\n\n/// @dev A minimalist ERC20/WETH token.\ncontract TestToken {\n\n    uint8 public decimals;\n    ITestContract private _testContract;\n\n    constructor(uint8 decimals_) public {\n        decimals = decimals_;\n        _testContract = ITestContract(msg.sender);\n    }\n\n    function approve(address spender, uint256 allowance)\n        external\n        returns (bool)\n    {\n        return _testContract.tokenApprove(\n            msg.sender,\n            spender,\n            allowance\n        );\n    }\n\n    function transfer(address recipient, uint256 amount)\n        external\n        returns (bool)\n    {\n        return _testContract.tokenTransfer(\n            msg.sender,\n            recipient,\n            amount\n        );\n    }\n\n    function withdraw(uint256 amount)\n        external\n    {\n        return _testContract.wethWithdraw(msg.sender, amount);\n    }\n\n    function deposit()\n        external\n        payable\n    {\n        return _testContract.wethDeposit.value(msg.value)(msg.sender);\n    }\n\n    function allowance(address, address) external view returns (uint256) {\n        return 0;\n    }\n\n    function balanceOf(address owner)\n        external\n        view\n        returns (uint256)\n    {\n        return _testContract.tokenBalanceOf(owner);\n    }\n}\n\n\n/// @dev KyberBridge overridden to mock tokens and implement IKyberBridge.\ncontract TestKyberBridge is\n    KyberBridge,\n    ITestContract,\n    IKyberNetworkProxy\n{\n    event KyberBridgeTrade(\n        uint256 msgValue,\n        address sellTokenAddress,\n        uint256 sellAmount,\n        address buyTokenAddress,\n        address payable recipientAddress,\n        uint256 maxBuyTokenAmount,\n        uint256 minConversionRate,\n        address walletId\n    );\n\n    event KyberBridgeWethWithdraw(\n        address ownerAddress,\n        uint256 amount\n    );\n\n    event KyberBridgeWethDeposit(\n        uint256 msgValue,\n        address ownerAddress,\n        uint256 amount\n    );\n\n    event KyberBridgeTokenApprove(\n        address tokenAddress,\n        address ownerAddress,\n        address spenderAddress,\n        uint256 allowance\n    );\n\n    event KyberBridgeTokenTransfer(\n        address tokenAddress,\n        address ownerAddress,\n        address recipientAddress,\n        uint256 amount\n    );\n\n    IEtherToken public weth;\n    mapping (address => mapping (address => uint256)) private _tokenBalances;\n    uint256 private _nextFillAmount;\n\n    constructor() public {\n        weth = IEtherToken(address(new TestToken(18)));\n    }\n\n    /// @dev Implementation of `IKyberNetworkProxy.trade()`\n    function trade(\n        address sellTokenAddress,\n        uint256 sellAmount,\n        address buyTokenAddress,\n        address payable recipientAddress,\n        uint256 maxBuyTokenAmount,\n        uint256 minConversionRate,\n        address walletId\n    )\n        external\n        payable\n        returns(uint256 boughtAmount)\n    {\n        emit KyberBridgeTrade(\n            msg.value,\n            sellTokenAddress,\n            sellAmount,\n            buyTokenAddress,\n            recipientAddress,\n            maxBuyTokenAmount,\n            minConversionRate,\n            walletId\n        );\n        return _nextFillAmount;\n    }\n\n    function tradeWithHint(\n        address sellTokenAddress,\n        uint256 sellAmount,\n        address buyTokenAddress,\n        address payable recipientAddress,\n        uint256 maxBuyTokenAmount,\n        uint256 minConversionRate,\n        address payable walletId,\n        bytes calldata hint\n    )\n        external\n        payable\n        returns (uint256 boughtAmount)\n    {\n        emit KyberBridgeTrade(\n            msg.value,\n            sellTokenAddress,\n            sellAmount,\n            buyTokenAddress,\n            recipientAddress,\n            maxBuyTokenAmount,\n            minConversionRate,\n            walletId\n        );\n        return _nextFillAmount;\n    }\n\n    function createToken(uint8 decimals)\n        external\n        returns (address tokenAddress)\n    {\n        return address(new TestToken(decimals));\n    }\n\n    function setNextFillAmount(uint256 amount)\n        external\n        payable\n    {\n        if (msg.value != 0) {\n            require(amount == msg.value, \"VALUE_AMOUNT_MISMATCH\");\n            grantTokensTo(address(weth), address(this), msg.value);\n        }\n        _nextFillAmount = amount;\n    }\n\n    function wethDeposit(\n        address ownerAddress\n    )\n        external\n        payable\n    {\n        require(msg.sender == address(weth), \"ONLY_WETH\");\n        grantTokensTo(address(weth), ownerAddress, msg.value);\n        emit KyberBridgeWethDeposit(\n            msg.value,\n            ownerAddress,\n            msg.value\n        );\n    }\n\n    function wethWithdraw(\n        address payable ownerAddress,\n        uint256 amount\n    )\n        external\n    {\n        require(msg.sender == address(weth), \"ONLY_WETH\");\n        _tokenBalances[address(weth)][ownerAddress] -= amount;\n        ownerAddress.transfer(amount);\n        emit KyberBridgeWethWithdraw(\n            ownerAddress,\n            amount\n        );\n    }\n\n    function tokenApprove(\n        address ownerAddress,\n        address spenderAddress,\n        uint256 allowance\n    )\n        external\n        returns (bool success)\n    {\n        emit KyberBridgeTokenApprove(\n            msg.sender,\n            ownerAddress,\n            spenderAddress,\n            allowance\n        );\n        return true;\n    }\n\n    function tokenTransfer(\n        address ownerAddress,\n        address recipientAddress,\n        uint256 amount\n    )\n        external\n        returns (bool success)\n    {\n        _tokenBalances[msg.sender][ownerAddress] -= amount;\n        _tokenBalances[msg.sender][recipientAddress] += amount;\n        emit KyberBridgeTokenTransfer(\n            msg.sender,\n            ownerAddress,\n            recipientAddress,\n            amount\n        );\n        return true;\n    }\n\n    function tokenBalanceOf(\n        address ownerAddress\n    )\n        external\n        view\n        returns (uint256 balance)\n    {\n        return _tokenBalances[msg.sender][ownerAddress];\n    }\n\n    function grantTokensTo(address tokenAddress, address ownerAddress, uint256 amount)\n        public\n        payable\n    {\n        _tokenBalances[tokenAddress][ownerAddress] += amount;\n        if (tokenAddress != address(weth)) {\n            // Send back ether if not WETH.\n            msg.sender.transfer(msg.value);\n        } else {\n            require(msg.value == amount, \"VALUE_AMOUNT_MISMATCH\");\n        }\n    }\n\n    // @dev overridden to point to this contract.\n    function _getKyberNetworkProxyAddress()\n        internal\n        view\n        returns (address)\n    {\n        return address(this);\n    }\n\n    // @dev overridden to point to test WETH.\n    function _getWethAddress()\n        internal\n        view\n        returns (address)\n    {\n        return address(weth);\n    }\n}\n"
        },
        "@0x/contracts-erc20/contracts/src/interfaces/IERC20Token.sol": {
            "id": 62,
            "content": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\ncontract IERC20Token {\n\n    // solhint-disable no-simple-event-func-name\n    event Transfer(\n        address indexed _from,\n        address indexed _to,\n        uint256 _value\n    );\n\n    event Approval(\n        address indexed _owner,\n        address indexed _spender,\n        uint256 _value\n    );\n\n    /// @dev send `value` token to `to` from `msg.sender`\n    /// @param _to The address of the recipient\n    /// @param _value The amount of token to be transferred\n    /// @return True if transfer was successful\n    function transfer(address _to, uint256 _value)\n        external\n        returns (bool);\n\n    /// @dev send `value` token to `to` from `from` on the condition it is approved by `from`\n    /// @param _from The address of the sender\n    /// @param _to The address of the recipient\n    /// @param _value The amount of token to be transferred\n    /// @return True if transfer was successful\n    function transferFrom(\n        address _from,\n        address _to,\n        uint256 _value\n    )\n        external\n        returns (bool);\n\n    /// @dev `msg.sender` approves `_spender` to spend `_value` tokens\n    /// @param _spender The address of the account able to transfer the tokens\n    /// @param _value The amount of wei to be approved for transfer\n    /// @return Always true if the call has enough gas to complete execution\n    function approve(address _spender, uint256 _value)\n        external\n        returns (bool);\n\n    /// @dev Query total supply of token\n    /// @return Total supply of token\n    function totalSupply()\n        external\n        view\n        returns (uint256);\n\n    /// @param _owner The address from which the balance will be retrieved\n    /// @return Balance of owner\n    function balanceOf(address _owner)\n        external\n        view\n        returns (uint256);\n\n    /// @param _owner The address of the account owning tokens\n    /// @param _spender The address of the account able to transfer the tokens\n    /// @return Amount of remaining tokens allowed to spent\n    function allowance(address _owner, address _spender)\n        external\n        view\n        returns (uint256);\n}\n"
        },
        "../src/bridges/KyberBridge.sol": {
            "id": 19,
            "content": "/*\n\n  Copyright 2020 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-erc20/contracts/src/interfaces/IERC20Token.sol\";\nimport \"@0x/contracts-erc20/contracts/src/interfaces/IEtherToken.sol\";\nimport \"@0x/contracts-erc20/contracts/src/LibERC20Token.sol\";\nimport \"@0x/contracts-exchange-libs/contracts/src/IWallet.sol\";\nimport \"@0x/contracts-utils/contracts/src/DeploymentConstants.sol\";\nimport \"@0x/contracts-utils/contracts/src/LibSafeMath.sol\";\nimport \"../interfaces/IERC20Bridge.sol\";\nimport \"../interfaces/IKyberNetworkProxy.sol\";\n\n\n// solhint-disable space-after-comma\ncontract KyberBridge is\n    IERC20Bridge,\n    IWallet,\n    DeploymentConstants\n{\n    using LibSafeMath for uint256;\n\n    // @dev Structure used internally to get around stack limits.\n    struct TradeState {\n        IKyberNetworkProxy kyber;\n        IEtherToken weth;\n        address fromTokenAddress;\n        uint256 fromTokenBalance;\n        uint256 payableAmount;\n        uint256 conversionRate;\n        bytes hint;\n    }\n\n    /// @dev Kyber ETH pseudo-address.\n    address constant public KYBER_ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;\n    /// @dev `bridgeTransferFrom()` failure result.\n    bytes4 constant private BRIDGE_FAILED = 0x0;\n    /// @dev Precision of Kyber rates.\n    uint256 constant private KYBER_RATE_BASE = 10 ** 18;\n\n    // solhint-disable no-empty-blocks\n    /// @dev Payable fallback to receive ETH from Kyber/WETH.\n    function ()\n        external\n        payable\n    {\n        // Poor man's receive in 0.5.9\n        require(msg.data.length == 0);\n    }\n\n    /// @dev Callback for `IKyberBridge`. Tries to buy `amount` of\n    ///      `toTokenAddress` tokens by selling the entirety of the opposing asset\n    ///      to the `KyberNetworkProxy` contract, then transfers the bought\n    ///      tokens to `to`.\n    /// @param toTokenAddress The token to give to `to`.\n    /// @param from The maker (this contract).\n    /// @param to The recipient of the bought tokens.\n    /// @param amount Minimum amount of `toTokenAddress` tokens to buy.\n    /// @param bridgeData The abi-encoeded \"from\" token address.\n    /// @return success The magic bytes if successful.\n    function bridgeTransferFrom(\n        address toTokenAddress,\n        address from,\n        address to,\n        uint256 amount,\n        bytes calldata bridgeData\n    )\n        external\n        returns (bytes4 success)\n    {\n        TradeState memory state;\n        state.kyber = IKyberNetworkProxy(_getKyberNetworkProxyAddress());\n        state.weth = IEtherToken(_getWethAddress());\n        // Decode the bridge data to get the `fromTokenAddress`.\n        (state.fromTokenAddress, state.hint) = abi.decode(bridgeData, (address, bytes));\n        // Query the balance of \"from\" tokens.\n        state.fromTokenBalance = IERC20Token(state.fromTokenAddress).balanceOf(address(this));\n        if (state.fromTokenBalance == 0) {\n            // Return failure if no input tokens.\n            return BRIDGE_FAILED;\n        }\n        if (state.fromTokenAddress == toTokenAddress) {\n            // Just transfer the tokens if they're the same.\n            LibERC20Token.transfer(state.fromTokenAddress, to, state.fromTokenBalance);\n            return BRIDGE_SUCCESS;\n        }\n        if (state.fromTokenAddress == address(state.weth)) {\n            // From WETH\n            state.fromTokenAddress = KYBER_ETH_ADDRESS;\n            state.payableAmount = state.fromTokenBalance;\n            state.weth.withdraw(state.fromTokenBalance);\n        } else {\n            LibERC20Token.approveIfBelow(\n                state.fromTokenAddress,\n                address(state.kyber),\n                state.fromTokenBalance\n            );\n        }\n        bool isToTokenWeth = toTokenAddress == address(state.weth);\n\n        // Try to sell all of this contract's input token balance through\n        // `KyberNetworkProxy.trade()`.\n        uint256 boughtAmount = state.kyber.tradeWithHint.value(state.payableAmount)(\n            // Input token.\n            state.fromTokenAddress,\n            // Sell amount.\n            state.fromTokenBalance,\n            // Output token.\n            isToTokenWeth ? KYBER_ETH_ADDRESS : toTokenAddress,\n            // Transfer to this contract if converting to ETH, otherwise\n            // transfer directly to the recipient.\n            isToTokenWeth ? address(uint160(address(this))) : address(uint160(to)),\n            // Buy as much as possible.\n            uint256(-1),\n            // The minimum conversion rate\n            1,\n            // No affiliate address.\n            address(0),\n            state.hint\n        );\n        // Wrap ETH output and transfer to recipient.\n        if (isToTokenWeth) {\n            state.weth.deposit.value(boughtAmount)();\n            state.weth.transfer(to, boughtAmount);\n        }\n\n        emit ERC20BridgeTransfer(\n            state.fromTokenAddress == KYBER_ETH_ADDRESS ? address(state.weth) : state.fromTokenAddress,\n            toTokenAddress,\n            state.fromTokenBalance,\n            boughtAmount,\n            from,\n            to\n        );\n        return BRIDGE_SUCCESS;\n    }\n\n    /// @dev `SignatureType.Wallet` callback, so that this bridge can be the maker\n    ///      and sign for itself in orders. Always succeeds.\n    /// @return magicValue Magic success bytes, always.\n    function isValidSignature(\n        bytes32,\n        bytes calldata\n    )\n        external\n        view\n        returns (bytes4 magicValue)\n    {\n        return LEGACY_WALLET_MAGIC_VALUE;\n    }\n\n}\n"
        },
        "@0x/contracts-erc20/contracts/src/interfaces/IEtherToken.sol": {
            "id": 63,
            "content": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\nimport \"./IERC20Token.sol\";\n\n\ncontract IEtherToken is\n    IERC20Token\n{\n    function deposit()\n        public\n        payable;\n    \n    function withdraw(uint256 amount)\n        public;\n}\n"
        },
        "@0x/contracts-erc20/contracts/src/LibERC20Token.sol": {
            "id": 61,
            "content": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\nimport \"@0x/contracts-utils/contracts/src/LibRichErrors.sol\";\nimport \"@0x/contracts-utils/contracts/src/LibBytes.sol\";\nimport \"../src/interfaces/IERC20Token.sol\";\n\n\nlibrary LibERC20Token {\n    bytes constant private DECIMALS_CALL_DATA = hex\"313ce567\";\n\n    /// @dev Calls `IERC20Token(token).approve()`.\n    ///      Reverts if `false` is returned or if the return\n    ///      data length is nonzero and not 32 bytes.\n    /// @param token The address of the token contract.\n    /// @param spender The address that receives an allowance.\n    /// @param allowance The allowance to set.\n    function approve(\n        address token,\n        address spender,\n        uint256 allowance\n    )\n        internal\n    {\n        bytes memory callData = abi.encodeWithSelector(\n            IERC20Token(0).approve.selector,\n            spender,\n            allowance\n        );\n        _callWithOptionalBooleanResult(token, callData);\n    }\n\n    /// @dev Calls `IERC20Token(token).approve()` and sets the allowance to the\n    ///      maximum if the current approval is not already >= an amount.\n    ///      Reverts if `false` is returned or if the return\n    ///      data length is nonzero and not 32 bytes.\n    /// @param token The address of the token contract.\n    /// @param spender The address that receives an allowance.\n    /// @param amount The minimum allowance needed.\n    function approveIfBelow(\n        address token,\n        address spender,\n        uint256 amount\n    )\n        internal\n    {\n        if (IERC20Token(token).allowance(address(this), spender) < amount) {\n            approve(token, spender, uint256(-1));\n        }\n    }\n\n    /// @dev Calls `IERC20Token(token).transfer()`.\n    ///      Reverts if `false` is returned or if the return\n    ///      data length is nonzero and not 32 bytes.\n    /// @param token The address of the token contract.\n    /// @param to The address that receives the tokens\n    /// @param amount Number of tokens to transfer.\n    function transfer(\n        address token,\n        address to,\n        uint256 amount\n    )\n        internal\n    {\n        bytes memory callData = abi.encodeWithSelector(\n            IERC20Token(0).transfer.selector,\n            to,\n            amount\n        );\n        _callWithOptionalBooleanResult(token, callData);\n    }\n\n    /// @dev Calls `IERC20Token(token).transferFrom()`.\n    ///      Reverts if `false` is returned or if the return\n    ///      data length is nonzero and not 32 bytes.\n    /// @param token The address of the token contract.\n    /// @param from The owner of the tokens.\n    /// @param to The address that receives the tokens\n    /// @param amount Number of tokens to transfer.\n    function transferFrom(\n        address token,\n        address from,\n        address to,\n        uint256 amount\n    )\n        internal\n    {\n        bytes memory callData = abi.encodeWithSelector(\n            IERC20Token(0).transferFrom.selector,\n            from,\n            to,\n            amount\n        );\n        _callWithOptionalBooleanResult(token, callData);\n    }\n\n    /// @dev Retrieves the number of decimals for a token.\n    ///      Returns `18` if the call reverts.\n    /// @param token The address of the token contract.\n    /// @return tokenDecimals The number of decimals places for the token.\n    function decimals(address token)\n        internal\n        view\n        returns (uint8 tokenDecimals)\n    {\n        tokenDecimals = 18;\n        (bool didSucceed, bytes memory resultData) = token.staticcall(DECIMALS_CALL_DATA);\n        if (didSucceed && resultData.length == 32) {\n            tokenDecimals = uint8(LibBytes.readUint256(resultData, 0));\n        }\n    }\n\n    /// @dev Retrieves the allowance for a token, owner, and spender.\n    ///      Returns `0` if the call reverts.\n    /// @param token The address of the token contract.\n    /// @param owner The owner of the tokens.\n    /// @param spender The address the spender.\n    /// @return allowance The allowance for a token, owner, and spender.\n    function allowance(address token, address owner, address spender)\n        internal\n        view\n        returns (uint256 allowance_)\n    {\n        (bool didSucceed, bytes memory resultData) = token.staticcall(\n            abi.encodeWithSelector(\n                IERC20Token(0).allowance.selector,\n                owner,\n                spender\n            )\n        );\n        if (didSucceed && resultData.length == 32) {\n            allowance_ = LibBytes.readUint256(resultData, 0);\n        }\n    }\n\n    /// @dev Retrieves the balance for a token owner.\n    ///      Returns `0` if the call reverts.\n    /// @param token The address of the token contract.\n    /// @param owner The owner of the tokens.\n    /// @return balance The token balance of an owner.\n    function balanceOf(address token, address owner)\n        internal\n        view\n        returns (uint256 balance)\n    {\n        (bool didSucceed, bytes memory resultData) = token.staticcall(\n            abi.encodeWithSelector(\n                IERC20Token(0).balanceOf.selector,\n                owner\n            )\n        );\n        if (didSucceed && resultData.length == 32) {\n            balance = LibBytes.readUint256(resultData, 0);\n        }\n    }\n\n    /// @dev Executes a call on address `target` with calldata `callData`\n    ///      and asserts that either nothing was returned or a single boolean\n    ///      was returned equal to `true`.\n    /// @param target The call target.\n    /// @param callData The abi-encoded call data.\n    function _callWithOptionalBooleanResult(\n        address target,\n        bytes memory callData\n    )\n        private\n    {\n        (bool didSucceed, bytes memory resultData) = target.call(callData);\n        if (didSucceed) {\n            if (resultData.length == 0) {\n                return;\n            }\n            if (resultData.length == 32) {\n                uint256 result = LibBytes.readUint256(resultData, 0);\n                if (result == 1) {\n                    return;\n                }\n            }\n        }\n        LibRichErrors.rrevert(resultData);\n    }\n}\n"
        },
        "@0x/contracts-utils/contracts/src/LibRichErrors.sol": {
            "id": 75,
            "content": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\nlibrary LibRichErrors {\n\n    // bytes4(keccak256(\"Error(string)\"))\n    bytes4 internal constant STANDARD_ERROR_SELECTOR =\n        0x08c379a0;\n\n    // solhint-disable func-name-mixedcase\n    /// @dev ABI encode a standard, string revert error payload.\n    ///      This is the same payload that would be included by a `revert(string)`\n    ///      solidity statement. It has the function signature `Error(string)`.\n    /// @param message The error string.\n    /// @return The ABI encoded error.\n    function StandardError(\n        string memory message\n    )\n        internal\n        pure\n        returns (bytes memory)\n    {\n        return abi.encodeWithSelector(\n            STANDARD_ERROR_SELECTOR,\n            bytes(message)\n        );\n    }\n    // solhint-enable func-name-mixedcase\n\n    /// @dev Reverts an encoded rich revert reason `errorData`.\n    /// @param errorData ABI encoded error data.\n    function rrevert(bytes memory errorData)\n        internal\n        pure\n    {\n        assembly {\n            revert(add(errorData, 0x20), mload(errorData))\n        }\n    }\n}\n"
        },
        "@0x/contracts-utils/contracts/src/LibBytes.sol": {
            "id": 72,
            "content": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\nimport \"./LibBytesRichErrors.sol\";\nimport \"./LibRichErrors.sol\";\n\n\nlibrary LibBytes {\n\n    using LibBytes for bytes;\n\n    /// @dev Gets the memory address for a byte array.\n    /// @param input Byte array to lookup.\n    /// @return memoryAddress Memory address of byte array. This\n    ///         points to the header of the byte array which contains\n    ///         the length.\n    function rawAddress(bytes memory input)\n        internal\n        pure\n        returns (uint256 memoryAddress)\n    {\n        assembly {\n            memoryAddress := input\n        }\n        return memoryAddress;\n    }\n\n    /// @dev Gets the memory address for the contents of a byte array.\n    /// @param input Byte array to lookup.\n    /// @return memoryAddress Memory address of the contents of the byte array.\n    function contentAddress(bytes memory input)\n        internal\n        pure\n        returns (uint256 memoryAddress)\n    {\n        assembly {\n            memoryAddress := add(input, 32)\n        }\n        return memoryAddress;\n    }\n\n    /// @dev Copies `length` bytes from memory location `source` to `dest`.\n    /// @param dest memory address to copy bytes to.\n    /// @param source memory address to copy bytes from.\n    /// @param length number of bytes to copy.\n    function memCopy(\n        uint256 dest,\n        uint256 source,\n        uint256 length\n    )\n        internal\n        pure\n    {\n        if (length < 32) {\n            // Handle a partial word by reading destination and masking\n            // off the bits we are interested in.\n            // This correctly handles overlap, zero lengths and source == dest\n            assembly {\n                let mask := sub(exp(256, sub(32, length)), 1)\n                let s := and(mload(source), not(mask))\n                let d := and(mload(dest), mask)\n                mstore(dest, or(s, d))\n            }\n        } else {\n            // Skip the O(length) loop when source == dest.\n            if (source == dest) {\n                return;\n            }\n\n            // For large copies we copy whole words at a time. The final\n            // word is aligned to the end of the range (instead of after the\n            // previous) to handle partial words. So a copy will look like this:\n            //\n            //  ####\n            //      ####\n            //          ####\n            //            ####\n            //\n            // We handle overlap in the source and destination range by\n            // changing the copying direction. This prevents us from\n            // overwriting parts of source that we still need to copy.\n            //\n            // This correctly handles source == dest\n            //\n            if (source > dest) {\n                assembly {\n                    // We subtract 32 from `sEnd` and `dEnd` because it\n                    // is easier to compare with in the loop, and these\n                    // are also the addresses we need for copying the\n                    // last bytes.\n                    length := sub(length, 32)\n                    let sEnd := add(source, length)\n                    let dEnd := add(dest, length)\n\n                    // Remember the last 32 bytes of source\n                    // This needs to be done here and not after the loop\n                    // because we may have overwritten the last bytes in\n                    // source already due to overlap.\n                    let last := mload(sEnd)\n\n                    // Copy whole words front to back\n                    // Note: the first check is always true,\n                    // this could have been a do-while loop.\n                    // solhint-disable-next-line no-empty-blocks\n                    for {} lt(source, sEnd) {} {\n                        mstore(dest, mload(source))\n                        source := add(source, 32)\n                        dest := add(dest, 32)\n                    }\n\n                    // Write the last 32 bytes\n                    mstore(dEnd, last)\n                }\n            } else {\n                assembly {\n                    // We subtract 32 from `sEnd` and `dEnd` because those\n                    // are the starting points when copying a word at the end.\n                    length := sub(length, 32)\n                    let sEnd := add(source, length)\n                    let dEnd := add(dest, length)\n\n                    // Remember the first 32 bytes of source\n                    // This needs to be done here and not after the loop\n                    // because we may have overwritten the first bytes in\n                    // source already due to overlap.\n                    let first := mload(source)\n\n                    // Copy whole words back to front\n                    // We use a signed comparisson here to allow dEnd to become\n                    // negative (happens when source and dest < 32). Valid\n                    // addresses in local memory will never be larger than\n                    // 2**255, so they can be safely re-interpreted as signed.\n                    // Note: the first check is always true,\n                    // this could have been a do-while loop.\n                    // solhint-disable-next-line no-empty-blocks\n                    for {} slt(dest, dEnd) {} {\n                        mstore(dEnd, mload(sEnd))\n                        sEnd := sub(sEnd, 32)\n                        dEnd := sub(dEnd, 32)\n                    }\n\n                    // Write the first 32 bytes\n                    mstore(dest, first)\n                }\n            }\n        }\n    }\n\n    /// @dev Returns a slices from a byte array.\n    /// @param b The byte array to take a slice from.\n    /// @param from The starting index for the slice (inclusive).\n    /// @param to The final index for the slice (exclusive).\n    /// @return result The slice containing bytes at indices [from, to)\n    function slice(\n        bytes memory b,\n        uint256 from,\n        uint256 to\n    )\n        internal\n        pure\n        returns (bytes memory result)\n    {\n        // Ensure that the from and to positions are valid positions for a slice within\n        // the byte array that is being used.\n        if (from > to) {\n            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n                LibBytesRichErrors.InvalidByteOperationErrorCodes.FromLessThanOrEqualsToRequired,\n                from,\n                to\n            ));\n        }\n        if (to > b.length) {\n            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n                LibBytesRichErrors.InvalidByteOperationErrorCodes.ToLessThanOrEqualsLengthRequired,\n                to,\n                b.length\n            ));\n        }\n\n        // Create a new bytes structure and copy contents\n        result = new bytes(to - from);\n        memCopy(\n            result.contentAddress(),\n            b.contentAddress() + from,\n            result.length\n        );\n        return result;\n    }\n\n    /// @dev Returns a slice from a byte array without preserving the input.\n    /// @param b The byte array to take a slice from. Will be destroyed in the process.\n    /// @param from The starting index for the slice (inclusive).\n    /// @param to The final index for the slice (exclusive).\n    /// @return result The slice containing bytes at indices [from, to)\n    /// @dev When `from == 0`, the original array will match the slice. In other cases its state will be corrupted.\n    function sliceDestructive(\n        bytes memory b,\n        uint256 from,\n        uint256 to\n    )\n        internal\n        pure\n        returns (bytes memory result)\n    {\n        // Ensure that the from and to positions are valid positions for a slice within\n        // the byte array that is being used.\n        if (from > to) {\n            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n                LibBytesRichErrors.InvalidByteOperationErrorCodes.FromLessThanOrEqualsToRequired,\n                from,\n                to\n            ));\n        }\n        if (to > b.length) {\n            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n                LibBytesRichErrors.InvalidByteOperationErrorCodes.ToLessThanOrEqualsLengthRequired,\n                to,\n                b.length\n            ));\n        }\n\n        // Create a new bytes structure around [from, to) in-place.\n        assembly {\n            result := add(b, from)\n            mstore(result, sub(to, from))\n        }\n        return result;\n    }\n\n    /// @dev Pops the last byte off of a byte array by modifying its length.\n    /// @param b Byte array that will be modified.\n    /// @return The byte that was popped off.\n    function popLastByte(bytes memory b)\n        internal\n        pure\n        returns (bytes1 result)\n    {\n        if (b.length == 0) {\n            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n                LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanZeroRequired,\n                b.length,\n                0\n            ));\n        }\n\n        // Store last byte.\n        result = b[b.length - 1];\n\n        assembly {\n            // Decrement length of byte array.\n            let newLen := sub(mload(b), 1)\n            mstore(b, newLen)\n        }\n        return result;\n    }\n\n    /// @dev Tests equality of two byte arrays.\n    /// @param lhs First byte array to compare.\n    /// @param rhs Second byte array to compare.\n    /// @return True if arrays are the same. False otherwise.\n    function equals(\n        bytes memory lhs,\n        bytes memory rhs\n    )\n        internal\n        pure\n        returns (bool equal)\n    {\n        // Keccak gas cost is 30 + numWords * 6. This is a cheap way to compare.\n        // We early exit on unequal lengths, but keccak would also correctly\n        // handle this.\n        return lhs.length == rhs.length && keccak256(lhs) == keccak256(rhs);\n    }\n\n    /// @dev Reads an address from a position in a byte array.\n    /// @param b Byte array containing an address.\n    /// @param index Index in byte array of address.\n    /// @return address from byte array.\n    function readAddress(\n        bytes memory b,\n        uint256 index\n    )\n        internal\n        pure\n        returns (address result)\n    {\n        if (b.length < index + 20) {\n            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n                LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsTwentyRequired,\n                b.length,\n                index + 20 // 20 is length of address\n            ));\n        }\n\n        // Add offset to index:\n        // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)\n        // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)\n        index += 20;\n\n        // Read address from array memory\n        assembly {\n            // 1. Add index to address of bytes array\n            // 2. Load 32-byte word from memory\n            // 3. Apply 20-byte mask to obtain address\n            result := and(mload(add(b, index)), 0xffffffffffffffffffffffffffffffffffffffff)\n        }\n        return result;\n    }\n\n    /// @dev Writes an address into a specific position in a byte array.\n    /// @param b Byte array to insert address into.\n    /// @param index Index in byte array of address.\n    /// @param input Address to put into byte array.\n    function writeAddress(\n        bytes memory b,\n        uint256 index,\n        address input\n    )\n        internal\n        pure\n    {\n        if (b.length < index + 20) {\n            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n                LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsTwentyRequired,\n                b.length,\n                index + 20 // 20 is length of address\n            ));\n        }\n\n        // Add offset to index:\n        // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)\n        // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)\n        index += 20;\n\n        // Store address into array memory\n        assembly {\n            // The address occupies 20 bytes and mstore stores 32 bytes.\n            // First fetch the 32-byte word where we'll be storing the address, then\n            // apply a mask so we have only the bytes in the word that the address will not occupy.\n            // Then combine these bytes with the address and store the 32 bytes back to memory with mstore.\n\n            // 1. Add index to address of bytes array\n            // 2. Load 32-byte word from memory\n            // 3. Apply 12-byte mask to obtain extra bytes occupying word of memory where we'll store the address\n            let neighbors := and(\n                mload(add(b, index)),\n                0xffffffffffffffffffffffff0000000000000000000000000000000000000000\n            )\n\n            // Make sure input address is clean.\n            // (Solidity does not guarantee this)\n            input := and(input, 0xffffffffffffffffffffffffffffffffffffffff)\n\n            // Store the neighbors and address into memory\n            mstore(add(b, index), xor(input, neighbors))\n        }\n    }\n\n    /// @dev Reads a bytes32 value from a position in a byte array.\n    /// @param b Byte array containing a bytes32 value.\n    /// @param index Index in byte array of bytes32 value.\n    /// @return bytes32 value from byte array.\n    function readBytes32(\n        bytes memory b,\n        uint256 index\n    )\n        internal\n        pure\n        returns (bytes32 result)\n    {\n        if (b.length < index + 32) {\n            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n                LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsThirtyTwoRequired,\n                b.length,\n                index + 32\n            ));\n        }\n\n        // Arrays are prefixed by a 256 bit length parameter\n        index += 32;\n\n        // Read the bytes32 from array memory\n        assembly {\n            result := mload(add(b, index))\n        }\n        return result;\n    }\n\n    /// @dev Writes a bytes32 into a specific position in a byte array.\n    /// @param b Byte array to insert <input> into.\n    /// @param index Index in byte array of <input>.\n    /// @param input bytes32 to put into byte array.\n    function writeBytes32(\n        bytes memory b,\n        uint256 index,\n        bytes32 input\n    )\n        internal\n        pure\n    {\n        if (b.length < index + 32) {\n            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n                LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsThirtyTwoRequired,\n                b.length,\n                index + 32\n            ));\n        }\n\n        // Arrays are prefixed by a 256 bit length parameter\n        index += 32;\n\n        // Read the bytes32 from array memory\n        assembly {\n            mstore(add(b, index), input)\n        }\n    }\n\n    /// @dev Reads a uint256 value from a position in a byte array.\n    /// @param b Byte array containing a uint256 value.\n    /// @param index Index in byte array of uint256 value.\n    /// @return uint256 value from byte array.\n    function readUint256(\n        bytes memory b,\n        uint256 index\n    )\n        internal\n        pure\n        returns (uint256 result)\n    {\n        result = uint256(readBytes32(b, index));\n        return result;\n    }\n\n    /// @dev Writes a uint256 into a specific position in a byte array.\n    /// @param b Byte array to insert <input> into.\n    /// @param index Index in byte array of <input>.\n    /// @param input uint256 to put into byte array.\n    function writeUint256(\n        bytes memory b,\n        uint256 index,\n        uint256 input\n    )\n        internal\n        pure\n    {\n        writeBytes32(b, index, bytes32(input));\n    }\n\n    /// @dev Reads an unpadded bytes4 value from a position in a byte array.\n    /// @param b Byte array containing a bytes4 value.\n    /// @param index Index in byte array of bytes4 value.\n    /// @return bytes4 value from byte array.\n    function readBytes4(\n        bytes memory b,\n        uint256 index\n    )\n        internal\n        pure\n        returns (bytes4 result)\n    {\n        if (b.length < index + 4) {\n            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n                LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsFourRequired,\n                b.length,\n                index + 4\n            ));\n        }\n\n        // Arrays are prefixed by a 32 byte length field\n        index += 32;\n\n        // Read the bytes4 from array memory\n        assembly {\n            result := mload(add(b, index))\n            // Solidity does not require us to clean the trailing bytes.\n            // We do it anyway\n            result := and(result, 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000)\n        }\n        return result;\n    }\n\n    /// @dev Writes a new length to a byte array.\n    ///      Decreasing length will lead to removing the corresponding lower order bytes from the byte array.\n    ///      Increasing length may lead to appending adjacent in-memory bytes to the end of the byte array.\n    /// @param b Bytes array to write new length to.\n    /// @param length New length of byte array.\n    function writeLength(bytes memory b, uint256 length)\n        internal\n        pure\n    {\n        assembly {\n            mstore(b, length)\n        }\n    }\n}\n"
        },
        "@0x/contracts-utils/contracts/src/LibBytesRichErrors.sol": {
            "id": 73,
            "content": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\nlibrary LibBytesRichErrors {\n\n    enum InvalidByteOperationErrorCodes {\n        FromLessThanOrEqualsToRequired,\n        ToLessThanOrEqualsLengthRequired,\n        LengthGreaterThanZeroRequired,\n        LengthGreaterThanOrEqualsFourRequired,\n        LengthGreaterThanOrEqualsTwentyRequired,\n        LengthGreaterThanOrEqualsThirtyTwoRequired,\n        LengthGreaterThanOrEqualsNestedBytesLengthRequired,\n        DestinationLengthGreaterThanOrEqualSourceLengthRequired\n    }\n\n    // bytes4(keccak256(\"InvalidByteOperationError(uint8,uint256,uint256)\"))\n    bytes4 internal constant INVALID_BYTE_OPERATION_ERROR_SELECTOR =\n        0x28006595;\n\n    // solhint-disable func-name-mixedcase\n    function InvalidByteOperationError(\n        InvalidByteOperationErrorCodes errorCode,\n        uint256 offset,\n        uint256 required\n    )\n        internal\n        pure\n        returns (bytes memory)\n    {\n        return abi.encodeWithSelector(\n            INVALID_BYTE_OPERATION_ERROR_SELECTOR,\n            errorCode,\n            offset,\n            required\n        );\n    }\n}\n"
        },
        "@0x/contracts-exchange-libs/contracts/src/IWallet.sol": {
            "id": 64,
            "content": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\n\ncontract IWallet {\n\n    bytes4 internal constant LEGACY_WALLET_MAGIC_VALUE = 0xb0671381;\n\n    /// @dev Validates a hash with the `Wallet` signature type.\n    /// @param hash Message hash that is signed.\n    /// @param signature Proof of signing.\n    /// @return magicValue `bytes4(0xb0671381)` if the signature check succeeds.\n    function isValidSignature(\n        bytes32 hash,\n        bytes calldata signature\n    )\n        external\n        view\n        returns (bytes4 magicValue);\n}\n"
        },
        "@0x/contracts-utils/contracts/src/DeploymentConstants.sol": {
            "id": 68,
            "content": "/*\n\n  Copyright 2020 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\ncontract DeploymentConstants {\n\n    // solhint-disable separate-by-one-line-in-contract\n\n    // Mainnet addresses ///////////////////////////////////////////////////////\n    /// @dev Mainnet address of the WETH contract.\n    address constant private WETH_ADDRESS = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;\n    /// @dev Mainnet address of the KyberNetworkProxy contract.\n    address constant private KYBER_NETWORK_PROXY_ADDRESS = 0x9AAb3f75489902f3a48495025729a0AF77d4b11e;\n    /// @dev Mainnet address of the KyberHintHandler contract.\n    address constant private KYBER_HINT_HANDLER_ADDRESS = 0xa1C0Fa73c39CFBcC11ec9Eb1Afc665aba9996E2C;\n    /// @dev Mainnet address of the `UniswapExchangeFactory` contract.\n    address constant private UNISWAP_EXCHANGE_FACTORY_ADDRESS = 0xc0a47dFe034B400B47bDaD5FecDa2621de6c4d95;\n    /// @dev Mainnet address of the `UniswapV2Router01` contract.\n    address constant private UNISWAP_V2_ROUTER_01_ADDRESS = 0xf164fC0Ec4E93095b804a4795bBe1e041497b92a;\n    /// @dev Mainnet address of the Eth2Dai `MatchingMarket` contract.\n    address constant private ETH2DAI_ADDRESS = 0x794e6e91555438aFc3ccF1c5076A74F42133d08D;\n    /// @dev Mainnet address of the `ERC20BridgeProxy` contract\n    address constant private ERC20_BRIDGE_PROXY_ADDRESS = 0x8ED95d1746bf1E4dAb58d8ED4724f1Ef95B20Db0;\n    ///@dev Mainnet address of the `Dai` (multi-collateral) contract\n    address constant private DAI_ADDRESS = 0x6B175474E89094C44Da98b954EedeAC495271d0F;\n    /// @dev Mainnet address of the `Chai` contract\n    address constant private CHAI_ADDRESS = 0x06AF07097C9Eeb7fD685c692751D5C66dB49c215;\n    /// @dev Mainnet address of the 0x DevUtils contract.\n    address constant private DEV_UTILS_ADDRESS = 0x74134CF88b21383713E096a5ecF59e297dc7f547;\n    /// @dev Kyber ETH pseudo-address.\n    address constant internal KYBER_ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;\n    /// @dev Mainnet address of the dYdX contract.\n    address constant private DYDX_ADDRESS = 0x1E0447b19BB6EcFdAe1e4AE1694b0C3659614e4e;\n    /// @dev Mainnet address of the GST2 contract\n    address constant private GST_ADDRESS = 0x0000000000b3F879cb30FE243b4Dfee438691c04;\n    /// @dev Mainnet address of the GST Collector\n    address constant private GST_COLLECTOR_ADDRESS = 0x000000D3b08566BE75A6DB803C03C85C0c1c5B96;\n    /// @dev Mainnet address of the mStable mUSD contract.\n    address constant private MUSD_ADDRESS = 0xe2f2a5C287993345a840Db3B0845fbC70f5935a5;\n    /// @dev Mainnet address of the Mooniswap Registry contract\n    address constant private MOONISWAP_REGISTRY = 0x71CD6666064C3A1354a3B4dca5fA1E2D3ee7D303;\n    /// @dev Mainnet address of the DODO Registry (ZOO) contract\n    address constant private DODO_REGISTRY = 0x3A97247DF274a17C59A3bd12735ea3FcDFb49950;\n    /// @dev Mainnet address of the DODO Helper contract\n    address constant private DODO_HELPER = 0x533dA777aeDCE766CEAe696bf90f8541A4bA80Eb;\n\n    // // Ropsten addresses ///////////////////////////////////////////////////////\n    // /// @dev Mainnet address of the WETH contract.\n    // address constant private WETH_ADDRESS = 0xc778417E063141139Fce010982780140Aa0cD5Ab;\n    // /// @dev Mainnet address of the KyberNetworkProxy contract.\n    // address constant private KYBER_NETWORK_PROXY_ADDRESS = 0xd719c34261e099Fdb33030ac8909d5788D3039C4;\n    // /// @dev Mainnet address of the `UniswapExchangeFactory` contract.\n    // address constant private UNISWAP_EXCHANGE_FACTORY_ADDRESS = 0x9c83dCE8CA20E9aAF9D3efc003b2ea62aBC08351;\n    // /// @dev Mainnet address of the `UniswapV2Router01` contract.\n    // address constant private UNISWAP_V2_ROUTER_01_ADDRESS = 0xf164fC0Ec4E93095b804a4795bBe1e041497b92a;\n    // /// @dev Mainnet address of the Eth2Dai `MatchingMarket` contract.\n    // address constant private ETH2DAI_ADDRESS = address(0);\n    // /// @dev Mainnet address of the `ERC20BridgeProxy` contract\n    // address constant private ERC20_BRIDGE_PROXY_ADDRESS = 0xb344afeD348de15eb4a9e180205A2B0739628339;\n    // ///@dev Mainnet address of the `Dai` (multi-collateral) contract\n    // address constant private DAI_ADDRESS = address(0);\n    // /// @dev Mainnet address of the `Chai` contract\n    // address constant private CHAI_ADDRESS = address(0);\n    // /// @dev Mainnet address of the 0x DevUtils contract.\n    // address constant private DEV_UTILS_ADDRESS = 0xC812AF3f3fBC62F76ea4262576EC0f49dB8B7f1c;\n    // /// @dev Kyber ETH pseudo-address.\n    // address constant internal KYBER_ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;\n    // /// @dev Mainnet address of the dYdX contract.\n    // address constant private DYDX_ADDRESS = address(0);\n    // /// @dev Mainnet address of the GST2 contract\n    // address constant private GST_ADDRESS = address(0);\n    // /// @dev Mainnet address of the GST Collector\n    // address constant private GST_COLLECTOR_ADDRESS = address(0);\n    // /// @dev Mainnet address of the mStable mUSD contract.\n    // address constant private MUSD_ADDRESS = 0x4E1000616990D83e56f4b5fC6CC8602DcfD20459;\n\n    // // Rinkeby addresses ///////////////////////////////////////////////////////\n    // /// @dev Mainnet address of the WETH contract.\n    // address constant private WETH_ADDRESS = 0xc778417E063141139Fce010982780140Aa0cD5Ab;\n    // /// @dev Mainnet address of the KyberNetworkProxy contract.\n    // address constant private KYBER_NETWORK_PROXY_ADDRESS = 0x0d5371e5EE23dec7DF251A8957279629aa79E9C5;\n    // /// @dev Mainnet address of the `UniswapExchangeFactory` contract.\n    // address constant private UNISWAP_EXCHANGE_FACTORY_ADDRESS = 0xf5D915570BC477f9B8D6C0E980aA81757A3AaC36;\n    // /// @dev Mainnet address of the `UniswapV2Router01` contract.\n    // address constant private UNISWAP_V2_ROUTER_01_ADDRESS = 0xf164fC0Ec4E93095b804a4795bBe1e041497b92a;\n    // /// @dev Mainnet address of the Eth2Dai `MatchingMarket` contract.\n    // address constant private ETH2DAI_ADDRESS = address(0);\n    // /// @dev Mainnet address of the `ERC20BridgeProxy` contract\n    // address constant private ERC20_BRIDGE_PROXY_ADDRESS = 0xA2AA4bEFED748Fba27a3bE7Dfd2C4b2c6DB1F49B;\n    // ///@dev Mainnet address of the `Dai` (multi-collateral) contract\n    // address constant private DAI_ADDRESS = address(0);\n    // /// @dev Mainnet address of the `Chai` contract\n    // address constant private CHAI_ADDRESS = address(0);\n    // /// @dev Mainnet address of the 0x DevUtils contract.\n    // address constant private DEV_UTILS_ADDRESS = 0x46B5BC959e8A754c0256FFF73bF34A52Ad5CdfA9;\n    // /// @dev Kyber ETH pseudo-address.\n    // address constant internal KYBER_ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;\n    // /// @dev Mainnet address of the dYdX contract.\n    // address constant private DYDX_ADDRESS = address(0);\n    // /// @dev Mainnet address of the GST2 contract\n    // address constant private GST_ADDRESS = address(0);\n    // /// @dev Mainnet address of the GST Collector\n    // address constant private GST_COLLECTOR_ADDRESS = address(0);\n    // /// @dev Mainnet address of the mStable mUSD contract.\n    // address constant private MUSD_ADDRESS = address(0);\n\n    // // Kovan addresses /////////////////////////////////////////////////////////\n    // /// @dev Kovan address of the WETH contract.\n    // address constant private WETH_ADDRESS = 0xd0A1E359811322d97991E03f863a0C30C2cF029C;\n    // /// @dev Kovan address of the KyberNetworkProxy contract.\n    // address constant private KYBER_NETWORK_PROXY_ADDRESS = 0x692f391bCc85cefCe8C237C01e1f636BbD70EA4D;\n    // /// @dev Kovan address of the `UniswapExchangeFactory` contract.\n    // address constant private UNISWAP_EXCHANGE_FACTORY_ADDRESS = 0xD3E51Ef092B2845f10401a0159B2B96e8B6c3D30;\n    // /// @dev Kovan address of the `UniswapV2Router01` contract.\n    // address constant private UNISWAP_V2_ROUTER_01_ADDRESS = 0xf164fC0Ec4E93095b804a4795bBe1e041497b92a;\n    // /// @dev Kovan address of the Eth2Dai `MatchingMarket` contract.\n    // address constant private ETH2DAI_ADDRESS = 0xe325acB9765b02b8b418199bf9650972299235F4;\n    // /// @dev Kovan address of the `ERC20BridgeProxy` contract\n    // address constant private ERC20_BRIDGE_PROXY_ADDRESS = 0x3577552C1Fb7A44aD76BeEB7aB53251668A21F8D;\n    // /// @dev Kovan address of the `Chai` contract\n    // address constant private CHAI_ADDRESS = address(0);\n    // /// @dev Kovan address of the `Dai` (multi-collateral) contract\n    // address constant private DAI_ADDRESS = 0x4F96Fe3b7A6Cf9725f59d353F723c1bDb64CA6Aa;\n    // /// @dev Kovan address of the 0x DevUtils contract.\n    // address constant private DEV_UTILS_ADDRESS = 0x9402639A828BdF4E9e4103ac3B69E1a6E522eB59;\n    // /// @dev Kyber ETH pseudo-address.\n    // address constant internal KYBER_ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;\n    // /// @dev Kovan address of the dYdX contract.\n    // address constant private DYDX_ADDRESS = address(0);\n    // /// @dev Kovan address of the GST2 contract\n    // address constant private GST_ADDRESS = address(0);\n    // /// @dev Kovan address of the GST Collector\n    // address constant private GST_COLLECTOR_ADDRESS = address(0);\n    // /// @dev Mainnet address of the mStable mUSD contract.\n    // address constant private MUSD_ADDRESS = address(0);\n\n    /// @dev Overridable way to get the `KyberNetworkProxy` address.\n    /// @return kyberAddress The `IKyberNetworkProxy` address.\n    function _getKyberNetworkProxyAddress()\n        internal\n        view\n        returns (address kyberAddress)\n    {\n        return KYBER_NETWORK_PROXY_ADDRESS;\n    }\n\n    /// @dev Overridable way to get the `KyberHintHandler` address.\n    /// @return kyberAddress The `IKyberHintHandler` address.\n    function _getKyberHintHandlerAddress()\n        internal\n        view\n        returns (address hintHandlerAddress)\n    {\n        return KYBER_HINT_HANDLER_ADDRESS;\n    }\n\n    /// @dev Overridable way to get the WETH address.\n    /// @return wethAddress The WETH address.\n    function _getWethAddress()\n        internal\n        view\n        returns (address wethAddress)\n    {\n        return WETH_ADDRESS;\n    }\n\n    /// @dev Overridable way to get the `UniswapExchangeFactory` address.\n    /// @return uniswapAddress The `UniswapExchangeFactory` address.\n    function _getUniswapExchangeFactoryAddress()\n        internal\n        view\n        returns (address uniswapAddress)\n    {\n        return UNISWAP_EXCHANGE_FACTORY_ADDRESS;\n    }\n\n    /// @dev Overridable way to get the `UniswapV2Router01` address.\n    /// @return uniswapRouterAddress The `UniswapV2Router01` address.\n    function _getUniswapV2Router01Address()\n        internal\n        view\n        returns (address uniswapRouterAddress)\n    {\n        return UNISWAP_V2_ROUTER_01_ADDRESS;\n    }\n\n    /// @dev An overridable way to retrieve the Eth2Dai `MatchingMarket` contract.\n    /// @return eth2daiAddress The Eth2Dai `MatchingMarket` contract.\n    function _getEth2DaiAddress()\n        internal\n        view\n        returns (address eth2daiAddress)\n    {\n        return ETH2DAI_ADDRESS;\n    }\n\n    /// @dev An overridable way to retrieve the `ERC20BridgeProxy` contract.\n    /// @return erc20BridgeProxyAddress The `ERC20BridgeProxy` contract.\n    function _getERC20BridgeProxyAddress()\n        internal\n        view\n        returns (address erc20BridgeProxyAddress)\n    {\n        return ERC20_BRIDGE_PROXY_ADDRESS;\n    }\n\n    /// @dev An overridable way to retrieve the `Dai` contract.\n    /// @return daiAddress The `Dai` contract.\n    function _getDaiAddress()\n        internal\n        view\n        returns (address daiAddress)\n    {\n        return DAI_ADDRESS;\n    }\n\n    /// @dev An overridable way to retrieve the `Chai` contract.\n    /// @return chaiAddress The `Chai` contract.\n    function _getChaiAddress()\n        internal\n        view\n        returns (address chaiAddress)\n    {\n        return CHAI_ADDRESS;\n    }\n\n    /// @dev An overridable way to retrieve the 0x `DevUtils` contract address.\n    /// @return devUtils The 0x `DevUtils` contract address.\n    function _getDevUtilsAddress()\n        internal\n        view\n        returns (address devUtils)\n    {\n        return DEV_UTILS_ADDRESS;\n    }\n\n    /// @dev Overridable way to get the DyDx contract.\n    /// @return exchange The DyDx exchange contract.\n    function _getDydxAddress()\n        internal\n        view\n        returns (address dydxAddress)\n    {\n        return DYDX_ADDRESS;\n    }\n\n    /// @dev An overridable way to retrieve the GST2 contract address.\n    /// @return gst The GST contract.\n    function _getGstAddress()\n        internal\n        view\n        returns (address gst)\n    {\n        return GST_ADDRESS;\n    }\n\n    /// @dev An overridable way to retrieve the GST Collector address.\n    /// @return collector The GST collector address.\n    function _getGstCollectorAddress()\n        internal\n        view\n        returns (address collector)\n    {\n        return GST_COLLECTOR_ADDRESS;\n    }\n\n    /// @dev An overridable way to retrieve the mStable mUSD address.\n    /// @return musd The mStable mUSD address.\n    function _getMUsdAddress()\n        internal\n        view\n        returns (address musd)\n    {\n        return MUSD_ADDRESS;\n    }\n\n    /// @dev An overridable way to retrieve the Mooniswap registry address.\n    /// @return registry The Mooniswap registry address.\n    function _getMooniswapAddress()\n        internal\n        view\n        returns (address)\n    {\n        return MOONISWAP_REGISTRY;\n    }\n\n    /// @dev An overridable way to retrieve the DODO Registry contract address.\n    /// @return registry The DODO Registry contract address.\n    function _getDODORegistryAddress()\n        internal\n        view\n        returns (address)\n    {\n        return DODO_REGISTRY;\n    }\n\n    /// @dev An overridable way to retrieve the DODO Helper contract address.\n    /// @return registry The DODO Helper contract address.\n    function _getDODOHelperAddress()\n        internal\n        view\n        returns (address)\n    {\n        return DODO_HELPER;\n    }\n}\n"
        },
        "@0x/contracts-utils/contracts/src/LibSafeMath.sol": {
            "id": 76,
            "content": "pragma solidity ^0.5.9;\n\nimport \"./LibRichErrors.sol\";\nimport \"./LibSafeMathRichErrors.sol\";\n\n\nlibrary LibSafeMath {\n\n    function safeMul(uint256 a, uint256 b)\n        internal\n        pure\n        returns (uint256)\n    {\n        if (a == 0) {\n            return 0;\n        }\n        uint256 c = a * b;\n        if (c / a != b) {\n            LibRichErrors.rrevert(LibSafeMathRichErrors.Uint256BinOpError(\n                LibSafeMathRichErrors.BinOpErrorCodes.MULTIPLICATION_OVERFLOW,\n                a,\n                b\n            ));\n        }\n        return c;\n    }\n\n    function safeDiv(uint256 a, uint256 b)\n        internal\n        pure\n        returns (uint256)\n    {\n        if (b == 0) {\n            LibRichErrors.rrevert(LibSafeMathRichErrors.Uint256BinOpError(\n                LibSafeMathRichErrors.BinOpErrorCodes.DIVISION_BY_ZERO,\n                a,\n                b\n            ));\n        }\n        uint256 c = a / b;\n        return c;\n    }\n\n    function safeSub(uint256 a, uint256 b)\n        internal\n        pure\n        returns (uint256)\n    {\n        if (b > a) {\n            LibRichErrors.rrevert(LibSafeMathRichErrors.Uint256BinOpError(\n                LibSafeMathRichErrors.BinOpErrorCodes.SUBTRACTION_UNDERFLOW,\n                a,\n                b\n            ));\n        }\n        return a - b;\n    }\n\n    function safeAdd(uint256 a, uint256 b)\n        internal\n        pure\n        returns (uint256)\n    {\n        uint256 c = a + b;\n        if (c < a) {\n            LibRichErrors.rrevert(LibSafeMathRichErrors.Uint256BinOpError(\n                LibSafeMathRichErrors.BinOpErrorCodes.ADDITION_OVERFLOW,\n                a,\n                b\n            ));\n        }\n        return c;\n    }\n\n    function max256(uint256 a, uint256 b)\n        internal\n        pure\n        returns (uint256)\n    {\n        return a >= b ? a : b;\n    }\n\n    function min256(uint256 a, uint256 b)\n        internal\n        pure\n        returns (uint256)\n    {\n        return a < b ? a : b;\n    }\n}\n"
        },
        "@0x/contracts-utils/contracts/src/LibSafeMathRichErrors.sol": {
            "id": 77,
            "content": "pragma solidity ^0.5.9;\n\n\nlibrary LibSafeMathRichErrors {\n\n    // bytes4(keccak256(\"Uint256BinOpError(uint8,uint256,uint256)\"))\n    bytes4 internal constant UINT256_BINOP_ERROR_SELECTOR =\n        0xe946c1bb;\n\n    // bytes4(keccak256(\"Uint256DowncastError(uint8,uint256)\"))\n    bytes4 internal constant UINT256_DOWNCAST_ERROR_SELECTOR =\n        0xc996af7b;\n\n    enum BinOpErrorCodes {\n        ADDITION_OVERFLOW,\n        MULTIPLICATION_OVERFLOW,\n        SUBTRACTION_UNDERFLOW,\n        DIVISION_BY_ZERO\n    }\n\n    enum DowncastErrorCodes {\n        VALUE_TOO_LARGE_TO_DOWNCAST_TO_UINT32,\n        VALUE_TOO_LARGE_TO_DOWNCAST_TO_UINT64,\n        VALUE_TOO_LARGE_TO_DOWNCAST_TO_UINT96\n    }\n\n    // solhint-disable func-name-mixedcase\n    function Uint256BinOpError(\n        BinOpErrorCodes errorCode,\n        uint256 a,\n        uint256 b\n    )\n        internal\n        pure\n        returns (bytes memory)\n    {\n        return abi.encodeWithSelector(\n            UINT256_BINOP_ERROR_SELECTOR,\n            errorCode,\n            a,\n            b\n        );\n    }\n\n    function Uint256DowncastError(\n        DowncastErrorCodes errorCode,\n        uint256 a\n    )\n        internal\n        pure\n        returns (bytes memory)\n    {\n        return abi.encodeWithSelector(\n            UINT256_DOWNCAST_ERROR_SELECTOR,\n            errorCode,\n            a\n        );\n    }\n}\n"
        },
        "../src/interfaces/IERC20Bridge.sol": {
            "id": 39,
            "content": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\ncontract IERC20Bridge {\n\n    /// @dev Result of a successful bridge call.\n    bytes4 constant internal BRIDGE_SUCCESS = 0xdc1600f3;\n\n    /// @dev Emitted when a trade occurs.\n    /// @param inputToken The token the bridge is converting from.\n    /// @param outputToken The token the bridge is converting to.\n    /// @param inputTokenAmount Amount of input token.\n    /// @param outputTokenAmount Amount of output token.\n    /// @param from The `from` address in `bridgeTransferFrom()`\n    /// @param to The `to` address in `bridgeTransferFrom()`\n    event ERC20BridgeTransfer(\n        address inputToken,\n        address outputToken,\n        uint256 inputTokenAmount,\n        uint256 outputTokenAmount,\n        address from,\n        address to\n    );\n\n    /// @dev Transfers `amount` of the ERC20 `tokenAddress` from `from` to `to`.\n    /// @param tokenAddress The address of the ERC20 token to transfer.\n    /// @param from Address to transfer asset from.\n    /// @param to Address to transfer asset to.\n    /// @param amount Amount of asset to transfer.\n    /// @param bridgeData Arbitrary asset data needed by the bridge contract.\n    /// @return success The magic bytes `0xdc1600f3` if successful.\n    function bridgeTransferFrom(\n        address tokenAddress,\n        address from,\n        address to,\n        uint256 amount,\n        bytes calldata bridgeData\n    )\n        external\n        returns (bytes4 success);\n}\n"
        },
        "../src/interfaces/IKyberNetworkProxy.sol": {
            "id": 42,
            "content": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\ninterface IKyberNetworkProxy {\n\n    /// @dev Sells `sellTokenAddress` tokens for `buyTokenAddress` tokens.\n    /// @param sellTokenAddress Token to sell.\n    /// @param sellAmount Amount of tokens to sell.\n    /// @param buyTokenAddress Token to buy.\n    /// @param recipientAddress Address to send bought tokens to.\n    /// @param maxBuyTokenAmount A limit on the amount of tokens to buy.\n    /// @param minConversionRate The minimal conversion rate. If actual rate\n    ///        is lower, trade is canceled.\n    /// @param walletId The wallet ID to send part of the fees\n    /// @return boughtAmount Amount of tokens bought.\n    function trade(\n        address sellTokenAddress,\n        uint256 sellAmount,\n        address buyTokenAddress,\n        address payable recipientAddress,\n        uint256 maxBuyTokenAmount,\n        uint256 minConversionRate,\n        address walletId\n    )\n        external\n        payable\n        returns (uint256 boughtAmount);\n\n    /// @dev Sells `sellTokenAddress` tokens for `buyTokenAddress` tokens\n    /// using a hint for the reserve.\n    /// @param sellTokenAddress Token to sell.\n    /// @param sellAmount Amount of tokens to sell.\n    /// @param buyTokenAddress Token to buy.\n    /// @param recipientAddress Address to send bought tokens to.\n    /// @param maxBuyTokenAmount A limit on the amount of tokens to buy.\n    /// @param minConversionRate The minimal conversion rate. If actual rate\n    ///        is lower, trade is canceled.\n    /// @param walletId The wallet ID to send part of the fees\n    /// @param hint The hint for the selective inclusion (or exclusion) of reserves\n    /// @return boughtAmount Amount of tokens bought.\n    function tradeWithHint(\n        address sellTokenAddress,\n        uint256 sellAmount,\n        address buyTokenAddress,\n        address payable recipientAddress,\n        uint256 maxBuyTokenAmount,\n        uint256 minConversionRate,\n        address payable walletId,\n        bytes calldata hint\n    )\n        external\n        payable\n        returns (uint256 boughtAmount);\n}\n"
        }
    },
    "sourceCodes": {
        "./TestKyberBridge.sol": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-erc20/contracts/src/interfaces/IERC20Token.sol\";\nimport \"../src/bridges/KyberBridge.sol\";\nimport \"../src/interfaces/IKyberNetworkProxy.sol\";\n\n\n// solhint-disable no-simple-event-func-name\ninterface ITestContract {\n\n    function wethWithdraw(\n        address payable ownerAddress,\n        uint256 amount\n    )\n        external;\n\n    function wethDeposit(\n        address ownerAddress\n    )\n        external\n        payable;\n\n    function tokenTransfer(\n        address ownerAddress,\n        address recipientAddress,\n        uint256 amount\n    )\n        external\n        returns (bool success);\n\n    function tokenApprove(\n        address ownerAddress,\n        address spenderAddress,\n        uint256 allowance\n    )\n        external\n        returns (bool success);\n\n    function tokenBalanceOf(\n        address ownerAddress\n    )\n        external\n        view\n        returns (uint256 balance);\n}\n\n\n/// @dev A minimalist ERC20/WETH token.\ncontract TestToken {\n\n    uint8 public decimals;\n    ITestContract private _testContract;\n\n    constructor(uint8 decimals_) public {\n        decimals = decimals_;\n        _testContract = ITestContract(msg.sender);\n    }\n\n    function approve(address spender, uint256 allowance)\n        external\n        returns (bool)\n    {\n        return _testContract.tokenApprove(\n            msg.sender,\n            spender,\n            allowance\n        );\n    }\n\n    function transfer(address recipient, uint256 amount)\n        external\n        returns (bool)\n    {\n        return _testContract.tokenTransfer(\n            msg.sender,\n            recipient,\n            amount\n        );\n    }\n\n    function withdraw(uint256 amount)\n        external\n    {\n        return _testContract.wethWithdraw(msg.sender, amount);\n    }\n\n    function deposit()\n        external\n        payable\n    {\n        return _testContract.wethDeposit.value(msg.value)(msg.sender);\n    }\n\n    function allowance(address, address) external view returns (uint256) {\n        return 0;\n    }\n\n    function balanceOf(address owner)\n        external\n        view\n        returns (uint256)\n    {\n        return _testContract.tokenBalanceOf(owner);\n    }\n}\n\n\n/// @dev KyberBridge overridden to mock tokens and implement IKyberBridge.\ncontract TestKyberBridge is\n    KyberBridge,\n    ITestContract,\n    IKyberNetworkProxy\n{\n    event KyberBridgeTrade(\n        uint256 msgValue,\n        address sellTokenAddress,\n        uint256 sellAmount,\n        address buyTokenAddress,\n        address payable recipientAddress,\n        uint256 maxBuyTokenAmount,\n        uint256 minConversionRate,\n        address walletId\n    );\n\n    event KyberBridgeWethWithdraw(\n        address ownerAddress,\n        uint256 amount\n    );\n\n    event KyberBridgeWethDeposit(\n        uint256 msgValue,\n        address ownerAddress,\n        uint256 amount\n    );\n\n    event KyberBridgeTokenApprove(\n        address tokenAddress,\n        address ownerAddress,\n        address spenderAddress,\n        uint256 allowance\n    );\n\n    event KyberBridgeTokenTransfer(\n        address tokenAddress,\n        address ownerAddress,\n        address recipientAddress,\n        uint256 amount\n    );\n\n    IEtherToken public weth;\n    mapping (address => mapping (address => uint256)) private _tokenBalances;\n    uint256 private _nextFillAmount;\n\n    constructor() public {\n        weth = IEtherToken(address(new TestToken(18)));\n    }\n\n    /// @dev Implementation of `IKyberNetworkProxy.trade()`\n    function trade(\n        address sellTokenAddress,\n        uint256 sellAmount,\n        address buyTokenAddress,\n        address payable recipientAddress,\n        uint256 maxBuyTokenAmount,\n        uint256 minConversionRate,\n        address walletId\n    )\n        external\n        payable\n        returns(uint256 boughtAmount)\n    {\n        emit KyberBridgeTrade(\n            msg.value,\n            sellTokenAddress,\n            sellAmount,\n            buyTokenAddress,\n            recipientAddress,\n            maxBuyTokenAmount,\n            minConversionRate,\n            walletId\n        );\n        return _nextFillAmount;\n    }\n\n    function tradeWithHint(\n        address sellTokenAddress,\n        uint256 sellAmount,\n        address buyTokenAddress,\n        address payable recipientAddress,\n        uint256 maxBuyTokenAmount,\n        uint256 minConversionRate,\n        address payable walletId,\n        bytes calldata hint\n    )\n        external\n        payable\n        returns (uint256 boughtAmount)\n    {\n        emit KyberBridgeTrade(\n            msg.value,\n            sellTokenAddress,\n            sellAmount,\n            buyTokenAddress,\n            recipientAddress,\n            maxBuyTokenAmount,\n            minConversionRate,\n            walletId\n        );\n        return _nextFillAmount;\n    }\n\n    function createToken(uint8 decimals)\n        external\n        returns (address tokenAddress)\n    {\n        return address(new TestToken(decimals));\n    }\n\n    function setNextFillAmount(uint256 amount)\n        external\n        payable\n    {\n        if (msg.value != 0) {\n            require(amount == msg.value, \"VALUE_AMOUNT_MISMATCH\");\n            grantTokensTo(address(weth), address(this), msg.value);\n        }\n        _nextFillAmount = amount;\n    }\n\n    function wethDeposit(\n        address ownerAddress\n    )\n        external\n        payable\n    {\n        require(msg.sender == address(weth), \"ONLY_WETH\");\n        grantTokensTo(address(weth), ownerAddress, msg.value);\n        emit KyberBridgeWethDeposit(\n            msg.value,\n            ownerAddress,\n            msg.value\n        );\n    }\n\n    function wethWithdraw(\n        address payable ownerAddress,\n        uint256 amount\n    )\n        external\n    {\n        require(msg.sender == address(weth), \"ONLY_WETH\");\n        _tokenBalances[address(weth)][ownerAddress] -= amount;\n        ownerAddress.transfer(amount);\n        emit KyberBridgeWethWithdraw(\n            ownerAddress,\n            amount\n        );\n    }\n\n    function tokenApprove(\n        address ownerAddress,\n        address spenderAddress,\n        uint256 allowance\n    )\n        external\n        returns (bool success)\n    {\n        emit KyberBridgeTokenApprove(\n            msg.sender,\n            ownerAddress,\n            spenderAddress,\n            allowance\n        );\n        return true;\n    }\n\n    function tokenTransfer(\n        address ownerAddress,\n        address recipientAddress,\n        uint256 amount\n    )\n        external\n        returns (bool success)\n    {\n        _tokenBalances[msg.sender][ownerAddress] -= amount;\n        _tokenBalances[msg.sender][recipientAddress] += amount;\n        emit KyberBridgeTokenTransfer(\n            msg.sender,\n            ownerAddress,\n            recipientAddress,\n            amount\n        );\n        return true;\n    }\n\n    function tokenBalanceOf(\n        address ownerAddress\n    )\n        external\n        view\n        returns (uint256 balance)\n    {\n        return _tokenBalances[msg.sender][ownerAddress];\n    }\n\n    function grantTokensTo(address tokenAddress, address ownerAddress, uint256 amount)\n        public\n        payable\n    {\n        _tokenBalances[tokenAddress][ownerAddress] += amount;\n        if (tokenAddress != address(weth)) {\n            // Send back ether if not WETH.\n            msg.sender.transfer(msg.value);\n        } else {\n            require(msg.value == amount, \"VALUE_AMOUNT_MISMATCH\");\n        }\n    }\n\n    // @dev overridden to point to this contract.\n    function _getKyberNetworkProxyAddress()\n        internal\n        view\n        returns (address)\n    {\n        return address(this);\n    }\n\n    // @dev overridden to point to test WETH.\n    function _getWethAddress()\n        internal\n        view\n        returns (address)\n    {\n        return address(weth);\n    }\n}\n",
        "@0x/contracts-erc20/contracts/src/interfaces/IERC20Token.sol": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\ncontract IERC20Token {\n\n    // solhint-disable no-simple-event-func-name\n    event Transfer(\n        address indexed _from,\n        address indexed _to,\n        uint256 _value\n    );\n\n    event Approval(\n        address indexed _owner,\n        address indexed _spender,\n        uint256 _value\n    );\n\n    /// @dev send `value` token to `to` from `msg.sender`\n    /// @param _to The address of the recipient\n    /// @param _value The amount of token to be transferred\n    /// @return True if transfer was successful\n    function transfer(address _to, uint256 _value)\n        external\n        returns (bool);\n\n    /// @dev send `value` token to `to` from `from` on the condition it is approved by `from`\n    /// @param _from The address of the sender\n    /// @param _to The address of the recipient\n    /// @param _value The amount of token to be transferred\n    /// @return True if transfer was successful\n    function transferFrom(\n        address _from,\n        address _to,\n        uint256 _value\n    )\n        external\n        returns (bool);\n\n    /// @dev `msg.sender` approves `_spender` to spend `_value` tokens\n    /// @param _spender The address of the account able to transfer the tokens\n    /// @param _value The amount of wei to be approved for transfer\n    /// @return Always true if the call has enough gas to complete execution\n    function approve(address _spender, uint256 _value)\n        external\n        returns (bool);\n\n    /// @dev Query total supply of token\n    /// @return Total supply of token\n    function totalSupply()\n        external\n        view\n        returns (uint256);\n\n    /// @param _owner The address from which the balance will be retrieved\n    /// @return Balance of owner\n    function balanceOf(address _owner)\n        external\n        view\n        returns (uint256);\n\n    /// @param _owner The address of the account owning tokens\n    /// @param _spender The address of the account able to transfer the tokens\n    /// @return Amount of remaining tokens allowed to spent\n    function allowance(address _owner, address _spender)\n        external\n        view\n        returns (uint256);\n}\n",
        "../src/bridges/KyberBridge.sol": "/*\n\n  Copyright 2020 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-erc20/contracts/src/interfaces/IERC20Token.sol\";\nimport \"@0x/contracts-erc20/contracts/src/interfaces/IEtherToken.sol\";\nimport \"@0x/contracts-erc20/contracts/src/LibERC20Token.sol\";\nimport \"@0x/contracts-exchange-libs/contracts/src/IWallet.sol\";\nimport \"@0x/contracts-utils/contracts/src/DeploymentConstants.sol\";\nimport \"@0x/contracts-utils/contracts/src/LibSafeMath.sol\";\nimport \"../interfaces/IERC20Bridge.sol\";\nimport \"../interfaces/IKyberNetworkProxy.sol\";\n\n\n// solhint-disable space-after-comma\ncontract KyberBridge is\n    IERC20Bridge,\n    IWallet,\n    DeploymentConstants\n{\n    using LibSafeMath for uint256;\n\n    // @dev Structure used internally to get around stack limits.\n    struct TradeState {\n        IKyberNetworkProxy kyber;\n        IEtherToken weth;\n        address fromTokenAddress;\n        uint256 fromTokenBalance;\n        uint256 payableAmount;\n        uint256 conversionRate;\n        bytes hint;\n    }\n\n    /// @dev Kyber ETH pseudo-address.\n    address constant public KYBER_ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;\n    /// @dev `bridgeTransferFrom()` failure result.\n    bytes4 constant private BRIDGE_FAILED = 0x0;\n    /// @dev Precision of Kyber rates.\n    uint256 constant private KYBER_RATE_BASE = 10 ** 18;\n\n    // solhint-disable no-empty-blocks\n    /// @dev Payable fallback to receive ETH from Kyber/WETH.\n    function ()\n        external\n        payable\n    {\n        // Poor man's receive in 0.5.9\n        require(msg.data.length == 0);\n    }\n\n    /// @dev Callback for `IKyberBridge`. Tries to buy `amount` of\n    ///      `toTokenAddress` tokens by selling the entirety of the opposing asset\n    ///      to the `KyberNetworkProxy` contract, then transfers the bought\n    ///      tokens to `to`.\n    /// @param toTokenAddress The token to give to `to`.\n    /// @param from The maker (this contract).\n    /// @param to The recipient of the bought tokens.\n    /// @param amount Minimum amount of `toTokenAddress` tokens to buy.\n    /// @param bridgeData The abi-encoeded \"from\" token address.\n    /// @return success The magic bytes if successful.\n    function bridgeTransferFrom(\n        address toTokenAddress,\n        address from,\n        address to,\n        uint256 amount,\n        bytes calldata bridgeData\n    )\n        external\n        returns (bytes4 success)\n    {\n        TradeState memory state;\n        state.kyber = IKyberNetworkProxy(_getKyberNetworkProxyAddress());\n        state.weth = IEtherToken(_getWethAddress());\n        // Decode the bridge data to get the `fromTokenAddress`.\n        (state.fromTokenAddress, state.hint) = abi.decode(bridgeData, (address, bytes));\n        // Query the balance of \"from\" tokens.\n        state.fromTokenBalance = IERC20Token(state.fromTokenAddress).balanceOf(address(this));\n        if (state.fromTokenBalance == 0) {\n            // Return failure if no input tokens.\n            return BRIDGE_FAILED;\n        }\n        if (state.fromTokenAddress == toTokenAddress) {\n            // Just transfer the tokens if they're the same.\n            LibERC20Token.transfer(state.fromTokenAddress, to, state.fromTokenBalance);\n            return BRIDGE_SUCCESS;\n        }\n        if (state.fromTokenAddress == address(state.weth)) {\n            // From WETH\n            state.fromTokenAddress = KYBER_ETH_ADDRESS;\n            state.payableAmount = state.fromTokenBalance;\n            state.weth.withdraw(state.fromTokenBalance);\n        } else {\n            LibERC20Token.approveIfBelow(\n                state.fromTokenAddress,\n                address(state.kyber),\n                state.fromTokenBalance\n            );\n        }\n        bool isToTokenWeth = toTokenAddress == address(state.weth);\n\n        // Try to sell all of this contract's input token balance through\n        // `KyberNetworkProxy.trade()`.\n        uint256 boughtAmount = state.kyber.tradeWithHint.value(state.payableAmount)(\n            // Input token.\n            state.fromTokenAddress,\n            // Sell amount.\n            state.fromTokenBalance,\n            // Output token.\n            isToTokenWeth ? KYBER_ETH_ADDRESS : toTokenAddress,\n            // Transfer to this contract if converting to ETH, otherwise\n            // transfer directly to the recipient.\n            isToTokenWeth ? address(uint160(address(this))) : address(uint160(to)),\n            // Buy as much as possible.\n            uint256(-1),\n            // The minimum conversion rate\n            1,\n            // No affiliate address.\n            address(0),\n            state.hint\n        );\n        // Wrap ETH output and transfer to recipient.\n        if (isToTokenWeth) {\n            state.weth.deposit.value(boughtAmount)();\n            state.weth.transfer(to, boughtAmount);\n        }\n\n        emit ERC20BridgeTransfer(\n            state.fromTokenAddress == KYBER_ETH_ADDRESS ? address(state.weth) : state.fromTokenAddress,\n            toTokenAddress,\n            state.fromTokenBalance,\n            boughtAmount,\n            from,\n            to\n        );\n        return BRIDGE_SUCCESS;\n    }\n\n    /// @dev `SignatureType.Wallet` callback, so that this bridge can be the maker\n    ///      and sign for itself in orders. Always succeeds.\n    /// @return magicValue Magic success bytes, always.\n    function isValidSignature(\n        bytes32,\n        bytes calldata\n    )\n        external\n        view\n        returns (bytes4 magicValue)\n    {\n        return LEGACY_WALLET_MAGIC_VALUE;\n    }\n\n}\n",
        "@0x/contracts-erc20/contracts/src/interfaces/IEtherToken.sol": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\nimport \"./IERC20Token.sol\";\n\n\ncontract IEtherToken is\n    IERC20Token\n{\n    function deposit()\n        public\n        payable;\n    \n    function withdraw(uint256 amount)\n        public;\n}\n",
        "@0x/contracts-erc20/contracts/src/LibERC20Token.sol": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\nimport \"@0x/contracts-utils/contracts/src/LibRichErrors.sol\";\nimport \"@0x/contracts-utils/contracts/src/LibBytes.sol\";\nimport \"../src/interfaces/IERC20Token.sol\";\n\n\nlibrary LibERC20Token {\n    bytes constant private DECIMALS_CALL_DATA = hex\"313ce567\";\n\n    /// @dev Calls `IERC20Token(token).approve()`.\n    ///      Reverts if `false` is returned or if the return\n    ///      data length is nonzero and not 32 bytes.\n    /// @param token The address of the token contract.\n    /// @param spender The address that receives an allowance.\n    /// @param allowance The allowance to set.\n    function approve(\n        address token,\n        address spender,\n        uint256 allowance\n    )\n        internal\n    {\n        bytes memory callData = abi.encodeWithSelector(\n            IERC20Token(0).approve.selector,\n            spender,\n            allowance\n        );\n        _callWithOptionalBooleanResult(token, callData);\n    }\n\n    /// @dev Calls `IERC20Token(token).approve()` and sets the allowance to the\n    ///      maximum if the current approval is not already >= an amount.\n    ///      Reverts if `false` is returned or if the return\n    ///      data length is nonzero and not 32 bytes.\n    /// @param token The address of the token contract.\n    /// @param spender The address that receives an allowance.\n    /// @param amount The minimum allowance needed.\n    function approveIfBelow(\n        address token,\n        address spender,\n        uint256 amount\n    )\n        internal\n    {\n        if (IERC20Token(token).allowance(address(this), spender) < amount) {\n            approve(token, spender, uint256(-1));\n        }\n    }\n\n    /// @dev Calls `IERC20Token(token).transfer()`.\n    ///      Reverts if `false` is returned or if the return\n    ///      data length is nonzero and not 32 bytes.\n    /// @param token The address of the token contract.\n    /// @param to The address that receives the tokens\n    /// @param amount Number of tokens to transfer.\n    function transfer(\n        address token,\n        address to,\n        uint256 amount\n    )\n        internal\n    {\n        bytes memory callData = abi.encodeWithSelector(\n            IERC20Token(0).transfer.selector,\n            to,\n            amount\n        );\n        _callWithOptionalBooleanResult(token, callData);\n    }\n\n    /// @dev Calls `IERC20Token(token).transferFrom()`.\n    ///      Reverts if `false` is returned or if the return\n    ///      data length is nonzero and not 32 bytes.\n    /// @param token The address of the token contract.\n    /// @param from The owner of the tokens.\n    /// @param to The address that receives the tokens\n    /// @param amount Number of tokens to transfer.\n    function transferFrom(\n        address token,\n        address from,\n        address to,\n        uint256 amount\n    )\n        internal\n    {\n        bytes memory callData = abi.encodeWithSelector(\n            IERC20Token(0).transferFrom.selector,\n            from,\n            to,\n            amount\n        );\n        _callWithOptionalBooleanResult(token, callData);\n    }\n\n    /// @dev Retrieves the number of decimals for a token.\n    ///      Returns `18` if the call reverts.\n    /// @param token The address of the token contract.\n    /// @return tokenDecimals The number of decimals places for the token.\n    function decimals(address token)\n        internal\n        view\n        returns (uint8 tokenDecimals)\n    {\n        tokenDecimals = 18;\n        (bool didSucceed, bytes memory resultData) = token.staticcall(DECIMALS_CALL_DATA);\n        if (didSucceed && resultData.length == 32) {\n            tokenDecimals = uint8(LibBytes.readUint256(resultData, 0));\n        }\n    }\n\n    /// @dev Retrieves the allowance for a token, owner, and spender.\n    ///      Returns `0` if the call reverts.\n    /// @param token The address of the token contract.\n    /// @param owner The owner of the tokens.\n    /// @param spender The address the spender.\n    /// @return allowance The allowance for a token, owner, and spender.\n    function allowance(address token, address owner, address spender)\n        internal\n        view\n        returns (uint256 allowance_)\n    {\n        (bool didSucceed, bytes memory resultData) = token.staticcall(\n            abi.encodeWithSelector(\n                IERC20Token(0).allowance.selector,\n                owner,\n                spender\n            )\n        );\n        if (didSucceed && resultData.length == 32) {\n            allowance_ = LibBytes.readUint256(resultData, 0);\n        }\n    }\n\n    /// @dev Retrieves the balance for a token owner.\n    ///      Returns `0` if the call reverts.\n    /// @param token The address of the token contract.\n    /// @param owner The owner of the tokens.\n    /// @return balance The token balance of an owner.\n    function balanceOf(address token, address owner)\n        internal\n        view\n        returns (uint256 balance)\n    {\n        (bool didSucceed, bytes memory resultData) = token.staticcall(\n            abi.encodeWithSelector(\n                IERC20Token(0).balanceOf.selector,\n                owner\n            )\n        );\n        if (didSucceed && resultData.length == 32) {\n            balance = LibBytes.readUint256(resultData, 0);\n        }\n    }\n\n    /// @dev Executes a call on address `target` with calldata `callData`\n    ///      and asserts that either nothing was returned or a single boolean\n    ///      was returned equal to `true`.\n    /// @param target The call target.\n    /// @param callData The abi-encoded call data.\n    function _callWithOptionalBooleanResult(\n        address target,\n        bytes memory callData\n    )\n        private\n    {\n        (bool didSucceed, bytes memory resultData) = target.call(callData);\n        if (didSucceed) {\n            if (resultData.length == 0) {\n                return;\n            }\n            if (resultData.length == 32) {\n                uint256 result = LibBytes.readUint256(resultData, 0);\n                if (result == 1) {\n                    return;\n                }\n            }\n        }\n        LibRichErrors.rrevert(resultData);\n    }\n}\n",
        "@0x/contracts-utils/contracts/src/LibRichErrors.sol": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\nlibrary LibRichErrors {\n\n    // bytes4(keccak256(\"Error(string)\"))\n    bytes4 internal constant STANDARD_ERROR_SELECTOR =\n        0x08c379a0;\n\n    // solhint-disable func-name-mixedcase\n    /// @dev ABI encode a standard, string revert error payload.\n    ///      This is the same payload that would be included by a `revert(string)`\n    ///      solidity statement. It has the function signature `Error(string)`.\n    /// @param message The error string.\n    /// @return The ABI encoded error.\n    function StandardError(\n        string memory message\n    )\n        internal\n        pure\n        returns (bytes memory)\n    {\n        return abi.encodeWithSelector(\n            STANDARD_ERROR_SELECTOR,\n            bytes(message)\n        );\n    }\n    // solhint-enable func-name-mixedcase\n\n    /// @dev Reverts an encoded rich revert reason `errorData`.\n    /// @param errorData ABI encoded error data.\n    function rrevert(bytes memory errorData)\n        internal\n        pure\n    {\n        assembly {\n            revert(add(errorData, 0x20), mload(errorData))\n        }\n    }\n}\n",
        "@0x/contracts-utils/contracts/src/LibBytes.sol": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\nimport \"./LibBytesRichErrors.sol\";\nimport \"./LibRichErrors.sol\";\n\n\nlibrary LibBytes {\n\n    using LibBytes for bytes;\n\n    /// @dev Gets the memory address for a byte array.\n    /// @param input Byte array to lookup.\n    /// @return memoryAddress Memory address of byte array. This\n    ///         points to the header of the byte array which contains\n    ///         the length.\n    function rawAddress(bytes memory input)\n        internal\n        pure\n        returns (uint256 memoryAddress)\n    {\n        assembly {\n            memoryAddress := input\n        }\n        return memoryAddress;\n    }\n\n    /// @dev Gets the memory address for the contents of a byte array.\n    /// @param input Byte array to lookup.\n    /// @return memoryAddress Memory address of the contents of the byte array.\n    function contentAddress(bytes memory input)\n        internal\n        pure\n        returns (uint256 memoryAddress)\n    {\n        assembly {\n            memoryAddress := add(input, 32)\n        }\n        return memoryAddress;\n    }\n\n    /// @dev Copies `length` bytes from memory location `source` to `dest`.\n    /// @param dest memory address to copy bytes to.\n    /// @param source memory address to copy bytes from.\n    /// @param length number of bytes to copy.\n    function memCopy(\n        uint256 dest,\n        uint256 source,\n        uint256 length\n    )\n        internal\n        pure\n    {\n        if (length < 32) {\n            // Handle a partial word by reading destination and masking\n            // off the bits we are interested in.\n            // This correctly handles overlap, zero lengths and source == dest\n            assembly {\n                let mask := sub(exp(256, sub(32, length)), 1)\n                let s := and(mload(source), not(mask))\n                let d := and(mload(dest), mask)\n                mstore(dest, or(s, d))\n            }\n        } else {\n            // Skip the O(length) loop when source == dest.\n            if (source == dest) {\n                return;\n            }\n\n            // For large copies we copy whole words at a time. The final\n            // word is aligned to the end of the range (instead of after the\n            // previous) to handle partial words. So a copy will look like this:\n            //\n            //  ####\n            //      ####\n            //          ####\n            //            ####\n            //\n            // We handle overlap in the source and destination range by\n            // changing the copying direction. This prevents us from\n            // overwriting parts of source that we still need to copy.\n            //\n            // This correctly handles source == dest\n            //\n            if (source > dest) {\n                assembly {\n                    // We subtract 32 from `sEnd` and `dEnd` because it\n                    // is easier to compare with in the loop, and these\n                    // are also the addresses we need for copying the\n                    // last bytes.\n                    length := sub(length, 32)\n                    let sEnd := add(source, length)\n                    let dEnd := add(dest, length)\n\n                    // Remember the last 32 bytes of source\n                    // This needs to be done here and not after the loop\n                    // because we may have overwritten the last bytes in\n                    // source already due to overlap.\n                    let last := mload(sEnd)\n\n                    // Copy whole words front to back\n                    // Note: the first check is always true,\n                    // this could have been a do-while loop.\n                    // solhint-disable-next-line no-empty-blocks\n                    for {} lt(source, sEnd) {} {\n                        mstore(dest, mload(source))\n                        source := add(source, 32)\n                        dest := add(dest, 32)\n                    }\n\n                    // Write the last 32 bytes\n                    mstore(dEnd, last)\n                }\n            } else {\n                assembly {\n                    // We subtract 32 from `sEnd` and `dEnd` because those\n                    // are the starting points when copying a word at the end.\n                    length := sub(length, 32)\n                    let sEnd := add(source, length)\n                    let dEnd := add(dest, length)\n\n                    // Remember the first 32 bytes of source\n                    // This needs to be done here and not after the loop\n                    // because we may have overwritten the first bytes in\n                    // source already due to overlap.\n                    let first := mload(source)\n\n                    // Copy whole words back to front\n                    // We use a signed comparisson here to allow dEnd to become\n                    // negative (happens when source and dest < 32). Valid\n                    // addresses in local memory will never be larger than\n                    // 2**255, so they can be safely re-interpreted as signed.\n                    // Note: the first check is always true,\n                    // this could have been a do-while loop.\n                    // solhint-disable-next-line no-empty-blocks\n                    for {} slt(dest, dEnd) {} {\n                        mstore(dEnd, mload(sEnd))\n                        sEnd := sub(sEnd, 32)\n                        dEnd := sub(dEnd, 32)\n                    }\n\n                    // Write the first 32 bytes\n                    mstore(dest, first)\n                }\n            }\n        }\n    }\n\n    /// @dev Returns a slices from a byte array.\n    /// @param b The byte array to take a slice from.\n    /// @param from The starting index for the slice (inclusive).\n    /// @param to The final index for the slice (exclusive).\n    /// @return result The slice containing bytes at indices [from, to)\n    function slice(\n        bytes memory b,\n        uint256 from,\n        uint256 to\n    )\n        internal\n        pure\n        returns (bytes memory result)\n    {\n        // Ensure that the from and to positions are valid positions for a slice within\n        // the byte array that is being used.\n        if (from > to) {\n            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n                LibBytesRichErrors.InvalidByteOperationErrorCodes.FromLessThanOrEqualsToRequired,\n                from,\n                to\n            ));\n        }\n        if (to > b.length) {\n            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n                LibBytesRichErrors.InvalidByteOperationErrorCodes.ToLessThanOrEqualsLengthRequired,\n                to,\n                b.length\n            ));\n        }\n\n        // Create a new bytes structure and copy contents\n        result = new bytes(to - from);\n        memCopy(\n            result.contentAddress(),\n            b.contentAddress() + from,\n            result.length\n        );\n        return result;\n    }\n\n    /// @dev Returns a slice from a byte array without preserving the input.\n    /// @param b The byte array to take a slice from. Will be destroyed in the process.\n    /// @param from The starting index for the slice (inclusive).\n    /// @param to The final index for the slice (exclusive).\n    /// @return result The slice containing bytes at indices [from, to)\n    /// @dev When `from == 0`, the original array will match the slice. In other cases its state will be corrupted.\n    function sliceDestructive(\n        bytes memory b,\n        uint256 from,\n        uint256 to\n    )\n        internal\n        pure\n        returns (bytes memory result)\n    {\n        // Ensure that the from and to positions are valid positions for a slice within\n        // the byte array that is being used.\n        if (from > to) {\n            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n                LibBytesRichErrors.InvalidByteOperationErrorCodes.FromLessThanOrEqualsToRequired,\n                from,\n                to\n            ));\n        }\n        if (to > b.length) {\n            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n                LibBytesRichErrors.InvalidByteOperationErrorCodes.ToLessThanOrEqualsLengthRequired,\n                to,\n                b.length\n            ));\n        }\n\n        // Create a new bytes structure around [from, to) in-place.\n        assembly {\n            result := add(b, from)\n            mstore(result, sub(to, from))\n        }\n        return result;\n    }\n\n    /// @dev Pops the last byte off of a byte array by modifying its length.\n    /// @param b Byte array that will be modified.\n    /// @return The byte that was popped off.\n    function popLastByte(bytes memory b)\n        internal\n        pure\n        returns (bytes1 result)\n    {\n        if (b.length == 0) {\n            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n                LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanZeroRequired,\n                b.length,\n                0\n            ));\n        }\n\n        // Store last byte.\n        result = b[b.length - 1];\n\n        assembly {\n            // Decrement length of byte array.\n            let newLen := sub(mload(b), 1)\n            mstore(b, newLen)\n        }\n        return result;\n    }\n\n    /// @dev Tests equality of two byte arrays.\n    /// @param lhs First byte array to compare.\n    /// @param rhs Second byte array to compare.\n    /// @return True if arrays are the same. False otherwise.\n    function equals(\n        bytes memory lhs,\n        bytes memory rhs\n    )\n        internal\n        pure\n        returns (bool equal)\n    {\n        // Keccak gas cost is 30 + numWords * 6. This is a cheap way to compare.\n        // We early exit on unequal lengths, but keccak would also correctly\n        // handle this.\n        return lhs.length == rhs.length && keccak256(lhs) == keccak256(rhs);\n    }\n\n    /// @dev Reads an address from a position in a byte array.\n    /// @param b Byte array containing an address.\n    /// @param index Index in byte array of address.\n    /// @return address from byte array.\n    function readAddress(\n        bytes memory b,\n        uint256 index\n    )\n        internal\n        pure\n        returns (address result)\n    {\n        if (b.length < index + 20) {\n            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n                LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsTwentyRequired,\n                b.length,\n                index + 20 // 20 is length of address\n            ));\n        }\n\n        // Add offset to index:\n        // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)\n        // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)\n        index += 20;\n\n        // Read address from array memory\n        assembly {\n            // 1. Add index to address of bytes array\n            // 2. Load 32-byte word from memory\n            // 3. Apply 20-byte mask to obtain address\n            result := and(mload(add(b, index)), 0xffffffffffffffffffffffffffffffffffffffff)\n        }\n        return result;\n    }\n\n    /// @dev Writes an address into a specific position in a byte array.\n    /// @param b Byte array to insert address into.\n    /// @param index Index in byte array of address.\n    /// @param input Address to put into byte array.\n    function writeAddress(\n        bytes memory b,\n        uint256 index,\n        address input\n    )\n        internal\n        pure\n    {\n        if (b.length < index + 20) {\n            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n                LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsTwentyRequired,\n                b.length,\n                index + 20 // 20 is length of address\n            ));\n        }\n\n        // Add offset to index:\n        // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)\n        // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)\n        index += 20;\n\n        // Store address into array memory\n        assembly {\n            // The address occupies 20 bytes and mstore stores 32 bytes.\n            // First fetch the 32-byte word where we'll be storing the address, then\n            // apply a mask so we have only the bytes in the word that the address will not occupy.\n            // Then combine these bytes with the address and store the 32 bytes back to memory with mstore.\n\n            // 1. Add index to address of bytes array\n            // 2. Load 32-byte word from memory\n            // 3. Apply 12-byte mask to obtain extra bytes occupying word of memory where we'll store the address\n            let neighbors := and(\n                mload(add(b, index)),\n                0xffffffffffffffffffffffff0000000000000000000000000000000000000000\n            )\n\n            // Make sure input address is clean.\n            // (Solidity does not guarantee this)\n            input := and(input, 0xffffffffffffffffffffffffffffffffffffffff)\n\n            // Store the neighbors and address into memory\n            mstore(add(b, index), xor(input, neighbors))\n        }\n    }\n\n    /// @dev Reads a bytes32 value from a position in a byte array.\n    /// @param b Byte array containing a bytes32 value.\n    /// @param index Index in byte array of bytes32 value.\n    /// @return bytes32 value from byte array.\n    function readBytes32(\n        bytes memory b,\n        uint256 index\n    )\n        internal\n        pure\n        returns (bytes32 result)\n    {\n        if (b.length < index + 32) {\n            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n                LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsThirtyTwoRequired,\n                b.length,\n                index + 32\n            ));\n        }\n\n        // Arrays are prefixed by a 256 bit length parameter\n        index += 32;\n\n        // Read the bytes32 from array memory\n        assembly {\n            result := mload(add(b, index))\n        }\n        return result;\n    }\n\n    /// @dev Writes a bytes32 into a specific position in a byte array.\n    /// @param b Byte array to insert <input> into.\n    /// @param index Index in byte array of <input>.\n    /// @param input bytes32 to put into byte array.\n    function writeBytes32(\n        bytes memory b,\n        uint256 index,\n        bytes32 input\n    )\n        internal\n        pure\n    {\n        if (b.length < index + 32) {\n            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n                LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsThirtyTwoRequired,\n                b.length,\n                index + 32\n            ));\n        }\n\n        // Arrays are prefixed by a 256 bit length parameter\n        index += 32;\n\n        // Read the bytes32 from array memory\n        assembly {\n            mstore(add(b, index), input)\n        }\n    }\n\n    /// @dev Reads a uint256 value from a position in a byte array.\n    /// @param b Byte array containing a uint256 value.\n    /// @param index Index in byte array of uint256 value.\n    /// @return uint256 value from byte array.\n    function readUint256(\n        bytes memory b,\n        uint256 index\n    )\n        internal\n        pure\n        returns (uint256 result)\n    {\n        result = uint256(readBytes32(b, index));\n        return result;\n    }\n\n    /// @dev Writes a uint256 into a specific position in a byte array.\n    /// @param b Byte array to insert <input> into.\n    /// @param index Index in byte array of <input>.\n    /// @param input uint256 to put into byte array.\n    function writeUint256(\n        bytes memory b,\n        uint256 index,\n        uint256 input\n    )\n        internal\n        pure\n    {\n        writeBytes32(b, index, bytes32(input));\n    }\n\n    /// @dev Reads an unpadded bytes4 value from a position in a byte array.\n    /// @param b Byte array containing a bytes4 value.\n    /// @param index Index in byte array of bytes4 value.\n    /// @return bytes4 value from byte array.\n    function readBytes4(\n        bytes memory b,\n        uint256 index\n    )\n        internal\n        pure\n        returns (bytes4 result)\n    {\n        if (b.length < index + 4) {\n            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n                LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsFourRequired,\n                b.length,\n                index + 4\n            ));\n        }\n\n        // Arrays are prefixed by a 32 byte length field\n        index += 32;\n\n        // Read the bytes4 from array memory\n        assembly {\n            result := mload(add(b, index))\n            // Solidity does not require us to clean the trailing bytes.\n            // We do it anyway\n            result := and(result, 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000)\n        }\n        return result;\n    }\n\n    /// @dev Writes a new length to a byte array.\n    ///      Decreasing length will lead to removing the corresponding lower order bytes from the byte array.\n    ///      Increasing length may lead to appending adjacent in-memory bytes to the end of the byte array.\n    /// @param b Bytes array to write new length to.\n    /// @param length New length of byte array.\n    function writeLength(bytes memory b, uint256 length)\n        internal\n        pure\n    {\n        assembly {\n            mstore(b, length)\n        }\n    }\n}\n",
        "@0x/contracts-utils/contracts/src/LibBytesRichErrors.sol": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\nlibrary LibBytesRichErrors {\n\n    enum InvalidByteOperationErrorCodes {\n        FromLessThanOrEqualsToRequired,\n        ToLessThanOrEqualsLengthRequired,\n        LengthGreaterThanZeroRequired,\n        LengthGreaterThanOrEqualsFourRequired,\n        LengthGreaterThanOrEqualsTwentyRequired,\n        LengthGreaterThanOrEqualsThirtyTwoRequired,\n        LengthGreaterThanOrEqualsNestedBytesLengthRequired,\n        DestinationLengthGreaterThanOrEqualSourceLengthRequired\n    }\n\n    // bytes4(keccak256(\"InvalidByteOperationError(uint8,uint256,uint256)\"))\n    bytes4 internal constant INVALID_BYTE_OPERATION_ERROR_SELECTOR =\n        0x28006595;\n\n    // solhint-disable func-name-mixedcase\n    function InvalidByteOperationError(\n        InvalidByteOperationErrorCodes errorCode,\n        uint256 offset,\n        uint256 required\n    )\n        internal\n        pure\n        returns (bytes memory)\n    {\n        return abi.encodeWithSelector(\n            INVALID_BYTE_OPERATION_ERROR_SELECTOR,\n            errorCode,\n            offset,\n            required\n        );\n    }\n}\n",
        "@0x/contracts-exchange-libs/contracts/src/IWallet.sol": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\n\ncontract IWallet {\n\n    bytes4 internal constant LEGACY_WALLET_MAGIC_VALUE = 0xb0671381;\n\n    /// @dev Validates a hash with the `Wallet` signature type.\n    /// @param hash Message hash that is signed.\n    /// @param signature Proof of signing.\n    /// @return magicValue `bytes4(0xb0671381)` if the signature check succeeds.\n    function isValidSignature(\n        bytes32 hash,\n        bytes calldata signature\n    )\n        external\n        view\n        returns (bytes4 magicValue);\n}\n",
        "@0x/contracts-utils/contracts/src/DeploymentConstants.sol": "/*\n\n  Copyright 2020 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\ncontract DeploymentConstants {\n\n    // solhint-disable separate-by-one-line-in-contract\n\n    // Mainnet addresses ///////////////////////////////////////////////////////\n    /// @dev Mainnet address of the WETH contract.\n    address constant private WETH_ADDRESS = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;\n    /// @dev Mainnet address of the KyberNetworkProxy contract.\n    address constant private KYBER_NETWORK_PROXY_ADDRESS = 0x9AAb3f75489902f3a48495025729a0AF77d4b11e;\n    /// @dev Mainnet address of the KyberHintHandler contract.\n    address constant private KYBER_HINT_HANDLER_ADDRESS = 0xa1C0Fa73c39CFBcC11ec9Eb1Afc665aba9996E2C;\n    /// @dev Mainnet address of the `UniswapExchangeFactory` contract.\n    address constant private UNISWAP_EXCHANGE_FACTORY_ADDRESS = 0xc0a47dFe034B400B47bDaD5FecDa2621de6c4d95;\n    /// @dev Mainnet address of the `UniswapV2Router01` contract.\n    address constant private UNISWAP_V2_ROUTER_01_ADDRESS = 0xf164fC0Ec4E93095b804a4795bBe1e041497b92a;\n    /// @dev Mainnet address of the Eth2Dai `MatchingMarket` contract.\n    address constant private ETH2DAI_ADDRESS = 0x794e6e91555438aFc3ccF1c5076A74F42133d08D;\n    /// @dev Mainnet address of the `ERC20BridgeProxy` contract\n    address constant private ERC20_BRIDGE_PROXY_ADDRESS = 0x8ED95d1746bf1E4dAb58d8ED4724f1Ef95B20Db0;\n    ///@dev Mainnet address of the `Dai` (multi-collateral) contract\n    address constant private DAI_ADDRESS = 0x6B175474E89094C44Da98b954EedeAC495271d0F;\n    /// @dev Mainnet address of the `Chai` contract\n    address constant private CHAI_ADDRESS = 0x06AF07097C9Eeb7fD685c692751D5C66dB49c215;\n    /// @dev Mainnet address of the 0x DevUtils contract.\n    address constant private DEV_UTILS_ADDRESS = 0x74134CF88b21383713E096a5ecF59e297dc7f547;\n    /// @dev Kyber ETH pseudo-address.\n    address constant internal KYBER_ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;\n    /// @dev Mainnet address of the dYdX contract.\n    address constant private DYDX_ADDRESS = 0x1E0447b19BB6EcFdAe1e4AE1694b0C3659614e4e;\n    /// @dev Mainnet address of the GST2 contract\n    address constant private GST_ADDRESS = 0x0000000000b3F879cb30FE243b4Dfee438691c04;\n    /// @dev Mainnet address of the GST Collector\n    address constant private GST_COLLECTOR_ADDRESS = 0x000000D3b08566BE75A6DB803C03C85C0c1c5B96;\n    /// @dev Mainnet address of the mStable mUSD contract.\n    address constant private MUSD_ADDRESS = 0xe2f2a5C287993345a840Db3B0845fbC70f5935a5;\n    /// @dev Mainnet address of the Mooniswap Registry contract\n    address constant private MOONISWAP_REGISTRY = 0x71CD6666064C3A1354a3B4dca5fA1E2D3ee7D303;\n    /// @dev Mainnet address of the DODO Registry (ZOO) contract\n    address constant private DODO_REGISTRY = 0x3A97247DF274a17C59A3bd12735ea3FcDFb49950;\n    /// @dev Mainnet address of the DODO Helper contract\n    address constant private DODO_HELPER = 0x533dA777aeDCE766CEAe696bf90f8541A4bA80Eb;\n\n    // // Ropsten addresses ///////////////////////////////////////////////////////\n    // /// @dev Mainnet address of the WETH contract.\n    // address constant private WETH_ADDRESS = 0xc778417E063141139Fce010982780140Aa0cD5Ab;\n    // /// @dev Mainnet address of the KyberNetworkProxy contract.\n    // address constant private KYBER_NETWORK_PROXY_ADDRESS = 0xd719c34261e099Fdb33030ac8909d5788D3039C4;\n    // /// @dev Mainnet address of the `UniswapExchangeFactory` contract.\n    // address constant private UNISWAP_EXCHANGE_FACTORY_ADDRESS = 0x9c83dCE8CA20E9aAF9D3efc003b2ea62aBC08351;\n    // /// @dev Mainnet address of the `UniswapV2Router01` contract.\n    // address constant private UNISWAP_V2_ROUTER_01_ADDRESS = 0xf164fC0Ec4E93095b804a4795bBe1e041497b92a;\n    // /// @dev Mainnet address of the Eth2Dai `MatchingMarket` contract.\n    // address constant private ETH2DAI_ADDRESS = address(0);\n    // /// @dev Mainnet address of the `ERC20BridgeProxy` contract\n    // address constant private ERC20_BRIDGE_PROXY_ADDRESS = 0xb344afeD348de15eb4a9e180205A2B0739628339;\n    // ///@dev Mainnet address of the `Dai` (multi-collateral) contract\n    // address constant private DAI_ADDRESS = address(0);\n    // /// @dev Mainnet address of the `Chai` contract\n    // address constant private CHAI_ADDRESS = address(0);\n    // /// @dev Mainnet address of the 0x DevUtils contract.\n    // address constant private DEV_UTILS_ADDRESS = 0xC812AF3f3fBC62F76ea4262576EC0f49dB8B7f1c;\n    // /// @dev Kyber ETH pseudo-address.\n    // address constant internal KYBER_ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;\n    // /// @dev Mainnet address of the dYdX contract.\n    // address constant private DYDX_ADDRESS = address(0);\n    // /// @dev Mainnet address of the GST2 contract\n    // address constant private GST_ADDRESS = address(0);\n    // /// @dev Mainnet address of the GST Collector\n    // address constant private GST_COLLECTOR_ADDRESS = address(0);\n    // /// @dev Mainnet address of the mStable mUSD contract.\n    // address constant private MUSD_ADDRESS = 0x4E1000616990D83e56f4b5fC6CC8602DcfD20459;\n\n    // // Rinkeby addresses ///////////////////////////////////////////////////////\n    // /// @dev Mainnet address of the WETH contract.\n    // address constant private WETH_ADDRESS = 0xc778417E063141139Fce010982780140Aa0cD5Ab;\n    // /// @dev Mainnet address of the KyberNetworkProxy contract.\n    // address constant private KYBER_NETWORK_PROXY_ADDRESS = 0x0d5371e5EE23dec7DF251A8957279629aa79E9C5;\n    // /// @dev Mainnet address of the `UniswapExchangeFactory` contract.\n    // address constant private UNISWAP_EXCHANGE_FACTORY_ADDRESS = 0xf5D915570BC477f9B8D6C0E980aA81757A3AaC36;\n    // /// @dev Mainnet address of the `UniswapV2Router01` contract.\n    // address constant private UNISWAP_V2_ROUTER_01_ADDRESS = 0xf164fC0Ec4E93095b804a4795bBe1e041497b92a;\n    // /// @dev Mainnet address of the Eth2Dai `MatchingMarket` contract.\n    // address constant private ETH2DAI_ADDRESS = address(0);\n    // /// @dev Mainnet address of the `ERC20BridgeProxy` contract\n    // address constant private ERC20_BRIDGE_PROXY_ADDRESS = 0xA2AA4bEFED748Fba27a3bE7Dfd2C4b2c6DB1F49B;\n    // ///@dev Mainnet address of the `Dai` (multi-collateral) contract\n    // address constant private DAI_ADDRESS = address(0);\n    // /// @dev Mainnet address of the `Chai` contract\n    // address constant private CHAI_ADDRESS = address(0);\n    // /// @dev Mainnet address of the 0x DevUtils contract.\n    // address constant private DEV_UTILS_ADDRESS = 0x46B5BC959e8A754c0256FFF73bF34A52Ad5CdfA9;\n    // /// @dev Kyber ETH pseudo-address.\n    // address constant internal KYBER_ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;\n    // /// @dev Mainnet address of the dYdX contract.\n    // address constant private DYDX_ADDRESS = address(0);\n    // /// @dev Mainnet address of the GST2 contract\n    // address constant private GST_ADDRESS = address(0);\n    // /// @dev Mainnet address of the GST Collector\n    // address constant private GST_COLLECTOR_ADDRESS = address(0);\n    // /// @dev Mainnet address of the mStable mUSD contract.\n    // address constant private MUSD_ADDRESS = address(0);\n\n    // // Kovan addresses /////////////////////////////////////////////////////////\n    // /// @dev Kovan address of the WETH contract.\n    // address constant private WETH_ADDRESS = 0xd0A1E359811322d97991E03f863a0C30C2cF029C;\n    // /// @dev Kovan address of the KyberNetworkProxy contract.\n    // address constant private KYBER_NETWORK_PROXY_ADDRESS = 0x692f391bCc85cefCe8C237C01e1f636BbD70EA4D;\n    // /// @dev Kovan address of the `UniswapExchangeFactory` contract.\n    // address constant private UNISWAP_EXCHANGE_FACTORY_ADDRESS = 0xD3E51Ef092B2845f10401a0159B2B96e8B6c3D30;\n    // /// @dev Kovan address of the `UniswapV2Router01` contract.\n    // address constant private UNISWAP_V2_ROUTER_01_ADDRESS = 0xf164fC0Ec4E93095b804a4795bBe1e041497b92a;\n    // /// @dev Kovan address of the Eth2Dai `MatchingMarket` contract.\n    // address constant private ETH2DAI_ADDRESS = 0xe325acB9765b02b8b418199bf9650972299235F4;\n    // /// @dev Kovan address of the `ERC20BridgeProxy` contract\n    // address constant private ERC20_BRIDGE_PROXY_ADDRESS = 0x3577552C1Fb7A44aD76BeEB7aB53251668A21F8D;\n    // /// @dev Kovan address of the `Chai` contract\n    // address constant private CHAI_ADDRESS = address(0);\n    // /// @dev Kovan address of the `Dai` (multi-collateral) contract\n    // address constant private DAI_ADDRESS = 0x4F96Fe3b7A6Cf9725f59d353F723c1bDb64CA6Aa;\n    // /// @dev Kovan address of the 0x DevUtils contract.\n    // address constant private DEV_UTILS_ADDRESS = 0x9402639A828BdF4E9e4103ac3B69E1a6E522eB59;\n    // /// @dev Kyber ETH pseudo-address.\n    // address constant internal KYBER_ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;\n    // /// @dev Kovan address of the dYdX contract.\n    // address constant private DYDX_ADDRESS = address(0);\n    // /// @dev Kovan address of the GST2 contract\n    // address constant private GST_ADDRESS = address(0);\n    // /// @dev Kovan address of the GST Collector\n    // address constant private GST_COLLECTOR_ADDRESS = address(0);\n    // /// @dev Mainnet address of the mStable mUSD contract.\n    // address constant private MUSD_ADDRESS = address(0);\n\n    /// @dev Overridable way to get the `KyberNetworkProxy` address.\n    /// @return kyberAddress The `IKyberNetworkProxy` address.\n    function _getKyberNetworkProxyAddress()\n        internal\n        view\n        returns (address kyberAddress)\n    {\n        return KYBER_NETWORK_PROXY_ADDRESS;\n    }\n\n    /// @dev Overridable way to get the `KyberHintHandler` address.\n    /// @return kyberAddress The `IKyberHintHandler` address.\n    function _getKyberHintHandlerAddress()\n        internal\n        view\n        returns (address hintHandlerAddress)\n    {\n        return KYBER_HINT_HANDLER_ADDRESS;\n    }\n\n    /// @dev Overridable way to get the WETH address.\n    /// @return wethAddress The WETH address.\n    function _getWethAddress()\n        internal\n        view\n        returns (address wethAddress)\n    {\n        return WETH_ADDRESS;\n    }\n\n    /// @dev Overridable way to get the `UniswapExchangeFactory` address.\n    /// @return uniswapAddress The `UniswapExchangeFactory` address.\n    function _getUniswapExchangeFactoryAddress()\n        internal\n        view\n        returns (address uniswapAddress)\n    {\n        return UNISWAP_EXCHANGE_FACTORY_ADDRESS;\n    }\n\n    /// @dev Overridable way to get the `UniswapV2Router01` address.\n    /// @return uniswapRouterAddress The `UniswapV2Router01` address.\n    function _getUniswapV2Router01Address()\n        internal\n        view\n        returns (address uniswapRouterAddress)\n    {\n        return UNISWAP_V2_ROUTER_01_ADDRESS;\n    }\n\n    /// @dev An overridable way to retrieve the Eth2Dai `MatchingMarket` contract.\n    /// @return eth2daiAddress The Eth2Dai `MatchingMarket` contract.\n    function _getEth2DaiAddress()\n        internal\n        view\n        returns (address eth2daiAddress)\n    {\n        return ETH2DAI_ADDRESS;\n    }\n\n    /// @dev An overridable way to retrieve the `ERC20BridgeProxy` contract.\n    /// @return erc20BridgeProxyAddress The `ERC20BridgeProxy` contract.\n    function _getERC20BridgeProxyAddress()\n        internal\n        view\n        returns (address erc20BridgeProxyAddress)\n    {\n        return ERC20_BRIDGE_PROXY_ADDRESS;\n    }\n\n    /// @dev An overridable way to retrieve the `Dai` contract.\n    /// @return daiAddress The `Dai` contract.\n    function _getDaiAddress()\n        internal\n        view\n        returns (address daiAddress)\n    {\n        return DAI_ADDRESS;\n    }\n\n    /// @dev An overridable way to retrieve the `Chai` contract.\n    /// @return chaiAddress The `Chai` contract.\n    function _getChaiAddress()\n        internal\n        view\n        returns (address chaiAddress)\n    {\n        return CHAI_ADDRESS;\n    }\n\n    /// @dev An overridable way to retrieve the 0x `DevUtils` contract address.\n    /// @return devUtils The 0x `DevUtils` contract address.\n    function _getDevUtilsAddress()\n        internal\n        view\n        returns (address devUtils)\n    {\n        return DEV_UTILS_ADDRESS;\n    }\n\n    /// @dev Overridable way to get the DyDx contract.\n    /// @return exchange The DyDx exchange contract.\n    function _getDydxAddress()\n        internal\n        view\n        returns (address dydxAddress)\n    {\n        return DYDX_ADDRESS;\n    }\n\n    /// @dev An overridable way to retrieve the GST2 contract address.\n    /// @return gst The GST contract.\n    function _getGstAddress()\n        internal\n        view\n        returns (address gst)\n    {\n        return GST_ADDRESS;\n    }\n\n    /// @dev An overridable way to retrieve the GST Collector address.\n    /// @return collector The GST collector address.\n    function _getGstCollectorAddress()\n        internal\n        view\n        returns (address collector)\n    {\n        return GST_COLLECTOR_ADDRESS;\n    }\n\n    /// @dev An overridable way to retrieve the mStable mUSD address.\n    /// @return musd The mStable mUSD address.\n    function _getMUsdAddress()\n        internal\n        view\n        returns (address musd)\n    {\n        return MUSD_ADDRESS;\n    }\n\n    /// @dev An overridable way to retrieve the Mooniswap registry address.\n    /// @return registry The Mooniswap registry address.\n    function _getMooniswapAddress()\n        internal\n        view\n        returns (address)\n    {\n        return MOONISWAP_REGISTRY;\n    }\n\n    /// @dev An overridable way to retrieve the DODO Registry contract address.\n    /// @return registry The DODO Registry contract address.\n    function _getDODORegistryAddress()\n        internal\n        view\n        returns (address)\n    {\n        return DODO_REGISTRY;\n    }\n\n    /// @dev An overridable way to retrieve the DODO Helper contract address.\n    /// @return registry The DODO Helper contract address.\n    function _getDODOHelperAddress()\n        internal\n        view\n        returns (address)\n    {\n        return DODO_HELPER;\n    }\n}\n",
        "@0x/contracts-utils/contracts/src/LibSafeMath.sol": "pragma solidity ^0.5.9;\n\nimport \"./LibRichErrors.sol\";\nimport \"./LibSafeMathRichErrors.sol\";\n\n\nlibrary LibSafeMath {\n\n    function safeMul(uint256 a, uint256 b)\n        internal\n        pure\n        returns (uint256)\n    {\n        if (a == 0) {\n            return 0;\n        }\n        uint256 c = a * b;\n        if (c / a != b) {\n            LibRichErrors.rrevert(LibSafeMathRichErrors.Uint256BinOpError(\n                LibSafeMathRichErrors.BinOpErrorCodes.MULTIPLICATION_OVERFLOW,\n                a,\n                b\n            ));\n        }\n        return c;\n    }\n\n    function safeDiv(uint256 a, uint256 b)\n        internal\n        pure\n        returns (uint256)\n    {\n        if (b == 0) {\n            LibRichErrors.rrevert(LibSafeMathRichErrors.Uint256BinOpError(\n                LibSafeMathRichErrors.BinOpErrorCodes.DIVISION_BY_ZERO,\n                a,\n                b\n            ));\n        }\n        uint256 c = a / b;\n        return c;\n    }\n\n    function safeSub(uint256 a, uint256 b)\n        internal\n        pure\n        returns (uint256)\n    {\n        if (b > a) {\n            LibRichErrors.rrevert(LibSafeMathRichErrors.Uint256BinOpError(\n                LibSafeMathRichErrors.BinOpErrorCodes.SUBTRACTION_UNDERFLOW,\n                a,\n                b\n            ));\n        }\n        return a - b;\n    }\n\n    function safeAdd(uint256 a, uint256 b)\n        internal\n        pure\n        returns (uint256)\n    {\n        uint256 c = a + b;\n        if (c < a) {\n            LibRichErrors.rrevert(LibSafeMathRichErrors.Uint256BinOpError(\n                LibSafeMathRichErrors.BinOpErrorCodes.ADDITION_OVERFLOW,\n                a,\n                b\n            ));\n        }\n        return c;\n    }\n\n    function max256(uint256 a, uint256 b)\n        internal\n        pure\n        returns (uint256)\n    {\n        return a >= b ? a : b;\n    }\n\n    function min256(uint256 a, uint256 b)\n        internal\n        pure\n        returns (uint256)\n    {\n        return a < b ? a : b;\n    }\n}\n",
        "@0x/contracts-utils/contracts/src/LibSafeMathRichErrors.sol": "pragma solidity ^0.5.9;\n\n\nlibrary LibSafeMathRichErrors {\n\n    // bytes4(keccak256(\"Uint256BinOpError(uint8,uint256,uint256)\"))\n    bytes4 internal constant UINT256_BINOP_ERROR_SELECTOR =\n        0xe946c1bb;\n\n    // bytes4(keccak256(\"Uint256DowncastError(uint8,uint256)\"))\n    bytes4 internal constant UINT256_DOWNCAST_ERROR_SELECTOR =\n        0xc996af7b;\n\n    enum BinOpErrorCodes {\n        ADDITION_OVERFLOW,\n        MULTIPLICATION_OVERFLOW,\n        SUBTRACTION_UNDERFLOW,\n        DIVISION_BY_ZERO\n    }\n\n    enum DowncastErrorCodes {\n        VALUE_TOO_LARGE_TO_DOWNCAST_TO_UINT32,\n        VALUE_TOO_LARGE_TO_DOWNCAST_TO_UINT64,\n        VALUE_TOO_LARGE_TO_DOWNCAST_TO_UINT96\n    }\n\n    // solhint-disable func-name-mixedcase\n    function Uint256BinOpError(\n        BinOpErrorCodes errorCode,\n        uint256 a,\n        uint256 b\n    )\n        internal\n        pure\n        returns (bytes memory)\n    {\n        return abi.encodeWithSelector(\n            UINT256_BINOP_ERROR_SELECTOR,\n            errorCode,\n            a,\n            b\n        );\n    }\n\n    function Uint256DowncastError(\n        DowncastErrorCodes errorCode,\n        uint256 a\n    )\n        internal\n        pure\n        returns (bytes memory)\n    {\n        return abi.encodeWithSelector(\n            UINT256_DOWNCAST_ERROR_SELECTOR,\n            errorCode,\n            a\n        );\n    }\n}\n",
        "../src/interfaces/IERC20Bridge.sol": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\ncontract IERC20Bridge {\n\n    /// @dev Result of a successful bridge call.\n    bytes4 constant internal BRIDGE_SUCCESS = 0xdc1600f3;\n\n    /// @dev Emitted when a trade occurs.\n    /// @param inputToken The token the bridge is converting from.\n    /// @param outputToken The token the bridge is converting to.\n    /// @param inputTokenAmount Amount of input token.\n    /// @param outputTokenAmount Amount of output token.\n    /// @param from The `from` address in `bridgeTransferFrom()`\n    /// @param to The `to` address in `bridgeTransferFrom()`\n    event ERC20BridgeTransfer(\n        address inputToken,\n        address outputToken,\n        uint256 inputTokenAmount,\n        uint256 outputTokenAmount,\n        address from,\n        address to\n    );\n\n    /// @dev Transfers `amount` of the ERC20 `tokenAddress` from `from` to `to`.\n    /// @param tokenAddress The address of the ERC20 token to transfer.\n    /// @param from Address to transfer asset from.\n    /// @param to Address to transfer asset to.\n    /// @param amount Amount of asset to transfer.\n    /// @param bridgeData Arbitrary asset data needed by the bridge contract.\n    /// @return success The magic bytes `0xdc1600f3` if successful.\n    function bridgeTransferFrom(\n        address tokenAddress,\n        address from,\n        address to,\n        uint256 amount,\n        bytes calldata bridgeData\n    )\n        external\n        returns (bytes4 success);\n}\n",
        "../src/interfaces/IKyberNetworkProxy.sol": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\ninterface IKyberNetworkProxy {\n\n    /// @dev Sells `sellTokenAddress` tokens for `buyTokenAddress` tokens.\n    /// @param sellTokenAddress Token to sell.\n    /// @param sellAmount Amount of tokens to sell.\n    /// @param buyTokenAddress Token to buy.\n    /// @param recipientAddress Address to send bought tokens to.\n    /// @param maxBuyTokenAmount A limit on the amount of tokens to buy.\n    /// @param minConversionRate The minimal conversion rate. If actual rate\n    ///        is lower, trade is canceled.\n    /// @param walletId The wallet ID to send part of the fees\n    /// @return boughtAmount Amount of tokens bought.\n    function trade(\n        address sellTokenAddress,\n        uint256 sellAmount,\n        address buyTokenAddress,\n        address payable recipientAddress,\n        uint256 maxBuyTokenAmount,\n        uint256 minConversionRate,\n        address walletId\n    )\n        external\n        payable\n        returns (uint256 boughtAmount);\n\n    /// @dev Sells `sellTokenAddress` tokens for `buyTokenAddress` tokens\n    /// using a hint for the reserve.\n    /// @param sellTokenAddress Token to sell.\n    /// @param sellAmount Amount of tokens to sell.\n    /// @param buyTokenAddress Token to buy.\n    /// @param recipientAddress Address to send bought tokens to.\n    /// @param maxBuyTokenAmount A limit on the amount of tokens to buy.\n    /// @param minConversionRate The minimal conversion rate. If actual rate\n    ///        is lower, trade is canceled.\n    /// @param walletId The wallet ID to send part of the fees\n    /// @param hint The hint for the selective inclusion (or exclusion) of reserves\n    /// @return boughtAmount Amount of tokens bought.\n    function tradeWithHint(\n        address sellTokenAddress,\n        uint256 sellAmount,\n        address buyTokenAddress,\n        address payable recipientAddress,\n        uint256 maxBuyTokenAmount,\n        uint256 minConversionRate,\n        address payable walletId,\n        bytes calldata hint\n    )\n        external\n        payable\n        returns (uint256 boughtAmount);\n}\n"
    },
    "compiler": {
        "name": "solc",
        "version": "0.5.17+commit.d19bba13",
        "settings": {
            "remappings": [
                "@0x/contracts-utils=/home/runner/work/protocol/protocol/contracts/asset-proxy/node_modules/@0x/contracts-utils",
                "@0x/contracts-erc1155=/home/runner/work/protocol/protocol/contracts/asset-proxy/node_modules/@0x/contracts-erc1155",
                "@0x/contracts-erc20=/home/runner/work/protocol/protocol/contracts/asset-proxy/node_modules/@0x/contracts-erc20",
                "@0x/contracts-exchange-libs=/home/runner/work/protocol/protocol/contracts/asset-proxy/node_modules/@0x/contracts-exchange-libs"
            ],
            "optimizer": {
                "enabled": true,
                "runs": 1000000,
                "details": {
                    "yul": true,
                    "deduplicate": true,
                    "cse": true,
                    "constantOptimizer": true
                }
            },
            "outputSelection": {
                "*": {
                    "*": [
                        "abi",
                        "devdoc",
                        "evm.bytecode.object",
                        "evm.bytecode.sourceMap",
                        "evm.deployedBytecode.object",
                        "evm.deployedBytecode.sourceMap"
                    ]
                }
            },
            "evmVersion": "istanbul"
        }
    },
    "chains": {}
}
