{
    "schemaVersion": "2.0.0",
    "contractName": "TestUniswapBridge",
    "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": "exchange",
                        "type": "address"
                    },
                    {
                        "indexed": false,
                        "internalType": "uint256",
                        "name": "minTokensBought",
                        "type": "uint256"
                    },
                    {
                        "indexed": false,
                        "internalType": "uint256",
                        "name": "deadline",
                        "type": "uint256"
                    },
                    {
                        "indexed": false,
                        "internalType": "address",
                        "name": "recipient",
                        "type": "address"
                    }
                ],
                "name": "EthToTokenTransferInput",
                "type": "event"
            },
            {
                "anonymous": false,
                "inputs": [
                    {
                        "indexed": false,
                        "internalType": "address",
                        "name": "spender",
                        "type": "address"
                    },
                    {
                        "indexed": false,
                        "internalType": "uint256",
                        "name": "allowance",
                        "type": "uint256"
                    }
                ],
                "name": "TokenApprove",
                "type": "event"
            },
            {
                "anonymous": false,
                "inputs": [
                    {
                        "indexed": false,
                        "internalType": "address",
                        "name": "exchange",
                        "type": "address"
                    },
                    {
                        "indexed": false,
                        "internalType": "uint256",
                        "name": "tokensSold",
                        "type": "uint256"
                    },
                    {
                        "indexed": false,
                        "internalType": "uint256",
                        "name": "minEthBought",
                        "type": "uint256"
                    },
                    {
                        "indexed": false,
                        "internalType": "uint256",
                        "name": "deadline",
                        "type": "uint256"
                    }
                ],
                "name": "TokenToEthSwapInput",
                "type": "event"
            },
            {
                "anonymous": false,
                "inputs": [
                    {
                        "indexed": false,
                        "internalType": "address",
                        "name": "exchange",
                        "type": "address"
                    },
                    {
                        "indexed": false,
                        "internalType": "uint256",
                        "name": "tokensSold",
                        "type": "uint256"
                    },
                    {
                        "indexed": false,
                        "internalType": "uint256",
                        "name": "minTokensBought",
                        "type": "uint256"
                    },
                    {
                        "indexed": false,
                        "internalType": "uint256",
                        "name": "minEthBought",
                        "type": "uint256"
                    },
                    {
                        "indexed": false,
                        "internalType": "uint256",
                        "name": "deadline",
                        "type": "uint256"
                    },
                    {
                        "indexed": false,
                        "internalType": "address",
                        "name": "recipient",
                        "type": "address"
                    },
                    {
                        "indexed": false,
                        "internalType": "address",
                        "name": "toTokenAddress",
                        "type": "address"
                    }
                ],
                "name": "TokenToTokenTransferInput",
                "type": "event"
            },
            {
                "anonymous": false,
                "inputs": [
                    {
                        "indexed": false,
                        "internalType": "address",
                        "name": "token",
                        "type": "address"
                    },
                    {
                        "indexed": false,
                        "internalType": "address",
                        "name": "from",
                        "type": "address"
                    },
                    {
                        "indexed": false,
                        "internalType": "address",
                        "name": "to",
                        "type": "address"
                    },
                    {
                        "indexed": false,
                        "internalType": "uint256",
                        "name": "amount",
                        "type": "uint256"
                    }
                ],
                "name": "TokenTransfer",
                "type": "event"
            },
            {
                "anonymous": false,
                "inputs": [
                    {
                        "indexed": false,
                        "internalType": "uint256",
                        "name": "amount",
                        "type": "uint256"
                    }
                ],
                "name": "WethDeposit",
                "type": "event"
            },
            {
                "anonymous": false,
                "inputs": [
                    {
                        "indexed": false,
                        "internalType": "uint256",
                        "name": "amount",
                        "type": "uint256"
                    }
                ],
                "name": "WethWithdraw",
                "type": "event"
            },
            {
                "payable": true,
                "stateMutability": "payable",
                "type": "fallback"
            },
            {
                "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": "address",
                        "name": "tokenAddress",
                        "type": "address"
                    },
                    {
                        "internalType": "string",
                        "name": "revertReason",
                        "type": "string"
                    }
                ],
                "name": "createTokenAndExchange",
                "outputs": [
                    {
                        "internalType": "contract TestToken",
                        "name": "token",
                        "type": "address"
                    },
                    {
                        "internalType": "contract TestExchange",
                        "name": "exchange",
                        "type": "address"
                    }
                ],
                "payable": true,
                "stateMutability": "payable",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [
                    {
                        "internalType": "address",
                        "name": "tokenAddress",
                        "type": "address"
                    }
                ],
                "name": "getExchange",
                "outputs": [
                    {
                        "internalType": "address",
                        "name": "",
                        "type": "address"
                    }
                ],
                "payable": false,
                "stateMutability": "view",
                "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": "minTokensBought",
                        "type": "uint256"
                    },
                    {
                        "internalType": "uint256",
                        "name": "deadline",
                        "type": "uint256"
                    },
                    {
                        "internalType": "address",
                        "name": "recipient",
                        "type": "address"
                    }
                ],
                "name": "raiseEthToTokenTransferInput",
                "outputs": [],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    {
                        "internalType": "address",
                        "name": "spender",
                        "type": "address"
                    },
                    {
                        "internalType": "uint256",
                        "name": "allowance",
                        "type": "uint256"
                    }
                ],
                "name": "raiseTokenApprove",
                "outputs": [],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    {
                        "internalType": "uint256",
                        "name": "tokensSold",
                        "type": "uint256"
                    },
                    {
                        "internalType": "uint256",
                        "name": "minEthBought",
                        "type": "uint256"
                    },
                    {
                        "internalType": "uint256",
                        "name": "deadline",
                        "type": "uint256"
                    }
                ],
                "name": "raiseTokenToEthSwapInput",
                "outputs": [],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    {
                        "internalType": "uint256",
                        "name": "tokensSold",
                        "type": "uint256"
                    },
                    {
                        "internalType": "uint256",
                        "name": "minTokensBought",
                        "type": "uint256"
                    },
                    {
                        "internalType": "uint256",
                        "name": "minEthBought",
                        "type": "uint256"
                    },
                    {
                        "internalType": "uint256",
                        "name": "deadline",
                        "type": "uint256"
                    },
                    {
                        "internalType": "address",
                        "name": "recipient",
                        "type": "address"
                    },
                    {
                        "internalType": "address",
                        "name": "toTokenAddress",
                        "type": "address"
                    }
                ],
                "name": "raiseTokenToTokenTransferInput",
                "outputs": [],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    {
                        "internalType": "address",
                        "name": "from",
                        "type": "address"
                    },
                    {
                        "internalType": "address",
                        "name": "to",
                        "type": "address"
                    },
                    {
                        "internalType": "uint256",
                        "name": "amount",
                        "type": "uint256"
                    }
                ],
                "name": "raiseTokenTransfer",
                "outputs": [],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    {
                        "internalType": "uint256",
                        "name": "amount",
                        "type": "uint256"
                    }
                ],
                "name": "raiseWethDeposit",
                "outputs": [],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    {
                        "internalType": "uint256",
                        "name": "amount",
                        "type": "uint256"
                    }
                ],
                "name": "raiseWethWithdraw",
                "outputs": [],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    {
                        "internalType": "address",
                        "name": "tokenAddress",
                        "type": "address"
                    }
                ],
                "name": "setTokenBalance",
                "outputs": [],
                "payable": true,
                "stateMutability": "payable",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    {
                        "internalType": "address",
                        "name": "tokenAddress",
                        "type": "address"
                    },
                    {
                        "internalType": "string",
                        "name": "revertReason",
                        "type": "string"
                    }
                ],
                "name": "setTokenRevertReason",
                "outputs": [],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [],
                "name": "wethToken",
                "outputs": [
                    {
                        "internalType": "contract TestToken",
                        "name": "",
                        "type": "address"
                    }
                ],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            }
        ],
        "devdoc": {
            "details": "UniswapBridge overridden to mock tokens and implement IUniswapExchangeFactory.",
            "methods": {
                "bridgeTransferFrom(address,address,address,uint256,bytes)": {
                    "details": "Callback for `IERC20Bridge`. Tries to buy `amount` of      `toTokenAddress` tokens by selling the entirety of the `fromTokenAddress`      token encoded in the bridge data.",
                    "params": {
                        "amount": "Minimum amount of `toTokenAddress` tokens to buy.",
                        "bridgeData": "The abi-encoded \"from\" token address.",
                        "from": "The maker (this contract).",
                        "to": "The recipient of the bought tokens.",
                        "toTokenAddress": "The token to buy and transfer to `to`."
                    },
                    "return": "success The magic bytes if successful."
                },
                "createTokenAndExchange(address,string)": {
                    "details": "Create a token and exchange (if they don't exist) for a new token      and sets the exchange revert and fill behavior. The wei attached      will be the fill amount for the exchange.",
                    "params": {
                        "revertReason": "The revert reason for exchange operations.",
                        "tokenAddress": "The token address. If zero, one will be created."
                    }
                },
                "getExchange(address)": {
                    "details": "`IUniswapExchangeFactory.getExchange`"
                },
                "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 Success bytes, always."
                },
                "setTokenBalance(address)": {
                    "details": "Sets the balance of this contract for an existing token.      The wei attached will be the balance."
                },
                "setTokenRevertReason(address,string)": {
                    "details": "Sets the revert reason for an existing token."
                }
            }
        },
        "evm": {
            "bytecode": {
                "linkReferences": {},
                "object": "0x608060405234801561001057600080fd5b5060405161001d90610076565b604051809103906000f080158015610039573d6000803e3d6000fd5b50600080546001600160a01b039283166001600160a01b031991821617808355909216808252600160205260409091208054909216179055610083565b61094580612b3483390190565b612aa2806100926000396000f3fe6080604052600436106100dd5760003560e01c806348d134a01161007f578063c2df82e611610059578063c2df82e61461022a578063c60b5bd21461024a578063d2a10dc51461026b578063d59641f21461028b576100dd565b806348d134a0146101d55780634b57b0be146101f5578063866711081461020a576100dd565b806336c8c27d116100bb57806336c8c27d146101625780633974d3b11461018257806339dd7d0914610195578063426db9cd146101b5576100dd565b806306f2bf62146100df5780631626ba7e14610115578063301ddf0314610142575b005b3480156100eb57600080fd5b506100ff6100fa36600461132a565b6102ab565b60405161010c919061161d565b60405180910390f35b34801561012157600080fd5b506101356101303660046114c3565b6102d6565b60405161010c91906117c0565b34801561014e57600080fd5b506100dd61015d36600461155c565b6102fe565b34801561016e57600080fd5b506100dd61017d366004611478565b610340565b6100dd61019036600461132a565b61037d565b3480156101a157600080fd5b506100dd6101b03660046113e5565b610412565b3480156101c157600080fd5b506100dd6101d03660046114f4565b610447565b3480156101e157600080fd5b506100dd6101f0366004611587565b610481565b34801561020157600080fd5b506100ff6104cc565b34801561021657600080fd5b506100dd6102253660046114f4565b6104e8565b34801561023657600080fd5b50610135610245366004611362565b610517565b61025d610258366004611425565b610afa565b60405161010c92919061172c565b34801561027757600080fd5b506100dd610286366004611425565b610cbe565b34801561029757600080fd5b506100dd6102a6366004611524565b610d5f565b73ffffffffffffffffffffffffffffffffffffffff9081166000908152600260205260409020541690565b7fb0671381000000000000000000000000000000000000000000000000000000009392505050565b7fd04cb125770091752f21a6c6819db3391781d9fc697613b307bb5136e13d4f343384848460405161033394939291906116ad565b60405180910390a1505050565b7f54b41d7666b1bded95f272024889ac00d41cb183d6444dde7c15dfec6bd32fd8828260405161037192919061179a565b60405180910390a15050565b73ffffffffffffffffffffffffffffffffffffffff8082166000908152600160205260408082205481517fd0e30db00000000000000000000000000000000000000000000000000000000081529151931692839263d0e30db09234926004808301939282900301818588803b1580156103f557600080fd5b505af1158015610409573d6000803e3d6000fd5b50505050505050565b7fae33cb06d7303f889d953bb09540983050163c1c4c98b330db432a911cfb63fd33848484604051610333949392919061163e565b7fa31300b5a9e5c5ace6706c4a93516eeb66365bbd1051ece1a3c0339512b2435d816040516104769190611893565b60405180910390a150565b7f1c1a2d4f99027059a394b97e18f3cf047a7363768a6a873c9cff883ea4358645338787878787876040516104bc97969594939291906116e0565b60405180910390a1505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b7fd5b3768a34b8338255d3de13ffce5a4bbc441aa6a62544eb3e8b80e7b50a7738816040516104769190611893565b6000610521611275565b600061052f8486018661132a565b90508873ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561059b57610570818888610d94565b507fdc1600f3000000000000000000000000000000000000000000000000000000009150610af09050565b6105a5818a610e5b565b73ffffffffffffffffffffffffffffffffffffffff90811683526040517f70a08231000000000000000000000000000000000000000000000000000000008152908216906370a08231906105fd90309060040161161d565b60206040518083038186803b15801561061557600080fd5b505afa158015610629573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061064d919081019061150c565b602083015261065a610f8b565b73ffffffffffffffffffffffffffffffffffffffff9081166040840181905290821614156107b057816040015173ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d83602001516040518263ffffffff1660e01b81526004016106c39190611893565b600060405180830381600087803b1580156106dd57600080fd5b505af11580156106f1573d6000803e3d6000fd5b5050835160208501516040517fad65d76d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909216935063ad65d76d925090610754908a9042908d9060040161189c565b6020604051808303818588803b15801561076d57600080fd5b505af1158015610781573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052506107a6919081019061150c565b6060830152610a81565b816040015173ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614156109ca576107fb8260000151828460200151610fa7565b815160208301516040517f95e3c50b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909216916395e3c50b91610857918a904290600401611909565b602060405180830381600087803b15801561087157600080fd5b505af1158015610885573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506108a9919081019061150c565b826060018181525050816040015173ffffffffffffffffffffffffffffffffffffffff1663d0e30db083606001516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561090257600080fd5b505af1158015610916573d6000803e3d6000fd5b50505060608401516040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8d16935063a9059cbb9250610972918b9160040161179a565b602060405180830381600087803b15801561098c57600080fd5b505af11580156109a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506109c491908101906114a3565b50610a81565b6109dd8260000151828460200151610fa7565b816000015173ffffffffffffffffffffffffffffffffffffffff1663f552d91b8360200151886001428c8f6040518763ffffffff1660e01b8152600401610a29969594939291906118c8565b602060405180830381600087803b158015610a4357600080fd5b505af1158015610a57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610a7b919081019061150c565b60608301525b7f349fc08071558d8e3aa92dec9396e4e9f2dfecd6bb9065759d1932e7da43b8a9818a846020015185606001518c8c604051610ac296959493929190611753565b60405180910390a1507fdc1600f3000000000000000000000000000000000000000000000000000000009150505b9695505050505050565b82600073ffffffffffffffffffffffffffffffffffffffff8216610b4457604051610b24906112c9565b604051809103906000f080158015610b40573d6000803e3d6000fd5b5091505b5073ffffffffffffffffffffffffffffffffffffffff808216600081815260016020908152604080832080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169094179093556002905220541680610c2e5781604051610bb1906112d6565b610bbb919061161d565b604051809103906000f080158015610bd7573d6000803e3d6000fd5b5073ffffffffffffffffffffffffffffffffffffffff838116600090815260026020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001691831691909117905590505b6040517f1526787200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8216906315267872903490610c84908890889060040161180f565b6000604051808303818588803b158015610c9d57600080fd5b505af1158015610cb1573d6000803e3d6000fd5b5050505050935093915050565b73ffffffffffffffffffffffffffffffffffffffff808416600090815260016020526040908190205490517f55b3f96600000000000000000000000000000000000000000000000000000000815291169081906355b3f96690610d27908690869060040161180f565b600060405180830381600087803b158015610d4157600080fd5b505af1158015610d55573d6000803e3d6000fd5b5050505050505050565b7fc9be139b48c2029c766f0907faee476f9303fb99bc9ed028959537b81756f666338484846040516103339493929190611675565b6040516060907fa9059cbb0000000000000000000000000000000000000000000000000000000090610dcc908590859060240161179a565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050610e558482610fb7565b50505050565b600082610e66610f8b565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415610e9c5750815b610ea4611073565b73ffffffffffffffffffffffffffffffffffffffff166306f2bf62826040518263ffffffff1660e01b8152600401610edc919061161d565b60206040518083038186803b158015610ef457600080fd5b505afa158015610f08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610f2c9190810190611346565b915073ffffffffffffffffffffffffffffffffffffffff8216610f84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7b9061185c565b60405180910390fd5b5092915050565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b610fb2828483611077565b505050565b600060608373ffffffffffffffffffffffffffffffffffffffff1683604051610fe091906115e4565b6000604051808303816000865af19150503d806000811461101d576040519150601f19603f3d011682016040523d82523d6000602084013e611022565b606091505b5091509150811561106657805161103a57505061106f565b80516020141561106657600061105182600061114e565b905080600114156110645750505061106f565b505b610e5581611161565b5050565b3090565b6040517fdd62ed3e000000000000000000000000000000000000000000000000000000008152819073ffffffffffffffffffffffffffffffffffffffff85169063dd62ed3e906110cd903090879060040161172c565b60206040518083038186803b1580156110e557600080fd5b505afa1580156110f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061111d919081019061150c565b1015610fb257610fb283837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff611169565b600061115a83836111a1565b9392505050565b805160208201fd5b6040516060907f095ea7b30000000000000000000000000000000000000000000000000000000090610dcc908590859060240161179a565b600081602001835110156111c7576111c76111c260058551856020016111d0565b611161565b50016020015190565b6060632800659560e01b8484846040516024016111ef939291906117ed565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290509392505050565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600081525090565b6109458061194583390190565b6107d68061228a83390190565b60008083601f8401126112f4578182fd5b50813567ffffffffffffffff81111561130b578182fd5b60208301915083602082850101111561132357600080fd5b9250929050565b60006020828403121561133b578081fd5b813561115a8161191f565b600060208284031215611357578081fd5b815161115a8161191f565b60008060008060008060a0878903121561137a578182fd5b86356113858161191f565b955060208701356113958161191f565b945060408701356113a58161191f565b935060608701359250608087013567ffffffffffffffff8111156113c7578283fd5b6113d389828a016112e3565b979a9699509497509295939492505050565b6000806000606084860312156113f9578283fd5b83356114048161191f565b925060208401356114148161191f565b929592945050506040919091013590565b600080600060408486031215611439578283fd5b83356114448161191f565b9250602084013567ffffffffffffffff81111561145f578283fd5b61146b868287016112e3565b9497909650939450505050565b6000806040838503121561148a578182fd5b82356114958161191f565b946020939093013593505050565b6000602082840312156114b4578081fd5b8151801515811461115a578182fd5b6000806000604084860312156114d7578283fd5b83359250602084013567ffffffffffffffff81111561145f578283fd5b600060208284031215611505578081fd5b5035919050565b60006020828403121561151d578081fd5b5051919050565b600080600060608486031215611538578283fd5b833592506020840135915060408401356115518161191f565b809150509250925092565b600080600060608486031215611570578283fd5b505081359360208301359350604090920135919050565b60008060008060008060c0878903121561159f578384fd5b8635955060208701359450604087013593506060870135925060808701356115c68161191f565b915060a08701356115d68161191f565b809150509295509295509295565b60008251815b8181101561160457602081860181015185830152016115ea565b818111156116125782828501525b509190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff9485168152928416602084015292166040820152606081019190915260800190565b73ffffffffffffffffffffffffffffffffffffffff948516815260208101939093526040830191909152909116606082015260800190565b73ffffffffffffffffffffffffffffffffffffffff94909416845260208401929092526040830152606082015260800190565b73ffffffffffffffffffffffffffffffffffffffff97881681526020810196909652604086019490945260608501929092526080840152831660a083015290911660c082015260e00190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff96871681529486166020860152604085019390935260608401919091528316608083015290911660a082015260c00190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b7fffffffff0000000000000000000000000000000000000000000000000000000091909116815260200190565b60608101600885106117fb57fe5b938152602081019290925260409091015290565b60006020825282602083015282846040840137818301604090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101919050565b6020808252601d908201527f4e4f5f554e49535741505f45584348414e47455f464f525f544f4b454e000000604082015260600190565b90815260200190565b928352602083019190915273ffffffffffffffffffffffffffffffffffffffff16604082015260600190565b95865260208601949094526040850192909252606084015273ffffffffffffffffffffffffffffffffffffffff90811660808401521660a082015260c00190565b9283526020830191909152604082015260600190565b73ffffffffffffffffffffffffffffffffffffffff8116811461194157600080fd5b5056fe608060405234801561001057600080fd5b50610925806100206000396000f3fe6080604052600436106100965760003560e01c806370a0823111610069578063a9059cbb1161004e578063a9059cbb14610173578063d0e30db014610193578063dd62ed3e1461019b57610096565b806370a08231146101405780639eda069f1461016057610096565b8063095ea7b31461009b57806327e235e3146100d15780632e1a7d4d146100fe57806355b3f96614610120575b600080fd5b3480156100a757600080fd5b506100bb6100b6366004610703565b6101bb565b6040516100c89190610806565b60405180910390f35b3480156100dd57600080fd5b506100f16100ec3660046106b4565b610239565b6040516100c891906108d9565b34801561010a57600080fd5b5061011e610119366004610797565b61024b565b005b34801561012c57600080fd5b5061011e61013b36600461072d565b610323565b34801561014c57600080fd5b506100f161015b3660046106b4565b610334565b61011e61016e3660046106b4565b61035c565b34801561017f57600080fd5b506100bb61018e366004610703565b610385565b61011e6103cf565b3480156101a757600080fd5b506100f16101b63660046106cf565b61047d565b6040517f36c8c27d00000000000000000000000000000000000000000000000000000000815260009033906336c8c27d906101fc90869086906004016107e0565b600060405180830381600087803b15801561021657600080fd5b505af115801561022a573d6000803e3d6000fd5b50505050600190505b92915050565b60006020819052908152604090205481565b610253610485565b33600090815260208190526040902054610273908263ffffffff6104e316565b33600081815260208190526040808220939093559151909183156108fc02918491818181858888f193505050501580156102b1573d6000803e3d6000fd5b506040517f426db9cd000000000000000000000000000000000000000000000000000000008152339063426db9cd906102ee9084906004016108d9565b600060405180830381600087803b15801561030857600080fd5b505af115801561031c573d6000803e3d6000fd5b5050505050565b61032f600183836105d7565b505050565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b73ffffffffffffffffffffffffffffffffffffffff166000908152602081905260409020349055565b600061038f610485565b6040517f39dd7d0900000000000000000000000000000000000000000000000000000000815233906339dd7d09906101fc908390879087906004016107af565b6103d7610485565b336000908152602081905260409020546103f7903463ffffffff61050716565b3360008181526020819052604090819020805490930190925590517f866711080000000000000000000000000000000000000000000000000000000081526386671108906104499034906004016108d9565b600060405180830381600087803b15801561046357600080fd5b505af1158015610477573d6000803e3d6000fd5b50505050565b600092915050565b60018054600181600116156101000203166002900490506000146104e15760016040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104d89190610833565b60405180910390fd5b565b600082821115610501576105016104fc6002858561052a565b6105cf565b50900390565b600082820183811015610523576105236104fc6000868661052a565b9392505050565b606063e946c1bb60e01b84848460405160240161054993929190610811565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290509392505050565b805160208201fd5b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10610636578280017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00823516178555610663565b82800160010185558215610663579182015b82811115610663578235825591602001919060010190610648565b5061066f929150610673565b5090565b61068d91905b8082111561066f5760008155600101610679565b90565b803573ffffffffffffffffffffffffffffffffffffffff8116811461023357600080fd5b6000602082840312156106c5578081fd5b6105238383610690565b600080604083850312156106e1578081fd5b6106eb8484610690565b91506106fa8460208501610690565b90509250929050565b60008060408385031215610715578182fd5b61071f8484610690565b946020939093013593505050565b6000806020838503121561073f578182fd5b823567ffffffffffffffff80821115610756578384fd5b81850186601f820112610767578485fd5b8035925081831115610777578485fd5b866020848301011115610788578485fd5b60200196919550909350505050565b6000602082840312156107a8578081fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b901515815260200190565b606081016004851061081f57fe5b938152602081019290925260409091015290565b6000602082016020835281845460018116600081146108595760018114610895576108ce565b607f600283041684527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00821660408701526060860192506108ce565b6002820480855287865260208620865b828110156108c4578154898201604001526001909101906020016108a5565b8801604001945050505b509095945050505050565b9081526020019056fea365627a7a72315820884899638cab7c627a65c21e187baf38580e0c07cf66e6a72183d13f8a55b5ea6c6578706572696d656e74616cf564736f6c63430005110040608060405234801561001057600080fd5b506040516107d63803806107d683398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610082565b600060208284031215610065578081fd5b81516001600160a01b038116811461007b578182fd5b9392505050565b610745806100916000396000f3fe6080604052600436106100655760003560e01c80639d76ea58116100435780639d76ea58146100d7578063ad65d76d146100ec578063f552d91b146100ff57610065565b8063152678721461006a578063847343751461007f57806395e3c50b146100aa575b600080fd5b61007d610078366004610471565b61011f565b005b34801561008b57600080fd5b50610094610130565b6040516100a191906105af565b60405180910390f35b3480156100b657600080fd5b506100ca6100c536600461052b565b61014d565b6040516100a19190610676565b3480156100e357600080fd5b50610094610202565b6100ca6100fa3660046104db565b61021e565b34801561010b57600080fd5b506100ca61011a366004610556565b6102a4565b61012b60018383610391565b505050565b60005473ffffffffffffffffffffffffffffffffffffffff165b90565b6040517f301ddf03000000000000000000000000000000000000000000000000000000008152600090339063301ddf0390610190908790879087906004016106ab565b600060405180830381600087803b1580156101aa57600080fd5b505af11580156101be573d6000803e3d6000fd5b505050506101ca610333565b6040514790339082156108fc029083906000818181858888f193505050501580156101f9573d6000803e3d6000fd5b50949350505050565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b6040517fd59641f2000000000000000000000000000000000000000000000000000000008152600090339063d59641f2906102619087908790879060040161067f565b600060405180830381600087803b15801561027b57600080fd5b505af115801561028f573d6000803e3d6000fd5b5050505061029b610333565b50479392505050565b6040517f48d134a000000000000000000000000000000000000000000000000000000000815260009033906348d134a0906102ed908a908a908a908a908a908a906004016106c1565b600060405180830381600087803b15801561030757600080fd5b505af115801561031b573d6000803e3d6000fd5b50505050610327610333565b50479695505050505050565b600180546001816001161561010002031660029004905060001461038f5760016040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161038691906105d0565b60405180910390fd5b565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106103f0578280017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082351617855561041d565b8280016001018555821561041d579182015b8281111561041d578235825591602001919060010190610402565b5061042992915061042d565b5090565b61014a91905b808211156104295760008155600101610433565b803573ffffffffffffffffffffffffffffffffffffffff8116811461046b57600080fd5b92915050565b60008060208385031215610483578182fd5b823567ffffffffffffffff8082111561049a578384fd5b81850186601f8201126104ab578485fd5b80359250818311156104bb578485fd5b8660208483010111156104cc578485fd5b60200196919550909350505050565b6000806000606084860312156104ef578081fd5b8335925060208401359150604084013573ffffffffffffffffffffffffffffffffffffffff81168114610520578182fd5b809150509250925092565b60008060006060848603121561053f578283fd5b505081359360208301359350604090920135919050565b60008060008060008060c0878903121561056e578182fd5b863595506020870135945060408701359350606087013592506105948860808901610447565b91506105a38860a08901610447565b90509295509295509295565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b6000602082016020835281845460018116600081146105f657600181146106325761066b565b607f600283041684527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008216604087015260608601925061066b565b6002820480855287865260208620865b8281101561066157815489820160400152600190910190602001610642565b8801604001945050505b509095945050505050565b90815260200190565b928352602083019190915273ffffffffffffffffffffffffffffffffffffffff16604082015260600190565b9283526020830191909152604082015260600190565b95865260208601949094526040850192909252606084015273ffffffffffffffffffffffffffffffffffffffff90811660808401521660a082015260c0019056fea365627a7a723158203e03ed5d1094ca6b39c52afb7a8735fbd55cdc80253a6a33cb7beabd86949a946c6578706572696d656e74616cf564736f6c63430005110040a365627a7a72315820d3da846b2b311892d61fd883f1d823c40c39463d0812426771bb925a009127a86c6578706572696d656e74616cf564736f6c63430005110040608060405234801561001057600080fd5b50610925806100206000396000f3fe6080604052600436106100965760003560e01c806370a0823111610069578063a9059cbb1161004e578063a9059cbb14610173578063d0e30db014610193578063dd62ed3e1461019b57610096565b806370a08231146101405780639eda069f1461016057610096565b8063095ea7b31461009b57806327e235e3146100d15780632e1a7d4d146100fe57806355b3f96614610120575b600080fd5b3480156100a757600080fd5b506100bb6100b6366004610703565b6101bb565b6040516100c89190610806565b60405180910390f35b3480156100dd57600080fd5b506100f16100ec3660046106b4565b610239565b6040516100c891906108d9565b34801561010a57600080fd5b5061011e610119366004610797565b61024b565b005b34801561012c57600080fd5b5061011e61013b36600461072d565b610323565b34801561014c57600080fd5b506100f161015b3660046106b4565b610334565b61011e61016e3660046106b4565b61035c565b34801561017f57600080fd5b506100bb61018e366004610703565b610385565b61011e6103cf565b3480156101a757600080fd5b506100f16101b63660046106cf565b61047d565b6040517f36c8c27d00000000000000000000000000000000000000000000000000000000815260009033906336c8c27d906101fc90869086906004016107e0565b600060405180830381600087803b15801561021657600080fd5b505af115801561022a573d6000803e3d6000fd5b50505050600190505b92915050565b60006020819052908152604090205481565b610253610485565b33600090815260208190526040902054610273908263ffffffff6104e316565b33600081815260208190526040808220939093559151909183156108fc02918491818181858888f193505050501580156102b1573d6000803e3d6000fd5b506040517f426db9cd000000000000000000000000000000000000000000000000000000008152339063426db9cd906102ee9084906004016108d9565b600060405180830381600087803b15801561030857600080fd5b505af115801561031c573d6000803e3d6000fd5b5050505050565b61032f600183836105d7565b505050565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b73ffffffffffffffffffffffffffffffffffffffff166000908152602081905260409020349055565b600061038f610485565b6040517f39dd7d0900000000000000000000000000000000000000000000000000000000815233906339dd7d09906101fc908390879087906004016107af565b6103d7610485565b336000908152602081905260409020546103f7903463ffffffff61050716565b3360008181526020819052604090819020805490930190925590517f866711080000000000000000000000000000000000000000000000000000000081526386671108906104499034906004016108d9565b600060405180830381600087803b15801561046357600080fd5b505af1158015610477573d6000803e3d6000fd5b50505050565b600092915050565b60018054600181600116156101000203166002900490506000146104e15760016040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104d89190610833565b60405180910390fd5b565b600082821115610501576105016104fc6002858561052a565b6105cf565b50900390565b600082820183811015610523576105236104fc6000868661052a565b9392505050565b606063e946c1bb60e01b84848460405160240161054993929190610811565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290509392505050565b805160208201fd5b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10610636578280017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00823516178555610663565b82800160010185558215610663579182015b82811115610663578235825591602001919060010190610648565b5061066f929150610673565b5090565b61068d91905b8082111561066f5760008155600101610679565b90565b803573ffffffffffffffffffffffffffffffffffffffff8116811461023357600080fd5b6000602082840312156106c5578081fd5b6105238383610690565b600080604083850312156106e1578081fd5b6106eb8484610690565b91506106fa8460208501610690565b90509250929050565b60008060408385031215610715578182fd5b61071f8484610690565b946020939093013593505050565b6000806020838503121561073f578182fd5b823567ffffffffffffffff80821115610756578384fd5b81850186601f820112610767578485fd5b8035925081831115610777578485fd5b866020848301011115610788578485fd5b60200196919550909350505050565b6000602082840312156107a8578081fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b901515815260200190565b606081016004851061081f57fe5b938152602081019290925260409091015290565b6000602082016020835281845460018116600081146108595760018114610895576108ce565b607f600283041684527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00821660408701526060860192506108ce565b6002820480855287865260208620865b828110156108c4578154898201604001526001909101906020016108a5565b8801604001945050505b509095945050505050565b9081526020019056fea365627a7a72315820884899638cab7c627a65c21e187baf38580e0c07cf66e6a72183d13f8a55b5ea6c6578706572696d656e74616cf564736f6c63430005110040",
                "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH2 0x1D SWAP1 PUSH2 0x76 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 PUSH1 0x0 CREATE DUP1 ISZERO DUP1 ISZERO PUSH2 0x39 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP2 DUP3 AND OR DUP1 DUP4 SSTORE SWAP1 SWAP3 AND DUP1 DUP3 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 SWAP2 KECCAK256 DUP1 SLOAD SWAP1 SWAP3 AND OR SWAP1 SSTORE PUSH2 0x83 JUMP JUMPDEST PUSH2 0x945 DUP1 PUSH2 0x2B34 DUP4 CODECOPY ADD SWAP1 JUMP JUMPDEST PUSH2 0x2AA2 DUP1 PUSH2 0x92 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 0x48D134A0 GT PUSH2 0x7F JUMPI DUP1 PUSH4 0xC2DF82E6 GT PUSH2 0x59 JUMPI DUP1 PUSH4 0xC2DF82E6 EQ PUSH2 0x22A JUMPI DUP1 PUSH4 0xC60B5BD2 EQ PUSH2 0x24A JUMPI DUP1 PUSH4 0xD2A10DC5 EQ PUSH2 0x26B JUMPI DUP1 PUSH4 0xD59641F2 EQ PUSH2 0x28B JUMPI PUSH2 0xDD JUMP JUMPDEST DUP1 PUSH4 0x48D134A0 EQ PUSH2 0x1D5 JUMPI DUP1 PUSH4 0x4B57B0BE EQ PUSH2 0x1F5 JUMPI DUP1 PUSH4 0x86671108 EQ PUSH2 0x20A JUMPI PUSH2 0xDD JUMP JUMPDEST DUP1 PUSH4 0x36C8C27D GT PUSH2 0xBB JUMPI DUP1 PUSH4 0x36C8C27D EQ PUSH2 0x162 JUMPI DUP1 PUSH4 0x3974D3B1 EQ PUSH2 0x182 JUMPI DUP1 PUSH4 0x39DD7D09 EQ PUSH2 0x195 JUMPI DUP1 PUSH4 0x426DB9CD EQ PUSH2 0x1B5 JUMPI PUSH2 0xDD JUMP JUMPDEST DUP1 PUSH4 0x6F2BF62 EQ PUSH2 0xDF JUMPI DUP1 PUSH4 0x1626BA7E EQ PUSH2 0x115 JUMPI DUP1 PUSH4 0x301DDF03 EQ PUSH2 0x142 JUMPI JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xEB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xFF PUSH2 0xFA CALLDATASIZE PUSH1 0x4 PUSH2 0x132A JUMP JUMPDEST PUSH2 0x2AB JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x10C SWAP2 SWAP1 PUSH2 0x161D JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x121 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x135 PUSH2 0x130 CALLDATASIZE PUSH1 0x4 PUSH2 0x14C3 JUMP JUMPDEST PUSH2 0x2D6 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x10C SWAP2 SWAP1 PUSH2 0x17C0 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x14E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDD PUSH2 0x15D CALLDATASIZE PUSH1 0x4 PUSH2 0x155C JUMP JUMPDEST PUSH2 0x2FE JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x16E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDD PUSH2 0x17D CALLDATASIZE PUSH1 0x4 PUSH2 0x1478 JUMP JUMPDEST PUSH2 0x340 JUMP JUMPDEST PUSH2 0xDD PUSH2 0x190 CALLDATASIZE PUSH1 0x4 PUSH2 0x132A JUMP JUMPDEST PUSH2 0x37D JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1A1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDD PUSH2 0x1B0 CALLDATASIZE PUSH1 0x4 PUSH2 0x13E5 JUMP JUMPDEST PUSH2 0x412 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1C1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDD PUSH2 0x1D0 CALLDATASIZE PUSH1 0x4 PUSH2 0x14F4 JUMP JUMPDEST PUSH2 0x447 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1E1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDD PUSH2 0x1F0 CALLDATASIZE PUSH1 0x4 PUSH2 0x1587 JUMP JUMPDEST PUSH2 0x481 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x201 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xFF PUSH2 0x4CC JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x216 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDD PUSH2 0x225 CALLDATASIZE PUSH1 0x4 PUSH2 0x14F4 JUMP JUMPDEST PUSH2 0x4E8 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x236 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x135 PUSH2 0x245 CALLDATASIZE PUSH1 0x4 PUSH2 0x1362 JUMP JUMPDEST PUSH2 0x517 JUMP JUMPDEST PUSH2 0x25D PUSH2 0x258 CALLDATASIZE PUSH1 0x4 PUSH2 0x1425 JUMP JUMPDEST PUSH2 0xAFA JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x10C SWAP3 SWAP2 SWAP1 PUSH2 0x172C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x277 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDD PUSH2 0x286 CALLDATASIZE PUSH1 0x4 PUSH2 0x1425 JUMP JUMPDEST PUSH2 0xCBE JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x297 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDD PUSH2 0x2A6 CALLDATASIZE PUSH1 0x4 PUSH2 0x1524 JUMP JUMPDEST PUSH2 0xD5F JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST PUSH32 0xB067138100000000000000000000000000000000000000000000000000000000 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH32 0xD04CB125770091752F21A6C6819DB3391781D9FC697613B307BB5136E13D4F34 CALLER DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH2 0x333 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x16AD JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP POP JUMP JUMPDEST PUSH32 0x54B41D7666B1BDED95F272024889AC00D41CB183D6444DDE7C15DFEC6BD32FD8 DUP3 DUP3 PUSH1 0x40 MLOAD PUSH2 0x371 SWAP3 SWAP2 SWAP1 PUSH2 0x179A JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 SLOAD DUP2 MLOAD PUSH32 0xD0E30DB000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE SWAP2 MLOAD SWAP4 AND SWAP3 DUP4 SWAP3 PUSH4 0xD0E30DB0 SWAP3 CALLVALUE SWAP3 PUSH1 0x4 DUP1 DUP4 ADD SWAP4 SWAP3 DUP3 SWAP1 SUB ADD DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3F5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x409 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST PUSH32 0xAE33CB06D7303F889D953BB09540983050163C1C4C98B330DB432A911CFB63FD CALLER DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH2 0x333 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x163E JUMP JUMPDEST PUSH32 0xA31300B5A9E5C5ACE6706C4A93516EEB66365BBD1051ECE1A3C0339512B2435D DUP2 PUSH1 0x40 MLOAD PUSH2 0x476 SWAP2 SWAP1 PUSH2 0x1893 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP JUMP JUMPDEST PUSH32 0x1C1A2D4F99027059A394B97E18F3CF047A7363768A6A873C9CFF883EA4358645 CALLER DUP8 DUP8 DUP8 DUP8 DUP8 DUP8 PUSH1 0x40 MLOAD PUSH2 0x4BC SWAP8 SWAP7 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x16E0 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH32 0xD5B3768A34B8338255D3DE13FFCE5A4BBC441AA6A62544EB3E8B80E7B50A7738 DUP2 PUSH1 0x40 MLOAD PUSH2 0x476 SWAP2 SWAP1 PUSH2 0x1893 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x521 PUSH2 0x1275 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x52F DUP5 DUP7 ADD DUP7 PUSH2 0x132A JUMP JUMPDEST SWAP1 POP DUP9 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x59B JUMPI PUSH2 0x570 DUP2 DUP9 DUP9 PUSH2 0xD94 JUMP JUMPDEST POP PUSH32 0xDC1600F300000000000000000000000000000000000000000000000000000000 SWAP2 POP PUSH2 0xAF0 SWAP1 POP JUMP JUMPDEST PUSH2 0x5A5 DUP2 DUP11 PUSH2 0xE5B JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND DUP4 MSTORE PUSH1 0x40 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE SWAP1 DUP3 AND SWAP1 PUSH4 0x70A08231 SWAP1 PUSH2 0x5FD SWAP1 ADDRESS SWAP1 PUSH1 0x4 ADD PUSH2 0x161D JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x615 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x629 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 0x64D SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x150C JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE PUSH2 0x65A PUSH2 0xF8B JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND PUSH1 0x40 DUP5 ADD DUP2 SWAP1 MSTORE SWAP1 DUP3 AND EQ ISZERO PUSH2 0x7B0 JUMPI DUP2 PUSH1 0x40 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x2E1A7D4D DUP4 PUSH1 0x20 ADD MLOAD PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x6C3 SWAP2 SWAP1 PUSH2 0x1893 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x6DD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x6F1 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP DUP4 MLOAD PUSH1 0x20 DUP6 ADD MLOAD PUSH1 0x40 MLOAD PUSH32 0xAD65D76D00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND SWAP4 POP PUSH4 0xAD65D76D SWAP3 POP SWAP1 PUSH2 0x754 SWAP1 DUP11 SWAP1 TIMESTAMP SWAP1 DUP14 SWAP1 PUSH1 0x4 ADD PUSH2 0x189C JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x76D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x781 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 0x7A6 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x150C JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE PUSH2 0xA81 JUMP JUMPDEST DUP2 PUSH1 0x40 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP10 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x9CA JUMPI PUSH2 0x7FB DUP3 PUSH1 0x0 ADD MLOAD DUP3 DUP5 PUSH1 0x20 ADD MLOAD PUSH2 0xFA7 JUMP JUMPDEST DUP2 MLOAD PUSH1 0x20 DUP4 ADD MLOAD PUSH1 0x40 MLOAD PUSH32 0x95E3C50B00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND SWAP2 PUSH4 0x95E3C50B SWAP2 PUSH2 0x857 SWAP2 DUP11 SWAP1 TIMESTAMP SWAP1 PUSH1 0x4 ADD PUSH2 0x1909 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x871 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x885 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 0x8A9 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x150C JUMP JUMPDEST DUP3 PUSH1 0x60 ADD DUP2 DUP2 MSTORE POP POP DUP2 PUSH1 0x40 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xD0E30DB0 DUP4 PUSH1 0x60 ADD MLOAD 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 0x902 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x916 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP PUSH1 0x60 DUP5 ADD MLOAD PUSH1 0x40 MLOAD PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP14 AND SWAP4 POP PUSH4 0xA9059CBB SWAP3 POP PUSH2 0x972 SWAP2 DUP12 SWAP2 PUSH1 0x4 ADD PUSH2 0x179A JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x98C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x9A0 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 0x9C4 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x14A3 JUMP JUMPDEST POP PUSH2 0xA81 JUMP JUMPDEST PUSH2 0x9DD DUP3 PUSH1 0x0 ADD MLOAD DUP3 DUP5 PUSH1 0x20 ADD MLOAD PUSH2 0xFA7 JUMP JUMPDEST DUP2 PUSH1 0x0 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xF552D91B DUP4 PUSH1 0x20 ADD MLOAD DUP9 PUSH1 0x1 TIMESTAMP DUP13 DUP16 PUSH1 0x40 MLOAD DUP8 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xA29 SWAP7 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x18C8 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xA43 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xA57 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 0xA7B SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x150C JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE JUMPDEST PUSH32 0x349FC08071558D8E3AA92DEC9396E4E9F2DFECD6BB9065759D1932E7DA43B8A9 DUP2 DUP11 DUP5 PUSH1 0x20 ADD MLOAD DUP6 PUSH1 0x60 ADD MLOAD DUP13 DUP13 PUSH1 0x40 MLOAD PUSH2 0xAC2 SWAP7 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x1753 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP PUSH32 0xDC1600F300000000000000000000000000000000000000000000000000000000 SWAP2 POP POP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST DUP3 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH2 0xB44 JUMPI PUSH1 0x40 MLOAD PUSH2 0xB24 SWAP1 PUSH2 0x12C9 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 PUSH1 0x0 CREATE DUP1 ISZERO DUP1 ISZERO PUSH2 0xB40 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP SWAP2 POP JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP3 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP1 SWAP5 OR SWAP1 SWAP4 SSTORE PUSH1 0x2 SWAP1 MSTORE KECCAK256 SLOAD AND DUP1 PUSH2 0xC2E JUMPI DUP2 PUSH1 0x40 MLOAD PUSH2 0xBB1 SWAP1 PUSH2 0x12D6 JUMP JUMPDEST PUSH2 0xBBB SWAP2 SWAP1 PUSH2 0x161D JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 PUSH1 0x0 CREATE DUP1 ISZERO DUP1 ISZERO PUSH2 0xBD7 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP2 DUP4 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE SWAP1 POP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x1526787200000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP1 PUSH4 0x15267872 SWAP1 CALLVALUE SWAP1 PUSH2 0xC84 SWAP1 DUP9 SWAP1 DUP9 SWAP1 PUSH1 0x4 ADD PUSH2 0x180F JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xC9D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xCB1 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 SLOAD SWAP1 MLOAD PUSH32 0x55B3F96600000000000000000000000000000000000000000000000000000000 DUP2 MSTORE SWAP2 AND SWAP1 DUP2 SWAP1 PUSH4 0x55B3F966 SWAP1 PUSH2 0xD27 SWAP1 DUP7 SWAP1 DUP7 SWAP1 PUSH1 0x4 ADD PUSH2 0x180F JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xD41 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xD55 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH32 0xC9BE139B48C2029C766F0907FAEE476F9303FB99BC9ED028959537B81756F666 CALLER DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH2 0x333 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x1675 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x60 SWAP1 PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 SWAP1 PUSH2 0xDCC SWAP1 DUP6 SWAP1 DUP6 SWAP1 PUSH1 0x24 ADD PUSH2 0x179A 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 0xE55 DUP5 DUP3 PUSH2 0xFB7 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0xE66 PUSH2 0xF8B JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0xE9C JUMPI POP DUP2 JUMPDEST PUSH2 0xEA4 PUSH2 0x1073 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x6F2BF62 DUP3 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xEDC SWAP2 SWAP1 PUSH2 0x161D JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xEF4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xF08 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 0xF2C SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x1346 JUMP JUMPDEST SWAP2 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH2 0xF84 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF7B SWAP1 PUSH2 0x185C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH2 0xFB2 DUP3 DUP5 DUP4 PUSH2 0x1077 JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH1 0x40 MLOAD PUSH2 0xFE0 SWAP2 SWAP1 PUSH2 0x15E4 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 0x101D 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 0x1022 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 ISZERO PUSH2 0x1066 JUMPI DUP1 MLOAD PUSH2 0x103A JUMPI POP POP PUSH2 0x106F JUMP JUMPDEST DUP1 MLOAD PUSH1 0x20 EQ ISZERO PUSH2 0x1066 JUMPI PUSH1 0x0 PUSH2 0x1051 DUP3 PUSH1 0x0 PUSH2 0x114E JUMP JUMPDEST SWAP1 POP DUP1 PUSH1 0x1 EQ ISZERO PUSH2 0x1064 JUMPI POP POP POP PUSH2 0x106F JUMP JUMPDEST POP JUMPDEST PUSH2 0xE55 DUP2 PUSH2 0x1161 JUMP JUMPDEST POP POP JUMP JUMPDEST ADDRESS SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xDD62ED3E00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE DUP2 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND SWAP1 PUSH4 0xDD62ED3E SWAP1 PUSH2 0x10CD SWAP1 ADDRESS SWAP1 DUP8 SWAP1 PUSH1 0x4 ADD PUSH2 0x172C JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x10E5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x10F9 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 0x111D SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x150C JUMP JUMPDEST LT ISZERO PUSH2 0xFB2 JUMPI PUSH2 0xFB2 DUP4 DUP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x1169 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x115A DUP4 DUP4 PUSH2 0x11A1 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP1 MLOAD PUSH1 0x20 DUP3 ADD REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x60 SWAP1 PUSH32 0x95EA7B300000000000000000000000000000000000000000000000000000000 SWAP1 PUSH2 0xDCC SWAP1 DUP6 SWAP1 DUP6 SWAP1 PUSH1 0x24 ADD PUSH2 0x179A JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x20 ADD DUP4 MLOAD LT ISZERO PUSH2 0x11C7 JUMPI PUSH2 0x11C7 PUSH2 0x11C2 PUSH1 0x5 DUP6 MLOAD DUP6 PUSH1 0x20 ADD PUSH2 0x11D0 JUMP JUMPDEST PUSH2 0x1161 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 0x11EF SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x17ED 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 PUSH1 0x40 MLOAD DUP1 PUSH1 0x80 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH2 0x945 DUP1 PUSH2 0x1945 DUP4 CODECOPY ADD SWAP1 JUMP JUMPDEST PUSH2 0x7D6 DUP1 PUSH2 0x228A DUP4 CODECOPY ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x12F4 JUMPI DUP2 DUP3 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x130B JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x1323 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x133B JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x115A DUP2 PUSH2 0x191F JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1357 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x115A DUP2 PUSH2 0x191F JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xA0 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x137A JUMPI DUP2 DUP3 REVERT JUMPDEST DUP7 CALLDATALOAD PUSH2 0x1385 DUP2 PUSH2 0x191F JUMP JUMPDEST SWAP6 POP PUSH1 0x20 DUP8 ADD CALLDATALOAD PUSH2 0x1395 DUP2 PUSH2 0x191F JUMP JUMPDEST SWAP5 POP PUSH1 0x40 DUP8 ADD CALLDATALOAD PUSH2 0x13A5 DUP2 PUSH2 0x191F JUMP JUMPDEST SWAP4 POP PUSH1 0x60 DUP8 ADD CALLDATALOAD SWAP3 POP PUSH1 0x80 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x13C7 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0x13D3 DUP10 DUP3 DUP11 ADD PUSH2 0x12E3 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 0x13F9 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x1404 DUP2 PUSH2 0x191F JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x1414 DUP2 PUSH2 0x191F JUMP JUMPDEST SWAP3 SWAP6 SWAP3 SWAP5 POP POP POP PUSH1 0x40 SWAP2 SWAP1 SWAP2 ADD CALLDATALOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x40 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x1439 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x1444 DUP2 PUSH2 0x191F JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x145F JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0x146B DUP7 DUP3 DUP8 ADD PUSH2 0x12E3 JUMP JUMPDEST SWAP5 SWAP8 SWAP1 SWAP7 POP SWAP4 SWAP5 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x148A JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x1495 DUP2 PUSH2 0x191F 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 0x14B4 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x115A JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x40 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x14D7 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 CALLDATALOAD SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x145F JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1505 JUMPI DUP1 DUP2 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x151D JUMPI DUP1 DUP2 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x1538 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 CALLDATALOAD SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD SWAP2 POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH2 0x1551 DUP2 PUSH2 0x191F JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x1570 JUMPI DUP3 DUP4 REVERT JUMPDEST POP POP DUP2 CALLDATALOAD SWAP4 PUSH1 0x20 DUP4 ADD CALLDATALOAD SWAP4 POP PUSH1 0x40 SWAP1 SWAP3 ADD CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xC0 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x159F JUMPI DUP4 DUP5 REVERT JUMPDEST DUP7 CALLDATALOAD SWAP6 POP PUSH1 0x20 DUP8 ADD CALLDATALOAD SWAP5 POP PUSH1 0x40 DUP8 ADD CALLDATALOAD SWAP4 POP PUSH1 0x60 DUP8 ADD CALLDATALOAD SWAP3 POP PUSH1 0x80 DUP8 ADD CALLDATALOAD PUSH2 0x15C6 DUP2 PUSH2 0x191F JUMP JUMPDEST SWAP2 POP PUSH1 0xA0 DUP8 ADD CALLDATALOAD PUSH2 0x15D6 DUP2 PUSH2 0x191F JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 POP SWAP3 SWAP6 JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD DUP2 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x1604 JUMPI PUSH1 0x20 DUP2 DUP7 ADD DUP2 ADD MLOAD DUP6 DUP4 ADD MSTORE ADD PUSH2 0x15EA JUMP JUMPDEST DUP2 DUP2 GT ISZERO PUSH2 0x1612 JUMPI DUP3 DUP3 DUP6 ADD MSTORE JUMPDEST POP 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 SWAP5 DUP6 AND DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x40 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 SWAP2 AND PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP8 DUP9 AND DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP7 SWAP1 SWAP7 MSTORE PUSH1 0x40 DUP7 ADD SWAP5 SWAP1 SWAP5 MSTORE PUSH1 0x60 DUP6 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x80 DUP5 ADD MSTORE DUP4 AND PUSH1 0xA0 DUP4 ADD MSTORE SWAP1 SWAP2 AND PUSH1 0xC0 DUP3 ADD MSTORE PUSH1 0xE0 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 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 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 0x17FB JUMPI INVALID JUMPDEST SWAP4 DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x40 SWAP1 SWAP2 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE DUP3 PUSH1 0x20 DUP4 ADD MSTORE DUP3 DUP5 PUSH1 0x40 DUP5 ADD CALLDATACOPY DUP2 DUP4 ADD PUSH1 0x40 SWAP1 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x1F SWAP1 SWAP3 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND ADD ADD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1D SWAP1 DUP3 ADD MSTORE PUSH32 0x4E4F5F554E49535741505F45584348414E47455F464F525F544F4B454E000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST SWAP6 DUP7 MSTORE PUSH1 0x20 DUP7 ADD SWAP5 SWAP1 SWAP5 MSTORE PUSH1 0x40 DUP6 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x60 DUP5 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND PUSH1 0x80 DUP5 ADD MSTORE AND PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xC0 ADD SWAP1 JUMP JUMPDEST SWAP3 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x1941 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 PUSH2 0x925 DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x96 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x70A08231 GT PUSH2 0x69 JUMPI DUP1 PUSH4 0xA9059CBB GT PUSH2 0x4E JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x173 JUMPI DUP1 PUSH4 0xD0E30DB0 EQ PUSH2 0x193 JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x19B JUMPI PUSH2 0x96 JUMP JUMPDEST DUP1 PUSH4 0x70A08231 EQ PUSH2 0x140 JUMPI DUP1 PUSH4 0x9EDA069F EQ PUSH2 0x160 JUMPI PUSH2 0x96 JUMP JUMPDEST DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x9B JUMPI DUP1 PUSH4 0x27E235E3 EQ PUSH2 0xD1 JUMPI DUP1 PUSH4 0x2E1A7D4D EQ PUSH2 0xFE JUMPI DUP1 PUSH4 0x55B3F966 EQ PUSH2 0x120 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xA7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xBB PUSH2 0xB6 CALLDATASIZE PUSH1 0x4 PUSH2 0x703 JUMP JUMPDEST PUSH2 0x1BB JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xC8 SWAP2 SWAP1 PUSH2 0x806 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xDD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xF1 PUSH2 0xEC CALLDATASIZE PUSH1 0x4 PUSH2 0x6B4 JUMP JUMPDEST PUSH2 0x239 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xC8 SWAP2 SWAP1 PUSH2 0x8D9 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x10A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x11E PUSH2 0x119 CALLDATASIZE PUSH1 0x4 PUSH2 0x797 JUMP JUMPDEST PUSH2 0x24B JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x12C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x11E PUSH2 0x13B CALLDATASIZE PUSH1 0x4 PUSH2 0x72D JUMP JUMPDEST PUSH2 0x323 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x14C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xF1 PUSH2 0x15B CALLDATASIZE PUSH1 0x4 PUSH2 0x6B4 JUMP JUMPDEST PUSH2 0x334 JUMP JUMPDEST PUSH2 0x11E PUSH2 0x16E CALLDATASIZE PUSH1 0x4 PUSH2 0x6B4 JUMP JUMPDEST PUSH2 0x35C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x17F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xBB PUSH2 0x18E CALLDATASIZE PUSH1 0x4 PUSH2 0x703 JUMP JUMPDEST PUSH2 0x385 JUMP JUMPDEST PUSH2 0x11E PUSH2 0x3CF JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1A7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xF1 PUSH2 0x1B6 CALLDATASIZE PUSH1 0x4 PUSH2 0x6CF JUMP JUMPDEST PUSH2 0x47D JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x36C8C27D00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x0 SWAP1 CALLER SWAP1 PUSH4 0x36C8C27D SWAP1 PUSH2 0x1FC SWAP1 DUP7 SWAP1 DUP7 SWAP1 PUSH1 0x4 ADD PUSH2 0x7E0 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x216 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x22A JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x1 SWAP1 POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP2 SWAP1 MSTORE SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH2 0x253 PUSH2 0x485 JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH2 0x273 SWAP1 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x4E3 AND JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE SWAP2 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 0x2B1 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH32 0x426DB9CD00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE CALLER SWAP1 PUSH4 0x426DB9CD SWAP1 PUSH2 0x2EE SWAP1 DUP5 SWAP1 PUSH1 0x4 ADD PUSH2 0x8D9 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x308 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x31C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH2 0x32F PUSH1 0x1 DUP4 DUP4 PUSH2 0x5D7 JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 CALLVALUE SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 PUSH2 0x38F PUSH2 0x485 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x39DD7D0900000000000000000000000000000000000000000000000000000000 DUP2 MSTORE CALLER SWAP1 PUSH4 0x39DD7D09 SWAP1 PUSH2 0x1FC SWAP1 DUP4 SWAP1 DUP8 SWAP1 DUP8 SWAP1 PUSH1 0x4 ADD PUSH2 0x7AF JUMP JUMPDEST PUSH2 0x3D7 PUSH2 0x485 JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH2 0x3F7 SWAP1 CALLVALUE PUSH4 0xFFFFFFFF PUSH2 0x507 AND JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD SWAP1 SWAP4 ADD SWAP1 SWAP3 SSTORE SWAP1 MLOAD PUSH32 0x8667110800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH4 0x86671108 SWAP1 PUSH2 0x449 SWAP1 CALLVALUE SWAP1 PUSH1 0x4 ADD PUSH2 0x8D9 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x463 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x477 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x1 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 POP PUSH1 0x0 EQ PUSH2 0x4E1 JUMPI PUSH1 0x1 PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x4D8 SWAP2 SWAP1 PUSH2 0x833 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x501 JUMPI PUSH2 0x501 PUSH2 0x4FC PUSH1 0x2 DUP6 DUP6 PUSH2 0x52A JUMP JUMPDEST PUSH2 0x5CF JUMP JUMPDEST POP SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x523 JUMPI PUSH2 0x523 PUSH2 0x4FC PUSH1 0x0 DUP7 DUP7 PUSH2 0x52A JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH4 0xE946C1BB PUSH1 0xE0 SHL DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x549 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x811 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 DUP1 MLOAD PUSH1 0x20 DUP3 ADD REVERT JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH2 0x636 JUMPI DUP3 DUP1 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 CALLDATALOAD AND OR DUP6 SSTORE PUSH2 0x663 JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH2 0x663 JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x663 JUMPI DUP3 CALLDATALOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x648 JUMP JUMPDEST POP PUSH2 0x66F SWAP3 SWAP2 POP PUSH2 0x673 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x68D SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x66F JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x679 JUMP JUMPDEST SWAP1 JUMP JUMPDEST DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x233 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x6C5 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x523 DUP4 DUP4 PUSH2 0x690 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x6E1 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x6EB DUP5 DUP5 PUSH2 0x690 JUMP JUMPDEST SWAP2 POP PUSH2 0x6FA DUP5 PUSH1 0x20 DUP6 ADD PUSH2 0x690 JUMP JUMPDEST SWAP1 POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x715 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x71F DUP5 DUP5 PUSH2 0x690 JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x20 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x73F JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x756 JUMPI DUP4 DUP5 REVERT JUMPDEST DUP2 DUP6 ADD DUP7 PUSH1 0x1F DUP3 ADD SLT PUSH2 0x767 JUMPI DUP5 DUP6 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP3 POP DUP2 DUP4 GT ISZERO PUSH2 0x777 JUMPI DUP5 DUP6 REVERT JUMPDEST DUP7 PUSH1 0x20 DUP5 DUP4 ADD ADD GT ISZERO PUSH2 0x788 JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH1 0x20 ADD SWAP7 SWAP2 SWAP6 POP SWAP1 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x7A8 JUMPI DUP1 DUP2 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP 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 PUSH1 0x60 DUP2 ADD PUSH1 0x4 DUP6 LT PUSH2 0x81F JUMPI INVALID JUMPDEST SWAP4 DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x40 SWAP1 SWAP2 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD PUSH1 0x20 DUP4 MSTORE DUP2 DUP5 SLOAD PUSH1 0x1 DUP2 AND PUSH1 0x0 DUP2 EQ PUSH2 0x859 JUMPI PUSH1 0x1 DUP2 EQ PUSH2 0x895 JUMPI PUSH2 0x8CE JUMP JUMPDEST PUSH1 0x7F PUSH1 0x2 DUP4 DIV AND DUP5 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 AND PUSH1 0x40 DUP8 ADD MSTORE PUSH1 0x60 DUP7 ADD SWAP3 POP PUSH2 0x8CE JUMP JUMPDEST PUSH1 0x2 DUP3 DIV DUP1 DUP6 MSTORE DUP8 DUP7 MSTORE PUSH1 0x20 DUP7 KECCAK256 DUP7 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x8C4 JUMPI DUP2 SLOAD DUP10 DUP3 ADD PUSH1 0x40 ADD MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD PUSH2 0x8A5 JUMP JUMPDEST DUP9 ADD PUSH1 0x40 ADD SWAP5 POP POP POP JUMPDEST POP SWAP1 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP INVALID LOG3 PUSH6 0x627A7A723158 KECCAK256 DUP9 0x48 SWAP10 PUSH4 0x8CAB7C62 PUSH27 0x65C21E187BAF38580E0C07CF66E6A72183D13F8A55B5EA6C657870 PUSH6 0x72696D656E74 PUSH2 0x6CF5 PUSH5 0x736F6C6343 STOP SDIV GT STOP BLOCKHASH PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH2 0x7D6 CODESIZE SUB DUP1 PUSH2 0x7D6 DUP4 CODECOPY DUP2 ADD PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH2 0x2F SWAP2 PUSH2 0x54 JUMP JUMPDEST 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 0x82 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x65 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x7B JUMPI DUP2 DUP3 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x745 DUP1 PUSH2 0x91 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x65 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x9D76EA58 GT PUSH2 0x43 JUMPI DUP1 PUSH4 0x9D76EA58 EQ PUSH2 0xD7 JUMPI DUP1 PUSH4 0xAD65D76D EQ PUSH2 0xEC JUMPI DUP1 PUSH4 0xF552D91B EQ PUSH2 0xFF JUMPI PUSH2 0x65 JUMP JUMPDEST DUP1 PUSH4 0x15267872 EQ PUSH2 0x6A JUMPI DUP1 PUSH4 0x84734375 EQ PUSH2 0x7F JUMPI DUP1 PUSH4 0x95E3C50B EQ PUSH2 0xAA JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x7D PUSH2 0x78 CALLDATASIZE PUSH1 0x4 PUSH2 0x471 JUMP JUMPDEST PUSH2 0x11F JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x8B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x94 PUSH2 0x130 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xA1 SWAP2 SWAP1 PUSH2 0x5AF JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xB6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xCA PUSH2 0xC5 CALLDATASIZE PUSH1 0x4 PUSH2 0x52B JUMP JUMPDEST PUSH2 0x14D JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xA1 SWAP2 SWAP1 PUSH2 0x676 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xE3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x94 PUSH2 0x202 JUMP JUMPDEST PUSH2 0xCA PUSH2 0xFA CALLDATASIZE PUSH1 0x4 PUSH2 0x4DB JUMP JUMPDEST PUSH2 0x21E JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x10B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xCA PUSH2 0x11A CALLDATASIZE PUSH1 0x4 PUSH2 0x556 JUMP JUMPDEST PUSH2 0x2A4 JUMP JUMPDEST PUSH2 0x12B PUSH1 0x1 DUP4 DUP4 PUSH2 0x391 JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x301DDF0300000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x0 SWAP1 CALLER SWAP1 PUSH4 0x301DDF03 SWAP1 PUSH2 0x190 SWAP1 DUP8 SWAP1 DUP8 SWAP1 DUP8 SWAP1 PUSH1 0x4 ADD PUSH2 0x6AB JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1AA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1BE JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH2 0x1CA PUSH2 0x333 JUMP JUMPDEST PUSH1 0x40 MLOAD SELFBALANCE SWAP1 CALLER SWAP1 DUP3 ISZERO PUSH2 0x8FC MUL SWAP1 DUP4 SWAP1 PUSH1 0x0 DUP2 DUP2 DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0x1F9 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xD59641F200000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x0 SWAP1 CALLER SWAP1 PUSH4 0xD59641F2 SWAP1 PUSH2 0x261 SWAP1 DUP8 SWAP1 DUP8 SWAP1 DUP8 SWAP1 PUSH1 0x4 ADD PUSH2 0x67F JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x27B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x28F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH2 0x29B PUSH2 0x333 JUMP JUMPDEST POP SELFBALANCE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x48D134A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x0 SWAP1 CALLER SWAP1 PUSH4 0x48D134A0 SWAP1 PUSH2 0x2ED SWAP1 DUP11 SWAP1 DUP11 SWAP1 DUP11 SWAP1 DUP11 SWAP1 DUP11 SWAP1 DUP11 SWAP1 PUSH1 0x4 ADD PUSH2 0x6C1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x307 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x31B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH2 0x327 PUSH2 0x333 JUMP JUMPDEST POP SELFBALANCE SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 POP PUSH1 0x0 EQ PUSH2 0x38F JUMPI PUSH1 0x1 PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x386 SWAP2 SWAP1 PUSH2 0x5D0 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH2 0x3F0 JUMPI DUP3 DUP1 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 CALLDATALOAD AND OR DUP6 SSTORE PUSH2 0x41D JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH2 0x41D JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x41D JUMPI DUP3 CALLDATALOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x402 JUMP JUMPDEST POP PUSH2 0x429 SWAP3 SWAP2 POP PUSH2 0x42D JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x14A SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x429 JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x433 JUMP JUMPDEST DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x46B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x20 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x483 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x49A JUMPI DUP4 DUP5 REVERT JUMPDEST DUP2 DUP6 ADD DUP7 PUSH1 0x1F DUP3 ADD SLT PUSH2 0x4AB JUMPI DUP5 DUP6 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP3 POP DUP2 DUP4 GT ISZERO PUSH2 0x4BB JUMPI DUP5 DUP6 REVERT JUMPDEST DUP7 PUSH1 0x20 DUP5 DUP4 ADD ADD GT ISZERO PUSH2 0x4CC JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH1 0x20 ADD SWAP7 SWAP2 SWAP6 POP SWAP1 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x4EF JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 CALLDATALOAD SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD SWAP2 POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x520 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x53F JUMPI DUP3 DUP4 REVERT JUMPDEST POP POP DUP2 CALLDATALOAD SWAP4 PUSH1 0x20 DUP4 ADD CALLDATALOAD SWAP4 POP PUSH1 0x40 SWAP1 SWAP3 ADD CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xC0 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x56E JUMPI DUP2 DUP3 REVERT JUMPDEST DUP7 CALLDATALOAD SWAP6 POP PUSH1 0x20 DUP8 ADD CALLDATALOAD SWAP5 POP PUSH1 0x40 DUP8 ADD CALLDATALOAD SWAP4 POP PUSH1 0x60 DUP8 ADD CALLDATALOAD SWAP3 POP PUSH2 0x594 DUP9 PUSH1 0x80 DUP10 ADD PUSH2 0x447 JUMP JUMPDEST SWAP2 POP PUSH2 0x5A3 DUP9 PUSH1 0xA0 DUP10 ADD PUSH2 0x447 JUMP JUMPDEST SWAP1 POP SWAP3 SWAP6 POP SWAP3 SWAP6 POP SWAP3 SWAP6 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD PUSH1 0x20 DUP4 MSTORE DUP2 DUP5 SLOAD PUSH1 0x1 DUP2 AND PUSH1 0x0 DUP2 EQ PUSH2 0x5F6 JUMPI PUSH1 0x1 DUP2 EQ PUSH2 0x632 JUMPI PUSH2 0x66B JUMP JUMPDEST PUSH1 0x7F PUSH1 0x2 DUP4 DIV AND DUP5 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 AND PUSH1 0x40 DUP8 ADD MSTORE PUSH1 0x60 DUP7 ADD SWAP3 POP PUSH2 0x66B JUMP JUMPDEST PUSH1 0x2 DUP3 DIV DUP1 DUP6 MSTORE DUP8 DUP7 MSTORE PUSH1 0x20 DUP7 KECCAK256 DUP7 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x661 JUMPI DUP2 SLOAD DUP10 DUP3 ADD PUSH1 0x40 ADD MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD PUSH2 0x642 JUMP JUMPDEST DUP9 ADD PUSH1 0x40 ADD SWAP5 POP POP POP JUMPDEST POP SWAP1 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST SWAP3 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST SWAP6 DUP7 MSTORE PUSH1 0x20 DUP7 ADD SWAP5 SWAP1 SWAP5 MSTORE PUSH1 0x40 DUP6 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x60 DUP5 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND PUSH1 0x80 DUP5 ADD MSTORE AND PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xC0 ADD SWAP1 JUMP INVALID LOG3 PUSH6 0x627A7A723158 KECCAK256 RETURNDATACOPY SUB 0xED 0x5D LT SWAP5 0xCA PUSH12 0x39C52AFB7A8735FBD55CDC80 0x25 GASPRICE PUSH11 0x33CB7BEABD86949A946C65 PUSH25 0x706572696D656E74616CF564736F6C63430005110040A36562 PUSH27 0x7A72315820D3DA846B2B311892D61FD883F1D823C40C39463D0812 TIMESTAMP PUSH8 0x71BB925A009127A8 PUSH13 0x6578706572696D656E74616CF5 PUSH5 0x736F6C6343 STOP SDIV GT STOP BLOCKHASH PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x925 DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x96 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x70A08231 GT PUSH2 0x69 JUMPI DUP1 PUSH4 0xA9059CBB GT PUSH2 0x4E JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x173 JUMPI DUP1 PUSH4 0xD0E30DB0 EQ PUSH2 0x193 JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x19B JUMPI PUSH2 0x96 JUMP JUMPDEST DUP1 PUSH4 0x70A08231 EQ PUSH2 0x140 JUMPI DUP1 PUSH4 0x9EDA069F EQ PUSH2 0x160 JUMPI PUSH2 0x96 JUMP JUMPDEST DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x9B JUMPI DUP1 PUSH4 0x27E235E3 EQ PUSH2 0xD1 JUMPI DUP1 PUSH4 0x2E1A7D4D EQ PUSH2 0xFE JUMPI DUP1 PUSH4 0x55B3F966 EQ PUSH2 0x120 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xA7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xBB PUSH2 0xB6 CALLDATASIZE PUSH1 0x4 PUSH2 0x703 JUMP JUMPDEST PUSH2 0x1BB JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xC8 SWAP2 SWAP1 PUSH2 0x806 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xDD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xF1 PUSH2 0xEC CALLDATASIZE PUSH1 0x4 PUSH2 0x6B4 JUMP JUMPDEST PUSH2 0x239 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xC8 SWAP2 SWAP1 PUSH2 0x8D9 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x10A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x11E PUSH2 0x119 CALLDATASIZE PUSH1 0x4 PUSH2 0x797 JUMP JUMPDEST PUSH2 0x24B JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x12C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x11E PUSH2 0x13B CALLDATASIZE PUSH1 0x4 PUSH2 0x72D JUMP JUMPDEST PUSH2 0x323 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x14C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xF1 PUSH2 0x15B CALLDATASIZE PUSH1 0x4 PUSH2 0x6B4 JUMP JUMPDEST PUSH2 0x334 JUMP JUMPDEST PUSH2 0x11E PUSH2 0x16E CALLDATASIZE PUSH1 0x4 PUSH2 0x6B4 JUMP JUMPDEST PUSH2 0x35C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x17F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xBB PUSH2 0x18E CALLDATASIZE PUSH1 0x4 PUSH2 0x703 JUMP JUMPDEST PUSH2 0x385 JUMP JUMPDEST PUSH2 0x11E PUSH2 0x3CF JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1A7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xF1 PUSH2 0x1B6 CALLDATASIZE PUSH1 0x4 PUSH2 0x6CF JUMP JUMPDEST PUSH2 0x47D JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x36C8C27D00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x0 SWAP1 CALLER SWAP1 PUSH4 0x36C8C27D SWAP1 PUSH2 0x1FC SWAP1 DUP7 SWAP1 DUP7 SWAP1 PUSH1 0x4 ADD PUSH2 0x7E0 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x216 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x22A JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x1 SWAP1 POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP2 SWAP1 MSTORE SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH2 0x253 PUSH2 0x485 JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH2 0x273 SWAP1 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x4E3 AND JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE SWAP2 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 0x2B1 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH32 0x426DB9CD00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE CALLER SWAP1 PUSH4 0x426DB9CD SWAP1 PUSH2 0x2EE SWAP1 DUP5 SWAP1 PUSH1 0x4 ADD PUSH2 0x8D9 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x308 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x31C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH2 0x32F PUSH1 0x1 DUP4 DUP4 PUSH2 0x5D7 JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 CALLVALUE SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 PUSH2 0x38F PUSH2 0x485 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x39DD7D0900000000000000000000000000000000000000000000000000000000 DUP2 MSTORE CALLER SWAP1 PUSH4 0x39DD7D09 SWAP1 PUSH2 0x1FC SWAP1 DUP4 SWAP1 DUP8 SWAP1 DUP8 SWAP1 PUSH1 0x4 ADD PUSH2 0x7AF JUMP JUMPDEST PUSH2 0x3D7 PUSH2 0x485 JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH2 0x3F7 SWAP1 CALLVALUE PUSH4 0xFFFFFFFF PUSH2 0x507 AND JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD SWAP1 SWAP4 ADD SWAP1 SWAP3 SSTORE SWAP1 MLOAD PUSH32 0x8667110800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH4 0x86671108 SWAP1 PUSH2 0x449 SWAP1 CALLVALUE SWAP1 PUSH1 0x4 ADD PUSH2 0x8D9 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x463 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x477 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x1 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 POP PUSH1 0x0 EQ PUSH2 0x4E1 JUMPI PUSH1 0x1 PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x4D8 SWAP2 SWAP1 PUSH2 0x833 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x501 JUMPI PUSH2 0x501 PUSH2 0x4FC PUSH1 0x2 DUP6 DUP6 PUSH2 0x52A JUMP JUMPDEST PUSH2 0x5CF JUMP JUMPDEST POP SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x523 JUMPI PUSH2 0x523 PUSH2 0x4FC PUSH1 0x0 DUP7 DUP7 PUSH2 0x52A JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH4 0xE946C1BB PUSH1 0xE0 SHL DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x549 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x811 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 DUP1 MLOAD PUSH1 0x20 DUP3 ADD REVERT JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH2 0x636 JUMPI DUP3 DUP1 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 CALLDATALOAD AND OR DUP6 SSTORE PUSH2 0x663 JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH2 0x663 JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x663 JUMPI DUP3 CALLDATALOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x648 JUMP JUMPDEST POP PUSH2 0x66F SWAP3 SWAP2 POP PUSH2 0x673 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x68D SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x66F JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x679 JUMP JUMPDEST SWAP1 JUMP JUMPDEST DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x233 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x6C5 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x523 DUP4 DUP4 PUSH2 0x690 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x6E1 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x6EB DUP5 DUP5 PUSH2 0x690 JUMP JUMPDEST SWAP2 POP PUSH2 0x6FA DUP5 PUSH1 0x20 DUP6 ADD PUSH2 0x690 JUMP JUMPDEST SWAP1 POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x715 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x71F DUP5 DUP5 PUSH2 0x690 JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x20 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x73F JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x756 JUMPI DUP4 DUP5 REVERT JUMPDEST DUP2 DUP6 ADD DUP7 PUSH1 0x1F DUP3 ADD SLT PUSH2 0x767 JUMPI DUP5 DUP6 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP3 POP DUP2 DUP4 GT ISZERO PUSH2 0x777 JUMPI DUP5 DUP6 REVERT JUMPDEST DUP7 PUSH1 0x20 DUP5 DUP4 ADD ADD GT ISZERO PUSH2 0x788 JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH1 0x20 ADD SWAP7 SWAP2 SWAP6 POP SWAP1 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x7A8 JUMPI DUP1 DUP2 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP 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 PUSH1 0x60 DUP2 ADD PUSH1 0x4 DUP6 LT PUSH2 0x81F JUMPI INVALID JUMPDEST SWAP4 DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x40 SWAP1 SWAP2 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD PUSH1 0x20 DUP4 MSTORE DUP2 DUP5 SLOAD PUSH1 0x1 DUP2 AND PUSH1 0x0 DUP2 EQ PUSH2 0x859 JUMPI PUSH1 0x1 DUP2 EQ PUSH2 0x895 JUMPI PUSH2 0x8CE JUMP JUMPDEST PUSH1 0x7F PUSH1 0x2 DUP4 DIV AND DUP5 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 AND PUSH1 0x40 DUP8 ADD MSTORE PUSH1 0x60 DUP7 ADD SWAP3 POP PUSH2 0x8CE JUMP JUMPDEST PUSH1 0x2 DUP3 DIV DUP1 DUP6 MSTORE DUP8 DUP7 MSTORE PUSH1 0x20 DUP7 KECCAK256 DUP7 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x8C4 JUMPI DUP2 SLOAD DUP10 DUP3 ADD PUSH1 0x40 ADD MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD PUSH2 0x8A5 JUMP JUMPDEST DUP9 ADD PUSH1 0x40 ADD SWAP5 POP POP POP JUMPDEST POP SWAP1 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP INVALID LOG3 PUSH6 0x627A7A723158 KECCAK256 DUP9 0x48 SWAP10 PUSH4 0x8CAB7C62 PUSH27 0x65C21E187BAF38580E0C07CF66E6A72183D13F8A55B5EA6C657870 PUSH6 0x72696D656E74 PUSH2 0x6CF5 PUSH5 0x736F6C6343 STOP SDIV GT STOP BLOCKHASH ",
                "sourceMap": "8215:2694:57:-;;;8562:118;8:9:-1;5:2;;;30:1;27;20:12;5:2;8562:118:57;8605:15;;;;;:::i;:::-;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;8593:9:57;:27;;-1:-1:-1;;;;;8593:27:57;;;-1:-1:-1;;;;;;8593:27:57;;;;;;;8664:9;;;8630:31;;;8593:27;8630:31;;;;;;:43;;;;;;;;8215:2694;;;;;;;;;;:::o;:::-;;;;;;;"
            },
            "deployedBytecode": {
                "linkReferences": {},
                "object": "0x6080604052600436106100dd5760003560e01c806348d134a01161007f578063c2df82e611610059578063c2df82e61461022a578063c60b5bd21461024a578063d2a10dc51461026b578063d59641f21461028b576100dd565b806348d134a0146101d55780634b57b0be146101f5578063866711081461020a576100dd565b806336c8c27d116100bb57806336c8c27d146101625780633974d3b11461018257806339dd7d0914610195578063426db9cd146101b5576100dd565b806306f2bf62146100df5780631626ba7e14610115578063301ddf0314610142575b005b3480156100eb57600080fd5b506100ff6100fa36600461132a565b6102ab565b60405161010c919061161d565b60405180910390f35b34801561012157600080fd5b506101356101303660046114c3565b6102d6565b60405161010c91906117c0565b34801561014e57600080fd5b506100dd61015d36600461155c565b6102fe565b34801561016e57600080fd5b506100dd61017d366004611478565b610340565b6100dd61019036600461132a565b61037d565b3480156101a157600080fd5b506100dd6101b03660046113e5565b610412565b3480156101c157600080fd5b506100dd6101d03660046114f4565b610447565b3480156101e157600080fd5b506100dd6101f0366004611587565b610481565b34801561020157600080fd5b506100ff6104cc565b34801561021657600080fd5b506100dd6102253660046114f4565b6104e8565b34801561023657600080fd5b50610135610245366004611362565b610517565b61025d610258366004611425565b610afa565b60405161010c92919061172c565b34801561027757600080fd5b506100dd610286366004611425565b610cbe565b34801561029757600080fd5b506100dd6102a6366004611524565b610d5f565b73ffffffffffffffffffffffffffffffffffffffff9081166000908152600260205260409020541690565b7fb0671381000000000000000000000000000000000000000000000000000000009392505050565b7fd04cb125770091752f21a6c6819db3391781d9fc697613b307bb5136e13d4f343384848460405161033394939291906116ad565b60405180910390a1505050565b7f54b41d7666b1bded95f272024889ac00d41cb183d6444dde7c15dfec6bd32fd8828260405161037192919061179a565b60405180910390a15050565b73ffffffffffffffffffffffffffffffffffffffff8082166000908152600160205260408082205481517fd0e30db00000000000000000000000000000000000000000000000000000000081529151931692839263d0e30db09234926004808301939282900301818588803b1580156103f557600080fd5b505af1158015610409573d6000803e3d6000fd5b50505050505050565b7fae33cb06d7303f889d953bb09540983050163c1c4c98b330db432a911cfb63fd33848484604051610333949392919061163e565b7fa31300b5a9e5c5ace6706c4a93516eeb66365bbd1051ece1a3c0339512b2435d816040516104769190611893565b60405180910390a150565b7f1c1a2d4f99027059a394b97e18f3cf047a7363768a6a873c9cff883ea4358645338787878787876040516104bc97969594939291906116e0565b60405180910390a1505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b7fd5b3768a34b8338255d3de13ffce5a4bbc441aa6a62544eb3e8b80e7b50a7738816040516104769190611893565b6000610521611275565b600061052f8486018661132a565b90508873ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561059b57610570818888610d94565b507fdc1600f3000000000000000000000000000000000000000000000000000000009150610af09050565b6105a5818a610e5b565b73ffffffffffffffffffffffffffffffffffffffff90811683526040517f70a08231000000000000000000000000000000000000000000000000000000008152908216906370a08231906105fd90309060040161161d565b60206040518083038186803b15801561061557600080fd5b505afa158015610629573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061064d919081019061150c565b602083015261065a610f8b565b73ffffffffffffffffffffffffffffffffffffffff9081166040840181905290821614156107b057816040015173ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d83602001516040518263ffffffff1660e01b81526004016106c39190611893565b600060405180830381600087803b1580156106dd57600080fd5b505af11580156106f1573d6000803e3d6000fd5b5050835160208501516040517fad65d76d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909216935063ad65d76d925090610754908a9042908d9060040161189c565b6020604051808303818588803b15801561076d57600080fd5b505af1158015610781573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052506107a6919081019061150c565b6060830152610a81565b816040015173ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614156109ca576107fb8260000151828460200151610fa7565b815160208301516040517f95e3c50b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909216916395e3c50b91610857918a904290600401611909565b602060405180830381600087803b15801561087157600080fd5b505af1158015610885573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506108a9919081019061150c565b826060018181525050816040015173ffffffffffffffffffffffffffffffffffffffff1663d0e30db083606001516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561090257600080fd5b505af1158015610916573d6000803e3d6000fd5b50505060608401516040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8d16935063a9059cbb9250610972918b9160040161179a565b602060405180830381600087803b15801561098c57600080fd5b505af11580156109a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506109c491908101906114a3565b50610a81565b6109dd8260000151828460200151610fa7565b816000015173ffffffffffffffffffffffffffffffffffffffff1663f552d91b8360200151886001428c8f6040518763ffffffff1660e01b8152600401610a29969594939291906118c8565b602060405180830381600087803b158015610a4357600080fd5b505af1158015610a57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610a7b919081019061150c565b60608301525b7f349fc08071558d8e3aa92dec9396e4e9f2dfecd6bb9065759d1932e7da43b8a9818a846020015185606001518c8c604051610ac296959493929190611753565b60405180910390a1507fdc1600f3000000000000000000000000000000000000000000000000000000009150505b9695505050505050565b82600073ffffffffffffffffffffffffffffffffffffffff8216610b4457604051610b24906112c9565b604051809103906000f080158015610b40573d6000803e3d6000fd5b5091505b5073ffffffffffffffffffffffffffffffffffffffff808216600081815260016020908152604080832080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169094179093556002905220541680610c2e5781604051610bb1906112d6565b610bbb919061161d565b604051809103906000f080158015610bd7573d6000803e3d6000fd5b5073ffffffffffffffffffffffffffffffffffffffff838116600090815260026020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001691831691909117905590505b6040517f1526787200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8216906315267872903490610c84908890889060040161180f565b6000604051808303818588803b158015610c9d57600080fd5b505af1158015610cb1573d6000803e3d6000fd5b5050505050935093915050565b73ffffffffffffffffffffffffffffffffffffffff808416600090815260016020526040908190205490517f55b3f96600000000000000000000000000000000000000000000000000000000815291169081906355b3f96690610d27908690869060040161180f565b600060405180830381600087803b158015610d4157600080fd5b505af1158015610d55573d6000803e3d6000fd5b5050505050505050565b7fc9be139b48c2029c766f0907faee476f9303fb99bc9ed028959537b81756f666338484846040516103339493929190611675565b6040516060907fa9059cbb0000000000000000000000000000000000000000000000000000000090610dcc908590859060240161179a565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050610e558482610fb7565b50505050565b600082610e66610f8b565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415610e9c5750815b610ea4611073565b73ffffffffffffffffffffffffffffffffffffffff166306f2bf62826040518263ffffffff1660e01b8152600401610edc919061161d565b60206040518083038186803b158015610ef457600080fd5b505afa158015610f08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610f2c9190810190611346565b915073ffffffffffffffffffffffffffffffffffffffff8216610f84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7b9061185c565b60405180910390fd5b5092915050565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b610fb2828483611077565b505050565b600060608373ffffffffffffffffffffffffffffffffffffffff1683604051610fe091906115e4565b6000604051808303816000865af19150503d806000811461101d576040519150601f19603f3d011682016040523d82523d6000602084013e611022565b606091505b5091509150811561106657805161103a57505061106f565b80516020141561106657600061105182600061114e565b905080600114156110645750505061106f565b505b610e5581611161565b5050565b3090565b6040517fdd62ed3e000000000000000000000000000000000000000000000000000000008152819073ffffffffffffffffffffffffffffffffffffffff85169063dd62ed3e906110cd903090879060040161172c565b60206040518083038186803b1580156110e557600080fd5b505afa1580156110f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061111d919081019061150c565b1015610fb257610fb283837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff611169565b600061115a83836111a1565b9392505050565b805160208201fd5b6040516060907f095ea7b30000000000000000000000000000000000000000000000000000000090610dcc908590859060240161179a565b600081602001835110156111c7576111c76111c260058551856020016111d0565b611161565b50016020015190565b6060632800659560e01b8484846040516024016111ef939291906117ed565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290509392505050565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600081525090565b6109458061194583390190565b6107d68061228a83390190565b60008083601f8401126112f4578182fd5b50813567ffffffffffffffff81111561130b578182fd5b60208301915083602082850101111561132357600080fd5b9250929050565b60006020828403121561133b578081fd5b813561115a8161191f565b600060208284031215611357578081fd5b815161115a8161191f565b60008060008060008060a0878903121561137a578182fd5b86356113858161191f565b955060208701356113958161191f565b945060408701356113a58161191f565b935060608701359250608087013567ffffffffffffffff8111156113c7578283fd5b6113d389828a016112e3565b979a9699509497509295939492505050565b6000806000606084860312156113f9578283fd5b83356114048161191f565b925060208401356114148161191f565b929592945050506040919091013590565b600080600060408486031215611439578283fd5b83356114448161191f565b9250602084013567ffffffffffffffff81111561145f578283fd5b61146b868287016112e3565b9497909650939450505050565b6000806040838503121561148a578182fd5b82356114958161191f565b946020939093013593505050565b6000602082840312156114b4578081fd5b8151801515811461115a578182fd5b6000806000604084860312156114d7578283fd5b83359250602084013567ffffffffffffffff81111561145f578283fd5b600060208284031215611505578081fd5b5035919050565b60006020828403121561151d578081fd5b5051919050565b600080600060608486031215611538578283fd5b833592506020840135915060408401356115518161191f565b809150509250925092565b600080600060608486031215611570578283fd5b505081359360208301359350604090920135919050565b60008060008060008060c0878903121561159f578384fd5b8635955060208701359450604087013593506060870135925060808701356115c68161191f565b915060a08701356115d68161191f565b809150509295509295509295565b60008251815b8181101561160457602081860181015185830152016115ea565b818111156116125782828501525b509190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff9485168152928416602084015292166040820152606081019190915260800190565b73ffffffffffffffffffffffffffffffffffffffff948516815260208101939093526040830191909152909116606082015260800190565b73ffffffffffffffffffffffffffffffffffffffff94909416845260208401929092526040830152606082015260800190565b73ffffffffffffffffffffffffffffffffffffffff97881681526020810196909652604086019490945260608501929092526080840152831660a083015290911660c082015260e00190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff96871681529486166020860152604085019390935260608401919091528316608083015290911660a082015260c00190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b7fffffffff0000000000000000000000000000000000000000000000000000000091909116815260200190565b60608101600885106117fb57fe5b938152602081019290925260409091015290565b60006020825282602083015282846040840137818301604090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101919050565b6020808252601d908201527f4e4f5f554e49535741505f45584348414e47455f464f525f544f4b454e000000604082015260600190565b90815260200190565b928352602083019190915273ffffffffffffffffffffffffffffffffffffffff16604082015260600190565b95865260208601949094526040850192909252606084015273ffffffffffffffffffffffffffffffffffffffff90811660808401521660a082015260c00190565b9283526020830191909152604082015260600190565b73ffffffffffffffffffffffffffffffffffffffff8116811461194157600080fd5b5056fe608060405234801561001057600080fd5b50610925806100206000396000f3fe6080604052600436106100965760003560e01c806370a0823111610069578063a9059cbb1161004e578063a9059cbb14610173578063d0e30db014610193578063dd62ed3e1461019b57610096565b806370a08231146101405780639eda069f1461016057610096565b8063095ea7b31461009b57806327e235e3146100d15780632e1a7d4d146100fe57806355b3f96614610120575b600080fd5b3480156100a757600080fd5b506100bb6100b6366004610703565b6101bb565b6040516100c89190610806565b60405180910390f35b3480156100dd57600080fd5b506100f16100ec3660046106b4565b610239565b6040516100c891906108d9565b34801561010a57600080fd5b5061011e610119366004610797565b61024b565b005b34801561012c57600080fd5b5061011e61013b36600461072d565b610323565b34801561014c57600080fd5b506100f161015b3660046106b4565b610334565b61011e61016e3660046106b4565b61035c565b34801561017f57600080fd5b506100bb61018e366004610703565b610385565b61011e6103cf565b3480156101a757600080fd5b506100f16101b63660046106cf565b61047d565b6040517f36c8c27d00000000000000000000000000000000000000000000000000000000815260009033906336c8c27d906101fc90869086906004016107e0565b600060405180830381600087803b15801561021657600080fd5b505af115801561022a573d6000803e3d6000fd5b50505050600190505b92915050565b60006020819052908152604090205481565b610253610485565b33600090815260208190526040902054610273908263ffffffff6104e316565b33600081815260208190526040808220939093559151909183156108fc02918491818181858888f193505050501580156102b1573d6000803e3d6000fd5b506040517f426db9cd000000000000000000000000000000000000000000000000000000008152339063426db9cd906102ee9084906004016108d9565b600060405180830381600087803b15801561030857600080fd5b505af115801561031c573d6000803e3d6000fd5b5050505050565b61032f600183836105d7565b505050565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b73ffffffffffffffffffffffffffffffffffffffff166000908152602081905260409020349055565b600061038f610485565b6040517f39dd7d0900000000000000000000000000000000000000000000000000000000815233906339dd7d09906101fc908390879087906004016107af565b6103d7610485565b336000908152602081905260409020546103f7903463ffffffff61050716565b3360008181526020819052604090819020805490930190925590517f866711080000000000000000000000000000000000000000000000000000000081526386671108906104499034906004016108d9565b600060405180830381600087803b15801561046357600080fd5b505af1158015610477573d6000803e3d6000fd5b50505050565b600092915050565b60018054600181600116156101000203166002900490506000146104e15760016040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104d89190610833565b60405180910390fd5b565b600082821115610501576105016104fc6002858561052a565b6105cf565b50900390565b600082820183811015610523576105236104fc6000868661052a565b9392505050565b606063e946c1bb60e01b84848460405160240161054993929190610811565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290509392505050565b805160208201fd5b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10610636578280017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00823516178555610663565b82800160010185558215610663579182015b82811115610663578235825591602001919060010190610648565b5061066f929150610673565b5090565b61068d91905b8082111561066f5760008155600101610679565b90565b803573ffffffffffffffffffffffffffffffffffffffff8116811461023357600080fd5b6000602082840312156106c5578081fd5b6105238383610690565b600080604083850312156106e1578081fd5b6106eb8484610690565b91506106fa8460208501610690565b90509250929050565b60008060408385031215610715578182fd5b61071f8484610690565b946020939093013593505050565b6000806020838503121561073f578182fd5b823567ffffffffffffffff80821115610756578384fd5b81850186601f820112610767578485fd5b8035925081831115610777578485fd5b866020848301011115610788578485fd5b60200196919550909350505050565b6000602082840312156107a8578081fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b901515815260200190565b606081016004851061081f57fe5b938152602081019290925260409091015290565b6000602082016020835281845460018116600081146108595760018114610895576108ce565b607f600283041684527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00821660408701526060860192506108ce565b6002820480855287865260208620865b828110156108c4578154898201604001526001909101906020016108a5565b8801604001945050505b509095945050505050565b9081526020019056fea365627a7a72315820884899638cab7c627a65c21e187baf38580e0c07cf66e6a72183d13f8a55b5ea6c6578706572696d656e74616cf564736f6c63430005110040608060405234801561001057600080fd5b506040516107d63803806107d683398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610082565b600060208284031215610065578081fd5b81516001600160a01b038116811461007b578182fd5b9392505050565b610745806100916000396000f3fe6080604052600436106100655760003560e01c80639d76ea58116100435780639d76ea58146100d7578063ad65d76d146100ec578063f552d91b146100ff57610065565b8063152678721461006a578063847343751461007f57806395e3c50b146100aa575b600080fd5b61007d610078366004610471565b61011f565b005b34801561008b57600080fd5b50610094610130565b6040516100a191906105af565b60405180910390f35b3480156100b657600080fd5b506100ca6100c536600461052b565b61014d565b6040516100a19190610676565b3480156100e357600080fd5b50610094610202565b6100ca6100fa3660046104db565b61021e565b34801561010b57600080fd5b506100ca61011a366004610556565b6102a4565b61012b60018383610391565b505050565b60005473ffffffffffffffffffffffffffffffffffffffff165b90565b6040517f301ddf03000000000000000000000000000000000000000000000000000000008152600090339063301ddf0390610190908790879087906004016106ab565b600060405180830381600087803b1580156101aa57600080fd5b505af11580156101be573d6000803e3d6000fd5b505050506101ca610333565b6040514790339082156108fc029083906000818181858888f193505050501580156101f9573d6000803e3d6000fd5b50949350505050565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b6040517fd59641f2000000000000000000000000000000000000000000000000000000008152600090339063d59641f2906102619087908790879060040161067f565b600060405180830381600087803b15801561027b57600080fd5b505af115801561028f573d6000803e3d6000fd5b5050505061029b610333565b50479392505050565b6040517f48d134a000000000000000000000000000000000000000000000000000000000815260009033906348d134a0906102ed908a908a908a908a908a908a906004016106c1565b600060405180830381600087803b15801561030757600080fd5b505af115801561031b573d6000803e3d6000fd5b50505050610327610333565b50479695505050505050565b600180546001816001161561010002031660029004905060001461038f5760016040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161038691906105d0565b60405180910390fd5b565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106103f0578280017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082351617855561041d565b8280016001018555821561041d579182015b8281111561041d578235825591602001919060010190610402565b5061042992915061042d565b5090565b61014a91905b808211156104295760008155600101610433565b803573ffffffffffffffffffffffffffffffffffffffff8116811461046b57600080fd5b92915050565b60008060208385031215610483578182fd5b823567ffffffffffffffff8082111561049a578384fd5b81850186601f8201126104ab578485fd5b80359250818311156104bb578485fd5b8660208483010111156104cc578485fd5b60200196919550909350505050565b6000806000606084860312156104ef578081fd5b8335925060208401359150604084013573ffffffffffffffffffffffffffffffffffffffff81168114610520578182fd5b809150509250925092565b60008060006060848603121561053f578283fd5b505081359360208301359350604090920135919050565b60008060008060008060c0878903121561056e578182fd5b863595506020870135945060408701359350606087013592506105948860808901610447565b91506105a38860a08901610447565b90509295509295509295565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b6000602082016020835281845460018116600081146105f657600181146106325761066b565b607f600283041684527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008216604087015260608601925061066b565b6002820480855287865260208620865b8281101561066157815489820160400152600190910190602001610642565b8801604001945050505b509095945050505050565b90815260200190565b928352602083019190915273ffffffffffffffffffffffffffffffffffffffff16604082015260600190565b9283526020830191909152604082015260600190565b95865260208601949094526040850192909252606084015273ffffffffffffffffffffffffffffffffffffffff90811660808401521660a082015260c0019056fea365627a7a723158203e03ed5d1094ca6b39c52afb7a8735fbd55cdc80253a6a33cb7beabd86949a946c6578706572696d656e74616cf564736f6c63430005110040a365627a7a72315820d3da846b2b311892d61fd883f1d823c40c39463d0812426771bb925a009127a86c6578706572696d656e74616cf564736f6c63430005110040",
                "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xDD JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x48D134A0 GT PUSH2 0x7F JUMPI DUP1 PUSH4 0xC2DF82E6 GT PUSH2 0x59 JUMPI DUP1 PUSH4 0xC2DF82E6 EQ PUSH2 0x22A JUMPI DUP1 PUSH4 0xC60B5BD2 EQ PUSH2 0x24A JUMPI DUP1 PUSH4 0xD2A10DC5 EQ PUSH2 0x26B JUMPI DUP1 PUSH4 0xD59641F2 EQ PUSH2 0x28B JUMPI PUSH2 0xDD JUMP JUMPDEST DUP1 PUSH4 0x48D134A0 EQ PUSH2 0x1D5 JUMPI DUP1 PUSH4 0x4B57B0BE EQ PUSH2 0x1F5 JUMPI DUP1 PUSH4 0x86671108 EQ PUSH2 0x20A JUMPI PUSH2 0xDD JUMP JUMPDEST DUP1 PUSH4 0x36C8C27D GT PUSH2 0xBB JUMPI DUP1 PUSH4 0x36C8C27D EQ PUSH2 0x162 JUMPI DUP1 PUSH4 0x3974D3B1 EQ PUSH2 0x182 JUMPI DUP1 PUSH4 0x39DD7D09 EQ PUSH2 0x195 JUMPI DUP1 PUSH4 0x426DB9CD EQ PUSH2 0x1B5 JUMPI PUSH2 0xDD JUMP JUMPDEST DUP1 PUSH4 0x6F2BF62 EQ PUSH2 0xDF JUMPI DUP1 PUSH4 0x1626BA7E EQ PUSH2 0x115 JUMPI DUP1 PUSH4 0x301DDF03 EQ PUSH2 0x142 JUMPI JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xEB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xFF PUSH2 0xFA CALLDATASIZE PUSH1 0x4 PUSH2 0x132A JUMP JUMPDEST PUSH2 0x2AB JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x10C SWAP2 SWAP1 PUSH2 0x161D JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x121 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x135 PUSH2 0x130 CALLDATASIZE PUSH1 0x4 PUSH2 0x14C3 JUMP JUMPDEST PUSH2 0x2D6 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x10C SWAP2 SWAP1 PUSH2 0x17C0 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x14E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDD PUSH2 0x15D CALLDATASIZE PUSH1 0x4 PUSH2 0x155C JUMP JUMPDEST PUSH2 0x2FE JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x16E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDD PUSH2 0x17D CALLDATASIZE PUSH1 0x4 PUSH2 0x1478 JUMP JUMPDEST PUSH2 0x340 JUMP JUMPDEST PUSH2 0xDD PUSH2 0x190 CALLDATASIZE PUSH1 0x4 PUSH2 0x132A JUMP JUMPDEST PUSH2 0x37D JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1A1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDD PUSH2 0x1B0 CALLDATASIZE PUSH1 0x4 PUSH2 0x13E5 JUMP JUMPDEST PUSH2 0x412 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1C1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDD PUSH2 0x1D0 CALLDATASIZE PUSH1 0x4 PUSH2 0x14F4 JUMP JUMPDEST PUSH2 0x447 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1E1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDD PUSH2 0x1F0 CALLDATASIZE PUSH1 0x4 PUSH2 0x1587 JUMP JUMPDEST PUSH2 0x481 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x201 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xFF PUSH2 0x4CC JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x216 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDD PUSH2 0x225 CALLDATASIZE PUSH1 0x4 PUSH2 0x14F4 JUMP JUMPDEST PUSH2 0x4E8 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x236 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x135 PUSH2 0x245 CALLDATASIZE PUSH1 0x4 PUSH2 0x1362 JUMP JUMPDEST PUSH2 0x517 JUMP JUMPDEST PUSH2 0x25D PUSH2 0x258 CALLDATASIZE PUSH1 0x4 PUSH2 0x1425 JUMP JUMPDEST PUSH2 0xAFA JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x10C SWAP3 SWAP2 SWAP1 PUSH2 0x172C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x277 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDD PUSH2 0x286 CALLDATASIZE PUSH1 0x4 PUSH2 0x1425 JUMP JUMPDEST PUSH2 0xCBE JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x297 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDD PUSH2 0x2A6 CALLDATASIZE PUSH1 0x4 PUSH2 0x1524 JUMP JUMPDEST PUSH2 0xD5F JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST PUSH32 0xB067138100000000000000000000000000000000000000000000000000000000 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH32 0xD04CB125770091752F21A6C6819DB3391781D9FC697613B307BB5136E13D4F34 CALLER DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH2 0x333 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x16AD JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP POP JUMP JUMPDEST PUSH32 0x54B41D7666B1BDED95F272024889AC00D41CB183D6444DDE7C15DFEC6BD32FD8 DUP3 DUP3 PUSH1 0x40 MLOAD PUSH2 0x371 SWAP3 SWAP2 SWAP1 PUSH2 0x179A JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 SLOAD DUP2 MLOAD PUSH32 0xD0E30DB000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE SWAP2 MLOAD SWAP4 AND SWAP3 DUP4 SWAP3 PUSH4 0xD0E30DB0 SWAP3 CALLVALUE SWAP3 PUSH1 0x4 DUP1 DUP4 ADD SWAP4 SWAP3 DUP3 SWAP1 SUB ADD DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3F5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x409 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST PUSH32 0xAE33CB06D7303F889D953BB09540983050163C1C4C98B330DB432A911CFB63FD CALLER DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH2 0x333 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x163E JUMP JUMPDEST PUSH32 0xA31300B5A9E5C5ACE6706C4A93516EEB66365BBD1051ECE1A3C0339512B2435D DUP2 PUSH1 0x40 MLOAD PUSH2 0x476 SWAP2 SWAP1 PUSH2 0x1893 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP JUMP JUMPDEST PUSH32 0x1C1A2D4F99027059A394B97E18F3CF047A7363768A6A873C9CFF883EA4358645 CALLER DUP8 DUP8 DUP8 DUP8 DUP8 DUP8 PUSH1 0x40 MLOAD PUSH2 0x4BC SWAP8 SWAP7 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x16E0 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH32 0xD5B3768A34B8338255D3DE13FFCE5A4BBC441AA6A62544EB3E8B80E7B50A7738 DUP2 PUSH1 0x40 MLOAD PUSH2 0x476 SWAP2 SWAP1 PUSH2 0x1893 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x521 PUSH2 0x1275 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x52F DUP5 DUP7 ADD DUP7 PUSH2 0x132A JUMP JUMPDEST SWAP1 POP DUP9 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x59B JUMPI PUSH2 0x570 DUP2 DUP9 DUP9 PUSH2 0xD94 JUMP JUMPDEST POP PUSH32 0xDC1600F300000000000000000000000000000000000000000000000000000000 SWAP2 POP PUSH2 0xAF0 SWAP1 POP JUMP JUMPDEST PUSH2 0x5A5 DUP2 DUP11 PUSH2 0xE5B JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND DUP4 MSTORE PUSH1 0x40 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE SWAP1 DUP3 AND SWAP1 PUSH4 0x70A08231 SWAP1 PUSH2 0x5FD SWAP1 ADDRESS SWAP1 PUSH1 0x4 ADD PUSH2 0x161D JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x615 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x629 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 0x64D SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x150C JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE PUSH2 0x65A PUSH2 0xF8B JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND PUSH1 0x40 DUP5 ADD DUP2 SWAP1 MSTORE SWAP1 DUP3 AND EQ ISZERO PUSH2 0x7B0 JUMPI DUP2 PUSH1 0x40 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x2E1A7D4D DUP4 PUSH1 0x20 ADD MLOAD PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x6C3 SWAP2 SWAP1 PUSH2 0x1893 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x6DD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x6F1 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP DUP4 MLOAD PUSH1 0x20 DUP6 ADD MLOAD PUSH1 0x40 MLOAD PUSH32 0xAD65D76D00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND SWAP4 POP PUSH4 0xAD65D76D SWAP3 POP SWAP1 PUSH2 0x754 SWAP1 DUP11 SWAP1 TIMESTAMP SWAP1 DUP14 SWAP1 PUSH1 0x4 ADD PUSH2 0x189C JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x76D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x781 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 0x7A6 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x150C JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE PUSH2 0xA81 JUMP JUMPDEST DUP2 PUSH1 0x40 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP10 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x9CA JUMPI PUSH2 0x7FB DUP3 PUSH1 0x0 ADD MLOAD DUP3 DUP5 PUSH1 0x20 ADD MLOAD PUSH2 0xFA7 JUMP JUMPDEST DUP2 MLOAD PUSH1 0x20 DUP4 ADD MLOAD PUSH1 0x40 MLOAD PUSH32 0x95E3C50B00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND SWAP2 PUSH4 0x95E3C50B SWAP2 PUSH2 0x857 SWAP2 DUP11 SWAP1 TIMESTAMP SWAP1 PUSH1 0x4 ADD PUSH2 0x1909 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x871 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x885 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 0x8A9 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x150C JUMP JUMPDEST DUP3 PUSH1 0x60 ADD DUP2 DUP2 MSTORE POP POP DUP2 PUSH1 0x40 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xD0E30DB0 DUP4 PUSH1 0x60 ADD MLOAD 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 0x902 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x916 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP PUSH1 0x60 DUP5 ADD MLOAD PUSH1 0x40 MLOAD PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP14 AND SWAP4 POP PUSH4 0xA9059CBB SWAP3 POP PUSH2 0x972 SWAP2 DUP12 SWAP2 PUSH1 0x4 ADD PUSH2 0x179A JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x98C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x9A0 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 0x9C4 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x14A3 JUMP JUMPDEST POP PUSH2 0xA81 JUMP JUMPDEST PUSH2 0x9DD DUP3 PUSH1 0x0 ADD MLOAD DUP3 DUP5 PUSH1 0x20 ADD MLOAD PUSH2 0xFA7 JUMP JUMPDEST DUP2 PUSH1 0x0 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xF552D91B DUP4 PUSH1 0x20 ADD MLOAD DUP9 PUSH1 0x1 TIMESTAMP DUP13 DUP16 PUSH1 0x40 MLOAD DUP8 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xA29 SWAP7 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x18C8 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xA43 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xA57 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 0xA7B SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x150C JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE JUMPDEST PUSH32 0x349FC08071558D8E3AA92DEC9396E4E9F2DFECD6BB9065759D1932E7DA43B8A9 DUP2 DUP11 DUP5 PUSH1 0x20 ADD MLOAD DUP6 PUSH1 0x60 ADD MLOAD DUP13 DUP13 PUSH1 0x40 MLOAD PUSH2 0xAC2 SWAP7 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x1753 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP PUSH32 0xDC1600F300000000000000000000000000000000000000000000000000000000 SWAP2 POP POP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST DUP3 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH2 0xB44 JUMPI PUSH1 0x40 MLOAD PUSH2 0xB24 SWAP1 PUSH2 0x12C9 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 PUSH1 0x0 CREATE DUP1 ISZERO DUP1 ISZERO PUSH2 0xB40 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP SWAP2 POP JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP3 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP1 SWAP5 OR SWAP1 SWAP4 SSTORE PUSH1 0x2 SWAP1 MSTORE KECCAK256 SLOAD AND DUP1 PUSH2 0xC2E JUMPI DUP2 PUSH1 0x40 MLOAD PUSH2 0xBB1 SWAP1 PUSH2 0x12D6 JUMP JUMPDEST PUSH2 0xBBB SWAP2 SWAP1 PUSH2 0x161D JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 PUSH1 0x0 CREATE DUP1 ISZERO DUP1 ISZERO PUSH2 0xBD7 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP2 DUP4 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE SWAP1 POP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x1526787200000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP1 PUSH4 0x15267872 SWAP1 CALLVALUE SWAP1 PUSH2 0xC84 SWAP1 DUP9 SWAP1 DUP9 SWAP1 PUSH1 0x4 ADD PUSH2 0x180F JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xC9D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xCB1 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 SLOAD SWAP1 MLOAD PUSH32 0x55B3F96600000000000000000000000000000000000000000000000000000000 DUP2 MSTORE SWAP2 AND SWAP1 DUP2 SWAP1 PUSH4 0x55B3F966 SWAP1 PUSH2 0xD27 SWAP1 DUP7 SWAP1 DUP7 SWAP1 PUSH1 0x4 ADD PUSH2 0x180F JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xD41 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xD55 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH32 0xC9BE139B48C2029C766F0907FAEE476F9303FB99BC9ED028959537B81756F666 CALLER DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH2 0x333 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x1675 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x60 SWAP1 PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 SWAP1 PUSH2 0xDCC SWAP1 DUP6 SWAP1 DUP6 SWAP1 PUSH1 0x24 ADD PUSH2 0x179A 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 0xE55 DUP5 DUP3 PUSH2 0xFB7 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0xE66 PUSH2 0xF8B JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0xE9C JUMPI POP DUP2 JUMPDEST PUSH2 0xEA4 PUSH2 0x1073 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x6F2BF62 DUP3 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xEDC SWAP2 SWAP1 PUSH2 0x161D JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xEF4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xF08 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 0xF2C SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x1346 JUMP JUMPDEST SWAP2 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH2 0xF84 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF7B SWAP1 PUSH2 0x185C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH2 0xFB2 DUP3 DUP5 DUP4 PUSH2 0x1077 JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH1 0x40 MLOAD PUSH2 0xFE0 SWAP2 SWAP1 PUSH2 0x15E4 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 0x101D 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 0x1022 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 ISZERO PUSH2 0x1066 JUMPI DUP1 MLOAD PUSH2 0x103A JUMPI POP POP PUSH2 0x106F JUMP JUMPDEST DUP1 MLOAD PUSH1 0x20 EQ ISZERO PUSH2 0x1066 JUMPI PUSH1 0x0 PUSH2 0x1051 DUP3 PUSH1 0x0 PUSH2 0x114E JUMP JUMPDEST SWAP1 POP DUP1 PUSH1 0x1 EQ ISZERO PUSH2 0x1064 JUMPI POP POP POP PUSH2 0x106F JUMP JUMPDEST POP JUMPDEST PUSH2 0xE55 DUP2 PUSH2 0x1161 JUMP JUMPDEST POP POP JUMP JUMPDEST ADDRESS SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xDD62ED3E00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE DUP2 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND SWAP1 PUSH4 0xDD62ED3E SWAP1 PUSH2 0x10CD SWAP1 ADDRESS SWAP1 DUP8 SWAP1 PUSH1 0x4 ADD PUSH2 0x172C JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x10E5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x10F9 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 0x111D SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x150C JUMP JUMPDEST LT ISZERO PUSH2 0xFB2 JUMPI PUSH2 0xFB2 DUP4 DUP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x1169 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x115A DUP4 DUP4 PUSH2 0x11A1 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP1 MLOAD PUSH1 0x20 DUP3 ADD REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x60 SWAP1 PUSH32 0x95EA7B300000000000000000000000000000000000000000000000000000000 SWAP1 PUSH2 0xDCC SWAP1 DUP6 SWAP1 DUP6 SWAP1 PUSH1 0x24 ADD PUSH2 0x179A JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x20 ADD DUP4 MLOAD LT ISZERO PUSH2 0x11C7 JUMPI PUSH2 0x11C7 PUSH2 0x11C2 PUSH1 0x5 DUP6 MLOAD DUP6 PUSH1 0x20 ADD PUSH2 0x11D0 JUMP JUMPDEST PUSH2 0x1161 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 0x11EF SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x17ED 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 PUSH1 0x40 MLOAD DUP1 PUSH1 0x80 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH2 0x945 DUP1 PUSH2 0x1945 DUP4 CODECOPY ADD SWAP1 JUMP JUMPDEST PUSH2 0x7D6 DUP1 PUSH2 0x228A DUP4 CODECOPY ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x12F4 JUMPI DUP2 DUP3 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x130B JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x1323 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x133B JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x115A DUP2 PUSH2 0x191F JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1357 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x115A DUP2 PUSH2 0x191F JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xA0 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x137A JUMPI DUP2 DUP3 REVERT JUMPDEST DUP7 CALLDATALOAD PUSH2 0x1385 DUP2 PUSH2 0x191F JUMP JUMPDEST SWAP6 POP PUSH1 0x20 DUP8 ADD CALLDATALOAD PUSH2 0x1395 DUP2 PUSH2 0x191F JUMP JUMPDEST SWAP5 POP PUSH1 0x40 DUP8 ADD CALLDATALOAD PUSH2 0x13A5 DUP2 PUSH2 0x191F JUMP JUMPDEST SWAP4 POP PUSH1 0x60 DUP8 ADD CALLDATALOAD SWAP3 POP PUSH1 0x80 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x13C7 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0x13D3 DUP10 DUP3 DUP11 ADD PUSH2 0x12E3 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 0x13F9 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x1404 DUP2 PUSH2 0x191F JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x1414 DUP2 PUSH2 0x191F JUMP JUMPDEST SWAP3 SWAP6 SWAP3 SWAP5 POP POP POP PUSH1 0x40 SWAP2 SWAP1 SWAP2 ADD CALLDATALOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x40 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x1439 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x1444 DUP2 PUSH2 0x191F JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x145F JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0x146B DUP7 DUP3 DUP8 ADD PUSH2 0x12E3 JUMP JUMPDEST SWAP5 SWAP8 SWAP1 SWAP7 POP SWAP4 SWAP5 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x148A JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x1495 DUP2 PUSH2 0x191F 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 0x14B4 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x115A JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x40 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x14D7 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 CALLDATALOAD SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x145F JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1505 JUMPI DUP1 DUP2 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x151D JUMPI DUP1 DUP2 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x1538 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 CALLDATALOAD SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD SWAP2 POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH2 0x1551 DUP2 PUSH2 0x191F JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x1570 JUMPI DUP3 DUP4 REVERT JUMPDEST POP POP DUP2 CALLDATALOAD SWAP4 PUSH1 0x20 DUP4 ADD CALLDATALOAD SWAP4 POP PUSH1 0x40 SWAP1 SWAP3 ADD CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xC0 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x159F JUMPI DUP4 DUP5 REVERT JUMPDEST DUP7 CALLDATALOAD SWAP6 POP PUSH1 0x20 DUP8 ADD CALLDATALOAD SWAP5 POP PUSH1 0x40 DUP8 ADD CALLDATALOAD SWAP4 POP PUSH1 0x60 DUP8 ADD CALLDATALOAD SWAP3 POP PUSH1 0x80 DUP8 ADD CALLDATALOAD PUSH2 0x15C6 DUP2 PUSH2 0x191F JUMP JUMPDEST SWAP2 POP PUSH1 0xA0 DUP8 ADD CALLDATALOAD PUSH2 0x15D6 DUP2 PUSH2 0x191F JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 POP SWAP3 SWAP6 JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD DUP2 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x1604 JUMPI PUSH1 0x20 DUP2 DUP7 ADD DUP2 ADD MLOAD DUP6 DUP4 ADD MSTORE ADD PUSH2 0x15EA JUMP JUMPDEST DUP2 DUP2 GT ISZERO PUSH2 0x1612 JUMPI DUP3 DUP3 DUP6 ADD MSTORE JUMPDEST POP 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 SWAP5 DUP6 AND DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x40 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 SWAP2 AND PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP8 DUP9 AND DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP7 SWAP1 SWAP7 MSTORE PUSH1 0x40 DUP7 ADD SWAP5 SWAP1 SWAP5 MSTORE PUSH1 0x60 DUP6 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x80 DUP5 ADD MSTORE DUP4 AND PUSH1 0xA0 DUP4 ADD MSTORE SWAP1 SWAP2 AND PUSH1 0xC0 DUP3 ADD MSTORE PUSH1 0xE0 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 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 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 0x17FB JUMPI INVALID JUMPDEST SWAP4 DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x40 SWAP1 SWAP2 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE DUP3 PUSH1 0x20 DUP4 ADD MSTORE DUP3 DUP5 PUSH1 0x40 DUP5 ADD CALLDATACOPY DUP2 DUP4 ADD PUSH1 0x40 SWAP1 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x1F SWAP1 SWAP3 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND ADD ADD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1D SWAP1 DUP3 ADD MSTORE PUSH32 0x4E4F5F554E49535741505F45584348414E47455F464F525F544F4B454E000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST SWAP6 DUP7 MSTORE PUSH1 0x20 DUP7 ADD SWAP5 SWAP1 SWAP5 MSTORE PUSH1 0x40 DUP6 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x60 DUP5 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND PUSH1 0x80 DUP5 ADD MSTORE AND PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xC0 ADD SWAP1 JUMP JUMPDEST SWAP3 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x1941 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 PUSH2 0x925 DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x96 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x70A08231 GT PUSH2 0x69 JUMPI DUP1 PUSH4 0xA9059CBB GT PUSH2 0x4E JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x173 JUMPI DUP1 PUSH4 0xD0E30DB0 EQ PUSH2 0x193 JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x19B JUMPI PUSH2 0x96 JUMP JUMPDEST DUP1 PUSH4 0x70A08231 EQ PUSH2 0x140 JUMPI DUP1 PUSH4 0x9EDA069F EQ PUSH2 0x160 JUMPI PUSH2 0x96 JUMP JUMPDEST DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x9B JUMPI DUP1 PUSH4 0x27E235E3 EQ PUSH2 0xD1 JUMPI DUP1 PUSH4 0x2E1A7D4D EQ PUSH2 0xFE JUMPI DUP1 PUSH4 0x55B3F966 EQ PUSH2 0x120 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xA7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xBB PUSH2 0xB6 CALLDATASIZE PUSH1 0x4 PUSH2 0x703 JUMP JUMPDEST PUSH2 0x1BB JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xC8 SWAP2 SWAP1 PUSH2 0x806 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xDD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xF1 PUSH2 0xEC CALLDATASIZE PUSH1 0x4 PUSH2 0x6B4 JUMP JUMPDEST PUSH2 0x239 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xC8 SWAP2 SWAP1 PUSH2 0x8D9 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x10A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x11E PUSH2 0x119 CALLDATASIZE PUSH1 0x4 PUSH2 0x797 JUMP JUMPDEST PUSH2 0x24B JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x12C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x11E PUSH2 0x13B CALLDATASIZE PUSH1 0x4 PUSH2 0x72D JUMP JUMPDEST PUSH2 0x323 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x14C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xF1 PUSH2 0x15B CALLDATASIZE PUSH1 0x4 PUSH2 0x6B4 JUMP JUMPDEST PUSH2 0x334 JUMP JUMPDEST PUSH2 0x11E PUSH2 0x16E CALLDATASIZE PUSH1 0x4 PUSH2 0x6B4 JUMP JUMPDEST PUSH2 0x35C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x17F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xBB PUSH2 0x18E CALLDATASIZE PUSH1 0x4 PUSH2 0x703 JUMP JUMPDEST PUSH2 0x385 JUMP JUMPDEST PUSH2 0x11E PUSH2 0x3CF JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1A7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xF1 PUSH2 0x1B6 CALLDATASIZE PUSH1 0x4 PUSH2 0x6CF JUMP JUMPDEST PUSH2 0x47D JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x36C8C27D00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x0 SWAP1 CALLER SWAP1 PUSH4 0x36C8C27D SWAP1 PUSH2 0x1FC SWAP1 DUP7 SWAP1 DUP7 SWAP1 PUSH1 0x4 ADD PUSH2 0x7E0 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x216 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x22A JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x1 SWAP1 POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP2 SWAP1 MSTORE SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH2 0x253 PUSH2 0x485 JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH2 0x273 SWAP1 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x4E3 AND JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE SWAP2 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 0x2B1 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH32 0x426DB9CD00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE CALLER SWAP1 PUSH4 0x426DB9CD SWAP1 PUSH2 0x2EE SWAP1 DUP5 SWAP1 PUSH1 0x4 ADD PUSH2 0x8D9 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x308 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x31C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH2 0x32F PUSH1 0x1 DUP4 DUP4 PUSH2 0x5D7 JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 CALLVALUE SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 PUSH2 0x38F PUSH2 0x485 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x39DD7D0900000000000000000000000000000000000000000000000000000000 DUP2 MSTORE CALLER SWAP1 PUSH4 0x39DD7D09 SWAP1 PUSH2 0x1FC SWAP1 DUP4 SWAP1 DUP8 SWAP1 DUP8 SWAP1 PUSH1 0x4 ADD PUSH2 0x7AF JUMP JUMPDEST PUSH2 0x3D7 PUSH2 0x485 JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH2 0x3F7 SWAP1 CALLVALUE PUSH4 0xFFFFFFFF PUSH2 0x507 AND JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD SWAP1 SWAP4 ADD SWAP1 SWAP3 SSTORE SWAP1 MLOAD PUSH32 0x8667110800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH4 0x86671108 SWAP1 PUSH2 0x449 SWAP1 CALLVALUE SWAP1 PUSH1 0x4 ADD PUSH2 0x8D9 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x463 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x477 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x1 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 POP PUSH1 0x0 EQ PUSH2 0x4E1 JUMPI PUSH1 0x1 PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x4D8 SWAP2 SWAP1 PUSH2 0x833 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x501 JUMPI PUSH2 0x501 PUSH2 0x4FC PUSH1 0x2 DUP6 DUP6 PUSH2 0x52A JUMP JUMPDEST PUSH2 0x5CF JUMP JUMPDEST POP SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x523 JUMPI PUSH2 0x523 PUSH2 0x4FC PUSH1 0x0 DUP7 DUP7 PUSH2 0x52A JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH4 0xE946C1BB PUSH1 0xE0 SHL DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x549 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x811 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 DUP1 MLOAD PUSH1 0x20 DUP3 ADD REVERT JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH2 0x636 JUMPI DUP3 DUP1 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 CALLDATALOAD AND OR DUP6 SSTORE PUSH2 0x663 JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH2 0x663 JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x663 JUMPI DUP3 CALLDATALOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x648 JUMP JUMPDEST POP PUSH2 0x66F SWAP3 SWAP2 POP PUSH2 0x673 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x68D SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x66F JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x679 JUMP JUMPDEST SWAP1 JUMP JUMPDEST DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x233 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x6C5 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x523 DUP4 DUP4 PUSH2 0x690 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x6E1 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x6EB DUP5 DUP5 PUSH2 0x690 JUMP JUMPDEST SWAP2 POP PUSH2 0x6FA DUP5 PUSH1 0x20 DUP6 ADD PUSH2 0x690 JUMP JUMPDEST SWAP1 POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x715 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x71F DUP5 DUP5 PUSH2 0x690 JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x20 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x73F JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x756 JUMPI DUP4 DUP5 REVERT JUMPDEST DUP2 DUP6 ADD DUP7 PUSH1 0x1F DUP3 ADD SLT PUSH2 0x767 JUMPI DUP5 DUP6 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP3 POP DUP2 DUP4 GT ISZERO PUSH2 0x777 JUMPI DUP5 DUP6 REVERT JUMPDEST DUP7 PUSH1 0x20 DUP5 DUP4 ADD ADD GT ISZERO PUSH2 0x788 JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH1 0x20 ADD SWAP7 SWAP2 SWAP6 POP SWAP1 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x7A8 JUMPI DUP1 DUP2 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP 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 PUSH1 0x60 DUP2 ADD PUSH1 0x4 DUP6 LT PUSH2 0x81F JUMPI INVALID JUMPDEST SWAP4 DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x40 SWAP1 SWAP2 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD PUSH1 0x20 DUP4 MSTORE DUP2 DUP5 SLOAD PUSH1 0x1 DUP2 AND PUSH1 0x0 DUP2 EQ PUSH2 0x859 JUMPI PUSH1 0x1 DUP2 EQ PUSH2 0x895 JUMPI PUSH2 0x8CE JUMP JUMPDEST PUSH1 0x7F PUSH1 0x2 DUP4 DIV AND DUP5 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 AND PUSH1 0x40 DUP8 ADD MSTORE PUSH1 0x60 DUP7 ADD SWAP3 POP PUSH2 0x8CE JUMP JUMPDEST PUSH1 0x2 DUP3 DIV DUP1 DUP6 MSTORE DUP8 DUP7 MSTORE PUSH1 0x20 DUP7 KECCAK256 DUP7 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x8C4 JUMPI DUP2 SLOAD DUP10 DUP3 ADD PUSH1 0x40 ADD MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD PUSH2 0x8A5 JUMP JUMPDEST DUP9 ADD PUSH1 0x40 ADD SWAP5 POP POP POP JUMPDEST POP SWAP1 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP INVALID LOG3 PUSH6 0x627A7A723158 KECCAK256 DUP9 0x48 SWAP10 PUSH4 0x8CAB7C62 PUSH27 0x65C21E187BAF38580E0C07CF66E6A72183D13F8A55B5EA6C657870 PUSH6 0x72696D656E74 PUSH2 0x6CF5 PUSH5 0x736F6C6343 STOP SDIV GT STOP BLOCKHASH PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH2 0x7D6 CODESIZE SUB DUP1 PUSH2 0x7D6 DUP4 CODECOPY DUP2 ADD PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH2 0x2F SWAP2 PUSH2 0x54 JUMP JUMPDEST 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 0x82 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x65 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x7B JUMPI DUP2 DUP3 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x745 DUP1 PUSH2 0x91 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x65 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x9D76EA58 GT PUSH2 0x43 JUMPI DUP1 PUSH4 0x9D76EA58 EQ PUSH2 0xD7 JUMPI DUP1 PUSH4 0xAD65D76D EQ PUSH2 0xEC JUMPI DUP1 PUSH4 0xF552D91B EQ PUSH2 0xFF JUMPI PUSH2 0x65 JUMP JUMPDEST DUP1 PUSH4 0x15267872 EQ PUSH2 0x6A JUMPI DUP1 PUSH4 0x84734375 EQ PUSH2 0x7F JUMPI DUP1 PUSH4 0x95E3C50B EQ PUSH2 0xAA JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x7D PUSH2 0x78 CALLDATASIZE PUSH1 0x4 PUSH2 0x471 JUMP JUMPDEST PUSH2 0x11F JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x8B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x94 PUSH2 0x130 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xA1 SWAP2 SWAP1 PUSH2 0x5AF JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xB6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xCA PUSH2 0xC5 CALLDATASIZE PUSH1 0x4 PUSH2 0x52B JUMP JUMPDEST PUSH2 0x14D JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xA1 SWAP2 SWAP1 PUSH2 0x676 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xE3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x94 PUSH2 0x202 JUMP JUMPDEST PUSH2 0xCA PUSH2 0xFA CALLDATASIZE PUSH1 0x4 PUSH2 0x4DB JUMP JUMPDEST PUSH2 0x21E JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x10B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xCA PUSH2 0x11A CALLDATASIZE PUSH1 0x4 PUSH2 0x556 JUMP JUMPDEST PUSH2 0x2A4 JUMP JUMPDEST PUSH2 0x12B PUSH1 0x1 DUP4 DUP4 PUSH2 0x391 JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x301DDF0300000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x0 SWAP1 CALLER SWAP1 PUSH4 0x301DDF03 SWAP1 PUSH2 0x190 SWAP1 DUP8 SWAP1 DUP8 SWAP1 DUP8 SWAP1 PUSH1 0x4 ADD PUSH2 0x6AB JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1AA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1BE JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH2 0x1CA PUSH2 0x333 JUMP JUMPDEST PUSH1 0x40 MLOAD SELFBALANCE SWAP1 CALLER SWAP1 DUP3 ISZERO PUSH2 0x8FC MUL SWAP1 DUP4 SWAP1 PUSH1 0x0 DUP2 DUP2 DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0x1F9 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xD59641F200000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x0 SWAP1 CALLER SWAP1 PUSH4 0xD59641F2 SWAP1 PUSH2 0x261 SWAP1 DUP8 SWAP1 DUP8 SWAP1 DUP8 SWAP1 PUSH1 0x4 ADD PUSH2 0x67F JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x27B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x28F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH2 0x29B PUSH2 0x333 JUMP JUMPDEST POP SELFBALANCE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x48D134A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x0 SWAP1 CALLER SWAP1 PUSH4 0x48D134A0 SWAP1 PUSH2 0x2ED SWAP1 DUP11 SWAP1 DUP11 SWAP1 DUP11 SWAP1 DUP11 SWAP1 DUP11 SWAP1 DUP11 SWAP1 PUSH1 0x4 ADD PUSH2 0x6C1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x307 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x31B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH2 0x327 PUSH2 0x333 JUMP JUMPDEST POP SELFBALANCE SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 POP PUSH1 0x0 EQ PUSH2 0x38F JUMPI PUSH1 0x1 PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x386 SWAP2 SWAP1 PUSH2 0x5D0 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH2 0x3F0 JUMPI DUP3 DUP1 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 CALLDATALOAD AND OR DUP6 SSTORE PUSH2 0x41D JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH2 0x41D JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x41D JUMPI DUP3 CALLDATALOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x402 JUMP JUMPDEST POP PUSH2 0x429 SWAP3 SWAP2 POP PUSH2 0x42D JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x14A SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x429 JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x433 JUMP JUMPDEST DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x46B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x20 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x483 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x49A JUMPI DUP4 DUP5 REVERT JUMPDEST DUP2 DUP6 ADD DUP7 PUSH1 0x1F DUP3 ADD SLT PUSH2 0x4AB JUMPI DUP5 DUP6 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP3 POP DUP2 DUP4 GT ISZERO PUSH2 0x4BB JUMPI DUP5 DUP6 REVERT JUMPDEST DUP7 PUSH1 0x20 DUP5 DUP4 ADD ADD GT ISZERO PUSH2 0x4CC JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH1 0x20 ADD SWAP7 SWAP2 SWAP6 POP SWAP1 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x4EF JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 CALLDATALOAD SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD SWAP2 POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x520 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x53F JUMPI DUP3 DUP4 REVERT JUMPDEST POP POP DUP2 CALLDATALOAD SWAP4 PUSH1 0x20 DUP4 ADD CALLDATALOAD SWAP4 POP PUSH1 0x40 SWAP1 SWAP3 ADD CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xC0 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x56E JUMPI DUP2 DUP3 REVERT JUMPDEST DUP7 CALLDATALOAD SWAP6 POP PUSH1 0x20 DUP8 ADD CALLDATALOAD SWAP5 POP PUSH1 0x40 DUP8 ADD CALLDATALOAD SWAP4 POP PUSH1 0x60 DUP8 ADD CALLDATALOAD SWAP3 POP PUSH2 0x594 DUP9 PUSH1 0x80 DUP10 ADD PUSH2 0x447 JUMP JUMPDEST SWAP2 POP PUSH2 0x5A3 DUP9 PUSH1 0xA0 DUP10 ADD PUSH2 0x447 JUMP JUMPDEST SWAP1 POP SWAP3 SWAP6 POP SWAP3 SWAP6 POP SWAP3 SWAP6 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD PUSH1 0x20 DUP4 MSTORE DUP2 DUP5 SLOAD PUSH1 0x1 DUP2 AND PUSH1 0x0 DUP2 EQ PUSH2 0x5F6 JUMPI PUSH1 0x1 DUP2 EQ PUSH2 0x632 JUMPI PUSH2 0x66B JUMP JUMPDEST PUSH1 0x7F PUSH1 0x2 DUP4 DIV AND DUP5 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 AND PUSH1 0x40 DUP8 ADD MSTORE PUSH1 0x60 DUP7 ADD SWAP3 POP PUSH2 0x66B JUMP JUMPDEST PUSH1 0x2 DUP3 DIV DUP1 DUP6 MSTORE DUP8 DUP7 MSTORE PUSH1 0x20 DUP7 KECCAK256 DUP7 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x661 JUMPI DUP2 SLOAD DUP10 DUP3 ADD PUSH1 0x40 ADD MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD PUSH2 0x642 JUMP JUMPDEST DUP9 ADD PUSH1 0x40 ADD SWAP5 POP POP POP JUMPDEST POP SWAP1 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST SWAP3 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST SWAP6 DUP7 MSTORE PUSH1 0x20 DUP7 ADD SWAP5 SWAP1 SWAP5 MSTORE PUSH1 0x40 DUP6 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x60 DUP5 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND PUSH1 0x80 DUP5 ADD MSTORE AND PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xC0 ADD SWAP1 JUMP INVALID LOG3 PUSH6 0x627A7A723158 KECCAK256 RETURNDATACOPY SUB 0xED 0x5D LT SWAP5 0xCA PUSH12 0x39C52AFB7A8735FBD55CDC80 0x25 GASPRICE PUSH11 0x33CB7BEABD86949A946C65 PUSH25 0x706572696D656E74616CF564736F6C63430005110040A36562 PUSH27 0x7A72315820D3DA846B2B311892D61FD883F1D823C40C39463D0812 TIMESTAMP PUSH8 0x71BB925A009127A8 PUSH13 0x6578706572696D656E74616CF5 PUSH5 0x736F6C6343 STOP SDIV GT STOP BLOCKHASH ",
                "sourceMap": "8215:2694:57:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10368:164;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;10368:164:57;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;6092:192:27;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;6092:192:27;;;;;;;;:::i;:::-;;;;;;;;2169:292:57;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2169:292:57;;;;;;;;:::i;3199:138::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;3199:138:57;;;;;;;;:::i;8807:186::-;;;;;;;;;:::i;2949:244::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2949:244:57;;;;;;;;:::i;3453:106::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;3453:106:57;;;;;;;;:::i;2467:476::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2467:476:57;;;;;;;;:::i;8320:26::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8320:26:57;;;:::i;3343:104::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;3343:104:57;;;;;;;;:::i;2259:3633:27:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2259:3633:27;;;;;;;;:::i;9632:679:57:-;;;;;;;;;:::i;:::-;;;;;;;;;9058:208;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;9058:208:57;;;;;;;;:::i;1859:304::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1859:304:57;;;;;;;;:::i;10368:164::-;10496:28;;;;10458:7;10496:28;;;:14;:28;;;;;;;;10368:164::o;6092:192:27:-;6252:25;6092:192;;;;;:::o;2169:292:57:-;2329:125;2362:10;2386;2410:12;2436:8;2329:125;;;;;;;;;;;;;;;;;;2169:292;;;:::o;3199:138::-;3298:32;3311:7;3320:9;3298:32;;;;;;;;;;;;;;;;3199:138;;:::o;8807:186::-;8919:25;;;;8901:15;8919:25;;;:11;:25;;;;;;;8954:32;;;;;;;8919:25;;;;;8954:13;;8974:9;;8954:32;;;;;8901:15;8954:32;;;;;8974:9;8919:25;8954:32;;;5:2:-1;;;;30:1;27;20:12;5:2;8954:32:57;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;8954:32:57;;;;;8807:186;;:::o;2949:244::-;3085:101;3112:10;3136:4;3154:2;3170:6;3085:101;;;;;;;;;;3453:106;3532:20;3545:6;3532:20;;;;;;;;;;;;;;;3453:106;:::o;2467:476::-;2725:211;2764:10;2788;2812:15;2841:12;2867:8;2889:9;2912:14;2725:211;;;;;;;;;;;;;;;;;;;;;2467:476;;;;;;:::o;8320:26::-;;;;;;:::o;3343:104::-;3421:19;3433:6;3421:19;;;;;;;2259:3633:27;2460:14;2547:26;;:::i;:::-;2649:24;2677:33;;;;2688:10;2677:33;;;2648:62;;2802:14;2782:34;;:16;:34;;;2778:152;;;2832:52;2855:16;2873:2;2877:6;2832:22;:52::i;:::-;-1:-1:-1;2905:14:27;;-1:-1:-1;2898:21:27;;-1:-1:-1;2898:21:27;2778:152;3005:99;3050:16;3080:14;3005:31;:99::i;:::-;2988:116;;;;;;3195:54;;;;;:39;;;;;;:54;;3243:4;;3195:54;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3195:54:27;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3195:54:27;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;3195:54:27;;;;;;;;;3170:22;;;:79;3318:17;:15;:17::i;:::-;3293:43;;;;:10;;;:43;;;3392:39;;;;3388:2262;;;3479:5;:10;;;:19;;;3499:5;:22;;;3479:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3479:43:27;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;3671:14:27;;3716:22;;;;3671:281;;;;;:38;;;;;-1:-1:-1;3671:38:27;;-1:-1:-1;3716:22:27;3671:281;;3796:6;;3865:15;;3936:2;;3671:281;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3671:281:27;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3671:281:27;;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;3671:281:27;;;;;;;;;3650:18;;;:302;3388:2262;;;4041:5;:10;;;4015:37;;:14;:37;;;4011:1639;;;4116:81;4140:5;:14;;;4156:16;4174:5;:22;;;4116:23;:81::i;:::-;4306:14;;4402:22;;;;4306:273;;;;;:34;;;;;;;:273;;4481:6;;4550:15;;4306:273;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4306:273:27;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;4306:273:27;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;4306:273:27;;;;;;;;;4285:5;:18;;:294;;;;;4622:5;:10;;;:18;;;4647:5;:18;;;4622:46;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4622:46:27;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;;4765:18:27;;;;4724:60;;;;;:36;;;;-1:-1:-1;4724:36:27;;-1:-1:-1;4724:60:27;;4761:2;;4724:60;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4724:60:27;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;4724:60:27;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;4724:60:27;;;;;;;;;;4011:1639;;;4910:81;4934:5;:14;;;4950:16;4968:5;:22;;;4910:23;:81::i;:::-;5146:5;:14;;;:40;;;5248:5;:22;;;5327:6;5408:1;5472:15;5543:2;5611:14;5146:493;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5146:493:27;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;5146:493:27;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;5146:493:27;;;;;;;;;5125:18;;;:514;4011:1639;5665:189;5698:16;5728:14;5756:5;:22;;;5792:5;:18;;;5824:4;5842:2;5665:189;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5871:14:27;;-1:-1:-1;;2259:3633:27;;;;;;;;;:::o;9632:679:57:-;9860:12;9788:15;9887:26;;;9883:80;;9937:15;;;;;:::i;:::-;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9937:15:57;9929:23;;9883:80;-1:-1:-1;9972:27:57;;;;;;;;:11;:27;;;;;;;;:35;;;;;;;;;;10028:14;:30;;;;;10072:31;10068:138;;10188:5;10163:32;;;;;:::i;:::-;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;10119:30:57;;;;;;;;:14;:30;;;;;:76;;;;;;;;;;;;;;-1:-1:-1;10068:138:57;10215:55;;;;;:24;;;;;;10246:9;;10215:55;;10257:12;;;;10215:55;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10215:55:57;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;;;;9632:679:57;;;;;;:::o;9058:208::-;9189:25;;;;9171:15;9189:25;;;:11;:25;;;;;;;;9224:35;;;;;9189:25;;;;;9224:21;;:35;;9246:12;;;;9224:35;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9224:35:57;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9224:35:57;;;;9058:208;;;;:::o;1859:304::-;2025:131;2062:10;2086:15;2115:8;2137:9;2025:131;;;;;;;;;;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;7330:699:27:-;7489:25;7561:16;7666:17;:15;:17::i;:::-;7646:37;;:16;:37;;;7642:105;;;-1:-1:-1;7722:14:27;7642:105;7821:35;:33;:35::i;:::-;7797:85;;;7883:20;7797:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7797:107:27;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;7797:107:27;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;7797:107:27;;;;;;;;;7756:158;-1:-1:-1;7932:31:27;;;7924:73;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7330:699:27;;;;:::o;10567:129:57:-;10641:7;10679:9;;;10567:129;:::o;6585:300:27:-;6753:125;6795:12;6829:8;6852:16;6753:28;:125::i;:::-;6585:300;;;:::o;6120:571:61:-;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;10765:142:57:-;10895:4;10765:142;:::o;1978:267:61:-;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;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;1194:338:61;1347:121;;1323:21;;1383:31;;1347:121;;1428:7;;1449:9;;1347:121;;;;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;8215:2694:57:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;:::o;:::-;;;;;;;;:::o;722:336:-1:-;;;836:3;829:4;821:6;817:17;813:27;803:2;;-1:-1;;844:12;803:2;-1:-1;874:20;;914:18;903:30;;900:2;;;-1:-1;;936:12;900:2;980:4;972:6;968:17;956:29;;1031:3;980:4;1011:17;972:6;997:32;;994:41;991:2;;;1048:1;;1038:12;991:2;796:262;;;;;;1704:241;;1808:2;1796:9;1787:7;1783:23;1779:32;1776:2;;;-1:-1;;1814:12;1776:2;85:6;72:20;97:33;124:5;97:33;;1952:263;;2067:2;2055:9;2046:7;2042:23;2038:32;2035:2;;;-1:-1;;2073:12;2035:2;226:6;220:13;238:33;265:5;238:33;;2486:867;;;;;;;2677:3;2665:9;2656:7;2652:23;2648:33;2645:2;;;-1:-1;;2684:12;2645:2;85:6;72:20;97:33;124:5;97:33;;;2736:63;-1:-1;2836:2;2875:22;;72:20;97:33;72:20;97:33;;;2844:63;-1:-1;2944:2;2983:22;;72:20;97:33;72:20;97:33;;;2952:63;-1:-1;3052:2;3091:22;;1493:20;;-1:-1;3188:3;3173:19;;3160:33;3213:18;3202:30;;3199:2;;;-1:-1;;3235:12;3199:2;3273:64;3329:7;3320:6;3309:9;3305:22;3273:64;;;2639:714;;;;-1:-1;2639:714;;-1:-1;2639:714;;3263:74;;2639:714;-1:-1;;;2639:714;3360:491;;;;3498:2;3486:9;3477:7;3473:23;3469:32;3466:2;;;-1:-1;;3504:12;3466:2;85:6;72:20;97:33;124:5;97:33;;;3556:63;-1:-1;3656:2;3695:22;;72:20;97:33;72:20;97:33;;;3460:391;;3664:63;;-1:-1;;;3764:2;3803:22;;;;1493:20;;3460:391;3858:492;;;;3999:2;3987:9;3978:7;3974:23;3970:32;3967:2;;;-1:-1;;4005:12;3967:2;85:6;72:20;97:33;124:5;97:33;;;4057:63;-1:-1;4185:2;4170:18;;4157:32;4209:18;4198:30;;4195:2;;;-1:-1;;4231:12;4195:2;4269:65;4326:7;4317:6;4306:9;4302:22;4269:65;;;3961:389;;4259:75;;-1:-1;4259:75;;-1:-1;;;;3961:389;4357:366;;;4478:2;4466:9;4457:7;4453:23;4449:32;4446:2;;;-1:-1;;4484:12;4446:2;85:6;72:20;97:33;124:5;97:33;;;4536:63;4636:2;4675:22;;;;1493:20;;-1:-1;;;4440:283;4730:257;;4842:2;4830:9;4821:7;4817:23;4813:32;4810:2;;;-1:-1;;4848:12;4810:2;517:6;511:13;22603:5;19650:13;19643:21;22581:5;22578:32;22568:2;;-1:-1;;22614:12;4994:490;;;;5134:2;5122:9;5113:7;5109:23;5105:32;5102:2;;;-1:-1;;5140:12;5102:2;651:6;638:20;5192:63;;5320:2;5309:9;5305:18;5292:32;5344:18;5336:6;5333:30;5330:2;;;-1:-1;;5366:12;5491:241;;5595:2;5583:9;5574:7;5570:23;5566:32;5563:2;;;-1:-1;;5601:12;5563:2;-1:-1;1493:20;;5557:175;-1:-1;5557:175;5739:263;;5854:2;5842:9;5833:7;5829:23;5825:32;5822:2;;;-1:-1;;5860:12;5822:2;-1:-1;1641:13;;5816:186;-1:-1;5816:186;6009:491;;;;6147:2;6135:9;6126:7;6122:23;6118:32;6115:2;;;-1:-1;;6153:12;6115:2;1506:6;1493:20;6205:63;;6305:2;6348:9;6344:22;1493:20;6313:63;;6413:2;6456:9;6452:22;72:20;97:33;124:5;97:33;;;6421:63;;;;6109:391;;;;;;6507:491;;;;6645:2;6633:9;6624:7;6620:23;6616:32;6613:2;;;-1:-1;;6651:12;6613:2;-1:-1;;1493:20;;;6803:2;6842:22;;1493:20;;-1:-1;6911:2;6950:22;;;1493:20;;6607:391;-1:-1;6607:391;7005:869;;;;;;;7194:3;7182:9;7173:7;7169:23;7165:33;7162:2;;;-1:-1;;7201:12;7162:2;1506:6;1493:20;7253:63;;7353:2;7396:9;7392:22;1493:20;7361:63;;7461:2;7504:9;7500:22;1493:20;7469:63;;7569:2;7612:9;7608:22;1493:20;7577:63;;7677:3;7721:9;7717:22;72:20;97:33;124:5;97:33;;;7686:63;-1:-1;7786:3;7826:22;;72:20;97:33;72:20;97:33;;;7795:63;;;;7156:718;;;;;;;;;10115:262;;8427:5;19014:12;-1:-1;21815:101;21829:6;21826:1;21823:13;21815:101;;;8571:4;21896:11;;;;;21890:18;21877:11;;;21870:39;21844:10;21815:101;;;21931:6;21928:1;21925:13;21922:2;;;-1:-1;21987:6;21982:3;21978:16;21971:27;21922:2;-1:-1;8602:16;;;;;10240:137;-1:-1;;10240:137;10384:213;20164:42;20153:54;;;;8101:37;;10502:2;10487:18;;10473:124;10840:563;20164:42;20153:54;;;7960:58;;20153:54;;;11223:2;11208:18;;8101:37;20153:54;;11306:2;11291:18;;8101:37;11389:2;11374:18;;10066:37;;;;11050:3;11035:19;;11021:382;11410:563;20164:42;20153:54;;;7960:58;;11793:2;11778:18;;10066:37;;;;11876:2;11861:18;;10066:37;;;;20153:54;;;11959:2;11944:18;;8101:37;11620:3;11605:19;;11591:382;11980:563;20164:42;20153:54;;;;7960:58;;12363:2;12348:18;;10066:37;;;;12446:2;12431:18;;10066:37;12529:2;12514:18;;10066:37;12190:3;12175:19;;12161:382;12550:899;20164:42;20153:54;;;7960:58;;13017:2;13002:18;;10066:37;;;;13100:2;13085:18;;10066:37;;;;13183:2;13168:18;;10066:37;;;;13266:3;13251:19;;10066:37;20153:54;;13350:3;13335:19;;8101:37;20153:54;;;13434:3;13419:19;;8101:37;12844:3;12829:19;;12815:634;13456:324;20164:42;20153:54;;;8101:37;;20153:54;;13766:2;13751:18;;8101:37;13602:2;13587:18;;13573:207;13787:771;20164:42;20153:54;;;8101:37;;20153:54;;;14210:2;14195:18;;8101:37;14293:2;14278:18;;10066:37;;;;14376:2;14361:18;;10066:37;;;;20153:54;;14459:3;14444:19;;8101:37;20153:54;;;14543:3;14528:19;;8101:37;14045:3;14030:19;;14016:542;14565:324;20164:42;20153:54;;;;8101:37;;14875:2;14860:18;;10066:37;14711:2;14696:18;;14682:207;14896:209;19827:66;19816:78;;;;8219:36;;15012:2;14997:18;;14983:122;15777:503;15985:2;15970:18;;22229:1;22219:12;;22209:2;;22235:9;22209:2;9079:84;;;16183:2;16168:18;;10066:37;;;;16266:2;16251:18;;;10066:37;15956:324;;16287:321;;16435:2;16456:17;16449:47;19324:6;16435:2;16424:9;16420:18;19312:19;21670:6;21665:3;19352:14;16424:9;19352:14;21647:30;21708:16;;;19352:14;21708:16;;;21701:27;;;;22107:2;22087:14;;;22103:7;22083:28;9604:39;;;16406:202;-1:-1;16406:202;16615:407;16806:2;16820:47;;;9882:2;16791:18;;;19312:19;9918:31;19352:14;;;9898:52;9969:12;;;16777:245;17029:213;10066:37;;;17147:2;17132:18;;17118:124;17249:435;10066:37;;;17587:2;17572:18;;10066:37;;;;20164:42;20153:54;17670:2;17655:18;;8101:37;17423:2;17408:18;;17394:290;17691:787;10066:37;;;18122:2;18107:18;;10066:37;;;;18213:2;18198:18;;9254:58;;;;18296:2;18281:18;;10066:37;20164:42;20153:54;;;18379:3;18364:19;;8101:37;20153:54;18463:3;18448:19;;8101:37;17957:3;17942:19;;17928:550;18485:435;10066:37;;;18823:2;18808:18;;10066:37;;;;18906:2;18891:18;;10066:37;18659:2;18644:18;;18630:290;22258:117;20164:42;22345:5;20153:54;22320:5;22317:35;22307:2;;22366:1;;22356:12;22307:2;22301:74;"
            }
        }
    },
    "sourceTreeHashHex": "0x33a0fb29b05e5cb5def7f6c40e89f0754b4c2fefba35dfc45c0a93c341b62635",
    "sources": {
        "./TestUniswapBridge.sol": {
            "id": 57,
            "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 \"@0x/contracts-utils/contracts/src/LibSafeMath.sol\";\nimport \"../src/bridges/UniswapBridge.sol\";\nimport \"../src/interfaces/IUniswapExchangeFactory.sol\";\nimport \"../src/interfaces/IUniswapExchange.sol\";\n\n\n// solhint-disable no-simple-event-func-name\ncontract TestEventsRaiser {\n\n    event TokenTransfer(\n        address token,\n        address from,\n        address to,\n        uint256 amount\n    );\n\n    event TokenApprove(\n        address spender,\n        uint256 allowance\n    );\n\n    event WethDeposit(\n        uint256 amount\n    );\n\n    event WethWithdraw(\n        uint256 amount\n    );\n\n    event EthToTokenTransferInput(\n        address exchange,\n        uint256 minTokensBought,\n        uint256 deadline,\n        address recipient\n    );\n\n    event TokenToEthSwapInput(\n        address exchange,\n        uint256 tokensSold,\n        uint256 minEthBought,\n        uint256 deadline\n    );\n\n    event TokenToTokenTransferInput(\n        address exchange,\n        uint256 tokensSold,\n        uint256 minTokensBought,\n        uint256 minEthBought,\n        uint256 deadline,\n        address recipient,\n        address toTokenAddress\n    );\n\n    function raiseEthToTokenTransferInput(\n        uint256 minTokensBought,\n        uint256 deadline,\n        address recipient\n    )\n        external\n    {\n        emit EthToTokenTransferInput(\n            msg.sender,\n            minTokensBought,\n            deadline,\n            recipient\n        );\n    }\n\n    function raiseTokenToEthSwapInput(\n        uint256 tokensSold,\n        uint256 minEthBought,\n        uint256 deadline\n    )\n        external\n    {\n        emit TokenToEthSwapInput(\n            msg.sender,\n            tokensSold,\n            minEthBought,\n            deadline\n        );\n    }\n\n    function raiseTokenToTokenTransferInput(\n        uint256 tokensSold,\n        uint256 minTokensBought,\n        uint256 minEthBought,\n        uint256 deadline,\n        address recipient,\n        address toTokenAddress\n    )\n        external\n    {\n        emit TokenToTokenTransferInput(\n            msg.sender,\n            tokensSold,\n            minTokensBought,\n            minEthBought,\n            deadline,\n            recipient,\n            toTokenAddress\n        );\n    }\n\n    function raiseTokenTransfer(\n        address from,\n        address to,\n        uint256 amount\n    )\n        external\n    {\n        emit TokenTransfer(\n            msg.sender,\n            from,\n            to,\n            amount\n        );\n    }\n\n    function raiseTokenApprove(address spender, uint256 allowance)\n        external\n    {\n        emit TokenApprove(spender, allowance);\n    }\n\n    function raiseWethDeposit(uint256 amount)\n        external\n    {\n        emit WethDeposit(amount);\n    }\n\n    function raiseWethWithdraw(uint256 amount)\n        external\n    {\n        emit WethWithdraw(amount);\n    }\n}\n\n\n/// @dev A minimalist ERC20/WETH token.\ncontract TestToken {\n\n    using LibSafeMath for uint256;\n\n    mapping (address => uint256) public balances;\n    string private _nextRevertReason;\n\n    /// @dev Set the balance for `owner`.\n    function setBalance(address owner)\n        external\n        payable\n    {\n        balances[owner] = msg.value;\n    }\n\n    /// @dev Set the revert reason for `transfer()`,\n    ///      `deposit()`, and `withdraw()`.\n    function setRevertReason(string calldata reason)\n        external\n    {\n        _nextRevertReason = reason;\n    }\n\n    /// @dev Just calls `raiseTokenTransfer()` on the caller.\n    function transfer(address to, uint256 amount)\n        external\n        returns (bool)\n    {\n        _revertIfReasonExists();\n        TestEventsRaiser(msg.sender).raiseTokenTransfer(msg.sender, to, amount);\n        return true;\n    }\n\n    /// @dev Just calls `raiseTokenApprove()` on the caller.\n    function approve(address spender, uint256 allowance)\n        external\n        returns (bool)\n    {\n        TestEventsRaiser(msg.sender).raiseTokenApprove(spender, allowance);\n        return true;\n    }\n\n    /// @dev `IWETH.deposit()` that increases balances and calls\n    ///     `raiseWethDeposit()` on the caller.\n    function deposit()\n        external\n        payable\n    {\n        _revertIfReasonExists();\n        balances[msg.sender] += balances[msg.sender].safeAdd(msg.value);\n        TestEventsRaiser(msg.sender).raiseWethDeposit(msg.value);\n    }\n\n    /// @dev `IWETH.withdraw()` that just reduces balances and calls\n    ///       `raiseWethWithdraw()` on the caller.\n    function withdraw(uint256 amount)\n        external\n    {\n        _revertIfReasonExists();\n        balances[msg.sender] = balances[msg.sender].safeSub(amount);\n        msg.sender.transfer(amount);\n        TestEventsRaiser(msg.sender).raiseWethWithdraw(amount);\n    }\n\n    function allowance(address, address) external view returns (uint256) {\n        return 0;\n    }\n\n    /// @dev Retrieve the balance for `owner`.\n    function balanceOf(address owner)\n        external\n        view\n        returns (uint256)\n    {\n        return balances[owner];\n    }\n\n    function _revertIfReasonExists()\n        private\n        view\n    {\n        if (bytes(_nextRevertReason).length != 0) {\n            revert(_nextRevertReason);\n        }\n    }\n}\n\n\ncontract TestExchange is\n    IUniswapExchange\n{\n    address public tokenAddress;\n    string private _nextRevertReason;\n\n    constructor(address _tokenAddress) public {\n        tokenAddress = _tokenAddress;\n    }\n\n    function setFillBehavior(\n        string calldata revertReason\n    )\n        external\n        payable\n    {\n        _nextRevertReason = revertReason;\n    }\n\n    function ethToTokenTransferInput(\n        uint256 minTokensBought,\n        uint256 deadline,\n        address recipient\n    )\n        external\n        payable\n        returns (uint256 tokensBought)\n    {\n        TestEventsRaiser(msg.sender).raiseEthToTokenTransferInput(\n            minTokensBought,\n            deadline,\n            recipient\n        );\n        _revertIfReasonExists();\n        return address(this).balance;\n    }\n\n    function tokenToEthSwapInput(\n        uint256 tokensSold,\n        uint256 minEthBought,\n        uint256 deadline\n    )\n        external\n        returns (uint256 ethBought)\n    {\n        TestEventsRaiser(msg.sender).raiseTokenToEthSwapInput(\n            tokensSold,\n            minEthBought,\n            deadline\n        );\n        _revertIfReasonExists();\n        uint256 fillAmount = address(this).balance;\n        msg.sender.transfer(fillAmount);\n        return fillAmount;\n    }\n\n    function tokenToTokenTransferInput(\n        uint256 tokensSold,\n        uint256 minTokensBought,\n        uint256 minEthBought,\n        uint256 deadline,\n        address recipient,\n        address toTokenAddress\n    )\n        external\n        returns (uint256 tokensBought)\n    {\n        TestEventsRaiser(msg.sender).raiseTokenToTokenTransferInput(\n            tokensSold,\n            minTokensBought,\n            minEthBought,\n            deadline,\n            recipient,\n            toTokenAddress\n        );\n        _revertIfReasonExists();\n        return address(this).balance;\n    }\n\n    function toTokenAddress()\n        external\n        view\n        returns (address _tokenAddress)\n    {\n        return tokenAddress;\n    }\n\n    function _revertIfReasonExists()\n        private\n        view\n    {\n        if (bytes(_nextRevertReason).length != 0) {\n            revert(_nextRevertReason);\n        }\n    }\n}\n\n\n/// @dev UniswapBridge overridden to mock tokens and implement IUniswapExchangeFactory.\ncontract TestUniswapBridge is\n    IUniswapExchangeFactory,\n    TestEventsRaiser,\n    UniswapBridge\n{\n    TestToken public wethToken;\n    // Token address to TestToken instance.\n    mapping (address => TestToken) private _testTokens;\n    // Token address to TestExchange instance.\n    mapping (address => TestExchange) private _testExchanges;\n\n    constructor() public {\n        wethToken = new TestToken();\n        _testTokens[address(wethToken)] = wethToken;\n    }\n\n    /// @dev Sets the balance of this contract for an existing token.\n    ///      The wei attached will be the balance.\n    function setTokenBalance(address tokenAddress)\n        external\n        payable\n    {\n        TestToken token = _testTokens[tokenAddress];\n        token.deposit.value(msg.value)();\n    }\n\n    /// @dev Sets the revert reason for an existing token.\n    function setTokenRevertReason(address tokenAddress, string calldata revertReason)\n        external\n    {\n        TestToken token = _testTokens[tokenAddress];\n        token.setRevertReason(revertReason);\n    }\n\n    /// @dev Create a token and exchange (if they don't exist) for a new token\n    ///      and sets the exchange revert and fill behavior. The wei attached\n    ///      will be the fill amount for the exchange.\n    /// @param tokenAddress The token address. If zero, one will be created.\n    /// @param revertReason The revert reason for exchange operations.\n    function createTokenAndExchange(\n        address tokenAddress,\n        string calldata revertReason\n    )\n        external\n        payable\n        returns (TestToken token, TestExchange exchange)\n    {\n        token = TestToken(tokenAddress);\n        if (tokenAddress == address(0)) {\n            token = new TestToken();\n        }\n        _testTokens[address(token)] = token;\n        exchange = _testExchanges[address(token)];\n        if (address(exchange) == address(0)) {\n            _testExchanges[address(token)] = exchange = new TestExchange(address(token));\n        }\n        exchange.setFillBehavior.value(msg.value)(revertReason);\n        return (token, exchange);\n    }\n\n    /// @dev `IUniswapExchangeFactory.getExchange`\n    function getExchange(address tokenAddress)\n        external\n        view\n        returns (address)\n    {\n        return address(_testExchanges[tokenAddress]);\n    }\n\n    // @dev Use `wethToken`.\n    function _getWethAddress()\n        internal\n        view\n        returns (address)\n    {\n        return address(wethToken);\n    }\n\n    // @dev This contract will double as the Uniswap contract.\n    function _getUniswapExchangeFactoryAddress()\n        internal\n        view\n        returns (address)\n    {\n        return address(this);\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"
        },
        "@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/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/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/bridges/UniswapBridge.sol": {
            "id": 27,
            "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 \"@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 \"../interfaces/IUniswapExchangeFactory.sol\";\nimport \"../interfaces/IUniswapExchange.sol\";\nimport \"../interfaces/IERC20Bridge.sol\";\n\n\n// solhint-disable space-after-comma\n// solhint-disable not-rely-on-time\ncontract UniswapBridge is\n    IERC20Bridge,\n    IWallet,\n    DeploymentConstants\n{\n    // Struct to hold `bridgeTransferFrom()` local variables in memory and to avoid\n    // stack overflows.\n    struct TransferState {\n        IUniswapExchange exchange;\n        uint256 fromTokenBalance;\n        IEtherToken weth;\n        uint256 boughtAmount;\n    }\n\n    // solhint-disable no-empty-blocks\n    /// @dev Payable fallback to receive ETH from uniswap.\n    function ()\n        external\n        payable\n    {}\n\n    /// @dev Callback for `IERC20Bridge`. Tries to buy `amount` of\n    ///      `toTokenAddress` tokens by selling the entirety of the `fromTokenAddress`\n    ///      token encoded in the bridge data.\n    /// @param toTokenAddress The token to buy and transfer 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-encoded \"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        // State memory object to avoid stack overflows.\n        TransferState memory state;\n        // Decode the bridge data to get the `fromTokenAddress`.\n        (address fromTokenAddress) = abi.decode(bridgeData, (address));\n\n        // Just transfer the tokens if they're the same.\n        if (fromTokenAddress == toTokenAddress) {\n            LibERC20Token.transfer(fromTokenAddress, to, amount);\n            return BRIDGE_SUCCESS;\n        }\n\n        // Get the exchange for the token pair.\n        state.exchange = _getUniswapExchangeForTokenPair(\n            fromTokenAddress,\n            toTokenAddress\n        );\n        // Get our balance of `fromTokenAddress` token.\n        state.fromTokenBalance = IERC20Token(fromTokenAddress).balanceOf(address(this));\n        // Get the weth contract.\n        state.weth = IEtherToken(_getWethAddress());\n\n        // Convert from WETH to a token.\n        if (fromTokenAddress == address(state.weth)) {\n            // Unwrap the WETH.\n            state.weth.withdraw(state.fromTokenBalance);\n            // Buy as much of `toTokenAddress` token with ETH as possible and\n            // transfer it to `to`.\n            state.boughtAmount = state.exchange.ethToTokenTransferInput.value(state.fromTokenBalance)(\n                // Minimum buy amount.\n                amount,\n                // Expires after this block.\n                block.timestamp,\n                // Recipient is `to`.\n                to\n            );\n\n        // Convert from a token to WETH.\n        } else if (toTokenAddress == address(state.weth)) {\n            // Grant the exchange an allowance.\n            _grantExchangeAllowance(state.exchange, fromTokenAddress, state.fromTokenBalance);\n            // Buy as much ETH with `fromTokenAddress` token as possible.\n            state.boughtAmount = state.exchange.tokenToEthSwapInput(\n                // Sell all tokens we hold.\n                state.fromTokenBalance,\n                // Minimum buy amount.\n                amount,\n                // Expires after this block.\n                block.timestamp\n            );\n            // Wrap the ETH.\n            state.weth.deposit.value(state.boughtAmount)();\n            // Transfer the WETH to `to`.\n            IEtherToken(toTokenAddress).transfer(to, state.boughtAmount);\n\n        // Convert from one token to another.\n        } else {\n            // Grant the exchange an allowance.\n            _grantExchangeAllowance(state.exchange, fromTokenAddress, state.fromTokenBalance);\n            // Buy as much `toTokenAddress` token with `fromTokenAddress` token\n            // and transfer it to `to`.\n            state.boughtAmount = state.exchange.tokenToTokenTransferInput(\n                // Sell all tokens we hold.\n                state.fromTokenBalance,\n                // Minimum buy amount.\n                amount,\n                // Must buy at least 1 intermediate ETH.\n                1,\n                // Expires after this block.\n                block.timestamp,\n                // Recipient is `to`.\n                to,\n                // Convert to `toTokenAddress`.\n                toTokenAddress\n            );\n        }\n\n        emit ERC20BridgeTransfer(\n            fromTokenAddress,\n            toTokenAddress,\n            state.fromTokenBalance,\n            state.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 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    /// @dev Grants an unlimited allowance to the exchange for its token\n    ///      on behalf of this contract.\n    /// @param exchange The Uniswap token exchange.\n    /// @param tokenAddress The token address for the exchange.\n    /// @param minimumAllowance The minimum necessary allowance.\n    function _grantExchangeAllowance(\n        IUniswapExchange exchange,\n        address tokenAddress,\n        uint256 minimumAllowance\n    )\n        private\n    {\n        LibERC20Token.approveIfBelow(\n            tokenAddress,\n            address(exchange),\n            minimumAllowance\n        );\n    }\n\n    /// @dev Retrieves the uniswap exchange for a given token pair.\n    ///      In the case of a WETH-token exchange, this will be the non-WETH token.\n    ///      In th ecase of a token-token exchange, this will be the first token.\n    /// @param fromTokenAddress The address of the token we are converting from.\n    /// @param toTokenAddress The address of the token we are converting to.\n    /// @return exchange The uniswap exchange.\n    function _getUniswapExchangeForTokenPair(\n        address fromTokenAddress,\n        address toTokenAddress\n    )\n        private\n        view\n        returns (IUniswapExchange exchange)\n    {\n        address exchangeTokenAddress = fromTokenAddress;\n        // Whichever isn't WETH is the exchange token.\n        if (fromTokenAddress == _getWethAddress()) {\n            exchangeTokenAddress = toTokenAddress;\n        }\n        exchange = IUniswapExchange(\n            IUniswapExchangeFactory(_getUniswapExchangeFactoryAddress())\n            .getExchange(exchangeTokenAddress)\n        );\n        require(address(exchange) != address(0), \"NO_UNISWAP_EXCHANGE_FOR_TOKEN\");\n        return exchange;\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/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"
        },
        "../src/interfaces/IUniswapExchangeFactory.sol": {
            "id": 47,
            "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 \"./IUniswapExchange.sol\";\n\n\ninterface IUniswapExchangeFactory {\n\n    /// @dev Get the exchange for a token.\n    /// @param tokenAddress The address of the token contract.\n    function getExchange(address tokenAddress)\n        external\n        view\n        returns (address);\n}\n"
        },
        "../src/interfaces/IUniswapExchange.sol": {
            "id": 46,
            "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 IUniswapExchange {\n\n    /// @dev Buys at least `minTokensBought` tokens with ETH and transfer them\n    ///      to `recipient`.\n    /// @param minTokensBought The minimum number of tokens to buy.\n    /// @param deadline Time when this order expires.\n    /// @param recipient Who to transfer the tokens to.\n    /// @return tokensBought Amount of tokens bought.\n    function ethToTokenTransferInput(\n        uint256 minTokensBought,\n        uint256 deadline,\n        address recipient\n    )\n        external\n        payable\n        returns (uint256 tokensBought);\n\n    /// @dev Buys at least `minEthBought` ETH with tokens.\n    /// @param tokensSold Amount of tokens to sell.\n    /// @param minEthBought The minimum amount of ETH to buy.\n    /// @param deadline Time when this order expires.\n    /// @return ethBought Amount of tokens bought.\n    function tokenToEthSwapInput(\n        uint256 tokensSold,\n        uint256 minEthBought,\n        uint256 deadline\n    )\n        external\n        returns (uint256 ethBought);\n\n    /// @dev Buys at least `minTokensBought` tokens with the exchange token\n    ///      and transfer them to `recipient`.\n    /// @param minTokensBought The minimum number of tokens to buy.\n    /// @param minEthBought The minimum amount of intermediate ETH to buy.\n    /// @param deadline Time when this order expires.\n    /// @param recipient Who to transfer the tokens to.\n    /// @param toTokenAddress The token being bought.\n    /// @return tokensBought Amount of tokens bought.\n    function tokenToTokenTransferInput(\n        uint256 tokensSold,\n        uint256 minTokensBought,\n        uint256 minEthBought,\n        uint256 deadline,\n        address recipient,\n        address toTokenAddress\n    )\n        external\n        returns (uint256 tokensBought);\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"
        }
    },
    "sourceCodes": {
        "./TestUniswapBridge.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 \"@0x/contracts-utils/contracts/src/LibSafeMath.sol\";\nimport \"../src/bridges/UniswapBridge.sol\";\nimport \"../src/interfaces/IUniswapExchangeFactory.sol\";\nimport \"../src/interfaces/IUniswapExchange.sol\";\n\n\n// solhint-disable no-simple-event-func-name\ncontract TestEventsRaiser {\n\n    event TokenTransfer(\n        address token,\n        address from,\n        address to,\n        uint256 amount\n    );\n\n    event TokenApprove(\n        address spender,\n        uint256 allowance\n    );\n\n    event WethDeposit(\n        uint256 amount\n    );\n\n    event WethWithdraw(\n        uint256 amount\n    );\n\n    event EthToTokenTransferInput(\n        address exchange,\n        uint256 minTokensBought,\n        uint256 deadline,\n        address recipient\n    );\n\n    event TokenToEthSwapInput(\n        address exchange,\n        uint256 tokensSold,\n        uint256 minEthBought,\n        uint256 deadline\n    );\n\n    event TokenToTokenTransferInput(\n        address exchange,\n        uint256 tokensSold,\n        uint256 minTokensBought,\n        uint256 minEthBought,\n        uint256 deadline,\n        address recipient,\n        address toTokenAddress\n    );\n\n    function raiseEthToTokenTransferInput(\n        uint256 minTokensBought,\n        uint256 deadline,\n        address recipient\n    )\n        external\n    {\n        emit EthToTokenTransferInput(\n            msg.sender,\n            minTokensBought,\n            deadline,\n            recipient\n        );\n    }\n\n    function raiseTokenToEthSwapInput(\n        uint256 tokensSold,\n        uint256 minEthBought,\n        uint256 deadline\n    )\n        external\n    {\n        emit TokenToEthSwapInput(\n            msg.sender,\n            tokensSold,\n            minEthBought,\n            deadline\n        );\n    }\n\n    function raiseTokenToTokenTransferInput(\n        uint256 tokensSold,\n        uint256 minTokensBought,\n        uint256 minEthBought,\n        uint256 deadline,\n        address recipient,\n        address toTokenAddress\n    )\n        external\n    {\n        emit TokenToTokenTransferInput(\n            msg.sender,\n            tokensSold,\n            minTokensBought,\n            minEthBought,\n            deadline,\n            recipient,\n            toTokenAddress\n        );\n    }\n\n    function raiseTokenTransfer(\n        address from,\n        address to,\n        uint256 amount\n    )\n        external\n    {\n        emit TokenTransfer(\n            msg.sender,\n            from,\n            to,\n            amount\n        );\n    }\n\n    function raiseTokenApprove(address spender, uint256 allowance)\n        external\n    {\n        emit TokenApprove(spender, allowance);\n    }\n\n    function raiseWethDeposit(uint256 amount)\n        external\n    {\n        emit WethDeposit(amount);\n    }\n\n    function raiseWethWithdraw(uint256 amount)\n        external\n    {\n        emit WethWithdraw(amount);\n    }\n}\n\n\n/// @dev A minimalist ERC20/WETH token.\ncontract TestToken {\n\n    using LibSafeMath for uint256;\n\n    mapping (address => uint256) public balances;\n    string private _nextRevertReason;\n\n    /// @dev Set the balance for `owner`.\n    function setBalance(address owner)\n        external\n        payable\n    {\n        balances[owner] = msg.value;\n    }\n\n    /// @dev Set the revert reason for `transfer()`,\n    ///      `deposit()`, and `withdraw()`.\n    function setRevertReason(string calldata reason)\n        external\n    {\n        _nextRevertReason = reason;\n    }\n\n    /// @dev Just calls `raiseTokenTransfer()` on the caller.\n    function transfer(address to, uint256 amount)\n        external\n        returns (bool)\n    {\n        _revertIfReasonExists();\n        TestEventsRaiser(msg.sender).raiseTokenTransfer(msg.sender, to, amount);\n        return true;\n    }\n\n    /// @dev Just calls `raiseTokenApprove()` on the caller.\n    function approve(address spender, uint256 allowance)\n        external\n        returns (bool)\n    {\n        TestEventsRaiser(msg.sender).raiseTokenApprove(spender, allowance);\n        return true;\n    }\n\n    /// @dev `IWETH.deposit()` that increases balances and calls\n    ///     `raiseWethDeposit()` on the caller.\n    function deposit()\n        external\n        payable\n    {\n        _revertIfReasonExists();\n        balances[msg.sender] += balances[msg.sender].safeAdd(msg.value);\n        TestEventsRaiser(msg.sender).raiseWethDeposit(msg.value);\n    }\n\n    /// @dev `IWETH.withdraw()` that just reduces balances and calls\n    ///       `raiseWethWithdraw()` on the caller.\n    function withdraw(uint256 amount)\n        external\n    {\n        _revertIfReasonExists();\n        balances[msg.sender] = balances[msg.sender].safeSub(amount);\n        msg.sender.transfer(amount);\n        TestEventsRaiser(msg.sender).raiseWethWithdraw(amount);\n    }\n\n    function allowance(address, address) external view returns (uint256) {\n        return 0;\n    }\n\n    /// @dev Retrieve the balance for `owner`.\n    function balanceOf(address owner)\n        external\n        view\n        returns (uint256)\n    {\n        return balances[owner];\n    }\n\n    function _revertIfReasonExists()\n        private\n        view\n    {\n        if (bytes(_nextRevertReason).length != 0) {\n            revert(_nextRevertReason);\n        }\n    }\n}\n\n\ncontract TestExchange is\n    IUniswapExchange\n{\n    address public tokenAddress;\n    string private _nextRevertReason;\n\n    constructor(address _tokenAddress) public {\n        tokenAddress = _tokenAddress;\n    }\n\n    function setFillBehavior(\n        string calldata revertReason\n    )\n        external\n        payable\n    {\n        _nextRevertReason = revertReason;\n    }\n\n    function ethToTokenTransferInput(\n        uint256 minTokensBought,\n        uint256 deadline,\n        address recipient\n    )\n        external\n        payable\n        returns (uint256 tokensBought)\n    {\n        TestEventsRaiser(msg.sender).raiseEthToTokenTransferInput(\n            minTokensBought,\n            deadline,\n            recipient\n        );\n        _revertIfReasonExists();\n        return address(this).balance;\n    }\n\n    function tokenToEthSwapInput(\n        uint256 tokensSold,\n        uint256 minEthBought,\n        uint256 deadline\n    )\n        external\n        returns (uint256 ethBought)\n    {\n        TestEventsRaiser(msg.sender).raiseTokenToEthSwapInput(\n            tokensSold,\n            minEthBought,\n            deadline\n        );\n        _revertIfReasonExists();\n        uint256 fillAmount = address(this).balance;\n        msg.sender.transfer(fillAmount);\n        return fillAmount;\n    }\n\n    function tokenToTokenTransferInput(\n        uint256 tokensSold,\n        uint256 minTokensBought,\n        uint256 minEthBought,\n        uint256 deadline,\n        address recipient,\n        address toTokenAddress\n    )\n        external\n        returns (uint256 tokensBought)\n    {\n        TestEventsRaiser(msg.sender).raiseTokenToTokenTransferInput(\n            tokensSold,\n            minTokensBought,\n            minEthBought,\n            deadline,\n            recipient,\n            toTokenAddress\n        );\n        _revertIfReasonExists();\n        return address(this).balance;\n    }\n\n    function toTokenAddress()\n        external\n        view\n        returns (address _tokenAddress)\n    {\n        return tokenAddress;\n    }\n\n    function _revertIfReasonExists()\n        private\n        view\n    {\n        if (bytes(_nextRevertReason).length != 0) {\n            revert(_nextRevertReason);\n        }\n    }\n}\n\n\n/// @dev UniswapBridge overridden to mock tokens and implement IUniswapExchangeFactory.\ncontract TestUniswapBridge is\n    IUniswapExchangeFactory,\n    TestEventsRaiser,\n    UniswapBridge\n{\n    TestToken public wethToken;\n    // Token address to TestToken instance.\n    mapping (address => TestToken) private _testTokens;\n    // Token address to TestExchange instance.\n    mapping (address => TestExchange) private _testExchanges;\n\n    constructor() public {\n        wethToken = new TestToken();\n        _testTokens[address(wethToken)] = wethToken;\n    }\n\n    /// @dev Sets the balance of this contract for an existing token.\n    ///      The wei attached will be the balance.\n    function setTokenBalance(address tokenAddress)\n        external\n        payable\n    {\n        TestToken token = _testTokens[tokenAddress];\n        token.deposit.value(msg.value)();\n    }\n\n    /// @dev Sets the revert reason for an existing token.\n    function setTokenRevertReason(address tokenAddress, string calldata revertReason)\n        external\n    {\n        TestToken token = _testTokens[tokenAddress];\n        token.setRevertReason(revertReason);\n    }\n\n    /// @dev Create a token and exchange (if they don't exist) for a new token\n    ///      and sets the exchange revert and fill behavior. The wei attached\n    ///      will be the fill amount for the exchange.\n    /// @param tokenAddress The token address. If zero, one will be created.\n    /// @param revertReason The revert reason for exchange operations.\n    function createTokenAndExchange(\n        address tokenAddress,\n        string calldata revertReason\n    )\n        external\n        payable\n        returns (TestToken token, TestExchange exchange)\n    {\n        token = TestToken(tokenAddress);\n        if (tokenAddress == address(0)) {\n            token = new TestToken();\n        }\n        _testTokens[address(token)] = token;\n        exchange = _testExchanges[address(token)];\n        if (address(exchange) == address(0)) {\n            _testExchanges[address(token)] = exchange = new TestExchange(address(token));\n        }\n        exchange.setFillBehavior.value(msg.value)(revertReason);\n        return (token, exchange);\n    }\n\n    /// @dev `IUniswapExchangeFactory.getExchange`\n    function getExchange(address tokenAddress)\n        external\n        view\n        returns (address)\n    {\n        return address(_testExchanges[tokenAddress]);\n    }\n\n    // @dev Use `wethToken`.\n    function _getWethAddress()\n        internal\n        view\n        returns (address)\n    {\n        return address(wethToken);\n    }\n\n    // @dev This contract will double as the Uniswap contract.\n    function _getUniswapExchangeFactoryAddress()\n        internal\n        view\n        returns (address)\n    {\n        return address(this);\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",
        "@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/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/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/bridges/UniswapBridge.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 \"@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 \"../interfaces/IUniswapExchangeFactory.sol\";\nimport \"../interfaces/IUniswapExchange.sol\";\nimport \"../interfaces/IERC20Bridge.sol\";\n\n\n// solhint-disable space-after-comma\n// solhint-disable not-rely-on-time\ncontract UniswapBridge is\n    IERC20Bridge,\n    IWallet,\n    DeploymentConstants\n{\n    // Struct to hold `bridgeTransferFrom()` local variables in memory and to avoid\n    // stack overflows.\n    struct TransferState {\n        IUniswapExchange exchange;\n        uint256 fromTokenBalance;\n        IEtherToken weth;\n        uint256 boughtAmount;\n    }\n\n    // solhint-disable no-empty-blocks\n    /// @dev Payable fallback to receive ETH from uniswap.\n    function ()\n        external\n        payable\n    {}\n\n    /// @dev Callback for `IERC20Bridge`. Tries to buy `amount` of\n    ///      `toTokenAddress` tokens by selling the entirety of the `fromTokenAddress`\n    ///      token encoded in the bridge data.\n    /// @param toTokenAddress The token to buy and transfer 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-encoded \"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        // State memory object to avoid stack overflows.\n        TransferState memory state;\n        // Decode the bridge data to get the `fromTokenAddress`.\n        (address fromTokenAddress) = abi.decode(bridgeData, (address));\n\n        // Just transfer the tokens if they're the same.\n        if (fromTokenAddress == toTokenAddress) {\n            LibERC20Token.transfer(fromTokenAddress, to, amount);\n            return BRIDGE_SUCCESS;\n        }\n\n        // Get the exchange for the token pair.\n        state.exchange = _getUniswapExchangeForTokenPair(\n            fromTokenAddress,\n            toTokenAddress\n        );\n        // Get our balance of `fromTokenAddress` token.\n        state.fromTokenBalance = IERC20Token(fromTokenAddress).balanceOf(address(this));\n        // Get the weth contract.\n        state.weth = IEtherToken(_getWethAddress());\n\n        // Convert from WETH to a token.\n        if (fromTokenAddress == address(state.weth)) {\n            // Unwrap the WETH.\n            state.weth.withdraw(state.fromTokenBalance);\n            // Buy as much of `toTokenAddress` token with ETH as possible and\n            // transfer it to `to`.\n            state.boughtAmount = state.exchange.ethToTokenTransferInput.value(state.fromTokenBalance)(\n                // Minimum buy amount.\n                amount,\n                // Expires after this block.\n                block.timestamp,\n                // Recipient is `to`.\n                to\n            );\n\n        // Convert from a token to WETH.\n        } else if (toTokenAddress == address(state.weth)) {\n            // Grant the exchange an allowance.\n            _grantExchangeAllowance(state.exchange, fromTokenAddress, state.fromTokenBalance);\n            // Buy as much ETH with `fromTokenAddress` token as possible.\n            state.boughtAmount = state.exchange.tokenToEthSwapInput(\n                // Sell all tokens we hold.\n                state.fromTokenBalance,\n                // Minimum buy amount.\n                amount,\n                // Expires after this block.\n                block.timestamp\n            );\n            // Wrap the ETH.\n            state.weth.deposit.value(state.boughtAmount)();\n            // Transfer the WETH to `to`.\n            IEtherToken(toTokenAddress).transfer(to, state.boughtAmount);\n\n        // Convert from one token to another.\n        } else {\n            // Grant the exchange an allowance.\n            _grantExchangeAllowance(state.exchange, fromTokenAddress, state.fromTokenBalance);\n            // Buy as much `toTokenAddress` token with `fromTokenAddress` token\n            // and transfer it to `to`.\n            state.boughtAmount = state.exchange.tokenToTokenTransferInput(\n                // Sell all tokens we hold.\n                state.fromTokenBalance,\n                // Minimum buy amount.\n                amount,\n                // Must buy at least 1 intermediate ETH.\n                1,\n                // Expires after this block.\n                block.timestamp,\n                // Recipient is `to`.\n                to,\n                // Convert to `toTokenAddress`.\n                toTokenAddress\n            );\n        }\n\n        emit ERC20BridgeTransfer(\n            fromTokenAddress,\n            toTokenAddress,\n            state.fromTokenBalance,\n            state.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 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    /// @dev Grants an unlimited allowance to the exchange for its token\n    ///      on behalf of this contract.\n    /// @param exchange The Uniswap token exchange.\n    /// @param tokenAddress The token address for the exchange.\n    /// @param minimumAllowance The minimum necessary allowance.\n    function _grantExchangeAllowance(\n        IUniswapExchange exchange,\n        address tokenAddress,\n        uint256 minimumAllowance\n    )\n        private\n    {\n        LibERC20Token.approveIfBelow(\n            tokenAddress,\n            address(exchange),\n            minimumAllowance\n        );\n    }\n\n    /// @dev Retrieves the uniswap exchange for a given token pair.\n    ///      In the case of a WETH-token exchange, this will be the non-WETH token.\n    ///      In th ecase of a token-token exchange, this will be the first token.\n    /// @param fromTokenAddress The address of the token we are converting from.\n    /// @param toTokenAddress The address of the token we are converting to.\n    /// @return exchange The uniswap exchange.\n    function _getUniswapExchangeForTokenPair(\n        address fromTokenAddress,\n        address toTokenAddress\n    )\n        private\n        view\n        returns (IUniswapExchange exchange)\n    {\n        address exchangeTokenAddress = fromTokenAddress;\n        // Whichever isn't WETH is the exchange token.\n        if (fromTokenAddress == _getWethAddress()) {\n            exchangeTokenAddress = toTokenAddress;\n        }\n        exchange = IUniswapExchange(\n            IUniswapExchangeFactory(_getUniswapExchangeFactoryAddress())\n            .getExchange(exchangeTokenAddress)\n        );\n        require(address(exchange) != address(0), \"NO_UNISWAP_EXCHANGE_FOR_TOKEN\");\n        return exchange;\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/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",
        "../src/interfaces/IUniswapExchangeFactory.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 \"./IUniswapExchange.sol\";\n\n\ninterface IUniswapExchangeFactory {\n\n    /// @dev Get the exchange for a token.\n    /// @param tokenAddress The address of the token contract.\n    function getExchange(address tokenAddress)\n        external\n        view\n        returns (address);\n}\n",
        "../src/interfaces/IUniswapExchange.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 IUniswapExchange {\n\n    /// @dev Buys at least `minTokensBought` tokens with ETH and transfer them\n    ///      to `recipient`.\n    /// @param minTokensBought The minimum number of tokens to buy.\n    /// @param deadline Time when this order expires.\n    /// @param recipient Who to transfer the tokens to.\n    /// @return tokensBought Amount of tokens bought.\n    function ethToTokenTransferInput(\n        uint256 minTokensBought,\n        uint256 deadline,\n        address recipient\n    )\n        external\n        payable\n        returns (uint256 tokensBought);\n\n    /// @dev Buys at least `minEthBought` ETH with tokens.\n    /// @param tokensSold Amount of tokens to sell.\n    /// @param minEthBought The minimum amount of ETH to buy.\n    /// @param deadline Time when this order expires.\n    /// @return ethBought Amount of tokens bought.\n    function tokenToEthSwapInput(\n        uint256 tokensSold,\n        uint256 minEthBought,\n        uint256 deadline\n    )\n        external\n        returns (uint256 ethBought);\n\n    /// @dev Buys at least `minTokensBought` tokens with the exchange token\n    ///      and transfer them to `recipient`.\n    /// @param minTokensBought The minimum number of tokens to buy.\n    /// @param minEthBought The minimum amount of intermediate ETH to buy.\n    /// @param deadline Time when this order expires.\n    /// @param recipient Who to transfer the tokens to.\n    /// @param toTokenAddress The token being bought.\n    /// @return tokensBought Amount of tokens bought.\n    function tokenToTokenTransferInput(\n        uint256 tokensSold,\n        uint256 minTokensBought,\n        uint256 minEthBought,\n        uint256 deadline,\n        address recipient,\n        address toTokenAddress\n    )\n        external\n        returns (uint256 tokensBought);\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"
    },
    "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": {}
}
