{
  "id": "d3ceb06e216ac45da60b4ffd2e79da40",
  "_format": "hh-sol-build-info-1",
  "solcVersion": "0.6.12",
  "solcLongVersion": "0.6.12+commit.27d51765",
  "input": {
    "language": "Solidity",
    "sources": {
      "contracts/bentobox/BentoBoxV1.sol": {
        "content": "// SPDX-License-Identifier: UNLICENSED\n// The BentoBox\n\n//  ▄▄▄▄· ▄▄▄ . ▐ ▄ ▄▄▄▄▄      ▄▄▄▄·       ▐▄• ▄\n//  ▐█ ▀█▪▀▄.▀·█▌▐█•██  ▪     ▐█ ▀█▪▪      █▌█▌▪\n//  ▐█▀▀█▄▐▀▀▪▄▐█▐▐▌ ▐█.▪ ▄█▀▄ ▐█▀▀█▄ ▄█▀▄  ·██·\n//  ██▄▪▐█▐█▄▄▌██▐█▌ ▐█▌·▐█▌.▐▌██▄▪▐█▐█▌.▐▌▪▐█·█▌\n//  ·▀▀▀▀  ▀▀▀ ▀▀ █▪ ▀▀▀  ▀█▄▀▪·▀▀▀▀  ▀█▄▀▪•▀▀ ▀▀\n\n// This contract stores funds, handles their transfers, supports flash loans and strategies.\n\n// Copyright (c) 2021 BoringCrypto - All rights reserved\n// Twitter: @Boring_Crypto\n\n// Special thanks to Keno for all his hard work and support\n\n// Version 22-Mar-2021\n\npragma solidity 0.6.12;\npragma experimental ABIEncoderV2;\n\n// solhint-disable avoid-low-level-calls\n// solhint-disable not-rely-on-time\n// solhint-disable no-inline-assembly\n\n// File @boringcrypto/boring-solidity/contracts/interfaces/IERC20.sol@v1.2.0\n// License-Identifier: MIT\n\ninterface IERC20 {\n    function totalSupply() external view returns (uint256);\n\n    function balanceOf(address account) external view returns (uint256);\n\n    function allowance(address owner, address spender) external view returns (uint256);\n\n    function approve(address spender, uint256 amount) external returns (bool);\n\n    event Transfer(address indexed from, address indexed to, uint256 value);\n    event Approval(address indexed owner, address indexed spender, uint256 value);\n\n    /// @notice EIP 2612\n    function permit(\n        address owner,\n        address spender,\n        uint256 value,\n        uint256 deadline,\n        uint8 v,\n        bytes32 r,\n        bytes32 s\n    ) external;\n}\n\n// File contracts/interfaces/IFlashLoan.sol\n// License-Identifier: MIT\n\ninterface IFlashBorrower {\n    /// @notice The flashloan callback. `amount` + `fee` needs to repayed to msg.sender before this call returns.\n    /// @param sender The address of the invoker of this flashloan.\n    /// @param token The address of the token that is loaned.\n    /// @param amount of the `token` that is loaned.\n    /// @param fee The fee that needs to be paid on top for this loan. Needs to be the same as `token`.\n    /// @param data Additional data that was passed to the flashloan function.\n    function onFlashLoan(\n        address sender,\n        IERC20 token,\n        uint256 amount,\n        uint256 fee,\n        bytes calldata data\n    ) external;\n}\n\ninterface IBatchFlashBorrower {\n    /// @notice The callback for batched flashloans. Every amount + fee needs to repayed to msg.sender before this call returns.\n    /// @param sender The address of the invoker of this flashloan.\n    /// @param tokens Array of addresses for ERC-20 tokens that is loaned.\n    /// @param amounts A one-to-one map to `tokens` that is loaned.\n    /// @param fees A one-to-one map to `tokens` that needs to be paid on top for each loan. Needs to be the same token.\n    /// @param data Additional data that was passed to the flashloan function.\n    function onBatchFlashLoan(\n        address sender,\n        IERC20[] calldata tokens,\n        uint256[] calldata amounts,\n        uint256[] calldata fees,\n        bytes calldata data\n    ) external;\n}\n\n// File contracts/interfaces/IWETH.sol\n// License-Identifier: MIT\n\ninterface IWETH {\n    function deposit() external payable;\n\n    function withdraw(uint256) external;\n}\n\n// File contracts/interfaces/IStrategy.sol\n// License-Identifier: MIT\n\ninterface IStrategy {\n    /// @notice Send the assets to the Strategy and call skim to invest them.\n    /// @param amount The amount of tokens to invest.\n    function skim(uint256 amount) external;\n\n    /// @notice Harvest any profits made converted to the asset and pass them to the caller.\n    /// @param balance The amount of tokens the caller thinks it has invested.\n    /// @param sender The address of the initiator of this transaction. Can be used for reimbursements, etc.\n    /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.\n    function harvest(uint256 balance, address sender) external returns (int256 amountAdded);\n\n    /// @notice Withdraw assets. The returned amount can differ from the requested amount due to rounding.\n    /// @dev The `actualAmount` should be very close to the amount.\n    /// The difference should NOT be used to report a loss. That's what harvest is for.\n    /// @param amount The requested amount the caller wants to withdraw.\n    /// @return actualAmount The real amount that is withdrawn.\n    function withdraw(uint256 amount) external returns (uint256 actualAmount);\n\n    /// @notice Withdraw all assets in the safest way possible. This shouldn't fail.\n    /// @param balance The amount of tokens the caller thinks it has invested.\n    /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.\n    function exit(uint256 balance) external returns (int256 amountAdded);\n}\n\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol@v1.2.0\n// License-Identifier: MIT\n\nlibrary BoringERC20 {\n    bytes4 private constant SIG_SYMBOL = 0x95d89b41; // symbol()\n    bytes4 private constant SIG_NAME = 0x06fdde03; // name()\n    bytes4 private constant SIG_DECIMALS = 0x313ce567; // decimals()\n    bytes4 private constant SIG_TRANSFER = 0xa9059cbb; // transfer(address,uint256)\n    bytes4 private constant SIG_TRANSFER_FROM = 0x23b872dd; // transferFrom(address,address,uint256)\n\n    /// @notice Provides a safe ERC20.transfer version for different ERC-20 implementations.\n    /// Reverts on a failed transfer.\n    /// @param token The address of the ERC-20 token.\n    /// @param to Transfer tokens to.\n    /// @param amount The token amount.\n    function safeTransfer(\n        IERC20 token,\n        address to,\n        uint256 amount\n    ) internal {\n        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER, to, amount));\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \"BoringERC20: Transfer failed\");\n    }\n\n    /// @notice Provides a safe ERC20.transferFrom version for different ERC-20 implementations.\n    /// Reverts on a failed transfer.\n    /// @param token The address of the ERC-20 token.\n    /// @param from Transfer tokens from.\n    /// @param to Transfer tokens to.\n    /// @param amount The token amount.\n    function safeTransferFrom(\n        IERC20 token,\n        address from,\n        address to,\n        uint256 amount\n    ) internal {\n        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER_FROM, from, to, amount));\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \"BoringERC20: TransferFrom failed\");\n    }\n}\n\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringMath.sol@v1.2.0\n// License-Identifier: MIT\n\n/// @notice A library for performing overflow-/underflow-safe math,\n/// updated with awesomeness from of DappHub (https://github.com/dapphub/ds-math).\nlibrary BoringMath {\n    function add(uint256 a, uint256 b) internal pure returns (uint256 c) {\n        require((c = a + b) >= b, \"BoringMath: Add Overflow\");\n    }\n\n    function sub(uint256 a, uint256 b) internal pure returns (uint256 c) {\n        require((c = a - b) <= a, \"BoringMath: Underflow\");\n    }\n\n    function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {\n        require(b == 0 || (c = a * b) / b == a, \"BoringMath: Mul Overflow\");\n    }\n\n    function to128(uint256 a) internal pure returns (uint128 c) {\n        require(a <= uint128(-1), \"BoringMath: uint128 Overflow\");\n        c = uint128(a);\n    }\n\n    function to64(uint256 a) internal pure returns (uint64 c) {\n        require(a <= uint64(-1), \"BoringMath: uint64 Overflow\");\n        c = uint64(a);\n    }\n\n    function to32(uint256 a) internal pure returns (uint32 c) {\n        require(a <= uint32(-1), \"BoringMath: uint32 Overflow\");\n        c = uint32(a);\n    }\n}\n\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint128.\nlibrary BoringMath128 {\n    function add(uint128 a, uint128 b) internal pure returns (uint128 c) {\n        require((c = a + b) >= b, \"BoringMath: Add Overflow\");\n    }\n\n    function sub(uint128 a, uint128 b) internal pure returns (uint128 c) {\n        require((c = a - b) <= a, \"BoringMath: Underflow\");\n    }\n}\n\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint64.\nlibrary BoringMath64 {\n    function add(uint64 a, uint64 b) internal pure returns (uint64 c) {\n        require((c = a + b) >= b, \"BoringMath: Add Overflow\");\n    }\n\n    function sub(uint64 a, uint64 b) internal pure returns (uint64 c) {\n        require((c = a - b) <= a, \"BoringMath: Underflow\");\n    }\n}\n\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint32.\nlibrary BoringMath32 {\n    function add(uint32 a, uint32 b) internal pure returns (uint32 c) {\n        require((c = a + b) >= b, \"BoringMath: Add Overflow\");\n    }\n\n    function sub(uint32 a, uint32 b) internal pure returns (uint32 c) {\n        require((c = a - b) <= a, \"BoringMath: Underflow\");\n    }\n}\n\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringRebase.sol@v1.2.0\n// License-Identifier: MIT\n\nstruct Rebase {\n    uint128 elastic;\n    uint128 base;\n}\n\n/// @notice A rebasing library using overflow-/underflow-safe math.\nlibrary RebaseLibrary {\n    using BoringMath for uint256;\n    using BoringMath128 for uint128;\n\n    /// @notice Calculates the base value in relationship to `elastic` and `total`.\n    function toBase(\n        Rebase memory total,\n        uint256 elastic,\n        bool roundUp\n    ) internal pure returns (uint256 base) {\n        if (total.elastic == 0) {\n            base = elastic;\n        } else {\n            base = elastic.mul(total.base) / total.elastic;\n            if (roundUp && base.mul(total.elastic) / total.base < elastic) {\n                base = base.add(1);\n            }\n        }\n    }\n\n    /// @notice Calculates the elastic value in relationship to `base` and `total`.\n    function toElastic(\n        Rebase memory total,\n        uint256 base,\n        bool roundUp\n    ) internal pure returns (uint256 elastic) {\n        if (total.base == 0) {\n            elastic = base;\n        } else {\n            elastic = base.mul(total.elastic) / total.base;\n            if (roundUp && elastic.mul(total.base) / total.elastic < base) {\n                elastic = elastic.add(1);\n            }\n        }\n    }\n\n    /// @notice Add `elastic` to `total` and doubles `total.base`.\n    /// @return (Rebase) The new total.\n    /// @return base in relationship to `elastic`.\n    function add(\n        Rebase memory total,\n        uint256 elastic,\n        bool roundUp\n    ) internal pure returns (Rebase memory, uint256 base) {\n        base = toBase(total, elastic, roundUp);\n        total.elastic = total.elastic.add(elastic.to128());\n        total.base = total.base.add(base.to128());\n        return (total, base);\n    }\n\n    /// @notice Sub `base` from `total` and update `total.elastic`.\n    /// @return (Rebase) The new total.\n    /// @return elastic in relationship to `base`.\n    function sub(\n        Rebase memory total,\n        uint256 base,\n        bool roundUp\n    ) internal pure returns (Rebase memory, uint256 elastic) {\n        elastic = toElastic(total, base, roundUp);\n        total.elastic = total.elastic.sub(elastic.to128());\n        total.base = total.base.sub(base.to128());\n        return (total, elastic);\n    }\n\n    /// @notice Add `elastic` and `base` to `total`.\n    function add(\n        Rebase memory total,\n        uint256 elastic,\n        uint256 base\n    ) internal pure returns (Rebase memory) {\n        total.elastic = total.elastic.add(elastic.to128());\n        total.base = total.base.add(base.to128());\n        return total;\n    }\n\n    /// @notice Subtract `elastic` and `base` to `total`.\n    function sub(\n        Rebase memory total,\n        uint256 elastic,\n        uint256 base\n    ) internal pure returns (Rebase memory) {\n        total.elastic = total.elastic.sub(elastic.to128());\n        total.base = total.base.sub(base.to128());\n        return total;\n    }\n\n    /// @notice Add `elastic` to `total` and update storage.\n    /// @return newElastic Returns updated `elastic`.\n    function addElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {\n        newElastic = total.elastic = total.elastic.add(elastic.to128());\n    }\n\n    /// @notice Subtract `elastic` from `total` and update storage.\n    /// @return newElastic Returns updated `elastic`.\n    function subElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {\n        newElastic = total.elastic = total.elastic.sub(elastic.to128());\n    }\n}\n\n// File @boringcrypto/boring-solidity/contracts/BoringOwnable.sol@v1.2.0\n// License-Identifier: MIT\n\n// Source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol + Claimable.sol\n// Edited by BoringCrypto\n\ncontract BoringOwnableData {\n    address public owner;\n    address public pendingOwner;\n}\n\ncontract BoringOwnable is BoringOwnableData {\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n    /// @notice `owner` defaults to msg.sender on construction.\n    constructor() public {\n        owner = msg.sender;\n        emit OwnershipTransferred(address(0), msg.sender);\n    }\n\n    /// @notice Transfers ownership to `newOwner`. Either directly or claimable by the new pending owner.\n    /// Can only be invoked by the current `owner`.\n    /// @param newOwner Address of the new owner.\n    /// @param direct True if `newOwner` should be set immediately. False if `newOwner` needs to use `claimOwnership`.\n    /// @param renounce Allows the `newOwner` to be `address(0)` if `direct` and `renounce` is True. Has no effect otherwise.\n    function transferOwnership(\n        address newOwner,\n        bool direct,\n        bool renounce\n    ) public onlyOwner {\n        if (direct) {\n            // Checks\n            require(newOwner != address(0) || renounce, \"Ownable: zero address\");\n\n            // Effects\n            emit OwnershipTransferred(owner, newOwner);\n            owner = newOwner;\n            pendingOwner = address(0);\n        } else {\n            // Effects\n            pendingOwner = newOwner;\n        }\n    }\n\n    /// @notice Needs to be called by `pendingOwner` to claim ownership.\n    function claimOwnership() public {\n        address _pendingOwner = pendingOwner;\n\n        // Checks\n        require(msg.sender == _pendingOwner, \"Ownable: caller != pending owner\");\n\n        // Effects\n        emit OwnershipTransferred(owner, _pendingOwner);\n        owner = _pendingOwner;\n        pendingOwner = address(0);\n    }\n\n    /// @notice Only allows the `owner` to execute the function.\n    modifier onlyOwner() {\n        require(msg.sender == owner, \"Ownable: caller is not the owner\");\n        _;\n    }\n}\n\n// File @boringcrypto/boring-solidity/contracts/interfaces/IMasterContract.sol@v1.2.0\n// License-Identifier: MIT\n\ninterface IMasterContract {\n    /// @notice Init function that gets called from `BoringFactory.deploy`.\n    /// Also kown as the constructor for cloned contracts.\n    /// Any ETH send to `BoringFactory.deploy` ends up here.\n    /// @param data Can be abi encoded arguments or anything else.\n    function init(bytes calldata data) external payable;\n}\n\n// File @boringcrypto/boring-solidity/contracts/BoringFactory.sol@v1.2.0\n// License-Identifier: MIT\n\ncontract BoringFactory {\n    event LogDeploy(address indexed masterContract, bytes data, address indexed cloneAddress);\n\n    /// @notice Mapping from clone contracts to their masterContract.\n    mapping(address => address) public masterContractOf;\n\n    /// @notice Deploys a given master Contract as a clone.\n    /// Any ETH transferred with this call is forwarded to the new clone.\n    /// Emits `LogDeploy`.\n    /// @param masterContract The address of the contract to clone.\n    /// @param data Additional abi encoded calldata that is passed to the new clone via `IMasterContract.init`.\n    /// @param useCreate2 Creates the clone by using the CREATE2 opcode, in this case `data` will be used as salt.\n    /// @return cloneAddress Address of the created clone contract.\n    function deploy(\n        address masterContract,\n        bytes calldata data,\n        bool useCreate2\n    ) public payable returns (address cloneAddress) {\n        require(masterContract != address(0), \"BoringFactory: No masterContract\");\n        bytes20 targetBytes = bytes20(masterContract); // Takes the first 20 bytes of the masterContract's address\n\n        if (useCreate2) {\n            // each masterContract has different code already. So clones are distinguished by their data only.\n            bytes32 salt = keccak256(data);\n\n            // Creates clone, more info here: https://blog.openzeppelin.com/deep-dive-into-the-minimal-proxy-contract/\n            assembly {\n                let clone := mload(0x40)\n                mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\n                mstore(add(clone, 0x14), targetBytes)\n                mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\n                cloneAddress := create2(0, clone, 0x37, salt)\n            }\n        } else {\n            assembly {\n                let clone := mload(0x40)\n                mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\n                mstore(add(clone, 0x14), targetBytes)\n                mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\n                cloneAddress := create(0, clone, 0x37)\n            }\n        }\n        masterContractOf[cloneAddress] = masterContract;\n\n        IMasterContract(cloneAddress).init{value: msg.value}(data);\n\n        emit LogDeploy(masterContract, data, cloneAddress);\n    }\n}\n\n// File contracts/MasterContractManager.sol\n// License-Identifier: UNLICENSED\n\ncontract MasterContractManager is BoringOwnable, BoringFactory {\n    event LogWhiteListMasterContract(address indexed masterContract, bool approved);\n    event LogSetMasterContractApproval(address indexed masterContract, address indexed user, bool approved);\n    event LogRegisterProtocol(address indexed protocol);\n\n    /// @notice masterContract to user to approval state\n    mapping(address => mapping(address => bool)) public masterContractApproved;\n    /// @notice masterContract to whitelisted state for approval without signed message\n    mapping(address => bool) public whitelistedMasterContracts;\n    /// @notice user nonces for masterContract approvals\n    mapping(address => uint256) public nonces;\n\n    bytes32 private constant DOMAIN_SEPARATOR_SIGNATURE_HASH = keccak256(\"EIP712Domain(string name,uint256 chainId,address verifyingContract)\");\n    // See https://eips.ethereum.org/EIPS/eip-191\n    string private constant EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA = \"\\x19\\x01\";\n    bytes32 private constant APPROVAL_SIGNATURE_HASH =\n        keccak256(\"SetMasterContractApproval(string warning,address user,address masterContract,bool approved,uint256 nonce)\");\n\n    // solhint-disable-next-line var-name-mixedcase\n    bytes32 private immutable _DOMAIN_SEPARATOR;\n    // solhint-disable-next-line var-name-mixedcase\n    uint256 private immutable DOMAIN_SEPARATOR_CHAIN_ID;\n\n    constructor() public {\n        uint256 chainId;\n        assembly {\n            chainId := chainid()\n        }\n        _DOMAIN_SEPARATOR = _calculateDomainSeparator(DOMAIN_SEPARATOR_CHAIN_ID = chainId);\n    }\n\n    function _calculateDomainSeparator(uint256 chainId) private view returns (bytes32) {\n        return keccak256(abi.encode(DOMAIN_SEPARATOR_SIGNATURE_HASH, keccak256(\"BentoBox V1\"), chainId, address(this)));\n    }\n\n    // solhint-disable-next-line func-name-mixedcase\n    function DOMAIN_SEPARATOR() public view returns (bytes32) {\n        uint256 chainId;\n        assembly {\n            chainId := chainid()\n        }\n        return chainId == DOMAIN_SEPARATOR_CHAIN_ID ? _DOMAIN_SEPARATOR : _calculateDomainSeparator(chainId);\n    }\n\n    /// @notice Other contracts need to register with this master contract so that users can approve them for the BentoBox.\n    function registerProtocol() public {\n        masterContractOf[msg.sender] = msg.sender;\n        emit LogRegisterProtocol(msg.sender);\n    }\n\n    /// @notice Enables or disables a contract for approval without signed message.\n    function whitelistMasterContract(address masterContract, bool approved) public onlyOwner {\n        // Checks\n        require(masterContract != address(0), \"MasterCMgr: Cannot approve 0\");\n\n        // Effects\n        whitelistedMasterContracts[masterContract] = approved;\n        emit LogWhiteListMasterContract(masterContract, approved);\n    }\n\n    /// @notice Approves or revokes a `masterContract` access to `user` funds.\n    /// @param user The address of the user that approves or revokes access.\n    /// @param masterContract The address who gains or loses access.\n    /// @param approved If True approves access. If False revokes access.\n    /// @param v Part of the signature. (See EIP-191)\n    /// @param r Part of the signature. (See EIP-191)\n    /// @param s Part of the signature. (See EIP-191)\n    // F4 - Check behaviour for all function arguments when wrong or extreme\n    // F4: Don't allow masterContract 0 to be approved. Unknown contracts will have a masterContract of 0.\n    // F4: User can't be 0 for signed approvals because the recoveredAddress will be 0 if ecrecover fails\n    function setMasterContractApproval(\n        address user,\n        address masterContract,\n        bool approved,\n        uint8 v,\n        bytes32 r,\n        bytes32 s\n    ) public {\n        // Checks\n        require(masterContract != address(0), \"MasterCMgr: masterC not set\"); // Important for security\n\n        // If no signature is provided, the fallback is executed\n        if (r == 0 && s == 0 && v == 0) {\n            require(user == msg.sender, \"MasterCMgr: user not sender\");\n            require(masterContractOf[user] == address(0), \"MasterCMgr: user is clone\");\n            require(whitelistedMasterContracts[masterContract], \"MasterCMgr: not whitelisted\");\n        } else {\n            // Important for security - any address without masterContract has address(0) as masterContract\n            // So approving address(0) would approve every address, leading to full loss of funds\n            // Also, ecrecover returns address(0) on failure. So we check this:\n            require(user != address(0), \"MasterCMgr: User cannot be 0\");\n\n            // C10 - Protect signatures against replay, use nonce and chainId (SWC-121)\n            // C10: nonce + chainId are used to prevent replays\n            // C11 - All signatures strictly EIP-712 (SWC-117 SWC-122)\n            // C11: signature is EIP-712 compliant\n            // C12 - abi.encodePacked can't contain variable length user input (SWC-133)\n            // C12: abi.encodePacked has fixed length parameters\n            bytes32 digest =\n                keccak256(\n                    abi.encodePacked(\n                        EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA,\n                        DOMAIN_SEPARATOR(),\n                        keccak256(\n                            abi.encode(\n                                APPROVAL_SIGNATURE_HASH,\n                                approved\n                                    ? keccak256(\"Give FULL access to funds in (and approved to) BentoBox?\")\n                                    : keccak256(\"Revoke access to BentoBox?\"),\n                                user,\n                                masterContract,\n                                approved,\n                                nonces[user]++\n                            )\n                        )\n                    )\n                );\n            address recoveredAddress = ecrecover(digest, v, r, s);\n            require(recoveredAddress == user, \"MasterCMgr: Invalid Signature\");\n        }\n\n        // Effects\n        masterContractApproved[masterContract][user] = approved;\n        emit LogSetMasterContractApproval(masterContract, user, approved);\n    }\n}\n\n// File @boringcrypto/boring-solidity/contracts/BoringBatchable.sol@v1.2.0\n// License-Identifier: MIT\n\ncontract BaseBoringBatchable {\n    /// @dev Helper function to extract a useful revert message from a failed call.\n    /// If the returned data is malformed or not correctly abi encoded then this call can fail itself.\n    function _getRevertMsg(bytes memory _returnData) internal pure returns (string memory) {\n        // If the _res length is less than 68, then the transaction failed silently (without a revert message)\n        if (_returnData.length < 68) return \"Transaction reverted silently\";\n\n        assembly {\n            // Slice the sighash.\n            _returnData := add(_returnData, 0x04)\n        }\n        return abi.decode(_returnData, (string)); // All that remains is the revert string\n    }\n\n    /// @notice Allows batched call to self (this contract).\n    /// @param calls An array of inputs for each call.\n    /// @param revertOnFail If True then reverts after a failed call and stops doing further calls.\n    /// @return successes An array indicating the success of a call, mapped one-to-one to `calls`.\n    /// @return results An array with the returned data of each function call, mapped one-to-one to `calls`.\n    // F1: External is ok here because this is the batch function, adding it to a batch makes no sense\n    // F2: Calls in the batch may be payable, delegatecall operates in the same context, so each call in the batch has access to msg.value\n    // C3: The length of the loop is fully under user control, so can't be exploited\n    // C7: Delegatecall is only used on the same contract, so it's safe\n    function batch(bytes[] calldata calls, bool revertOnFail) external payable returns (bool[] memory successes, bytes[] memory results) {\n        successes = new bool[](calls.length);\n        results = new bytes[](calls.length);\n        for (uint256 i = 0; i < calls.length; i++) {\n            (bool success, bytes memory result) = address(this).delegatecall(calls[i]);\n            require(success || !revertOnFail, _getRevertMsg(result));\n            successes[i] = success;\n            results[i] = result;\n        }\n    }\n}\n\ncontract BoringBatchable is BaseBoringBatchable {\n    /// @notice Call wrapper that performs `ERC20.permit` on `token`.\n    /// Lookup `IERC20.permit`.\n    // F6: Parameters can be used front-run the permit and the user's permit will fail (due to nonce or other revert)\n    //     if part of a batch this could be used to grief once as the second call would not need the permit\n    function permitToken(\n        IERC20 token,\n        address from,\n        address to,\n        uint256 amount,\n        uint256 deadline,\n        uint8 v,\n        bytes32 r,\n        bytes32 s\n    ) public {\n        token.permit(from, to, amount, deadline, v, r, s);\n    }\n}\n\n// File contracts/BentoBox.sol\n// License-Identifier: UNLICENSED\n\n/// @title BentoBox\n/// @author BoringCrypto, Keno\n/// @notice The BentoBox is a vault for tokens. The stored tokens can be flash loaned and used in strategies.\n/// Yield from this will go to the token depositors.\n/// Rebasing tokens ARE NOT supported and WILL cause loss of funds.\n/// Any funds transfered directly onto the BentoBox will be lost, use the deposit function instead.\ncontract BentoBoxV1 is MasterContractManager, BoringBatchable {\n    using BoringMath for uint256;\n    using BoringMath128 for uint128;\n    using BoringERC20 for IERC20;\n    using RebaseLibrary for Rebase;\n\n    // ************** //\n    // *** EVENTS *** //\n    // ************** //\n\n    event LogDeposit(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\n    event LogWithdraw(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\n    event LogTransfer(IERC20 indexed token, address indexed from, address indexed to, uint256 share);\n\n    event LogFlashLoan(address indexed borrower, IERC20 indexed token, uint256 amount, uint256 feeAmount, address indexed receiver);\n\n    event LogStrategyTargetPercentage(IERC20 indexed token, uint256 targetPercentage);\n    event LogStrategyQueued(IERC20 indexed token, IStrategy indexed strategy);\n    event LogStrategySet(IERC20 indexed token, IStrategy indexed strategy);\n    event LogStrategyInvest(IERC20 indexed token, uint256 amount);\n    event LogStrategyDivest(IERC20 indexed token, uint256 amount);\n    event LogStrategyProfit(IERC20 indexed token, uint256 amount);\n    event LogStrategyLoss(IERC20 indexed token, uint256 amount);\n\n    // *************** //\n    // *** STRUCTS *** //\n    // *************** //\n\n    struct StrategyData {\n        uint64 strategyStartDate;\n        uint64 targetPercentage;\n        uint128 balance; // the balance of the strategy that BentoBox thinks is in there\n    }\n\n    // ******************************** //\n    // *** CONSTANTS AND IMMUTABLES *** //\n    // ******************************** //\n\n    // V2 - Can they be private?\n    // V2: Private to save gas, to verify it's correct, check the constructor arguments\n    IERC20 private immutable wethToken;\n\n    IERC20 private constant USE_ETHEREUM = IERC20(0);\n    uint256 private constant FLASH_LOAN_FEE = 50; // 0.05%\n    uint256 private constant FLASH_LOAN_FEE_PRECISION = 1e5;\n    uint256 private constant STRATEGY_DELAY = 2 weeks;\n    uint256 private constant MAX_TARGET_PERCENTAGE = 95; // 95%\n    uint256 private constant MINIMUM_SHARE_BALANCE = 1000; // To prevent the ratio going off\n\n    // ***************** //\n    // *** VARIABLES *** //\n    // ***************** //\n\n    // Balance per token per address/contract in shares\n    mapping(IERC20 => mapping(address => uint256)) public balanceOf;\n\n    // Rebase from amount to share\n    mapping(IERC20 => Rebase) public totals;\n\n    mapping(IERC20 => IStrategy) public strategy;\n    mapping(IERC20 => IStrategy) public pendingStrategy;\n    mapping(IERC20 => StrategyData) public strategyData;\n\n    // ******************* //\n    // *** CONSTRUCTOR *** //\n    // ******************* //\n\n    constructor(IERC20 wethToken_) public {\n        wethToken = wethToken_;\n    }\n\n    // ***************** //\n    // *** MODIFIERS *** //\n    // ***************** //\n\n    /// Modifier to check if the msg.sender is allowed to use funds belonging to the 'from' address.\n    /// If 'from' is msg.sender, it's allowed.\n    /// If 'from' is the BentoBox itself, it's allowed. Any ETH, token balances (above the known balances) or BentoBox balances\n    /// can be taken by anyone.\n    /// This is to enable skimming, not just for deposits, but also for withdrawals or transfers, enabling better composability.\n    /// If 'from' is a clone of a masterContract AND the 'from' address has approved that masterContract, it's allowed.\n    modifier allowed(address from) {\n        if (from != msg.sender && from != address(this)) {\n            // From is sender or you are skimming\n            address masterContract = masterContractOf[msg.sender];\n            require(masterContract != address(0), \"BentoBox: no masterContract\");\n            require(masterContractApproved[masterContract][from], \"BentoBox: Transfer not approved\");\n        }\n        _;\n    }\n\n    // ************************** //\n    // *** INTERNAL FUNCTIONS *** //\n    // ************************** //\n\n    /// @dev Returns the total balance of `token` this contracts holds,\n    /// plus the total amount this contract thinks the strategy holds.\n    function _tokenBalanceOf(IERC20 token) internal view returns (uint256 amount) {\n        amount = token.balanceOf(address(this)).add(strategyData[token].balance);\n    }\n\n    // ************************ //\n    // *** PUBLIC FUNCTIONS *** //\n    // ************************ //\n\n    /// @dev Helper function to represent an `amount` of `token` in shares.\n    /// @param token The ERC-20 token.\n    /// @param amount The `token` amount.\n    /// @param roundUp If the result `share` should be rounded up.\n    /// @return share The token amount represented in shares.\n    function toShare(\n        IERC20 token,\n        uint256 amount,\n        bool roundUp\n    ) external view returns (uint256 share) {\n        share = totals[token].toBase(amount, roundUp);\n    }\n\n    /// @dev Helper function represent shares back into the `token` amount.\n    /// @param token The ERC-20 token.\n    /// @param share The amount of shares.\n    /// @param roundUp If the result should be rounded up.\n    /// @return amount The share amount back into native representation.\n    function toAmount(\n        IERC20 token,\n        uint256 share,\n        bool roundUp\n    ) external view returns (uint256 amount) {\n        amount = totals[token].toElastic(share, roundUp);\n    }\n\n    /// @notice Deposit an amount of `token` represented in either `amount` or `share`.\n    /// @param token_ The ERC-20 token to deposit.\n    /// @param from which account to pull the tokens.\n    /// @param to which account to push the tokens.\n    /// @param amount Token amount in native representation to deposit.\n    /// @param share Token amount represented in shares to deposit. Takes precedence over `amount`.\n    /// @return amountOut The amount deposited.\n    /// @return shareOut The deposited amount repesented in shares.\n    function deposit(\n        IERC20 token_,\n        address from,\n        address to,\n        uint256 amount,\n        uint256 share\n    ) public payable allowed(from) returns (uint256 amountOut, uint256 shareOut) {\n        // Checks\n        require(to != address(0), \"BentoBox: to not set\"); // To avoid a bad UI from burning funds\n\n        // Effects\n        IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;\n        Rebase memory total = totals[token];\n\n        // If a new token gets added, the tokenSupply call checks that this is a deployed contract. Needed for security.\n        require(total.elastic != 0 || token.totalSupply() > 0, \"BentoBox: No tokens\");\n        if (share == 0) {\n            // value of the share may be lower than the amount due to rounding, that's ok\n            share = total.toBase(amount, false);\n            // Any deposit should lead to at least the minimum share balance, otherwise it's ignored (no amount taken)\n            if (total.base.add(share.to128()) < MINIMUM_SHARE_BALANCE) {\n                return (0, 0);\n            }\n        } else {\n            // amount may be lower than the value of share due to rounding, in that case, add 1 to amount (Always round up)\n            amount = total.toElastic(share, true);\n        }\n\n        // In case of skimming, check that only the skimmable amount is taken.\n        // For ETH, the full balance is available, so no need to check.\n        // During flashloans the _tokenBalanceOf is lower than 'reality', so skimming deposits will mostly fail during a flashloan.\n        require(\n            from != address(this) || token_ == USE_ETHEREUM || amount <= _tokenBalanceOf(token).sub(total.elastic),\n            \"BentoBox: Skim too much\"\n        );\n\n        balanceOf[token][to] = balanceOf[token][to].add(share);\n        total.base = total.base.add(share.to128());\n        total.elastic = total.elastic.add(amount.to128());\n        totals[token] = total;\n\n        // Interactions\n        // During the first deposit, we check that this token is 'real'\n        if (token_ == USE_ETHEREUM) {\n            // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)\n            // X2: If the WETH implementation is faulty or malicious, it will block adding ETH (but we know the WETH implementation)\n            IWETH(address(wethToken)).deposit{value: amount}();\n        } else if (from != address(this)) {\n            // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)\n            // X2: If the token implementation is faulty or malicious, it may block adding tokens. Good.\n            token.safeTransferFrom(from, address(this), amount);\n        }\n        emit LogDeposit(token, from, to, amount, share);\n        amountOut = amount;\n        shareOut = share;\n    }\n\n    /// @notice Withdraws an amount of `token` from a user account.\n    /// @param token_ The ERC-20 token to withdraw.\n    /// @param from which user to pull the tokens.\n    /// @param to which user to push the tokens.\n    /// @param amount of tokens. Either one of `amount` or `share` needs to be supplied.\n    /// @param share Like above, but `share` takes precedence over `amount`.\n    function withdraw(\n        IERC20 token_,\n        address from,\n        address to,\n        uint256 amount,\n        uint256 share\n    ) public allowed(from) returns (uint256 amountOut, uint256 shareOut) {\n        // Checks\n        require(to != address(0), \"BentoBox: to not set\"); // To avoid a bad UI from burning funds\n\n        // Effects\n        IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;\n        Rebase memory total = totals[token];\n        if (share == 0) {\n            // value of the share paid could be lower than the amount paid due to rounding, in that case, add a share (Always round up)\n            share = total.toBase(amount, true);\n        } else {\n            // amount may be lower than the value of share due to rounding, that's ok\n            amount = total.toElastic(share, false);\n        }\n\n        balanceOf[token][from] = balanceOf[token][from].sub(share);\n        total.elastic = total.elastic.sub(amount.to128());\n        total.base = total.base.sub(share.to128());\n        // There have to be at least 1000 shares left to prevent reseting the share/amount ratio (unless it's fully emptied)\n        require(total.base >= MINIMUM_SHARE_BALANCE || total.base == 0, \"BentoBox: cannot empty\");\n        totals[token] = total;\n\n        // Interactions\n        if (token_ == USE_ETHEREUM) {\n            // X2, X3: A revert or big gas usage in the WETH contract could block withdrawals, but WETH9 is fine.\n            IWETH(address(wethToken)).withdraw(amount);\n            // X2, X3: A revert or big gas usage could block, however, the to address is under control of the caller.\n            (bool success, ) = to.call{value: amount}(\"\");\n            require(success, \"BentoBox: ETH transfer failed\");\n        } else {\n            // X2, X3: A malicious token could block withdrawal of just THAT token.\n            //         masterContracts may want to take care not to rely on withdraw always succeeding.\n            token.safeTransfer(to, amount);\n        }\n        emit LogWithdraw(token, from, to, amount, share);\n        amountOut = amount;\n        shareOut = share;\n    }\n\n    /// @notice Transfer shares from a user account to another one.\n    /// @param token The ERC-20 token to transfer.\n    /// @param from which user to pull the tokens.\n    /// @param to which user to push the tokens.\n    /// @param share The amount of `token` in shares.\n    // Clones of master contracts can transfer from any account that has approved them\n    // F3 - Can it be combined with another similar function?\n    // F3: This isn't combined with transferMultiple for gas optimization\n    function transfer(\n        IERC20 token,\n        address from,\n        address to,\n        uint256 share\n    ) public allowed(from) {\n        // Checks\n        require(to != address(0), \"BentoBox: to not set\"); // To avoid a bad UI from burning funds\n\n        // Effects\n        balanceOf[token][from] = balanceOf[token][from].sub(share);\n        balanceOf[token][to] = balanceOf[token][to].add(share);\n\n        emit LogTransfer(token, from, to, share);\n    }\n\n    /// @notice Transfer shares from a user account to multiple other ones.\n    /// @param token The ERC-20 token to transfer.\n    /// @param from which user to pull the tokens.\n    /// @param tos The receivers of the tokens.\n    /// @param shares The amount of `token` in shares for each receiver in `tos`.\n    // F3 - Can it be combined with another similar function?\n    // F3: This isn't combined with transfer for gas optimization\n    function transferMultiple(\n        IERC20 token,\n        address from,\n        address[] calldata tos,\n        uint256[] calldata shares\n    ) public allowed(from) {\n        // Checks\n        require(tos[0] != address(0), \"BentoBox: to[0] not set\"); // To avoid a bad UI from burning funds\n\n        // Effects\n        uint256 totalAmount;\n        uint256 len = tos.length;\n        for (uint256 i = 0; i < len; i++) {\n            address to = tos[i];\n            balanceOf[token][to] = balanceOf[token][to].add(shares[i]);\n            totalAmount = totalAmount.add(shares[i]);\n            emit LogTransfer(token, from, to, shares[i]);\n        }\n        balanceOf[token][from] = balanceOf[token][from].sub(totalAmount);\n    }\n\n    /// @notice Flashloan ability.\n    /// @param borrower The address of the contract that implements and conforms to `IFlashBorrower` and handles the flashloan.\n    /// @param receiver Address of the token receiver.\n    /// @param token The address of the token to receive.\n    /// @param amount of the tokens to receive.\n    /// @param data The calldata to pass to the `borrower` contract.\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\n    // F5: Not possible to follow this here, reentrancy has been reviewed\n    // F6 - Check for front-running possibilities, such as the approve function (SWC-114)\n    // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.\n    function flashLoan(\n        IFlashBorrower borrower,\n        address receiver,\n        IERC20 token,\n        uint256 amount,\n        bytes calldata data\n    ) public {\n        uint256 fee = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;\n        token.safeTransfer(receiver, amount);\n\n        borrower.onFlashLoan(msg.sender, token, amount, fee, data);\n\n        require(_tokenBalanceOf(token) >= totals[token].addElastic(fee.to128()), \"BentoBox: Wrong amount\");\n        emit LogFlashLoan(address(borrower), token, amount, fee, receiver);\n    }\n\n    /// @notice Support for batched flashloans. Useful to request multiple different `tokens` in a single transaction.\n    /// @param borrower The address of the contract that implements and conforms to `IBatchFlashBorrower` and handles the flashloan.\n    /// @param receivers An array of the token receivers. A one-to-one mapping with `tokens` and `amounts`.\n    /// @param tokens The addresses of the tokens.\n    /// @param amounts of the tokens for each receiver.\n    /// @param data The calldata to pass to the `borrower` contract.\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\n    // F5: Not possible to follow this here, reentrancy has been reviewed\n    // F6 - Check for front-running possibilities, such as the approve function (SWC-114)\n    // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.\n    function batchFlashLoan(\n        IBatchFlashBorrower borrower,\n        address[] calldata receivers,\n        IERC20[] calldata tokens,\n        uint256[] calldata amounts,\n        bytes calldata data\n    ) public {\n        uint256[] memory fees = new uint256[](tokens.length);\n\n        uint256 len = tokens.length;\n        for (uint256 i = 0; i < len; i++) {\n            uint256 amount = amounts[i];\n            fees[i] = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;\n\n            tokens[i].safeTransfer(receivers[i], amounts[i]);\n        }\n\n        borrower.onBatchFlashLoan(msg.sender, tokens, amounts, fees, data);\n\n        for (uint256 i = 0; i < len; i++) {\n            IERC20 token = tokens[i];\n            require(_tokenBalanceOf(token) >= totals[token].addElastic(fees[i].to128()), \"BentoBox: Wrong amount\");\n            emit LogFlashLoan(address(borrower), token, amounts[i], fees[i], receivers[i]);\n        }\n    }\n\n    /// @notice Sets the target percentage of the strategy for `token`.\n    /// @dev Only the owner of this contract is allowed to change this.\n    /// @param token The address of the token that maps to a strategy to change.\n    /// @param targetPercentage_ The new target in percent. Must be lesser or equal to `MAX_TARGET_PERCENTAGE`.\n    function setStrategyTargetPercentage(IERC20 token, uint64 targetPercentage_) public onlyOwner {\n        // Checks\n        require(targetPercentage_ <= MAX_TARGET_PERCENTAGE, \"StrategyManager: Target too high\");\n\n        // Effects\n        strategyData[token].targetPercentage = targetPercentage_;\n        emit LogStrategyTargetPercentage(token, targetPercentage_);\n    }\n\n    /// @notice Sets the contract address of a new strategy that conforms to `IStrategy` for `token`.\n    /// Must be called twice with the same arguments.\n    /// A new strategy becomes pending first and can be activated once `STRATEGY_DELAY` is over.\n    /// @dev Only the owner of this contract is allowed to change this.\n    /// @param token The address of the token that maps to a strategy to change.\n    /// @param newStrategy The address of the contract that conforms to `IStrategy`.\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\n    // F5: Total amount is updated AFTER interaction. But strategy is under our control.\n    // C4 - Use block.timestamp only for long intervals (SWC-116)\n    // C4: block.timestamp is used for a period of 2 weeks, which is long enough\n    function setStrategy(IERC20 token, IStrategy newStrategy) public onlyOwner {\n        StrategyData memory data = strategyData[token];\n        IStrategy pending = pendingStrategy[token];\n        if (data.strategyStartDate == 0 || pending != newStrategy) {\n            pendingStrategy[token] = newStrategy;\n            // C1 - All math done through BoringMath (SWC-101)\n            // C1: Our sun will swallow the earth well before this overflows\n            data.strategyStartDate = (block.timestamp + STRATEGY_DELAY).to64();\n            emit LogStrategyQueued(token, newStrategy);\n        } else {\n            require(data.strategyStartDate != 0 && block.timestamp >= data.strategyStartDate, \"StrategyManager: Too early\");\n            if (address(strategy[token]) != address(0)) {\n                int256 balanceChange = strategy[token].exit(data.balance);\n                // Effects\n                if (balanceChange > 0) {\n                    uint256 add = uint256(balanceChange);\n                    totals[token].addElastic(add);\n                    emit LogStrategyProfit(token, add);\n                } else if (balanceChange < 0) {\n                    uint256 sub = uint256(-balanceChange);\n                    totals[token].subElastic(sub);\n                    emit LogStrategyLoss(token, sub);\n                }\n\n                emit LogStrategyDivest(token, data.balance);\n            }\n            strategy[token] = pending;\n            data.strategyStartDate = 0;\n            data.balance = 0;\n            pendingStrategy[token] = IStrategy(0);\n            emit LogStrategySet(token, newStrategy);\n        }\n        strategyData[token] = data;\n    }\n\n    /// @notice The actual process of yield farming. Executes the strategy of `token`.\n    /// Optionally does housekeeping if `balance` is true.\n    /// `maxChangeAmount` is relevant for skimming or withdrawing if `balance` is true.\n    /// @param token The address of the token for which a strategy is deployed.\n    /// @param balance True if housekeeping should be done.\n    /// @param maxChangeAmount The maximum amount for either pulling or pushing from/to the `IStrategy` contract.\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\n    // F5: Total amount is updated AFTER interaction. But strategy is under our control.\n    // F5: Not followed to prevent reentrancy issues with flashloans and BentoBox skims?\n    function harvest(\n        IERC20 token,\n        bool balance,\n        uint256 maxChangeAmount\n    ) public {\n        StrategyData memory data = strategyData[token];\n        IStrategy _strategy = strategy[token];\n        int256 balanceChange = _strategy.harvest(data.balance, msg.sender);\n        if (balanceChange == 0 && !balance) {\n            return;\n        }\n\n        uint256 totalElastic = totals[token].elastic;\n\n        if (balanceChange > 0) {\n            uint256 add = uint256(balanceChange);\n            totalElastic = totalElastic.add(add);\n            totals[token].elastic = totalElastic.to128();\n            emit LogStrategyProfit(token, add);\n        } else if (balanceChange < 0) {\n            // C1 - All math done through BoringMath (SWC-101)\n            // C1: balanceChange could overflow if it's max negative int128.\n            // But tokens with balances that large are not supported by the BentoBox.\n            uint256 sub = uint256(-balanceChange);\n            totalElastic = totalElastic.sub(sub);\n            totals[token].elastic = totalElastic.to128();\n            data.balance = data.balance.sub(sub.to128());\n            emit LogStrategyLoss(token, sub);\n        }\n\n        if (balance) {\n            uint256 targetBalance = totalElastic.mul(data.targetPercentage) / 100;\n            // if data.balance == targetBalance there is nothing to update\n            if (data.balance < targetBalance) {\n                uint256 amountOut = targetBalance.sub(data.balance);\n                if (maxChangeAmount != 0 && amountOut > maxChangeAmount) {\n                    amountOut = maxChangeAmount;\n                }\n                token.safeTransfer(address(_strategy), amountOut);\n                data.balance = data.balance.add(amountOut.to128());\n                _strategy.skim(amountOut);\n                emit LogStrategyInvest(token, amountOut);\n            } else if (data.balance > targetBalance) {\n                uint256 amountIn = data.balance.sub(targetBalance.to128());\n                if (maxChangeAmount != 0 && amountIn > maxChangeAmount) {\n                    amountIn = maxChangeAmount;\n                }\n\n                uint256 actualAmountIn = _strategy.withdraw(amountIn);\n\n                data.balance = data.balance.sub(actualAmountIn.to128());\n                emit LogStrategyDivest(token, actualAmountIn);\n            }\n        }\n\n        strategyData[token] = data;\n    }\n\n    // Contract should be able to receive ETH deposits to support deposit & skim\n    // solhint-disable-next-line no-empty-blocks\n    receive() external payable {}\n}\n"
      }
    },
    "settings": {
      "optimizer": {
        "enabled": true,
        "runs": 200
      },
      "outputSelection": {
        "*": {
          "*": [
            "abi",
            "evm.bytecode",
            "evm.deployedBytecode",
            "evm.methodIdentifiers",
            "metadata",
            "devdoc",
            "userdoc",
            "storageLayout",
            "evm.gasEstimates"
          ],
          "": [
            "ast"
          ]
        }
      },
      "metadata": {
        "useLiteralContent": true
      }
    }
  },
  "output": {
    "contracts": {
      "contracts/bentobox/BentoBoxV1.sol": {
        "BaseBoringBatchable": {
          "abi": [
            {
              "inputs": [
                {
                  "internalType": "bytes[]",
                  "name": "calls",
                  "type": "bytes[]"
                },
                {
                  "internalType": "bool",
                  "name": "revertOnFail",
                  "type": "bool"
                }
              ],
              "name": "batch",
              "outputs": [
                {
                  "internalType": "bool[]",
                  "name": "successes",
                  "type": "bool[]"
                },
                {
                  "internalType": "bytes[]",
                  "name": "results",
                  "type": "bytes[]"
                }
              ],
              "stateMutability": "payable",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {
              "batch(bytes[],bool)": {
                "params": {
                  "calls": "An array of inputs for each call.",
                  "revertOnFail": "If True then reverts after a failed call and stops doing further calls."
                },
                "returns": {
                  "results": "An array with the returned data of each function call, mapped one-to-one to `calls`.",
                  "successes": "An array indicating the success of a call, mapped one-to-one to `calls`."
                }
              }
            },
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b5061051a806100206000396000f3fe60806040526004361061001e5760003560e01c8063d2423b5114610023575b600080fd5b610036610031366004610250565b61004d565b6040516100449291906103ab565b60405180910390f35b6060808367ffffffffffffffff8111801561006757600080fd5b50604051908082528060200260200182016040528015610091578160200160208202803683370190505b5091508367ffffffffffffffff811180156100ab57600080fd5b506040519080825280602002602001820160405280156100df57816020015b60608152602001906001900390816100ca5790505b50905060005b848110156101df5760006060308888858181106100fe57fe5b9050602002810190610110919061045f565b60405161011e92919061039b565b600060405180830381855af49150503d8060008114610159576040519150601f19603f3d011682016040523d82523d6000602084013e61015e565b606091505b5091509150818061016d575085155b610176826101e8565b9061019d5760405162461bcd60e51b81526004016101949190610445565b60405180910390fd5b50818584815181106101ab57fe5b602002602001019015159081151581525050808484815181106101ca57fe5b602090810291909101015250506001016100e5565b50935093915050565b606060448251101561022e575060408051808201909152601d81527f5472616e73616374696f6e2072657665727465642073696c656e746c79000000602082015261024b565b6004820191508180602001905181019061024891906102d4565b90505b919050565b600080600060408486031215610264578283fd5b833567ffffffffffffffff8082111561027b578485fd5b818601915086601f83011261028e578485fd5b81358181111561029c578586fd5b87602080830285010111156102af578586fd5b6020928301955093505084013580151581146102c9578182fd5b809150509250925092565b6000602082840312156102e5578081fd5b815167ffffffffffffffff808211156102fc578283fd5b818401915084601f83011261030f578283fd5b81518181111561031d578384fd5b604051601f8201601f19168101602001838111828210171561033d578586fd5b604052818152838201602001871015610354578485fd5b6103658260208301602087016104b4565b9695505050505050565b600081518084526103878160208601602086016104b4565b601f01601f19169290920160200192915050565b6000828483379101908152919050565b604080825283519082018190526000906020906060840190828701845b828110156103e65781511515845292840192908401906001016103c8565b505050838103828501528085516103fd81846104ab565b91508192508381028201848801865b8381101561043657858303855261042483835161036f565b9487019492509086019060010161040c565b50909998505050505050505050565b600060208252610458602083018461036f565b9392505050565b6000808335601e19843603018112610475578283fd5b83018035915067ffffffffffffffff82111561048f578283fd5b6020019150368190038213156104a457600080fd5b9250929050565b90815260200190565b60005b838110156104cf5781810151838201526020016104b7565b838111156104de576000848401525b5050505056fea26469706673582212202bfba2530940b08e6b685cb70759aab51de2639e0bdd63e2fcfb8c5818f3c74f64736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x51A DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x1E JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xD2423B51 EQ PUSH2 0x23 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x36 PUSH2 0x31 CALLDATASIZE PUSH1 0x4 PUSH2 0x250 JUMP JUMPDEST PUSH2 0x4D JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x44 SWAP3 SWAP2 SWAP1 PUSH2 0x3AB JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x60 DUP1 DUP4 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0x67 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x91 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP SWAP2 POP DUP4 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0xAB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0xDF JUMPI DUP2 PUSH1 0x20 ADD JUMPDEST PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0xCA JUMPI SWAP1 POP JUMPDEST POP SWAP1 POP PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x1DF JUMPI PUSH1 0x0 PUSH1 0x60 ADDRESS DUP9 DUP9 DUP6 DUP2 DUP2 LT PUSH2 0xFE JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0x110 SWAP2 SWAP1 PUSH2 0x45F JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x11E SWAP3 SWAP2 SWAP1 PUSH2 0x39B JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS DELEGATECALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x159 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 0x15E JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 DUP1 PUSH2 0x16D JUMPI POP DUP6 ISZERO JUMPDEST PUSH2 0x176 DUP3 PUSH2 0x1E8 JUMP JUMPDEST SWAP1 PUSH2 0x19D JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x194 SWAP2 SWAP1 PUSH2 0x445 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP DUP2 DUP6 DUP5 DUP2 MLOAD DUP2 LT PUSH2 0x1AB JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD SWAP1 ISZERO ISZERO SWAP1 DUP2 ISZERO ISZERO DUP2 MSTORE POP POP DUP1 DUP5 DUP5 DUP2 MLOAD DUP2 LT PUSH2 0x1CA JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD MSTORE POP POP PUSH1 0x1 ADD PUSH2 0xE5 JUMP JUMPDEST POP SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x44 DUP3 MLOAD LT ISZERO PUSH2 0x22E JUMPI POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x1D DUP2 MSTORE PUSH32 0x5472616E73616374696F6E2072657665727465642073696C656E746C79000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x24B JUMP JUMPDEST PUSH1 0x4 DUP3 ADD SWAP2 POP DUP2 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x248 SWAP2 SWAP1 PUSH2 0x2D4 JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x40 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x264 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x27B JUMPI DUP5 DUP6 REVERT JUMPDEST DUP2 DUP7 ADD SWAP2 POP DUP7 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x28E JUMPI DUP5 DUP6 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x29C JUMPI DUP6 DUP7 REVERT JUMPDEST DUP8 PUSH1 0x20 DUP1 DUP4 MUL DUP6 ADD ADD GT ISZERO PUSH2 0x2AF JUMPI DUP6 DUP7 REVERT JUMPDEST PUSH1 0x20 SWAP3 DUP4 ADD SWAP6 POP SWAP4 POP POP DUP5 ADD CALLDATALOAD DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x2C9 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2E5 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x2FC JUMPI DUP3 DUP4 REVERT JUMPDEST DUP2 DUP5 ADD SWAP2 POP DUP5 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x30F JUMPI DUP3 DUP4 REVERT JUMPDEST DUP2 MLOAD DUP2 DUP2 GT ISZERO PUSH2 0x31D JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1F DUP3 ADD PUSH1 0x1F NOT AND DUP2 ADD PUSH1 0x20 ADD DUP4 DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x33D JUMPI DUP6 DUP7 REVERT JUMPDEST PUSH1 0x40 MSTORE DUP2 DUP2 MSTORE DUP4 DUP3 ADD PUSH1 0x20 ADD DUP8 LT ISZERO PUSH2 0x354 JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH2 0x365 DUP3 PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP8 ADD PUSH2 0x4B4 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH2 0x387 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x4B4 JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP5 DUP4 CALLDATACOPY SWAP2 ADD SWAP1 DUP2 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x40 DUP1 DUP3 MSTORE DUP4 MLOAD SWAP1 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP1 PUSH1 0x20 SWAP1 PUSH1 0x60 DUP5 ADD SWAP1 DUP3 DUP8 ADD DUP5 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x3E6 JUMPI DUP2 MLOAD ISZERO ISZERO DUP5 MSTORE SWAP3 DUP5 ADD SWAP3 SWAP1 DUP5 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x3C8 JUMP JUMPDEST POP POP POP DUP4 DUP2 SUB DUP3 DUP6 ADD MSTORE DUP1 DUP6 MLOAD PUSH2 0x3FD DUP2 DUP5 PUSH2 0x4AB JUMP JUMPDEST SWAP2 POP DUP2 SWAP3 POP DUP4 DUP2 MUL DUP3 ADD DUP5 DUP9 ADD DUP7 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x436 JUMPI DUP6 DUP4 SUB DUP6 MSTORE PUSH2 0x424 DUP4 DUP4 MLOAD PUSH2 0x36F JUMP JUMPDEST SWAP5 DUP8 ADD SWAP5 SWAP3 POP SWAP1 DUP7 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x40C JUMP JUMPDEST POP SWAP1 SWAP10 SWAP9 POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE PUSH2 0x458 PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x36F JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH1 0x1E NOT DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x475 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 ADD DUP1 CALLDATALOAD SWAP2 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x48F JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH1 0x20 ADD SWAP2 POP CALLDATASIZE DUP2 SWAP1 SUB DUP3 SGT ISZERO PUSH2 0x4A4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x4CF JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x4B7 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x4DE JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x2B 0xFB LOG2 MSTORE8 MULMOD BLOCKHASH 0xB0 DUP15 PUSH12 0x685CB70759AAB51DE2639E0B 0xDD PUSH4 0xE2FCFB8C PC XOR RETURN 0xC7 0x4F PUSH5 0x736F6C6343 STOP MOD 0xC STOP CALLER ",
              "sourceMap": "24636:2061:0:-:0;;;;;;;;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "60806040526004361061001e5760003560e01c8063d2423b5114610023575b600080fd5b610036610031366004610250565b61004d565b6040516100449291906103ab565b60405180910390f35b6060808367ffffffffffffffff8111801561006757600080fd5b50604051908082528060200260200182016040528015610091578160200160208202803683370190505b5091508367ffffffffffffffff811180156100ab57600080fd5b506040519080825280602002602001820160405280156100df57816020015b60608152602001906001900390816100ca5790505b50905060005b848110156101df5760006060308888858181106100fe57fe5b9050602002810190610110919061045f565b60405161011e92919061039b565b600060405180830381855af49150503d8060008114610159576040519150601f19603f3d011682016040523d82523d6000602084013e61015e565b606091505b5091509150818061016d575085155b610176826101e8565b9061019d5760405162461bcd60e51b81526004016101949190610445565b60405180910390fd5b50818584815181106101ab57fe5b602002602001019015159081151581525050808484815181106101ca57fe5b602090810291909101015250506001016100e5565b50935093915050565b606060448251101561022e575060408051808201909152601d81527f5472616e73616374696f6e2072657665727465642073696c656e746c79000000602082015261024b565b6004820191508180602001905181019061024891906102d4565b90505b919050565b600080600060408486031215610264578283fd5b833567ffffffffffffffff8082111561027b578485fd5b818601915086601f83011261028e578485fd5b81358181111561029c578586fd5b87602080830285010111156102af578586fd5b6020928301955093505084013580151581146102c9578182fd5b809150509250925092565b6000602082840312156102e5578081fd5b815167ffffffffffffffff808211156102fc578283fd5b818401915084601f83011261030f578283fd5b81518181111561031d578384fd5b604051601f8201601f19168101602001838111828210171561033d578586fd5b604052818152838201602001871015610354578485fd5b6103658260208301602087016104b4565b9695505050505050565b600081518084526103878160208601602086016104b4565b601f01601f19169290920160200192915050565b6000828483379101908152919050565b604080825283519082018190526000906020906060840190828701845b828110156103e65781511515845292840192908401906001016103c8565b505050838103828501528085516103fd81846104ab565b91508192508381028201848801865b8381101561043657858303855261042483835161036f565b9487019492509086019060010161040c565b50909998505050505050505050565b600060208252610458602083018461036f565b9392505050565b6000808335601e19843603018112610475578283fd5b83018035915067ffffffffffffffff82111561048f578283fd5b6020019150368190038213156104a457600080fd5b9250929050565b90815260200190565b60005b838110156104cf5781810151838201526020016104b7565b838111156104de576000848401525b5050505056fea26469706673582212202bfba2530940b08e6b685cb70759aab51de2639e0bdd63e2fcfb8c5818f3c74f64736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x1E JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xD2423B51 EQ PUSH2 0x23 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x36 PUSH2 0x31 CALLDATASIZE PUSH1 0x4 PUSH2 0x250 JUMP JUMPDEST PUSH2 0x4D JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x44 SWAP3 SWAP2 SWAP1 PUSH2 0x3AB JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x60 DUP1 DUP4 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0x67 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x91 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP SWAP2 POP DUP4 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0xAB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0xDF JUMPI DUP2 PUSH1 0x20 ADD JUMPDEST PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0xCA JUMPI SWAP1 POP JUMPDEST POP SWAP1 POP PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x1DF JUMPI PUSH1 0x0 PUSH1 0x60 ADDRESS DUP9 DUP9 DUP6 DUP2 DUP2 LT PUSH2 0xFE JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0x110 SWAP2 SWAP1 PUSH2 0x45F JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x11E SWAP3 SWAP2 SWAP1 PUSH2 0x39B JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS DELEGATECALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x159 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 0x15E JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 DUP1 PUSH2 0x16D JUMPI POP DUP6 ISZERO JUMPDEST PUSH2 0x176 DUP3 PUSH2 0x1E8 JUMP JUMPDEST SWAP1 PUSH2 0x19D JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x194 SWAP2 SWAP1 PUSH2 0x445 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP DUP2 DUP6 DUP5 DUP2 MLOAD DUP2 LT PUSH2 0x1AB JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD SWAP1 ISZERO ISZERO SWAP1 DUP2 ISZERO ISZERO DUP2 MSTORE POP POP DUP1 DUP5 DUP5 DUP2 MLOAD DUP2 LT PUSH2 0x1CA JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD MSTORE POP POP PUSH1 0x1 ADD PUSH2 0xE5 JUMP JUMPDEST POP SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x44 DUP3 MLOAD LT ISZERO PUSH2 0x22E JUMPI POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x1D DUP2 MSTORE PUSH32 0x5472616E73616374696F6E2072657665727465642073696C656E746C79000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x24B JUMP JUMPDEST PUSH1 0x4 DUP3 ADD SWAP2 POP DUP2 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x248 SWAP2 SWAP1 PUSH2 0x2D4 JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x40 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x264 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x27B JUMPI DUP5 DUP6 REVERT JUMPDEST DUP2 DUP7 ADD SWAP2 POP DUP7 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x28E JUMPI DUP5 DUP6 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x29C JUMPI DUP6 DUP7 REVERT JUMPDEST DUP8 PUSH1 0x20 DUP1 DUP4 MUL DUP6 ADD ADD GT ISZERO PUSH2 0x2AF JUMPI DUP6 DUP7 REVERT JUMPDEST PUSH1 0x20 SWAP3 DUP4 ADD SWAP6 POP SWAP4 POP POP DUP5 ADD CALLDATALOAD DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x2C9 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2E5 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x2FC JUMPI DUP3 DUP4 REVERT JUMPDEST DUP2 DUP5 ADD SWAP2 POP DUP5 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x30F JUMPI DUP3 DUP4 REVERT JUMPDEST DUP2 MLOAD DUP2 DUP2 GT ISZERO PUSH2 0x31D JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1F DUP3 ADD PUSH1 0x1F NOT AND DUP2 ADD PUSH1 0x20 ADD DUP4 DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x33D JUMPI DUP6 DUP7 REVERT JUMPDEST PUSH1 0x40 MSTORE DUP2 DUP2 MSTORE DUP4 DUP3 ADD PUSH1 0x20 ADD DUP8 LT ISZERO PUSH2 0x354 JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH2 0x365 DUP3 PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP8 ADD PUSH2 0x4B4 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH2 0x387 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x4B4 JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP5 DUP4 CALLDATACOPY SWAP2 ADD SWAP1 DUP2 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x40 DUP1 DUP3 MSTORE DUP4 MLOAD SWAP1 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP1 PUSH1 0x20 SWAP1 PUSH1 0x60 DUP5 ADD SWAP1 DUP3 DUP8 ADD DUP5 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x3E6 JUMPI DUP2 MLOAD ISZERO ISZERO DUP5 MSTORE SWAP3 DUP5 ADD SWAP3 SWAP1 DUP5 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x3C8 JUMP JUMPDEST POP POP POP DUP4 DUP2 SUB DUP3 DUP6 ADD MSTORE DUP1 DUP6 MLOAD PUSH2 0x3FD DUP2 DUP5 PUSH2 0x4AB JUMP JUMPDEST SWAP2 POP DUP2 SWAP3 POP DUP4 DUP2 MUL DUP3 ADD DUP5 DUP9 ADD DUP7 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x436 JUMPI DUP6 DUP4 SUB DUP6 MSTORE PUSH2 0x424 DUP4 DUP4 MLOAD PUSH2 0x36F JUMP JUMPDEST SWAP5 DUP8 ADD SWAP5 SWAP3 POP SWAP1 DUP7 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x40C JUMP JUMPDEST POP SWAP1 SWAP10 SWAP9 POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE PUSH2 0x458 PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x36F JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH1 0x1E NOT DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x475 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 ADD DUP1 CALLDATALOAD SWAP2 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x48F JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH1 0x20 ADD SWAP2 POP CALLDATASIZE DUP2 SWAP1 SUB DUP3 SGT ISZERO PUSH2 0x4A4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x4CF JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x4B7 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x4DE JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x2B 0xFB LOG2 MSTORE8 MULMOD BLOCKHASH 0xB0 DUP15 PUSH12 0x685CB70759AAB51DE2639E0B 0xDD PUSH4 0xE2FCFB8C PC XOR RETURN 0xC7 0x4F PUSH5 0x736F6C6343 STOP MOD 0xC STOP CALLER ",
              "sourceMap": "24636:2061:0:-:0;;;;;;;;;;;;;;;;;;;;;26174:521;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;26258:23;;26340:5;26329:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26329:24:0;-1:-1:-1;26317:36:0;-1:-1:-1;26385:5:0;26373:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26363:35;;26413:9;26408:281;26428:16;;;26408:281;;;26466:12;26480:19;26511:4;26530:5;;26536:1;26530:8;;;;;;;;;;;;;;;;;;:::i;:::-;26503:36;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26465:74;;;;26561:7;:24;;;;26573:12;26572:13;26561:24;26587:21;26601:6;26587:13;:21::i;:::-;26553:56;;;;;-1:-1:-1;;;26553:56:0;;;;;;;;:::i;:::-;;;;;;;;;;26638:7;26623:9;26633:1;26623:12;;;;;;;;;;;;;:22;;;;;;;;;;;26672:6;26659:7;26667:1;26659:10;;;;;;;;;;;;;;;;;:19;-1:-1:-1;;26446:3:0;;26408:281;;;;26174:521;;;;;;:::o;24858:487::-;24930:13;25091:2;25070:11;:18;:23;25066:67;;;-1:-1:-1;25095:38:0;;;;;;;;;;;;;;;;;;;25066:67;25233:4;25220:11;25216:22;25201:37;;25275:11;25264:33;;;;;;;;;;;;:::i;:::-;25257:40;;24858:487;;;;:::o;976:538:-1:-;;;;1140:2;1128:9;1119:7;1115:23;1111:32;1108:2;;;-1:-1;;1146:12;1108:2;1204:17;1191:31;1242:18;;1234:6;1231:30;1228:2;;;-1:-1;;1264:12;1228:2;1376:6;1365:9;1361:22;;;162:3;155:4;147:6;143:17;139:27;129:2;;-1:-1;;170:12;129:2;213:6;200:20;1242:18;232:6;229:30;226:2;;;-1:-1;;262:12;226:2;357:3;306:4;;341:6;337:17;298:6;323:32;;320:41;317:2;;;-1:-1;;364:12;317:2;306:4;294:17;;;;-1:-1;1284:109;-1:-1;;1466:22;;456:20;9459:13;;9452:21;10077:32;;10067:2;;-1:-1;;10113:12;10067:2;1438:60;;;;1102:412;;;;;:::o;1521:362::-;;1646:2;1634:9;1625:7;1621:23;1617:32;1614:2;;;-1:-1;;1652:12;1614:2;1703:17;1697:24;1741:18;;1733:6;1730:30;1727:2;;;-1:-1;;1763:12;1727:2;1850:6;1839:9;1835:22;;;637:3;630:4;622:6;618:17;614:27;604:2;;-1:-1;;645:12;604:2;685:6;679:13;1741:18;7225:6;7222:30;7219:2;;;-1:-1;;7255:12;7219:2;6888;6882:9;7328;7309:17;;-1:-1;;7305:33;6914:17;;1646:2;6914:17;6974:34;;;7010:22;;;6971:62;6968:2;;;-1:-1;;7036:12;6968:2;6888;7055:22;778:21;;;878:16;;;1646:2;878:16;875:25;-1:-1;872:2;;;-1:-1;;903:12;872:2;923:39;955:6;1646:2;854:5;850:16;1646:2;820:6;816:17;923:39;:::i;:::-;1783:84;1608:275;-1:-1;;;;;;1608:275::o;4354:323::-;;4486:5;7840:12;8655:6;8650:3;8643:19;4569:52;4614:6;8692:4;8687:3;8683:14;8692:4;4595:5;4591:16;4569:52;:::i;:::-;7328:9;9984:14;-1:-1;;9980:28;4633:39;;;;8692:4;4633:39;;4434:243;-1:-1;;4434:243::o;5038:291::-;;9567:6;9562:3;9557;9544:30;9605:16;;9598:27;;;9605:16;5182:147;-1:-1;5182:147::o;5336:653::-;5603:2;5617:47;;;7840:12;;5588:18;;;8643:19;;;5336:653;;8692:4;;8683:14;;;;7530;;;5336:653;2676:251;2701:6;2698:1;2695:13;2676:251;;;2762:13;;9459;9452:21;3967:34;;2032:14;;;;8377;;;;2723:1;2716:9;2676:251;;;2680:14;;;5828:9;5822:4;5818:20;8692:4;5802:9;5798:18;5791:48;5853:126;3204:5;7840:12;3223:95;3311:6;3306:3;3223:95;:::i;:::-;3216:102;;;;;8692:4;3375:6;3371:17;3366:3;3362:27;8692:4;3469:5;7530:14;-1:-1;3508:357;3533:6;3530:1;3527:13;3508:357;;;3595:9;3589:4;3585:20;3580:3;3573:33;2180:64;2240:3;3640:6;3634:13;2180:64;:::i;:::-;3844:14;;;;3654:90;-1:-1;8377:14;;;;2723:1;3548:9;3508:357;;;-1:-1;5845:134;;5574:415;-1:-1;;;;;;;;;5574:415::o;5996:310::-;;6143:2;6164:17;6157:47;6218:78;6143:2;6132:9;6128:18;6282:6;6218:78;:::i;:::-;6210:86;6114:192;-1:-1;;;6114:192::o;6313:506::-;;;6448:11;6435:25;6499:48;;6523:8;6507:14;6503:29;6499:48;6479:18;6475:73;6465:2;;-1:-1;;6552:12;6465:2;6579:33;;6633:18;;;-1:-1;6671:18;6660:30;;6657:2;;;-1:-1;;6693:12;6657:2;6538:4;6721:13;;-1:-1;6507:14;6753:38;;;6743:49;;6740:2;;;6805:1;;6795:12;6740:2;6403:416;;;;;:::o;8528:175::-;8643:19;;;8692:4;8683:14;;8636:67::o;9640:268::-;9705:1;9712:101;9726:6;9723:1;9720:13;9712:101;;;9793:11;;;9787:18;9774:11;;;9767:39;9748:2;9741:10;9712:101;;;9828:6;9825:1;9822:13;9819:2;;;9705:1;9884:6;9879:3;9875:16;9868:27;9819:2;;9689:219;;;:::o"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "261200",
                "executionCost": "300",
                "totalCost": "261500"
              },
              "external": {
                "batch(bytes[],bool)": "infinite"
              },
              "internal": {
                "_getRevertMsg(bytes memory)": "infinite"
              }
            },
            "methodIdentifiers": {
              "batch(bytes[],bool)": "d2423b51"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"bytes[]\",\"name\":\"calls\",\"type\":\"bytes[]\"},{\"internalType\":\"bool\",\"name\":\"revertOnFail\",\"type\":\"bool\"}],\"name\":\"batch\",\"outputs\":[{\"internalType\":\"bool[]\",\"name\":\"successes\",\"type\":\"bool[]\"},{\"internalType\":\"bytes[]\",\"name\":\"results\",\"type\":\"bytes[]\"}],\"stateMutability\":\"payable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"batch(bytes[],bool)\":{\"params\":{\"calls\":\"An array of inputs for each call.\",\"revertOnFail\":\"If True then reverts after a failed call and stops doing further calls.\"},\"returns\":{\"results\":\"An array with the returned data of each function call, mapped one-to-one to `calls`.\",\"successes\":\"An array indicating the success of a call, mapped one-to-one to `calls`.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"batch(bytes[],bool)\":{\"notice\":\"Allows batched call to self (this contract).\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/bentobox/BentoBoxV1.sol\":\"BaseBoringBatchable\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/bentobox/BentoBoxV1.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\n// The BentoBox\\n\\n//  \\u2584\\u2584\\u2584\\u2584\\u00b7 \\u2584\\u2584\\u2584 . \\u2590 \\u2584 \\u2584\\u2584\\u2584\\u2584\\u2584      \\u2584\\u2584\\u2584\\u2584\\u00b7       \\u2590\\u2584\\u2022 \\u2584\\n//  \\u2590\\u2588 \\u2580\\u2588\\u25aa\\u2580\\u2584.\\u2580\\u00b7\\u2588\\u258c\\u2590\\u2588\\u2022\\u2588\\u2588  \\u25aa     \\u2590\\u2588 \\u2580\\u2588\\u25aa\\u25aa      \\u2588\\u258c\\u2588\\u258c\\u25aa\\n//  \\u2590\\u2588\\u2580\\u2580\\u2588\\u2584\\u2590\\u2580\\u2580\\u25aa\\u2584\\u2590\\u2588\\u2590\\u2590\\u258c \\u2590\\u2588.\\u25aa \\u2584\\u2588\\u2580\\u2584 \\u2590\\u2588\\u2580\\u2580\\u2588\\u2584 \\u2584\\u2588\\u2580\\u2584  \\u00b7\\u2588\\u2588\\u00b7\\n//  \\u2588\\u2588\\u2584\\u25aa\\u2590\\u2588\\u2590\\u2588\\u2584\\u2584\\u258c\\u2588\\u2588\\u2590\\u2588\\u258c \\u2590\\u2588\\u258c\\u00b7\\u2590\\u2588\\u258c.\\u2590\\u258c\\u2588\\u2588\\u2584\\u25aa\\u2590\\u2588\\u2590\\u2588\\u258c.\\u2590\\u258c\\u25aa\\u2590\\u2588\\u00b7\\u2588\\u258c\\n//  \\u00b7\\u2580\\u2580\\u2580\\u2580  \\u2580\\u2580\\u2580 \\u2580\\u2580 \\u2588\\u25aa \\u2580\\u2580\\u2580  \\u2580\\u2588\\u2584\\u2580\\u25aa\\u00b7\\u2580\\u2580\\u2580\\u2580  \\u2580\\u2588\\u2584\\u2580\\u25aa\\u2022\\u2580\\u2580 \\u2580\\u2580\\n\\n// This contract stores funds, handles their transfers, supports flash loans and strategies.\\n\\n// Copyright (c) 2021 BoringCrypto - All rights reserved\\n// Twitter: @Boring_Crypto\\n\\n// Special thanks to Keno for all his hard work and support\\n\\n// Version 22-Mar-2021\\n\\npragma solidity 0.6.12;\\npragma experimental ABIEncoderV2;\\n\\n// solhint-disable avoid-low-level-calls\\n// solhint-disable not-rely-on-time\\n// solhint-disable no-inline-assembly\\n\\n// File @boringcrypto/boring-solidity/contracts/interfaces/IERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ninterface IERC20 {\\n    function totalSupply() external view returns (uint256);\\n\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /// @notice EIP 2612\\n    function permit(\\n        address owner,\\n        address spender,\\n        uint256 value,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) external;\\n}\\n\\n// File contracts/interfaces/IFlashLoan.sol\\n// License-Identifier: MIT\\n\\ninterface IFlashBorrower {\\n    /// @notice The flashloan callback. `amount` + `fee` needs to repayed to msg.sender before this call returns.\\n    /// @param sender The address of the invoker of this flashloan.\\n    /// @param token The address of the token that is loaned.\\n    /// @param amount of the `token` that is loaned.\\n    /// @param fee The fee that needs to be paid on top for this loan. Needs to be the same as `token`.\\n    /// @param data Additional data that was passed to the flashloan function.\\n    function onFlashLoan(\\n        address sender,\\n        IERC20 token,\\n        uint256 amount,\\n        uint256 fee,\\n        bytes calldata data\\n    ) external;\\n}\\n\\ninterface IBatchFlashBorrower {\\n    /// @notice The callback for batched flashloans. Every amount + fee needs to repayed to msg.sender before this call returns.\\n    /// @param sender The address of the invoker of this flashloan.\\n    /// @param tokens Array of addresses for ERC-20 tokens that is loaned.\\n    /// @param amounts A one-to-one map to `tokens` that is loaned.\\n    /// @param fees A one-to-one map to `tokens` that needs to be paid on top for each loan. Needs to be the same token.\\n    /// @param data Additional data that was passed to the flashloan function.\\n    function onBatchFlashLoan(\\n        address sender,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        uint256[] calldata fees,\\n        bytes calldata data\\n    ) external;\\n}\\n\\n// File contracts/interfaces/IWETH.sol\\n// License-Identifier: MIT\\n\\ninterface IWETH {\\n    function deposit() external payable;\\n\\n    function withdraw(uint256) external;\\n}\\n\\n// File contracts/interfaces/IStrategy.sol\\n// License-Identifier: MIT\\n\\ninterface IStrategy {\\n    /// @notice Send the assets to the Strategy and call skim to invest them.\\n    /// @param amount The amount of tokens to invest.\\n    function skim(uint256 amount) external;\\n\\n    /// @notice Harvest any profits made converted to the asset and pass them to the caller.\\n    /// @param balance The amount of tokens the caller thinks it has invested.\\n    /// @param sender The address of the initiator of this transaction. Can be used for reimbursements, etc.\\n    /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.\\n    function harvest(uint256 balance, address sender) external returns (int256 amountAdded);\\n\\n    /// @notice Withdraw assets. The returned amount can differ from the requested amount due to rounding.\\n    /// @dev The `actualAmount` should be very close to the amount.\\n    /// The difference should NOT be used to report a loss. That's what harvest is for.\\n    /// @param amount The requested amount the caller wants to withdraw.\\n    /// @return actualAmount The real amount that is withdrawn.\\n    function withdraw(uint256 amount) external returns (uint256 actualAmount);\\n\\n    /// @notice Withdraw all assets in the safest way possible. This shouldn't fail.\\n    /// @param balance The amount of tokens the caller thinks it has invested.\\n    /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.\\n    function exit(uint256 balance) external returns (int256 amountAdded);\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\nlibrary BoringERC20 {\\n    bytes4 private constant SIG_SYMBOL = 0x95d89b41; // symbol()\\n    bytes4 private constant SIG_NAME = 0x06fdde03; // name()\\n    bytes4 private constant SIG_DECIMALS = 0x313ce567; // decimals()\\n    bytes4 private constant SIG_TRANSFER = 0xa9059cbb; // transfer(address,uint256)\\n    bytes4 private constant SIG_TRANSFER_FROM = 0x23b872dd; // transferFrom(address,address,uint256)\\n\\n    /// @notice Provides a safe ERC20.transfer version for different ERC-20 implementations.\\n    /// Reverts on a failed transfer.\\n    /// @param token The address of the ERC-20 token.\\n    /// @param to Transfer tokens to.\\n    /// @param amount The token amount.\\n    function safeTransfer(\\n        IERC20 token,\\n        address to,\\n        uint256 amount\\n    ) internal {\\n        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER, to, amount));\\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: Transfer failed\\\");\\n    }\\n\\n    /// @notice Provides a safe ERC20.transferFrom version for different ERC-20 implementations.\\n    /// Reverts on a failed transfer.\\n    /// @param token The address of the ERC-20 token.\\n    /// @param from Transfer tokens from.\\n    /// @param to Transfer tokens to.\\n    /// @param amount The token amount.\\n    function safeTransferFrom(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 amount\\n    ) internal {\\n        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER_FROM, from, to, amount));\\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: TransferFrom failed\\\");\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringMath.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n/// @notice A library for performing overflow-/underflow-safe math,\\n/// updated with awesomeness from of DappHub (https://github.com/dapphub/ds-math).\\nlibrary BoringMath {\\n    function add(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require(b == 0 || (c = a * b) / b == a, \\\"BoringMath: Mul Overflow\\\");\\n    }\\n\\n    function to128(uint256 a) internal pure returns (uint128 c) {\\n        require(a <= uint128(-1), \\\"BoringMath: uint128 Overflow\\\");\\n        c = uint128(a);\\n    }\\n\\n    function to64(uint256 a) internal pure returns (uint64 c) {\\n        require(a <= uint64(-1), \\\"BoringMath: uint64 Overflow\\\");\\n        c = uint64(a);\\n    }\\n\\n    function to32(uint256 a) internal pure returns (uint32 c) {\\n        require(a <= uint32(-1), \\\"BoringMath: uint32 Overflow\\\");\\n        c = uint32(a);\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint128.\\nlibrary BoringMath128 {\\n    function add(uint128 a, uint128 b) internal pure returns (uint128 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint128 a, uint128 b) internal pure returns (uint128 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint64.\\nlibrary BoringMath64 {\\n    function add(uint64 a, uint64 b) internal pure returns (uint64 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint64 a, uint64 b) internal pure returns (uint64 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint32.\\nlibrary BoringMath32 {\\n    function add(uint32 a, uint32 b) internal pure returns (uint32 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint32 a, uint32 b) internal pure returns (uint32 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringRebase.sol@v1.2.0\\n// License-Identifier: MIT\\n\\nstruct Rebase {\\n    uint128 elastic;\\n    uint128 base;\\n}\\n\\n/// @notice A rebasing library using overflow-/underflow-safe math.\\nlibrary RebaseLibrary {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n\\n    /// @notice Calculates the base value in relationship to `elastic` and `total`.\\n    function toBase(\\n        Rebase memory total,\\n        uint256 elastic,\\n        bool roundUp\\n    ) internal pure returns (uint256 base) {\\n        if (total.elastic == 0) {\\n            base = elastic;\\n        } else {\\n            base = elastic.mul(total.base) / total.elastic;\\n            if (roundUp && base.mul(total.elastic) / total.base < elastic) {\\n                base = base.add(1);\\n            }\\n        }\\n    }\\n\\n    /// @notice Calculates the elastic value in relationship to `base` and `total`.\\n    function toElastic(\\n        Rebase memory total,\\n        uint256 base,\\n        bool roundUp\\n    ) internal pure returns (uint256 elastic) {\\n        if (total.base == 0) {\\n            elastic = base;\\n        } else {\\n            elastic = base.mul(total.elastic) / total.base;\\n            if (roundUp && elastic.mul(total.base) / total.elastic < base) {\\n                elastic = elastic.add(1);\\n            }\\n        }\\n    }\\n\\n    /// @notice Add `elastic` to `total` and doubles `total.base`.\\n    /// @return (Rebase) The new total.\\n    /// @return base in relationship to `elastic`.\\n    function add(\\n        Rebase memory total,\\n        uint256 elastic,\\n        bool roundUp\\n    ) internal pure returns (Rebase memory, uint256 base) {\\n        base = toBase(total, elastic, roundUp);\\n        total.elastic = total.elastic.add(elastic.to128());\\n        total.base = total.base.add(base.to128());\\n        return (total, base);\\n    }\\n\\n    /// @notice Sub `base` from `total` and update `total.elastic`.\\n    /// @return (Rebase) The new total.\\n    /// @return elastic in relationship to `base`.\\n    function sub(\\n        Rebase memory total,\\n        uint256 base,\\n        bool roundUp\\n    ) internal pure returns (Rebase memory, uint256 elastic) {\\n        elastic = toElastic(total, base, roundUp);\\n        total.elastic = total.elastic.sub(elastic.to128());\\n        total.base = total.base.sub(base.to128());\\n        return (total, elastic);\\n    }\\n\\n    /// @notice Add `elastic` and `base` to `total`.\\n    function add(\\n        Rebase memory total,\\n        uint256 elastic,\\n        uint256 base\\n    ) internal pure returns (Rebase memory) {\\n        total.elastic = total.elastic.add(elastic.to128());\\n        total.base = total.base.add(base.to128());\\n        return total;\\n    }\\n\\n    /// @notice Subtract `elastic` and `base` to `total`.\\n    function sub(\\n        Rebase memory total,\\n        uint256 elastic,\\n        uint256 base\\n    ) internal pure returns (Rebase memory) {\\n        total.elastic = total.elastic.sub(elastic.to128());\\n        total.base = total.base.sub(base.to128());\\n        return total;\\n    }\\n\\n    /// @notice Add `elastic` to `total` and update storage.\\n    /// @return newElastic Returns updated `elastic`.\\n    function addElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {\\n        newElastic = total.elastic = total.elastic.add(elastic.to128());\\n    }\\n\\n    /// @notice Subtract `elastic` from `total` and update storage.\\n    /// @return newElastic Returns updated `elastic`.\\n    function subElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {\\n        newElastic = total.elastic = total.elastic.sub(elastic.to128());\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringOwnable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n// Source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol + Claimable.sol\\n// Edited by BoringCrypto\\n\\ncontract BoringOwnableData {\\n    address public owner;\\n    address public pendingOwner;\\n}\\n\\ncontract BoringOwnable is BoringOwnableData {\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /// @notice `owner` defaults to msg.sender on construction.\\n    constructor() public {\\n        owner = msg.sender;\\n        emit OwnershipTransferred(address(0), msg.sender);\\n    }\\n\\n    /// @notice Transfers ownership to `newOwner`. Either directly or claimable by the new pending owner.\\n    /// Can only be invoked by the current `owner`.\\n    /// @param newOwner Address of the new owner.\\n    /// @param direct True if `newOwner` should be set immediately. False if `newOwner` needs to use `claimOwnership`.\\n    /// @param renounce Allows the `newOwner` to be `address(0)` if `direct` and `renounce` is True. Has no effect otherwise.\\n    function transferOwnership(\\n        address newOwner,\\n        bool direct,\\n        bool renounce\\n    ) public onlyOwner {\\n        if (direct) {\\n            // Checks\\n            require(newOwner != address(0) || renounce, \\\"Ownable: zero address\\\");\\n\\n            // Effects\\n            emit OwnershipTransferred(owner, newOwner);\\n            owner = newOwner;\\n            pendingOwner = address(0);\\n        } else {\\n            // Effects\\n            pendingOwner = newOwner;\\n        }\\n    }\\n\\n    /// @notice Needs to be called by `pendingOwner` to claim ownership.\\n    function claimOwnership() public {\\n        address _pendingOwner = pendingOwner;\\n\\n        // Checks\\n        require(msg.sender == _pendingOwner, \\\"Ownable: caller != pending owner\\\");\\n\\n        // Effects\\n        emit OwnershipTransferred(owner, _pendingOwner);\\n        owner = _pendingOwner;\\n        pendingOwner = address(0);\\n    }\\n\\n    /// @notice Only allows the `owner` to execute the function.\\n    modifier onlyOwner() {\\n        require(msg.sender == owner, \\\"Ownable: caller is not the owner\\\");\\n        _;\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/interfaces/IMasterContract.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ninterface IMasterContract {\\n    /// @notice Init function that gets called from `BoringFactory.deploy`.\\n    /// Also kown as the constructor for cloned contracts.\\n    /// Any ETH send to `BoringFactory.deploy` ends up here.\\n    /// @param data Can be abi encoded arguments or anything else.\\n    function init(bytes calldata data) external payable;\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringFactory.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ncontract BoringFactory {\\n    event LogDeploy(address indexed masterContract, bytes data, address indexed cloneAddress);\\n\\n    /// @notice Mapping from clone contracts to their masterContract.\\n    mapping(address => address) public masterContractOf;\\n\\n    /// @notice Deploys a given master Contract as a clone.\\n    /// Any ETH transferred with this call is forwarded to the new clone.\\n    /// Emits `LogDeploy`.\\n    /// @param masterContract The address of the contract to clone.\\n    /// @param data Additional abi encoded calldata that is passed to the new clone via `IMasterContract.init`.\\n    /// @param useCreate2 Creates the clone by using the CREATE2 opcode, in this case `data` will be used as salt.\\n    /// @return cloneAddress Address of the created clone contract.\\n    function deploy(\\n        address masterContract,\\n        bytes calldata data,\\n        bool useCreate2\\n    ) public payable returns (address cloneAddress) {\\n        require(masterContract != address(0), \\\"BoringFactory: No masterContract\\\");\\n        bytes20 targetBytes = bytes20(masterContract); // Takes the first 20 bytes of the masterContract's address\\n\\n        if (useCreate2) {\\n            // each masterContract has different code already. So clones are distinguished by their data only.\\n            bytes32 salt = keccak256(data);\\n\\n            // Creates clone, more info here: https://blog.openzeppelin.com/deep-dive-into-the-minimal-proxy-contract/\\n            assembly {\\n                let clone := mload(0x40)\\n                mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n                mstore(add(clone, 0x14), targetBytes)\\n                mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n                cloneAddress := create2(0, clone, 0x37, salt)\\n            }\\n        } else {\\n            assembly {\\n                let clone := mload(0x40)\\n                mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n                mstore(add(clone, 0x14), targetBytes)\\n                mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n                cloneAddress := create(0, clone, 0x37)\\n            }\\n        }\\n        masterContractOf[cloneAddress] = masterContract;\\n\\n        IMasterContract(cloneAddress).init{value: msg.value}(data);\\n\\n        emit LogDeploy(masterContract, data, cloneAddress);\\n    }\\n}\\n\\n// File contracts/MasterContractManager.sol\\n// License-Identifier: UNLICENSED\\n\\ncontract MasterContractManager is BoringOwnable, BoringFactory {\\n    event LogWhiteListMasterContract(address indexed masterContract, bool approved);\\n    event LogSetMasterContractApproval(address indexed masterContract, address indexed user, bool approved);\\n    event LogRegisterProtocol(address indexed protocol);\\n\\n    /// @notice masterContract to user to approval state\\n    mapping(address => mapping(address => bool)) public masterContractApproved;\\n    /// @notice masterContract to whitelisted state for approval without signed message\\n    mapping(address => bool) public whitelistedMasterContracts;\\n    /// @notice user nonces for masterContract approvals\\n    mapping(address => uint256) public nonces;\\n\\n    bytes32 private constant DOMAIN_SEPARATOR_SIGNATURE_HASH = keccak256(\\\"EIP712Domain(string name,uint256 chainId,address verifyingContract)\\\");\\n    // See https://eips.ethereum.org/EIPS/eip-191\\n    string private constant EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA = \\\"\\\\x19\\\\x01\\\";\\n    bytes32 private constant APPROVAL_SIGNATURE_HASH =\\n        keccak256(\\\"SetMasterContractApproval(string warning,address user,address masterContract,bool approved,uint256 nonce)\\\");\\n\\n    // solhint-disable-next-line var-name-mixedcase\\n    bytes32 private immutable _DOMAIN_SEPARATOR;\\n    // solhint-disable-next-line var-name-mixedcase\\n    uint256 private immutable DOMAIN_SEPARATOR_CHAIN_ID;\\n\\n    constructor() public {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        _DOMAIN_SEPARATOR = _calculateDomainSeparator(DOMAIN_SEPARATOR_CHAIN_ID = chainId);\\n    }\\n\\n    function _calculateDomainSeparator(uint256 chainId) private view returns (bytes32) {\\n        return keccak256(abi.encode(DOMAIN_SEPARATOR_SIGNATURE_HASH, keccak256(\\\"BentoBox V1\\\"), chainId, address(this)));\\n    }\\n\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() public view returns (bytes32) {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        return chainId == DOMAIN_SEPARATOR_CHAIN_ID ? _DOMAIN_SEPARATOR : _calculateDomainSeparator(chainId);\\n    }\\n\\n    /// @notice Other contracts need to register with this master contract so that users can approve them for the BentoBox.\\n    function registerProtocol() public {\\n        masterContractOf[msg.sender] = msg.sender;\\n        emit LogRegisterProtocol(msg.sender);\\n    }\\n\\n    /// @notice Enables or disables a contract for approval without signed message.\\n    function whitelistMasterContract(address masterContract, bool approved) public onlyOwner {\\n        // Checks\\n        require(masterContract != address(0), \\\"MasterCMgr: Cannot approve 0\\\");\\n\\n        // Effects\\n        whitelistedMasterContracts[masterContract] = approved;\\n        emit LogWhiteListMasterContract(masterContract, approved);\\n    }\\n\\n    /// @notice Approves or revokes a `masterContract` access to `user` funds.\\n    /// @param user The address of the user that approves or revokes access.\\n    /// @param masterContract The address who gains or loses access.\\n    /// @param approved If True approves access. If False revokes access.\\n    /// @param v Part of the signature. (See EIP-191)\\n    /// @param r Part of the signature. (See EIP-191)\\n    /// @param s Part of the signature. (See EIP-191)\\n    // F4 - Check behaviour for all function arguments when wrong or extreme\\n    // F4: Don't allow masterContract 0 to be approved. Unknown contracts will have a masterContract of 0.\\n    // F4: User can't be 0 for signed approvals because the recoveredAddress will be 0 if ecrecover fails\\n    function setMasterContractApproval(\\n        address user,\\n        address masterContract,\\n        bool approved,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) public {\\n        // Checks\\n        require(masterContract != address(0), \\\"MasterCMgr: masterC not set\\\"); // Important for security\\n\\n        // If no signature is provided, the fallback is executed\\n        if (r == 0 && s == 0 && v == 0) {\\n            require(user == msg.sender, \\\"MasterCMgr: user not sender\\\");\\n            require(masterContractOf[user] == address(0), \\\"MasterCMgr: user is clone\\\");\\n            require(whitelistedMasterContracts[masterContract], \\\"MasterCMgr: not whitelisted\\\");\\n        } else {\\n            // Important for security - any address without masterContract has address(0) as masterContract\\n            // So approving address(0) would approve every address, leading to full loss of funds\\n            // Also, ecrecover returns address(0) on failure. So we check this:\\n            require(user != address(0), \\\"MasterCMgr: User cannot be 0\\\");\\n\\n            // C10 - Protect signatures against replay, use nonce and chainId (SWC-121)\\n            // C10: nonce + chainId are used to prevent replays\\n            // C11 - All signatures strictly EIP-712 (SWC-117 SWC-122)\\n            // C11: signature is EIP-712 compliant\\n            // C12 - abi.encodePacked can't contain variable length user input (SWC-133)\\n            // C12: abi.encodePacked has fixed length parameters\\n            bytes32 digest =\\n                keccak256(\\n                    abi.encodePacked(\\n                        EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA,\\n                        DOMAIN_SEPARATOR(),\\n                        keccak256(\\n                            abi.encode(\\n                                APPROVAL_SIGNATURE_HASH,\\n                                approved\\n                                    ? keccak256(\\\"Give FULL access to funds in (and approved to) BentoBox?\\\")\\n                                    : keccak256(\\\"Revoke access to BentoBox?\\\"),\\n                                user,\\n                                masterContract,\\n                                approved,\\n                                nonces[user]++\\n                            )\\n                        )\\n                    )\\n                );\\n            address recoveredAddress = ecrecover(digest, v, r, s);\\n            require(recoveredAddress == user, \\\"MasterCMgr: Invalid Signature\\\");\\n        }\\n\\n        // Effects\\n        masterContractApproved[masterContract][user] = approved;\\n        emit LogSetMasterContractApproval(masterContract, user, approved);\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringBatchable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ncontract BaseBoringBatchable {\\n    /// @dev Helper function to extract a useful revert message from a failed call.\\n    /// If the returned data is malformed or not correctly abi encoded then this call can fail itself.\\n    function _getRevertMsg(bytes memory _returnData) internal pure returns (string memory) {\\n        // If the _res length is less than 68, then the transaction failed silently (without a revert message)\\n        if (_returnData.length < 68) return \\\"Transaction reverted silently\\\";\\n\\n        assembly {\\n            // Slice the sighash.\\n            _returnData := add(_returnData, 0x04)\\n        }\\n        return abi.decode(_returnData, (string)); // All that remains is the revert string\\n    }\\n\\n    /// @notice Allows batched call to self (this contract).\\n    /// @param calls An array of inputs for each call.\\n    /// @param revertOnFail If True then reverts after a failed call and stops doing further calls.\\n    /// @return successes An array indicating the success of a call, mapped one-to-one to `calls`.\\n    /// @return results An array with the returned data of each function call, mapped one-to-one to `calls`.\\n    // F1: External is ok here because this is the batch function, adding it to a batch makes no sense\\n    // F2: Calls in the batch may be payable, delegatecall operates in the same context, so each call in the batch has access to msg.value\\n    // C3: The length of the loop is fully under user control, so can't be exploited\\n    // C7: Delegatecall is only used on the same contract, so it's safe\\n    function batch(bytes[] calldata calls, bool revertOnFail) external payable returns (bool[] memory successes, bytes[] memory results) {\\n        successes = new bool[](calls.length);\\n        results = new bytes[](calls.length);\\n        for (uint256 i = 0; i < calls.length; i++) {\\n            (bool success, bytes memory result) = address(this).delegatecall(calls[i]);\\n            require(success || !revertOnFail, _getRevertMsg(result));\\n            successes[i] = success;\\n            results[i] = result;\\n        }\\n    }\\n}\\n\\ncontract BoringBatchable is BaseBoringBatchable {\\n    /// @notice Call wrapper that performs `ERC20.permit` on `token`.\\n    /// Lookup `IERC20.permit`.\\n    // F6: Parameters can be used front-run the permit and the user's permit will fail (due to nonce or other revert)\\n    //     if part of a batch this could be used to grief once as the second call would not need the permit\\n    function permitToken(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) public {\\n        token.permit(from, to, amount, deadline, v, r, s);\\n    }\\n}\\n\\n// File contracts/BentoBox.sol\\n// License-Identifier: UNLICENSED\\n\\n/// @title BentoBox\\n/// @author BoringCrypto, Keno\\n/// @notice The BentoBox is a vault for tokens. The stored tokens can be flash loaned and used in strategies.\\n/// Yield from this will go to the token depositors.\\n/// Rebasing tokens ARE NOT supported and WILL cause loss of funds.\\n/// Any funds transfered directly onto the BentoBox will be lost, use the deposit function instead.\\ncontract BentoBoxV1 is MasterContractManager, BoringBatchable {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n    using BoringERC20 for IERC20;\\n    using RebaseLibrary for Rebase;\\n\\n    // ************** //\\n    // *** EVENTS *** //\\n    // ************** //\\n\\n    event LogDeposit(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogWithdraw(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogTransfer(IERC20 indexed token, address indexed from, address indexed to, uint256 share);\\n\\n    event LogFlashLoan(address indexed borrower, IERC20 indexed token, uint256 amount, uint256 feeAmount, address indexed receiver);\\n\\n    event LogStrategyTargetPercentage(IERC20 indexed token, uint256 targetPercentage);\\n    event LogStrategyQueued(IERC20 indexed token, IStrategy indexed strategy);\\n    event LogStrategySet(IERC20 indexed token, IStrategy indexed strategy);\\n    event LogStrategyInvest(IERC20 indexed token, uint256 amount);\\n    event LogStrategyDivest(IERC20 indexed token, uint256 amount);\\n    event LogStrategyProfit(IERC20 indexed token, uint256 amount);\\n    event LogStrategyLoss(IERC20 indexed token, uint256 amount);\\n\\n    // *************** //\\n    // *** STRUCTS *** //\\n    // *************** //\\n\\n    struct StrategyData {\\n        uint64 strategyStartDate;\\n        uint64 targetPercentage;\\n        uint128 balance; // the balance of the strategy that BentoBox thinks is in there\\n    }\\n\\n    // ******************************** //\\n    // *** CONSTANTS AND IMMUTABLES *** //\\n    // ******************************** //\\n\\n    // V2 - Can they be private?\\n    // V2: Private to save gas, to verify it's correct, check the constructor arguments\\n    IERC20 private immutable wethToken;\\n\\n    IERC20 private constant USE_ETHEREUM = IERC20(0);\\n    uint256 private constant FLASH_LOAN_FEE = 50; // 0.05%\\n    uint256 private constant FLASH_LOAN_FEE_PRECISION = 1e5;\\n    uint256 private constant STRATEGY_DELAY = 2 weeks;\\n    uint256 private constant MAX_TARGET_PERCENTAGE = 95; // 95%\\n    uint256 private constant MINIMUM_SHARE_BALANCE = 1000; // To prevent the ratio going off\\n\\n    // ***************** //\\n    // *** VARIABLES *** //\\n    // ***************** //\\n\\n    // Balance per token per address/contract in shares\\n    mapping(IERC20 => mapping(address => uint256)) public balanceOf;\\n\\n    // Rebase from amount to share\\n    mapping(IERC20 => Rebase) public totals;\\n\\n    mapping(IERC20 => IStrategy) public strategy;\\n    mapping(IERC20 => IStrategy) public pendingStrategy;\\n    mapping(IERC20 => StrategyData) public strategyData;\\n\\n    // ******************* //\\n    // *** CONSTRUCTOR *** //\\n    // ******************* //\\n\\n    constructor(IERC20 wethToken_) public {\\n        wethToken = wethToken_;\\n    }\\n\\n    // ***************** //\\n    // *** MODIFIERS *** //\\n    // ***************** //\\n\\n    /// Modifier to check if the msg.sender is allowed to use funds belonging to the 'from' address.\\n    /// If 'from' is msg.sender, it's allowed.\\n    /// If 'from' is the BentoBox itself, it's allowed. Any ETH, token balances (above the known balances) or BentoBox balances\\n    /// can be taken by anyone.\\n    /// This is to enable skimming, not just for deposits, but also for withdrawals or transfers, enabling better composability.\\n    /// If 'from' is a clone of a masterContract AND the 'from' address has approved that masterContract, it's allowed.\\n    modifier allowed(address from) {\\n        if (from != msg.sender && from != address(this)) {\\n            // From is sender or you are skimming\\n            address masterContract = masterContractOf[msg.sender];\\n            require(masterContract != address(0), \\\"BentoBox: no masterContract\\\");\\n            require(masterContractApproved[masterContract][from], \\\"BentoBox: Transfer not approved\\\");\\n        }\\n        _;\\n    }\\n\\n    // ************************** //\\n    // *** INTERNAL FUNCTIONS *** //\\n    // ************************** //\\n\\n    /// @dev Returns the total balance of `token` this contracts holds,\\n    /// plus the total amount this contract thinks the strategy holds.\\n    function _tokenBalanceOf(IERC20 token) internal view returns (uint256 amount) {\\n        amount = token.balanceOf(address(this)).add(strategyData[token].balance);\\n    }\\n\\n    // ************************ //\\n    // *** PUBLIC FUNCTIONS *** //\\n    // ************************ //\\n\\n    /// @dev Helper function to represent an `amount` of `token` in shares.\\n    /// @param token The ERC-20 token.\\n    /// @param amount The `token` amount.\\n    /// @param roundUp If the result `share` should be rounded up.\\n    /// @return share The token amount represented in shares.\\n    function toShare(\\n        IERC20 token,\\n        uint256 amount,\\n        bool roundUp\\n    ) external view returns (uint256 share) {\\n        share = totals[token].toBase(amount, roundUp);\\n    }\\n\\n    /// @dev Helper function represent shares back into the `token` amount.\\n    /// @param token The ERC-20 token.\\n    /// @param share The amount of shares.\\n    /// @param roundUp If the result should be rounded up.\\n    /// @return amount The share amount back into native representation.\\n    function toAmount(\\n        IERC20 token,\\n        uint256 share,\\n        bool roundUp\\n    ) external view returns (uint256 amount) {\\n        amount = totals[token].toElastic(share, roundUp);\\n    }\\n\\n    /// @notice Deposit an amount of `token` represented in either `amount` or `share`.\\n    /// @param token_ The ERC-20 token to deposit.\\n    /// @param from which account to pull the tokens.\\n    /// @param to which account to push the tokens.\\n    /// @param amount Token amount in native representation to deposit.\\n    /// @param share Token amount represented in shares to deposit. Takes precedence over `amount`.\\n    /// @return amountOut The amount deposited.\\n    /// @return shareOut The deposited amount repesented in shares.\\n    function deposit(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) public payable allowed(from) returns (uint256 amountOut, uint256 shareOut) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;\\n        Rebase memory total = totals[token];\\n\\n        // If a new token gets added, the tokenSupply call checks that this is a deployed contract. Needed for security.\\n        require(total.elastic != 0 || token.totalSupply() > 0, \\\"BentoBox: No tokens\\\");\\n        if (share == 0) {\\n            // value of the share may be lower than the amount due to rounding, that's ok\\n            share = total.toBase(amount, false);\\n            // Any deposit should lead to at least the minimum share balance, otherwise it's ignored (no amount taken)\\n            if (total.base.add(share.to128()) < MINIMUM_SHARE_BALANCE) {\\n                return (0, 0);\\n            }\\n        } else {\\n            // amount may be lower than the value of share due to rounding, in that case, add 1 to amount (Always round up)\\n            amount = total.toElastic(share, true);\\n        }\\n\\n        // In case of skimming, check that only the skimmable amount is taken.\\n        // For ETH, the full balance is available, so no need to check.\\n        // During flashloans the _tokenBalanceOf is lower than 'reality', so skimming deposits will mostly fail during a flashloan.\\n        require(\\n            from != address(this) || token_ == USE_ETHEREUM || amount <= _tokenBalanceOf(token).sub(total.elastic),\\n            \\\"BentoBox: Skim too much\\\"\\n        );\\n\\n        balanceOf[token][to] = balanceOf[token][to].add(share);\\n        total.base = total.base.add(share.to128());\\n        total.elastic = total.elastic.add(amount.to128());\\n        totals[token] = total;\\n\\n        // Interactions\\n        // During the first deposit, we check that this token is 'real'\\n        if (token_ == USE_ETHEREUM) {\\n            // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)\\n            // X2: If the WETH implementation is faulty or malicious, it will block adding ETH (but we know the WETH implementation)\\n            IWETH(address(wethToken)).deposit{value: amount}();\\n        } else if (from != address(this)) {\\n            // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)\\n            // X2: If the token implementation is faulty or malicious, it may block adding tokens. Good.\\n            token.safeTransferFrom(from, address(this), amount);\\n        }\\n        emit LogDeposit(token, from, to, amount, share);\\n        amountOut = amount;\\n        shareOut = share;\\n    }\\n\\n    /// @notice Withdraws an amount of `token` from a user account.\\n    /// @param token_ The ERC-20 token to withdraw.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param amount of tokens. Either one of `amount` or `share` needs to be supplied.\\n    /// @param share Like above, but `share` takes precedence over `amount`.\\n    function withdraw(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) public allowed(from) returns (uint256 amountOut, uint256 shareOut) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;\\n        Rebase memory total = totals[token];\\n        if (share == 0) {\\n            // value of the share paid could be lower than the amount paid due to rounding, in that case, add a share (Always round up)\\n            share = total.toBase(amount, true);\\n        } else {\\n            // amount may be lower than the value of share due to rounding, that's ok\\n            amount = total.toElastic(share, false);\\n        }\\n\\n        balanceOf[token][from] = balanceOf[token][from].sub(share);\\n        total.elastic = total.elastic.sub(amount.to128());\\n        total.base = total.base.sub(share.to128());\\n        // There have to be at least 1000 shares left to prevent reseting the share/amount ratio (unless it's fully emptied)\\n        require(total.base >= MINIMUM_SHARE_BALANCE || total.base == 0, \\\"BentoBox: cannot empty\\\");\\n        totals[token] = total;\\n\\n        // Interactions\\n        if (token_ == USE_ETHEREUM) {\\n            // X2, X3: A revert or big gas usage in the WETH contract could block withdrawals, but WETH9 is fine.\\n            IWETH(address(wethToken)).withdraw(amount);\\n            // X2, X3: A revert or big gas usage could block, however, the to address is under control of the caller.\\n            (bool success, ) = to.call{value: amount}(\\\"\\\");\\n            require(success, \\\"BentoBox: ETH transfer failed\\\");\\n        } else {\\n            // X2, X3: A malicious token could block withdrawal of just THAT token.\\n            //         masterContracts may want to take care not to rely on withdraw always succeeding.\\n            token.safeTransfer(to, amount);\\n        }\\n        emit LogWithdraw(token, from, to, amount, share);\\n        amountOut = amount;\\n        shareOut = share;\\n    }\\n\\n    /// @notice Transfer shares from a user account to another one.\\n    /// @param token The ERC-20 token to transfer.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param share The amount of `token` in shares.\\n    // Clones of master contracts can transfer from any account that has approved them\\n    // F3 - Can it be combined with another similar function?\\n    // F3: This isn't combined with transferMultiple for gas optimization\\n    function transfer(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 share\\n    ) public allowed(from) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        balanceOf[token][from] = balanceOf[token][from].sub(share);\\n        balanceOf[token][to] = balanceOf[token][to].add(share);\\n\\n        emit LogTransfer(token, from, to, share);\\n    }\\n\\n    /// @notice Transfer shares from a user account to multiple other ones.\\n    /// @param token The ERC-20 token to transfer.\\n    /// @param from which user to pull the tokens.\\n    /// @param tos The receivers of the tokens.\\n    /// @param shares The amount of `token` in shares for each receiver in `tos`.\\n    // F3 - Can it be combined with another similar function?\\n    // F3: This isn't combined with transfer for gas optimization\\n    function transferMultiple(\\n        IERC20 token,\\n        address from,\\n        address[] calldata tos,\\n        uint256[] calldata shares\\n    ) public allowed(from) {\\n        // Checks\\n        require(tos[0] != address(0), \\\"BentoBox: to[0] not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        uint256 totalAmount;\\n        uint256 len = tos.length;\\n        for (uint256 i = 0; i < len; i++) {\\n            address to = tos[i];\\n            balanceOf[token][to] = balanceOf[token][to].add(shares[i]);\\n            totalAmount = totalAmount.add(shares[i]);\\n            emit LogTransfer(token, from, to, shares[i]);\\n        }\\n        balanceOf[token][from] = balanceOf[token][from].sub(totalAmount);\\n    }\\n\\n    /// @notice Flashloan ability.\\n    /// @param borrower The address of the contract that implements and conforms to `IFlashBorrower` and handles the flashloan.\\n    /// @param receiver Address of the token receiver.\\n    /// @param token The address of the token to receive.\\n    /// @param amount of the tokens to receive.\\n    /// @param data The calldata to pass to the `borrower` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Not possible to follow this here, reentrancy has been reviewed\\n    // F6 - Check for front-running possibilities, such as the approve function (SWC-114)\\n    // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.\\n    function flashLoan(\\n        IFlashBorrower borrower,\\n        address receiver,\\n        IERC20 token,\\n        uint256 amount,\\n        bytes calldata data\\n    ) public {\\n        uint256 fee = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;\\n        token.safeTransfer(receiver, amount);\\n\\n        borrower.onFlashLoan(msg.sender, token, amount, fee, data);\\n\\n        require(_tokenBalanceOf(token) >= totals[token].addElastic(fee.to128()), \\\"BentoBox: Wrong amount\\\");\\n        emit LogFlashLoan(address(borrower), token, amount, fee, receiver);\\n    }\\n\\n    /// @notice Support for batched flashloans. Useful to request multiple different `tokens` in a single transaction.\\n    /// @param borrower The address of the contract that implements and conforms to `IBatchFlashBorrower` and handles the flashloan.\\n    /// @param receivers An array of the token receivers. A one-to-one mapping with `tokens` and `amounts`.\\n    /// @param tokens The addresses of the tokens.\\n    /// @param amounts of the tokens for each receiver.\\n    /// @param data The calldata to pass to the `borrower` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Not possible to follow this here, reentrancy has been reviewed\\n    // F6 - Check for front-running possibilities, such as the approve function (SWC-114)\\n    // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.\\n    function batchFlashLoan(\\n        IBatchFlashBorrower borrower,\\n        address[] calldata receivers,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        bytes calldata data\\n    ) public {\\n        uint256[] memory fees = new uint256[](tokens.length);\\n\\n        uint256 len = tokens.length;\\n        for (uint256 i = 0; i < len; i++) {\\n            uint256 amount = amounts[i];\\n            fees[i] = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;\\n\\n            tokens[i].safeTransfer(receivers[i], amounts[i]);\\n        }\\n\\n        borrower.onBatchFlashLoan(msg.sender, tokens, amounts, fees, data);\\n\\n        for (uint256 i = 0; i < len; i++) {\\n            IERC20 token = tokens[i];\\n            require(_tokenBalanceOf(token) >= totals[token].addElastic(fees[i].to128()), \\\"BentoBox: Wrong amount\\\");\\n            emit LogFlashLoan(address(borrower), token, amounts[i], fees[i], receivers[i]);\\n        }\\n    }\\n\\n    /// @notice Sets the target percentage of the strategy for `token`.\\n    /// @dev Only the owner of this contract is allowed to change this.\\n    /// @param token The address of the token that maps to a strategy to change.\\n    /// @param targetPercentage_ The new target in percent. Must be lesser or equal to `MAX_TARGET_PERCENTAGE`.\\n    function setStrategyTargetPercentage(IERC20 token, uint64 targetPercentage_) public onlyOwner {\\n        // Checks\\n        require(targetPercentage_ <= MAX_TARGET_PERCENTAGE, \\\"StrategyManager: Target too high\\\");\\n\\n        // Effects\\n        strategyData[token].targetPercentage = targetPercentage_;\\n        emit LogStrategyTargetPercentage(token, targetPercentage_);\\n    }\\n\\n    /// @notice Sets the contract address of a new strategy that conforms to `IStrategy` for `token`.\\n    /// Must be called twice with the same arguments.\\n    /// A new strategy becomes pending first and can be activated once `STRATEGY_DELAY` is over.\\n    /// @dev Only the owner of this contract is allowed to change this.\\n    /// @param token The address of the token that maps to a strategy to change.\\n    /// @param newStrategy The address of the contract that conforms to `IStrategy`.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Total amount is updated AFTER interaction. But strategy is under our control.\\n    // C4 - Use block.timestamp only for long intervals (SWC-116)\\n    // C4: block.timestamp is used for a period of 2 weeks, which is long enough\\n    function setStrategy(IERC20 token, IStrategy newStrategy) public onlyOwner {\\n        StrategyData memory data = strategyData[token];\\n        IStrategy pending = pendingStrategy[token];\\n        if (data.strategyStartDate == 0 || pending != newStrategy) {\\n            pendingStrategy[token] = newStrategy;\\n            // C1 - All math done through BoringMath (SWC-101)\\n            // C1: Our sun will swallow the earth well before this overflows\\n            data.strategyStartDate = (block.timestamp + STRATEGY_DELAY).to64();\\n            emit LogStrategyQueued(token, newStrategy);\\n        } else {\\n            require(data.strategyStartDate != 0 && block.timestamp >= data.strategyStartDate, \\\"StrategyManager: Too early\\\");\\n            if (address(strategy[token]) != address(0)) {\\n                int256 balanceChange = strategy[token].exit(data.balance);\\n                // Effects\\n                if (balanceChange > 0) {\\n                    uint256 add = uint256(balanceChange);\\n                    totals[token].addElastic(add);\\n                    emit LogStrategyProfit(token, add);\\n                } else if (balanceChange < 0) {\\n                    uint256 sub = uint256(-balanceChange);\\n                    totals[token].subElastic(sub);\\n                    emit LogStrategyLoss(token, sub);\\n                }\\n\\n                emit LogStrategyDivest(token, data.balance);\\n            }\\n            strategy[token] = pending;\\n            data.strategyStartDate = 0;\\n            data.balance = 0;\\n            pendingStrategy[token] = IStrategy(0);\\n            emit LogStrategySet(token, newStrategy);\\n        }\\n        strategyData[token] = data;\\n    }\\n\\n    /// @notice The actual process of yield farming. Executes the strategy of `token`.\\n    /// Optionally does housekeeping if `balance` is true.\\n    /// `maxChangeAmount` is relevant for skimming or withdrawing if `balance` is true.\\n    /// @param token The address of the token for which a strategy is deployed.\\n    /// @param balance True if housekeeping should be done.\\n    /// @param maxChangeAmount The maximum amount for either pulling or pushing from/to the `IStrategy` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Total amount is updated AFTER interaction. But strategy is under our control.\\n    // F5: Not followed to prevent reentrancy issues with flashloans and BentoBox skims?\\n    function harvest(\\n        IERC20 token,\\n        bool balance,\\n        uint256 maxChangeAmount\\n    ) public {\\n        StrategyData memory data = strategyData[token];\\n        IStrategy _strategy = strategy[token];\\n        int256 balanceChange = _strategy.harvest(data.balance, msg.sender);\\n        if (balanceChange == 0 && !balance) {\\n            return;\\n        }\\n\\n        uint256 totalElastic = totals[token].elastic;\\n\\n        if (balanceChange > 0) {\\n            uint256 add = uint256(balanceChange);\\n            totalElastic = totalElastic.add(add);\\n            totals[token].elastic = totalElastic.to128();\\n            emit LogStrategyProfit(token, add);\\n        } else if (balanceChange < 0) {\\n            // C1 - All math done through BoringMath (SWC-101)\\n            // C1: balanceChange could overflow if it's max negative int128.\\n            // But tokens with balances that large are not supported by the BentoBox.\\n            uint256 sub = uint256(-balanceChange);\\n            totalElastic = totalElastic.sub(sub);\\n            totals[token].elastic = totalElastic.to128();\\n            data.balance = data.balance.sub(sub.to128());\\n            emit LogStrategyLoss(token, sub);\\n        }\\n\\n        if (balance) {\\n            uint256 targetBalance = totalElastic.mul(data.targetPercentage) / 100;\\n            // if data.balance == targetBalance there is nothing to update\\n            if (data.balance < targetBalance) {\\n                uint256 amountOut = targetBalance.sub(data.balance);\\n                if (maxChangeAmount != 0 && amountOut > maxChangeAmount) {\\n                    amountOut = maxChangeAmount;\\n                }\\n                token.safeTransfer(address(_strategy), amountOut);\\n                data.balance = data.balance.add(amountOut.to128());\\n                _strategy.skim(amountOut);\\n                emit LogStrategyInvest(token, amountOut);\\n            } else if (data.balance > targetBalance) {\\n                uint256 amountIn = data.balance.sub(targetBalance.to128());\\n                if (maxChangeAmount != 0 && amountIn > maxChangeAmount) {\\n                    amountIn = maxChangeAmount;\\n                }\\n\\n                uint256 actualAmountIn = _strategy.withdraw(amountIn);\\n\\n                data.balance = data.balance.sub(actualAmountIn.to128());\\n                emit LogStrategyDivest(token, actualAmountIn);\\n            }\\n        }\\n\\n        strategyData[token] = data;\\n    }\\n\\n    // Contract should be able to receive ETH deposits to support deposit & skim\\n    // solhint-disable-next-line no-empty-blocks\\n    receive() external payable {}\\n}\\n\",\"keccak256\":\"0xf5251397b9aaa5c66ddc18b0cb96350ffac09f5776a1255fedc0072641f916fe\",\"license\":\"UNLICENSED\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {
              "batch(bytes[],bool)": {
                "notice": "Allows batched call to self (this contract)."
              }
            },
            "version": 1
          }
        },
        "BentoBoxV1": {
          "abi": [
            {
              "inputs": [
                {
                  "internalType": "contract IERC20",
                  "name": "wethToken_",
                  "type": "address"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "constructor"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "masterContract",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "bytes",
                  "name": "data",
                  "type": "bytes"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "cloneAddress",
                  "type": "address"
                }
              ],
              "name": "LogDeploy",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "contract IERC20",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "share",
                  "type": "uint256"
                }
              ],
              "name": "LogDeposit",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "borrower",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "contract IERC20",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "feeAmount",
                  "type": "uint256"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "receiver",
                  "type": "address"
                }
              ],
              "name": "LogFlashLoan",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "protocol",
                  "type": "address"
                }
              ],
              "name": "LogRegisterProtocol",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "masterContract",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "user",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "bool",
                  "name": "approved",
                  "type": "bool"
                }
              ],
              "name": "LogSetMasterContractApproval",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "contract IERC20",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "LogStrategyDivest",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "contract IERC20",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "LogStrategyInvest",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "contract IERC20",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "LogStrategyLoss",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "contract IERC20",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "LogStrategyProfit",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "contract IERC20",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "contract IStrategy",
                  "name": "strategy",
                  "type": "address"
                }
              ],
              "name": "LogStrategyQueued",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "contract IERC20",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "contract IStrategy",
                  "name": "strategy",
                  "type": "address"
                }
              ],
              "name": "LogStrategySet",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "contract IERC20",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "targetPercentage",
                  "type": "uint256"
                }
              ],
              "name": "LogStrategyTargetPercentage",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "contract IERC20",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "share",
                  "type": "uint256"
                }
              ],
              "name": "LogTransfer",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "masterContract",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "bool",
                  "name": "approved",
                  "type": "bool"
                }
              ],
              "name": "LogWhiteListMasterContract",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "contract IERC20",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "share",
                  "type": "uint256"
                }
              ],
              "name": "LogWithdraw",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "previousOwner",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "newOwner",
                  "type": "address"
                }
              ],
              "name": "OwnershipTransferred",
              "type": "event"
            },
            {
              "inputs": [],
              "name": "DOMAIN_SEPARATOR",
              "outputs": [
                {
                  "internalType": "bytes32",
                  "name": "",
                  "type": "bytes32"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract IERC20",
                  "name": "",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "name": "balanceOf",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "bytes[]",
                  "name": "calls",
                  "type": "bytes[]"
                },
                {
                  "internalType": "bool",
                  "name": "revertOnFail",
                  "type": "bool"
                }
              ],
              "name": "batch",
              "outputs": [
                {
                  "internalType": "bool[]",
                  "name": "successes",
                  "type": "bool[]"
                },
                {
                  "internalType": "bytes[]",
                  "name": "results",
                  "type": "bytes[]"
                }
              ],
              "stateMutability": "payable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract IBatchFlashBorrower",
                  "name": "borrower",
                  "type": "address"
                },
                {
                  "internalType": "address[]",
                  "name": "receivers",
                  "type": "address[]"
                },
                {
                  "internalType": "contract IERC20[]",
                  "name": "tokens",
                  "type": "address[]"
                },
                {
                  "internalType": "uint256[]",
                  "name": "amounts",
                  "type": "uint256[]"
                },
                {
                  "internalType": "bytes",
                  "name": "data",
                  "type": "bytes"
                }
              ],
              "name": "batchFlashLoan",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "claimOwnership",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "masterContract",
                  "type": "address"
                },
                {
                  "internalType": "bytes",
                  "name": "data",
                  "type": "bytes"
                },
                {
                  "internalType": "bool",
                  "name": "useCreate2",
                  "type": "bool"
                }
              ],
              "name": "deploy",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "cloneAddress",
                  "type": "address"
                }
              ],
              "stateMutability": "payable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract IERC20",
                  "name": "token_",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "share",
                  "type": "uint256"
                }
              ],
              "name": "deposit",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "amountOut",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "shareOut",
                  "type": "uint256"
                }
              ],
              "stateMutability": "payable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract IFlashBorrower",
                  "name": "borrower",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "receiver",
                  "type": "address"
                },
                {
                  "internalType": "contract IERC20",
                  "name": "token",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                },
                {
                  "internalType": "bytes",
                  "name": "data",
                  "type": "bytes"
                }
              ],
              "name": "flashLoan",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract IERC20",
                  "name": "token",
                  "type": "address"
                },
                {
                  "internalType": "bool",
                  "name": "balance",
                  "type": "bool"
                },
                {
                  "internalType": "uint256",
                  "name": "maxChangeAmount",
                  "type": "uint256"
                }
              ],
              "name": "harvest",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "name": "masterContractApproved",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "name": "masterContractOf",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "name": "nonces",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "owner",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "pendingOwner",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract IERC20",
                  "name": "",
                  "type": "address"
                }
              ],
              "name": "pendingStrategy",
              "outputs": [
                {
                  "internalType": "contract IStrategy",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract IERC20",
                  "name": "token",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "deadline",
                  "type": "uint256"
                },
                {
                  "internalType": "uint8",
                  "name": "v",
                  "type": "uint8"
                },
                {
                  "internalType": "bytes32",
                  "name": "r",
                  "type": "bytes32"
                },
                {
                  "internalType": "bytes32",
                  "name": "s",
                  "type": "bytes32"
                }
              ],
              "name": "permitToken",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "registerProtocol",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "user",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "masterContract",
                  "type": "address"
                },
                {
                  "internalType": "bool",
                  "name": "approved",
                  "type": "bool"
                },
                {
                  "internalType": "uint8",
                  "name": "v",
                  "type": "uint8"
                },
                {
                  "internalType": "bytes32",
                  "name": "r",
                  "type": "bytes32"
                },
                {
                  "internalType": "bytes32",
                  "name": "s",
                  "type": "bytes32"
                }
              ],
              "name": "setMasterContractApproval",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract IERC20",
                  "name": "token",
                  "type": "address"
                },
                {
                  "internalType": "contract IStrategy",
                  "name": "newStrategy",
                  "type": "address"
                }
              ],
              "name": "setStrategy",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract IERC20",
                  "name": "token",
                  "type": "address"
                },
                {
                  "internalType": "uint64",
                  "name": "targetPercentage_",
                  "type": "uint64"
                }
              ],
              "name": "setStrategyTargetPercentage",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract IERC20",
                  "name": "",
                  "type": "address"
                }
              ],
              "name": "strategy",
              "outputs": [
                {
                  "internalType": "contract IStrategy",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract IERC20",
                  "name": "",
                  "type": "address"
                }
              ],
              "name": "strategyData",
              "outputs": [
                {
                  "internalType": "uint64",
                  "name": "strategyStartDate",
                  "type": "uint64"
                },
                {
                  "internalType": "uint64",
                  "name": "targetPercentage",
                  "type": "uint64"
                },
                {
                  "internalType": "uint128",
                  "name": "balance",
                  "type": "uint128"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract IERC20",
                  "name": "token",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "share",
                  "type": "uint256"
                },
                {
                  "internalType": "bool",
                  "name": "roundUp",
                  "type": "bool"
                }
              ],
              "name": "toAmount",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract IERC20",
                  "name": "token",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                },
                {
                  "internalType": "bool",
                  "name": "roundUp",
                  "type": "bool"
                }
              ],
              "name": "toShare",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "share",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract IERC20",
                  "name": "",
                  "type": "address"
                }
              ],
              "name": "totals",
              "outputs": [
                {
                  "internalType": "uint128",
                  "name": "elastic",
                  "type": "uint128"
                },
                {
                  "internalType": "uint128",
                  "name": "base",
                  "type": "uint128"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract IERC20",
                  "name": "token",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "share",
                  "type": "uint256"
                }
              ],
              "name": "transfer",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract IERC20",
                  "name": "token",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "internalType": "address[]",
                  "name": "tos",
                  "type": "address[]"
                },
                {
                  "internalType": "uint256[]",
                  "name": "shares",
                  "type": "uint256[]"
                }
              ],
              "name": "transferMultiple",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "newOwner",
                  "type": "address"
                },
                {
                  "internalType": "bool",
                  "name": "direct",
                  "type": "bool"
                },
                {
                  "internalType": "bool",
                  "name": "renounce",
                  "type": "bool"
                }
              ],
              "name": "transferOwnership",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "masterContract",
                  "type": "address"
                },
                {
                  "internalType": "bool",
                  "name": "approved",
                  "type": "bool"
                }
              ],
              "name": "whitelistMasterContract",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "name": "whitelistedMasterContracts",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract IERC20",
                  "name": "token_",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "share",
                  "type": "uint256"
                }
              ],
              "name": "withdraw",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "amountOut",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "shareOut",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "stateMutability": "payable",
              "type": "receive"
            }
          ],
          "devdoc": {
            "author": "BoringCrypto, Keno",
            "kind": "dev",
            "methods": {
              "batch(bytes[],bool)": {
                "params": {
                  "calls": "An array of inputs for each call.",
                  "revertOnFail": "If True then reverts after a failed call and stops doing further calls."
                },
                "returns": {
                  "results": "An array with the returned data of each function call, mapped one-to-one to `calls`.",
                  "successes": "An array indicating the success of a call, mapped one-to-one to `calls`."
                }
              },
              "batchFlashLoan(address,address[],address[],uint256[],bytes)": {
                "params": {
                  "amounts": "of the tokens for each receiver.",
                  "borrower": "The address of the contract that implements and conforms to `IBatchFlashBorrower` and handles the flashloan.",
                  "data": "The calldata to pass to the `borrower` contract.",
                  "receivers": "An array of the token receivers. A one-to-one mapping with `tokens` and `amounts`.",
                  "tokens": "The addresses of the tokens."
                }
              },
              "deploy(address,bytes,bool)": {
                "params": {
                  "data": "Additional abi encoded calldata that is passed to the new clone via `IMasterContract.init`.",
                  "masterContract": "The address of the contract to clone.",
                  "useCreate2": "Creates the clone by using the CREATE2 opcode, in this case `data` will be used as salt."
                },
                "returns": {
                  "cloneAddress": "Address of the created clone contract."
                }
              },
              "deposit(address,address,address,uint256,uint256)": {
                "params": {
                  "amount": "Token amount in native representation to deposit.",
                  "from": "which account to pull the tokens.",
                  "share": "Token amount represented in shares to deposit. Takes precedence over `amount`.",
                  "to": "which account to push the tokens.",
                  "token_": "The ERC-20 token to deposit."
                },
                "returns": {
                  "amountOut": "The amount deposited.",
                  "shareOut": "The deposited amount repesented in shares."
                }
              },
              "flashLoan(address,address,address,uint256,bytes)": {
                "params": {
                  "amount": "of the tokens to receive.",
                  "borrower": "The address of the contract that implements and conforms to `IFlashBorrower` and handles the flashloan.",
                  "data": "The calldata to pass to the `borrower` contract.",
                  "receiver": "Address of the token receiver.",
                  "token": "The address of the token to receive."
                }
              },
              "harvest(address,bool,uint256)": {
                "params": {
                  "balance": "True if housekeeping should be done.",
                  "maxChangeAmount": "The maximum amount for either pulling or pushing from/to the `IStrategy` contract.",
                  "token": "The address of the token for which a strategy is deployed."
                }
              },
              "setMasterContractApproval(address,address,bool,uint8,bytes32,bytes32)": {
                "params": {
                  "approved": "If True approves access. If False revokes access.",
                  "masterContract": "The address who gains or loses access.",
                  "r": "Part of the signature. (See EIP-191)",
                  "s": "Part of the signature. (See EIP-191)",
                  "user": "The address of the user that approves or revokes access.",
                  "v": "Part of the signature. (See EIP-191)"
                }
              },
              "setStrategy(address,address)": {
                "details": "Only the owner of this contract is allowed to change this.",
                "params": {
                  "newStrategy": "The address of the contract that conforms to `IStrategy`.",
                  "token": "The address of the token that maps to a strategy to change."
                }
              },
              "setStrategyTargetPercentage(address,uint64)": {
                "details": "Only the owner of this contract is allowed to change this.",
                "params": {
                  "targetPercentage_": "The new target in percent. Must be lesser or equal to `MAX_TARGET_PERCENTAGE`.",
                  "token": "The address of the token that maps to a strategy to change."
                }
              },
              "toAmount(address,uint256,bool)": {
                "details": "Helper function represent shares back into the `token` amount.",
                "params": {
                  "roundUp": "If the result should be rounded up.",
                  "share": "The amount of shares.",
                  "token": "The ERC-20 token."
                },
                "returns": {
                  "amount": "The share amount back into native representation."
                }
              },
              "toShare(address,uint256,bool)": {
                "details": "Helper function to represent an `amount` of `token` in shares.",
                "params": {
                  "amount": "The `token` amount.",
                  "roundUp": "If the result `share` should be rounded up.",
                  "token": "The ERC-20 token."
                },
                "returns": {
                  "share": "The token amount represented in shares."
                }
              },
              "transfer(address,address,address,uint256)": {
                "params": {
                  "from": "which user to pull the tokens.",
                  "share": "The amount of `token` in shares.",
                  "to": "which user to push the tokens.",
                  "token": "The ERC-20 token to transfer."
                }
              },
              "transferMultiple(address,address,address[],uint256[])": {
                "params": {
                  "from": "which user to pull the tokens.",
                  "shares": "The amount of `token` in shares for each receiver in `tos`.",
                  "token": "The ERC-20 token to transfer.",
                  "tos": "The receivers of the tokens."
                }
              },
              "transferOwnership(address,bool,bool)": {
                "params": {
                  "direct": "True if `newOwner` should be set immediately. False if `newOwner` needs to use `claimOwnership`.",
                  "newOwner": "Address of the new owner.",
                  "renounce": "Allows the `newOwner` to be `address(0)` if `direct` and `renounce` is True. Has no effect otherwise."
                }
              },
              "withdraw(address,address,address,uint256,uint256)": {
                "params": {
                  "amount": "of tokens. Either one of `amount` or `share` needs to be supplied.",
                  "from": "which user to pull the tokens.",
                  "share": "Like above, but `share` takes precedence over `amount`.",
                  "to": "which user to push the tokens.",
                  "token_": "The ERC-20 token to withdraw."
                }
              }
            },
            "title": "BentoBox",
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "60e06040523480156200001157600080fd5b50604051620047d5380380620047d5833981016040819052620000349162000116565b600080546001600160a01b0319163390811782556040519091907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a34660a081905262000084816200009e565b6080525060601b6001600160601b03191660c0526200016a565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8667fd7df266aff736d415a9dc14b4158201d612e70d75b9c7f4e375ccfd20aa5166f8330604051602001620000f9949392919062000146565b604051602081830303815290604052805190602001209050919050565b60006020828403121562000128578081fd5b81516001600160a01b03811681146200013f578182fd5b9392505050565b938452602084019290925260408301526001600160a01b0316606082015260800190565b60805160a05160c05160601c61462c620001a9600039806106c552806109925280611ed052806120b1525080611021525080611056525061462c6000f3fe6080604052600436106101dc5760003560e01c80637c516e9411610102578063d2423b5111610095578063f1676d3711610064578063f1676d3714610555578063f18d03cc14610575578063f483b3da14610595578063f7888aec146105b5576101e3565b8063d2423b51146104d0578063da5139ca146104f1578063df23b45b14610511578063e30c397814610540576101e3565b806397da6d30116100d157806397da6d301461045b578063aee4d1b21461047b578063bafe4f1414610490578063c0a47c93146104b0576101e3565b80637c516e94146103e65780637ecebe00146104065780638da5cb5b1461042657806391e0eab51461043b576101e3565b80633e2a9d4e1161017a5780635662311811610149578063566231181461036657806366c6bb0b1461038657806372cb5d97146103a6578063733a9d7c146103c6576101e3565b80633e2a9d4e146102e35780634e71e0c8146103035780634ffe34db146103185780635108a55814610346576101e3565b806312a90c8a116101b657806312a90c8a146102545780631f54245b14610281578063228bfd9f146102a15780633644e515146102c1576101e3565b806302b9446c146101e8578063078dfbe7146102125780630fca884314610234576101e3565b366101e357005b600080fd5b6101fb6101f6366004613795565b6105d5565b604051610209929190614502565b60405180910390f35b34801561021e57600080fd5b5061023261022d36600461354c565b610a99565b005b34801561024057600080fd5b5061023261024f366004613870565b610b7f565b34801561026057600080fd5b5061027461026f36600461345f565b610e30565b6040516102099190613e01565b61029461028f366004613596565b610e45565b6040516102099190613bc8565b3480156102ad57600080fd5b506102946102bc36600461345f565b611001565b3480156102cd57600080fd5b506102d661101c565b6040516102099190613e0c565b3480156102ef57600080fd5b506102326102fe366004613977565b61107c565b34801561030f57600080fd5b50610232611147565b34801561032457600080fd5b5061033861033336600461345f565b6111d4565b6040516102099291906144e8565b34801561035257600080fd5b5061029461036136600461345f565b6111fa565b34801561037257600080fd5b506102d6610381366004613941565b611215565b34801561039257600080fd5b506102326103a1366004613901565b611269565b3480156103b257600080fd5b506102326103c1366004613733565b611832565b3480156103d257600080fd5b506102326103e136600461351f565b611c90565b3480156103f257600080fd5b506102326104013660046137ef565b611d34565b34801561041257600080fd5b506102d661042136600461345f565b611da8565b34801561043257600080fd5b50610294611dba565b34801561044757600080fd5b5061027461045636600461347b565b611dc9565b34801561046757600080fd5b506101fb610476366004613795565b611de9565b34801561048757600080fd5b506102326121fd565b34801561049c57600080fd5b506102946104ab36600461345f565b612244565b3480156104bc57600080fd5b506102326104cb3660046134b3565b61225f565b6104e36104de3660046135fb565b61256e565b604051610209929190613d67565b3480156104fd57600080fd5b506102d661050c366004613941565b6126fe565b34801561051d57600080fd5b5061053161052c36600461345f565b61274a565b60405161020993929190614524565b34801561054c57600080fd5b50610294612783565b34801561056157600080fd5b506102326105703660046139af565b612792565b34801561058157600080fd5b50610232610590366004613745565b6128e3565b3480156105a157600080fd5b506102326105b0366004613660565b612a87565b3480156105c157600080fd5b506102d66105d0366004613733565b612d47565b600080856001600160a01b03811633148015906105fb57506001600160a01b0381163014155b1561068657336000908152600260205260409020546001600160a01b03168061063f5760405162461bcd60e51b815260040161063690614305565b60405180910390fd5b6001600160a01b0380821660009081526003602090815260408083209386168352929052205460ff166106845760405162461bcd60e51b815260040161063690614188565b505b6001600160a01b0386166106ac5760405162461bcd60e51b8152600401610636906140ee565b60006001600160a01b038916156106c357886106e5565b7f00000000000000000000000000000000000000000000000000000000000000005b90506106ef613385565b506001600160a01b0381166000908152600760209081526040918290208251808401909352546001600160801b03808216808552600160801b90920416918301919091521515806107b057506000826001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561077657600080fd5b505afa15801561078a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ae9190613a1f565b115b6107cc5760405162461bcd60e51b81526004016106369061401c565b85610824576107dd81886000612d64565b95506103e86108026107ee88612dfe565b60208401516001600160801b031690612e2b565b6001600160801b0316101561081f57600080945094505050610a8e565b610833565b61083081876001612e60565b96505b6001600160a01b0389163014158061085257506001600160a01b038a16155b8061087a57508051610876906001600160801b031661087084612edf565b90612f87565b8711155b6108965760405162461bcd60e51b815260040161063690613ee1565b6001600160a01b038083166000908152600660209081526040808320938c16835292905220546108c69087612faa565b6001600160a01b038084166000908152600660209081526040808320938d168352929052205561090c6108f887612dfe565b60208301516001600160801b031690612e2b565b6001600160801b0316602082015261093761092688612dfe565b82516001600160801b031690612e2b565b6001600160801b0390811682526001600160a01b03808416600090815260076020908152604090912084518154928601518516600160801b029085166001600160801b031990931692909217909316179091558a16610a09577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0886040518263ffffffff1660e01b81526004016000604051808303818588803b1580156109eb57600080fd5b505af11580156109ff573d6000803e3d6000fd5b5050505050610a2e565b6001600160a01b0389163014610a2e57610a2e6001600160a01b0383168a308a612fcd565b876001600160a01b0316896001600160a01b0316836001600160a01b03167fb2346165e782564f17f5b7e555c21f4fd96fbc93458572bf0113ea35a958fc558a8a604051610a7d929190614502565b60405180910390a486945085935050505b509550959350505050565b6000546001600160a01b03163314610ac35760405162461bcd60e51b815260040161063690614153565b8115610b5e576001600160a01b038316151580610add5750805b610af95760405162461bcd60e51b815260040161063690613fed565b600080546040516001600160a01b03808716939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0385166001600160a01b031991821617909155600180549091169055610b7a565b600180546001600160a01b0319166001600160a01b0385161790555b505050565b846001600160a01b0381163314801590610ba257506001600160a01b0381163014155b15610c2457336000908152600260205260409020546001600160a01b031680610bdd5760405162461bcd60e51b815260040161063690614305565b6001600160a01b0380821660009081526003602090815260408083209386168352929052205460ff16610c225760405162461bcd60e51b815260040161063690614188565b505b600085858281610c3057fe5b9050602002016020810190610c45919061345f565b6001600160a01b03161415610c6c5760405162461bcd60e51b8152600401610636906140b7565b600084815b81811015610dc8576000888883818110610c8757fe5b9050602002016020810190610c9c919061345f565b9050610d0b878784818110610cad57fe5b90506020020135600660008e6001600160a01b03166001600160a01b031681526020019081526020016000206000846001600160a01b03166001600160a01b0316815260200190815260200160002054612faa90919063ffffffff16565b6001600160a01b03808d16600090815260066020908152604080832093861683529290522055610d56878784818110610d4057fe5b9050602002013585612faa90919063ffffffff16565b9350806001600160a01b03168a6001600160a01b03168c6001600160a01b03167f6eabe333476233fd382224f233210cb808a7bc4c4de64f9d76628bf63c677b1a8a8a87818110610da357fe5b90506020020135604051610db79190613e0c565b60405180910390a450600101610c71565b506001600160a01b03808a166000908152600660209081526040808320938c1683529290522054610df99083612f87565b6001600160a01b03998a1660009081526006602090815260408083209b909c16825299909952989097209790975550505050505050565b60046020526000908152604090205460ff1681565b60006001600160a01b038516610e6d5760405162461bcd60e51b815260040161063690614299565b606085901b8215610edf5760008585604051610e8a929190613b72565b60405180910390209050604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81528260148201526e5af43d82803e903d91602b57fd5bf360881b6028820152816037826000f593505050610f24565b604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81528160148201526e5af43d82803e903d91602b57fd5bf360881b60288201526037816000f09250505b6001600160a01b038281166000818152600260205260409081902080546001600160a01b031916938a16939093179092559051631377d1f560e21b8152634ddf47d4903490610f799089908990600401613e8b565b6000604051808303818588803b158015610f9257600080fd5b505af1158015610fa6573d6000803e3d6000fd5b5050505050816001600160a01b0316866001600160a01b03167fd62166f3c2149208e51788b1401cc356bf5da1fc6c7886a32e18570f57d88b3b8787604051610ff0929190613e8b565b60405180910390a350949350505050565b6008602052600090815260409020546001600160a01b031681565b6000467f000000000000000000000000000000000000000000000000000000000000000081146110545761104f816130c6565b611076565b7f00000000000000000000000000000000000000000000000000000000000000005b91505090565b6000546001600160a01b031633146110a65760405162461bcd60e51b815260040161063690614153565b605f816001600160401b031611156110d05760405162461bcd60e51b81526004016106369061447d565b6001600160a01b0382166000818152600a602052604090819020805467ffffffffffffffff60401b1916600160401b6001600160401b03861602179055517f7543af99b5602c06e62da0631b5308489a5ff859150105a623b6eb15e8deae0b9061113b908490614510565b60405180910390a25050565b6001546001600160a01b03163381146111725760405162461bcd60e51b8152600401610636906141bf565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b039092166001600160a01b0319928316179055600180549091169055565b6007602052600090815260409020546001600160801b0380821691600160801b90041682565b6009602052600090815260409020546001600160a01b031681565b6001600160a01b03831660009081526007602090815260408083208151808301909252546001600160801b038082168352600160801b9091041691810191909152611261908484612e60565b949350505050565b61127161339c565b506001600160a01b038381166000818152600a60209081526040808320815160608101835290546001600160401b038082168352600160401b82041682850152600160801b90046001600160801b031681830190815294845260089092528083205493519051630c7e663b60e11b81529194939093169283916318fccc76916112fe9133906004016144c6565b602060405180830381600087803b15801561131857600080fd5b505af115801561132c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113509190613a1f565b90508015801561135e575084155b1561136b57505050610b7a565b6001600160a01b0386166000908152600760205260408120546001600160801b03169082131561142157816113a08282612faa565b91506113ab82612dfe565b6001600160a01b0389166000818152600760205260409081902080546001600160801b0319166001600160801b03949094169390931790925590517f911c9f20a03edabcbcbd18dca1174cce47a91b234ced7a5a3c60ba0d5b56c5d290611413908490613e0c565b60405180910390a2506114ef565b60008212156114ef5760008290036114398282612f87565b915061144482612dfe565b6001600160a01b038916600090815260076020526040902080546001600160801b0319166001600160801b039290921691909117905561149a61148682612dfe565b60408701516001600160801b03169061313d565b6001600160801b0316604080870191909152516001600160a01b038916907f8f1f26eb9b6aa8689dbdd519ead1999d9c8819d4738e403b2003b18197d9cf97906114e5908490613e0c565b60405180910390a2505b85156117ae576000606461151986602001516001600160401b03168461316c90919063ffffffff16565b8161152057fe5b0490508085604001516001600160801b0316101561165b57600061155a86604001516001600160801b031683612f8790919063ffffffff16565b9050861580159061156a57508681115b156115725750855b6115866001600160a01b038a1686836131a3565b6115a661159282612dfe565b60408801516001600160801b031690612e2b565b6001600160801b031660408088019190915251636939aaf560e01b81526001600160a01b03861690636939aaf5906115e2908490600401613e0c565b600060405180830381600087803b1580156115fc57600080fd5b505af1158015611610573d6000803e3d6000fd5b50505050886001600160a01b03167fb18e7e4f6eac147a63a3bb6beb2d9039c88698623aff3efc4febbc20b0164ee58260405161164d9190613e0c565b60405180910390a2506117ac565b8085604001516001600160801b031611156117ac57600061169261167e83612dfe565b60408801516001600160801b03169061313d565b6001600160801b0316905086158015906116ab57508681115b156116b35750855b604051632e1a7d4d60e01b81526000906001600160a01b03871690632e1a7d4d906116e2908590600401613e0c565b602060405180830381600087803b1580156116fc57600080fd5b505af1158015611710573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117349190613a1f565b905061175661174282612dfe565b60408901516001600160801b03169061313d565b6001600160801b0316604080890191909152516001600160a01b038b16907f39aa22060f8dd4d291720311feedf3b72fef47c06c66ccf5c22b502c62e7550a906117a1908490613e0c565b60405180910390a250505b505b5050506001600160a01b0384166000908152600a6020908152604091829020835181549285015193909401516001600160801b03908116600160801b026001600160401b03948516600160401b0267ffffffffffffffff60401b199590961667ffffffffffffffff1990941693909317939093169390931791909116179055505050565b6000546001600160a01b0316331461185c5760405162461bcd60e51b815260040161063690614153565b61186461339c565b506001600160a01b038281166000818152600a60209081526040808320815160608101835290546001600160401b038082168352600160401b8204811683860152600160801b9091046001600160801b0316828401529484526009909252909120548151919316911615806118eb5750826001600160a01b0316816001600160a01b031614155b15611975576001600160a01b03848116600090815260096020526040902080546001600160a01b03191691851691909117905561192c621275004201613299565b6001600160401b031682526040516001600160a01b0380851691908616907f6f7ccdf3f86039e5a1dcf6028bf7b4773cbf7a234716ba2e5392b12bb0f8558f90600090a3611c10565b81516001600160401b031615801590611998575081516001600160401b03164210155b6119b45760405162461bcd60e51b81526004016106369061411c565b6001600160a01b038481166000908152600860205260409020541615611b99576001600160a01b0380851660009081526008602052604080822054858201519151637f8661a160e01b815292931691637f8661a191611a15916004016144b2565b602060405180830381600087803b158015611a2f57600080fd5b505af1158015611a43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a679190613a1f565b90506000811315611ade576001600160a01b03851660009081526007602052604090208190611a9690826132c2565b50856001600160a01b03167f911c9f20a03edabcbcbd18dca1174cce47a91b234ced7a5a3c60ba0d5b56c5d282604051611ad09190613e0c565b60405180910390a250611b52565b6000811215611b52576001600160a01b03851660009081526007602052604081209082900390611b0e9082613306565b50856001600160a01b03167f8f1f26eb9b6aa8689dbdd519ead1999d9c8819d4738e403b2003b18197d9cf9782604051611b489190613e0c565b60405180910390a2505b846001600160a01b03167f39aa22060f8dd4d291720311feedf3b72fef47c06c66ccf5c22b502c62e7550a8460400151604051611b8f91906144b2565b60405180910390a2505b6001600160a01b03808516600081815260086020908152604080832080548688166001600160a01b0319918216179091558388528782018490528484526009909252808320805490921690915551928616927f03e6352a885adc4cc54767592939c3b1bbd65685658c3beaaba66a888120e2179190a35b506001600160a01b03929092166000908152600a60209081526040918290208451815492860151939095015167ffffffffffffffff199092166001600160401b039586161767ffffffffffffffff60401b1916600160401b9590931694909402919091176001600160801b03908116600160801b91909216021790915550565b6000546001600160a01b03163314611cba5760405162461bcd60e51b815260040161063690614153565b6001600160a01b038216611ce05760405162461bcd60e51b815260040161063690613f18565b6001600160a01b03821660008181526004602052604090819020805460ff1916841515179055517f31a1e0eac44b54ac6c2a2efa87e92c83405ffcf33fceef02a7bca695130e26009061113b908490613e01565b60405163d505accf60e01b81526001600160a01b0389169063d505accf90611d6c908a908a908a908a908a908a908a90600401613d0d565b600060405180830381600087803b158015611d8657600080fd5b505af1158015611d9a573d6000803e3d6000fd5b505050505050505050505050565b60056020526000908152604090205481565b6000546001600160a01b031681565b600360209081526000928352604080842090915290825290205460ff1681565b600080856001600160a01b0381163314801590611e0f57506001600160a01b0381163014155b15611e9157336000908152600260205260409020546001600160a01b031680611e4a5760405162461bcd60e51b815260040161063690614305565b6001600160a01b0380821660009081526003602090815260408083209386168352929052205460ff16611e8f5760405162461bcd60e51b815260040161063690614188565b505b6001600160a01b038616611eb75760405162461bcd60e51b8152600401610636906140ee565b60006001600160a01b03891615611ece5788611ef0565b7f00000000000000000000000000000000000000000000000000000000000000005b9050611efa613385565b506001600160a01b0381166000908152600760209081526040918290208251808401909352546001600160801b038082168452600160801b909104169082015285611f5257611f4b81886001612d64565b9550611f61565b611f5e81876000612e60565b96505b6001600160a01b038083166000908152600660209081526040808320938d1683529290522054611f919087612f87565b6001600160a01b038084166000908152600660209081526040808320938e1683529290522055611fd4611fc388612dfe565b82516001600160801b03169061313d565b6001600160801b03168152611fff611feb87612dfe565b60208301516001600160801b03169061313d565b6001600160801b0316602082018190526103e811158061202a575060208101516001600160801b0316155b6120465760405162461bcd60e51b815260040161063690613fbd565b6001600160a01b03828116600090815260076020908152604090912083518154928501516001600160801b03199093166001600160801b03918216178116600160801b91909316029190911790558a1661219a57604051632e1a7d4d60e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690632e1a7d4d906120e6908a90600401613e0c565b600060405180830381600087803b15801561210057600080fd5b505af1158015612114573d6000803e3d6000fd5b505050506000886001600160a01b03168860405161213190613bc5565b60006040518083038185875af1925050503d806000811461216e576040519150601f19603f3d011682016040523d82523d6000602084013e612173565b606091505b50509050806121945760405162461bcd60e51b81526004016106369061440f565b506121ae565b6121ae6001600160a01b03831689896131a3565b876001600160a01b0316896001600160a01b0316836001600160a01b03167fad9ab9ee6953d4d177f4a03b3a3ac3178ffcb9816319f348060194aa76b144868a8a604051610a7d929190614502565b3360008181526002602052604080822080546001600160a01b03191684179055517fdfb44ffabf0d3a8f650d3ce43eff98f6d050e7ea1a396d5794f014e7dadabacb9190a2565b6002602052600090815260409020546001600160a01b031681565b6001600160a01b0385166122855760405162461bcd60e51b8152600401610636906142ce565b81158015612291575080155b801561229e575060ff8316155b15612340576001600160a01b03861633146122cb5760405162461bcd60e51b815260040161063690613f4f565b6001600160a01b0386811660009081526002602052604090205416156123035760405162461bcd60e51b81526004016106369061422b565b6001600160a01b03851660009081526004602052604090205460ff1661233b5760405162461bcd60e51b8152600401610636906143d8565b6124fa565b6001600160a01b0386166123665760405162461bcd60e51b815260040161063690614371565b600060405180604001604052806002815260200161190160f01b81525061238b61101c565b7f1962bc9f5484cb7a998701b81090e966ee1fce5771af884cceee7c081b14ade2876123d7577fb426802f1f7dc850a7b6b38805edea2442f3992878a9ab985abfe8091d95d0b16123f9565b7f422ac5323fe049241dee67716229a1cc1bc7b313b23dfe3ef6d42ab177a3b2845b6001600160a01b038b1660009081526005602090815260409182902080546001810190915591516124339493928e928e928e929101613e15565b6040516020818303038152906040528051906020012060405160200161245b93929190613b9e565b6040516020818303038152906040528051906020012090506000600182868686604051600081526020016040526040516124989493929190613e6d565b6020604051602081039080840390855afa1580156124ba573d6000803e3d6000fd5b505050602060405103519050876001600160a01b0316816001600160a01b0316146124f75760405162461bcd60e51b815260040161063690614262565b50505b6001600160a01b038581166000818152600360209081526040808320948b168084529490915290819020805460ff1916881515179055517f5f6ebb64ba012a851c6f014e6cad458ddf213d1512049b31cd06365c2b0592579061255e908890613e01565b60405180910390a3505050505050565b606080836001600160401b038111801561258757600080fd5b506040519080825280602002602001820160405280156125b1578160200160208202803683370190505b509150836001600160401b03811180156125ca57600080fd5b506040519080825280602002602001820160405280156125fe57816020015b60608152602001906001900390816125e95790505b50905060005b848110156126f557600060603088888581811061261d57fe5b905060200281019061262f9190614550565b60405161263d929190613b72565b600060405180830381855af49150503d8060008114612678576040519150601f19603f3d011682016040523d82523d6000602084013e61267d565b606091505b5091509150818061268c575085155b61269582613325565b906126b35760405162461bcd60e51b81526004016106369190613e9f565b50818584815181106126c157fe5b602002602001019015159081151581525050808484815181106126e057fe5b60209081029190910101525050600101612604565b50935093915050565b6001600160a01b03831660009081526007602090815260408083208151808301909252546001600160801b038082168352600160801b9091041691810191909152611261908484612d64565b600a602052600090815260409020546001600160401b0380821691600160401b810490911690600160801b90046001600160801b031683565b6001546001600160a01b031681565b6000620186a06127a385603261316c565b816127aa57fe5b0490506127c16001600160a01b03861687866131a3565b6040516323e30c8b60e01b81526001600160a01b038816906323e30c8b906127f79033908990899087908a908a90600401613ca2565b600060405180830381600087803b15801561281157600080fd5b505af1158015612825573d6000803e3d6000fd5b5050505061285c61283582612dfe565b6001600160a01b0387166000908152600760205260409020906001600160801b03166132c2565b61286586612edf565b10156128835760405162461bcd60e51b8152600401610636906143a8565b856001600160a01b0316856001600160a01b0316886001600160a01b03167f3be9b85936d5d30a1655ea116a17ee3d827b2cd428cc026ce5bf2ac46a22320487856040516128d2929190614502565b60405180910390a450505050505050565b826001600160a01b038116331480159061290657506001600160a01b0381163014155b1561298857336000908152600260205260409020546001600160a01b0316806129415760405162461bcd60e51b815260040161063690614305565b6001600160a01b0380821660009081526003602090815260408083209386168352929052205460ff166129865760405162461bcd60e51b815260040161063690614188565b505b6001600160a01b0383166129ae5760405162461bcd60e51b8152600401610636906140ee565b6001600160a01b038086166000908152600660209081526040808320938816835292905220546129de9083612f87565b6001600160a01b03868116600090815260066020908152604080832089851684529091528082209390935590851681522054612a1a9083612faa565b6001600160a01b0380871660008181526006602090815260408083208986168085529252918290209490945551918716917f6eabe333476233fd382224f233210cb808a7bc4c4de64f9d76628bf63c677b1a90612a78908790613e0c565b60405180910390a45050505050565b6060856001600160401b0381118015612a9f57600080fd5b50604051908082528060200260200182016040528015612ac9578160200160208202803683370190505b5090508560005b81811015612b98576000878783818110612ae657fe5b905060200201359050620186a0612b0760328361316c90919063ffffffff16565b81612b0e57fe5b04848381518110612b1b57fe5b602002602001018181525050612b8f8c8c84818110612b3657fe5b9050602002016020810190612b4b919061345f565b898985818110612b5757fe5b905060200201358c8c86818110612b6a57fe5b9050602002016020810190612b7f919061345f565b6001600160a01b031691906131a3565b50600101612ad0565b5060405163d9d1762360e01b81526001600160a01b038c169063d9d1762390612bd39033908c908c908c908c908a908d908d90600401613bdc565b600060405180830381600087803b158015612bed57600080fd5b505af1158015612c01573d6000803e3d6000fd5b5050505060005b81811015611d9a576000898983818110612c1e57fe5b9050602002016020810190612c33919061345f565b9050612c7b612c54858481518110612c4757fe5b6020026020010151612dfe565b6001600160a01b0383166000908152600760205260409020906001600160801b03166132c2565b612c8482612edf565b1015612ca25760405162461bcd60e51b8152600401610636906143a8565b8b8b83818110612cae57fe5b9050602002016020810190612cc3919061345f565b6001600160a01b0316816001600160a01b03168e6001600160a01b03167f3be9b85936d5d30a1655ea116a17ee3d827b2cd428cc026ce5bf2ac46a2232048b8b87818110612d0d57fe5b90506020020135888781518110612d2057fe5b6020026020010151604051612d36929190614502565b60405180910390a450600101612c08565b600660209081526000928352604080842090915290825290205481565b82516000906001600160801b0316612d7d575081612df7565b835160208501516001600160801b0391821691612d9c9186911661316c565b81612da357fe5b049050818015612de757508284602001516001600160801b0316612ddd86600001516001600160801b03168461316c90919063ffffffff16565b81612de457fe5b04105b15612df757611261816001612faa565b9392505050565b60006001600160801b03821115612e275760405162461bcd60e51b815260040161063690614049565b5090565b8181016001600160801b038083169082161015612e5a5760405162461bcd60e51b815260040161063690614080565b92915050565b600083602001516001600160801b031660001415612e7f575081612df7565b602084015184516001600160801b0391821691612e9e9186911661316c565b81612ea557fe5b049050818015612de757508284600001516001600160801b0316612ddd86602001516001600160801b03168461316c90919063ffffffff16565b6001600160a01b0381166000818152600a60205260408082205490516370a0823160e01b81529192612e5a92600160801b9092046001600160801b0316916370a0823190612f31903090600401613bc8565b60206040518083038186803b158015612f4957600080fd5b505afa158015612f5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f819190613a1f565b90612faa565b80820382811115612e5a5760405162461bcd60e51b815260040161063690613eb2565b81810181811015612e5a5760405162461bcd60e51b815260040161063690614080565b60006060856001600160a01b03166323b872dd60e01b868686604051602401612ff893929190613ce9565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516130369190613b82565b6000604051808303816000865af19150503d8060008114613073576040519150601f19603f3d011682016040523d82523d6000602084013e613078565b606091505b50915091508180156130a25750805115806130a25750808060200190518101906130a29190613644565b6130be5760405162461bcd60e51b81526004016106369061433c565b505050505050565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8667fd7df266aff736d415a9dc14b4158201d612e70d75b9c7f4e375ccfd20aa5166f833060405160200161311f9493929190613e49565b6040516020818303038152906040528051906020012090505b919050565b8082036001600160801b038084169082161115612e5a5760405162461bcd60e51b815260040161063690613eb2565b60008115806131875750508082028282828161318457fe5b04145b612e5a5760405162461bcd60e51b815260040161063690614446565b60006060846001600160a01b031663a9059cbb60e01b85856040516024016131cc929190613d4e565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252905161320a9190613b82565b6000604051808303816000865af19150503d8060008114613247576040519150601f19603f3d011682016040523d82523d6000602084013e61324c565b606091505b50915091508180156132765750805115806132765750808060200190518101906132769190613644565b6132925760405162461bcd60e51b815260040161063690613f86565b5050505050565b60006001600160401b03821115612e275760405162461bcd60e51b8152600401610636906141f4565b60006132e16132d083612dfe565b84546001600160801b031690612e2b565b83546001600160801b0319166001600160801b03919091169081179093555090919050565b60006132e161331483612dfe565b84546001600160801b03169061313d565b606060448251101561336b575060408051808201909152601d81527f5472616e73616374696f6e2072657665727465642073696c656e746c790000006020820152613138565b60048201915081806020019051810190612e5a9190613a37565b604080518082019091526000808252602082015290565b604080516060810182526000808252602082018190529181019190915290565b60008083601f8401126133cd578182fd5b5081356001600160401b038111156133e3578182fd5b60208301915083602080830285010111156133fd57600080fd5b9250929050565b60008083601f840112613415578182fd5b5081356001600160401b0381111561342b578182fd5b6020830191508360208285010111156133fd57600080fd5b8035612e5a816145d0565b803560ff81168114612e5a57600080fd5b600060208284031215613470578081fd5b8135612df7816145d0565b6000806040838503121561348d578081fd5b8235613498816145d0565b915060208301356134a8816145d0565b809150509250929050565b60008060008060008060c087890312156134cb578182fd5b86356134d6816145d0565b955060208701356134e6816145d0565b945060408701356134f6816145e8565b9350613505886060890161344e565b92506080870135915060a087013590509295509295509295565b60008060408385031215613531578182fd5b823561353c816145d0565b915060208301356134a8816145e8565b600080600060608486031215613560578283fd5b833561356b816145d0565b9250602084013561357b816145e8565b9150604084013561358b816145e8565b809150509250925092565b600080600080606085870312156135ab578384fd5b84356135b6816145d0565b935060208501356001600160401b038111156135d0578384fd5b6135dc87828801613404565b90945092505060408501356135f0816145e8565b939692955090935050565b60008060006040848603121561360f578081fd5b83356001600160401b03811115613624578182fd5b613630868287016133bc565b909450925050602084013561358b816145e8565b600060208284031215613655578081fd5b8151612df7816145e8565b600080600080600080600080600060a08a8c03121561367d578687fd5b8935613688816145d0565b985060208a01356001600160401b03808211156136a3578889fd5b6136af8d838e016133bc565b909a50985060408c01359150808211156136c7578485fd5b6136d38d838e016133bc565b909850965060608c01359150808211156136eb578485fd5b6136f78d838e016133bc565b909650945060808c013591508082111561370f578384fd5b5061371c8c828d01613404565b915080935050809150509295985092959850929598565b6000806040838503121561348d578182fd5b6000806000806080858703121561375a578182fd5b8435613765816145d0565b93506020850135613775816145d0565b92506040850135613785816145d0565b9396929550929360600135925050565b600080600080600060a086880312156137ac578283fd5b85356137b7816145d0565b945060208601356137c7816145d0565b935060408601356137d7816145d0565b94979396509394606081013594506080013592915050565b600080600080600080600080610100898b03121561380b578182fd5b8835613816816145d0565b97506020890135613826816145d0565b96506040890135613836816145d0565b955060608901359450608089013593506138538a60a08b0161344e565b925060c0890135915060e089013590509295985092959890939650565b60008060008060008060808789031215613888578384fd5b8635613893816145d0565b955060208701356138a3816145d0565b945060408701356001600160401b03808211156138be578586fd5b6138ca8a838b016133bc565b909650945060608901359150808211156138e2578384fd5b506138ef89828a016133bc565b979a9699509497509295939492505050565b600080600060608486031215613915578081fd5b8335613920816145d0565b92506020840135613930816145e8565b929592945050506040919091013590565b600080600060608486031215613955578081fd5b8335613960816145d0565b925060208401359150604084013561358b816145e8565b60008060408385031215613989578182fd5b8235613994816145d0565b915060208301356001600160401b03811681146134a8578182fd5b60008060008060008060a087890312156139c7578384fd5b86356139d2816145d0565b955060208701356139e2816145d0565b945060408701356139f2816145d0565b93506060870135925060808701356001600160401b03811115613a13578283fd5b6138ef89828a01613404565b600060208284031215613a30578081fd5b5051919050565b600060208284031215613a48578081fd5b81516001600160401b0380821115613a5e578283fd5b818401915084601f830112613a71578283fd5b815181811115613a7f578384fd5b604051601f8201601f191681016020018381118282101715613a9f578586fd5b604052818152838201602001871015613ab6578485fd5b613ac78260208301602087016145a0565b9695505050505050565b6001600160a01b0316815260200190565b6000815180845260208085019450808401835b83811015613b1157815187529582019590820190600101613af5565b509495945050505050565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b60008151808452613b5e8160208601602086016145a0565b601f01601f19169290920160200192915050565b6000828483379101908152919050565b60008251613b948184602087016145a0565b9190910192915050565b60008451613bb08184602089016145a0565b91909101928352506020820152604001919050565b90565b6001600160a01b0391909116815260200190565b6001600160a01b038916815260a0602080830182905260009183019081613c038b82613e0c565b90508b9250835b8b811015613c3557828401613c2883613c238388613443565b613ad1565b9094509150600101613c0a565b508481036040860152613c488982613e0c565b9250506001600160fb1b03881115613c5e578283fd5b8702613c6b81838b614594565b018281036060840152613c7e8187613ae2565b90508281036080840152613c93818587613b1c565b9b9a5050505050505050505050565b6001600160a01b03878116825286166020820152604081018590526060810184905260a060808201819052600090613cdd9083018486613b1c565b98975050505050505050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b6001600160a01b03929092168252602082015260400190565b604080825283519082018190526000906020906060840190828701845b82811015613da2578151151584529284019290840190600101613d84565b50505083810382850152808551613db98184613e0c565b91508192508381028201848801865b83811015613df2578583038552613de0838351613b46565b94870194925090860190600101613dc8565b50909998505050505050505050565b901515815260200190565b90815260200190565b95865260208601949094526001600160a01b039283166040860152911660608401521515608083015260a082015260c00190565b938452602084019290925260408301526001600160a01b0316606082015260800190565b93845260ff9290921660208401526040830152606082015260800190565b600060208252611261602083018486613b1c565b600060208252612df76020830184613b46565b602080825260159082015274426f72696e674d6174683a20556e646572666c6f7760581b604082015260600190565b60208082526017908201527f42656e746f426f783a20536b696d20746f6f206d756368000000000000000000604082015260600190565b6020808252601c908201527f4d6173746572434d67723a2043616e6e6f7420617070726f7665203000000000604082015260600190565b6020808252601b908201527f4d6173746572434d67723a2075736572206e6f742073656e6465720000000000604082015260600190565b6020808252601c908201527f426f72696e6745524332303a205472616e73666572206661696c656400000000604082015260600190565b60208082526016908201527542656e746f426f783a2063616e6e6f7420656d70747960501b604082015260600190565b6020808252601590820152744f776e61626c653a207a65726f206164647265737360581b604082015260600190565b60208082526013908201527242656e746f426f783a204e6f20746f6b656e7360681b604082015260600190565b6020808252601c908201527f426f72696e674d6174683a2075696e74313238204f766572666c6f7700000000604082015260600190565b60208082526018908201527f426f72696e674d6174683a20416464204f766572666c6f770000000000000000604082015260600190565b60208082526017908201527f42656e746f426f783a20746f5b305d206e6f7420736574000000000000000000604082015260600190565b60208082526014908201527310995b9d1bd09bde0e881d1bc81b9bdd081cd95d60621b604082015260600190565b6020808252601a908201527f53747261746567794d616e616765723a20546f6f206561726c79000000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601f908201527f42656e746f426f783a205472616e73666572206e6f7420617070726f76656400604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c657220213d2070656e64696e67206f776e6572604082015260600190565b6020808252601b908201527f426f72696e674d6174683a2075696e743634204f766572666c6f770000000000604082015260600190565b60208082526019908201527f4d6173746572434d67723a207573657220697320636c6f6e6500000000000000604082015260600190565b6020808252601d908201527f4d6173746572434d67723a20496e76616c6964205369676e6174757265000000604082015260600190565b6020808252818101527f426f72696e67466163746f72793a204e6f206d6173746572436f6e7472616374604082015260600190565b6020808252601b908201527f4d6173746572434d67723a206d617374657243206e6f74207365740000000000604082015260600190565b6020808252601b908201527f42656e746f426f783a206e6f206d6173746572436f6e74726163740000000000604082015260600190565b6020808252818101527f426f72696e6745524332303a205472616e7366657246726f6d206661696c6564604082015260600190565b6020808252601c908201527f4d6173746572434d67723a20557365722063616e6e6f74206265203000000000604082015260600190565b60208082526016908201527510995b9d1bd09bde0e8815dc9bdb99c8185b5bdd5b9d60521b604082015260600190565b6020808252601b908201527f4d6173746572434d67723a206e6f742077686974656c69737465640000000000604082015260600190565b6020808252601d908201527f42656e746f426f783a20455448207472616e73666572206661696c6564000000604082015260600190565b60208082526018908201527f426f72696e674d6174683a204d756c204f766572666c6f770000000000000000604082015260600190565b6020808252818101527f53747261746567794d616e616765723a2054617267657420746f6f2068696768604082015260600190565b6001600160801b0391909116815260200190565b6001600160801b039290921682526001600160a01b0316602082015260400190565b6001600160801b0392831681529116602082015260400190565b918252602082015260400190565b6001600160401b0391909116815260200190565b6001600160401b0393841681529190921660208201526001600160801b03909116604082015260600190565b6000808335601e19843603018112614566578283fd5b8301803591506001600160401b0382111561457f578283fd5b6020019150368190038213156133fd57600080fd5b82818337506000910152565b60005b838110156145bb5781810151838201526020016145a3565b838111156145ca576000848401525b50505050565b6001600160a01b03811681146145e557600080fd5b50565b80151581146145e557600080fdfea2646970667358221220bbde77aaf581519850551eee78bc6315b2e7d060c6c0b1c48cf15341ed60f7ed64736f6c634300060c0033",
              "opcodes": "PUSH1 0xE0 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH3 0x11 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH3 0x47D5 CODESIZE SUB DUP1 PUSH3 0x47D5 DUP4 CODECOPY DUP2 ADD PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH3 0x34 SWAP2 PUSH3 0x116 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND CALLER SWAP1 DUP2 OR DUP3 SSTORE PUSH1 0x40 MLOAD SWAP1 SWAP2 SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP3 SWAP1 LOG3 CHAINID PUSH1 0xA0 DUP2 SWAP1 MSTORE PUSH3 0x84 DUP2 PUSH3 0x9E JUMP JUMPDEST PUSH1 0x80 MSTORE POP PUSH1 0x60 SHL PUSH1 0x1 PUSH1 0x1 PUSH1 0x60 SHL SUB NOT AND PUSH1 0xC0 MSTORE PUSH3 0x16A JUMP JUMPDEST PUSH1 0x0 PUSH32 0x8CAD95687BA82C2CE50E74F7B754645E5117C3A5BEC8151C0726D5857980A866 PUSH32 0xD7DF266AFF736D415A9DC14B4158201D612E70D75B9C7F4E375CCFD20AA5166F DUP4 ADDRESS PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH3 0xF9 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH3 0x146 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH3 0x128 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH3 0x13F JUMPI DUP2 DUP3 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST SWAP4 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x80 MLOAD PUSH1 0xA0 MLOAD PUSH1 0xC0 MLOAD PUSH1 0x60 SHR PUSH2 0x462C PUSH3 0x1A9 PUSH1 0x0 CODECOPY DUP1 PUSH2 0x6C5 MSTORE DUP1 PUSH2 0x992 MSTORE DUP1 PUSH2 0x1ED0 MSTORE DUP1 PUSH2 0x20B1 MSTORE POP DUP1 PUSH2 0x1021 MSTORE POP DUP1 PUSH2 0x1056 MSTORE POP PUSH2 0x462C PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x1DC JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x7C516E94 GT PUSH2 0x102 JUMPI DUP1 PUSH4 0xD2423B51 GT PUSH2 0x95 JUMPI DUP1 PUSH4 0xF1676D37 GT PUSH2 0x64 JUMPI DUP1 PUSH4 0xF1676D37 EQ PUSH2 0x555 JUMPI DUP1 PUSH4 0xF18D03CC EQ PUSH2 0x575 JUMPI DUP1 PUSH4 0xF483B3DA EQ PUSH2 0x595 JUMPI DUP1 PUSH4 0xF7888AEC EQ PUSH2 0x5B5 JUMPI PUSH2 0x1E3 JUMP JUMPDEST DUP1 PUSH4 0xD2423B51 EQ PUSH2 0x4D0 JUMPI DUP1 PUSH4 0xDA5139CA EQ PUSH2 0x4F1 JUMPI DUP1 PUSH4 0xDF23B45B EQ PUSH2 0x511 JUMPI DUP1 PUSH4 0xE30C3978 EQ PUSH2 0x540 JUMPI PUSH2 0x1E3 JUMP JUMPDEST DUP1 PUSH4 0x97DA6D30 GT PUSH2 0xD1 JUMPI DUP1 PUSH4 0x97DA6D30 EQ PUSH2 0x45B JUMPI DUP1 PUSH4 0xAEE4D1B2 EQ PUSH2 0x47B JUMPI DUP1 PUSH4 0xBAFE4F14 EQ PUSH2 0x490 JUMPI DUP1 PUSH4 0xC0A47C93 EQ PUSH2 0x4B0 JUMPI PUSH2 0x1E3 JUMP JUMPDEST DUP1 PUSH4 0x7C516E94 EQ PUSH2 0x3E6 JUMPI DUP1 PUSH4 0x7ECEBE00 EQ PUSH2 0x406 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x426 JUMPI DUP1 PUSH4 0x91E0EAB5 EQ PUSH2 0x43B JUMPI PUSH2 0x1E3 JUMP JUMPDEST DUP1 PUSH4 0x3E2A9D4E GT PUSH2 0x17A JUMPI DUP1 PUSH4 0x56623118 GT PUSH2 0x149 JUMPI DUP1 PUSH4 0x56623118 EQ PUSH2 0x366 JUMPI DUP1 PUSH4 0x66C6BB0B EQ PUSH2 0x386 JUMPI DUP1 PUSH4 0x72CB5D97 EQ PUSH2 0x3A6 JUMPI DUP1 PUSH4 0x733A9D7C EQ PUSH2 0x3C6 JUMPI PUSH2 0x1E3 JUMP JUMPDEST DUP1 PUSH4 0x3E2A9D4E EQ PUSH2 0x2E3 JUMPI DUP1 PUSH4 0x4E71E0C8 EQ PUSH2 0x303 JUMPI DUP1 PUSH4 0x4FFE34DB EQ PUSH2 0x318 JUMPI DUP1 PUSH4 0x5108A558 EQ PUSH2 0x346 JUMPI PUSH2 0x1E3 JUMP JUMPDEST DUP1 PUSH4 0x12A90C8A GT PUSH2 0x1B6 JUMPI DUP1 PUSH4 0x12A90C8A EQ PUSH2 0x254 JUMPI DUP1 PUSH4 0x1F54245B EQ PUSH2 0x281 JUMPI DUP1 PUSH4 0x228BFD9F EQ PUSH2 0x2A1 JUMPI DUP1 PUSH4 0x3644E515 EQ PUSH2 0x2C1 JUMPI PUSH2 0x1E3 JUMP JUMPDEST DUP1 PUSH4 0x2B9446C EQ PUSH2 0x1E8 JUMPI DUP1 PUSH4 0x78DFBE7 EQ PUSH2 0x212 JUMPI DUP1 PUSH4 0xFCA8843 EQ PUSH2 0x234 JUMPI PUSH2 0x1E3 JUMP JUMPDEST CALLDATASIZE PUSH2 0x1E3 JUMPI STOP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1FB PUSH2 0x1F6 CALLDATASIZE PUSH1 0x4 PUSH2 0x3795 JUMP JUMPDEST PUSH2 0x5D5 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x209 SWAP3 SWAP2 SWAP1 PUSH2 0x4502 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x21E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x232 PUSH2 0x22D CALLDATASIZE PUSH1 0x4 PUSH2 0x354C JUMP JUMPDEST PUSH2 0xA99 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x240 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x232 PUSH2 0x24F CALLDATASIZE PUSH1 0x4 PUSH2 0x3870 JUMP JUMPDEST PUSH2 0xB7F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x260 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x274 PUSH2 0x26F CALLDATASIZE PUSH1 0x4 PUSH2 0x345F JUMP JUMPDEST PUSH2 0xE30 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x209 SWAP2 SWAP1 PUSH2 0x3E01 JUMP JUMPDEST PUSH2 0x294 PUSH2 0x28F CALLDATASIZE PUSH1 0x4 PUSH2 0x3596 JUMP JUMPDEST PUSH2 0xE45 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x209 SWAP2 SWAP1 PUSH2 0x3BC8 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2AD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x294 PUSH2 0x2BC CALLDATASIZE PUSH1 0x4 PUSH2 0x345F JUMP JUMPDEST PUSH2 0x1001 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2CD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2D6 PUSH2 0x101C JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x209 SWAP2 SWAP1 PUSH2 0x3E0C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2EF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x232 PUSH2 0x2FE CALLDATASIZE PUSH1 0x4 PUSH2 0x3977 JUMP JUMPDEST PUSH2 0x107C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x30F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x232 PUSH2 0x1147 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x324 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x338 PUSH2 0x333 CALLDATASIZE PUSH1 0x4 PUSH2 0x345F JUMP JUMPDEST PUSH2 0x11D4 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x209 SWAP3 SWAP2 SWAP1 PUSH2 0x44E8 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x352 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x294 PUSH2 0x361 CALLDATASIZE PUSH1 0x4 PUSH2 0x345F JUMP JUMPDEST PUSH2 0x11FA JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x372 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2D6 PUSH2 0x381 CALLDATASIZE PUSH1 0x4 PUSH2 0x3941 JUMP JUMPDEST PUSH2 0x1215 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x392 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x232 PUSH2 0x3A1 CALLDATASIZE PUSH1 0x4 PUSH2 0x3901 JUMP JUMPDEST PUSH2 0x1269 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3B2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x232 PUSH2 0x3C1 CALLDATASIZE PUSH1 0x4 PUSH2 0x3733 JUMP JUMPDEST PUSH2 0x1832 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3D2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x232 PUSH2 0x3E1 CALLDATASIZE PUSH1 0x4 PUSH2 0x351F JUMP JUMPDEST PUSH2 0x1C90 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3F2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x232 PUSH2 0x401 CALLDATASIZE PUSH1 0x4 PUSH2 0x37EF JUMP JUMPDEST PUSH2 0x1D34 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x412 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2D6 PUSH2 0x421 CALLDATASIZE PUSH1 0x4 PUSH2 0x345F JUMP JUMPDEST PUSH2 0x1DA8 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x432 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x294 PUSH2 0x1DBA JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x447 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x274 PUSH2 0x456 CALLDATASIZE PUSH1 0x4 PUSH2 0x347B JUMP JUMPDEST PUSH2 0x1DC9 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x467 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1FB PUSH2 0x476 CALLDATASIZE PUSH1 0x4 PUSH2 0x3795 JUMP JUMPDEST PUSH2 0x1DE9 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x487 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x232 PUSH2 0x21FD JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x49C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x294 PUSH2 0x4AB CALLDATASIZE PUSH1 0x4 PUSH2 0x345F JUMP JUMPDEST PUSH2 0x2244 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4BC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x232 PUSH2 0x4CB CALLDATASIZE PUSH1 0x4 PUSH2 0x34B3 JUMP JUMPDEST PUSH2 0x225F JUMP JUMPDEST PUSH2 0x4E3 PUSH2 0x4DE CALLDATASIZE PUSH1 0x4 PUSH2 0x35FB JUMP JUMPDEST PUSH2 0x256E JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x209 SWAP3 SWAP2 SWAP1 PUSH2 0x3D67 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4FD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2D6 PUSH2 0x50C CALLDATASIZE PUSH1 0x4 PUSH2 0x3941 JUMP JUMPDEST PUSH2 0x26FE JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x51D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x531 PUSH2 0x52C CALLDATASIZE PUSH1 0x4 PUSH2 0x345F JUMP JUMPDEST PUSH2 0x274A JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x209 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x4524 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x54C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x294 PUSH2 0x2783 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x561 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x232 PUSH2 0x570 CALLDATASIZE PUSH1 0x4 PUSH2 0x39AF JUMP JUMPDEST PUSH2 0x2792 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x581 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x232 PUSH2 0x590 CALLDATASIZE PUSH1 0x4 PUSH2 0x3745 JUMP JUMPDEST PUSH2 0x28E3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5A1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x232 PUSH2 0x5B0 CALLDATASIZE PUSH1 0x4 PUSH2 0x3660 JUMP JUMPDEST PUSH2 0x2A87 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5C1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2D6 PUSH2 0x5D0 CALLDATASIZE PUSH1 0x4 PUSH2 0x3733 JUMP JUMPDEST PUSH2 0x2D47 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND CALLER EQ DUP1 ISZERO SWAP1 PUSH2 0x5FB JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ADDRESS EQ ISZERO JUMPDEST ISZERO PUSH2 0x686 JUMPI CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP1 PUSH2 0x63F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x4305 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP7 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD PUSH1 0xFF AND PUSH2 0x684 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x4188 JUMP JUMPDEST POP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND PUSH2 0x6AC JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x40EE JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP10 AND ISZERO PUSH2 0x6C3 JUMPI DUP9 PUSH2 0x6E5 JUMP JUMPDEST PUSH32 0x0 JUMPDEST SWAP1 POP PUSH2 0x6EF PUSH2 0x3385 JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP3 AND DUP1 DUP6 MSTORE PUSH1 0x1 PUSH1 0x80 SHL SWAP1 SWAP3 DIV AND SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE ISZERO ISZERO DUP1 PUSH2 0x7B0 JUMPI POP PUSH1 0x0 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x18160DDD PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x776 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x78A 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 DUP2 ADD SWAP1 PUSH2 0x7AE SWAP2 SWAP1 PUSH2 0x3A1F JUMP JUMPDEST GT JUMPDEST PUSH2 0x7CC JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x401C JUMP JUMPDEST DUP6 PUSH2 0x824 JUMPI PUSH2 0x7DD DUP2 DUP9 PUSH1 0x0 PUSH2 0x2D64 JUMP JUMPDEST SWAP6 POP PUSH2 0x3E8 PUSH2 0x802 PUSH2 0x7EE DUP9 PUSH2 0x2DFE JUMP JUMPDEST PUSH1 0x20 DUP5 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND SWAP1 PUSH2 0x2E2B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND LT ISZERO PUSH2 0x81F JUMPI PUSH1 0x0 DUP1 SWAP5 POP SWAP5 POP POP POP PUSH2 0xA8E JUMP JUMPDEST PUSH2 0x833 JUMP JUMPDEST PUSH2 0x830 DUP2 DUP8 PUSH1 0x1 PUSH2 0x2E60 JUMP JUMPDEST SWAP7 POP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP10 AND ADDRESS EQ ISZERO DUP1 PUSH2 0x852 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP11 AND ISZERO JUMPDEST DUP1 PUSH2 0x87A JUMPI POP DUP1 MLOAD PUSH2 0x876 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x870 DUP5 PUSH2 0x2EDF JUMP JUMPDEST SWAP1 PUSH2 0x2F87 JUMP JUMPDEST DUP8 GT ISZERO JUMPDEST PUSH2 0x896 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x3EE1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP13 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD PUSH2 0x8C6 SWAP1 DUP8 PUSH2 0x2FAA JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP14 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SSTORE PUSH2 0x90C PUSH2 0x8F8 DUP8 PUSH2 0x2DFE JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND SWAP1 PUSH2 0x2E2B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x937 PUSH2 0x926 DUP9 PUSH2 0x2DFE JUMP JUMPDEST DUP3 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND SWAP1 PUSH2 0x2E2B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP1 DUP2 AND DUP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 SWAP2 KECCAK256 DUP5 MLOAD DUP2 SLOAD SWAP3 DUP7 ADD MLOAD DUP6 AND PUSH1 0x1 PUSH1 0x80 SHL MUL SWAP1 DUP6 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB NOT SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP4 AND OR SWAP1 SWAP2 SSTORE DUP11 AND PUSH2 0xA09 JUMPI PUSH32 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xD0E30DB0 DUP9 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 0x9EB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x9FF JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP PUSH2 0xA2E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP10 AND ADDRESS EQ PUSH2 0xA2E JUMPI PUSH2 0xA2E PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND DUP11 ADDRESS DUP11 PUSH2 0x2FCD JUMP JUMPDEST DUP8 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP10 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xB2346165E782564F17F5B7E555C21F4FD96FBC93458572BF0113EA35A958FC55 DUP11 DUP11 PUSH1 0x40 MLOAD PUSH2 0xA7D SWAP3 SWAP2 SWAP1 PUSH2 0x4502 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 DUP7 SWAP5 POP DUP6 SWAP4 POP POP POP JUMPDEST POP SWAP6 POP SWAP6 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0xAC3 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x4153 JUMP JUMPDEST DUP2 ISZERO PUSH2 0xB5E JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND ISZERO ISZERO DUP1 PUSH2 0xADD JUMPI POP DUP1 JUMPDEST PUSH2 0xAF9 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x3FED JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP8 AND SWAP4 SWAP3 AND SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 LOG3 PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP2 DUP3 AND OR SWAP1 SWAP2 SSTORE PUSH1 0x1 DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SSTORE PUSH2 0xB7A JUMP JUMPDEST PUSH1 0x1 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND OR SWAP1 SSTORE JUMPDEST POP POP POP JUMP JUMPDEST DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND CALLER EQ DUP1 ISZERO SWAP1 PUSH2 0xBA2 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ADDRESS EQ ISZERO JUMPDEST ISZERO PUSH2 0xC24 JUMPI CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP1 PUSH2 0xBDD JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x4305 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP7 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD PUSH1 0xFF AND PUSH2 0xC22 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x4188 JUMP JUMPDEST POP JUMPDEST PUSH1 0x0 DUP6 DUP6 DUP3 DUP2 PUSH2 0xC30 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0xC45 SWAP2 SWAP1 PUSH2 0x345F JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO PUSH2 0xC6C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x40B7 JUMP JUMPDEST PUSH1 0x0 DUP5 DUP2 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xDC8 JUMPI PUSH1 0x0 DUP9 DUP9 DUP4 DUP2 DUP2 LT PUSH2 0xC87 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0xC9C SWAP2 SWAP1 PUSH2 0x345F JUMP JUMPDEST SWAP1 POP PUSH2 0xD0B DUP8 DUP8 DUP5 DUP2 DUP2 LT PUSH2 0xCAD JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD PUSH1 0x6 PUSH1 0x0 DUP15 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD PUSH2 0x2FAA SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP14 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP7 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SSTORE PUSH2 0xD56 DUP8 DUP8 DUP5 DUP2 DUP2 LT PUSH2 0xD40 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD DUP6 PUSH2 0x2FAA SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP4 POP DUP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP11 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP13 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x6EABE333476233FD382224F233210CB808A7BC4C4DE64F9D76628BF63C677B1A DUP11 DUP11 DUP8 DUP2 DUP2 LT PUSH2 0xDA3 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD PUSH1 0x40 MLOAD PUSH2 0xDB7 SWAP2 SWAP1 PUSH2 0x3E0C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP PUSH1 0x1 ADD PUSH2 0xC71 JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP11 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP13 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD PUSH2 0xDF9 SWAP1 DUP4 PUSH2 0x2F87 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP10 DUP11 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP12 SWAP1 SWAP13 AND DUP3 MSTORE SWAP10 SWAP1 SWAP10 MSTORE SWAP9 SWAP1 SWAP8 KECCAK256 SWAP8 SWAP1 SWAP8 SSTORE POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x4 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH2 0xE6D JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x4299 JUMP JUMPDEST PUSH1 0x60 DUP6 SWAP1 SHL DUP3 ISZERO PUSH2 0xEDF JUMPI PUSH1 0x0 DUP6 DUP6 PUSH1 0x40 MLOAD PUSH2 0xE8A SWAP3 SWAP2 SWAP1 PUSH2 0x3B72 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 SWAP1 POP PUSH1 0x40 MLOAD PUSH20 0x3D602D80600A3D3981F3363D3D373D3D3D363D73 PUSH1 0x60 SHL DUP2 MSTORE DUP3 PUSH1 0x14 DUP3 ADD MSTORE PUSH15 0x5AF43D82803E903D91602B57FD5BF3 PUSH1 0x88 SHL PUSH1 0x28 DUP3 ADD MSTORE DUP2 PUSH1 0x37 DUP3 PUSH1 0x0 CREATE2 SWAP4 POP POP POP PUSH2 0xF24 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0x3D602D80600A3D3981F3363D3D373D3D3D363D73 PUSH1 0x60 SHL DUP2 MSTORE DUP2 PUSH1 0x14 DUP3 ADD MSTORE PUSH15 0x5AF43D82803E903D91602B57FD5BF3 PUSH1 0x88 SHL PUSH1 0x28 DUP3 ADD MSTORE PUSH1 0x37 DUP2 PUSH1 0x0 CREATE SWAP3 POP POP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP4 DUP11 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 SSTORE SWAP1 MLOAD PUSH4 0x1377D1F5 PUSH1 0xE2 SHL DUP2 MSTORE PUSH4 0x4DDF47D4 SWAP1 CALLVALUE SWAP1 PUSH2 0xF79 SWAP1 DUP10 SWAP1 DUP10 SWAP1 PUSH1 0x4 ADD PUSH2 0x3E8B JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xF92 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xFA6 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xD62166F3C2149208E51788B1401CC356BF5DA1FC6C7886A32E18570F57D88B3B DUP8 DUP8 PUSH1 0x40 MLOAD PUSH2 0xFF0 SWAP3 SWAP2 SWAP1 PUSH2 0x3E8B JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x8 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x0 CHAINID PUSH32 0x0 DUP2 EQ PUSH2 0x1054 JUMPI PUSH2 0x104F DUP2 PUSH2 0x30C6 JUMP JUMPDEST PUSH2 0x1076 JUMP JUMPDEST PUSH32 0x0 JUMPDEST SWAP2 POP POP SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0x10A6 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x4153 JUMP JUMPDEST PUSH1 0x5F DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND GT ISZERO PUSH2 0x10D0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x447D JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0xA PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH8 0xFFFFFFFFFFFFFFFF PUSH1 0x40 SHL NOT AND PUSH1 0x1 PUSH1 0x40 SHL PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP7 AND MUL OR SWAP1 SSTORE MLOAD PUSH32 0x7543AF99B5602C06E62DA0631B5308489A5FF859150105A623B6EB15E8DEAE0B SWAP1 PUSH2 0x113B SWAP1 DUP5 SWAP1 PUSH2 0x4510 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER DUP2 EQ PUSH2 0x1172 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x41BF JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND SWAP4 SWAP3 AND SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 LOG3 PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP3 DUP4 AND OR SWAP1 SSTORE PUSH1 0x1 DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP3 AND SWAP2 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 DIV AND DUP3 JUMP JUMPDEST PUSH1 0x9 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP2 MLOAD DUP1 DUP4 ADD SWAP1 SWAP3 MSTORE SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP3 AND DUP4 MSTORE PUSH1 0x1 PUSH1 0x80 SHL SWAP1 SWAP2 DIV AND SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH2 0x1261 SWAP1 DUP5 DUP5 PUSH2 0x2E60 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x1271 PUSH2 0x339C JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0xA PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP2 MLOAD PUSH1 0x60 DUP2 ADD DUP4 MSTORE SWAP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 AND DUP4 MSTORE PUSH1 0x1 PUSH1 0x40 SHL DUP3 DIV AND DUP3 DUP6 ADD MSTORE PUSH1 0x1 PUSH1 0x80 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP2 DUP4 ADD SWAP1 DUP2 MSTORE SWAP5 DUP5 MSTORE PUSH1 0x8 SWAP1 SWAP3 MSTORE DUP1 DUP4 KECCAK256 SLOAD SWAP4 MLOAD SWAP1 MLOAD PUSH4 0xC7E663B PUSH1 0xE1 SHL DUP2 MSTORE SWAP2 SWAP5 SWAP4 SWAP1 SWAP4 AND SWAP3 DUP4 SWAP2 PUSH4 0x18FCCC76 SWAP2 PUSH2 0x12FE SWAP2 CALLER SWAP1 PUSH1 0x4 ADD PUSH2 0x44C6 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1318 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x132C 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 DUP2 ADD SWAP1 PUSH2 0x1350 SWAP2 SWAP1 PUSH2 0x3A1F JUMP JUMPDEST SWAP1 POP DUP1 ISZERO DUP1 ISZERO PUSH2 0x135E JUMPI POP DUP5 ISZERO JUMPDEST ISZERO PUSH2 0x136B JUMPI POP POP POP PUSH2 0xB7A JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND SWAP1 DUP3 SGT ISZERO PUSH2 0x1421 JUMPI DUP2 PUSH2 0x13A0 DUP3 DUP3 PUSH2 0x2FAA JUMP JUMPDEST SWAP2 POP PUSH2 0x13AB DUP3 PUSH2 0x2DFE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP10 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP5 SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 SSTORE SWAP1 MLOAD PUSH32 0x911C9F20A03EDABCBCBD18DCA1174CCE47A91B234CED7A5A3C60BA0D5B56C5D2 SWAP1 PUSH2 0x1413 SWAP1 DUP5 SWAP1 PUSH2 0x3E0C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP PUSH2 0x14EF JUMP JUMPDEST PUSH1 0x0 DUP3 SLT ISZERO PUSH2 0x14EF JUMPI PUSH1 0x0 DUP3 SWAP1 SUB PUSH2 0x1439 DUP3 DUP3 PUSH2 0x2F87 JUMP JUMPDEST SWAP2 POP PUSH2 0x1444 DUP3 PUSH2 0x2DFE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP10 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH2 0x149A PUSH2 0x1486 DUP3 PUSH2 0x2DFE JUMP JUMPDEST PUSH1 0x40 DUP8 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND SWAP1 PUSH2 0x313D JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH1 0x40 DUP1 DUP8 ADD SWAP2 SWAP1 SWAP2 MSTORE MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP10 AND SWAP1 PUSH32 0x8F1F26EB9B6AA8689DBDD519EAD1999D9C8819D4738E403B2003B18197D9CF97 SWAP1 PUSH2 0x14E5 SWAP1 DUP5 SWAP1 PUSH2 0x3E0C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP JUMPDEST DUP6 ISZERO PUSH2 0x17AE JUMPI PUSH1 0x0 PUSH1 0x64 PUSH2 0x1519 DUP7 PUSH1 0x20 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND DUP5 PUSH2 0x316C SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP2 PUSH2 0x1520 JUMPI INVALID JUMPDEST DIV SWAP1 POP DUP1 DUP6 PUSH1 0x40 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND LT ISZERO PUSH2 0x165B JUMPI PUSH1 0x0 PUSH2 0x155A DUP7 PUSH1 0x40 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP4 PUSH2 0x2F87 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP1 POP DUP7 ISZERO DUP1 ISZERO SWAP1 PUSH2 0x156A JUMPI POP DUP7 DUP2 GT JUMPDEST ISZERO PUSH2 0x1572 JUMPI POP DUP6 JUMPDEST PUSH2 0x1586 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP11 AND DUP7 DUP4 PUSH2 0x31A3 JUMP JUMPDEST PUSH2 0x15A6 PUSH2 0x1592 DUP3 PUSH2 0x2DFE JUMP JUMPDEST PUSH1 0x40 DUP9 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND SWAP1 PUSH2 0x2E2B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH1 0x40 DUP1 DUP9 ADD SWAP2 SWAP1 SWAP2 MSTORE MLOAD PUSH4 0x6939AAF5 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND SWAP1 PUSH4 0x6939AAF5 SWAP1 PUSH2 0x15E2 SWAP1 DUP5 SWAP1 PUSH1 0x4 ADD PUSH2 0x3E0C JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x15FC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1610 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP DUP9 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xB18E7E4F6EAC147A63A3BB6BEB2D9039C88698623AFF3EFC4FEBBC20B0164EE5 DUP3 PUSH1 0x40 MLOAD PUSH2 0x164D SWAP2 SWAP1 PUSH2 0x3E0C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP PUSH2 0x17AC JUMP JUMPDEST DUP1 DUP6 PUSH1 0x40 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND GT ISZERO PUSH2 0x17AC JUMPI PUSH1 0x0 PUSH2 0x1692 PUSH2 0x167E DUP4 PUSH2 0x2DFE JUMP JUMPDEST PUSH1 0x40 DUP9 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND SWAP1 PUSH2 0x313D JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND SWAP1 POP DUP7 ISZERO DUP1 ISZERO SWAP1 PUSH2 0x16AB JUMPI POP DUP7 DUP2 GT JUMPDEST ISZERO PUSH2 0x16B3 JUMPI POP DUP6 JUMPDEST PUSH1 0x40 MLOAD PUSH4 0x2E1A7D4D PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x0 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND SWAP1 PUSH4 0x2E1A7D4D SWAP1 PUSH2 0x16E2 SWAP1 DUP6 SWAP1 PUSH1 0x4 ADD PUSH2 0x3E0C JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x16FC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1710 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 DUP2 ADD SWAP1 PUSH2 0x1734 SWAP2 SWAP1 PUSH2 0x3A1F JUMP JUMPDEST SWAP1 POP PUSH2 0x1756 PUSH2 0x1742 DUP3 PUSH2 0x2DFE JUMP JUMPDEST PUSH1 0x40 DUP10 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND SWAP1 PUSH2 0x313D JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH1 0x40 DUP1 DUP10 ADD SWAP2 SWAP1 SWAP2 MSTORE MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP12 AND SWAP1 PUSH32 0x39AA22060F8DD4D291720311FEEDF3B72FEF47C06C66CCF5C22B502C62E7550A SWAP1 PUSH2 0x17A1 SWAP1 DUP5 SWAP1 PUSH2 0x3E0C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP JUMPDEST POP JUMPDEST POP POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xA PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP4 MLOAD DUP2 SLOAD SWAP3 DUP6 ADD MLOAD SWAP4 SWAP1 SWAP5 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP1 DUP2 AND PUSH1 0x1 PUSH1 0x80 SHL MUL PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB SWAP5 DUP6 AND PUSH1 0x1 PUSH1 0x40 SHL MUL PUSH8 0xFFFFFFFFFFFFFFFF PUSH1 0x40 SHL NOT SWAP6 SWAP1 SWAP7 AND PUSH8 0xFFFFFFFFFFFFFFFF NOT SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP4 SWAP1 SWAP4 AND SWAP4 SWAP1 SWAP4 OR SWAP2 SWAP1 SWAP2 AND OR SWAP1 SSTORE POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0x185C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x4153 JUMP JUMPDEST PUSH2 0x1864 PUSH2 0x339C JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0xA PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP2 MLOAD PUSH1 0x60 DUP2 ADD DUP4 MSTORE SWAP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 AND DUP4 MSTORE PUSH1 0x1 PUSH1 0x40 SHL DUP3 DIV DUP2 AND DUP4 DUP7 ADD MSTORE PUSH1 0x1 PUSH1 0x80 SHL SWAP1 SWAP2 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP3 DUP5 ADD MSTORE SWAP5 DUP5 MSTORE PUSH1 0x9 SWAP1 SWAP3 MSTORE SWAP1 SWAP2 KECCAK256 SLOAD DUP2 MLOAD SWAP2 SWAP4 AND SWAP2 AND ISZERO DUP1 PUSH2 0x18EB JUMPI POP DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO JUMPDEST ISZERO PUSH2 0x1975 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP2 DUP6 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH2 0x192C PUSH3 0x127500 TIMESTAMP ADD PUSH2 0x3299 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND DUP3 MSTORE PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND SWAP2 SWAP1 DUP7 AND SWAP1 PUSH32 0x6F7CCDF3F86039E5A1DCF6028BF7B4773CBF7A234716BA2E5392B12BB0F8558F SWAP1 PUSH1 0x0 SWAP1 LOG3 PUSH2 0x1C10 JUMP JUMPDEST DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x1998 JUMPI POP DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND TIMESTAMP LT ISZERO JUMPDEST PUSH2 0x19B4 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x411C JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x8 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND ISZERO PUSH2 0x1B99 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x8 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 SLOAD DUP6 DUP3 ADD MLOAD SWAP2 MLOAD PUSH4 0x7F8661A1 PUSH1 0xE0 SHL DUP2 MSTORE SWAP3 SWAP4 AND SWAP2 PUSH4 0x7F8661A1 SWAP2 PUSH2 0x1A15 SWAP2 PUSH1 0x4 ADD PUSH2 0x44B2 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1A2F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1A43 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 DUP2 ADD SWAP1 PUSH2 0x1A67 SWAP2 SWAP1 PUSH2 0x3A1F JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP2 SGT ISZERO PUSH2 0x1ADE JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP2 SWAP1 PUSH2 0x1A96 SWAP1 DUP3 PUSH2 0x32C2 JUMP JUMPDEST POP DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x911C9F20A03EDABCBCBD18DCA1174CCE47A91B234CED7A5A3C60BA0D5B56C5D2 DUP3 PUSH1 0x40 MLOAD PUSH2 0x1AD0 SWAP2 SWAP1 PUSH2 0x3E0C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP PUSH2 0x1B52 JUMP JUMPDEST PUSH1 0x0 DUP2 SLT ISZERO PUSH2 0x1B52 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SWAP1 DUP3 SWAP1 SUB SWAP1 PUSH2 0x1B0E SWAP1 DUP3 PUSH2 0x3306 JUMP JUMPDEST POP DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x8F1F26EB9B6AA8689DBDD519EAD1999D9C8819D4738E403B2003B18197D9CF97 DUP3 PUSH1 0x40 MLOAD PUSH2 0x1B48 SWAP2 SWAP1 PUSH2 0x3E0C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP JUMPDEST DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x39AA22060F8DD4D291720311FEEDF3B72FEF47C06C66CCF5C22B502C62E7550A DUP5 PUSH1 0x40 ADD MLOAD PUSH1 0x40 MLOAD PUSH2 0x1B8F SWAP2 SWAP1 PUSH2 0x44B2 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x8 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD DUP7 DUP9 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP2 DUP3 AND OR SWAP1 SWAP2 SSTORE DUP4 DUP9 MSTORE DUP8 DUP3 ADD DUP5 SWAP1 MSTORE DUP5 DUP5 MSTORE PUSH1 0x9 SWAP1 SWAP3 MSTORE DUP1 DUP4 KECCAK256 DUP1 SLOAD SWAP1 SWAP3 AND SWAP1 SWAP2 SSTORE MLOAD SWAP3 DUP7 AND SWAP3 PUSH32 0x3E6352A885ADC4CC54767592939C3B1BBD65685658C3BEAABA66A888120E217 SWAP2 SWAP1 LOG3 JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xA PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP5 MLOAD DUP2 SLOAD SWAP3 DUP7 ADD MLOAD SWAP4 SWAP1 SWAP6 ADD MLOAD PUSH8 0xFFFFFFFFFFFFFFFF NOT SWAP1 SWAP3 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB SWAP6 DUP7 AND OR PUSH8 0xFFFFFFFFFFFFFFFF PUSH1 0x40 SHL NOT AND PUSH1 0x1 PUSH1 0x40 SHL SWAP6 SWAP1 SWAP4 AND SWAP5 SWAP1 SWAP5 MUL SWAP2 SWAP1 SWAP2 OR PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP1 DUP2 AND PUSH1 0x1 PUSH1 0x80 SHL SWAP2 SWAP1 SWAP3 AND MUL OR SWAP1 SWAP2 SSTORE POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0x1CBA JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x4153 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0x1CE0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x3F18 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND DUP5 ISZERO ISZERO OR SWAP1 SSTORE MLOAD PUSH32 0x31A1E0EAC44B54AC6C2A2EFA87E92C83405FFCF33FCEEF02A7BCA695130E2600 SWAP1 PUSH2 0x113B SWAP1 DUP5 SWAP1 PUSH2 0x3E01 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH4 0xD505ACCF PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP10 AND SWAP1 PUSH4 0xD505ACCF SWAP1 PUSH2 0x1D6C SWAP1 DUP11 SWAP1 DUP11 SWAP1 DUP11 SWAP1 DUP11 SWAP1 DUP11 SWAP1 DUP11 SWAP1 DUP11 SWAP1 PUSH1 0x4 ADD PUSH2 0x3D0D JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1D86 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1D9A JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x3 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND CALLER EQ DUP1 ISZERO SWAP1 PUSH2 0x1E0F JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ADDRESS EQ ISZERO JUMPDEST ISZERO PUSH2 0x1E91 JUMPI CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP1 PUSH2 0x1E4A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x4305 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP7 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD PUSH1 0xFF AND PUSH2 0x1E8F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x4188 JUMP JUMPDEST POP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND PUSH2 0x1EB7 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x40EE JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP10 AND ISZERO PUSH2 0x1ECE JUMPI DUP9 PUSH2 0x1EF0 JUMP JUMPDEST PUSH32 0x0 JUMPDEST SWAP1 POP PUSH2 0x1EFA PUSH2 0x3385 JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP3 AND DUP5 MSTORE PUSH1 0x1 PUSH1 0x80 SHL SWAP1 SWAP2 DIV AND SWAP1 DUP3 ADD MSTORE DUP6 PUSH2 0x1F52 JUMPI PUSH2 0x1F4B DUP2 DUP9 PUSH1 0x1 PUSH2 0x2D64 JUMP JUMPDEST SWAP6 POP PUSH2 0x1F61 JUMP JUMPDEST PUSH2 0x1F5E DUP2 DUP8 PUSH1 0x0 PUSH2 0x2E60 JUMP JUMPDEST SWAP7 POP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP14 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD PUSH2 0x1F91 SWAP1 DUP8 PUSH2 0x2F87 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP15 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SSTORE PUSH2 0x1FD4 PUSH2 0x1FC3 DUP9 PUSH2 0x2DFE JUMP JUMPDEST DUP3 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND SWAP1 PUSH2 0x313D JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP2 MSTORE PUSH2 0x1FFF PUSH2 0x1FEB DUP8 PUSH2 0x2DFE JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND SWAP1 PUSH2 0x313D JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE PUSH2 0x3E8 GT ISZERO DUP1 PUSH2 0x202A JUMPI POP PUSH1 0x20 DUP2 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND ISZERO JUMPDEST PUSH2 0x2046 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x3FBD JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 SWAP2 KECCAK256 DUP4 MLOAD DUP2 SLOAD SWAP3 DUP6 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB NOT SWAP1 SWAP4 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP2 DUP3 AND OR DUP2 AND PUSH1 0x1 PUSH1 0x80 SHL SWAP2 SWAP1 SWAP4 AND MUL SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE DUP11 AND PUSH2 0x219A JUMPI PUSH1 0x40 MLOAD PUSH4 0x2E1A7D4D PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH32 0x0 AND SWAP1 PUSH4 0x2E1A7D4D SWAP1 PUSH2 0x20E6 SWAP1 DUP11 SWAP1 PUSH1 0x4 ADD PUSH2 0x3E0C JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2100 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2114 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x0 DUP9 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP9 PUSH1 0x40 MLOAD PUSH2 0x2131 SWAP1 PUSH2 0x3BC5 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x216E 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 0x2173 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP POP SWAP1 POP DUP1 PUSH2 0x2194 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x440F JUMP JUMPDEST POP PUSH2 0x21AE JUMP JUMPDEST PUSH2 0x21AE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND DUP10 DUP10 PUSH2 0x31A3 JUMP JUMPDEST DUP8 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP10 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xAD9AB9EE6953D4D177F4A03B3A3AC3178FFCB9816319F348060194AA76B14486 DUP11 DUP11 PUSH1 0x40 MLOAD PUSH2 0xA7D SWAP3 SWAP2 SWAP1 PUSH2 0x4502 JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND DUP5 OR SWAP1 SSTORE MLOAD PUSH32 0xDFB44FFABF0D3A8F650D3CE43EFF98F6D050E7EA1A396D5794F014E7DADABACB SWAP2 SWAP1 LOG2 JUMP JUMPDEST PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH2 0x2285 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x42CE JUMP JUMPDEST DUP2 ISZERO DUP1 ISZERO PUSH2 0x2291 JUMPI POP DUP1 ISZERO JUMPDEST DUP1 ISZERO PUSH2 0x229E JUMPI POP PUSH1 0xFF DUP4 AND ISZERO JUMPDEST ISZERO PUSH2 0x2340 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND CALLER EQ PUSH2 0x22CB JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x3F4F JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND ISZERO PUSH2 0x2303 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x422B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND PUSH2 0x233B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x43D8 JUMP JUMPDEST PUSH2 0x24FA JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND PUSH2 0x2366 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x4371 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x2 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1901 PUSH1 0xF0 SHL DUP2 MSTORE POP PUSH2 0x238B PUSH2 0x101C JUMP JUMPDEST PUSH32 0x1962BC9F5484CB7A998701B81090E966EE1FCE5771AF884CCEEE7C081B14ADE2 DUP8 PUSH2 0x23D7 JUMPI PUSH32 0xB426802F1F7DC850A7B6B38805EDEA2442F3992878A9AB985ABFE8091D95D0B1 PUSH2 0x23F9 JUMP JUMPDEST PUSH32 0x422AC5323FE049241DEE67716229A1CC1BC7B313B23DFE3EF6D42AB177A3B284 JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP12 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 DUP2 ADD SWAP1 SWAP2 SSTORE SWAP2 MLOAD PUSH2 0x2433 SWAP5 SWAP4 SWAP3 DUP15 SWAP3 DUP15 SWAP3 DUP15 SWAP3 SWAP2 ADD PUSH2 0x3E15 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x245B SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x3B9E JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP PUSH1 0x0 PUSH1 0x1 DUP3 DUP7 DUP7 DUP7 PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD PUSH2 0x2498 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x3E6D JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x24BA JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD SUB MLOAD SWAP1 POP DUP8 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x24F7 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x4262 JUMP JUMPDEST POP POP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP12 AND DUP1 DUP5 MSTORE SWAP5 SWAP1 SWAP2 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND DUP9 ISZERO ISZERO OR SWAP1 SSTORE MLOAD PUSH32 0x5F6EBB64BA012A851C6F014E6CAD458DDF213D1512049B31CD06365C2B059257 SWAP1 PUSH2 0x255E SWAP1 DUP9 SWAP1 PUSH2 0x3E01 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP1 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT DUP1 ISZERO PUSH2 0x2587 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x25B1 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP SWAP2 POP DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT DUP1 ISZERO PUSH2 0x25CA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x25FE JUMPI DUP2 PUSH1 0x20 ADD JUMPDEST PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x25E9 JUMPI SWAP1 POP JUMPDEST POP SWAP1 POP PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x26F5 JUMPI PUSH1 0x0 PUSH1 0x60 ADDRESS DUP9 DUP9 DUP6 DUP2 DUP2 LT PUSH2 0x261D JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0x262F SWAP2 SWAP1 PUSH2 0x4550 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x263D SWAP3 SWAP2 SWAP1 PUSH2 0x3B72 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS DELEGATECALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x2678 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 0x267D JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 DUP1 PUSH2 0x268C JUMPI POP DUP6 ISZERO JUMPDEST PUSH2 0x2695 DUP3 PUSH2 0x3325 JUMP JUMPDEST SWAP1 PUSH2 0x26B3 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP2 SWAP1 PUSH2 0x3E9F JUMP JUMPDEST POP DUP2 DUP6 DUP5 DUP2 MLOAD DUP2 LT PUSH2 0x26C1 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD SWAP1 ISZERO ISZERO SWAP1 DUP2 ISZERO ISZERO DUP2 MSTORE POP POP DUP1 DUP5 DUP5 DUP2 MLOAD DUP2 LT PUSH2 0x26E0 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD MSTORE POP POP PUSH1 0x1 ADD PUSH2 0x2604 JUMP JUMPDEST POP SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP2 MLOAD DUP1 DUP4 ADD SWAP1 SWAP3 MSTORE SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP3 AND DUP4 MSTORE PUSH1 0x1 PUSH1 0x80 SHL SWAP1 SWAP2 DIV AND SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH2 0x1261 SWAP1 DUP5 DUP5 PUSH2 0x2D64 JUMP JUMPDEST PUSH1 0xA PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 AND SWAP2 PUSH1 0x1 PUSH1 0x40 SHL DUP2 DIV SWAP1 SWAP2 AND SWAP1 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP4 JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH3 0x186A0 PUSH2 0x27A3 DUP6 PUSH1 0x32 PUSH2 0x316C JUMP JUMPDEST DUP2 PUSH2 0x27AA JUMPI INVALID JUMPDEST DIV SWAP1 POP PUSH2 0x27C1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND DUP8 DUP7 PUSH2 0x31A3 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH4 0x23E30C8B PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP9 AND SWAP1 PUSH4 0x23E30C8B SWAP1 PUSH2 0x27F7 SWAP1 CALLER SWAP1 DUP10 SWAP1 DUP10 SWAP1 DUP8 SWAP1 DUP11 SWAP1 DUP11 SWAP1 PUSH1 0x4 ADD PUSH2 0x3CA2 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2811 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2825 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH2 0x285C PUSH2 0x2835 DUP3 PUSH2 0x2DFE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x32C2 JUMP JUMPDEST PUSH2 0x2865 DUP7 PUSH2 0x2EDF JUMP JUMPDEST LT ISZERO PUSH2 0x2883 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x43A8 JUMP JUMPDEST DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP9 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x3BE9B85936D5D30A1655EA116A17EE3D827B2CD428CC026CE5BF2AC46A223204 DUP8 DUP6 PUSH1 0x40 MLOAD PUSH2 0x28D2 SWAP3 SWAP2 SWAP1 PUSH2 0x4502 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP POP POP POP POP POP JUMP JUMPDEST DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND CALLER EQ DUP1 ISZERO SWAP1 PUSH2 0x2906 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ADDRESS EQ ISZERO JUMPDEST ISZERO PUSH2 0x2988 JUMPI CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP1 PUSH2 0x2941 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x4305 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP7 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD PUSH1 0xFF AND PUSH2 0x2986 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x4188 JUMP JUMPDEST POP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH2 0x29AE JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x40EE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP9 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD PUSH2 0x29DE SWAP1 DUP4 PUSH2 0x2F87 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP10 DUP6 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE DUP1 DUP3 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE SWAP1 DUP6 AND DUP2 MSTORE KECCAK256 SLOAD PUSH2 0x2A1A SWAP1 DUP4 PUSH2 0x2FAA JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP8 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP10 DUP7 AND DUP1 DUP6 MSTORE SWAP3 MSTORE SWAP2 DUP3 SWAP1 KECCAK256 SWAP5 SWAP1 SWAP5 SSTORE MLOAD SWAP2 DUP8 AND SWAP2 PUSH32 0x6EABE333476233FD382224F233210CB808A7BC4C4DE64F9D76628BF63C677B1A SWAP1 PUSH2 0x2A78 SWAP1 DUP8 SWAP1 PUSH2 0x3E0C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT DUP1 ISZERO PUSH2 0x2A9F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x2AC9 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP SWAP1 POP DUP6 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x2B98 JUMPI PUSH1 0x0 DUP8 DUP8 DUP4 DUP2 DUP2 LT PUSH2 0x2AE6 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD SWAP1 POP PUSH3 0x186A0 PUSH2 0x2B07 PUSH1 0x32 DUP4 PUSH2 0x316C SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP2 PUSH2 0x2B0E JUMPI INVALID JUMPDEST DIV DUP5 DUP4 DUP2 MLOAD DUP2 LT PUSH2 0x2B1B JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 DUP2 MSTORE POP POP PUSH2 0x2B8F DUP13 DUP13 DUP5 DUP2 DUP2 LT PUSH2 0x2B36 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0x2B4B SWAP2 SWAP1 PUSH2 0x345F JUMP JUMPDEST DUP10 DUP10 DUP6 DUP2 DUP2 LT PUSH2 0x2B57 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD DUP13 DUP13 DUP7 DUP2 DUP2 LT PUSH2 0x2B6A JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0x2B7F SWAP2 SWAP1 PUSH2 0x345F JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 SWAP1 PUSH2 0x31A3 JUMP JUMPDEST POP PUSH1 0x1 ADD PUSH2 0x2AD0 JUMP JUMPDEST POP PUSH1 0x40 MLOAD PUSH4 0xD9D17623 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP13 AND SWAP1 PUSH4 0xD9D17623 SWAP1 PUSH2 0x2BD3 SWAP1 CALLER SWAP1 DUP13 SWAP1 DUP13 SWAP1 DUP13 SWAP1 DUP13 SWAP1 DUP11 SWAP1 DUP14 SWAP1 DUP14 SWAP1 PUSH1 0x4 ADD PUSH2 0x3BDC JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2BED JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2C01 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x1D9A JUMPI PUSH1 0x0 DUP10 DUP10 DUP4 DUP2 DUP2 LT PUSH2 0x2C1E JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0x2C33 SWAP2 SWAP1 PUSH2 0x345F JUMP JUMPDEST SWAP1 POP PUSH2 0x2C7B PUSH2 0x2C54 DUP6 DUP5 DUP2 MLOAD DUP2 LT PUSH2 0x2C47 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH2 0x2DFE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x32C2 JUMP JUMPDEST PUSH2 0x2C84 DUP3 PUSH2 0x2EDF JUMP JUMPDEST LT ISZERO PUSH2 0x2CA2 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x43A8 JUMP JUMPDEST DUP12 DUP12 DUP4 DUP2 DUP2 LT PUSH2 0x2CAE JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0x2CC3 SWAP2 SWAP1 PUSH2 0x345F JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP15 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x3BE9B85936D5D30A1655EA116A17EE3D827B2CD428CC026CE5BF2AC46A223204 DUP12 DUP12 DUP8 DUP2 DUP2 LT PUSH2 0x2D0D JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD DUP9 DUP8 DUP2 MLOAD DUP2 LT PUSH2 0x2D20 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x40 MLOAD PUSH2 0x2D36 SWAP3 SWAP2 SWAP1 PUSH2 0x4502 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP PUSH1 0x1 ADD PUSH2 0x2C08 JUMP JUMPDEST PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST DUP3 MLOAD PUSH1 0x0 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x2D7D JUMPI POP DUP2 PUSH2 0x2DF7 JUMP JUMPDEST DUP4 MLOAD PUSH1 0x20 DUP6 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP2 DUP3 AND SWAP2 PUSH2 0x2D9C SWAP2 DUP7 SWAP2 AND PUSH2 0x316C JUMP JUMPDEST DUP2 PUSH2 0x2DA3 JUMPI INVALID JUMPDEST DIV SWAP1 POP DUP2 DUP1 ISZERO PUSH2 0x2DE7 JUMPI POP DUP3 DUP5 PUSH1 0x20 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x2DDD DUP7 PUSH1 0x0 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP5 PUSH2 0x316C SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP2 PUSH2 0x2DE4 JUMPI INVALID JUMPDEST DIV LT JUMPDEST ISZERO PUSH2 0x2DF7 JUMPI PUSH2 0x1261 DUP2 PUSH1 0x1 PUSH2 0x2FAA JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP3 GT ISZERO PUSH2 0x2E27 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x4049 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST DUP2 DUP2 ADD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP4 AND SWAP1 DUP3 AND LT ISZERO PUSH2 0x2E5A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x4080 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP4 PUSH1 0x20 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH1 0x0 EQ ISZERO PUSH2 0x2E7F JUMPI POP DUP2 PUSH2 0x2DF7 JUMP JUMPDEST PUSH1 0x20 DUP5 ADD MLOAD DUP5 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP2 DUP3 AND SWAP2 PUSH2 0x2E9E SWAP2 DUP7 SWAP2 AND PUSH2 0x316C JUMP JUMPDEST DUP2 PUSH2 0x2EA5 JUMPI INVALID JUMPDEST DIV SWAP1 POP DUP2 DUP1 ISZERO PUSH2 0x2DE7 JUMPI POP DUP3 DUP5 PUSH1 0x0 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x2DDD DUP7 PUSH1 0x20 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP5 PUSH2 0x316C SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0xA PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 SLOAD SWAP1 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE SWAP2 SWAP3 PUSH2 0x2E5A SWAP3 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 SWAP3 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND SWAP2 PUSH4 0x70A08231 SWAP1 PUSH2 0x2F31 SWAP1 ADDRESS SWAP1 PUSH1 0x4 ADD PUSH2 0x3BC8 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2F49 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2F5D 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 DUP2 ADD SWAP1 PUSH2 0x2F81 SWAP2 SWAP1 PUSH2 0x3A1F JUMP JUMPDEST SWAP1 PUSH2 0x2FAA JUMP JUMPDEST DUP1 DUP3 SUB DUP3 DUP2 GT ISZERO PUSH2 0x2E5A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x3EB2 JUMP JUMPDEST DUP2 DUP2 ADD DUP2 DUP2 LT ISZERO PUSH2 0x2E5A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x4080 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x23B872DD PUSH1 0xE0 SHL DUP7 DUP7 DUP7 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x2FF8 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x3CE9 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F NOT DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 MSTORE SWAP1 MLOAD PUSH2 0x3036 SWAP2 SWAP1 PUSH2 0x3B82 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 0x3073 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 0x3078 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 DUP1 ISZERO PUSH2 0x30A2 JUMPI POP DUP1 MLOAD ISZERO DUP1 PUSH2 0x30A2 JUMPI POP DUP1 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x30A2 SWAP2 SWAP1 PUSH2 0x3644 JUMP JUMPDEST PUSH2 0x30BE JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x433C JUMP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH32 0x8CAD95687BA82C2CE50E74F7B754645E5117C3A5BEC8151C0726D5857980A866 PUSH32 0xD7DF266AFF736D415A9DC14B4158201D612E70D75B9C7F4E375CCFD20AA5166F DUP4 ADDRESS PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x311F SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x3E49 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST DUP1 DUP3 SUB PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP5 AND SWAP1 DUP3 AND GT ISZERO PUSH2 0x2E5A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x3EB2 JUMP JUMPDEST PUSH1 0x0 DUP2 ISZERO DUP1 PUSH2 0x3187 JUMPI POP POP DUP1 DUP3 MUL DUP3 DUP3 DUP3 DUP2 PUSH2 0x3184 JUMPI INVALID JUMPDEST DIV EQ JUMPDEST PUSH2 0x2E5A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x4446 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xA9059CBB PUSH1 0xE0 SHL DUP6 DUP6 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x31CC SWAP3 SWAP2 SWAP1 PUSH2 0x3D4E JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F NOT DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 MSTORE SWAP1 MLOAD PUSH2 0x320A SWAP2 SWAP1 PUSH2 0x3B82 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 0x3247 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 0x324C JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 DUP1 ISZERO PUSH2 0x3276 JUMPI POP DUP1 MLOAD ISZERO DUP1 PUSH2 0x3276 JUMPI POP DUP1 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x3276 SWAP2 SWAP1 PUSH2 0x3644 JUMP JUMPDEST PUSH2 0x3292 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x3F86 JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP3 GT ISZERO PUSH2 0x2E27 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x41F4 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x32E1 PUSH2 0x32D0 DUP4 PUSH2 0x2DFE JUMP JUMPDEST DUP5 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND SWAP1 PUSH2 0x2E2B JUMP JUMPDEST DUP4 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP2 SWAP1 SWAP2 AND SWAP1 DUP2 OR SWAP1 SWAP4 SSTORE POP SWAP1 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x32E1 PUSH2 0x3314 DUP4 PUSH2 0x2DFE JUMP JUMPDEST DUP5 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND SWAP1 PUSH2 0x313D JUMP JUMPDEST PUSH1 0x60 PUSH1 0x44 DUP3 MLOAD LT ISZERO PUSH2 0x336B JUMPI POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x1D DUP2 MSTORE PUSH32 0x5472616E73616374696F6E2072657665727465642073696C656E746C79000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x3138 JUMP JUMPDEST PUSH1 0x4 DUP3 ADD SWAP2 POP DUP2 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x2E5A SWAP2 SWAP1 PUSH2 0x3A37 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x33CD JUMPI DUP2 DUP3 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x33E3 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP1 DUP4 MUL DUP6 ADD ADD GT ISZERO PUSH2 0x33FD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x3415 JUMPI DUP2 DUP3 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x342B JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x33FD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD PUSH2 0x2E5A DUP2 PUSH2 0x45D0 JUMP JUMPDEST DUP1 CALLDATALOAD PUSH1 0xFF DUP2 AND DUP2 EQ PUSH2 0x2E5A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3470 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x2DF7 DUP2 PUSH2 0x45D0 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x348D JUMPI DUP1 DUP2 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x3498 DUP2 PUSH2 0x45D0 JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH2 0x34A8 DUP2 PUSH2 0x45D0 JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xC0 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x34CB JUMPI DUP2 DUP3 REVERT JUMPDEST DUP7 CALLDATALOAD PUSH2 0x34D6 DUP2 PUSH2 0x45D0 JUMP JUMPDEST SWAP6 POP PUSH1 0x20 DUP8 ADD CALLDATALOAD PUSH2 0x34E6 DUP2 PUSH2 0x45D0 JUMP JUMPDEST SWAP5 POP PUSH1 0x40 DUP8 ADD CALLDATALOAD PUSH2 0x34F6 DUP2 PUSH2 0x45E8 JUMP JUMPDEST SWAP4 POP PUSH2 0x3505 DUP9 PUSH1 0x60 DUP10 ADD PUSH2 0x344E JUMP JUMPDEST SWAP3 POP PUSH1 0x80 DUP8 ADD CALLDATALOAD SWAP2 POP PUSH1 0xA0 DUP8 ADD CALLDATALOAD SWAP1 POP SWAP3 SWAP6 POP SWAP3 SWAP6 POP SWAP3 SWAP6 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x3531 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x353C DUP2 PUSH2 0x45D0 JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH2 0x34A8 DUP2 PUSH2 0x45E8 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x3560 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x356B DUP2 PUSH2 0x45D0 JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x357B DUP2 PUSH2 0x45E8 JUMP JUMPDEST SWAP2 POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH2 0x358B DUP2 PUSH2 0x45E8 JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x35AB JUMPI DUP4 DUP5 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH2 0x35B6 DUP2 PUSH2 0x45D0 JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x35D0 JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x35DC DUP8 DUP3 DUP9 ADD PUSH2 0x3404 JUMP JUMPDEST SWAP1 SWAP5 POP SWAP3 POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH2 0x35F0 DUP2 PUSH2 0x45E8 JUMP JUMPDEST SWAP4 SWAP7 SWAP3 SWAP6 POP SWAP1 SWAP4 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x40 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x360F JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x3624 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x3630 DUP7 DUP3 DUP8 ADD PUSH2 0x33BC JUMP JUMPDEST SWAP1 SWAP5 POP SWAP3 POP POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x358B DUP2 PUSH2 0x45E8 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3655 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x2DF7 DUP2 PUSH2 0x45E8 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP11 DUP13 SUB SLT ISZERO PUSH2 0x367D JUMPI DUP7 DUP8 REVERT JUMPDEST DUP10 CALLDATALOAD PUSH2 0x3688 DUP2 PUSH2 0x45D0 JUMP JUMPDEST SWAP9 POP PUSH1 0x20 DUP11 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 GT ISZERO PUSH2 0x36A3 JUMPI DUP9 DUP10 REVERT JUMPDEST PUSH2 0x36AF DUP14 DUP4 DUP15 ADD PUSH2 0x33BC JUMP JUMPDEST SWAP1 SWAP11 POP SWAP9 POP PUSH1 0x40 DUP13 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x36C7 JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH2 0x36D3 DUP14 DUP4 DUP15 ADD PUSH2 0x33BC JUMP JUMPDEST SWAP1 SWAP9 POP SWAP7 POP PUSH1 0x60 DUP13 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x36EB JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH2 0x36F7 DUP14 DUP4 DUP15 ADD PUSH2 0x33BC JUMP JUMPDEST SWAP1 SWAP7 POP SWAP5 POP PUSH1 0x80 DUP13 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x370F JUMPI DUP4 DUP5 REVERT JUMPDEST POP PUSH2 0x371C DUP13 DUP3 DUP14 ADD PUSH2 0x3404 JUMP JUMPDEST SWAP2 POP DUP1 SWAP4 POP POP DUP1 SWAP2 POP POP SWAP3 SWAP6 SWAP9 POP SWAP3 SWAP6 SWAP9 POP SWAP3 SWAP6 SWAP9 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x348D JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x375A JUMPI DUP2 DUP3 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH2 0x3765 DUP2 PUSH2 0x45D0 JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH2 0x3775 DUP2 PUSH2 0x45D0 JUMP JUMPDEST SWAP3 POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH2 0x3785 DUP2 PUSH2 0x45D0 JUMP JUMPDEST SWAP4 SWAP7 SWAP3 SWAP6 POP SWAP3 SWAP4 PUSH1 0x60 ADD CALLDATALOAD SWAP3 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x37AC JUMPI DUP3 DUP4 REVERT JUMPDEST DUP6 CALLDATALOAD PUSH2 0x37B7 DUP2 PUSH2 0x45D0 JUMP JUMPDEST SWAP5 POP PUSH1 0x20 DUP7 ADD CALLDATALOAD PUSH2 0x37C7 DUP2 PUSH2 0x45D0 JUMP JUMPDEST SWAP4 POP PUSH1 0x40 DUP7 ADD CALLDATALOAD PUSH2 0x37D7 DUP2 PUSH2 0x45D0 JUMP JUMPDEST SWAP5 SWAP8 SWAP4 SWAP7 POP SWAP4 SWAP5 PUSH1 0x60 DUP2 ADD CALLDATALOAD SWAP5 POP PUSH1 0x80 ADD CALLDATALOAD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH2 0x100 DUP10 DUP12 SUB SLT ISZERO PUSH2 0x380B JUMPI DUP2 DUP3 REVERT JUMPDEST DUP9 CALLDATALOAD PUSH2 0x3816 DUP2 PUSH2 0x45D0 JUMP JUMPDEST SWAP8 POP PUSH1 0x20 DUP10 ADD CALLDATALOAD PUSH2 0x3826 DUP2 PUSH2 0x45D0 JUMP JUMPDEST SWAP7 POP PUSH1 0x40 DUP10 ADD CALLDATALOAD PUSH2 0x3836 DUP2 PUSH2 0x45D0 JUMP JUMPDEST SWAP6 POP PUSH1 0x60 DUP10 ADD CALLDATALOAD SWAP5 POP PUSH1 0x80 DUP10 ADD CALLDATALOAD SWAP4 POP PUSH2 0x3853 DUP11 PUSH1 0xA0 DUP12 ADD PUSH2 0x344E JUMP JUMPDEST SWAP3 POP PUSH1 0xC0 DUP10 ADD CALLDATALOAD SWAP2 POP PUSH1 0xE0 DUP10 ADD CALLDATALOAD SWAP1 POP SWAP3 SWAP6 SWAP9 POP SWAP3 SWAP6 SWAP9 SWAP1 SWAP4 SWAP7 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x3888 JUMPI DUP4 DUP5 REVERT JUMPDEST DUP7 CALLDATALOAD PUSH2 0x3893 DUP2 PUSH2 0x45D0 JUMP JUMPDEST SWAP6 POP PUSH1 0x20 DUP8 ADD CALLDATALOAD PUSH2 0x38A3 DUP2 PUSH2 0x45D0 JUMP JUMPDEST SWAP5 POP PUSH1 0x40 DUP8 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 GT ISZERO PUSH2 0x38BE JUMPI DUP6 DUP7 REVERT JUMPDEST PUSH2 0x38CA DUP11 DUP4 DUP12 ADD PUSH2 0x33BC JUMP JUMPDEST SWAP1 SWAP7 POP SWAP5 POP PUSH1 0x60 DUP10 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x38E2 JUMPI DUP4 DUP5 REVERT JUMPDEST POP PUSH2 0x38EF DUP10 DUP3 DUP11 ADD PUSH2 0x33BC 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 0x3915 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x3920 DUP2 PUSH2 0x45D0 JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x3930 DUP2 PUSH2 0x45E8 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 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x3955 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x3960 DUP2 PUSH2 0x45D0 JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD SWAP2 POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH2 0x358B DUP2 PUSH2 0x45E8 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x3989 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x3994 DUP2 PUSH2 0x45D0 JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x34A8 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xA0 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x39C7 JUMPI DUP4 DUP5 REVERT JUMPDEST DUP7 CALLDATALOAD PUSH2 0x39D2 DUP2 PUSH2 0x45D0 JUMP JUMPDEST SWAP6 POP PUSH1 0x20 DUP8 ADD CALLDATALOAD PUSH2 0x39E2 DUP2 PUSH2 0x45D0 JUMP JUMPDEST SWAP5 POP PUSH1 0x40 DUP8 ADD CALLDATALOAD PUSH2 0x39F2 DUP2 PUSH2 0x45D0 JUMP JUMPDEST SWAP4 POP PUSH1 0x60 DUP8 ADD CALLDATALOAD SWAP3 POP PUSH1 0x80 DUP8 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x3A13 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0x38EF DUP10 DUP3 DUP11 ADD PUSH2 0x3404 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3A30 JUMPI DUP1 DUP2 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3A48 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 GT ISZERO PUSH2 0x3A5E JUMPI DUP3 DUP4 REVERT JUMPDEST DUP2 DUP5 ADD SWAP2 POP DUP5 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x3A71 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP2 MLOAD DUP2 DUP2 GT ISZERO PUSH2 0x3A7F JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1F DUP3 ADD PUSH1 0x1F NOT AND DUP2 ADD PUSH1 0x20 ADD DUP4 DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x3A9F JUMPI DUP6 DUP7 REVERT JUMPDEST PUSH1 0x40 MSTORE DUP2 DUP2 MSTORE DUP4 DUP3 ADD PUSH1 0x20 ADD DUP8 LT ISZERO PUSH2 0x3AB6 JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH2 0x3AC7 DUP3 PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP8 ADD PUSH2 0x45A0 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH1 0x20 DUP1 DUP6 ADD SWAP5 POP DUP1 DUP5 ADD DUP4 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3B11 JUMPI DUP2 MLOAD DUP8 MSTORE SWAP6 DUP3 ADD SWAP6 SWAP1 DUP3 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x3AF5 JUMP JUMPDEST POP SWAP5 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP5 MSTORE DUP3 DUP3 PUSH1 0x20 DUP7 ADD CALLDATACOPY DUP1 PUSH1 0x20 DUP5 DUP7 ADD ADD MSTORE PUSH1 0x20 PUSH1 0x1F NOT PUSH1 0x1F DUP6 ADD AND DUP6 ADD ADD SWAP1 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH2 0x3B5E DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x45A0 JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP5 DUP4 CALLDATACOPY SWAP2 ADD SWAP1 DUP2 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH2 0x3B94 DUP2 DUP5 PUSH1 0x20 DUP8 ADD PUSH2 0x45A0 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP5 MLOAD PUSH2 0x3BB0 DUP2 DUP5 PUSH1 0x20 DUP10 ADD PUSH2 0x45A0 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 DUP4 MSTORE POP PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP2 SWAP1 POP JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP10 AND DUP2 MSTORE PUSH1 0xA0 PUSH1 0x20 DUP1 DUP4 ADD DUP3 SWAP1 MSTORE PUSH1 0x0 SWAP2 DUP4 ADD SWAP1 DUP2 PUSH2 0x3C03 DUP12 DUP3 PUSH2 0x3E0C JUMP JUMPDEST SWAP1 POP DUP12 SWAP3 POP DUP4 JUMPDEST DUP12 DUP2 LT ISZERO PUSH2 0x3C35 JUMPI DUP3 DUP5 ADD PUSH2 0x3C28 DUP4 PUSH2 0x3C23 DUP4 DUP9 PUSH2 0x3443 JUMP JUMPDEST PUSH2 0x3AD1 JUMP JUMPDEST SWAP1 SWAP5 POP SWAP2 POP PUSH1 0x1 ADD PUSH2 0x3C0A JUMP JUMPDEST POP DUP5 DUP2 SUB PUSH1 0x40 DUP7 ADD MSTORE PUSH2 0x3C48 DUP10 DUP3 PUSH2 0x3E0C JUMP JUMPDEST SWAP3 POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xFB SHL SUB DUP9 GT ISZERO PUSH2 0x3C5E JUMPI DUP3 DUP4 REVERT JUMPDEST DUP8 MUL PUSH2 0x3C6B DUP2 DUP4 DUP12 PUSH2 0x4594 JUMP JUMPDEST ADD DUP3 DUP2 SUB PUSH1 0x60 DUP5 ADD MSTORE PUSH2 0x3C7E DUP2 DUP8 PUSH2 0x3AE2 JUMP JUMPDEST SWAP1 POP DUP3 DUP2 SUB PUSH1 0x80 DUP5 ADD MSTORE PUSH2 0x3C93 DUP2 DUP6 DUP8 PUSH2 0x3B1C JUMP JUMPDEST SWAP12 SWAP11 POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 DUP2 AND DUP3 MSTORE DUP7 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 DUP2 ADD DUP6 SWAP1 MSTORE PUSH1 0x60 DUP2 ADD DUP5 SWAP1 MSTORE PUSH1 0xA0 PUSH1 0x80 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP1 PUSH2 0x3CDD SWAP1 DUP4 ADD DUP5 DUP7 PUSH2 0x3B1C JUMP JUMPDEST SWAP9 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB 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 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP8 DUP9 AND DUP2 MSTORE SWAP6 SWAP1 SWAP7 AND PUSH1 0x20 DUP7 ADD MSTORE PUSH1 0x40 DUP6 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x60 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xFF AND PUSH1 0x80 DUP4 ADD MSTORE PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xC0 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xE0 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 DUP3 MSTORE DUP4 MLOAD SWAP1 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP1 PUSH1 0x20 SWAP1 PUSH1 0x60 DUP5 ADD SWAP1 DUP3 DUP8 ADD DUP5 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x3DA2 JUMPI DUP2 MLOAD ISZERO ISZERO DUP5 MSTORE SWAP3 DUP5 ADD SWAP3 SWAP1 DUP5 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x3D84 JUMP JUMPDEST POP POP POP DUP4 DUP2 SUB DUP3 DUP6 ADD MSTORE DUP1 DUP6 MLOAD PUSH2 0x3DB9 DUP2 DUP5 PUSH2 0x3E0C JUMP JUMPDEST SWAP2 POP DUP2 SWAP3 POP DUP4 DUP2 MUL DUP3 ADD DUP5 DUP9 ADD DUP7 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3DF2 JUMPI DUP6 DUP4 SUB DUP6 MSTORE PUSH2 0x3DE0 DUP4 DUP4 MLOAD PUSH2 0x3B46 JUMP JUMPDEST SWAP5 DUP8 ADD SWAP5 SWAP3 POP SWAP1 DUP7 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x3DC8 JUMP JUMPDEST POP SWAP1 SWAP10 SWAP9 POP POP POP POP POP POP POP POP POP JUMP JUMPDEST SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP6 DUP7 MSTORE PUSH1 0x20 DUP7 ADD SWAP5 SWAP1 SWAP5 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND PUSH1 0x40 DUP7 ADD MSTORE SWAP2 AND PUSH1 0x60 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x80 DUP4 ADD MSTORE PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xC0 ADD SWAP1 JUMP JUMPDEST SWAP4 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST SWAP4 DUP5 MSTORE PUSH1 0xFF SWAP3 SWAP1 SWAP3 AND PUSH1 0x20 DUP5 ADD MSTORE PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE PUSH2 0x1261 PUSH1 0x20 DUP4 ADD DUP5 DUP7 PUSH2 0x3B1C JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE PUSH2 0x2DF7 PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x3B46 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x15 SWAP1 DUP3 ADD MSTORE PUSH21 0x426F72696E674D6174683A20556E646572666C6F77 PUSH1 0x58 SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x17 SWAP1 DUP3 ADD MSTORE PUSH32 0x42656E746F426F783A20536B696D20746F6F206D756368000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1C SWAP1 DUP3 ADD MSTORE PUSH32 0x4D6173746572434D67723A2043616E6E6F7420617070726F7665203000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1B SWAP1 DUP3 ADD MSTORE PUSH32 0x4D6173746572434D67723A2075736572206E6F742073656E6465720000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1C SWAP1 DUP3 ADD MSTORE PUSH32 0x426F72696E6745524332303A205472616E73666572206661696C656400000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x16 SWAP1 DUP3 ADD MSTORE PUSH22 0x42656E746F426F783A2063616E6E6F7420656D707479 PUSH1 0x50 SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x15 SWAP1 DUP3 ADD MSTORE PUSH21 0x4F776E61626C653A207A65726F2061646472657373 PUSH1 0x58 SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x13 SWAP1 DUP3 ADD MSTORE PUSH19 0x42656E746F426F783A204E6F20746F6B656E73 PUSH1 0x68 SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1C SWAP1 DUP3 ADD MSTORE PUSH32 0x426F72696E674D6174683A2075696E74313238204F766572666C6F7700000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x18 SWAP1 DUP3 ADD MSTORE PUSH32 0x426F72696E674D6174683A20416464204F766572666C6F770000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x17 SWAP1 DUP3 ADD MSTORE PUSH32 0x42656E746F426F783A20746F5B305D206E6F7420736574000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x14 SWAP1 DUP3 ADD MSTORE PUSH20 0x10995B9D1BD09BDE0E881D1BC81B9BDD081CD95D PUSH1 0x62 SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1A SWAP1 DUP3 ADD MSTORE PUSH32 0x53747261746567794D616E616765723A20546F6F206561726C79000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 DUP2 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1F SWAP1 DUP3 ADD MSTORE PUSH32 0x42656E746F426F783A205472616E73666572206E6F7420617070726F76656400 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 DUP2 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C657220213D2070656E64696E67206F776E6572 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1B SWAP1 DUP3 ADD MSTORE PUSH32 0x426F72696E674D6174683A2075696E743634204F766572666C6F770000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x19 SWAP1 DUP3 ADD MSTORE PUSH32 0x4D6173746572434D67723A207573657220697320636C6F6E6500000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1D SWAP1 DUP3 ADD MSTORE PUSH32 0x4D6173746572434D67723A20496E76616C6964205369676E6174757265000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 DUP2 ADD MSTORE PUSH32 0x426F72696E67466163746F72793A204E6F206D6173746572436F6E7472616374 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1B SWAP1 DUP3 ADD MSTORE PUSH32 0x4D6173746572434D67723A206D617374657243206E6F74207365740000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1B SWAP1 DUP3 ADD MSTORE PUSH32 0x42656E746F426F783A206E6F206D6173746572436F6E74726163740000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 DUP2 ADD MSTORE PUSH32 0x426F72696E6745524332303A205472616E7366657246726F6D206661696C6564 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1C SWAP1 DUP3 ADD MSTORE PUSH32 0x4D6173746572434D67723A20557365722063616E6E6F74206265203000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x16 SWAP1 DUP3 ADD MSTORE PUSH22 0x10995B9D1BD09BDE0E8815DC9BDB99C8185B5BDD5B9D PUSH1 0x52 SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1B SWAP1 DUP3 ADD MSTORE PUSH32 0x4D6173746572434D67723A206E6F742077686974656C69737465640000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1D SWAP1 DUP3 ADD MSTORE PUSH32 0x42656E746F426F783A20455448207472616E73666572206661696C6564000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x18 SWAP1 DUP3 ADD MSTORE PUSH32 0x426F72696E674D6174683A204D756C204F766572666C6F770000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 DUP2 ADD MSTORE PUSH32 0x53747261746567794D616E616765723A2054617267657420746F6F2068696768 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP3 SWAP1 SWAP3 AND DUP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP3 DUP4 AND DUP2 MSTORE SWAP2 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB SWAP4 DUP5 AND DUP2 MSTORE SWAP2 SWAP1 SWAP3 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP1 SWAP2 AND PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH1 0x1E NOT DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x4566 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 ADD DUP1 CALLDATALOAD SWAP2 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP3 GT ISZERO PUSH2 0x457F JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH1 0x20 ADD SWAP2 POP CALLDATASIZE DUP2 SWAP1 SUB DUP3 SGT ISZERO PUSH2 0x33FD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x45BB JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x45A3 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x45CA JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x45E5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x45E5 JUMPI PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xBB 0xDE PUSH24 0xAAF581519850551EEE78BC6315B2E7D060C6C0B1C48CF153 COINBASE 0xED PUSH1 0xF7 0xED PUSH5 0x736F6C6343 STOP MOD 0xC STOP CALLER ",
              "sourceMap": "27802:23044:0:-:0;;;30564:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13581:5;:18;;-1:-1:-1;;;;;;13581:18:0;13589:10;13581:18;;;;;13614:44;;13589:10;;13581:5;13614:44;;13581:5;;13614:44;19784:9;19858:35;;;;19832:62;19784:9;19832:25;:62::i;:::-;19812:82;;-1:-1:-1;30612:22:0;;-1:-1:-1;;;;;;30612:22:0;;;27802:23044;;19907:211;19981:7;19080:80;20061:24;20087:7;20104:4;20017:93;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;20007:104;;;;;;20000:111;;19907:211;;;:::o;172:289:-1:-;;300:2;288:9;279:7;275:23;271:32;268:2;;;-1:-1;;306:12;268:2;96:13;;-1:-1;;;;;1741:54;;1958:48;;1948:2;;-1:-1;;2010:12;1948:2;358:87;262:199;-1:-1;;;262:199::o;828:556::-;659:37;;;1204:2;1189:18;;659:37;;;;1287:2;1272:18;;659:37;-1:-1;;;;;1741:54;1370:2;1355:18;;539:37;1039:3;1024:19;;1010:374::o;:::-;27802:23044:0;;;;;;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {
                "1165": [
                  {
                    "length": 32,
                    "start": 4182
                  }
                ],
                "1167": [
                  {
                    "length": 32,
                    "start": 4129
                  }
                ],
                "1675": [
                  {
                    "length": 32,
                    "start": 1733
                  },
                  {
                    "length": 32,
                    "start": 2450
                  },
                  {
                    "length": 32,
                    "start": 7888
                  },
                  {
                    "length": 32,
                    "start": 8369
                  }
                ]
              },
              "linkReferences": {},
              "object": "6080604052600436106101dc5760003560e01c80637c516e9411610102578063d2423b5111610095578063f1676d3711610064578063f1676d3714610555578063f18d03cc14610575578063f483b3da14610595578063f7888aec146105b5576101e3565b8063d2423b51146104d0578063da5139ca146104f1578063df23b45b14610511578063e30c397814610540576101e3565b806397da6d30116100d157806397da6d301461045b578063aee4d1b21461047b578063bafe4f1414610490578063c0a47c93146104b0576101e3565b80637c516e94146103e65780637ecebe00146104065780638da5cb5b1461042657806391e0eab51461043b576101e3565b80633e2a9d4e1161017a5780635662311811610149578063566231181461036657806366c6bb0b1461038657806372cb5d97146103a6578063733a9d7c146103c6576101e3565b80633e2a9d4e146102e35780634e71e0c8146103035780634ffe34db146103185780635108a55814610346576101e3565b806312a90c8a116101b657806312a90c8a146102545780631f54245b14610281578063228bfd9f146102a15780633644e515146102c1576101e3565b806302b9446c146101e8578063078dfbe7146102125780630fca884314610234576101e3565b366101e357005b600080fd5b6101fb6101f6366004613795565b6105d5565b604051610209929190614502565b60405180910390f35b34801561021e57600080fd5b5061023261022d36600461354c565b610a99565b005b34801561024057600080fd5b5061023261024f366004613870565b610b7f565b34801561026057600080fd5b5061027461026f36600461345f565b610e30565b6040516102099190613e01565b61029461028f366004613596565b610e45565b6040516102099190613bc8565b3480156102ad57600080fd5b506102946102bc36600461345f565b611001565b3480156102cd57600080fd5b506102d661101c565b6040516102099190613e0c565b3480156102ef57600080fd5b506102326102fe366004613977565b61107c565b34801561030f57600080fd5b50610232611147565b34801561032457600080fd5b5061033861033336600461345f565b6111d4565b6040516102099291906144e8565b34801561035257600080fd5b5061029461036136600461345f565b6111fa565b34801561037257600080fd5b506102d6610381366004613941565b611215565b34801561039257600080fd5b506102326103a1366004613901565b611269565b3480156103b257600080fd5b506102326103c1366004613733565b611832565b3480156103d257600080fd5b506102326103e136600461351f565b611c90565b3480156103f257600080fd5b506102326104013660046137ef565b611d34565b34801561041257600080fd5b506102d661042136600461345f565b611da8565b34801561043257600080fd5b50610294611dba565b34801561044757600080fd5b5061027461045636600461347b565b611dc9565b34801561046757600080fd5b506101fb610476366004613795565b611de9565b34801561048757600080fd5b506102326121fd565b34801561049c57600080fd5b506102946104ab36600461345f565b612244565b3480156104bc57600080fd5b506102326104cb3660046134b3565b61225f565b6104e36104de3660046135fb565b61256e565b604051610209929190613d67565b3480156104fd57600080fd5b506102d661050c366004613941565b6126fe565b34801561051d57600080fd5b5061053161052c36600461345f565b61274a565b60405161020993929190614524565b34801561054c57600080fd5b50610294612783565b34801561056157600080fd5b506102326105703660046139af565b612792565b34801561058157600080fd5b50610232610590366004613745565b6128e3565b3480156105a157600080fd5b506102326105b0366004613660565b612a87565b3480156105c157600080fd5b506102d66105d0366004613733565b612d47565b600080856001600160a01b03811633148015906105fb57506001600160a01b0381163014155b1561068657336000908152600260205260409020546001600160a01b03168061063f5760405162461bcd60e51b815260040161063690614305565b60405180910390fd5b6001600160a01b0380821660009081526003602090815260408083209386168352929052205460ff166106845760405162461bcd60e51b815260040161063690614188565b505b6001600160a01b0386166106ac5760405162461bcd60e51b8152600401610636906140ee565b60006001600160a01b038916156106c357886106e5565b7f00000000000000000000000000000000000000000000000000000000000000005b90506106ef613385565b506001600160a01b0381166000908152600760209081526040918290208251808401909352546001600160801b03808216808552600160801b90920416918301919091521515806107b057506000826001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561077657600080fd5b505afa15801561078a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ae9190613a1f565b115b6107cc5760405162461bcd60e51b81526004016106369061401c565b85610824576107dd81886000612d64565b95506103e86108026107ee88612dfe565b60208401516001600160801b031690612e2b565b6001600160801b0316101561081f57600080945094505050610a8e565b610833565b61083081876001612e60565b96505b6001600160a01b0389163014158061085257506001600160a01b038a16155b8061087a57508051610876906001600160801b031661087084612edf565b90612f87565b8711155b6108965760405162461bcd60e51b815260040161063690613ee1565b6001600160a01b038083166000908152600660209081526040808320938c16835292905220546108c69087612faa565b6001600160a01b038084166000908152600660209081526040808320938d168352929052205561090c6108f887612dfe565b60208301516001600160801b031690612e2b565b6001600160801b0316602082015261093761092688612dfe565b82516001600160801b031690612e2b565b6001600160801b0390811682526001600160a01b03808416600090815260076020908152604090912084518154928601518516600160801b029085166001600160801b031990931692909217909316179091558a16610a09577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0886040518263ffffffff1660e01b81526004016000604051808303818588803b1580156109eb57600080fd5b505af11580156109ff573d6000803e3d6000fd5b5050505050610a2e565b6001600160a01b0389163014610a2e57610a2e6001600160a01b0383168a308a612fcd565b876001600160a01b0316896001600160a01b0316836001600160a01b03167fb2346165e782564f17f5b7e555c21f4fd96fbc93458572bf0113ea35a958fc558a8a604051610a7d929190614502565b60405180910390a486945085935050505b509550959350505050565b6000546001600160a01b03163314610ac35760405162461bcd60e51b815260040161063690614153565b8115610b5e576001600160a01b038316151580610add5750805b610af95760405162461bcd60e51b815260040161063690613fed565b600080546040516001600160a01b03808716939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0385166001600160a01b031991821617909155600180549091169055610b7a565b600180546001600160a01b0319166001600160a01b0385161790555b505050565b846001600160a01b0381163314801590610ba257506001600160a01b0381163014155b15610c2457336000908152600260205260409020546001600160a01b031680610bdd5760405162461bcd60e51b815260040161063690614305565b6001600160a01b0380821660009081526003602090815260408083209386168352929052205460ff16610c225760405162461bcd60e51b815260040161063690614188565b505b600085858281610c3057fe5b9050602002016020810190610c45919061345f565b6001600160a01b03161415610c6c5760405162461bcd60e51b8152600401610636906140b7565b600084815b81811015610dc8576000888883818110610c8757fe5b9050602002016020810190610c9c919061345f565b9050610d0b878784818110610cad57fe5b90506020020135600660008e6001600160a01b03166001600160a01b031681526020019081526020016000206000846001600160a01b03166001600160a01b0316815260200190815260200160002054612faa90919063ffffffff16565b6001600160a01b03808d16600090815260066020908152604080832093861683529290522055610d56878784818110610d4057fe5b9050602002013585612faa90919063ffffffff16565b9350806001600160a01b03168a6001600160a01b03168c6001600160a01b03167f6eabe333476233fd382224f233210cb808a7bc4c4de64f9d76628bf63c677b1a8a8a87818110610da357fe5b90506020020135604051610db79190613e0c565b60405180910390a450600101610c71565b506001600160a01b03808a166000908152600660209081526040808320938c1683529290522054610df99083612f87565b6001600160a01b03998a1660009081526006602090815260408083209b909c16825299909952989097209790975550505050505050565b60046020526000908152604090205460ff1681565b60006001600160a01b038516610e6d5760405162461bcd60e51b815260040161063690614299565b606085901b8215610edf5760008585604051610e8a929190613b72565b60405180910390209050604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81528260148201526e5af43d82803e903d91602b57fd5bf360881b6028820152816037826000f593505050610f24565b604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81528160148201526e5af43d82803e903d91602b57fd5bf360881b60288201526037816000f09250505b6001600160a01b038281166000818152600260205260409081902080546001600160a01b031916938a16939093179092559051631377d1f560e21b8152634ddf47d4903490610f799089908990600401613e8b565b6000604051808303818588803b158015610f9257600080fd5b505af1158015610fa6573d6000803e3d6000fd5b5050505050816001600160a01b0316866001600160a01b03167fd62166f3c2149208e51788b1401cc356bf5da1fc6c7886a32e18570f57d88b3b8787604051610ff0929190613e8b565b60405180910390a350949350505050565b6008602052600090815260409020546001600160a01b031681565b6000467f000000000000000000000000000000000000000000000000000000000000000081146110545761104f816130c6565b611076565b7f00000000000000000000000000000000000000000000000000000000000000005b91505090565b6000546001600160a01b031633146110a65760405162461bcd60e51b815260040161063690614153565b605f816001600160401b031611156110d05760405162461bcd60e51b81526004016106369061447d565b6001600160a01b0382166000818152600a602052604090819020805467ffffffffffffffff60401b1916600160401b6001600160401b03861602179055517f7543af99b5602c06e62da0631b5308489a5ff859150105a623b6eb15e8deae0b9061113b908490614510565b60405180910390a25050565b6001546001600160a01b03163381146111725760405162461bcd60e51b8152600401610636906141bf565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b039092166001600160a01b0319928316179055600180549091169055565b6007602052600090815260409020546001600160801b0380821691600160801b90041682565b6009602052600090815260409020546001600160a01b031681565b6001600160a01b03831660009081526007602090815260408083208151808301909252546001600160801b038082168352600160801b9091041691810191909152611261908484612e60565b949350505050565b61127161339c565b506001600160a01b038381166000818152600a60209081526040808320815160608101835290546001600160401b038082168352600160401b82041682850152600160801b90046001600160801b031681830190815294845260089092528083205493519051630c7e663b60e11b81529194939093169283916318fccc76916112fe9133906004016144c6565b602060405180830381600087803b15801561131857600080fd5b505af115801561132c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113509190613a1f565b90508015801561135e575084155b1561136b57505050610b7a565b6001600160a01b0386166000908152600760205260408120546001600160801b03169082131561142157816113a08282612faa565b91506113ab82612dfe565b6001600160a01b0389166000818152600760205260409081902080546001600160801b0319166001600160801b03949094169390931790925590517f911c9f20a03edabcbcbd18dca1174cce47a91b234ced7a5a3c60ba0d5b56c5d290611413908490613e0c565b60405180910390a2506114ef565b60008212156114ef5760008290036114398282612f87565b915061144482612dfe565b6001600160a01b038916600090815260076020526040902080546001600160801b0319166001600160801b039290921691909117905561149a61148682612dfe565b60408701516001600160801b03169061313d565b6001600160801b0316604080870191909152516001600160a01b038916907f8f1f26eb9b6aa8689dbdd519ead1999d9c8819d4738e403b2003b18197d9cf97906114e5908490613e0c565b60405180910390a2505b85156117ae576000606461151986602001516001600160401b03168461316c90919063ffffffff16565b8161152057fe5b0490508085604001516001600160801b0316101561165b57600061155a86604001516001600160801b031683612f8790919063ffffffff16565b9050861580159061156a57508681115b156115725750855b6115866001600160a01b038a1686836131a3565b6115a661159282612dfe565b60408801516001600160801b031690612e2b565b6001600160801b031660408088019190915251636939aaf560e01b81526001600160a01b03861690636939aaf5906115e2908490600401613e0c565b600060405180830381600087803b1580156115fc57600080fd5b505af1158015611610573d6000803e3d6000fd5b50505050886001600160a01b03167fb18e7e4f6eac147a63a3bb6beb2d9039c88698623aff3efc4febbc20b0164ee58260405161164d9190613e0c565b60405180910390a2506117ac565b8085604001516001600160801b031611156117ac57600061169261167e83612dfe565b60408801516001600160801b03169061313d565b6001600160801b0316905086158015906116ab57508681115b156116b35750855b604051632e1a7d4d60e01b81526000906001600160a01b03871690632e1a7d4d906116e2908590600401613e0c565b602060405180830381600087803b1580156116fc57600080fd5b505af1158015611710573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117349190613a1f565b905061175661174282612dfe565b60408901516001600160801b03169061313d565b6001600160801b0316604080890191909152516001600160a01b038b16907f39aa22060f8dd4d291720311feedf3b72fef47c06c66ccf5c22b502c62e7550a906117a1908490613e0c565b60405180910390a250505b505b5050506001600160a01b0384166000908152600a6020908152604091829020835181549285015193909401516001600160801b03908116600160801b026001600160401b03948516600160401b0267ffffffffffffffff60401b199590961667ffffffffffffffff1990941693909317939093169390931791909116179055505050565b6000546001600160a01b0316331461185c5760405162461bcd60e51b815260040161063690614153565b61186461339c565b506001600160a01b038281166000818152600a60209081526040808320815160608101835290546001600160401b038082168352600160401b8204811683860152600160801b9091046001600160801b0316828401529484526009909252909120548151919316911615806118eb5750826001600160a01b0316816001600160a01b031614155b15611975576001600160a01b03848116600090815260096020526040902080546001600160a01b03191691851691909117905561192c621275004201613299565b6001600160401b031682526040516001600160a01b0380851691908616907f6f7ccdf3f86039e5a1dcf6028bf7b4773cbf7a234716ba2e5392b12bb0f8558f90600090a3611c10565b81516001600160401b031615801590611998575081516001600160401b03164210155b6119b45760405162461bcd60e51b81526004016106369061411c565b6001600160a01b038481166000908152600860205260409020541615611b99576001600160a01b0380851660009081526008602052604080822054858201519151637f8661a160e01b815292931691637f8661a191611a15916004016144b2565b602060405180830381600087803b158015611a2f57600080fd5b505af1158015611a43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a679190613a1f565b90506000811315611ade576001600160a01b03851660009081526007602052604090208190611a9690826132c2565b50856001600160a01b03167f911c9f20a03edabcbcbd18dca1174cce47a91b234ced7a5a3c60ba0d5b56c5d282604051611ad09190613e0c565b60405180910390a250611b52565b6000811215611b52576001600160a01b03851660009081526007602052604081209082900390611b0e9082613306565b50856001600160a01b03167f8f1f26eb9b6aa8689dbdd519ead1999d9c8819d4738e403b2003b18197d9cf9782604051611b489190613e0c565b60405180910390a2505b846001600160a01b03167f39aa22060f8dd4d291720311feedf3b72fef47c06c66ccf5c22b502c62e7550a8460400151604051611b8f91906144b2565b60405180910390a2505b6001600160a01b03808516600081815260086020908152604080832080548688166001600160a01b0319918216179091558388528782018490528484526009909252808320805490921690915551928616927f03e6352a885adc4cc54767592939c3b1bbd65685658c3beaaba66a888120e2179190a35b506001600160a01b03929092166000908152600a60209081526040918290208451815492860151939095015167ffffffffffffffff199092166001600160401b039586161767ffffffffffffffff60401b1916600160401b9590931694909402919091176001600160801b03908116600160801b91909216021790915550565b6000546001600160a01b03163314611cba5760405162461bcd60e51b815260040161063690614153565b6001600160a01b038216611ce05760405162461bcd60e51b815260040161063690613f18565b6001600160a01b03821660008181526004602052604090819020805460ff1916841515179055517f31a1e0eac44b54ac6c2a2efa87e92c83405ffcf33fceef02a7bca695130e26009061113b908490613e01565b60405163d505accf60e01b81526001600160a01b0389169063d505accf90611d6c908a908a908a908a908a908a908a90600401613d0d565b600060405180830381600087803b158015611d8657600080fd5b505af1158015611d9a573d6000803e3d6000fd5b505050505050505050505050565b60056020526000908152604090205481565b6000546001600160a01b031681565b600360209081526000928352604080842090915290825290205460ff1681565b600080856001600160a01b0381163314801590611e0f57506001600160a01b0381163014155b15611e9157336000908152600260205260409020546001600160a01b031680611e4a5760405162461bcd60e51b815260040161063690614305565b6001600160a01b0380821660009081526003602090815260408083209386168352929052205460ff16611e8f5760405162461bcd60e51b815260040161063690614188565b505b6001600160a01b038616611eb75760405162461bcd60e51b8152600401610636906140ee565b60006001600160a01b03891615611ece5788611ef0565b7f00000000000000000000000000000000000000000000000000000000000000005b9050611efa613385565b506001600160a01b0381166000908152600760209081526040918290208251808401909352546001600160801b038082168452600160801b909104169082015285611f5257611f4b81886001612d64565b9550611f61565b611f5e81876000612e60565b96505b6001600160a01b038083166000908152600660209081526040808320938d1683529290522054611f919087612f87565b6001600160a01b038084166000908152600660209081526040808320938e1683529290522055611fd4611fc388612dfe565b82516001600160801b03169061313d565b6001600160801b03168152611fff611feb87612dfe565b60208301516001600160801b03169061313d565b6001600160801b0316602082018190526103e811158061202a575060208101516001600160801b0316155b6120465760405162461bcd60e51b815260040161063690613fbd565b6001600160a01b03828116600090815260076020908152604090912083518154928501516001600160801b03199093166001600160801b03918216178116600160801b91909316029190911790558a1661219a57604051632e1a7d4d60e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690632e1a7d4d906120e6908a90600401613e0c565b600060405180830381600087803b15801561210057600080fd5b505af1158015612114573d6000803e3d6000fd5b505050506000886001600160a01b03168860405161213190613bc5565b60006040518083038185875af1925050503d806000811461216e576040519150601f19603f3d011682016040523d82523d6000602084013e612173565b606091505b50509050806121945760405162461bcd60e51b81526004016106369061440f565b506121ae565b6121ae6001600160a01b03831689896131a3565b876001600160a01b0316896001600160a01b0316836001600160a01b03167fad9ab9ee6953d4d177f4a03b3a3ac3178ffcb9816319f348060194aa76b144868a8a604051610a7d929190614502565b3360008181526002602052604080822080546001600160a01b03191684179055517fdfb44ffabf0d3a8f650d3ce43eff98f6d050e7ea1a396d5794f014e7dadabacb9190a2565b6002602052600090815260409020546001600160a01b031681565b6001600160a01b0385166122855760405162461bcd60e51b8152600401610636906142ce565b81158015612291575080155b801561229e575060ff8316155b15612340576001600160a01b03861633146122cb5760405162461bcd60e51b815260040161063690613f4f565b6001600160a01b0386811660009081526002602052604090205416156123035760405162461bcd60e51b81526004016106369061422b565b6001600160a01b03851660009081526004602052604090205460ff1661233b5760405162461bcd60e51b8152600401610636906143d8565b6124fa565b6001600160a01b0386166123665760405162461bcd60e51b815260040161063690614371565b600060405180604001604052806002815260200161190160f01b81525061238b61101c565b7f1962bc9f5484cb7a998701b81090e966ee1fce5771af884cceee7c081b14ade2876123d7577fb426802f1f7dc850a7b6b38805edea2442f3992878a9ab985abfe8091d95d0b16123f9565b7f422ac5323fe049241dee67716229a1cc1bc7b313b23dfe3ef6d42ab177a3b2845b6001600160a01b038b1660009081526005602090815260409182902080546001810190915591516124339493928e928e928e929101613e15565b6040516020818303038152906040528051906020012060405160200161245b93929190613b9e565b6040516020818303038152906040528051906020012090506000600182868686604051600081526020016040526040516124989493929190613e6d565b6020604051602081039080840390855afa1580156124ba573d6000803e3d6000fd5b505050602060405103519050876001600160a01b0316816001600160a01b0316146124f75760405162461bcd60e51b815260040161063690614262565b50505b6001600160a01b038581166000818152600360209081526040808320948b168084529490915290819020805460ff1916881515179055517f5f6ebb64ba012a851c6f014e6cad458ddf213d1512049b31cd06365c2b0592579061255e908890613e01565b60405180910390a3505050505050565b606080836001600160401b038111801561258757600080fd5b506040519080825280602002602001820160405280156125b1578160200160208202803683370190505b509150836001600160401b03811180156125ca57600080fd5b506040519080825280602002602001820160405280156125fe57816020015b60608152602001906001900390816125e95790505b50905060005b848110156126f557600060603088888581811061261d57fe5b905060200281019061262f9190614550565b60405161263d929190613b72565b600060405180830381855af49150503d8060008114612678576040519150601f19603f3d011682016040523d82523d6000602084013e61267d565b606091505b5091509150818061268c575085155b61269582613325565b906126b35760405162461bcd60e51b81526004016106369190613e9f565b50818584815181106126c157fe5b602002602001019015159081151581525050808484815181106126e057fe5b60209081029190910101525050600101612604565b50935093915050565b6001600160a01b03831660009081526007602090815260408083208151808301909252546001600160801b038082168352600160801b9091041691810191909152611261908484612d64565b600a602052600090815260409020546001600160401b0380821691600160401b810490911690600160801b90046001600160801b031683565b6001546001600160a01b031681565b6000620186a06127a385603261316c565b816127aa57fe5b0490506127c16001600160a01b03861687866131a3565b6040516323e30c8b60e01b81526001600160a01b038816906323e30c8b906127f79033908990899087908a908a90600401613ca2565b600060405180830381600087803b15801561281157600080fd5b505af1158015612825573d6000803e3d6000fd5b5050505061285c61283582612dfe565b6001600160a01b0387166000908152600760205260409020906001600160801b03166132c2565b61286586612edf565b10156128835760405162461bcd60e51b8152600401610636906143a8565b856001600160a01b0316856001600160a01b0316886001600160a01b03167f3be9b85936d5d30a1655ea116a17ee3d827b2cd428cc026ce5bf2ac46a22320487856040516128d2929190614502565b60405180910390a450505050505050565b826001600160a01b038116331480159061290657506001600160a01b0381163014155b1561298857336000908152600260205260409020546001600160a01b0316806129415760405162461bcd60e51b815260040161063690614305565b6001600160a01b0380821660009081526003602090815260408083209386168352929052205460ff166129865760405162461bcd60e51b815260040161063690614188565b505b6001600160a01b0383166129ae5760405162461bcd60e51b8152600401610636906140ee565b6001600160a01b038086166000908152600660209081526040808320938816835292905220546129de9083612f87565b6001600160a01b03868116600090815260066020908152604080832089851684529091528082209390935590851681522054612a1a9083612faa565b6001600160a01b0380871660008181526006602090815260408083208986168085529252918290209490945551918716917f6eabe333476233fd382224f233210cb808a7bc4c4de64f9d76628bf63c677b1a90612a78908790613e0c565b60405180910390a45050505050565b6060856001600160401b0381118015612a9f57600080fd5b50604051908082528060200260200182016040528015612ac9578160200160208202803683370190505b5090508560005b81811015612b98576000878783818110612ae657fe5b905060200201359050620186a0612b0760328361316c90919063ffffffff16565b81612b0e57fe5b04848381518110612b1b57fe5b602002602001018181525050612b8f8c8c84818110612b3657fe5b9050602002016020810190612b4b919061345f565b898985818110612b5757fe5b905060200201358c8c86818110612b6a57fe5b9050602002016020810190612b7f919061345f565b6001600160a01b031691906131a3565b50600101612ad0565b5060405163d9d1762360e01b81526001600160a01b038c169063d9d1762390612bd39033908c908c908c908c908a908d908d90600401613bdc565b600060405180830381600087803b158015612bed57600080fd5b505af1158015612c01573d6000803e3d6000fd5b5050505060005b81811015611d9a576000898983818110612c1e57fe5b9050602002016020810190612c33919061345f565b9050612c7b612c54858481518110612c4757fe5b6020026020010151612dfe565b6001600160a01b0383166000908152600760205260409020906001600160801b03166132c2565b612c8482612edf565b1015612ca25760405162461bcd60e51b8152600401610636906143a8565b8b8b83818110612cae57fe5b9050602002016020810190612cc3919061345f565b6001600160a01b0316816001600160a01b03168e6001600160a01b03167f3be9b85936d5d30a1655ea116a17ee3d827b2cd428cc026ce5bf2ac46a2232048b8b87818110612d0d57fe5b90506020020135888781518110612d2057fe5b6020026020010151604051612d36929190614502565b60405180910390a450600101612c08565b600660209081526000928352604080842090915290825290205481565b82516000906001600160801b0316612d7d575081612df7565b835160208501516001600160801b0391821691612d9c9186911661316c565b81612da357fe5b049050818015612de757508284602001516001600160801b0316612ddd86600001516001600160801b03168461316c90919063ffffffff16565b81612de457fe5b04105b15612df757611261816001612faa565b9392505050565b60006001600160801b03821115612e275760405162461bcd60e51b815260040161063690614049565b5090565b8181016001600160801b038083169082161015612e5a5760405162461bcd60e51b815260040161063690614080565b92915050565b600083602001516001600160801b031660001415612e7f575081612df7565b602084015184516001600160801b0391821691612e9e9186911661316c565b81612ea557fe5b049050818015612de757508284600001516001600160801b0316612ddd86602001516001600160801b03168461316c90919063ffffffff16565b6001600160a01b0381166000818152600a60205260408082205490516370a0823160e01b81529192612e5a92600160801b9092046001600160801b0316916370a0823190612f31903090600401613bc8565b60206040518083038186803b158015612f4957600080fd5b505afa158015612f5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f819190613a1f565b90612faa565b80820382811115612e5a5760405162461bcd60e51b815260040161063690613eb2565b81810181811015612e5a5760405162461bcd60e51b815260040161063690614080565b60006060856001600160a01b03166323b872dd60e01b868686604051602401612ff893929190613ce9565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516130369190613b82565b6000604051808303816000865af19150503d8060008114613073576040519150601f19603f3d011682016040523d82523d6000602084013e613078565b606091505b50915091508180156130a25750805115806130a25750808060200190518101906130a29190613644565b6130be5760405162461bcd60e51b81526004016106369061433c565b505050505050565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8667fd7df266aff736d415a9dc14b4158201d612e70d75b9c7f4e375ccfd20aa5166f833060405160200161311f9493929190613e49565b6040516020818303038152906040528051906020012090505b919050565b8082036001600160801b038084169082161115612e5a5760405162461bcd60e51b815260040161063690613eb2565b60008115806131875750508082028282828161318457fe5b04145b612e5a5760405162461bcd60e51b815260040161063690614446565b60006060846001600160a01b031663a9059cbb60e01b85856040516024016131cc929190613d4e565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252905161320a9190613b82565b6000604051808303816000865af19150503d8060008114613247576040519150601f19603f3d011682016040523d82523d6000602084013e61324c565b606091505b50915091508180156132765750805115806132765750808060200190518101906132769190613644565b6132925760405162461bcd60e51b815260040161063690613f86565b5050505050565b60006001600160401b03821115612e275760405162461bcd60e51b8152600401610636906141f4565b60006132e16132d083612dfe565b84546001600160801b031690612e2b565b83546001600160801b0319166001600160801b03919091169081179093555090919050565b60006132e161331483612dfe565b84546001600160801b03169061313d565b606060448251101561336b575060408051808201909152601d81527f5472616e73616374696f6e2072657665727465642073696c656e746c790000006020820152613138565b60048201915081806020019051810190612e5a9190613a37565b604080518082019091526000808252602082015290565b604080516060810182526000808252602082018190529181019190915290565b60008083601f8401126133cd578182fd5b5081356001600160401b038111156133e3578182fd5b60208301915083602080830285010111156133fd57600080fd5b9250929050565b60008083601f840112613415578182fd5b5081356001600160401b0381111561342b578182fd5b6020830191508360208285010111156133fd57600080fd5b8035612e5a816145d0565b803560ff81168114612e5a57600080fd5b600060208284031215613470578081fd5b8135612df7816145d0565b6000806040838503121561348d578081fd5b8235613498816145d0565b915060208301356134a8816145d0565b809150509250929050565b60008060008060008060c087890312156134cb578182fd5b86356134d6816145d0565b955060208701356134e6816145d0565b945060408701356134f6816145e8565b9350613505886060890161344e565b92506080870135915060a087013590509295509295509295565b60008060408385031215613531578182fd5b823561353c816145d0565b915060208301356134a8816145e8565b600080600060608486031215613560578283fd5b833561356b816145d0565b9250602084013561357b816145e8565b9150604084013561358b816145e8565b809150509250925092565b600080600080606085870312156135ab578384fd5b84356135b6816145d0565b935060208501356001600160401b038111156135d0578384fd5b6135dc87828801613404565b90945092505060408501356135f0816145e8565b939692955090935050565b60008060006040848603121561360f578081fd5b83356001600160401b03811115613624578182fd5b613630868287016133bc565b909450925050602084013561358b816145e8565b600060208284031215613655578081fd5b8151612df7816145e8565b600080600080600080600080600060a08a8c03121561367d578687fd5b8935613688816145d0565b985060208a01356001600160401b03808211156136a3578889fd5b6136af8d838e016133bc565b909a50985060408c01359150808211156136c7578485fd5b6136d38d838e016133bc565b909850965060608c01359150808211156136eb578485fd5b6136f78d838e016133bc565b909650945060808c013591508082111561370f578384fd5b5061371c8c828d01613404565b915080935050809150509295985092959850929598565b6000806040838503121561348d578182fd5b6000806000806080858703121561375a578182fd5b8435613765816145d0565b93506020850135613775816145d0565b92506040850135613785816145d0565b9396929550929360600135925050565b600080600080600060a086880312156137ac578283fd5b85356137b7816145d0565b945060208601356137c7816145d0565b935060408601356137d7816145d0565b94979396509394606081013594506080013592915050565b600080600080600080600080610100898b03121561380b578182fd5b8835613816816145d0565b97506020890135613826816145d0565b96506040890135613836816145d0565b955060608901359450608089013593506138538a60a08b0161344e565b925060c0890135915060e089013590509295985092959890939650565b60008060008060008060808789031215613888578384fd5b8635613893816145d0565b955060208701356138a3816145d0565b945060408701356001600160401b03808211156138be578586fd5b6138ca8a838b016133bc565b909650945060608901359150808211156138e2578384fd5b506138ef89828a016133bc565b979a9699509497509295939492505050565b600080600060608486031215613915578081fd5b8335613920816145d0565b92506020840135613930816145e8565b929592945050506040919091013590565b600080600060608486031215613955578081fd5b8335613960816145d0565b925060208401359150604084013561358b816145e8565b60008060408385031215613989578182fd5b8235613994816145d0565b915060208301356001600160401b03811681146134a8578182fd5b60008060008060008060a087890312156139c7578384fd5b86356139d2816145d0565b955060208701356139e2816145d0565b945060408701356139f2816145d0565b93506060870135925060808701356001600160401b03811115613a13578283fd5b6138ef89828a01613404565b600060208284031215613a30578081fd5b5051919050565b600060208284031215613a48578081fd5b81516001600160401b0380821115613a5e578283fd5b818401915084601f830112613a71578283fd5b815181811115613a7f578384fd5b604051601f8201601f191681016020018381118282101715613a9f578586fd5b604052818152838201602001871015613ab6578485fd5b613ac78260208301602087016145a0565b9695505050505050565b6001600160a01b0316815260200190565b6000815180845260208085019450808401835b83811015613b1157815187529582019590820190600101613af5565b509495945050505050565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b60008151808452613b5e8160208601602086016145a0565b601f01601f19169290920160200192915050565b6000828483379101908152919050565b60008251613b948184602087016145a0565b9190910192915050565b60008451613bb08184602089016145a0565b91909101928352506020820152604001919050565b90565b6001600160a01b0391909116815260200190565b6001600160a01b038916815260a0602080830182905260009183019081613c038b82613e0c565b90508b9250835b8b811015613c3557828401613c2883613c238388613443565b613ad1565b9094509150600101613c0a565b508481036040860152613c488982613e0c565b9250506001600160fb1b03881115613c5e578283fd5b8702613c6b81838b614594565b018281036060840152613c7e8187613ae2565b90508281036080840152613c93818587613b1c565b9b9a5050505050505050505050565b6001600160a01b03878116825286166020820152604081018590526060810184905260a060808201819052600090613cdd9083018486613b1c565b98975050505050505050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b6001600160a01b03929092168252602082015260400190565b604080825283519082018190526000906020906060840190828701845b82811015613da2578151151584529284019290840190600101613d84565b50505083810382850152808551613db98184613e0c565b91508192508381028201848801865b83811015613df2578583038552613de0838351613b46565b94870194925090860190600101613dc8565b50909998505050505050505050565b901515815260200190565b90815260200190565b95865260208601949094526001600160a01b039283166040860152911660608401521515608083015260a082015260c00190565b938452602084019290925260408301526001600160a01b0316606082015260800190565b93845260ff9290921660208401526040830152606082015260800190565b600060208252611261602083018486613b1c565b600060208252612df76020830184613b46565b602080825260159082015274426f72696e674d6174683a20556e646572666c6f7760581b604082015260600190565b60208082526017908201527f42656e746f426f783a20536b696d20746f6f206d756368000000000000000000604082015260600190565b6020808252601c908201527f4d6173746572434d67723a2043616e6e6f7420617070726f7665203000000000604082015260600190565b6020808252601b908201527f4d6173746572434d67723a2075736572206e6f742073656e6465720000000000604082015260600190565b6020808252601c908201527f426f72696e6745524332303a205472616e73666572206661696c656400000000604082015260600190565b60208082526016908201527542656e746f426f783a2063616e6e6f7420656d70747960501b604082015260600190565b6020808252601590820152744f776e61626c653a207a65726f206164647265737360581b604082015260600190565b60208082526013908201527242656e746f426f783a204e6f20746f6b656e7360681b604082015260600190565b6020808252601c908201527f426f72696e674d6174683a2075696e74313238204f766572666c6f7700000000604082015260600190565b60208082526018908201527f426f72696e674d6174683a20416464204f766572666c6f770000000000000000604082015260600190565b60208082526017908201527f42656e746f426f783a20746f5b305d206e6f7420736574000000000000000000604082015260600190565b60208082526014908201527310995b9d1bd09bde0e881d1bc81b9bdd081cd95d60621b604082015260600190565b6020808252601a908201527f53747261746567794d616e616765723a20546f6f206561726c79000000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601f908201527f42656e746f426f783a205472616e73666572206e6f7420617070726f76656400604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c657220213d2070656e64696e67206f776e6572604082015260600190565b6020808252601b908201527f426f72696e674d6174683a2075696e743634204f766572666c6f770000000000604082015260600190565b60208082526019908201527f4d6173746572434d67723a207573657220697320636c6f6e6500000000000000604082015260600190565b6020808252601d908201527f4d6173746572434d67723a20496e76616c6964205369676e6174757265000000604082015260600190565b6020808252818101527f426f72696e67466163746f72793a204e6f206d6173746572436f6e7472616374604082015260600190565b6020808252601b908201527f4d6173746572434d67723a206d617374657243206e6f74207365740000000000604082015260600190565b6020808252601b908201527f42656e746f426f783a206e6f206d6173746572436f6e74726163740000000000604082015260600190565b6020808252818101527f426f72696e6745524332303a205472616e7366657246726f6d206661696c6564604082015260600190565b6020808252601c908201527f4d6173746572434d67723a20557365722063616e6e6f74206265203000000000604082015260600190565b60208082526016908201527510995b9d1bd09bde0e8815dc9bdb99c8185b5bdd5b9d60521b604082015260600190565b6020808252601b908201527f4d6173746572434d67723a206e6f742077686974656c69737465640000000000604082015260600190565b6020808252601d908201527f42656e746f426f783a20455448207472616e73666572206661696c6564000000604082015260600190565b60208082526018908201527f426f72696e674d6174683a204d756c204f766572666c6f770000000000000000604082015260600190565b6020808252818101527f53747261746567794d616e616765723a2054617267657420746f6f2068696768604082015260600190565b6001600160801b0391909116815260200190565b6001600160801b039290921682526001600160a01b0316602082015260400190565b6001600160801b0392831681529116602082015260400190565b918252602082015260400190565b6001600160401b0391909116815260200190565b6001600160401b0393841681529190921660208201526001600160801b03909116604082015260600190565b6000808335601e19843603018112614566578283fd5b8301803591506001600160401b0382111561457f578283fd5b6020019150368190038213156133fd57600080fd5b82818337506000910152565b60005b838110156145bb5781810151838201526020016145a3565b838111156145ca576000848401525b50505050565b6001600160a01b03811681146145e557600080fd5b50565b80151581146145e557600080fdfea2646970667358221220bbde77aaf581519850551eee78bc6315b2e7d060c6c0b1c48cf15341ed60f7ed64736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x1DC JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x7C516E94 GT PUSH2 0x102 JUMPI DUP1 PUSH4 0xD2423B51 GT PUSH2 0x95 JUMPI DUP1 PUSH4 0xF1676D37 GT PUSH2 0x64 JUMPI DUP1 PUSH4 0xF1676D37 EQ PUSH2 0x555 JUMPI DUP1 PUSH4 0xF18D03CC EQ PUSH2 0x575 JUMPI DUP1 PUSH4 0xF483B3DA EQ PUSH2 0x595 JUMPI DUP1 PUSH4 0xF7888AEC EQ PUSH2 0x5B5 JUMPI PUSH2 0x1E3 JUMP JUMPDEST DUP1 PUSH4 0xD2423B51 EQ PUSH2 0x4D0 JUMPI DUP1 PUSH4 0xDA5139CA EQ PUSH2 0x4F1 JUMPI DUP1 PUSH4 0xDF23B45B EQ PUSH2 0x511 JUMPI DUP1 PUSH4 0xE30C3978 EQ PUSH2 0x540 JUMPI PUSH2 0x1E3 JUMP JUMPDEST DUP1 PUSH4 0x97DA6D30 GT PUSH2 0xD1 JUMPI DUP1 PUSH4 0x97DA6D30 EQ PUSH2 0x45B JUMPI DUP1 PUSH4 0xAEE4D1B2 EQ PUSH2 0x47B JUMPI DUP1 PUSH4 0xBAFE4F14 EQ PUSH2 0x490 JUMPI DUP1 PUSH4 0xC0A47C93 EQ PUSH2 0x4B0 JUMPI PUSH2 0x1E3 JUMP JUMPDEST DUP1 PUSH4 0x7C516E94 EQ PUSH2 0x3E6 JUMPI DUP1 PUSH4 0x7ECEBE00 EQ PUSH2 0x406 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x426 JUMPI DUP1 PUSH4 0x91E0EAB5 EQ PUSH2 0x43B JUMPI PUSH2 0x1E3 JUMP JUMPDEST DUP1 PUSH4 0x3E2A9D4E GT PUSH2 0x17A JUMPI DUP1 PUSH4 0x56623118 GT PUSH2 0x149 JUMPI DUP1 PUSH4 0x56623118 EQ PUSH2 0x366 JUMPI DUP1 PUSH4 0x66C6BB0B EQ PUSH2 0x386 JUMPI DUP1 PUSH4 0x72CB5D97 EQ PUSH2 0x3A6 JUMPI DUP1 PUSH4 0x733A9D7C EQ PUSH2 0x3C6 JUMPI PUSH2 0x1E3 JUMP JUMPDEST DUP1 PUSH4 0x3E2A9D4E EQ PUSH2 0x2E3 JUMPI DUP1 PUSH4 0x4E71E0C8 EQ PUSH2 0x303 JUMPI DUP1 PUSH4 0x4FFE34DB EQ PUSH2 0x318 JUMPI DUP1 PUSH4 0x5108A558 EQ PUSH2 0x346 JUMPI PUSH2 0x1E3 JUMP JUMPDEST DUP1 PUSH4 0x12A90C8A GT PUSH2 0x1B6 JUMPI DUP1 PUSH4 0x12A90C8A EQ PUSH2 0x254 JUMPI DUP1 PUSH4 0x1F54245B EQ PUSH2 0x281 JUMPI DUP1 PUSH4 0x228BFD9F EQ PUSH2 0x2A1 JUMPI DUP1 PUSH4 0x3644E515 EQ PUSH2 0x2C1 JUMPI PUSH2 0x1E3 JUMP JUMPDEST DUP1 PUSH4 0x2B9446C EQ PUSH2 0x1E8 JUMPI DUP1 PUSH4 0x78DFBE7 EQ PUSH2 0x212 JUMPI DUP1 PUSH4 0xFCA8843 EQ PUSH2 0x234 JUMPI PUSH2 0x1E3 JUMP JUMPDEST CALLDATASIZE PUSH2 0x1E3 JUMPI STOP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1FB PUSH2 0x1F6 CALLDATASIZE PUSH1 0x4 PUSH2 0x3795 JUMP JUMPDEST PUSH2 0x5D5 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x209 SWAP3 SWAP2 SWAP1 PUSH2 0x4502 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x21E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x232 PUSH2 0x22D CALLDATASIZE PUSH1 0x4 PUSH2 0x354C JUMP JUMPDEST PUSH2 0xA99 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x240 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x232 PUSH2 0x24F CALLDATASIZE PUSH1 0x4 PUSH2 0x3870 JUMP JUMPDEST PUSH2 0xB7F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x260 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x274 PUSH2 0x26F CALLDATASIZE PUSH1 0x4 PUSH2 0x345F JUMP JUMPDEST PUSH2 0xE30 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x209 SWAP2 SWAP1 PUSH2 0x3E01 JUMP JUMPDEST PUSH2 0x294 PUSH2 0x28F CALLDATASIZE PUSH1 0x4 PUSH2 0x3596 JUMP JUMPDEST PUSH2 0xE45 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x209 SWAP2 SWAP1 PUSH2 0x3BC8 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2AD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x294 PUSH2 0x2BC CALLDATASIZE PUSH1 0x4 PUSH2 0x345F JUMP JUMPDEST PUSH2 0x1001 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2CD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2D6 PUSH2 0x101C JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x209 SWAP2 SWAP1 PUSH2 0x3E0C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2EF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x232 PUSH2 0x2FE CALLDATASIZE PUSH1 0x4 PUSH2 0x3977 JUMP JUMPDEST PUSH2 0x107C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x30F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x232 PUSH2 0x1147 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x324 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x338 PUSH2 0x333 CALLDATASIZE PUSH1 0x4 PUSH2 0x345F JUMP JUMPDEST PUSH2 0x11D4 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x209 SWAP3 SWAP2 SWAP1 PUSH2 0x44E8 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x352 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x294 PUSH2 0x361 CALLDATASIZE PUSH1 0x4 PUSH2 0x345F JUMP JUMPDEST PUSH2 0x11FA JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x372 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2D6 PUSH2 0x381 CALLDATASIZE PUSH1 0x4 PUSH2 0x3941 JUMP JUMPDEST PUSH2 0x1215 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x392 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x232 PUSH2 0x3A1 CALLDATASIZE PUSH1 0x4 PUSH2 0x3901 JUMP JUMPDEST PUSH2 0x1269 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3B2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x232 PUSH2 0x3C1 CALLDATASIZE PUSH1 0x4 PUSH2 0x3733 JUMP JUMPDEST PUSH2 0x1832 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3D2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x232 PUSH2 0x3E1 CALLDATASIZE PUSH1 0x4 PUSH2 0x351F JUMP JUMPDEST PUSH2 0x1C90 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3F2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x232 PUSH2 0x401 CALLDATASIZE PUSH1 0x4 PUSH2 0x37EF JUMP JUMPDEST PUSH2 0x1D34 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x412 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2D6 PUSH2 0x421 CALLDATASIZE PUSH1 0x4 PUSH2 0x345F JUMP JUMPDEST PUSH2 0x1DA8 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x432 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x294 PUSH2 0x1DBA JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x447 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x274 PUSH2 0x456 CALLDATASIZE PUSH1 0x4 PUSH2 0x347B JUMP JUMPDEST PUSH2 0x1DC9 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x467 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1FB PUSH2 0x476 CALLDATASIZE PUSH1 0x4 PUSH2 0x3795 JUMP JUMPDEST PUSH2 0x1DE9 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x487 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x232 PUSH2 0x21FD JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x49C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x294 PUSH2 0x4AB CALLDATASIZE PUSH1 0x4 PUSH2 0x345F JUMP JUMPDEST PUSH2 0x2244 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4BC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x232 PUSH2 0x4CB CALLDATASIZE PUSH1 0x4 PUSH2 0x34B3 JUMP JUMPDEST PUSH2 0x225F JUMP JUMPDEST PUSH2 0x4E3 PUSH2 0x4DE CALLDATASIZE PUSH1 0x4 PUSH2 0x35FB JUMP JUMPDEST PUSH2 0x256E JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x209 SWAP3 SWAP2 SWAP1 PUSH2 0x3D67 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4FD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2D6 PUSH2 0x50C CALLDATASIZE PUSH1 0x4 PUSH2 0x3941 JUMP JUMPDEST PUSH2 0x26FE JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x51D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x531 PUSH2 0x52C CALLDATASIZE PUSH1 0x4 PUSH2 0x345F JUMP JUMPDEST PUSH2 0x274A JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x209 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x4524 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x54C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x294 PUSH2 0x2783 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x561 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x232 PUSH2 0x570 CALLDATASIZE PUSH1 0x4 PUSH2 0x39AF JUMP JUMPDEST PUSH2 0x2792 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x581 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x232 PUSH2 0x590 CALLDATASIZE PUSH1 0x4 PUSH2 0x3745 JUMP JUMPDEST PUSH2 0x28E3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5A1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x232 PUSH2 0x5B0 CALLDATASIZE PUSH1 0x4 PUSH2 0x3660 JUMP JUMPDEST PUSH2 0x2A87 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5C1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2D6 PUSH2 0x5D0 CALLDATASIZE PUSH1 0x4 PUSH2 0x3733 JUMP JUMPDEST PUSH2 0x2D47 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND CALLER EQ DUP1 ISZERO SWAP1 PUSH2 0x5FB JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ADDRESS EQ ISZERO JUMPDEST ISZERO PUSH2 0x686 JUMPI CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP1 PUSH2 0x63F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x4305 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP7 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD PUSH1 0xFF AND PUSH2 0x684 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x4188 JUMP JUMPDEST POP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND PUSH2 0x6AC JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x40EE JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP10 AND ISZERO PUSH2 0x6C3 JUMPI DUP9 PUSH2 0x6E5 JUMP JUMPDEST PUSH32 0x0 JUMPDEST SWAP1 POP PUSH2 0x6EF PUSH2 0x3385 JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP3 AND DUP1 DUP6 MSTORE PUSH1 0x1 PUSH1 0x80 SHL SWAP1 SWAP3 DIV AND SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE ISZERO ISZERO DUP1 PUSH2 0x7B0 JUMPI POP PUSH1 0x0 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x18160DDD PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x776 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x78A 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 DUP2 ADD SWAP1 PUSH2 0x7AE SWAP2 SWAP1 PUSH2 0x3A1F JUMP JUMPDEST GT JUMPDEST PUSH2 0x7CC JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x401C JUMP JUMPDEST DUP6 PUSH2 0x824 JUMPI PUSH2 0x7DD DUP2 DUP9 PUSH1 0x0 PUSH2 0x2D64 JUMP JUMPDEST SWAP6 POP PUSH2 0x3E8 PUSH2 0x802 PUSH2 0x7EE DUP9 PUSH2 0x2DFE JUMP JUMPDEST PUSH1 0x20 DUP5 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND SWAP1 PUSH2 0x2E2B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND LT ISZERO PUSH2 0x81F JUMPI PUSH1 0x0 DUP1 SWAP5 POP SWAP5 POP POP POP PUSH2 0xA8E JUMP JUMPDEST PUSH2 0x833 JUMP JUMPDEST PUSH2 0x830 DUP2 DUP8 PUSH1 0x1 PUSH2 0x2E60 JUMP JUMPDEST SWAP7 POP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP10 AND ADDRESS EQ ISZERO DUP1 PUSH2 0x852 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP11 AND ISZERO JUMPDEST DUP1 PUSH2 0x87A JUMPI POP DUP1 MLOAD PUSH2 0x876 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x870 DUP5 PUSH2 0x2EDF JUMP JUMPDEST SWAP1 PUSH2 0x2F87 JUMP JUMPDEST DUP8 GT ISZERO JUMPDEST PUSH2 0x896 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x3EE1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP13 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD PUSH2 0x8C6 SWAP1 DUP8 PUSH2 0x2FAA JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP14 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SSTORE PUSH2 0x90C PUSH2 0x8F8 DUP8 PUSH2 0x2DFE JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND SWAP1 PUSH2 0x2E2B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x937 PUSH2 0x926 DUP9 PUSH2 0x2DFE JUMP JUMPDEST DUP3 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND SWAP1 PUSH2 0x2E2B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP1 DUP2 AND DUP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 SWAP2 KECCAK256 DUP5 MLOAD DUP2 SLOAD SWAP3 DUP7 ADD MLOAD DUP6 AND PUSH1 0x1 PUSH1 0x80 SHL MUL SWAP1 DUP6 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB NOT SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP4 AND OR SWAP1 SWAP2 SSTORE DUP11 AND PUSH2 0xA09 JUMPI PUSH32 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xD0E30DB0 DUP9 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 0x9EB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x9FF JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP PUSH2 0xA2E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP10 AND ADDRESS EQ PUSH2 0xA2E JUMPI PUSH2 0xA2E PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND DUP11 ADDRESS DUP11 PUSH2 0x2FCD JUMP JUMPDEST DUP8 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP10 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xB2346165E782564F17F5B7E555C21F4FD96FBC93458572BF0113EA35A958FC55 DUP11 DUP11 PUSH1 0x40 MLOAD PUSH2 0xA7D SWAP3 SWAP2 SWAP1 PUSH2 0x4502 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 DUP7 SWAP5 POP DUP6 SWAP4 POP POP POP JUMPDEST POP SWAP6 POP SWAP6 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0xAC3 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x4153 JUMP JUMPDEST DUP2 ISZERO PUSH2 0xB5E JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND ISZERO ISZERO DUP1 PUSH2 0xADD JUMPI POP DUP1 JUMPDEST PUSH2 0xAF9 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x3FED JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP8 AND SWAP4 SWAP3 AND SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 LOG3 PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP2 DUP3 AND OR SWAP1 SWAP2 SSTORE PUSH1 0x1 DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SSTORE PUSH2 0xB7A JUMP JUMPDEST PUSH1 0x1 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND OR SWAP1 SSTORE JUMPDEST POP POP POP JUMP JUMPDEST DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND CALLER EQ DUP1 ISZERO SWAP1 PUSH2 0xBA2 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ADDRESS EQ ISZERO JUMPDEST ISZERO PUSH2 0xC24 JUMPI CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP1 PUSH2 0xBDD JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x4305 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP7 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD PUSH1 0xFF AND PUSH2 0xC22 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x4188 JUMP JUMPDEST POP JUMPDEST PUSH1 0x0 DUP6 DUP6 DUP3 DUP2 PUSH2 0xC30 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0xC45 SWAP2 SWAP1 PUSH2 0x345F JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO PUSH2 0xC6C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x40B7 JUMP JUMPDEST PUSH1 0x0 DUP5 DUP2 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xDC8 JUMPI PUSH1 0x0 DUP9 DUP9 DUP4 DUP2 DUP2 LT PUSH2 0xC87 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0xC9C SWAP2 SWAP1 PUSH2 0x345F JUMP JUMPDEST SWAP1 POP PUSH2 0xD0B DUP8 DUP8 DUP5 DUP2 DUP2 LT PUSH2 0xCAD JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD PUSH1 0x6 PUSH1 0x0 DUP15 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD PUSH2 0x2FAA SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP14 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP7 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SSTORE PUSH2 0xD56 DUP8 DUP8 DUP5 DUP2 DUP2 LT PUSH2 0xD40 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD DUP6 PUSH2 0x2FAA SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP4 POP DUP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP11 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP13 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x6EABE333476233FD382224F233210CB808A7BC4C4DE64F9D76628BF63C677B1A DUP11 DUP11 DUP8 DUP2 DUP2 LT PUSH2 0xDA3 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD PUSH1 0x40 MLOAD PUSH2 0xDB7 SWAP2 SWAP1 PUSH2 0x3E0C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP PUSH1 0x1 ADD PUSH2 0xC71 JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP11 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP13 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD PUSH2 0xDF9 SWAP1 DUP4 PUSH2 0x2F87 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP10 DUP11 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP12 SWAP1 SWAP13 AND DUP3 MSTORE SWAP10 SWAP1 SWAP10 MSTORE SWAP9 SWAP1 SWAP8 KECCAK256 SWAP8 SWAP1 SWAP8 SSTORE POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x4 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH2 0xE6D JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x4299 JUMP JUMPDEST PUSH1 0x60 DUP6 SWAP1 SHL DUP3 ISZERO PUSH2 0xEDF JUMPI PUSH1 0x0 DUP6 DUP6 PUSH1 0x40 MLOAD PUSH2 0xE8A SWAP3 SWAP2 SWAP1 PUSH2 0x3B72 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 SWAP1 POP PUSH1 0x40 MLOAD PUSH20 0x3D602D80600A3D3981F3363D3D373D3D3D363D73 PUSH1 0x60 SHL DUP2 MSTORE DUP3 PUSH1 0x14 DUP3 ADD MSTORE PUSH15 0x5AF43D82803E903D91602B57FD5BF3 PUSH1 0x88 SHL PUSH1 0x28 DUP3 ADD MSTORE DUP2 PUSH1 0x37 DUP3 PUSH1 0x0 CREATE2 SWAP4 POP POP POP PUSH2 0xF24 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0x3D602D80600A3D3981F3363D3D373D3D3D363D73 PUSH1 0x60 SHL DUP2 MSTORE DUP2 PUSH1 0x14 DUP3 ADD MSTORE PUSH15 0x5AF43D82803E903D91602B57FD5BF3 PUSH1 0x88 SHL PUSH1 0x28 DUP3 ADD MSTORE PUSH1 0x37 DUP2 PUSH1 0x0 CREATE SWAP3 POP POP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP4 DUP11 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 SSTORE SWAP1 MLOAD PUSH4 0x1377D1F5 PUSH1 0xE2 SHL DUP2 MSTORE PUSH4 0x4DDF47D4 SWAP1 CALLVALUE SWAP1 PUSH2 0xF79 SWAP1 DUP10 SWAP1 DUP10 SWAP1 PUSH1 0x4 ADD PUSH2 0x3E8B JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xF92 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xFA6 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xD62166F3C2149208E51788B1401CC356BF5DA1FC6C7886A32E18570F57D88B3B DUP8 DUP8 PUSH1 0x40 MLOAD PUSH2 0xFF0 SWAP3 SWAP2 SWAP1 PUSH2 0x3E8B JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x8 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x0 CHAINID PUSH32 0x0 DUP2 EQ PUSH2 0x1054 JUMPI PUSH2 0x104F DUP2 PUSH2 0x30C6 JUMP JUMPDEST PUSH2 0x1076 JUMP JUMPDEST PUSH32 0x0 JUMPDEST SWAP2 POP POP SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0x10A6 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x4153 JUMP JUMPDEST PUSH1 0x5F DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND GT ISZERO PUSH2 0x10D0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x447D JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0xA PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH8 0xFFFFFFFFFFFFFFFF PUSH1 0x40 SHL NOT AND PUSH1 0x1 PUSH1 0x40 SHL PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP7 AND MUL OR SWAP1 SSTORE MLOAD PUSH32 0x7543AF99B5602C06E62DA0631B5308489A5FF859150105A623B6EB15E8DEAE0B SWAP1 PUSH2 0x113B SWAP1 DUP5 SWAP1 PUSH2 0x4510 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER DUP2 EQ PUSH2 0x1172 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x41BF JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND SWAP4 SWAP3 AND SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 LOG3 PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP3 DUP4 AND OR SWAP1 SSTORE PUSH1 0x1 DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP3 AND SWAP2 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 DIV AND DUP3 JUMP JUMPDEST PUSH1 0x9 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP2 MLOAD DUP1 DUP4 ADD SWAP1 SWAP3 MSTORE SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP3 AND DUP4 MSTORE PUSH1 0x1 PUSH1 0x80 SHL SWAP1 SWAP2 DIV AND SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH2 0x1261 SWAP1 DUP5 DUP5 PUSH2 0x2E60 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x1271 PUSH2 0x339C JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0xA PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP2 MLOAD PUSH1 0x60 DUP2 ADD DUP4 MSTORE SWAP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 AND DUP4 MSTORE PUSH1 0x1 PUSH1 0x40 SHL DUP3 DIV AND DUP3 DUP6 ADD MSTORE PUSH1 0x1 PUSH1 0x80 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP2 DUP4 ADD SWAP1 DUP2 MSTORE SWAP5 DUP5 MSTORE PUSH1 0x8 SWAP1 SWAP3 MSTORE DUP1 DUP4 KECCAK256 SLOAD SWAP4 MLOAD SWAP1 MLOAD PUSH4 0xC7E663B PUSH1 0xE1 SHL DUP2 MSTORE SWAP2 SWAP5 SWAP4 SWAP1 SWAP4 AND SWAP3 DUP4 SWAP2 PUSH4 0x18FCCC76 SWAP2 PUSH2 0x12FE SWAP2 CALLER SWAP1 PUSH1 0x4 ADD PUSH2 0x44C6 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1318 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x132C 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 DUP2 ADD SWAP1 PUSH2 0x1350 SWAP2 SWAP1 PUSH2 0x3A1F JUMP JUMPDEST SWAP1 POP DUP1 ISZERO DUP1 ISZERO PUSH2 0x135E JUMPI POP DUP5 ISZERO JUMPDEST ISZERO PUSH2 0x136B JUMPI POP POP POP PUSH2 0xB7A JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND SWAP1 DUP3 SGT ISZERO PUSH2 0x1421 JUMPI DUP2 PUSH2 0x13A0 DUP3 DUP3 PUSH2 0x2FAA JUMP JUMPDEST SWAP2 POP PUSH2 0x13AB DUP3 PUSH2 0x2DFE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP10 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP5 SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 SSTORE SWAP1 MLOAD PUSH32 0x911C9F20A03EDABCBCBD18DCA1174CCE47A91B234CED7A5A3C60BA0D5B56C5D2 SWAP1 PUSH2 0x1413 SWAP1 DUP5 SWAP1 PUSH2 0x3E0C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP PUSH2 0x14EF JUMP JUMPDEST PUSH1 0x0 DUP3 SLT ISZERO PUSH2 0x14EF JUMPI PUSH1 0x0 DUP3 SWAP1 SUB PUSH2 0x1439 DUP3 DUP3 PUSH2 0x2F87 JUMP JUMPDEST SWAP2 POP PUSH2 0x1444 DUP3 PUSH2 0x2DFE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP10 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH2 0x149A PUSH2 0x1486 DUP3 PUSH2 0x2DFE JUMP JUMPDEST PUSH1 0x40 DUP8 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND SWAP1 PUSH2 0x313D JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH1 0x40 DUP1 DUP8 ADD SWAP2 SWAP1 SWAP2 MSTORE MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP10 AND SWAP1 PUSH32 0x8F1F26EB9B6AA8689DBDD519EAD1999D9C8819D4738E403B2003B18197D9CF97 SWAP1 PUSH2 0x14E5 SWAP1 DUP5 SWAP1 PUSH2 0x3E0C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP JUMPDEST DUP6 ISZERO PUSH2 0x17AE JUMPI PUSH1 0x0 PUSH1 0x64 PUSH2 0x1519 DUP7 PUSH1 0x20 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND DUP5 PUSH2 0x316C SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP2 PUSH2 0x1520 JUMPI INVALID JUMPDEST DIV SWAP1 POP DUP1 DUP6 PUSH1 0x40 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND LT ISZERO PUSH2 0x165B JUMPI PUSH1 0x0 PUSH2 0x155A DUP7 PUSH1 0x40 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP4 PUSH2 0x2F87 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP1 POP DUP7 ISZERO DUP1 ISZERO SWAP1 PUSH2 0x156A JUMPI POP DUP7 DUP2 GT JUMPDEST ISZERO PUSH2 0x1572 JUMPI POP DUP6 JUMPDEST PUSH2 0x1586 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP11 AND DUP7 DUP4 PUSH2 0x31A3 JUMP JUMPDEST PUSH2 0x15A6 PUSH2 0x1592 DUP3 PUSH2 0x2DFE JUMP JUMPDEST PUSH1 0x40 DUP9 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND SWAP1 PUSH2 0x2E2B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH1 0x40 DUP1 DUP9 ADD SWAP2 SWAP1 SWAP2 MSTORE MLOAD PUSH4 0x6939AAF5 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND SWAP1 PUSH4 0x6939AAF5 SWAP1 PUSH2 0x15E2 SWAP1 DUP5 SWAP1 PUSH1 0x4 ADD PUSH2 0x3E0C JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x15FC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1610 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP DUP9 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xB18E7E4F6EAC147A63A3BB6BEB2D9039C88698623AFF3EFC4FEBBC20B0164EE5 DUP3 PUSH1 0x40 MLOAD PUSH2 0x164D SWAP2 SWAP1 PUSH2 0x3E0C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP PUSH2 0x17AC JUMP JUMPDEST DUP1 DUP6 PUSH1 0x40 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND GT ISZERO PUSH2 0x17AC JUMPI PUSH1 0x0 PUSH2 0x1692 PUSH2 0x167E DUP4 PUSH2 0x2DFE JUMP JUMPDEST PUSH1 0x40 DUP9 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND SWAP1 PUSH2 0x313D JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND SWAP1 POP DUP7 ISZERO DUP1 ISZERO SWAP1 PUSH2 0x16AB JUMPI POP DUP7 DUP2 GT JUMPDEST ISZERO PUSH2 0x16B3 JUMPI POP DUP6 JUMPDEST PUSH1 0x40 MLOAD PUSH4 0x2E1A7D4D PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x0 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND SWAP1 PUSH4 0x2E1A7D4D SWAP1 PUSH2 0x16E2 SWAP1 DUP6 SWAP1 PUSH1 0x4 ADD PUSH2 0x3E0C JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x16FC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1710 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 DUP2 ADD SWAP1 PUSH2 0x1734 SWAP2 SWAP1 PUSH2 0x3A1F JUMP JUMPDEST SWAP1 POP PUSH2 0x1756 PUSH2 0x1742 DUP3 PUSH2 0x2DFE JUMP JUMPDEST PUSH1 0x40 DUP10 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND SWAP1 PUSH2 0x313D JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH1 0x40 DUP1 DUP10 ADD SWAP2 SWAP1 SWAP2 MSTORE MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP12 AND SWAP1 PUSH32 0x39AA22060F8DD4D291720311FEEDF3B72FEF47C06C66CCF5C22B502C62E7550A SWAP1 PUSH2 0x17A1 SWAP1 DUP5 SWAP1 PUSH2 0x3E0C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP JUMPDEST POP JUMPDEST POP POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xA PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP4 MLOAD DUP2 SLOAD SWAP3 DUP6 ADD MLOAD SWAP4 SWAP1 SWAP5 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP1 DUP2 AND PUSH1 0x1 PUSH1 0x80 SHL MUL PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB SWAP5 DUP6 AND PUSH1 0x1 PUSH1 0x40 SHL MUL PUSH8 0xFFFFFFFFFFFFFFFF PUSH1 0x40 SHL NOT SWAP6 SWAP1 SWAP7 AND PUSH8 0xFFFFFFFFFFFFFFFF NOT SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP4 SWAP1 SWAP4 AND SWAP4 SWAP1 SWAP4 OR SWAP2 SWAP1 SWAP2 AND OR SWAP1 SSTORE POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0x185C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x4153 JUMP JUMPDEST PUSH2 0x1864 PUSH2 0x339C JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0xA PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP2 MLOAD PUSH1 0x60 DUP2 ADD DUP4 MSTORE SWAP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 AND DUP4 MSTORE PUSH1 0x1 PUSH1 0x40 SHL DUP3 DIV DUP2 AND DUP4 DUP7 ADD MSTORE PUSH1 0x1 PUSH1 0x80 SHL SWAP1 SWAP2 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP3 DUP5 ADD MSTORE SWAP5 DUP5 MSTORE PUSH1 0x9 SWAP1 SWAP3 MSTORE SWAP1 SWAP2 KECCAK256 SLOAD DUP2 MLOAD SWAP2 SWAP4 AND SWAP2 AND ISZERO DUP1 PUSH2 0x18EB JUMPI POP DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO JUMPDEST ISZERO PUSH2 0x1975 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP2 DUP6 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH2 0x192C PUSH3 0x127500 TIMESTAMP ADD PUSH2 0x3299 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND DUP3 MSTORE PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND SWAP2 SWAP1 DUP7 AND SWAP1 PUSH32 0x6F7CCDF3F86039E5A1DCF6028BF7B4773CBF7A234716BA2E5392B12BB0F8558F SWAP1 PUSH1 0x0 SWAP1 LOG3 PUSH2 0x1C10 JUMP JUMPDEST DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x1998 JUMPI POP DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND TIMESTAMP LT ISZERO JUMPDEST PUSH2 0x19B4 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x411C JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x8 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND ISZERO PUSH2 0x1B99 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x8 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 SLOAD DUP6 DUP3 ADD MLOAD SWAP2 MLOAD PUSH4 0x7F8661A1 PUSH1 0xE0 SHL DUP2 MSTORE SWAP3 SWAP4 AND SWAP2 PUSH4 0x7F8661A1 SWAP2 PUSH2 0x1A15 SWAP2 PUSH1 0x4 ADD PUSH2 0x44B2 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1A2F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1A43 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 DUP2 ADD SWAP1 PUSH2 0x1A67 SWAP2 SWAP1 PUSH2 0x3A1F JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP2 SGT ISZERO PUSH2 0x1ADE JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP2 SWAP1 PUSH2 0x1A96 SWAP1 DUP3 PUSH2 0x32C2 JUMP JUMPDEST POP DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x911C9F20A03EDABCBCBD18DCA1174CCE47A91B234CED7A5A3C60BA0D5B56C5D2 DUP3 PUSH1 0x40 MLOAD PUSH2 0x1AD0 SWAP2 SWAP1 PUSH2 0x3E0C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP PUSH2 0x1B52 JUMP JUMPDEST PUSH1 0x0 DUP2 SLT ISZERO PUSH2 0x1B52 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SWAP1 DUP3 SWAP1 SUB SWAP1 PUSH2 0x1B0E SWAP1 DUP3 PUSH2 0x3306 JUMP JUMPDEST POP DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x8F1F26EB9B6AA8689DBDD519EAD1999D9C8819D4738E403B2003B18197D9CF97 DUP3 PUSH1 0x40 MLOAD PUSH2 0x1B48 SWAP2 SWAP1 PUSH2 0x3E0C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP JUMPDEST DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x39AA22060F8DD4D291720311FEEDF3B72FEF47C06C66CCF5C22B502C62E7550A DUP5 PUSH1 0x40 ADD MLOAD PUSH1 0x40 MLOAD PUSH2 0x1B8F SWAP2 SWAP1 PUSH2 0x44B2 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x8 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD DUP7 DUP9 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP2 DUP3 AND OR SWAP1 SWAP2 SSTORE DUP4 DUP9 MSTORE DUP8 DUP3 ADD DUP5 SWAP1 MSTORE DUP5 DUP5 MSTORE PUSH1 0x9 SWAP1 SWAP3 MSTORE DUP1 DUP4 KECCAK256 DUP1 SLOAD SWAP1 SWAP3 AND SWAP1 SWAP2 SSTORE MLOAD SWAP3 DUP7 AND SWAP3 PUSH32 0x3E6352A885ADC4CC54767592939C3B1BBD65685658C3BEAABA66A888120E217 SWAP2 SWAP1 LOG3 JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xA PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP5 MLOAD DUP2 SLOAD SWAP3 DUP7 ADD MLOAD SWAP4 SWAP1 SWAP6 ADD MLOAD PUSH8 0xFFFFFFFFFFFFFFFF NOT SWAP1 SWAP3 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB SWAP6 DUP7 AND OR PUSH8 0xFFFFFFFFFFFFFFFF PUSH1 0x40 SHL NOT AND PUSH1 0x1 PUSH1 0x40 SHL SWAP6 SWAP1 SWAP4 AND SWAP5 SWAP1 SWAP5 MUL SWAP2 SWAP1 SWAP2 OR PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP1 DUP2 AND PUSH1 0x1 PUSH1 0x80 SHL SWAP2 SWAP1 SWAP3 AND MUL OR SWAP1 SWAP2 SSTORE POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0x1CBA JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x4153 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0x1CE0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x3F18 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND DUP5 ISZERO ISZERO OR SWAP1 SSTORE MLOAD PUSH32 0x31A1E0EAC44B54AC6C2A2EFA87E92C83405FFCF33FCEEF02A7BCA695130E2600 SWAP1 PUSH2 0x113B SWAP1 DUP5 SWAP1 PUSH2 0x3E01 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH4 0xD505ACCF PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP10 AND SWAP1 PUSH4 0xD505ACCF SWAP1 PUSH2 0x1D6C SWAP1 DUP11 SWAP1 DUP11 SWAP1 DUP11 SWAP1 DUP11 SWAP1 DUP11 SWAP1 DUP11 SWAP1 DUP11 SWAP1 PUSH1 0x4 ADD PUSH2 0x3D0D JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1D86 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1D9A JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x3 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND CALLER EQ DUP1 ISZERO SWAP1 PUSH2 0x1E0F JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ADDRESS EQ ISZERO JUMPDEST ISZERO PUSH2 0x1E91 JUMPI CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP1 PUSH2 0x1E4A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x4305 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP7 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD PUSH1 0xFF AND PUSH2 0x1E8F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x4188 JUMP JUMPDEST POP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND PUSH2 0x1EB7 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x40EE JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP10 AND ISZERO PUSH2 0x1ECE JUMPI DUP9 PUSH2 0x1EF0 JUMP JUMPDEST PUSH32 0x0 JUMPDEST SWAP1 POP PUSH2 0x1EFA PUSH2 0x3385 JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP3 AND DUP5 MSTORE PUSH1 0x1 PUSH1 0x80 SHL SWAP1 SWAP2 DIV AND SWAP1 DUP3 ADD MSTORE DUP6 PUSH2 0x1F52 JUMPI PUSH2 0x1F4B DUP2 DUP9 PUSH1 0x1 PUSH2 0x2D64 JUMP JUMPDEST SWAP6 POP PUSH2 0x1F61 JUMP JUMPDEST PUSH2 0x1F5E DUP2 DUP8 PUSH1 0x0 PUSH2 0x2E60 JUMP JUMPDEST SWAP7 POP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP14 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD PUSH2 0x1F91 SWAP1 DUP8 PUSH2 0x2F87 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP15 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SSTORE PUSH2 0x1FD4 PUSH2 0x1FC3 DUP9 PUSH2 0x2DFE JUMP JUMPDEST DUP3 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND SWAP1 PUSH2 0x313D JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP2 MSTORE PUSH2 0x1FFF PUSH2 0x1FEB DUP8 PUSH2 0x2DFE JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND SWAP1 PUSH2 0x313D JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE PUSH2 0x3E8 GT ISZERO DUP1 PUSH2 0x202A JUMPI POP PUSH1 0x20 DUP2 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND ISZERO JUMPDEST PUSH2 0x2046 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x3FBD JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 SWAP2 KECCAK256 DUP4 MLOAD DUP2 SLOAD SWAP3 DUP6 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB NOT SWAP1 SWAP4 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP2 DUP3 AND OR DUP2 AND PUSH1 0x1 PUSH1 0x80 SHL SWAP2 SWAP1 SWAP4 AND MUL SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE DUP11 AND PUSH2 0x219A JUMPI PUSH1 0x40 MLOAD PUSH4 0x2E1A7D4D PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH32 0x0 AND SWAP1 PUSH4 0x2E1A7D4D SWAP1 PUSH2 0x20E6 SWAP1 DUP11 SWAP1 PUSH1 0x4 ADD PUSH2 0x3E0C JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2100 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2114 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x0 DUP9 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP9 PUSH1 0x40 MLOAD PUSH2 0x2131 SWAP1 PUSH2 0x3BC5 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x216E 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 0x2173 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP POP SWAP1 POP DUP1 PUSH2 0x2194 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x440F JUMP JUMPDEST POP PUSH2 0x21AE JUMP JUMPDEST PUSH2 0x21AE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND DUP10 DUP10 PUSH2 0x31A3 JUMP JUMPDEST DUP8 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP10 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xAD9AB9EE6953D4D177F4A03B3A3AC3178FFCB9816319F348060194AA76B14486 DUP11 DUP11 PUSH1 0x40 MLOAD PUSH2 0xA7D SWAP3 SWAP2 SWAP1 PUSH2 0x4502 JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND DUP5 OR SWAP1 SSTORE MLOAD PUSH32 0xDFB44FFABF0D3A8F650D3CE43EFF98F6D050E7EA1A396D5794F014E7DADABACB SWAP2 SWAP1 LOG2 JUMP JUMPDEST PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH2 0x2285 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x42CE JUMP JUMPDEST DUP2 ISZERO DUP1 ISZERO PUSH2 0x2291 JUMPI POP DUP1 ISZERO JUMPDEST DUP1 ISZERO PUSH2 0x229E JUMPI POP PUSH1 0xFF DUP4 AND ISZERO JUMPDEST ISZERO PUSH2 0x2340 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND CALLER EQ PUSH2 0x22CB JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x3F4F JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND ISZERO PUSH2 0x2303 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x422B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND PUSH2 0x233B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x43D8 JUMP JUMPDEST PUSH2 0x24FA JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND PUSH2 0x2366 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x4371 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x2 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1901 PUSH1 0xF0 SHL DUP2 MSTORE POP PUSH2 0x238B PUSH2 0x101C JUMP JUMPDEST PUSH32 0x1962BC9F5484CB7A998701B81090E966EE1FCE5771AF884CCEEE7C081B14ADE2 DUP8 PUSH2 0x23D7 JUMPI PUSH32 0xB426802F1F7DC850A7B6B38805EDEA2442F3992878A9AB985ABFE8091D95D0B1 PUSH2 0x23F9 JUMP JUMPDEST PUSH32 0x422AC5323FE049241DEE67716229A1CC1BC7B313B23DFE3EF6D42AB177A3B284 JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP12 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 DUP2 ADD SWAP1 SWAP2 SSTORE SWAP2 MLOAD PUSH2 0x2433 SWAP5 SWAP4 SWAP3 DUP15 SWAP3 DUP15 SWAP3 DUP15 SWAP3 SWAP2 ADD PUSH2 0x3E15 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x245B SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x3B9E JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP PUSH1 0x0 PUSH1 0x1 DUP3 DUP7 DUP7 DUP7 PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD PUSH2 0x2498 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x3E6D JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x24BA JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD SUB MLOAD SWAP1 POP DUP8 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x24F7 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x4262 JUMP JUMPDEST POP POP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP12 AND DUP1 DUP5 MSTORE SWAP5 SWAP1 SWAP2 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND DUP9 ISZERO ISZERO OR SWAP1 SSTORE MLOAD PUSH32 0x5F6EBB64BA012A851C6F014E6CAD458DDF213D1512049B31CD06365C2B059257 SWAP1 PUSH2 0x255E SWAP1 DUP9 SWAP1 PUSH2 0x3E01 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP1 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT DUP1 ISZERO PUSH2 0x2587 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x25B1 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP SWAP2 POP DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT DUP1 ISZERO PUSH2 0x25CA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x25FE JUMPI DUP2 PUSH1 0x20 ADD JUMPDEST PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x25E9 JUMPI SWAP1 POP JUMPDEST POP SWAP1 POP PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x26F5 JUMPI PUSH1 0x0 PUSH1 0x60 ADDRESS DUP9 DUP9 DUP6 DUP2 DUP2 LT PUSH2 0x261D JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0x262F SWAP2 SWAP1 PUSH2 0x4550 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x263D SWAP3 SWAP2 SWAP1 PUSH2 0x3B72 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS DELEGATECALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x2678 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 0x267D JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 DUP1 PUSH2 0x268C JUMPI POP DUP6 ISZERO JUMPDEST PUSH2 0x2695 DUP3 PUSH2 0x3325 JUMP JUMPDEST SWAP1 PUSH2 0x26B3 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP2 SWAP1 PUSH2 0x3E9F JUMP JUMPDEST POP DUP2 DUP6 DUP5 DUP2 MLOAD DUP2 LT PUSH2 0x26C1 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD SWAP1 ISZERO ISZERO SWAP1 DUP2 ISZERO ISZERO DUP2 MSTORE POP POP DUP1 DUP5 DUP5 DUP2 MLOAD DUP2 LT PUSH2 0x26E0 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD MSTORE POP POP PUSH1 0x1 ADD PUSH2 0x2604 JUMP JUMPDEST POP SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP2 MLOAD DUP1 DUP4 ADD SWAP1 SWAP3 MSTORE SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP3 AND DUP4 MSTORE PUSH1 0x1 PUSH1 0x80 SHL SWAP1 SWAP2 DIV AND SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH2 0x1261 SWAP1 DUP5 DUP5 PUSH2 0x2D64 JUMP JUMPDEST PUSH1 0xA PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 AND SWAP2 PUSH1 0x1 PUSH1 0x40 SHL DUP2 DIV SWAP1 SWAP2 AND SWAP1 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP4 JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH3 0x186A0 PUSH2 0x27A3 DUP6 PUSH1 0x32 PUSH2 0x316C JUMP JUMPDEST DUP2 PUSH2 0x27AA JUMPI INVALID JUMPDEST DIV SWAP1 POP PUSH2 0x27C1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND DUP8 DUP7 PUSH2 0x31A3 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH4 0x23E30C8B PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP9 AND SWAP1 PUSH4 0x23E30C8B SWAP1 PUSH2 0x27F7 SWAP1 CALLER SWAP1 DUP10 SWAP1 DUP10 SWAP1 DUP8 SWAP1 DUP11 SWAP1 DUP11 SWAP1 PUSH1 0x4 ADD PUSH2 0x3CA2 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2811 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2825 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH2 0x285C PUSH2 0x2835 DUP3 PUSH2 0x2DFE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x32C2 JUMP JUMPDEST PUSH2 0x2865 DUP7 PUSH2 0x2EDF JUMP JUMPDEST LT ISZERO PUSH2 0x2883 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x43A8 JUMP JUMPDEST DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP9 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x3BE9B85936D5D30A1655EA116A17EE3D827B2CD428CC026CE5BF2AC46A223204 DUP8 DUP6 PUSH1 0x40 MLOAD PUSH2 0x28D2 SWAP3 SWAP2 SWAP1 PUSH2 0x4502 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP POP POP POP POP POP JUMP JUMPDEST DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND CALLER EQ DUP1 ISZERO SWAP1 PUSH2 0x2906 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ADDRESS EQ ISZERO JUMPDEST ISZERO PUSH2 0x2988 JUMPI CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP1 PUSH2 0x2941 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x4305 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP7 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD PUSH1 0xFF AND PUSH2 0x2986 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x4188 JUMP JUMPDEST POP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH2 0x29AE JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x40EE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP9 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD PUSH2 0x29DE SWAP1 DUP4 PUSH2 0x2F87 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP10 DUP6 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE DUP1 DUP3 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE SWAP1 DUP6 AND DUP2 MSTORE KECCAK256 SLOAD PUSH2 0x2A1A SWAP1 DUP4 PUSH2 0x2FAA JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP8 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP10 DUP7 AND DUP1 DUP6 MSTORE SWAP3 MSTORE SWAP2 DUP3 SWAP1 KECCAK256 SWAP5 SWAP1 SWAP5 SSTORE MLOAD SWAP2 DUP8 AND SWAP2 PUSH32 0x6EABE333476233FD382224F233210CB808A7BC4C4DE64F9D76628BF63C677B1A SWAP1 PUSH2 0x2A78 SWAP1 DUP8 SWAP1 PUSH2 0x3E0C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT DUP1 ISZERO PUSH2 0x2A9F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x2AC9 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP SWAP1 POP DUP6 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x2B98 JUMPI PUSH1 0x0 DUP8 DUP8 DUP4 DUP2 DUP2 LT PUSH2 0x2AE6 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD SWAP1 POP PUSH3 0x186A0 PUSH2 0x2B07 PUSH1 0x32 DUP4 PUSH2 0x316C SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP2 PUSH2 0x2B0E JUMPI INVALID JUMPDEST DIV DUP5 DUP4 DUP2 MLOAD DUP2 LT PUSH2 0x2B1B JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 DUP2 MSTORE POP POP PUSH2 0x2B8F DUP13 DUP13 DUP5 DUP2 DUP2 LT PUSH2 0x2B36 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0x2B4B SWAP2 SWAP1 PUSH2 0x345F JUMP JUMPDEST DUP10 DUP10 DUP6 DUP2 DUP2 LT PUSH2 0x2B57 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD DUP13 DUP13 DUP7 DUP2 DUP2 LT PUSH2 0x2B6A JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0x2B7F SWAP2 SWAP1 PUSH2 0x345F JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 SWAP1 PUSH2 0x31A3 JUMP JUMPDEST POP PUSH1 0x1 ADD PUSH2 0x2AD0 JUMP JUMPDEST POP PUSH1 0x40 MLOAD PUSH4 0xD9D17623 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP13 AND SWAP1 PUSH4 0xD9D17623 SWAP1 PUSH2 0x2BD3 SWAP1 CALLER SWAP1 DUP13 SWAP1 DUP13 SWAP1 DUP13 SWAP1 DUP13 SWAP1 DUP11 SWAP1 DUP14 SWAP1 DUP14 SWAP1 PUSH1 0x4 ADD PUSH2 0x3BDC JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2BED JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2C01 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x1D9A JUMPI PUSH1 0x0 DUP10 DUP10 DUP4 DUP2 DUP2 LT PUSH2 0x2C1E JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0x2C33 SWAP2 SWAP1 PUSH2 0x345F JUMP JUMPDEST SWAP1 POP PUSH2 0x2C7B PUSH2 0x2C54 DUP6 DUP5 DUP2 MLOAD DUP2 LT PUSH2 0x2C47 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH2 0x2DFE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x32C2 JUMP JUMPDEST PUSH2 0x2C84 DUP3 PUSH2 0x2EDF JUMP JUMPDEST LT ISZERO PUSH2 0x2CA2 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x43A8 JUMP JUMPDEST DUP12 DUP12 DUP4 DUP2 DUP2 LT PUSH2 0x2CAE JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0x2CC3 SWAP2 SWAP1 PUSH2 0x345F JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP15 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x3BE9B85936D5D30A1655EA116A17EE3D827B2CD428CC026CE5BF2AC46A223204 DUP12 DUP12 DUP8 DUP2 DUP2 LT PUSH2 0x2D0D JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD DUP9 DUP8 DUP2 MLOAD DUP2 LT PUSH2 0x2D20 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x40 MLOAD PUSH2 0x2D36 SWAP3 SWAP2 SWAP1 PUSH2 0x4502 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP PUSH1 0x1 ADD PUSH2 0x2C08 JUMP JUMPDEST PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST DUP3 MLOAD PUSH1 0x0 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x2D7D JUMPI POP DUP2 PUSH2 0x2DF7 JUMP JUMPDEST DUP4 MLOAD PUSH1 0x20 DUP6 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP2 DUP3 AND SWAP2 PUSH2 0x2D9C SWAP2 DUP7 SWAP2 AND PUSH2 0x316C JUMP JUMPDEST DUP2 PUSH2 0x2DA3 JUMPI INVALID JUMPDEST DIV SWAP1 POP DUP2 DUP1 ISZERO PUSH2 0x2DE7 JUMPI POP DUP3 DUP5 PUSH1 0x20 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x2DDD DUP7 PUSH1 0x0 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP5 PUSH2 0x316C SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP2 PUSH2 0x2DE4 JUMPI INVALID JUMPDEST DIV LT JUMPDEST ISZERO PUSH2 0x2DF7 JUMPI PUSH2 0x1261 DUP2 PUSH1 0x1 PUSH2 0x2FAA JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP3 GT ISZERO PUSH2 0x2E27 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x4049 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST DUP2 DUP2 ADD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP4 AND SWAP1 DUP3 AND LT ISZERO PUSH2 0x2E5A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x4080 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP4 PUSH1 0x20 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH1 0x0 EQ ISZERO PUSH2 0x2E7F JUMPI POP DUP2 PUSH2 0x2DF7 JUMP JUMPDEST PUSH1 0x20 DUP5 ADD MLOAD DUP5 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP2 DUP3 AND SWAP2 PUSH2 0x2E9E SWAP2 DUP7 SWAP2 AND PUSH2 0x316C JUMP JUMPDEST DUP2 PUSH2 0x2EA5 JUMPI INVALID JUMPDEST DIV SWAP1 POP DUP2 DUP1 ISZERO PUSH2 0x2DE7 JUMPI POP DUP3 DUP5 PUSH1 0x0 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x2DDD DUP7 PUSH1 0x20 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP5 PUSH2 0x316C SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0xA PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 SLOAD SWAP1 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE SWAP2 SWAP3 PUSH2 0x2E5A SWAP3 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 SWAP3 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND SWAP2 PUSH4 0x70A08231 SWAP1 PUSH2 0x2F31 SWAP1 ADDRESS SWAP1 PUSH1 0x4 ADD PUSH2 0x3BC8 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2F49 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2F5D 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 DUP2 ADD SWAP1 PUSH2 0x2F81 SWAP2 SWAP1 PUSH2 0x3A1F JUMP JUMPDEST SWAP1 PUSH2 0x2FAA JUMP JUMPDEST DUP1 DUP3 SUB DUP3 DUP2 GT ISZERO PUSH2 0x2E5A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x3EB2 JUMP JUMPDEST DUP2 DUP2 ADD DUP2 DUP2 LT ISZERO PUSH2 0x2E5A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x4080 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x23B872DD PUSH1 0xE0 SHL DUP7 DUP7 DUP7 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x2FF8 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x3CE9 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F NOT DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 MSTORE SWAP1 MLOAD PUSH2 0x3036 SWAP2 SWAP1 PUSH2 0x3B82 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 0x3073 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 0x3078 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 DUP1 ISZERO PUSH2 0x30A2 JUMPI POP DUP1 MLOAD ISZERO DUP1 PUSH2 0x30A2 JUMPI POP DUP1 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x30A2 SWAP2 SWAP1 PUSH2 0x3644 JUMP JUMPDEST PUSH2 0x30BE JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x433C JUMP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH32 0x8CAD95687BA82C2CE50E74F7B754645E5117C3A5BEC8151C0726D5857980A866 PUSH32 0xD7DF266AFF736D415A9DC14B4158201D612E70D75B9C7F4E375CCFD20AA5166F DUP4 ADDRESS PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x311F SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x3E49 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST DUP1 DUP3 SUB PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP5 AND SWAP1 DUP3 AND GT ISZERO PUSH2 0x2E5A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x3EB2 JUMP JUMPDEST PUSH1 0x0 DUP2 ISZERO DUP1 PUSH2 0x3187 JUMPI POP POP DUP1 DUP3 MUL DUP3 DUP3 DUP3 DUP2 PUSH2 0x3184 JUMPI INVALID JUMPDEST DIV EQ JUMPDEST PUSH2 0x2E5A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x4446 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xA9059CBB PUSH1 0xE0 SHL DUP6 DUP6 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x31CC SWAP3 SWAP2 SWAP1 PUSH2 0x3D4E JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F NOT DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 MSTORE SWAP1 MLOAD PUSH2 0x320A SWAP2 SWAP1 PUSH2 0x3B82 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 0x3247 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 0x324C JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 DUP1 ISZERO PUSH2 0x3276 JUMPI POP DUP1 MLOAD ISZERO DUP1 PUSH2 0x3276 JUMPI POP DUP1 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x3276 SWAP2 SWAP1 PUSH2 0x3644 JUMP JUMPDEST PUSH2 0x3292 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x3F86 JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP3 GT ISZERO PUSH2 0x2E27 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x636 SWAP1 PUSH2 0x41F4 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x32E1 PUSH2 0x32D0 DUP4 PUSH2 0x2DFE JUMP JUMPDEST DUP5 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND SWAP1 PUSH2 0x2E2B JUMP JUMPDEST DUP4 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP2 SWAP1 SWAP2 AND SWAP1 DUP2 OR SWAP1 SWAP4 SSTORE POP SWAP1 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x32E1 PUSH2 0x3314 DUP4 PUSH2 0x2DFE JUMP JUMPDEST DUP5 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND SWAP1 PUSH2 0x313D JUMP JUMPDEST PUSH1 0x60 PUSH1 0x44 DUP3 MLOAD LT ISZERO PUSH2 0x336B JUMPI POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x1D DUP2 MSTORE PUSH32 0x5472616E73616374696F6E2072657665727465642073696C656E746C79000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x3138 JUMP JUMPDEST PUSH1 0x4 DUP3 ADD SWAP2 POP DUP2 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x2E5A SWAP2 SWAP1 PUSH2 0x3A37 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x33CD JUMPI DUP2 DUP3 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x33E3 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP1 DUP4 MUL DUP6 ADD ADD GT ISZERO PUSH2 0x33FD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x3415 JUMPI DUP2 DUP3 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x342B JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x33FD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD PUSH2 0x2E5A DUP2 PUSH2 0x45D0 JUMP JUMPDEST DUP1 CALLDATALOAD PUSH1 0xFF DUP2 AND DUP2 EQ PUSH2 0x2E5A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3470 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x2DF7 DUP2 PUSH2 0x45D0 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x348D JUMPI DUP1 DUP2 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x3498 DUP2 PUSH2 0x45D0 JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH2 0x34A8 DUP2 PUSH2 0x45D0 JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xC0 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x34CB JUMPI DUP2 DUP3 REVERT JUMPDEST DUP7 CALLDATALOAD PUSH2 0x34D6 DUP2 PUSH2 0x45D0 JUMP JUMPDEST SWAP6 POP PUSH1 0x20 DUP8 ADD CALLDATALOAD PUSH2 0x34E6 DUP2 PUSH2 0x45D0 JUMP JUMPDEST SWAP5 POP PUSH1 0x40 DUP8 ADD CALLDATALOAD PUSH2 0x34F6 DUP2 PUSH2 0x45E8 JUMP JUMPDEST SWAP4 POP PUSH2 0x3505 DUP9 PUSH1 0x60 DUP10 ADD PUSH2 0x344E JUMP JUMPDEST SWAP3 POP PUSH1 0x80 DUP8 ADD CALLDATALOAD SWAP2 POP PUSH1 0xA0 DUP8 ADD CALLDATALOAD SWAP1 POP SWAP3 SWAP6 POP SWAP3 SWAP6 POP SWAP3 SWAP6 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x3531 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x353C DUP2 PUSH2 0x45D0 JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH2 0x34A8 DUP2 PUSH2 0x45E8 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x3560 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x356B DUP2 PUSH2 0x45D0 JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x357B DUP2 PUSH2 0x45E8 JUMP JUMPDEST SWAP2 POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH2 0x358B DUP2 PUSH2 0x45E8 JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x35AB JUMPI DUP4 DUP5 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH2 0x35B6 DUP2 PUSH2 0x45D0 JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x35D0 JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x35DC DUP8 DUP3 DUP9 ADD PUSH2 0x3404 JUMP JUMPDEST SWAP1 SWAP5 POP SWAP3 POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH2 0x35F0 DUP2 PUSH2 0x45E8 JUMP JUMPDEST SWAP4 SWAP7 SWAP3 SWAP6 POP SWAP1 SWAP4 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x40 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x360F JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x3624 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x3630 DUP7 DUP3 DUP8 ADD PUSH2 0x33BC JUMP JUMPDEST SWAP1 SWAP5 POP SWAP3 POP POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x358B DUP2 PUSH2 0x45E8 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3655 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x2DF7 DUP2 PUSH2 0x45E8 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP11 DUP13 SUB SLT ISZERO PUSH2 0x367D JUMPI DUP7 DUP8 REVERT JUMPDEST DUP10 CALLDATALOAD PUSH2 0x3688 DUP2 PUSH2 0x45D0 JUMP JUMPDEST SWAP9 POP PUSH1 0x20 DUP11 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 GT ISZERO PUSH2 0x36A3 JUMPI DUP9 DUP10 REVERT JUMPDEST PUSH2 0x36AF DUP14 DUP4 DUP15 ADD PUSH2 0x33BC JUMP JUMPDEST SWAP1 SWAP11 POP SWAP9 POP PUSH1 0x40 DUP13 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x36C7 JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH2 0x36D3 DUP14 DUP4 DUP15 ADD PUSH2 0x33BC JUMP JUMPDEST SWAP1 SWAP9 POP SWAP7 POP PUSH1 0x60 DUP13 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x36EB JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH2 0x36F7 DUP14 DUP4 DUP15 ADD PUSH2 0x33BC JUMP JUMPDEST SWAP1 SWAP7 POP SWAP5 POP PUSH1 0x80 DUP13 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x370F JUMPI DUP4 DUP5 REVERT JUMPDEST POP PUSH2 0x371C DUP13 DUP3 DUP14 ADD PUSH2 0x3404 JUMP JUMPDEST SWAP2 POP DUP1 SWAP4 POP POP DUP1 SWAP2 POP POP SWAP3 SWAP6 SWAP9 POP SWAP3 SWAP6 SWAP9 POP SWAP3 SWAP6 SWAP9 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x348D JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x375A JUMPI DUP2 DUP3 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH2 0x3765 DUP2 PUSH2 0x45D0 JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH2 0x3775 DUP2 PUSH2 0x45D0 JUMP JUMPDEST SWAP3 POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH2 0x3785 DUP2 PUSH2 0x45D0 JUMP JUMPDEST SWAP4 SWAP7 SWAP3 SWAP6 POP SWAP3 SWAP4 PUSH1 0x60 ADD CALLDATALOAD SWAP3 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x37AC JUMPI DUP3 DUP4 REVERT JUMPDEST DUP6 CALLDATALOAD PUSH2 0x37B7 DUP2 PUSH2 0x45D0 JUMP JUMPDEST SWAP5 POP PUSH1 0x20 DUP7 ADD CALLDATALOAD PUSH2 0x37C7 DUP2 PUSH2 0x45D0 JUMP JUMPDEST SWAP4 POP PUSH1 0x40 DUP7 ADD CALLDATALOAD PUSH2 0x37D7 DUP2 PUSH2 0x45D0 JUMP JUMPDEST SWAP5 SWAP8 SWAP4 SWAP7 POP SWAP4 SWAP5 PUSH1 0x60 DUP2 ADD CALLDATALOAD SWAP5 POP PUSH1 0x80 ADD CALLDATALOAD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH2 0x100 DUP10 DUP12 SUB SLT ISZERO PUSH2 0x380B JUMPI DUP2 DUP3 REVERT JUMPDEST DUP9 CALLDATALOAD PUSH2 0x3816 DUP2 PUSH2 0x45D0 JUMP JUMPDEST SWAP8 POP PUSH1 0x20 DUP10 ADD CALLDATALOAD PUSH2 0x3826 DUP2 PUSH2 0x45D0 JUMP JUMPDEST SWAP7 POP PUSH1 0x40 DUP10 ADD CALLDATALOAD PUSH2 0x3836 DUP2 PUSH2 0x45D0 JUMP JUMPDEST SWAP6 POP PUSH1 0x60 DUP10 ADD CALLDATALOAD SWAP5 POP PUSH1 0x80 DUP10 ADD CALLDATALOAD SWAP4 POP PUSH2 0x3853 DUP11 PUSH1 0xA0 DUP12 ADD PUSH2 0x344E JUMP JUMPDEST SWAP3 POP PUSH1 0xC0 DUP10 ADD CALLDATALOAD SWAP2 POP PUSH1 0xE0 DUP10 ADD CALLDATALOAD SWAP1 POP SWAP3 SWAP6 SWAP9 POP SWAP3 SWAP6 SWAP9 SWAP1 SWAP4 SWAP7 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x3888 JUMPI DUP4 DUP5 REVERT JUMPDEST DUP7 CALLDATALOAD PUSH2 0x3893 DUP2 PUSH2 0x45D0 JUMP JUMPDEST SWAP6 POP PUSH1 0x20 DUP8 ADD CALLDATALOAD PUSH2 0x38A3 DUP2 PUSH2 0x45D0 JUMP JUMPDEST SWAP5 POP PUSH1 0x40 DUP8 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 GT ISZERO PUSH2 0x38BE JUMPI DUP6 DUP7 REVERT JUMPDEST PUSH2 0x38CA DUP11 DUP4 DUP12 ADD PUSH2 0x33BC JUMP JUMPDEST SWAP1 SWAP7 POP SWAP5 POP PUSH1 0x60 DUP10 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x38E2 JUMPI DUP4 DUP5 REVERT JUMPDEST POP PUSH2 0x38EF DUP10 DUP3 DUP11 ADD PUSH2 0x33BC 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 0x3915 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x3920 DUP2 PUSH2 0x45D0 JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x3930 DUP2 PUSH2 0x45E8 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 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x3955 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x3960 DUP2 PUSH2 0x45D0 JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD SWAP2 POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH2 0x358B DUP2 PUSH2 0x45E8 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x3989 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x3994 DUP2 PUSH2 0x45D0 JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x34A8 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xA0 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x39C7 JUMPI DUP4 DUP5 REVERT JUMPDEST DUP7 CALLDATALOAD PUSH2 0x39D2 DUP2 PUSH2 0x45D0 JUMP JUMPDEST SWAP6 POP PUSH1 0x20 DUP8 ADD CALLDATALOAD PUSH2 0x39E2 DUP2 PUSH2 0x45D0 JUMP JUMPDEST SWAP5 POP PUSH1 0x40 DUP8 ADD CALLDATALOAD PUSH2 0x39F2 DUP2 PUSH2 0x45D0 JUMP JUMPDEST SWAP4 POP PUSH1 0x60 DUP8 ADD CALLDATALOAD SWAP3 POP PUSH1 0x80 DUP8 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x3A13 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0x38EF DUP10 DUP3 DUP11 ADD PUSH2 0x3404 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3A30 JUMPI DUP1 DUP2 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3A48 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 GT ISZERO PUSH2 0x3A5E JUMPI DUP3 DUP4 REVERT JUMPDEST DUP2 DUP5 ADD SWAP2 POP DUP5 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x3A71 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP2 MLOAD DUP2 DUP2 GT ISZERO PUSH2 0x3A7F JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1F DUP3 ADD PUSH1 0x1F NOT AND DUP2 ADD PUSH1 0x20 ADD DUP4 DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x3A9F JUMPI DUP6 DUP7 REVERT JUMPDEST PUSH1 0x40 MSTORE DUP2 DUP2 MSTORE DUP4 DUP3 ADD PUSH1 0x20 ADD DUP8 LT ISZERO PUSH2 0x3AB6 JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH2 0x3AC7 DUP3 PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP8 ADD PUSH2 0x45A0 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH1 0x20 DUP1 DUP6 ADD SWAP5 POP DUP1 DUP5 ADD DUP4 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3B11 JUMPI DUP2 MLOAD DUP8 MSTORE SWAP6 DUP3 ADD SWAP6 SWAP1 DUP3 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x3AF5 JUMP JUMPDEST POP SWAP5 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP5 MSTORE DUP3 DUP3 PUSH1 0x20 DUP7 ADD CALLDATACOPY DUP1 PUSH1 0x20 DUP5 DUP7 ADD ADD MSTORE PUSH1 0x20 PUSH1 0x1F NOT PUSH1 0x1F DUP6 ADD AND DUP6 ADD ADD SWAP1 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH2 0x3B5E DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x45A0 JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP5 DUP4 CALLDATACOPY SWAP2 ADD SWAP1 DUP2 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH2 0x3B94 DUP2 DUP5 PUSH1 0x20 DUP8 ADD PUSH2 0x45A0 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP5 MLOAD PUSH2 0x3BB0 DUP2 DUP5 PUSH1 0x20 DUP10 ADD PUSH2 0x45A0 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 DUP4 MSTORE POP PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP2 SWAP1 POP JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP10 AND DUP2 MSTORE PUSH1 0xA0 PUSH1 0x20 DUP1 DUP4 ADD DUP3 SWAP1 MSTORE PUSH1 0x0 SWAP2 DUP4 ADD SWAP1 DUP2 PUSH2 0x3C03 DUP12 DUP3 PUSH2 0x3E0C JUMP JUMPDEST SWAP1 POP DUP12 SWAP3 POP DUP4 JUMPDEST DUP12 DUP2 LT ISZERO PUSH2 0x3C35 JUMPI DUP3 DUP5 ADD PUSH2 0x3C28 DUP4 PUSH2 0x3C23 DUP4 DUP9 PUSH2 0x3443 JUMP JUMPDEST PUSH2 0x3AD1 JUMP JUMPDEST SWAP1 SWAP5 POP SWAP2 POP PUSH1 0x1 ADD PUSH2 0x3C0A JUMP JUMPDEST POP DUP5 DUP2 SUB PUSH1 0x40 DUP7 ADD MSTORE PUSH2 0x3C48 DUP10 DUP3 PUSH2 0x3E0C JUMP JUMPDEST SWAP3 POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xFB SHL SUB DUP9 GT ISZERO PUSH2 0x3C5E JUMPI DUP3 DUP4 REVERT JUMPDEST DUP8 MUL PUSH2 0x3C6B DUP2 DUP4 DUP12 PUSH2 0x4594 JUMP JUMPDEST ADD DUP3 DUP2 SUB PUSH1 0x60 DUP5 ADD MSTORE PUSH2 0x3C7E DUP2 DUP8 PUSH2 0x3AE2 JUMP JUMPDEST SWAP1 POP DUP3 DUP2 SUB PUSH1 0x80 DUP5 ADD MSTORE PUSH2 0x3C93 DUP2 DUP6 DUP8 PUSH2 0x3B1C JUMP JUMPDEST SWAP12 SWAP11 POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 DUP2 AND DUP3 MSTORE DUP7 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 DUP2 ADD DUP6 SWAP1 MSTORE PUSH1 0x60 DUP2 ADD DUP5 SWAP1 MSTORE PUSH1 0xA0 PUSH1 0x80 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP1 PUSH2 0x3CDD SWAP1 DUP4 ADD DUP5 DUP7 PUSH2 0x3B1C JUMP JUMPDEST SWAP9 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB 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 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP8 DUP9 AND DUP2 MSTORE SWAP6 SWAP1 SWAP7 AND PUSH1 0x20 DUP7 ADD MSTORE PUSH1 0x40 DUP6 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x60 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xFF AND PUSH1 0x80 DUP4 ADD MSTORE PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xC0 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xE0 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 DUP3 MSTORE DUP4 MLOAD SWAP1 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP1 PUSH1 0x20 SWAP1 PUSH1 0x60 DUP5 ADD SWAP1 DUP3 DUP8 ADD DUP5 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x3DA2 JUMPI DUP2 MLOAD ISZERO ISZERO DUP5 MSTORE SWAP3 DUP5 ADD SWAP3 SWAP1 DUP5 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x3D84 JUMP JUMPDEST POP POP POP DUP4 DUP2 SUB DUP3 DUP6 ADD MSTORE DUP1 DUP6 MLOAD PUSH2 0x3DB9 DUP2 DUP5 PUSH2 0x3E0C JUMP JUMPDEST SWAP2 POP DUP2 SWAP3 POP DUP4 DUP2 MUL DUP3 ADD DUP5 DUP9 ADD DUP7 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3DF2 JUMPI DUP6 DUP4 SUB DUP6 MSTORE PUSH2 0x3DE0 DUP4 DUP4 MLOAD PUSH2 0x3B46 JUMP JUMPDEST SWAP5 DUP8 ADD SWAP5 SWAP3 POP SWAP1 DUP7 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x3DC8 JUMP JUMPDEST POP SWAP1 SWAP10 SWAP9 POP POP POP POP POP POP POP POP POP JUMP JUMPDEST SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP6 DUP7 MSTORE PUSH1 0x20 DUP7 ADD SWAP5 SWAP1 SWAP5 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND PUSH1 0x40 DUP7 ADD MSTORE SWAP2 AND PUSH1 0x60 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x80 DUP4 ADD MSTORE PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xC0 ADD SWAP1 JUMP JUMPDEST SWAP4 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST SWAP4 DUP5 MSTORE PUSH1 0xFF SWAP3 SWAP1 SWAP3 AND PUSH1 0x20 DUP5 ADD MSTORE PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE PUSH2 0x1261 PUSH1 0x20 DUP4 ADD DUP5 DUP7 PUSH2 0x3B1C JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE PUSH2 0x2DF7 PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x3B46 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x15 SWAP1 DUP3 ADD MSTORE PUSH21 0x426F72696E674D6174683A20556E646572666C6F77 PUSH1 0x58 SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x17 SWAP1 DUP3 ADD MSTORE PUSH32 0x42656E746F426F783A20536B696D20746F6F206D756368000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1C SWAP1 DUP3 ADD MSTORE PUSH32 0x4D6173746572434D67723A2043616E6E6F7420617070726F7665203000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1B SWAP1 DUP3 ADD MSTORE PUSH32 0x4D6173746572434D67723A2075736572206E6F742073656E6465720000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1C SWAP1 DUP3 ADD MSTORE PUSH32 0x426F72696E6745524332303A205472616E73666572206661696C656400000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x16 SWAP1 DUP3 ADD MSTORE PUSH22 0x42656E746F426F783A2063616E6E6F7420656D707479 PUSH1 0x50 SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x15 SWAP1 DUP3 ADD MSTORE PUSH21 0x4F776E61626C653A207A65726F2061646472657373 PUSH1 0x58 SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x13 SWAP1 DUP3 ADD MSTORE PUSH19 0x42656E746F426F783A204E6F20746F6B656E73 PUSH1 0x68 SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1C SWAP1 DUP3 ADD MSTORE PUSH32 0x426F72696E674D6174683A2075696E74313238204F766572666C6F7700000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x18 SWAP1 DUP3 ADD MSTORE PUSH32 0x426F72696E674D6174683A20416464204F766572666C6F770000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x17 SWAP1 DUP3 ADD MSTORE PUSH32 0x42656E746F426F783A20746F5B305D206E6F7420736574000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x14 SWAP1 DUP3 ADD MSTORE PUSH20 0x10995B9D1BD09BDE0E881D1BC81B9BDD081CD95D PUSH1 0x62 SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1A SWAP1 DUP3 ADD MSTORE PUSH32 0x53747261746567794D616E616765723A20546F6F206561726C79000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 DUP2 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1F SWAP1 DUP3 ADD MSTORE PUSH32 0x42656E746F426F783A205472616E73666572206E6F7420617070726F76656400 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 DUP2 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C657220213D2070656E64696E67206F776E6572 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1B SWAP1 DUP3 ADD MSTORE PUSH32 0x426F72696E674D6174683A2075696E743634204F766572666C6F770000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x19 SWAP1 DUP3 ADD MSTORE PUSH32 0x4D6173746572434D67723A207573657220697320636C6F6E6500000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1D SWAP1 DUP3 ADD MSTORE PUSH32 0x4D6173746572434D67723A20496E76616C6964205369676E6174757265000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 DUP2 ADD MSTORE PUSH32 0x426F72696E67466163746F72793A204E6F206D6173746572436F6E7472616374 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1B SWAP1 DUP3 ADD MSTORE PUSH32 0x4D6173746572434D67723A206D617374657243206E6F74207365740000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1B SWAP1 DUP3 ADD MSTORE PUSH32 0x42656E746F426F783A206E6F206D6173746572436F6E74726163740000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 DUP2 ADD MSTORE PUSH32 0x426F72696E6745524332303A205472616E7366657246726F6D206661696C6564 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1C SWAP1 DUP3 ADD MSTORE PUSH32 0x4D6173746572434D67723A20557365722063616E6E6F74206265203000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x16 SWAP1 DUP3 ADD MSTORE PUSH22 0x10995B9D1BD09BDE0E8815DC9BDB99C8185B5BDD5B9D PUSH1 0x52 SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1B SWAP1 DUP3 ADD MSTORE PUSH32 0x4D6173746572434D67723A206E6F742077686974656C69737465640000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1D SWAP1 DUP3 ADD MSTORE PUSH32 0x42656E746F426F783A20455448207472616E73666572206661696C6564000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x18 SWAP1 DUP3 ADD MSTORE PUSH32 0x426F72696E674D6174683A204D756C204F766572666C6F770000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 DUP2 ADD MSTORE PUSH32 0x53747261746567794D616E616765723A2054617267657420746F6F2068696768 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP3 SWAP1 SWAP3 AND DUP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP3 DUP4 AND DUP2 MSTORE SWAP2 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB SWAP4 DUP5 AND DUP2 MSTORE SWAP2 SWAP1 SWAP3 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP1 SWAP2 AND PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH1 0x1E NOT DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x4566 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 ADD DUP1 CALLDATALOAD SWAP2 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP3 GT ISZERO PUSH2 0x457F JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH1 0x20 ADD SWAP2 POP CALLDATASIZE DUP2 SWAP1 SUB DUP3 SGT ISZERO PUSH2 0x33FD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x45BB JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x45A3 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x45CA JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x45E5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x45E5 JUMPI PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xBB 0xDE PUSH24 0xAAF581519850551EEE78BC6315B2E7D060C6C0B1C48CF153 COINBASE 0xED PUSH1 0xF7 0xED PUSH5 0x736F6C6343 STOP MOD 0xC STOP CALLER ",
              "sourceMap": "27802:23044:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33755:2830;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;14124:489;;;;;;;;;;-1:-1:-1;14124:489:0;;;;;:::i;:::-;;:::i;:::-;;40494:723;;;;;;;;;;-1:-1:-1;40494:723:0;;;;;:::i;:::-;;:::i;18852:58::-;;;;;;;;;;-1:-1:-1;18852:58:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;16553:1670::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;30308:44::-;;;;;;;;;;-1:-1:-1;30308:44:0;;;;;:::i;:::-;;:::i;20177:262::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;44689:370::-;;;;;;;;;;-1:-1:-1;44689:370:0;;;;;:::i;:::-;;:::i;14692:330::-;;;;;;;;;;;;;:::i;30262:39::-;;;;;;;;;;-1:-1:-1;30262:39:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;30358:51::-;;;;;;;;;;-1:-1:-1;30358:51:0;;;;;:::i;:::-;;:::i;33021:195::-;;;;;;;;;;-1:-1:-1;33021:195:0;;;;;:::i;:::-;;:::i;48258:2421::-;;;;;;;;;;-1:-1:-1;48258:2421:0;;;;;:::i;:::-;;:::i;45860:1658::-;;;;;;;;;;-1:-1:-1;45860:1658:0;;;;;:::i;:::-;;:::i;20798:343::-;;;;;;;;;;-1:-1:-1;20798:343:0;;;;;:::i;:::-;;:::i;27081:269::-;;;;;;;;;;-1:-1:-1;27081:269:0;;;;;:::i;:::-;;:::i;18973:41::-;;;;;;;;;;-1:-1:-1;18973:41:0;;;;;:::i;:::-;;:::i;13288:20::-;;;;;;;;;;;;;:::i;18684:74::-;;;;;;;;;;-1:-1:-1;18684:74:0;;;;;:::i;:::-;;:::i;36977:2114::-;;;;;;;;;;-1:-1:-1;36977:2114:0;;;;;:::i;:::-;;:::i;20569:139::-;;;;;;;;;;;;;:::i;15971:51::-;;;;;;;;;;-1:-1:-1;15971:51:0;;;;;:::i;:::-;;:::i;21898:2631::-;;;;;;;;;;-1:-1:-1;21898:2631:0;;;;;:::i;:::-;;:::i;26174:521::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;32534:191::-;;;;;;;;;;-1:-1:-1;32534:191:0;;;;;:::i;:::-;;:::i;30415:51::-;;;;;;;;;;-1:-1:-1;30415:51:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;13314:27::-;;;;;;;;;;;;;:::i;41969:550::-;;;;;;;;;;-1:-1:-1;41969:550:0;;;;;:::i;:::-;;:::i;39593:459::-;;;;;;;;;;-1:-1:-1;39593:459:0;;;;;:::i;:::-;;:::i;43414:932::-;;;;;;;;;;-1:-1:-1;43414:932:0;;;;;:::i;:::-;;:::i;30157:63::-;;;;;;;;;;-1:-1:-1;30157:63:0;;;;;:::i;:::-;;:::i;33755:2830::-;33928:17;;33913:4;-1:-1:-1;;;;;31334:18:0;;31342:10;31334:18;;;;:43;;-1:-1:-1;;;;;;31356:21:0;;31372:4;31356:21;;31334:43;31330:361;;;31485:10;31443:22;31468:28;;;:16;:28;;;;;;-1:-1:-1;;;;;31468:28:0;31518;31510:68;;;;-1:-1:-1;;;31510:68:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;31600:38:0;;;;;;;:22;:38;;;;;;;;:44;;;;;;;;;;;;31592:88;;;;-1:-1:-1;;;31592:88:0;;;;;;;:::i;:::-;31330:361;;-1:-1:-1;;;;;34001:16:0;::::1;33993:49;;;;-1:-1:-1::0;;;33993:49:0::1;;;;;;;:::i;:::-;34112:12;-1:-1:-1::0;;;;;34127:22:0;::::1;::::0;:43:::1;;34164:6;34127:43;;;34152:9;34127:43;34112:58;;34180:19;;:::i;:::-;-1:-1:-1::0;;;;;;34202:13:0;::::1;;::::0;;;:6:::1;:13;::::0;;;;;;;;34180:35;;;;::::1;::::0;;;;-1:-1:-1;;;;;34180:35:0;;::::1;::::0;;;-1:-1:-1;;;34180:35:0;;::::1;;::::0;;::::1;::::0;;;;34355:18;::::1;::::0;:45:::1;;;34399:1;34377:5;-1:-1:-1::0;;;;;34377:17:0::1;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:23;34355:45;34347:77;;;;-1:-1:-1::0;;;34347:77:0::1;;;;;;;:::i;:::-;34438:10:::0;34434:595:::1;;34562:27;:5:::0;34575:6;34583:5:::1;34562:12;:27::i;:::-;34554:35;;29971:4;34726:29;34741:13;:5;:11;:13::i;:::-;34726:10;::::0;::::1;::::0;-1:-1:-1;;;;;34726:14:0::1;::::0;::::1;:29::i;:::-;-1:-1:-1::0;;;;;34726:53:0::1;;34722:105;;;34807:1;34810::::0;34799:13:::1;;;;;;;;34722:105;34434:595;;;34990:28;:5:::0;35006;35013:4:::1;34990:15;:28::i;:::-;34981:37;;34434:595;-1:-1:-1::0;;;;;35343:21:0;::::1;35359:4;35343:21;;::::0;:47:::1;;-1:-1:-1::0;;;;;;35368:22:0;::::1;::::0;35343:47:::1;:102;;;-1:-1:-1::0;35431:13:0;;35404:41:::1;::::0;-1:-1:-1;;;;;35404:41:0::1;:22;35420:5:::0;35404:15:::1;:22::i;:::-;:26:::0;::::1;:41::i;:::-;35394:6;:51;;35343:102;35322:172;;;;-1:-1:-1::0;;;35322:172:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;35528:16:0;;::::1;;::::0;;;:9:::1;:16;::::0;;;;;;;:20;;::::1;::::0;;;;;;;:31:::1;::::0;35553:5;35528:24:::1;:31::i;:::-;-1:-1:-1::0;;;;;35505:16:0;;::::1;;::::0;;;:9:::1;:16;::::0;;;;;;;:20;;::::1;::::0;;;;;;:54;35582:29:::1;35597:13;:5:::0;:11:::1;:13::i;:::-;35582:10;::::0;::::1;::::0;-1:-1:-1;;;;;35582:14:0::1;::::0;::::1;:29::i;:::-;-1:-1:-1::0;;;;;35569:42:0::1;:10;::::0;::::1;:42:::0;35637:33:::1;35655:14;:6:::0;:12:::1;:14::i;:::-;35637:13:::0;;-1:-1:-1;;;;;35637:17:0::1;::::0;::::1;:33::i;:::-;-1:-1:-1::0;;;;;35621:49:0;;::::1;::::0;;-1:-1:-1;;;;;35680:13:0;;::::1;35621;35680::::0;;;:6:::1;:13;::::0;;;;;;;:21;;;;;;::::1;::::0;;::::1;-1:-1:-1::0;;;35680:21:0::1;::::0;;::::1;-1:-1:-1::0;;;;;;35680:21:0;;::::1;::::0;;;::::1;::::0;;::::1;;::::0;;;35812:22;::::1;35808:660;;36102:9;-1:-1:-1::0;;;;;36088:33:0::1;;36129:6;36088:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;35808:660;;;-1:-1:-1::0;;;;;36159:21:0;::::1;36175:4;36159:21;36155:313;;36406:51;-1:-1:-1::0;;;;;36406:22:0;::::1;36429:4:::0;36443::::1;36450:6:::0;36406:22:::1;:51::i;:::-;36506:2;-1:-1:-1::0;;;;;36482:42:0::1;36500:4;-1:-1:-1::0;;;;;36482:42:0::1;36493:5;-1:-1:-1::0;;;;;36482:42:0::1;;36510:6;36518:5;36482:42;;;;;;;:::i;:::-;;;;;;;;36546:6;36534:18;;36573:5;36562:16;;31700:1;;;33755:2830:::0;;;;;;;;;:::o;14124:489::-;15146:5;;-1:-1:-1;;;;;15146:5:0;15132:10;:19;15124:64;;;;-1:-1:-1;;;15124:64:0;;;;;;;:::i;:::-;14258:6:::1;14254:353;;;-1:-1:-1::0;;;;;14310:22:0;::::1;::::0;::::1;::::0;:34:::1;;;14336:8;14310:34;14302:68;;;;-1:-1:-1::0;;;14302:68:0::1;;;;;;;:::i;:::-;14434:5;::::0;;14413:37:::1;::::0;-1:-1:-1;;;;;14413:37:0;;::::1;::::0;14434:5;::::1;::::0;14413:37:::1;::::0;::::1;14464:5;:16:::0;;-1:-1:-1;;;;;14464:16:0;::::1;-1:-1:-1::0;;;;;;14464:16:0;;::::1;;::::0;;;;14494:25;;;;::::1;::::0;;14254:353:::1;;;14573:12;:23:::0;;-1:-1:-1;;;;;;14573:23:0::1;-1:-1:-1::0;;;;;14573:23:0;::::1;;::::0;;14254:353:::1;14124:489:::0;;;:::o;40494:723::-;40652:4;-1:-1:-1;;;;;31334:18:0;;31342:10;31334:18;;;;:43;;-1:-1:-1;;;;;;31356:21:0;;31372:4;31356:21;;31334:43;31330:361;;;31485:10;31443:22;31468:28;;;:16;:28;;;;;;-1:-1:-1;;;;;31468:28:0;31518;31510:68;;;;-1:-1:-1;;;31510:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;31600:38:0;;;;;;;:22;:38;;;;;;;;:44;;;;;;;;;;;;31592:88;;;;-1:-1:-1;;;31592:88:0;;;;;;;:::i;:::-;31330:361;;40712:1:::1;40694:3:::0;;40712:1;40694:6;::::1;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;40694:20:0::1;;;40686:56;;;;-1:-1:-1::0;;;40686:56:0::1;;;;;;;:::i;:::-;40812:19;40855:3:::0;40812:19;40875:262:::1;40899:3;40895:1;:7;40875:262;;;40923:10;40936:3;;40940:1;40936:6;;;;;;;;;;;;;;;;;;;;:::i;:::-;40923:19;;40979:35;41004:6;;41011:1;41004:9;;;;;;;;;;;;;40979;:16;40989:5;-1:-1:-1::0;;;;;40979:16:0::1;-1:-1:-1::0;;;;;40979:16:0::1;;;;;;;;;;;;:20;40996:2;-1:-1:-1::0;;;;;40979:20:0::1;-1:-1:-1::0;;;;;40979:20:0::1;;;;;;;;;;;;;:24;;:35;;;;:::i;:::-;-1:-1:-1::0;;;;;40956:16:0;;::::1;;::::0;;;:9:::1;:16;::::0;;;;;;;:20;;::::1;::::0;;;;;;:58;41042:26:::1;41058:6:::0;;41065:1;41058:9;;::::1;;;;;;;;;;;41042:11;:15;;:26;;;;:::i;:::-;41028:40;;41112:2;-1:-1:-1::0;;;;;41087:39:0::1;41106:4;-1:-1:-1::0;;;;;41087:39:0::1;41099:5;-1:-1:-1::0;;;;;41087:39:0::1;;41116:6;;41123:1;41116:9;;;;;;;;;;;;;41087:39;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;40904:3:0::1;;40875:262;;;-1:-1:-1::0;;;;;;41171:16:0;;::::1;;::::0;;;:9:::1;:16;::::0;;;;;;;:22;;::::1;::::0;;;;;;;:39:::1;::::0;41198:11;41171:26:::1;:39::i;:::-;-1:-1:-1::0;;;;;41146:16:0;;::::1;;::::0;;;:9:::1;:16;::::0;;;;;;;:22;;;::::1;::::0;;;;;;;;;;:64;;;;-1:-1:-1;;;;;;;40494:723:0:o;18852:58::-;;;;;;;;;;;;;;;:::o;16553:1670::-;16685:20;-1:-1:-1;;;;;16725:28:0;;16717:73;;;;-1:-1:-1;;;16717:73:0;;;;;;;:::i;:::-;16822:23;;;;16916:1114;;;;17057:12;17082:4;;17072:15;;;;;;;:::i;:::-;;;;;;;;17057:30;;17267:4;17261:11;-1:-1:-1;;;17296:5:0;17289:81;17412:11;17405:4;17398:5;17394:16;17387:37;-1:-1:-1;;;17459:4:0;17452:5;17448:16;17441:92;17590:4;17584;17577:5;17574:1;17566:29;17550:45;;;17230:379;;;;17685:4;17679:11;-1:-1:-1;;;17714:5:0;17707:81;17830:11;17823:4;17816:5;17812:16;17805:37;-1:-1:-1;;;17877:4:0;17870:5;17866:16;17859:92;18001:4;17994:5;17991:1;17984:22;17968:38;;;17648:372;-1:-1:-1;;;;;18039:30:0;;;;;;;:16;:30;;;;;;;:47;;-1:-1:-1;;;;;;18039:47:0;;;;;;;;;;;18097:58;;-1:-1:-1;;;18097:58:0;;:34;;18139:9;;18097:58;;18150:4;;;;18097:58;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18203:12;-1:-1:-1;;;;;18171:45:0;18181:14;-1:-1:-1;;;;;18171:45:0;;18197:4;;18171:45;;;;;;;:::i;:::-;;;;;;;;16553:1670;;;;;;;:::o;30308:44::-;;;;;;;;;;;;-1:-1:-1;;;;;30308:44:0;;:::o;20177:262::-;20226:7;20304:9;20350:25;20339:36;;:93;;20398:34;20424:7;20398:25;:34::i;:::-;20339:93;;;20378:17;20339:93;20332:100;;;20177:262;:::o;44689:370::-;15146:5;;-1:-1:-1;;;;;15146:5:0;15132:10;:19;15124:64;;;;-1:-1:-1;;;15124:64:0;;;;;;;:::i;:::-;29907:2:::1;44819:17;-1:-1:-1::0;;;;;44819:42:0::1;;;44811:87;;;;-1:-1:-1::0;;;44811:87:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;44928:19:0;::::1;;::::0;;;:12:::1;:19;::::0;;;;;;:56;;-1:-1:-1;;;;44928:56:0::1;-1:-1:-1::0;;;;;;;;44928:56:0;::::1;;;::::0;;44999:53;::::1;::::0;::::1;::::0;44928:56;;44999:53:::1;:::i;:::-;;;;;;;;44689:370:::0;;:::o;14692:330::-;14759:12;;-1:-1:-1;;;;;14759:12:0;14808:10;:27;;14800:72;;;;-1:-1:-1;;;14800:72:0;;;;;;;:::i;:::-;14928:5;;;14907:42;;-1:-1:-1;;;;;14907:42:0;;;;14928:5;;;14907:42;;;14959:5;:21;;-1:-1:-1;;;;;14959:21:0;;;-1:-1:-1;;;;;;14959:21:0;;;;;;;14990:25;;;;;;;14692:330::o;30262:39::-;;;;;;;;;;;;-1:-1:-1;;;;;30262:39:0;;;;-1:-1:-1;;;30262:39:0;;;;:::o;30358:51::-;;;;;;;;;;;;-1:-1:-1;;;;;30358:51:0;;:::o;33021:195::-;-1:-1:-1;;;;;33170:13:0;;33135:14;33170:13;;;:6;:13;;;;;;;;:23;;;;;;;;;-1:-1:-1;;;;;33170:23:0;;;;;-1:-1:-1;;;33170:23:0;;;;;;;;;;;:39;;33194:5;33201:7;33170:23;:39::i;:::-;33161:48;33021:195;-1:-1:-1;;;;33021:195:0:o;48258:2421::-;48375:24;;:::i;:::-;-1:-1:-1;;;;;;48402:19:0;;;;;;;:12;:19;;;;;;;;48375:46;;;;;;;;;-1:-1:-1;;;;;48375:46:0;;;;;-1:-1:-1;;;48375:46:0;;;;;;;-1:-1:-1;;;48375:46:0;;-1:-1:-1;;;;;48375:46:0;;;;;;;48453:15;;;48375:46;48453:15;;;;;;;48519:12;;48501:43;;-1:-1:-1;;;48501:43:0;;48375:46;;48453:15;;;;;;;48501:17;;:43;;48533:10;;48501:43;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48478:66;-1:-1:-1;48558:18:0;;:30;;;;;48581:7;48580:8;48558:30;48554:67;;;48604:7;;;;;48554:67;-1:-1:-1;;;;;48654:13:0;;48631:20;48654:13;;;:6;:13;;;;;:21;-1:-1:-1;;;;;48654:21:0;;48690:17;;48686:769;;;48745:13;48788:21;:12;48745:13;48788:16;:21::i;:::-;48773:36;;48847:20;:12;:18;:20::i;:::-;-1:-1:-1;;;;;48823:13:0;;;;;;:6;:13;;;;;;;:44;;-1:-1:-1;;;;;;48823:44:0;-1:-1:-1;;;;;48823:44:0;;;;;;;;;;;48886:29;;;;;;48911:3;;48886:29;:::i;:::-;;;;;;;;48686:769;;;;48952:1;48936:13;:17;48932:523;;;49195:11;49217:14;;;49261:21;:12;49217:14;49261:16;:21::i;:::-;49246:36;;49320:20;:12;:18;:20::i;:::-;-1:-1:-1;;;;;49296:13:0;;;;;;:6;:13;;;;;:44;;-1:-1:-1;;;;;;49296:44:0;-1:-1:-1;;;;;49296:44:0;;;;;;;;;;49369:29;49386:11;:3;:9;:11::i;:::-;49369:12;;;;-1:-1:-1;;;;;49369:16:0;;;:29::i;:::-;-1:-1:-1;;;;;49354:44:0;:12;;;;:44;;;;49417:27;-1:-1:-1;;;;;49417:27:0;;;;;;;49440:3;;49417:27;:::i;:::-;;;;;;;;48932:523;;49469:7;49465:1171;;;49492:21;49558:3;49516:39;49533:4;:21;;;-1:-1:-1;;;;;49516:39:0;:12;:16;;:39;;;;:::i;:::-;:45;;;;;;49492:69;;49669:13;49654:4;:12;;;-1:-1:-1;;;;;49654:28:0;;49650:976;;;49702:17;49722:31;49740:4;:12;;;-1:-1:-1;;;;;49722:31:0;:13;:17;;:31;;;;:::i;:::-;49702:51;-1:-1:-1;49775:20:0;;;;;:51;;;49811:15;49799:9;:27;49775:51;49771:125;;;-1:-1:-1;49862:15:0;49771:125;49913:49;-1:-1:-1;;;;;49913:18:0;;49940:9;49952;49913:18;:49::i;:::-;49995:35;50012:17;:9;:15;:17::i;:::-;49995:12;;;;-1:-1:-1;;;;;49995:16:0;;;:35::i;:::-;-1:-1:-1;;;;;49980:50:0;:12;;;;:50;;;;50048:25;-1:-1:-1;;;50048:25:0;;-1:-1:-1;;;;;50048:14:0;;;;;:25;;50063:9;;50048:25;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50114:5;-1:-1:-1;;;;;50096:35:0;;50121:9;50096:35;;;;;;:::i;:::-;;;;;;;;49650:976;;;;50171:13;50156:4;:12;;;-1:-1:-1;;;;;50156:28:0;;50152:474;;;50204:16;50223:39;50240:21;:13;:19;:21::i;:::-;50223:12;;;;-1:-1:-1;;;;;50223:16:0;;;:39::i;:::-;-1:-1:-1;;;;;50204:58:0;;-1:-1:-1;50284:20:0;;;;;:50;;;50319:15;50308:8;:26;50284:50;50280:123;;;-1:-1:-1;50369:15:0;50280:123;50446:28;;-1:-1:-1;;;50446:28:0;;50421:22;;-1:-1:-1;;;;;50446:18:0;;;;;:28;;50465:8;;50446:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50421:53;;50508:40;50525:22;:14;:20;:22::i;:::-;50508:12;;;;-1:-1:-1;;;;;50508:16:0;;;:40::i;:::-;-1:-1:-1;;;;;50493:55:0;:12;;;;:55;;;;50571:40;-1:-1:-1;;;;;50571:40:0;;;;;;;50596:14;;50571:40;:::i;:::-;;;;;;;;50152:474;;;49465:1171;;-1:-1:-1;;;;;;;;50646:19:0;;;;;;:12;:19;;;;;;;;;:26;;;;;;;;;;;;;-1:-1:-1;;;;;50646:26:0;;;-1:-1:-1;;;50646:26:0;-1:-1:-1;;;;;50646:26:0;;;-1:-1:-1;;;50646:26:0;-1:-1:-1;;;;50646:26:0;;;;-1:-1:-1;;50646:26:0;;;;;;;;;;;;;;;;;;;;;;48258:2421;;;:::o;45860:1658::-;15146:5;;-1:-1:-1;;;;;15146:5:0;15132:10;:19;15124:64;;;;-1:-1:-1;;;15124:64:0;;;;;;;:::i;:::-;45945:24:::1;;:::i;:::-;-1:-1:-1::0;;;;;;45972:19:0;;::::1;;::::0;;;:12:::1;:19;::::0;;;;;;;45945:46;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;45945:46:0;;::::1;::::0;;-1:-1:-1;;;45945:46:0;::::1;::::0;::::1;::::0;;::::1;::::0;-1:-1:-1;;;45945:46:0;;::::1;-1:-1:-1::0;;;;;45945:46:0::1;::::0;;;;46021:22;;;:15:::1;:22:::0;;;;;;;46057;;45945:46;;46021:22:::1;::::0;46057:27:::1;::::0;;:53:::1;;;46099:11;-1:-1:-1::0;;;;;46088:22:0::1;:7;-1:-1:-1::0;;;;;46088:22:0::1;;;46057:53;46053:1423;;;-1:-1:-1::0;;;;;46126:22:0;;::::1;;::::0;;;:15:::1;:22;::::0;;;;:36;;-1:-1:-1;;;;;;46126:36:0::1;::::0;;::::1;::::0;;;::::1;::::0;;46341:41:::1;29845:7;46342:15;:32;46341:39;:41::i;:::-;-1:-1:-1::0;;;;;46316:66:0::1;::::0;;46401:37:::1;::::0;-1:-1:-1;;;;;46401:37:0;;::::1;::::0;;;::::1;::::0;::::1;::::0;46316:22:::1;::::0;46401:37:::1;46053:1423;;;46477:22:::0;;-1:-1:-1;;;;;46477:27:0::1;::::0;;::::1;::::0;:72:::1;;-1:-1:-1::0;46527:22:0;;-1:-1:-1;;;;;46508:41:0::1;:15;:41;;46477:72;46469:111;;;;-1:-1:-1::0;;;46469:111:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;46606:15:0;;::::1;46634:1;46606:15:::0;;;:8:::1;:15;::::0;;;;;::::1;46598:38:::0;46594:659:::1;;-1:-1:-1::0;;;;;46679:15:0;;::::1;46656:20;46679:15:::0;;;:8:::1;:15;::::0;;;;;;46700:12;;::::1;::::0;46679:34;;-1:-1:-1;;;46679:34:0;;46656:20;;46679:15:::1;::::0;:20:::1;::::0;:34:::1;::::0;::::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46656:57;;46778:1;46762:13;:17;46758:419;;;-1:-1:-1::0;;;;;46861:13:0;::::1;46803:11;46861:13:::0;;;:6:::1;:13;::::0;;;;46825;;46861:29:::1;::::0;46825:13;46861:24:::1;:29::i;:::-;;46935:5;-1:-1:-1::0;;;;;46917:29:0::1;;46942:3;46917:29;;;;;;:::i;:::-;;;;;;;;46758:419;;;;46991:1;46975:13;:17;46971:206;;;-1:-1:-1::0;;;;;47075:13:0;::::1;47016:11;47075:13:::0;;;:6:::1;:13;::::0;;;;47038:14;;;::::1;::::0;47075:29:::1;::::0;47038:14;47075:24:::1;:29::i;:::-;;47147:5;-1:-1:-1::0;;;;;47131:27:0::1;;47154:3;47131:27;;;;;;:::i;:::-;;;;;;;;46971:206;;47218:5;-1:-1:-1::0;;;;;47200:38:0::1;;47225:4;:12;;;47200:38;;;;;;:::i;:::-;;;;;;;;46594:659;;-1:-1:-1::0;;;;;47266:15:0;;::::1;;::::0;;;:8:::1;:15;::::0;;;;;;;:25;;;;::::1;-1:-1:-1::0;;;;;;47266:25:0;;::::1;;::::0;;;47305:26;;;47345:12;;::::1;:16:::0;;;47375:22;;;:15:::1;:22:::0;;;;;;:37;;;;::::1;::::0;;;47431:34;;;::::1;::::0;::::1;::::0;47266:15;47431:34:::1;46053:1423;-1:-1:-1::0;;;;;;47485:19:0;;;::::1;;::::0;;;:12:::1;:19;::::0;;;;;;;;:26;;;;;;::::1;::::0;;;;::::1;::::0;-1:-1:-1;;47485:26:0;;::::1;-1:-1:-1::0;;;;;47485:26:0;;::::1;;-1:-1:-1::0;;;;47485:26:0::1;-1:-1:-1::0;;;47485:26:0;;;::::1;::::0;;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;;47485:26:0;;::::1;-1:-1:-1::0;;;47485:26:0;;;::::1;;;::::0;;;-1:-1:-1;45860:1658:0:o;20798:343::-;15146:5;;-1:-1:-1;;;;;15146:5:0;15132:10;:19;15124:64;;;;-1:-1:-1;;;15124:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;20923:28:0;::::1;20915:69;;;;-1:-1:-1::0;;;20915:69:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;21014:42:0;::::1;;::::0;;;:26:::1;:42;::::0;;;;;;:53;;-1:-1:-1;;21014:53:0::1;::::0;::::1;;;::::0;;21082:52;::::1;::::0;::::1;::::0;21014:53;;21082:52:::1;:::i;27081:269::-:0;27294:49;;-1:-1:-1;;;27294:49:0;;-1:-1:-1;;;;;27294:12:0;;;;;:49;;27307:4;;27313:2;;27317:6;;27325:8;;27335:1;;27338;;27341;;27294:49;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27081:269;;;;;;;;:::o;18973:41::-;;;;;;;;;;;;;:::o;13288:20::-;;;-1:-1:-1;;;;;13288:20:0;;:::o;18684:74::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;36977:2114::-;37143:17;;37128:4;-1:-1:-1;;;;;31334:18:0;;31342:10;31334:18;;;;:43;;-1:-1:-1;;;;;;31356:21:0;;31372:4;31356:21;;31334:43;31330:361;;;31485:10;31443:22;31468:28;;;:16;:28;;;;;;-1:-1:-1;;;;;31468:28:0;31518;31510:68;;;;-1:-1:-1;;;31510:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;31600:38:0;;;;;;;:22;:38;;;;;;;;:44;;;;;;;;;;;;31592:88;;;;-1:-1:-1;;;31592:88:0;;;;;;;:::i;:::-;31330:361;;-1:-1:-1;;;;;37216:16:0;::::1;37208:49;;;;-1:-1:-1::0;;;37208:49:0::1;;;;;;;:::i;:::-;37327:12;-1:-1:-1::0;;;;;37342:22:0;::::1;::::0;:43:::1;;37379:6;37342:43;;;37367:9;37342:43;37327:58;;37395:19;;:::i;:::-;-1:-1:-1::0;;;;;;37417:13:0;::::1;;::::0;;;:6:::1;:13;::::0;;;;;;;;37395:35;;;;::::1;::::0;;;;-1:-1:-1;;;;;37395:35:0;;::::1;::::0;;-1:-1:-1;;;37395:35:0;;::::1;;::::0;;::::1;::::0;37444:10;37440:366:::1;;37614:26;:5:::0;37627:6;37635:4:::1;37614:12;:26::i;:::-;37606:34;;37440:366;;;37766:29;:5:::0;37782;37789::::1;37766:15;:29::i;:::-;37757:38;;37440:366;-1:-1:-1::0;;;;;37841:16:0;;::::1;;::::0;;;:9:::1;:16;::::0;;;;;;;:22;;::::1;::::0;;;;;;;:33:::1;::::0;37868:5;37841:26:::1;:33::i;:::-;-1:-1:-1::0;;;;;37816:16:0;;::::1;;::::0;;;:9:::1;:16;::::0;;;;;;;:22;;::::1;::::0;;;;;;:58;37900:33:::1;37918:14;:6:::0;:12:::1;:14::i;:::-;37900:13:::0;;-1:-1:-1;;;;;37900:17:0::1;::::0;::::1;:33::i;:::-;-1:-1:-1::0;;;;;37884:49:0::1;::::0;;37956:29:::1;37971:13;:5:::0;:11:::1;:13::i;:::-;37956:10;::::0;::::1;::::0;-1:-1:-1;;;;;37956:14:0::1;::::0;::::1;:29::i;:::-;-1:-1:-1::0;;;;;37943:42:0::1;:10;::::0;::::1;:42:::0;;;29971:4:::1;-1:-1:-1::0;38128:35:0::1;::::0;:54:::1;;-1:-1:-1::0;38167:10:0::1;::::0;::::1;::::0;-1:-1:-1;;;;;38167:15:0::1;::::0;38128:54:::1;38120:89;;;;-1:-1:-1::0;;;38120:89:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;38219:13:0;;::::1;;::::0;;;:6:::1;:13;::::0;;;;;;;:21;;;;;;::::1;::::0;-1:-1:-1;;;;;;38219:21:0;;::::1;-1:-1:-1::0;;;;;38219:21:0;;::::1;;::::0;::::1;-1:-1:-1::0;;;38219:21:0;;;::::1;;::::0;;;::::1;::::0;;38279:22;::::1;38275:698;;38431:42;::::0;-1:-1:-1;;;38431:42:0;;-1:-1:-1;;;;;38445:9:0::1;38431:34;::::0;::::1;::::0;:42:::1;::::0;38466:6;;38431:42:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;38606:12;38624:2;-1:-1:-1::0;;;;;38624:7:0::1;38639:6;38624:26;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38605:45;;;38672:7;38664:49;;;;-1:-1:-1::0;;;38664:49:0::1;;;;;;;:::i;:::-;38275:698;;;;38932:30;-1:-1:-1::0;;;;;38932:18:0;::::1;38951:2:::0;38955:6;38932:18:::1;:30::i;:::-;39012:2;-1:-1:-1::0;;;;;38987:43:0::1;39006:4;-1:-1:-1::0;;;;;38987:43:0::1;38999:5;-1:-1:-1::0;;;;;38987:43:0::1;;39016:6;39024:5;38987:43;;;;;;;:::i;20569:139::-:0;20645:10;20614:28;;;;:16;:28;;;;;;:41;;-1:-1:-1;;;;;;20614:41:0;;;;;20670:31;;;20614:28;20670:31;20569:139::o;15971:51::-;;;;;;;;;;;;-1:-1:-1;;;;;15971:51:0;;:::o;21898:2631::-;-1:-1:-1;;;;;22114:28:0;;22106:68;;;;-1:-1:-1;;;22106:68:0;;;;;;;:::i;:::-;22280:6;;:16;;;;-1:-1:-1;22290:6:0;;22280:16;:26;;;;-1:-1:-1;22300:6:0;;;;22280:26;22276:2087;;;-1:-1:-1;;;;;22330:18:0;;22338:10;22330:18;22322:58;;;;-1:-1:-1;;;22322:58:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22402:22:0;;;22436:1;22402:22;;;:16;:22;;;;;;;:36;22394:74;;;;-1:-1:-1;;;22394:74:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22490:42:0;;;;;;:26;:42;;;;;;;;22482:82;;;;-1:-1:-1;;;22482:82:0;;;;;;;:::i;:::-;22276:2087;;;-1:-1:-1;;;;;22889:18:0;;22881:59;;;;-1:-1:-1;;;22881:59:0;;;;;;;:::i;:::-;23383:14;23489:40;;;;;;;;;;;;;-1:-1:-1;;;23489:40:0;;;23555:18;:16;:18::i;:::-;19358:118;23739:8;:194;;23894:39;23739:194;;;23786:69;23739:194;-1:-1:-1;;;;;24095:12:0;;;;;;:6;:12;;;;;;;;;:14;;;;;;;;23638:501;;;;;;23967:4;;24005:14;;24053:8;;24095:14;23638:501;;:::i;:::-;;;;;;;;;;;;;23599:566;;;;;;23447:740;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;23416:789;;;;;;23383:822;;24219:24;24246:26;24256:6;24264:1;24267;24270;24246:26;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24219:53;;24314:4;-1:-1:-1;;;;;24294:24:0;:16;-1:-1:-1;;;;;24294:24:0;;24286:66;;;;-1:-1:-1;;;24286:66:0;;;;;;;:::i;:::-;22276:2087;;;-1:-1:-1;;;;;24392:38:0;;;;;;;:22;:38;;;;;;;;:44;;;;;;;;;;;;;;:55;;-1:-1:-1;;24392:55:0;;;;;;;24462:60;;;;;24392:55;;24462:60;:::i;:::-;;;;;;;;21898:2631;;;;;;:::o;26174:521::-;26258:23;;26340:5;-1:-1:-1;;;;;26329:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26329:24:0;-1:-1:-1;26317:36:0;-1:-1:-1;26385:5:0;-1:-1:-1;;;;;26373:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26363:35;;26413:9;26408:281;26428:16;;;26408:281;;;26466:12;26480:19;26511:4;26530:5;;26536:1;26530:8;;;;;;;;;;;;;;;;;;:::i;:::-;26503:36;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26465:74;;;;26561:7;:24;;;;26573:12;26572:13;26561:24;26587:21;26601:6;26587:13;:21::i;:::-;26553:56;;;;;-1:-1:-1;;;26553:56:0;;;;;;;;:::i;:::-;;26638:7;26623:9;26633:1;26623:12;;;;;;;;;;;;;:22;;;;;;;;;;;26672:6;26659:7;26667:1;26659:10;;;;;;;;;;;;;;;;;:19;-1:-1:-1;;26446:3:0;;26408:281;;;;26174:521;;;;;;:::o;32534:191::-;-1:-1:-1;;;;;32681:13:0;;32648;32681;;;:6;:13;;;;;;;;:20;;;;;;;;;-1:-1:-1;;;;;32681:20:0;;;;;-1:-1:-1;;;32681:20:0;;;;;;;;;;;:37;;32702:6;32710:7;32681:20;:37::i;30415:51::-;;;;;;;;;;;;-1:-1:-1;;;;;30415:51:0;;;;-1:-1:-1;;;30415:51:0;;;;;;-1:-1:-1;;;30415:51:0;;-1:-1:-1;;;;;30415:51:0;;:::o;13314:27::-;;;-1:-1:-1;;;;;13314:27:0;;:::o;41969:550::-;42145:11;29794:3;42159:26;:6;29725:2;42159:10;:26::i;:::-;:53;;;;;;;-1:-1:-1;42222:36:0;-1:-1:-1;;;;;42222:18:0;;42241:8;42251:6;42222:18;:36::i;:::-;42269:58;;-1:-1:-1;;;42269:58:0;;-1:-1:-1;;;;;42269:20:0;;;;;:58;;42290:10;;42302:5;;42309:6;;42317:3;;42322:4;;;;42269:58;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42372:37;42397:11;:3;:9;:11::i;:::-;-1:-1:-1;;;;;42372:13:0;;;;;;:6;:13;;;;;;-1:-1:-1;;;;;42372:37:0;:24;:37::i;:::-;42346:22;42362:5;42346:15;:22::i;:::-;:63;;42338:98;;;;-1:-1:-1;;;42338:98:0;;;;;;;:::i;:::-;42503:8;-1:-1:-1;;;;;42451:61:0;42483:5;-1:-1:-1;;;;;42451:61:0;42472:8;-1:-1:-1;;;;;42451:61:0;;42490:6;42498:3;42451:61;;;;;;;:::i;:::-;;;;;;;;41969:550;;;;;;;:::o;39593:459::-;39719:4;-1:-1:-1;;;;;31334:18:0;;31342:10;31334:18;;;;:43;;-1:-1:-1;;;;;;31356:21:0;;31372:4;31356:21;;31334:43;31330:361;;;31485:10;31443:22;31468:28;;;:16;:28;;;;;;-1:-1:-1;;;;;31468:28:0;31518;31510:68;;;;-1:-1:-1;;;31510:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;31600:38:0;;;;;;;:22;:38;;;;;;;;:44;;;;;;;;;;;;31592:88;;;;-1:-1:-1;;;31592:88:0;;;;;;;:::i;:::-;31330:361;;-1:-1:-1;;;;;39761:16:0;::::1;39753:49;;;;-1:-1:-1::0;;;39753:49:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;39897:16:0;;::::1;;::::0;;;:9:::1;:16;::::0;;;;;;;:22;;::::1;::::0;;;;;;;:33:::1;::::0;39924:5;39897:26:::1;:33::i;:::-;-1:-1:-1::0;;;;;39872:16:0;;::::1;;::::0;;;:9:::1;:16;::::0;;;;;;;:22;;::::1;::::0;;;;;;;;:58;;;;39963:20;;::::1;::::0;;;;:31:::1;::::0;39988:5;39963:24:::1;:31::i;:::-;-1:-1:-1::0;;;;;39940:16:0;;::::1;;::::0;;;:9:::1;:16;::::0;;;;;;;:20;;::::1;::::0;;;;;;;;;:54;;;;40010:35;;;::::1;::::0;::::1;::::0;::::1;::::0;40039:5;;40010:35:::1;:::i;:::-;;;;;;;;39593:459:::0;;;;;:::o;43414:932::-;43636:21;43674:6;-1:-1:-1;;;;;43660:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43660:28:0;-1:-1:-1;43636:52:0;-1:-1:-1;43713:6:0;43699:11;43736:226;43760:3;43756:1;:7;43736:226;;;43784:14;43801:7;;43809:1;43801:10;;;;;;;;;;;;;43784:27;;29794:3;43835:26;29725:2;43835:6;:10;;:26;;;;:::i;:::-;:53;;;;;;43825:4;43830:1;43825:7;;;;;;;;;;;;;:63;;;;;43903:48;43926:9;;43936:1;43926:12;;;;;;;;;;;;;;;;;;;;:::i;:::-;43940:7;;43948:1;43940:10;;;;;;;;;;;;;43903:6;;43910:1;43903:9;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;43903:22:0;;:48;:22;:48::i;:::-;-1:-1:-1;43765:3:0;;43736:226;;;-1:-1:-1;43972:66:0;;-1:-1:-1;;;43972:66:0;;-1:-1:-1;;;;;43972:25:0;;;;;:66;;43998:10;;44010:6;;;;44018:7;;;;44027:4;;44033;;;;43972:66;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44054:9;44049:291;44073:3;44069:1;:7;44049:291;;;44097:12;44112:6;;44119:1;44112:9;;;;;;;;;;;;;;;;;;;;:::i;:::-;44097:24;;44169:41;44194:15;:4;44199:1;44194:7;;;;;;;;;;;;;;:13;:15::i;:::-;-1:-1:-1;;;;;44169:13:0;;;;;;:6;:13;;;;;;-1:-1:-1;;;;;44169:41:0;:24;:41::i;:::-;44143:22;44159:5;44143:15;:22::i;:::-;:67;;44135:102;;;;-1:-1:-1;;;44135:102:0;;;;;;;:::i;:::-;44316:9;;44326:1;44316:12;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;44256:73:0;44288:5;-1:-1:-1;;;;;44256:73:0;44277:8;-1:-1:-1;;;;;44256:73:0;;44295:7;;44303:1;44295:10;;;;;;;;;;;;;44307:4;44312:1;44307:7;;;;;;;;;;;;;;44256:73;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;44078:3:0;;44049:291;;30157:63;;;;;;;;;;;;;;;;;;;;;;;;:::o;9775:418::-;9924:13;;9896:12;;-1:-1:-1;;;;;9924:18:0;9920:267;;-1:-1:-1;9965:7:0;9920:267;;;10036:13;;10022:10;;;;-1:-1:-1;;;;;10010:39:0;;;;:23;;:7;;:23;:11;:23::i;:::-;:39;;;;;;10003:46;;10067:7;:57;;;;;10117:7;10104:5;:10;;;-1:-1:-1;;;;;10078:36:0;:23;10087:5;:13;;;-1:-1:-1;;;;;10078:23:0;:4;:8;;:23;;;;:::i;:::-;:36;;;;;;:46;10067:57;10063:114;;;10151:11;:4;10160:1;10151:8;:11::i;10063:114::-;9775:418;;;;;:::o;7655:158::-;7704:9;-1:-1:-1;;;;;7733:16:0;;;7725:57;;;;-1:-1:-1;;;7725:57:0;;;;;;;:::i;:::-;-1:-1:-1;7804:1:0;7655:158::o;8262:139::-;8354:5;;;-1:-1:-1;;;;;8349:16:0;;;;;;;;8341:53;;;;-1:-1:-1;;;8341:53:0;;;;;;;:::i;:::-;8262:139;;;;:::o;10283:424::-;10404:15;10435:5;:10;;;-1:-1:-1;;;;;10435:15:0;10449:1;10435:15;10431:270;;;-1:-1:-1;10476:4:0;10431:270;;;10547:10;;;;10530:13;;-1:-1:-1;;;;;10521:36:0;;;;:23;;:4;;:23;:8;:23::i;:::-;:36;;;;;;10511:46;;10575:7;:57;;;;;10628:4;10612:5;:13;;;-1:-1:-1;;;;;10586:39:0;:23;10598:5;:10;;;-1:-1:-1;;;;;10586:23:0;:7;:11;;:23;;;;:::i;31969:167::-;-1:-1:-1;;;;;32101:19:0;;32031:14;32101:19;;;:12;:19;;;;;;:27;32066:30;;-1:-1:-1;;;32066:30:0;;32031:14;;32066:63;;-1:-1:-1;;;32101:27:0;;;-1:-1:-1;;;;;32101:27:0;;32066:15;;:30;;32090:4;;32066:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:34;;:63::i;7354:136::-;7446:5;;;7441:16;;;;7433:50;;;;-1:-1:-1;;;7433:50:0;;;;;;;:::i;7209:139::-;7301:5;;;7296:16;;;;7288:53;;;;-1:-1:-1;;;7288:53:0;;;;;;;:::i;6547:374::-;6687:12;6701:17;6730:5;-1:-1:-1;;;;;6722:19:0;5578:10;6765:17;;6784:4;6790:2;6794:6;6742:59;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;6742:59:0;;;;;;;;;;;;;;-1:-1:-1;;;;;6742:59:0;-1:-1:-1;;;;;;6742:59:0;;;;;;;;;;6722:80;;;;6742:59;6722:80;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6686:116;;;;6820:7;:57;;;;-1:-1:-1;6832:11:0;;:16;;:44;;;6863:4;6852:24;;;;;;;;;;;;:::i;:::-;6812:102;;;;-1:-1:-1;;;6812:102:0;;;;;;;:::i;:::-;6547:374;;;;;;:::o;19907:211::-;19981:7;19080:80;20061:24;20087:7;20104:4;20017:93;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;20007:104;;;;;;20000:111;;19907:211;;;;:::o;8407:136::-;8499:5;;;-1:-1:-1;;;;;8494:16:0;;;;;;;;8486:50;;;;-1:-1:-1;;;8486:50:0;;;;;;;:::i;7496:153::-;7554:9;7583:6;;;:30;;-1:-1:-1;;7598:5:0;;;7612:1;7607;7598:5;7607:1;7593:15;;;;;:20;7583:30;7575:67;;;;-1:-1:-1;;;7575:67:0;;;;;;;:::i;5899:333::-;6013:12;6027:17;6056:5;-1:-1:-1;;;;;6048:19:0;5489:10;6091:12;;6105:2;6109:6;6068:48;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;6068:48:0;;;;;;;;;;;;;;-1:-1:-1;;;;;6068:48:0;-1:-1:-1;;;;;;6068:48:0;;;;;;;;;;6048:69;;;;6068:48;6048:69;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6012:105;;;;6135:7;:57;;;;-1:-1:-1;6147:11:0;;:16;;:44;;;6178:4;6167:24;;;;;;;;;;;;:::i;:::-;6127:98;;;;-1:-1:-1;;;6127:98:0;;;;;;;:::i;:::-;5899:333;;;;;:::o;7819:153::-;7867:8;-1:-1:-1;;;;;7895:15:0;;;7887:55;;;;-1:-1:-1;;;7887:55:0;;;;;;;:::i;12518:177::-;12595:18;12654:34;12672:15;:7;:13;:15::i;:::-;12654:13;;-1:-1:-1;;;;;12654:13:0;;:17;:34::i;:::-;12638:50;;-1:-1:-1;;;;;;12638:50:0;-1:-1:-1;;;;;12638:50:0;;;;;;;;;;-1:-1:-1;12638:50:0;;;-1:-1:-1;12518:177:0:o;12823:::-;12900:18;12959:34;12977:15;:7;:13;:15::i;:::-;12959:13;;-1:-1:-1;;;;;12959:13:0;;:17;:34::i;24858:487::-;24930:13;25091:2;25070:11;:18;:23;25066:67;;;-1:-1:-1;25095:38:0;;;;;;;;;;;;;;;;;;;25066:67;25233:4;25220:11;25216:22;25201:37;;25275:11;25264:33;;;;;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;160:352::-;;;290:3;283:4;275:6;271:17;267:27;257:2;;-1:-1;;298:12;257:2;-1:-1;328:20;;-1:-1;;;;;357:30;;354:2;;;-1:-1;;390:12;354:2;434:4;426:6;422:17;410:29;;485:3;434:4;;469:6;465:17;426:6;451:32;;448:41;445:2;;;502:1;;492:12;445:2;250:262;;;;;:::o;2101:336::-;;;2215:3;2208:4;2200:6;2196:17;2192:27;2182:2;;-1:-1;;2223:12;2182:2;-1:-1;2253:20;;-1:-1;;;;;2282:30;;2279:2;;;-1:-1;;2315:12;2279:2;2359:4;2351:6;2347:17;2335:29;;2410:3;2359:4;2390:17;2351:6;2376:32;;2373:41;2370:2;;;2427:1;;2417:12;2636:156;2716:20;;2741:46;2716:20;2741:46;:::i;4154:126::-;4219:20;;66102:4;66091:16;;69362:33;;69352:2;;69409:1;;69399:12;4287:241;;4391:2;4379:9;4370:7;4366:23;4362:32;4359:2;;;-1:-1;;4397:12;4359:2;85:6;72:20;97:33;124:5;97:33;:::i;4535:366::-;;;4656:2;4644:9;4635:7;4631:23;4627:32;4624:2;;;-1:-1;;4662:12;4624:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;4714:63;-1:-1;4814:2;4853:22;;72:20;97:33;72:20;97:33;:::i;:::-;4822:63;;;;4618:283;;;;;:::o;4908:859::-;;;;;;;5092:3;5080:9;5071:7;5067:23;5063:33;5060:2;;;-1:-1;;5099:12;5060:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;5151:63;-1:-1;5251:2;5290:22;;72:20;97:33;72:20;97:33;:::i;:::-;5259:63;-1:-1;5359:2;5395:22;;1748:20;1773:30;1748:20;1773:30;:::i;:::-;5367:60;-1:-1;5482:51;5525:7;5464:2;5501:22;;5482:51;:::i;:::-;5472:61;;5570:3;5614:9;5610:22;2017:20;5579:63;;5679:3;5723:9;5719:22;2017:20;5688:63;;5054:713;;;;;;;;:::o;5774:360::-;;;5892:2;5880:9;5871:7;5867:23;5863:32;5860:2;;;-1:-1;;5898:12;5860:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;5950:63;-1:-1;6050:2;6086:22;;1748:20;1773:30;1748:20;1773:30;:::i;6141:479::-;;;;6273:2;6261:9;6252:7;6248:23;6244:32;6241:2;;;-1:-1;;6279:12;6241:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;6331:63;-1:-1;6431:2;6467:22;;1748:20;1773:30;1748:20;1773:30;:::i;:::-;6439:60;-1:-1;6536:2;6572:22;;1748:20;1773:30;1748:20;1773:30;:::i;:::-;6544:60;;;;6235:385;;;;;:::o;6627:609::-;;;;;6781:2;6769:9;6760:7;6756:23;6752:32;6749:2;;;-1:-1;;6787:12;6749:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;6839:63;-1:-1;6967:2;6952:18;;6939:32;-1:-1;;;;;6980:30;;6977:2;;;-1:-1;;7013:12;6977:2;7051:64;7107:7;7098:6;7087:9;7083:22;7051:64;:::i;:::-;7033:82;;-1:-1;7033:82;-1:-1;;7152:2;7188:22;;1748:20;1773:30;1748:20;1773:30;:::i;:::-;6743:493;;;;-1:-1;6743:493;;-1:-1;;6743:493::o;7243:538::-;;;;7407:2;7395:9;7386:7;7382:23;7378:32;7375:2;;;-1:-1;;7413:12;7375:2;7471:17;7458:31;-1:-1;;;;;7501:6;7498:30;7495:2;;;-1:-1;;7531:12;7495:2;7569:91;7652:7;7643:6;7632:9;7628:22;7569:91;:::i;:::-;7551:109;;-1:-1;7551:109;-1:-1;;7697:2;7733:22;;1748:20;1773:30;1748:20;1773:30;:::i;7788:257::-;;7900:2;7888:9;7879:7;7875:23;7871:32;7868:2;;;-1:-1;;7906:12;7868:2;1896:6;1890:13;1908:30;1932:5;1908:30;:::i;8052:1415::-;;;;;;;;;;8388:3;8376:9;8367:7;8363:23;8359:33;8356:2;;;-1:-1;;8395:12;8356:2;2552:6;2539:20;2564:60;2618:5;2564:60;:::i;:::-;8447:90;-1:-1;8602:2;8587:18;;8574:32;-1:-1;;;;;8615:30;;;8612:2;;;-1:-1;;8648:12;8612:2;8686:80;8758:7;8749:6;8738:9;8734:22;8686:80;:::i;:::-;8668:98;;-1:-1;8668:98;-1:-1;8831:2;8816:18;;8803:32;;-1:-1;8844:30;;;8841:2;;;-1:-1;;8877:12;8841:2;8915:93;9000:7;8991:6;8980:9;8976:22;8915:93;:::i;:::-;8897:111;;-1:-1;8897:111;-1:-1;9073:2;9058:18;;9045:32;;-1:-1;9086:30;;;9083:2;;;-1:-1;;9119:12;9083:2;9157:80;9229:7;9220:6;9209:9;9205:22;9157:80;:::i;:::-;9139:98;;-1:-1;9139:98;-1:-1;9302:3;9287:19;;9274:33;;-1:-1;9316:30;;;9313:2;;;-1:-1;;9349:12;9313:2;;9387:64;9443:7;9434:6;9423:9;9419:22;9387:64;:::i;:::-;9369:82;;;;;;;;;;8350:1117;;;;;;;;;;;:::o;9748:392::-;;;9882:2;9870:9;9861:7;9857:23;9853:32;9850:2;;;-1:-1;;9888:12;10147:643;;;;;10315:3;10303:9;10294:7;10290:23;10286:33;10283:2;;;-1:-1;;10322:12;10283:2;2729:6;2716:20;2741:46;2781:5;2741:46;:::i;:::-;10374:76;-1:-1;10487:2;10526:22;;72:20;97:33;72:20;97:33;:::i;:::-;10495:63;-1:-1;10595:2;10634:22;;72:20;97:33;72:20;97:33;:::i;:::-;10277:513;;;;-1:-1;10603:63;;10703:2;10742:22;3808:20;;-1:-1;;10277:513::o;10797:769::-;;;;;;10982:3;10970:9;10961:7;10957:23;10953:33;10950:2;;;-1:-1;;10989:12;10950:2;2729:6;2716:20;2741:46;2781:5;2741:46;:::i;:::-;11041:76;-1:-1;11154:2;11193:22;;72:20;97:33;72:20;97:33;:::i;:::-;11162:63;-1:-1;11262:2;11301:22;;72:20;97:33;72:20;97:33;:::i;:::-;10944:622;;;;-1:-1;11270:63;;11370:2;11409:22;;3808:20;;-1:-1;11478:3;11518:22;3808:20;;10944:622;-1:-1;;10944:622::o;11573:1143::-;;;;;;;;;11807:3;11795:9;11786:7;11782:23;11778:33;11775:2;;;-1:-1;;11814:12;11775:2;2729:6;2716:20;2741:46;2781:5;2741:46;:::i;:::-;11866:76;-1:-1;11979:2;12018:22;;72:20;97:33;72:20;97:33;:::i;:::-;11987:63;-1:-1;12087:2;12126:22;;72:20;97:33;72:20;97:33;:::i;:::-;12095:63;-1:-1;12195:2;12234:22;;3808:20;;-1:-1;12303:3;12343:22;;3808:20;;-1:-1;12431:51;12474:7;12412:3;12450:22;;12431:51;:::i;:::-;12421:61;;12519:3;12563:9;12559:22;2017:20;12528:63;;12628:3;12672:9;12668:22;2017:20;12637:63;;11769:947;;;;;;;;;;;:::o;12723:955::-;;;;;;;12961:3;12949:9;12940:7;12936:23;12932:33;12929:2;;;-1:-1;;12968:12;12929:2;2729:6;2716:20;2741:46;2781:5;2741:46;:::i;:::-;13020:76;-1:-1;13133:2;13172:22;;72:20;97:33;72:20;97:33;:::i;:::-;13141:63;-1:-1;13269:2;13254:18;;13241:32;-1:-1;;;;;13282:30;;;13279:2;;;-1:-1;;13315:12;13279:2;13353:80;13425:7;13416:6;13405:9;13401:22;13353:80;:::i;:::-;13335:98;;-1:-1;13335:98;-1:-1;13498:2;13483:18;;13470:32;;-1:-1;13511:30;;;13508:2;;;-1:-1;;13544:12;13508:2;;13582:80;13654:7;13645:6;13634:9;13630:22;13582:80;:::i;:::-;12923:755;;;;-1:-1;12923:755;;-1:-1;12923:755;;13564:98;;12923:755;-1:-1;;;12923:755::o;13685:511::-;;;;13833:2;13821:9;13812:7;13808:23;13804:32;13801:2;;;-1:-1;;13839:12;13801:2;2729:6;2716:20;2741:46;2781:5;2741:46;:::i;:::-;13891:76;-1:-1;14004:2;14040:22;;1748:20;1773:30;1748:20;1773:30;:::i;:::-;13795:401;;14012:60;;-1:-1;;;14109:2;14148:22;;;;3808:20;;13795:401::o;14636:511::-;;;;14784:2;14772:9;14763:7;14759:23;14755:32;14752:2;;;-1:-1;;14790:12;14752:2;2729:6;2716:20;2741:46;2781:5;2741:46;:::i;:::-;14842:76;-1:-1;14955:2;14994:22;;3808:20;;-1:-1;15063:2;15099:22;;1748:20;1773:30;1748:20;1773:30;:::i;15154:390::-;;;15287:2;15275:9;15266:7;15262:23;15258:32;15255:2;;;-1:-1;;15293:12;15255:2;2729:6;2716:20;2741:46;2781:5;2741:46;:::i;:::-;15345:76;-1:-1;15458:2;15496:22;;4085:20;-1:-1;;;;;65989:30;;69241:34;;69231:2;;-1:-1;;69279:12;15551:935;;;;;;;15776:3;15764:9;15755:7;15751:23;15747:33;15744:2;;;-1:-1;;15783:12;15744:2;2900:6;2887:20;2912:54;2960:5;2912:54;:::i;:::-;15835:84;-1:-1;15956:2;15995:22;;72:20;97:33;72:20;97:33;:::i;:::-;15964:63;-1:-1;16064:2;16116:22;;2716:20;2741:46;2716:20;2741:46;:::i;:::-;16072:76;-1:-1;16185:2;16224:22;;3808:20;;-1:-1;16321:3;16306:19;;16293:33;-1:-1;;;;;16335:30;;16332:2;;;-1:-1;;16368:12;16332:2;16406:64;16462:7;16453:6;16442:9;16438:22;16406:64;:::i;16493:261::-;;16607:2;16595:9;16586:7;16582:23;16578:32;16575:2;;;-1:-1;;16613:12;16575:2;-1:-1;3226:13;;16569:185;-1:-1;16569:185::o;16761:362::-;;16886:2;16874:9;16865:7;16861:23;16857:32;16854:2;;;-1:-1;;16892:12;16854:2;16943:17;16937:24;-1:-1;;;;;16981:18;16973:6;16970:30;16967:2;;;-1:-1;;17003:12;16967:2;17090:6;17079:9;17075:22;;;3402:3;3395:4;3387:6;3383:17;3379:27;3369:2;;-1:-1;;3410:12;3369:2;3450:6;3444:13;16981:18;61078:6;61075:30;61072:2;;;-1:-1;;61108:12;61072:2;60741;60735:9;61181;61162:17;;-1:-1;;61158:33;60767:17;;16886:2;60767:17;60827:34;;;60863:22;;;60824:62;60821:2;;;-1:-1;;60889:12;60821:2;60741;60908:22;3543:21;;;3643:16;;;16886:2;3643:16;3640:25;-1:-1;3637:2;;;-1:-1;;3668:12;3637:2;3688:39;3720:6;16886:2;3619:5;3615:16;16886:2;3585:6;3581:17;3688:39;:::i;:::-;17023:84;16848:275;-1:-1;;;;;;16848:275::o;17769:199::-;-1:-1;;;;;65783:54;24020:63;;17957:4;17948:14;;17862:106::o;21395:690::-;;21588:5;61989:12;63196:6;63191:3;63184:19;63233:4;;63228:3;63224:14;21600:93;;63233:4;21764:5;61383:14;-1:-1;21803:260;21828:6;21825:1;21822:13;21803:260;;;21889:13;;22376:37;;18130:14;;;;62670;;;;21850:1;21843:9;21803:260;;;-1:-1;22069:10;;21519:566;-1:-1;;;;;21519:566::o;22607:297::-;;63196:6;63191:3;63184:19;67384:6;67379:3;63233:4;63228:3;63224:14;67361:30;-1:-1;63233:4;67431:6;63228:3;67422:16;;67415:27;63233:4;61181:9;;67902:2;22890:6;67882:14;67878:28;63228:3;22859:39;;22852:46;;22707:197;;;;;:::o;23253:323::-;;23385:5;61989:12;63196:6;63191:3;63184:19;23468:52;23513:6;63233:4;63228:3;63224:14;63233:4;23494:5;23490:16;23468:52;:::i;:::-;61181:9;67882:14;-1:-1;;67878:28;23532:39;;;;63233:4;23532:39;;23333:243;-1:-1;;23333:243::o;36019:291::-;;67384:6;67379:3;67374;67361:30;67422:16;;67415:27;;;67422:16;36163:147;-1:-1;36163:147::o;36317:271::-;;23743:5;61989:12;23854:52;23899:6;23894:3;23887:4;23880:5;23876:16;23854:52;:::i;:::-;23918:16;;;;;36451:137;-1:-1;;36451:137::o;36595:553::-;;23743:5;61989:12;23854:52;23899:6;23894:3;23887:4;23880:5;23876:16;23854:52;:::i;:::-;23918:16;;;;22376:37;;;-1:-1;23887:4;37000:12;;22376:37;37111:12;;;36787:361;-1:-1;36787:361::o;37155:379::-;37519:10;37343:191::o;37541:222::-;-1:-1;;;;;65783:54;;;;18378:37;;37668:2;37653:18;;37639:124::o;38015:1298::-;-1:-1;;;;;65783:54;;18237:58;;38473:3;38600:2;38585:18;;;38578:48;;;38015:1298;;38458:19;;;;20287:86;20366:6;38458:19;20287:86;:::i;:::-;20280:93;;20471:21;;;-1:-1;20498:330;20523:6;20520:1;20517:13;20498:330;;;38600:2;20632:6;64757:12;20653:76;20725:3;64718:52;64757:12;20632:6;64718:52;:::i;:::-;20653:76;:::i;:::-;20736:85;;-1:-1;20646:83;-1:-1;20545:1;20538:9;20498:330;;;20502:14;38819:9;38813:4;38809:20;38804:2;38793:9;38789:18;38782:48;21035:86;21114:6;21109:3;21035:86;:::i;:::-;21028:93;-1:-1;;;;;;;21137:78;;21134:2;;;-1:-1;;21218:12;21134:2;21249:17;;21278:43;21249:17;21309:3;21302:5;21278:43;:::i;:::-;21334:16;39000:20;;;38995:2;38980:18;;38973:48;39035:108;21334:16;39129:6;39035:108;:::i;:::-;39027:116;;39192:9;39186:4;39182:20;39176:3;39165:9;39161:19;39154:49;39217:86;39298:4;39289:6;39281;39217:86;:::i;:::-;39209:94;38444:869;-1:-1;;;;;;;;;;;38444:869::o;39320:814::-;-1:-1;;;;;65783:54;;;18237:58;;65783:54;;39794:2;39779:18;;24020:63;39877:2;39862:18;;22376:37;;;39960:2;39945:18;;22376:37;;;65794:42;39997:3;39982:19;;39975:49;;;39320:814;;40038:86;;39593:19;;40110:6;40102;40038:86;:::i;:::-;40030:94;39579:555;-1:-1;;;;;;;;39579:555::o;40141:444::-;-1:-1;;;;;65783:54;;;18378:37;;65783:54;;;;40488:2;40473:18;;18378:37;40571:2;40556:18;;22376:37;;;;40324:2;40309:18;;40295:290::o;40592:884::-;-1:-1;;;;;65783:54;;;18378:37;;65783:54;;;;41048:2;41033:18;;18378:37;41131:2;41116:18;;22376:37;;;;41214:2;41199:18;;22376:37;;;;66102:4;66091:16;41293:3;41278:19;;35972:35;65794:42;41362:19;;22376:37;41461:3;41446:19;;22376:37;;;;40883:3;40868:19;;40854:622::o;41483:333::-;-1:-1;;;;;65783:54;;;;18378:37;;41802:2;41787:18;;22376:37;41638:2;41623:18;;41609:207::o;41823:653::-;42090:2;42104:47;;;61989:12;;42075:18;;;63184:19;;;41823:653;;63233:4;;63224:14;;;;61383;;;41823:653;18845:251;18870:6;18867:1;18864:13;18845:251;;;18931:13;;64948;64941:21;22148:34;;17542:14;;;;62670;;;;18892:1;18885:9;18845:251;;;18849:14;;;42315:9;42309:4;42305:20;63233:4;42289:9;42285:18;42278:48;42340:126;19373:5;61989:12;19392:95;19480:6;19475:3;19392:95;:::i;:::-;19385:102;;;;;63233:4;19544:6;19540:17;19535:3;19531:27;63233:4;19638:5;61383:14;-1:-1;19677:357;19702:6;19699:1;19696:13;19677:357;;;19764:9;19758:4;19754:20;19749:3;19742:33;17690:64;17750:3;19809:6;19803:13;17690:64;:::i;:::-;20013:14;;;;19823:90;-1:-1;62670:14;;;;18892:1;19717:9;19677:357;;;-1:-1;42332:134;;42061:415;-1:-1;;;;;;;;;42061:415::o;42483:210::-;64948:13;;64941:21;22148:34;;42604:2;42589:18;;42575:118::o;42700:222::-;22376:37;;;42827:2;42812:18;;42798:124::o;42929:768::-;22376:37;;;43355:2;43340:18;;22376:37;;;;-1:-1;;;;;65783:54;;;43438:2;43423:18;;18378:37;65783:54;;43521:2;43506:18;;18378:37;64948:13;64941:21;43598:3;43583:19;;22148:34;65794:42;43667:19;;22376:37;43190:3;43175:19;;43161:536::o;43704:556::-;22376:37;;;44080:2;44065:18;;22376:37;;;;44163:2;44148:18;;22376:37;-1:-1;;;;;65783:54;44246:2;44231:18;;18378:37;43915:3;43900:19;;43886:374::o;44267:548::-;22376:37;;;66102:4;66091:16;;;;44635:2;44620:18;;35972:35;44718:2;44703:18;;22376:37;44801:2;44786:18;;22376:37;44474:3;44459:19;;44445:370::o;44822:326::-;;44977:2;44998:17;44991:47;45052:86;44977:2;44966:9;44962:18;45124:6;45116;45052:86;:::i;45418:310::-;;45565:2;45586:17;45579:47;45640:78;45565:2;45554:9;45550:18;45704:6;45640:78;:::i;45735:416::-;45935:2;45949:47;;;25367:2;45920:18;;;63184:19;-1:-1;;;63224:14;;;25383:44;25446:12;;;45906:245::o;46158:416::-;46358:2;46372:47;;;25697:2;46343:18;;;63184:19;25733:25;63224:14;;;25713:46;25778:12;;;46329:245::o;46581:416::-;46781:2;46795:47;;;26029:2;46766:18;;;63184:19;26065:30;63224:14;;;26045:51;26115:12;;;46752:245::o;47004:416::-;47204:2;47218:47;;;26366:2;47189:18;;;63184:19;26402:29;63224:14;;;26382:50;26451:12;;;47175:245::o;47427:416::-;47627:2;47641:47;;;26702:2;47612:18;;;63184:19;26738:30;63224:14;;;26718:51;26788:12;;;47598:245::o;47850:416::-;48050:2;48064:47;;;27039:2;48035:18;;;63184:19;-1:-1;;;63224:14;;;27055:45;27119:12;;;48021:245::o;48273:416::-;48473:2;48487:47;;;27370:2;48458:18;;;63184:19;-1:-1;;;63224:14;;;27386:44;27449:12;;;48444:245::o;48696:416::-;48896:2;48910:47;;;27700:2;48881:18;;;63184:19;-1:-1;;;63224:14;;;27716:42;27777:12;;;48867:245::o;49119:416::-;49319:2;49333:47;;;28028:2;49304:18;;;63184:19;28064:30;63224:14;;;28044:51;28114:12;;;49290:245::o;49542:416::-;49742:2;49756:47;;;28365:2;49727:18;;;63184:19;28401:26;63224:14;;;28381:47;28447:12;;;49713:245::o;49965:416::-;50165:2;50179:47;;;28698:2;50150:18;;;63184:19;28734:25;63224:14;;;28714:46;28779:12;;;50136:245::o;50388:416::-;50588:2;50602:47;;;29030:2;50573:18;;;63184:19;-1:-1;;;63224:14;;;29046:43;29108:12;;;50559:245::o;50811:416::-;51011:2;51025:47;;;29359:2;50996:18;;;63184:19;29395:28;63224:14;;;29375:49;29443:12;;;50982:245::o;51234:416::-;51434:2;51448:47;;;51419:18;;;63184:19;29730:34;63224:14;;;29710:55;29784:12;;;51405:245::o;51657:416::-;51857:2;51871:47;;;30035:2;51842:18;;;63184:19;30071:33;63224:14;;;30051:54;30124:12;;;51828:245::o;52080:416::-;52280:2;52294:47;;;52265:18;;;63184:19;30411:34;63224:14;;;30391:55;30465:12;;;52251:245::o;52503:416::-;52703:2;52717:47;;;30716:2;52688:18;;;63184:19;30752:29;63224:14;;;30732:50;30801:12;;;52674:245::o;52926:416::-;53126:2;53140:47;;;31052:2;53111:18;;;63184:19;31088:27;63224:14;;;31068:48;31135:12;;;53097:245::o;53349:416::-;53549:2;53563:47;;;31386:2;53534:18;;;63184:19;31422:31;63224:14;;;31402:52;31473:12;;;53520:245::o;53772:416::-;53972:2;53986:47;;;53957:18;;;63184:19;32065:34;63224:14;;;32045:55;32119:12;;;53943:245::o;54195:416::-;54395:2;54409:47;;;32370:2;54380:18;;;63184:19;32406:29;63224:14;;;32386:50;32455:12;;;54366:245::o;54618:416::-;54818:2;54832:47;;;32706:2;54803:18;;;63184:19;32742:29;63224:14;;;32722:50;32791:12;;;54789:245::o;55041:416::-;55241:2;55255:47;;;55226:18;;;63184:19;33078:34;63224:14;;;33058:55;33132:12;;;55212:245::o;55464:416::-;55664:2;55678:47;;;33383:2;55649:18;;;63184:19;33419:30;63224:14;;;33399:51;33469:12;;;55635:245::o;55887:416::-;56087:2;56101:47;;;33720:2;56072:18;;;63184:19;-1:-1;;;63224:14;;;33736:45;33800:12;;;56058:245::o;56310:416::-;56510:2;56524:47;;;34051:2;56495:18;;;63184:19;34087:29;63224:14;;;34067:50;34136:12;;;56481:245::o;56733:416::-;56933:2;56947:47;;;34387:2;56918:18;;;63184:19;34423:31;63224:14;;;34403:52;34474:12;;;56904:245::o;57156:416::-;57356:2;57370:47;;;34725:2;57341:18;;;63184:19;34761:26;63224:14;;;34741:47;34807:12;;;57327:245::o;57579:416::-;57779:2;57793:47;;;57764:18;;;63184:19;35094:34;63224:14;;;35074:55;35148:12;;;57750:245::o;58002:222::-;-1:-1;;;;;65663:46;;;;35365:50;;58129:2;58114:18;;58100:124::o;58231:349::-;-1:-1;;;;;65663:46;;;;35365:50;;-1:-1;;;;;65783:54;58566:2;58551:18;;18237:58;58394:2;58379:18;;58365:215::o;58587:333::-;-1:-1;;;;;65663:46;;;35245:37;;65663:46;;58906:2;58891:18;;35245:37;58742:2;58727:18;;58713:207::o;59156:333::-;22376:37;;;59475:2;59460:18;;22376:37;59311:2;59296:18;;59282:207::o;59496:220::-;-1:-1;;;;;65989:30;;;;35727:49;;59622:2;59607:18;;59593:123::o;59723:436::-;-1:-1;;;;;65989:30;;;35857:36;;65989:30;;;;60062:2;60047:18;;35857:36;-1:-1;;;;;65663:46;;;60145:2;60130:18;;35245:37;59902:2;59887:18;;59873:286::o;60166:506::-;;;60301:11;60288:25;60352:48;;60376:8;60360:14;60356:29;60352:48;60332:18;60328:73;60318:2;;-1:-1;;60405:12;60318:2;60432:33;;60486:18;;;-1:-1;;;;;;60513:30;;60510:2;;;-1:-1;;60546:12;60510:2;60391:4;60574:13;;-1:-1;60360:14;60606:38;;;60596:49;;60593:2;;;60658:1;;60648:12;67303:145;67384:6;67379:3;67374;67361:30;-1:-1;67440:1;67422:16;;67415:27;67354:94::o;67457:268::-;67522:1;67529:101;67543:6;67540:1;67537:13;67529:101;;;67610:11;;;67604:18;67591:11;;;67584:39;67565:2;67558:10;67529:101;;;67645:6;67642:1;67639:13;67636:2;;;67522:1;67701:6;67696:3;67692:16;67685:27;67636:2;;67506:219;;;:::o;67919:117::-;-1:-1;;;;;65783:54;;67978:35;;67968:2;;68027:1;;68017:12;67968:2;67962:74;:::o;68043:111::-;68124:5;64948:13;64941:21;68102:5;68099:32;68089:2;;68145:1;;68135:12"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "3592800",
                "executionCost": "infinite",
                "totalCost": "infinite"
              },
              "external": {
                "DOMAIN_SEPARATOR()": "infinite",
                "balanceOf(address,address)": "infinite",
                "batch(bytes[],bool)": "infinite",
                "batchFlashLoan(address,address[],address[],uint256[],bytes)": "infinite",
                "claimOwnership()": "45090",
                "deploy(address,bytes,bool)": "infinite",
                "deposit(address,address,address,uint256,uint256)": "infinite",
                "flashLoan(address,address,address,uint256,bytes)": "infinite",
                "harvest(address,bool,uint256)": "infinite",
                "masterContractApproved(address,address)": "infinite",
                "masterContractOf(address)": "1377",
                "nonces(address)": "1314",
                "owner()": "1160",
                "pendingOwner()": "1181",
                "pendingStrategy(address)": "1400",
                "permitToken(address,address,address,uint256,uint256,uint8,bytes32,bytes32)": "infinite",
                "registerProtocol()": "22255",
                "setMasterContractApproval(address,address,bool,uint8,bytes32,bytes32)": "infinite",
                "setStrategy(address,address)": "infinite",
                "setStrategyTargetPercentage(address,uint64)": "23746",
                "strategy(address)": "1378",
                "strategyData(address)": "1519",
                "toAmount(address,uint256,bool)": "infinite",
                "toShare(address,uint256,bool)": "infinite",
                "totals(address)": "1428",
                "transfer(address,address,address,uint256)": "infinite",
                "transferMultiple(address,address,address[],uint256[])": "infinite",
                "transferOwnership(address,bool,bool)": "infinite",
                "whitelistMasterContract(address,bool)": "infinite",
                "whitelistedMasterContracts(address)": "1304",
                "withdraw(address,address,address,uint256,uint256)": "infinite"
              },
              "internal": {
                "_tokenBalanceOf(contract IERC20)": "infinite"
              }
            },
            "methodIdentifiers": {
              "DOMAIN_SEPARATOR()": "3644e515",
              "balanceOf(address,address)": "f7888aec",
              "batch(bytes[],bool)": "d2423b51",
              "batchFlashLoan(address,address[],address[],uint256[],bytes)": "f483b3da",
              "claimOwnership()": "4e71e0c8",
              "deploy(address,bytes,bool)": "1f54245b",
              "deposit(address,address,address,uint256,uint256)": "02b9446c",
              "flashLoan(address,address,address,uint256,bytes)": "f1676d37",
              "harvest(address,bool,uint256)": "66c6bb0b",
              "masterContractApproved(address,address)": "91e0eab5",
              "masterContractOf(address)": "bafe4f14",
              "nonces(address)": "7ecebe00",
              "owner()": "8da5cb5b",
              "pendingOwner()": "e30c3978",
              "pendingStrategy(address)": "5108a558",
              "permitToken(address,address,address,uint256,uint256,uint8,bytes32,bytes32)": "7c516e94",
              "registerProtocol()": "aee4d1b2",
              "setMasterContractApproval(address,address,bool,uint8,bytes32,bytes32)": "c0a47c93",
              "setStrategy(address,address)": "72cb5d97",
              "setStrategyTargetPercentage(address,uint64)": "3e2a9d4e",
              "strategy(address)": "228bfd9f",
              "strategyData(address)": "df23b45b",
              "toAmount(address,uint256,bool)": "56623118",
              "toShare(address,uint256,bool)": "da5139ca",
              "totals(address)": "4ffe34db",
              "transfer(address,address,address,uint256)": "f18d03cc",
              "transferMultiple(address,address,address[],uint256[])": "0fca8843",
              "transferOwnership(address,bool,bool)": "078dfbe7",
              "whitelistMasterContract(address,bool)": "733a9d7c",
              "whitelistedMasterContracts(address)": "12a90c8a",
              "withdraw(address,address,address,uint256,uint256)": "97da6d30"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"wethToken_\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"masterContract\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"cloneAddress\",\"type\":\"address\"}],\"name\":\"LogDeploy\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"share\",\"type\":\"uint256\"}],\"name\":\"LogDeposit\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"borrower\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"feeAmount\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"LogFlashLoan\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"protocol\",\"type\":\"address\"}],\"name\":\"LogRegisterProtocol\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"masterContract\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"LogSetMasterContractApproval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"LogStrategyDivest\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"LogStrategyInvest\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"LogStrategyLoss\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"LogStrategyProfit\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"contract IStrategy\",\"name\":\"strategy\",\"type\":\"address\"}],\"name\":\"LogStrategyQueued\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"contract IStrategy\",\"name\":\"strategy\",\"type\":\"address\"}],\"name\":\"LogStrategySet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"targetPercentage\",\"type\":\"uint256\"}],\"name\":\"LogStrategyTargetPercentage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"share\",\"type\":\"uint256\"}],\"name\":\"LogTransfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"masterContract\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"LogWhiteListMasterContract\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"share\",\"type\":\"uint256\"}],\"name\":\"LogWithdraw\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes[]\",\"name\":\"calls\",\"type\":\"bytes[]\"},{\"internalType\":\"bool\",\"name\":\"revertOnFail\",\"type\":\"bool\"}],\"name\":\"batch\",\"outputs\":[{\"internalType\":\"bool[]\",\"name\":\"successes\",\"type\":\"bool[]\"},{\"internalType\":\"bytes[]\",\"name\":\"results\",\"type\":\"bytes[]\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IBatchFlashBorrower\",\"name\":\"borrower\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"receivers\",\"type\":\"address[]\"},{\"internalType\":\"contract IERC20[]\",\"name\":\"tokens\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"batchFlashLoan\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"claimOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"masterContract\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"bool\",\"name\":\"useCreate2\",\"type\":\"bool\"}],\"name\":\"deploy\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"cloneAddress\",\"type\":\"address\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"token_\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"share\",\"type\":\"uint256\"}],\"name\":\"deposit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amountOut\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"shareOut\",\"type\":\"uint256\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IFlashBorrower\",\"name\":\"borrower\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"flashLoan\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"balance\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"maxChangeAmount\",\"type\":\"uint256\"}],\"name\":\"harvest\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"masterContractApproved\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"masterContractOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pendingOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"pendingStrategy\",\"outputs\":[{\"internalType\":\"contract IStrategy\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permitToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"registerProtocol\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"masterContract\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"setMasterContractApproval\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"contract IStrategy\",\"name\":\"newStrategy\",\"type\":\"address\"}],\"name\":\"setStrategy\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"targetPercentage_\",\"type\":\"uint64\"}],\"name\":\"setStrategyTargetPercentage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"strategy\",\"outputs\":[{\"internalType\":\"contract IStrategy\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"strategyData\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"strategyStartDate\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"targetPercentage\",\"type\":\"uint64\"},{\"internalType\":\"uint128\",\"name\":\"balance\",\"type\":\"uint128\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"share\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"roundUp\",\"type\":\"bool\"}],\"name\":\"toAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"roundUp\",\"type\":\"bool\"}],\"name\":\"toShare\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"share\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"totals\",\"outputs\":[{\"internalType\":\"uint128\",\"name\":\"elastic\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"base\",\"type\":\"uint128\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"share\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"tos\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"shares\",\"type\":\"uint256[]\"}],\"name\":\"transferMultiple\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"direct\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"renounce\",\"type\":\"bool\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"masterContract\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"whitelistMasterContract\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"whitelistedMasterContracts\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"token_\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"share\",\"type\":\"uint256\"}],\"name\":\"withdraw\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amountOut\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"shareOut\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"author\":\"BoringCrypto, Keno\",\"kind\":\"dev\",\"methods\":{\"batch(bytes[],bool)\":{\"params\":{\"calls\":\"An array of inputs for each call.\",\"revertOnFail\":\"If True then reverts after a failed call and stops doing further calls.\"},\"returns\":{\"results\":\"An array with the returned data of each function call, mapped one-to-one to `calls`.\",\"successes\":\"An array indicating the success of a call, mapped one-to-one to `calls`.\"}},\"batchFlashLoan(address,address[],address[],uint256[],bytes)\":{\"params\":{\"amounts\":\"of the tokens for each receiver.\",\"borrower\":\"The address of the contract that implements and conforms to `IBatchFlashBorrower` and handles the flashloan.\",\"data\":\"The calldata to pass to the `borrower` contract.\",\"receivers\":\"An array of the token receivers. A one-to-one mapping with `tokens` and `amounts`.\",\"tokens\":\"The addresses of the tokens.\"}},\"deploy(address,bytes,bool)\":{\"params\":{\"data\":\"Additional abi encoded calldata that is passed to the new clone via `IMasterContract.init`.\",\"masterContract\":\"The address of the contract to clone.\",\"useCreate2\":\"Creates the clone by using the CREATE2 opcode, in this case `data` will be used as salt.\"},\"returns\":{\"cloneAddress\":\"Address of the created clone contract.\"}},\"deposit(address,address,address,uint256,uint256)\":{\"params\":{\"amount\":\"Token amount in native representation to deposit.\",\"from\":\"which account to pull the tokens.\",\"share\":\"Token amount represented in shares to deposit. Takes precedence over `amount`.\",\"to\":\"which account to push the tokens.\",\"token_\":\"The ERC-20 token to deposit.\"},\"returns\":{\"amountOut\":\"The amount deposited.\",\"shareOut\":\"The deposited amount repesented in shares.\"}},\"flashLoan(address,address,address,uint256,bytes)\":{\"params\":{\"amount\":\"of the tokens to receive.\",\"borrower\":\"The address of the contract that implements and conforms to `IFlashBorrower` and handles the flashloan.\",\"data\":\"The calldata to pass to the `borrower` contract.\",\"receiver\":\"Address of the token receiver.\",\"token\":\"The address of the token to receive.\"}},\"harvest(address,bool,uint256)\":{\"params\":{\"balance\":\"True if housekeeping should be done.\",\"maxChangeAmount\":\"The maximum amount for either pulling or pushing from/to the `IStrategy` contract.\",\"token\":\"The address of the token for which a strategy is deployed.\"}},\"setMasterContractApproval(address,address,bool,uint8,bytes32,bytes32)\":{\"params\":{\"approved\":\"If True approves access. If False revokes access.\",\"masterContract\":\"The address who gains or loses access.\",\"r\":\"Part of the signature. (See EIP-191)\",\"s\":\"Part of the signature. (See EIP-191)\",\"user\":\"The address of the user that approves or revokes access.\",\"v\":\"Part of the signature. (See EIP-191)\"}},\"setStrategy(address,address)\":{\"details\":\"Only the owner of this contract is allowed to change this.\",\"params\":{\"newStrategy\":\"The address of the contract that conforms to `IStrategy`.\",\"token\":\"The address of the token that maps to a strategy to change.\"}},\"setStrategyTargetPercentage(address,uint64)\":{\"details\":\"Only the owner of this contract is allowed to change this.\",\"params\":{\"targetPercentage_\":\"The new target in percent. Must be lesser or equal to `MAX_TARGET_PERCENTAGE`.\",\"token\":\"The address of the token that maps to a strategy to change.\"}},\"toAmount(address,uint256,bool)\":{\"details\":\"Helper function represent shares back into the `token` amount.\",\"params\":{\"roundUp\":\"If the result should be rounded up.\",\"share\":\"The amount of shares.\",\"token\":\"The ERC-20 token.\"},\"returns\":{\"amount\":\"The share amount back into native representation.\"}},\"toShare(address,uint256,bool)\":{\"details\":\"Helper function to represent an `amount` of `token` in shares.\",\"params\":{\"amount\":\"The `token` amount.\",\"roundUp\":\"If the result `share` should be rounded up.\",\"token\":\"The ERC-20 token.\"},\"returns\":{\"share\":\"The token amount represented in shares.\"}},\"transfer(address,address,address,uint256)\":{\"params\":{\"from\":\"which user to pull the tokens.\",\"share\":\"The amount of `token` in shares.\",\"to\":\"which user to push the tokens.\",\"token\":\"The ERC-20 token to transfer.\"}},\"transferMultiple(address,address,address[],uint256[])\":{\"params\":{\"from\":\"which user to pull the tokens.\",\"shares\":\"The amount of `token` in shares for each receiver in `tos`.\",\"token\":\"The ERC-20 token to transfer.\",\"tos\":\"The receivers of the tokens.\"}},\"transferOwnership(address,bool,bool)\":{\"params\":{\"direct\":\"True if `newOwner` should be set immediately. False if `newOwner` needs to use `claimOwnership`.\",\"newOwner\":\"Address of the new owner.\",\"renounce\":\"Allows the `newOwner` to be `address(0)` if `direct` and `renounce` is True. Has no effect otherwise.\"}},\"withdraw(address,address,address,uint256,uint256)\":{\"params\":{\"amount\":\"of tokens. Either one of `amount` or `share` needs to be supplied.\",\"from\":\"which user to pull the tokens.\",\"share\":\"Like above, but `share` takes precedence over `amount`.\",\"to\":\"which user to push the tokens.\",\"token_\":\"The ERC-20 token to withdraw.\"}}},\"title\":\"BentoBox\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"batch(bytes[],bool)\":{\"notice\":\"Allows batched call to self (this contract).\"},\"batchFlashLoan(address,address[],address[],uint256[],bytes)\":{\"notice\":\"Support for batched flashloans. Useful to request multiple different `tokens` in a single transaction.\"},\"claimOwnership()\":{\"notice\":\"Needs to be called by `pendingOwner` to claim ownership.\"},\"deploy(address,bytes,bool)\":{\"notice\":\"Deploys a given master Contract as a clone. Any ETH transferred with this call is forwarded to the new clone. Emits `LogDeploy`.\"},\"deposit(address,address,address,uint256,uint256)\":{\"notice\":\"Deposit an amount of `token` represented in either `amount` or `share`.\"},\"flashLoan(address,address,address,uint256,bytes)\":{\"notice\":\"Flashloan ability.\"},\"harvest(address,bool,uint256)\":{\"notice\":\"The actual process of yield farming. Executes the strategy of `token`. Optionally does housekeeping if `balance` is true. `maxChangeAmount` is relevant for skimming or withdrawing if `balance` is true.\"},\"masterContractApproved(address,address)\":{\"notice\":\"masterContract to user to approval state\"},\"masterContractOf(address)\":{\"notice\":\"Mapping from clone contracts to their masterContract.\"},\"nonces(address)\":{\"notice\":\"user nonces for masterContract approvals\"},\"permitToken(address,address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"notice\":\"Call wrapper that performs `ERC20.permit` on `token`. Lookup `IERC20.permit`.\"},\"registerProtocol()\":{\"notice\":\"Other contracts need to register with this master contract so that users can approve them for the BentoBox.\"},\"setMasterContractApproval(address,address,bool,uint8,bytes32,bytes32)\":{\"notice\":\"Approves or revokes a `masterContract` access to `user` funds.\"},\"setStrategy(address,address)\":{\"notice\":\"Sets the contract address of a new strategy that conforms to `IStrategy` for `token`. Must be called twice with the same arguments. A new strategy becomes pending first and can be activated once `STRATEGY_DELAY` is over.\"},\"setStrategyTargetPercentage(address,uint64)\":{\"notice\":\"Sets the target percentage of the strategy for `token`.\"},\"transfer(address,address,address,uint256)\":{\"notice\":\"Transfer shares from a user account to another one.\"},\"transferMultiple(address,address,address[],uint256[])\":{\"notice\":\"Transfer shares from a user account to multiple other ones.\"},\"transferOwnership(address,bool,bool)\":{\"notice\":\"Transfers ownership to `newOwner`. Either directly or claimable by the new pending owner. Can only be invoked by the current `owner`.\"},\"whitelistMasterContract(address,bool)\":{\"notice\":\"Enables or disables a contract for approval without signed message.\"},\"whitelistedMasterContracts(address)\":{\"notice\":\"masterContract to whitelisted state for approval without signed message\"},\"withdraw(address,address,address,uint256,uint256)\":{\"notice\":\"Withdraws an amount of `token` from a user account.\"}},\"notice\":\"The BentoBox is a vault for tokens. The stored tokens can be flash loaned and used in strategies. Yield from this will go to the token depositors. Rebasing tokens ARE NOT supported and WILL cause loss of funds. Any funds transfered directly onto the BentoBox will be lost, use the deposit function instead.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/bentobox/BentoBoxV1.sol\":\"BentoBoxV1\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/bentobox/BentoBoxV1.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\n// The BentoBox\\n\\n//  \\u2584\\u2584\\u2584\\u2584\\u00b7 \\u2584\\u2584\\u2584 . \\u2590 \\u2584 \\u2584\\u2584\\u2584\\u2584\\u2584      \\u2584\\u2584\\u2584\\u2584\\u00b7       \\u2590\\u2584\\u2022 \\u2584\\n//  \\u2590\\u2588 \\u2580\\u2588\\u25aa\\u2580\\u2584.\\u2580\\u00b7\\u2588\\u258c\\u2590\\u2588\\u2022\\u2588\\u2588  \\u25aa     \\u2590\\u2588 \\u2580\\u2588\\u25aa\\u25aa      \\u2588\\u258c\\u2588\\u258c\\u25aa\\n//  \\u2590\\u2588\\u2580\\u2580\\u2588\\u2584\\u2590\\u2580\\u2580\\u25aa\\u2584\\u2590\\u2588\\u2590\\u2590\\u258c \\u2590\\u2588.\\u25aa \\u2584\\u2588\\u2580\\u2584 \\u2590\\u2588\\u2580\\u2580\\u2588\\u2584 \\u2584\\u2588\\u2580\\u2584  \\u00b7\\u2588\\u2588\\u00b7\\n//  \\u2588\\u2588\\u2584\\u25aa\\u2590\\u2588\\u2590\\u2588\\u2584\\u2584\\u258c\\u2588\\u2588\\u2590\\u2588\\u258c \\u2590\\u2588\\u258c\\u00b7\\u2590\\u2588\\u258c.\\u2590\\u258c\\u2588\\u2588\\u2584\\u25aa\\u2590\\u2588\\u2590\\u2588\\u258c.\\u2590\\u258c\\u25aa\\u2590\\u2588\\u00b7\\u2588\\u258c\\n//  \\u00b7\\u2580\\u2580\\u2580\\u2580  \\u2580\\u2580\\u2580 \\u2580\\u2580 \\u2588\\u25aa \\u2580\\u2580\\u2580  \\u2580\\u2588\\u2584\\u2580\\u25aa\\u00b7\\u2580\\u2580\\u2580\\u2580  \\u2580\\u2588\\u2584\\u2580\\u25aa\\u2022\\u2580\\u2580 \\u2580\\u2580\\n\\n// This contract stores funds, handles their transfers, supports flash loans and strategies.\\n\\n// Copyright (c) 2021 BoringCrypto - All rights reserved\\n// Twitter: @Boring_Crypto\\n\\n// Special thanks to Keno for all his hard work and support\\n\\n// Version 22-Mar-2021\\n\\npragma solidity 0.6.12;\\npragma experimental ABIEncoderV2;\\n\\n// solhint-disable avoid-low-level-calls\\n// solhint-disable not-rely-on-time\\n// solhint-disable no-inline-assembly\\n\\n// File @boringcrypto/boring-solidity/contracts/interfaces/IERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ninterface IERC20 {\\n    function totalSupply() external view returns (uint256);\\n\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /// @notice EIP 2612\\n    function permit(\\n        address owner,\\n        address spender,\\n        uint256 value,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) external;\\n}\\n\\n// File contracts/interfaces/IFlashLoan.sol\\n// License-Identifier: MIT\\n\\ninterface IFlashBorrower {\\n    /// @notice The flashloan callback. `amount` + `fee` needs to repayed to msg.sender before this call returns.\\n    /// @param sender The address of the invoker of this flashloan.\\n    /// @param token The address of the token that is loaned.\\n    /// @param amount of the `token` that is loaned.\\n    /// @param fee The fee that needs to be paid on top for this loan. Needs to be the same as `token`.\\n    /// @param data Additional data that was passed to the flashloan function.\\n    function onFlashLoan(\\n        address sender,\\n        IERC20 token,\\n        uint256 amount,\\n        uint256 fee,\\n        bytes calldata data\\n    ) external;\\n}\\n\\ninterface IBatchFlashBorrower {\\n    /// @notice The callback for batched flashloans. Every amount + fee needs to repayed to msg.sender before this call returns.\\n    /// @param sender The address of the invoker of this flashloan.\\n    /// @param tokens Array of addresses for ERC-20 tokens that is loaned.\\n    /// @param amounts A one-to-one map to `tokens` that is loaned.\\n    /// @param fees A one-to-one map to `tokens` that needs to be paid on top for each loan. Needs to be the same token.\\n    /// @param data Additional data that was passed to the flashloan function.\\n    function onBatchFlashLoan(\\n        address sender,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        uint256[] calldata fees,\\n        bytes calldata data\\n    ) external;\\n}\\n\\n// File contracts/interfaces/IWETH.sol\\n// License-Identifier: MIT\\n\\ninterface IWETH {\\n    function deposit() external payable;\\n\\n    function withdraw(uint256) external;\\n}\\n\\n// File contracts/interfaces/IStrategy.sol\\n// License-Identifier: MIT\\n\\ninterface IStrategy {\\n    /// @notice Send the assets to the Strategy and call skim to invest them.\\n    /// @param amount The amount of tokens to invest.\\n    function skim(uint256 amount) external;\\n\\n    /// @notice Harvest any profits made converted to the asset and pass them to the caller.\\n    /// @param balance The amount of tokens the caller thinks it has invested.\\n    /// @param sender The address of the initiator of this transaction. Can be used for reimbursements, etc.\\n    /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.\\n    function harvest(uint256 balance, address sender) external returns (int256 amountAdded);\\n\\n    /// @notice Withdraw assets. The returned amount can differ from the requested amount due to rounding.\\n    /// @dev The `actualAmount` should be very close to the amount.\\n    /// The difference should NOT be used to report a loss. That's what harvest is for.\\n    /// @param amount The requested amount the caller wants to withdraw.\\n    /// @return actualAmount The real amount that is withdrawn.\\n    function withdraw(uint256 amount) external returns (uint256 actualAmount);\\n\\n    /// @notice Withdraw all assets in the safest way possible. This shouldn't fail.\\n    /// @param balance The amount of tokens the caller thinks it has invested.\\n    /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.\\n    function exit(uint256 balance) external returns (int256 amountAdded);\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\nlibrary BoringERC20 {\\n    bytes4 private constant SIG_SYMBOL = 0x95d89b41; // symbol()\\n    bytes4 private constant SIG_NAME = 0x06fdde03; // name()\\n    bytes4 private constant SIG_DECIMALS = 0x313ce567; // decimals()\\n    bytes4 private constant SIG_TRANSFER = 0xa9059cbb; // transfer(address,uint256)\\n    bytes4 private constant SIG_TRANSFER_FROM = 0x23b872dd; // transferFrom(address,address,uint256)\\n\\n    /// @notice Provides a safe ERC20.transfer version for different ERC-20 implementations.\\n    /// Reverts on a failed transfer.\\n    /// @param token The address of the ERC-20 token.\\n    /// @param to Transfer tokens to.\\n    /// @param amount The token amount.\\n    function safeTransfer(\\n        IERC20 token,\\n        address to,\\n        uint256 amount\\n    ) internal {\\n        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER, to, amount));\\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: Transfer failed\\\");\\n    }\\n\\n    /// @notice Provides a safe ERC20.transferFrom version for different ERC-20 implementations.\\n    /// Reverts on a failed transfer.\\n    /// @param token The address of the ERC-20 token.\\n    /// @param from Transfer tokens from.\\n    /// @param to Transfer tokens to.\\n    /// @param amount The token amount.\\n    function safeTransferFrom(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 amount\\n    ) internal {\\n        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER_FROM, from, to, amount));\\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: TransferFrom failed\\\");\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringMath.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n/// @notice A library for performing overflow-/underflow-safe math,\\n/// updated with awesomeness from of DappHub (https://github.com/dapphub/ds-math).\\nlibrary BoringMath {\\n    function add(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require(b == 0 || (c = a * b) / b == a, \\\"BoringMath: Mul Overflow\\\");\\n    }\\n\\n    function to128(uint256 a) internal pure returns (uint128 c) {\\n        require(a <= uint128(-1), \\\"BoringMath: uint128 Overflow\\\");\\n        c = uint128(a);\\n    }\\n\\n    function to64(uint256 a) internal pure returns (uint64 c) {\\n        require(a <= uint64(-1), \\\"BoringMath: uint64 Overflow\\\");\\n        c = uint64(a);\\n    }\\n\\n    function to32(uint256 a) internal pure returns (uint32 c) {\\n        require(a <= uint32(-1), \\\"BoringMath: uint32 Overflow\\\");\\n        c = uint32(a);\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint128.\\nlibrary BoringMath128 {\\n    function add(uint128 a, uint128 b) internal pure returns (uint128 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint128 a, uint128 b) internal pure returns (uint128 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint64.\\nlibrary BoringMath64 {\\n    function add(uint64 a, uint64 b) internal pure returns (uint64 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint64 a, uint64 b) internal pure returns (uint64 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint32.\\nlibrary BoringMath32 {\\n    function add(uint32 a, uint32 b) internal pure returns (uint32 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint32 a, uint32 b) internal pure returns (uint32 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringRebase.sol@v1.2.0\\n// License-Identifier: MIT\\n\\nstruct Rebase {\\n    uint128 elastic;\\n    uint128 base;\\n}\\n\\n/// @notice A rebasing library using overflow-/underflow-safe math.\\nlibrary RebaseLibrary {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n\\n    /// @notice Calculates the base value in relationship to `elastic` and `total`.\\n    function toBase(\\n        Rebase memory total,\\n        uint256 elastic,\\n        bool roundUp\\n    ) internal pure returns (uint256 base) {\\n        if (total.elastic == 0) {\\n            base = elastic;\\n        } else {\\n            base = elastic.mul(total.base) / total.elastic;\\n            if (roundUp && base.mul(total.elastic) / total.base < elastic) {\\n                base = base.add(1);\\n            }\\n        }\\n    }\\n\\n    /// @notice Calculates the elastic value in relationship to `base` and `total`.\\n    function toElastic(\\n        Rebase memory total,\\n        uint256 base,\\n        bool roundUp\\n    ) internal pure returns (uint256 elastic) {\\n        if (total.base == 0) {\\n            elastic = base;\\n        } else {\\n            elastic = base.mul(total.elastic) / total.base;\\n            if (roundUp && elastic.mul(total.base) / total.elastic < base) {\\n                elastic = elastic.add(1);\\n            }\\n        }\\n    }\\n\\n    /// @notice Add `elastic` to `total` and doubles `total.base`.\\n    /// @return (Rebase) The new total.\\n    /// @return base in relationship to `elastic`.\\n    function add(\\n        Rebase memory total,\\n        uint256 elastic,\\n        bool roundUp\\n    ) internal pure returns (Rebase memory, uint256 base) {\\n        base = toBase(total, elastic, roundUp);\\n        total.elastic = total.elastic.add(elastic.to128());\\n        total.base = total.base.add(base.to128());\\n        return (total, base);\\n    }\\n\\n    /// @notice Sub `base` from `total` and update `total.elastic`.\\n    /// @return (Rebase) The new total.\\n    /// @return elastic in relationship to `base`.\\n    function sub(\\n        Rebase memory total,\\n        uint256 base,\\n        bool roundUp\\n    ) internal pure returns (Rebase memory, uint256 elastic) {\\n        elastic = toElastic(total, base, roundUp);\\n        total.elastic = total.elastic.sub(elastic.to128());\\n        total.base = total.base.sub(base.to128());\\n        return (total, elastic);\\n    }\\n\\n    /// @notice Add `elastic` and `base` to `total`.\\n    function add(\\n        Rebase memory total,\\n        uint256 elastic,\\n        uint256 base\\n    ) internal pure returns (Rebase memory) {\\n        total.elastic = total.elastic.add(elastic.to128());\\n        total.base = total.base.add(base.to128());\\n        return total;\\n    }\\n\\n    /// @notice Subtract `elastic` and `base` to `total`.\\n    function sub(\\n        Rebase memory total,\\n        uint256 elastic,\\n        uint256 base\\n    ) internal pure returns (Rebase memory) {\\n        total.elastic = total.elastic.sub(elastic.to128());\\n        total.base = total.base.sub(base.to128());\\n        return total;\\n    }\\n\\n    /// @notice Add `elastic` to `total` and update storage.\\n    /// @return newElastic Returns updated `elastic`.\\n    function addElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {\\n        newElastic = total.elastic = total.elastic.add(elastic.to128());\\n    }\\n\\n    /// @notice Subtract `elastic` from `total` and update storage.\\n    /// @return newElastic Returns updated `elastic`.\\n    function subElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {\\n        newElastic = total.elastic = total.elastic.sub(elastic.to128());\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringOwnable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n// Source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol + Claimable.sol\\n// Edited by BoringCrypto\\n\\ncontract BoringOwnableData {\\n    address public owner;\\n    address public pendingOwner;\\n}\\n\\ncontract BoringOwnable is BoringOwnableData {\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /// @notice `owner` defaults to msg.sender on construction.\\n    constructor() public {\\n        owner = msg.sender;\\n        emit OwnershipTransferred(address(0), msg.sender);\\n    }\\n\\n    /// @notice Transfers ownership to `newOwner`. Either directly or claimable by the new pending owner.\\n    /// Can only be invoked by the current `owner`.\\n    /// @param newOwner Address of the new owner.\\n    /// @param direct True if `newOwner` should be set immediately. False if `newOwner` needs to use `claimOwnership`.\\n    /// @param renounce Allows the `newOwner` to be `address(0)` if `direct` and `renounce` is True. Has no effect otherwise.\\n    function transferOwnership(\\n        address newOwner,\\n        bool direct,\\n        bool renounce\\n    ) public onlyOwner {\\n        if (direct) {\\n            // Checks\\n            require(newOwner != address(0) || renounce, \\\"Ownable: zero address\\\");\\n\\n            // Effects\\n            emit OwnershipTransferred(owner, newOwner);\\n            owner = newOwner;\\n            pendingOwner = address(0);\\n        } else {\\n            // Effects\\n            pendingOwner = newOwner;\\n        }\\n    }\\n\\n    /// @notice Needs to be called by `pendingOwner` to claim ownership.\\n    function claimOwnership() public {\\n        address _pendingOwner = pendingOwner;\\n\\n        // Checks\\n        require(msg.sender == _pendingOwner, \\\"Ownable: caller != pending owner\\\");\\n\\n        // Effects\\n        emit OwnershipTransferred(owner, _pendingOwner);\\n        owner = _pendingOwner;\\n        pendingOwner = address(0);\\n    }\\n\\n    /// @notice Only allows the `owner` to execute the function.\\n    modifier onlyOwner() {\\n        require(msg.sender == owner, \\\"Ownable: caller is not the owner\\\");\\n        _;\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/interfaces/IMasterContract.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ninterface IMasterContract {\\n    /// @notice Init function that gets called from `BoringFactory.deploy`.\\n    /// Also kown as the constructor for cloned contracts.\\n    /// Any ETH send to `BoringFactory.deploy` ends up here.\\n    /// @param data Can be abi encoded arguments or anything else.\\n    function init(bytes calldata data) external payable;\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringFactory.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ncontract BoringFactory {\\n    event LogDeploy(address indexed masterContract, bytes data, address indexed cloneAddress);\\n\\n    /// @notice Mapping from clone contracts to their masterContract.\\n    mapping(address => address) public masterContractOf;\\n\\n    /// @notice Deploys a given master Contract as a clone.\\n    /// Any ETH transferred with this call is forwarded to the new clone.\\n    /// Emits `LogDeploy`.\\n    /// @param masterContract The address of the contract to clone.\\n    /// @param data Additional abi encoded calldata that is passed to the new clone via `IMasterContract.init`.\\n    /// @param useCreate2 Creates the clone by using the CREATE2 opcode, in this case `data` will be used as salt.\\n    /// @return cloneAddress Address of the created clone contract.\\n    function deploy(\\n        address masterContract,\\n        bytes calldata data,\\n        bool useCreate2\\n    ) public payable returns (address cloneAddress) {\\n        require(masterContract != address(0), \\\"BoringFactory: No masterContract\\\");\\n        bytes20 targetBytes = bytes20(masterContract); // Takes the first 20 bytes of the masterContract's address\\n\\n        if (useCreate2) {\\n            // each masterContract has different code already. So clones are distinguished by their data only.\\n            bytes32 salt = keccak256(data);\\n\\n            // Creates clone, more info here: https://blog.openzeppelin.com/deep-dive-into-the-minimal-proxy-contract/\\n            assembly {\\n                let clone := mload(0x40)\\n                mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n                mstore(add(clone, 0x14), targetBytes)\\n                mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n                cloneAddress := create2(0, clone, 0x37, salt)\\n            }\\n        } else {\\n            assembly {\\n                let clone := mload(0x40)\\n                mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n                mstore(add(clone, 0x14), targetBytes)\\n                mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n                cloneAddress := create(0, clone, 0x37)\\n            }\\n        }\\n        masterContractOf[cloneAddress] = masterContract;\\n\\n        IMasterContract(cloneAddress).init{value: msg.value}(data);\\n\\n        emit LogDeploy(masterContract, data, cloneAddress);\\n    }\\n}\\n\\n// File contracts/MasterContractManager.sol\\n// License-Identifier: UNLICENSED\\n\\ncontract MasterContractManager is BoringOwnable, BoringFactory {\\n    event LogWhiteListMasterContract(address indexed masterContract, bool approved);\\n    event LogSetMasterContractApproval(address indexed masterContract, address indexed user, bool approved);\\n    event LogRegisterProtocol(address indexed protocol);\\n\\n    /// @notice masterContract to user to approval state\\n    mapping(address => mapping(address => bool)) public masterContractApproved;\\n    /// @notice masterContract to whitelisted state for approval without signed message\\n    mapping(address => bool) public whitelistedMasterContracts;\\n    /// @notice user nonces for masterContract approvals\\n    mapping(address => uint256) public nonces;\\n\\n    bytes32 private constant DOMAIN_SEPARATOR_SIGNATURE_HASH = keccak256(\\\"EIP712Domain(string name,uint256 chainId,address verifyingContract)\\\");\\n    // See https://eips.ethereum.org/EIPS/eip-191\\n    string private constant EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA = \\\"\\\\x19\\\\x01\\\";\\n    bytes32 private constant APPROVAL_SIGNATURE_HASH =\\n        keccak256(\\\"SetMasterContractApproval(string warning,address user,address masterContract,bool approved,uint256 nonce)\\\");\\n\\n    // solhint-disable-next-line var-name-mixedcase\\n    bytes32 private immutable _DOMAIN_SEPARATOR;\\n    // solhint-disable-next-line var-name-mixedcase\\n    uint256 private immutable DOMAIN_SEPARATOR_CHAIN_ID;\\n\\n    constructor() public {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        _DOMAIN_SEPARATOR = _calculateDomainSeparator(DOMAIN_SEPARATOR_CHAIN_ID = chainId);\\n    }\\n\\n    function _calculateDomainSeparator(uint256 chainId) private view returns (bytes32) {\\n        return keccak256(abi.encode(DOMAIN_SEPARATOR_SIGNATURE_HASH, keccak256(\\\"BentoBox V1\\\"), chainId, address(this)));\\n    }\\n\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() public view returns (bytes32) {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        return chainId == DOMAIN_SEPARATOR_CHAIN_ID ? _DOMAIN_SEPARATOR : _calculateDomainSeparator(chainId);\\n    }\\n\\n    /// @notice Other contracts need to register with this master contract so that users can approve them for the BentoBox.\\n    function registerProtocol() public {\\n        masterContractOf[msg.sender] = msg.sender;\\n        emit LogRegisterProtocol(msg.sender);\\n    }\\n\\n    /// @notice Enables or disables a contract for approval without signed message.\\n    function whitelistMasterContract(address masterContract, bool approved) public onlyOwner {\\n        // Checks\\n        require(masterContract != address(0), \\\"MasterCMgr: Cannot approve 0\\\");\\n\\n        // Effects\\n        whitelistedMasterContracts[masterContract] = approved;\\n        emit LogWhiteListMasterContract(masterContract, approved);\\n    }\\n\\n    /// @notice Approves or revokes a `masterContract` access to `user` funds.\\n    /// @param user The address of the user that approves or revokes access.\\n    /// @param masterContract The address who gains or loses access.\\n    /// @param approved If True approves access. If False revokes access.\\n    /// @param v Part of the signature. (See EIP-191)\\n    /// @param r Part of the signature. (See EIP-191)\\n    /// @param s Part of the signature. (See EIP-191)\\n    // F4 - Check behaviour for all function arguments when wrong or extreme\\n    // F4: Don't allow masterContract 0 to be approved. Unknown contracts will have a masterContract of 0.\\n    // F4: User can't be 0 for signed approvals because the recoveredAddress will be 0 if ecrecover fails\\n    function setMasterContractApproval(\\n        address user,\\n        address masterContract,\\n        bool approved,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) public {\\n        // Checks\\n        require(masterContract != address(0), \\\"MasterCMgr: masterC not set\\\"); // Important for security\\n\\n        // If no signature is provided, the fallback is executed\\n        if (r == 0 && s == 0 && v == 0) {\\n            require(user == msg.sender, \\\"MasterCMgr: user not sender\\\");\\n            require(masterContractOf[user] == address(0), \\\"MasterCMgr: user is clone\\\");\\n            require(whitelistedMasterContracts[masterContract], \\\"MasterCMgr: not whitelisted\\\");\\n        } else {\\n            // Important for security - any address without masterContract has address(0) as masterContract\\n            // So approving address(0) would approve every address, leading to full loss of funds\\n            // Also, ecrecover returns address(0) on failure. So we check this:\\n            require(user != address(0), \\\"MasterCMgr: User cannot be 0\\\");\\n\\n            // C10 - Protect signatures against replay, use nonce and chainId (SWC-121)\\n            // C10: nonce + chainId are used to prevent replays\\n            // C11 - All signatures strictly EIP-712 (SWC-117 SWC-122)\\n            // C11: signature is EIP-712 compliant\\n            // C12 - abi.encodePacked can't contain variable length user input (SWC-133)\\n            // C12: abi.encodePacked has fixed length parameters\\n            bytes32 digest =\\n                keccak256(\\n                    abi.encodePacked(\\n                        EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA,\\n                        DOMAIN_SEPARATOR(),\\n                        keccak256(\\n                            abi.encode(\\n                                APPROVAL_SIGNATURE_HASH,\\n                                approved\\n                                    ? keccak256(\\\"Give FULL access to funds in (and approved to) BentoBox?\\\")\\n                                    : keccak256(\\\"Revoke access to BentoBox?\\\"),\\n                                user,\\n                                masterContract,\\n                                approved,\\n                                nonces[user]++\\n                            )\\n                        )\\n                    )\\n                );\\n            address recoveredAddress = ecrecover(digest, v, r, s);\\n            require(recoveredAddress == user, \\\"MasterCMgr: Invalid Signature\\\");\\n        }\\n\\n        // Effects\\n        masterContractApproved[masterContract][user] = approved;\\n        emit LogSetMasterContractApproval(masterContract, user, approved);\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringBatchable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ncontract BaseBoringBatchable {\\n    /// @dev Helper function to extract a useful revert message from a failed call.\\n    /// If the returned data is malformed or not correctly abi encoded then this call can fail itself.\\n    function _getRevertMsg(bytes memory _returnData) internal pure returns (string memory) {\\n        // If the _res length is less than 68, then the transaction failed silently (without a revert message)\\n        if (_returnData.length < 68) return \\\"Transaction reverted silently\\\";\\n\\n        assembly {\\n            // Slice the sighash.\\n            _returnData := add(_returnData, 0x04)\\n        }\\n        return abi.decode(_returnData, (string)); // All that remains is the revert string\\n    }\\n\\n    /// @notice Allows batched call to self (this contract).\\n    /// @param calls An array of inputs for each call.\\n    /// @param revertOnFail If True then reverts after a failed call and stops doing further calls.\\n    /// @return successes An array indicating the success of a call, mapped one-to-one to `calls`.\\n    /// @return results An array with the returned data of each function call, mapped one-to-one to `calls`.\\n    // F1: External is ok here because this is the batch function, adding it to a batch makes no sense\\n    // F2: Calls in the batch may be payable, delegatecall operates in the same context, so each call in the batch has access to msg.value\\n    // C3: The length of the loop is fully under user control, so can't be exploited\\n    // C7: Delegatecall is only used on the same contract, so it's safe\\n    function batch(bytes[] calldata calls, bool revertOnFail) external payable returns (bool[] memory successes, bytes[] memory results) {\\n        successes = new bool[](calls.length);\\n        results = new bytes[](calls.length);\\n        for (uint256 i = 0; i < calls.length; i++) {\\n            (bool success, bytes memory result) = address(this).delegatecall(calls[i]);\\n            require(success || !revertOnFail, _getRevertMsg(result));\\n            successes[i] = success;\\n            results[i] = result;\\n        }\\n    }\\n}\\n\\ncontract BoringBatchable is BaseBoringBatchable {\\n    /// @notice Call wrapper that performs `ERC20.permit` on `token`.\\n    /// Lookup `IERC20.permit`.\\n    // F6: Parameters can be used front-run the permit and the user's permit will fail (due to nonce or other revert)\\n    //     if part of a batch this could be used to grief once as the second call would not need the permit\\n    function permitToken(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) public {\\n        token.permit(from, to, amount, deadline, v, r, s);\\n    }\\n}\\n\\n// File contracts/BentoBox.sol\\n// License-Identifier: UNLICENSED\\n\\n/// @title BentoBox\\n/// @author BoringCrypto, Keno\\n/// @notice The BentoBox is a vault for tokens. The stored tokens can be flash loaned and used in strategies.\\n/// Yield from this will go to the token depositors.\\n/// Rebasing tokens ARE NOT supported and WILL cause loss of funds.\\n/// Any funds transfered directly onto the BentoBox will be lost, use the deposit function instead.\\ncontract BentoBoxV1 is MasterContractManager, BoringBatchable {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n    using BoringERC20 for IERC20;\\n    using RebaseLibrary for Rebase;\\n\\n    // ************** //\\n    // *** EVENTS *** //\\n    // ************** //\\n\\n    event LogDeposit(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogWithdraw(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogTransfer(IERC20 indexed token, address indexed from, address indexed to, uint256 share);\\n\\n    event LogFlashLoan(address indexed borrower, IERC20 indexed token, uint256 amount, uint256 feeAmount, address indexed receiver);\\n\\n    event LogStrategyTargetPercentage(IERC20 indexed token, uint256 targetPercentage);\\n    event LogStrategyQueued(IERC20 indexed token, IStrategy indexed strategy);\\n    event LogStrategySet(IERC20 indexed token, IStrategy indexed strategy);\\n    event LogStrategyInvest(IERC20 indexed token, uint256 amount);\\n    event LogStrategyDivest(IERC20 indexed token, uint256 amount);\\n    event LogStrategyProfit(IERC20 indexed token, uint256 amount);\\n    event LogStrategyLoss(IERC20 indexed token, uint256 amount);\\n\\n    // *************** //\\n    // *** STRUCTS *** //\\n    // *************** //\\n\\n    struct StrategyData {\\n        uint64 strategyStartDate;\\n        uint64 targetPercentage;\\n        uint128 balance; // the balance of the strategy that BentoBox thinks is in there\\n    }\\n\\n    // ******************************** //\\n    // *** CONSTANTS AND IMMUTABLES *** //\\n    // ******************************** //\\n\\n    // V2 - Can they be private?\\n    // V2: Private to save gas, to verify it's correct, check the constructor arguments\\n    IERC20 private immutable wethToken;\\n\\n    IERC20 private constant USE_ETHEREUM = IERC20(0);\\n    uint256 private constant FLASH_LOAN_FEE = 50; // 0.05%\\n    uint256 private constant FLASH_LOAN_FEE_PRECISION = 1e5;\\n    uint256 private constant STRATEGY_DELAY = 2 weeks;\\n    uint256 private constant MAX_TARGET_PERCENTAGE = 95; // 95%\\n    uint256 private constant MINIMUM_SHARE_BALANCE = 1000; // To prevent the ratio going off\\n\\n    // ***************** //\\n    // *** VARIABLES *** //\\n    // ***************** //\\n\\n    // Balance per token per address/contract in shares\\n    mapping(IERC20 => mapping(address => uint256)) public balanceOf;\\n\\n    // Rebase from amount to share\\n    mapping(IERC20 => Rebase) public totals;\\n\\n    mapping(IERC20 => IStrategy) public strategy;\\n    mapping(IERC20 => IStrategy) public pendingStrategy;\\n    mapping(IERC20 => StrategyData) public strategyData;\\n\\n    // ******************* //\\n    // *** CONSTRUCTOR *** //\\n    // ******************* //\\n\\n    constructor(IERC20 wethToken_) public {\\n        wethToken = wethToken_;\\n    }\\n\\n    // ***************** //\\n    // *** MODIFIERS *** //\\n    // ***************** //\\n\\n    /// Modifier to check if the msg.sender is allowed to use funds belonging to the 'from' address.\\n    /// If 'from' is msg.sender, it's allowed.\\n    /// If 'from' is the BentoBox itself, it's allowed. Any ETH, token balances (above the known balances) or BentoBox balances\\n    /// can be taken by anyone.\\n    /// This is to enable skimming, not just for deposits, but also for withdrawals or transfers, enabling better composability.\\n    /// If 'from' is a clone of a masterContract AND the 'from' address has approved that masterContract, it's allowed.\\n    modifier allowed(address from) {\\n        if (from != msg.sender && from != address(this)) {\\n            // From is sender or you are skimming\\n            address masterContract = masterContractOf[msg.sender];\\n            require(masterContract != address(0), \\\"BentoBox: no masterContract\\\");\\n            require(masterContractApproved[masterContract][from], \\\"BentoBox: Transfer not approved\\\");\\n        }\\n        _;\\n    }\\n\\n    // ************************** //\\n    // *** INTERNAL FUNCTIONS *** //\\n    // ************************** //\\n\\n    /// @dev Returns the total balance of `token` this contracts holds,\\n    /// plus the total amount this contract thinks the strategy holds.\\n    function _tokenBalanceOf(IERC20 token) internal view returns (uint256 amount) {\\n        amount = token.balanceOf(address(this)).add(strategyData[token].balance);\\n    }\\n\\n    // ************************ //\\n    // *** PUBLIC FUNCTIONS *** //\\n    // ************************ //\\n\\n    /// @dev Helper function to represent an `amount` of `token` in shares.\\n    /// @param token The ERC-20 token.\\n    /// @param amount The `token` amount.\\n    /// @param roundUp If the result `share` should be rounded up.\\n    /// @return share The token amount represented in shares.\\n    function toShare(\\n        IERC20 token,\\n        uint256 amount,\\n        bool roundUp\\n    ) external view returns (uint256 share) {\\n        share = totals[token].toBase(amount, roundUp);\\n    }\\n\\n    /// @dev Helper function represent shares back into the `token` amount.\\n    /// @param token The ERC-20 token.\\n    /// @param share The amount of shares.\\n    /// @param roundUp If the result should be rounded up.\\n    /// @return amount The share amount back into native representation.\\n    function toAmount(\\n        IERC20 token,\\n        uint256 share,\\n        bool roundUp\\n    ) external view returns (uint256 amount) {\\n        amount = totals[token].toElastic(share, roundUp);\\n    }\\n\\n    /// @notice Deposit an amount of `token` represented in either `amount` or `share`.\\n    /// @param token_ The ERC-20 token to deposit.\\n    /// @param from which account to pull the tokens.\\n    /// @param to which account to push the tokens.\\n    /// @param amount Token amount in native representation to deposit.\\n    /// @param share Token amount represented in shares to deposit. Takes precedence over `amount`.\\n    /// @return amountOut The amount deposited.\\n    /// @return shareOut The deposited amount repesented in shares.\\n    function deposit(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) public payable allowed(from) returns (uint256 amountOut, uint256 shareOut) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;\\n        Rebase memory total = totals[token];\\n\\n        // If a new token gets added, the tokenSupply call checks that this is a deployed contract. Needed for security.\\n        require(total.elastic != 0 || token.totalSupply() > 0, \\\"BentoBox: No tokens\\\");\\n        if (share == 0) {\\n            // value of the share may be lower than the amount due to rounding, that's ok\\n            share = total.toBase(amount, false);\\n            // Any deposit should lead to at least the minimum share balance, otherwise it's ignored (no amount taken)\\n            if (total.base.add(share.to128()) < MINIMUM_SHARE_BALANCE) {\\n                return (0, 0);\\n            }\\n        } else {\\n            // amount may be lower than the value of share due to rounding, in that case, add 1 to amount (Always round up)\\n            amount = total.toElastic(share, true);\\n        }\\n\\n        // In case of skimming, check that only the skimmable amount is taken.\\n        // For ETH, the full balance is available, so no need to check.\\n        // During flashloans the _tokenBalanceOf is lower than 'reality', so skimming deposits will mostly fail during a flashloan.\\n        require(\\n            from != address(this) || token_ == USE_ETHEREUM || amount <= _tokenBalanceOf(token).sub(total.elastic),\\n            \\\"BentoBox: Skim too much\\\"\\n        );\\n\\n        balanceOf[token][to] = balanceOf[token][to].add(share);\\n        total.base = total.base.add(share.to128());\\n        total.elastic = total.elastic.add(amount.to128());\\n        totals[token] = total;\\n\\n        // Interactions\\n        // During the first deposit, we check that this token is 'real'\\n        if (token_ == USE_ETHEREUM) {\\n            // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)\\n            // X2: If the WETH implementation is faulty or malicious, it will block adding ETH (but we know the WETH implementation)\\n            IWETH(address(wethToken)).deposit{value: amount}();\\n        } else if (from != address(this)) {\\n            // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)\\n            // X2: If the token implementation is faulty or malicious, it may block adding tokens. Good.\\n            token.safeTransferFrom(from, address(this), amount);\\n        }\\n        emit LogDeposit(token, from, to, amount, share);\\n        amountOut = amount;\\n        shareOut = share;\\n    }\\n\\n    /// @notice Withdraws an amount of `token` from a user account.\\n    /// @param token_ The ERC-20 token to withdraw.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param amount of tokens. Either one of `amount` or `share` needs to be supplied.\\n    /// @param share Like above, but `share` takes precedence over `amount`.\\n    function withdraw(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) public allowed(from) returns (uint256 amountOut, uint256 shareOut) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;\\n        Rebase memory total = totals[token];\\n        if (share == 0) {\\n            // value of the share paid could be lower than the amount paid due to rounding, in that case, add a share (Always round up)\\n            share = total.toBase(amount, true);\\n        } else {\\n            // amount may be lower than the value of share due to rounding, that's ok\\n            amount = total.toElastic(share, false);\\n        }\\n\\n        balanceOf[token][from] = balanceOf[token][from].sub(share);\\n        total.elastic = total.elastic.sub(amount.to128());\\n        total.base = total.base.sub(share.to128());\\n        // There have to be at least 1000 shares left to prevent reseting the share/amount ratio (unless it's fully emptied)\\n        require(total.base >= MINIMUM_SHARE_BALANCE || total.base == 0, \\\"BentoBox: cannot empty\\\");\\n        totals[token] = total;\\n\\n        // Interactions\\n        if (token_ == USE_ETHEREUM) {\\n            // X2, X3: A revert or big gas usage in the WETH contract could block withdrawals, but WETH9 is fine.\\n            IWETH(address(wethToken)).withdraw(amount);\\n            // X2, X3: A revert or big gas usage could block, however, the to address is under control of the caller.\\n            (bool success, ) = to.call{value: amount}(\\\"\\\");\\n            require(success, \\\"BentoBox: ETH transfer failed\\\");\\n        } else {\\n            // X2, X3: A malicious token could block withdrawal of just THAT token.\\n            //         masterContracts may want to take care not to rely on withdraw always succeeding.\\n            token.safeTransfer(to, amount);\\n        }\\n        emit LogWithdraw(token, from, to, amount, share);\\n        amountOut = amount;\\n        shareOut = share;\\n    }\\n\\n    /// @notice Transfer shares from a user account to another one.\\n    /// @param token The ERC-20 token to transfer.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param share The amount of `token` in shares.\\n    // Clones of master contracts can transfer from any account that has approved them\\n    // F3 - Can it be combined with another similar function?\\n    // F3: This isn't combined with transferMultiple for gas optimization\\n    function transfer(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 share\\n    ) public allowed(from) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        balanceOf[token][from] = balanceOf[token][from].sub(share);\\n        balanceOf[token][to] = balanceOf[token][to].add(share);\\n\\n        emit LogTransfer(token, from, to, share);\\n    }\\n\\n    /// @notice Transfer shares from a user account to multiple other ones.\\n    /// @param token The ERC-20 token to transfer.\\n    /// @param from which user to pull the tokens.\\n    /// @param tos The receivers of the tokens.\\n    /// @param shares The amount of `token` in shares for each receiver in `tos`.\\n    // F3 - Can it be combined with another similar function?\\n    // F3: This isn't combined with transfer for gas optimization\\n    function transferMultiple(\\n        IERC20 token,\\n        address from,\\n        address[] calldata tos,\\n        uint256[] calldata shares\\n    ) public allowed(from) {\\n        // Checks\\n        require(tos[0] != address(0), \\\"BentoBox: to[0] not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        uint256 totalAmount;\\n        uint256 len = tos.length;\\n        for (uint256 i = 0; i < len; i++) {\\n            address to = tos[i];\\n            balanceOf[token][to] = balanceOf[token][to].add(shares[i]);\\n            totalAmount = totalAmount.add(shares[i]);\\n            emit LogTransfer(token, from, to, shares[i]);\\n        }\\n        balanceOf[token][from] = balanceOf[token][from].sub(totalAmount);\\n    }\\n\\n    /// @notice Flashloan ability.\\n    /// @param borrower The address of the contract that implements and conforms to `IFlashBorrower` and handles the flashloan.\\n    /// @param receiver Address of the token receiver.\\n    /// @param token The address of the token to receive.\\n    /// @param amount of the tokens to receive.\\n    /// @param data The calldata to pass to the `borrower` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Not possible to follow this here, reentrancy has been reviewed\\n    // F6 - Check for front-running possibilities, such as the approve function (SWC-114)\\n    // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.\\n    function flashLoan(\\n        IFlashBorrower borrower,\\n        address receiver,\\n        IERC20 token,\\n        uint256 amount,\\n        bytes calldata data\\n    ) public {\\n        uint256 fee = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;\\n        token.safeTransfer(receiver, amount);\\n\\n        borrower.onFlashLoan(msg.sender, token, amount, fee, data);\\n\\n        require(_tokenBalanceOf(token) >= totals[token].addElastic(fee.to128()), \\\"BentoBox: Wrong amount\\\");\\n        emit LogFlashLoan(address(borrower), token, amount, fee, receiver);\\n    }\\n\\n    /// @notice Support for batched flashloans. Useful to request multiple different `tokens` in a single transaction.\\n    /// @param borrower The address of the contract that implements and conforms to `IBatchFlashBorrower` and handles the flashloan.\\n    /// @param receivers An array of the token receivers. A one-to-one mapping with `tokens` and `amounts`.\\n    /// @param tokens The addresses of the tokens.\\n    /// @param amounts of the tokens for each receiver.\\n    /// @param data The calldata to pass to the `borrower` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Not possible to follow this here, reentrancy has been reviewed\\n    // F6 - Check for front-running possibilities, such as the approve function (SWC-114)\\n    // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.\\n    function batchFlashLoan(\\n        IBatchFlashBorrower borrower,\\n        address[] calldata receivers,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        bytes calldata data\\n    ) public {\\n        uint256[] memory fees = new uint256[](tokens.length);\\n\\n        uint256 len = tokens.length;\\n        for (uint256 i = 0; i < len; i++) {\\n            uint256 amount = amounts[i];\\n            fees[i] = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;\\n\\n            tokens[i].safeTransfer(receivers[i], amounts[i]);\\n        }\\n\\n        borrower.onBatchFlashLoan(msg.sender, tokens, amounts, fees, data);\\n\\n        for (uint256 i = 0; i < len; i++) {\\n            IERC20 token = tokens[i];\\n            require(_tokenBalanceOf(token) >= totals[token].addElastic(fees[i].to128()), \\\"BentoBox: Wrong amount\\\");\\n            emit LogFlashLoan(address(borrower), token, amounts[i], fees[i], receivers[i]);\\n        }\\n    }\\n\\n    /// @notice Sets the target percentage of the strategy for `token`.\\n    /// @dev Only the owner of this contract is allowed to change this.\\n    /// @param token The address of the token that maps to a strategy to change.\\n    /// @param targetPercentage_ The new target in percent. Must be lesser or equal to `MAX_TARGET_PERCENTAGE`.\\n    function setStrategyTargetPercentage(IERC20 token, uint64 targetPercentage_) public onlyOwner {\\n        // Checks\\n        require(targetPercentage_ <= MAX_TARGET_PERCENTAGE, \\\"StrategyManager: Target too high\\\");\\n\\n        // Effects\\n        strategyData[token].targetPercentage = targetPercentage_;\\n        emit LogStrategyTargetPercentage(token, targetPercentage_);\\n    }\\n\\n    /// @notice Sets the contract address of a new strategy that conforms to `IStrategy` for `token`.\\n    /// Must be called twice with the same arguments.\\n    /// A new strategy becomes pending first and can be activated once `STRATEGY_DELAY` is over.\\n    /// @dev Only the owner of this contract is allowed to change this.\\n    /// @param token The address of the token that maps to a strategy to change.\\n    /// @param newStrategy The address of the contract that conforms to `IStrategy`.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Total amount is updated AFTER interaction. But strategy is under our control.\\n    // C4 - Use block.timestamp only for long intervals (SWC-116)\\n    // C4: block.timestamp is used for a period of 2 weeks, which is long enough\\n    function setStrategy(IERC20 token, IStrategy newStrategy) public onlyOwner {\\n        StrategyData memory data = strategyData[token];\\n        IStrategy pending = pendingStrategy[token];\\n        if (data.strategyStartDate == 0 || pending != newStrategy) {\\n            pendingStrategy[token] = newStrategy;\\n            // C1 - All math done through BoringMath (SWC-101)\\n            // C1: Our sun will swallow the earth well before this overflows\\n            data.strategyStartDate = (block.timestamp + STRATEGY_DELAY).to64();\\n            emit LogStrategyQueued(token, newStrategy);\\n        } else {\\n            require(data.strategyStartDate != 0 && block.timestamp >= data.strategyStartDate, \\\"StrategyManager: Too early\\\");\\n            if (address(strategy[token]) != address(0)) {\\n                int256 balanceChange = strategy[token].exit(data.balance);\\n                // Effects\\n                if (balanceChange > 0) {\\n                    uint256 add = uint256(balanceChange);\\n                    totals[token].addElastic(add);\\n                    emit LogStrategyProfit(token, add);\\n                } else if (balanceChange < 0) {\\n                    uint256 sub = uint256(-balanceChange);\\n                    totals[token].subElastic(sub);\\n                    emit LogStrategyLoss(token, sub);\\n                }\\n\\n                emit LogStrategyDivest(token, data.balance);\\n            }\\n            strategy[token] = pending;\\n            data.strategyStartDate = 0;\\n            data.balance = 0;\\n            pendingStrategy[token] = IStrategy(0);\\n            emit LogStrategySet(token, newStrategy);\\n        }\\n        strategyData[token] = data;\\n    }\\n\\n    /// @notice The actual process of yield farming. Executes the strategy of `token`.\\n    /// Optionally does housekeeping if `balance` is true.\\n    /// `maxChangeAmount` is relevant for skimming or withdrawing if `balance` is true.\\n    /// @param token The address of the token for which a strategy is deployed.\\n    /// @param balance True if housekeeping should be done.\\n    /// @param maxChangeAmount The maximum amount for either pulling or pushing from/to the `IStrategy` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Total amount is updated AFTER interaction. But strategy is under our control.\\n    // F5: Not followed to prevent reentrancy issues with flashloans and BentoBox skims?\\n    function harvest(\\n        IERC20 token,\\n        bool balance,\\n        uint256 maxChangeAmount\\n    ) public {\\n        StrategyData memory data = strategyData[token];\\n        IStrategy _strategy = strategy[token];\\n        int256 balanceChange = _strategy.harvest(data.balance, msg.sender);\\n        if (balanceChange == 0 && !balance) {\\n            return;\\n        }\\n\\n        uint256 totalElastic = totals[token].elastic;\\n\\n        if (balanceChange > 0) {\\n            uint256 add = uint256(balanceChange);\\n            totalElastic = totalElastic.add(add);\\n            totals[token].elastic = totalElastic.to128();\\n            emit LogStrategyProfit(token, add);\\n        } else if (balanceChange < 0) {\\n            // C1 - All math done through BoringMath (SWC-101)\\n            // C1: balanceChange could overflow if it's max negative int128.\\n            // But tokens with balances that large are not supported by the BentoBox.\\n            uint256 sub = uint256(-balanceChange);\\n            totalElastic = totalElastic.sub(sub);\\n            totals[token].elastic = totalElastic.to128();\\n            data.balance = data.balance.sub(sub.to128());\\n            emit LogStrategyLoss(token, sub);\\n        }\\n\\n        if (balance) {\\n            uint256 targetBalance = totalElastic.mul(data.targetPercentage) / 100;\\n            // if data.balance == targetBalance there is nothing to update\\n            if (data.balance < targetBalance) {\\n                uint256 amountOut = targetBalance.sub(data.balance);\\n                if (maxChangeAmount != 0 && amountOut > maxChangeAmount) {\\n                    amountOut = maxChangeAmount;\\n                }\\n                token.safeTransfer(address(_strategy), amountOut);\\n                data.balance = data.balance.add(amountOut.to128());\\n                _strategy.skim(amountOut);\\n                emit LogStrategyInvest(token, amountOut);\\n            } else if (data.balance > targetBalance) {\\n                uint256 amountIn = data.balance.sub(targetBalance.to128());\\n                if (maxChangeAmount != 0 && amountIn > maxChangeAmount) {\\n                    amountIn = maxChangeAmount;\\n                }\\n\\n                uint256 actualAmountIn = _strategy.withdraw(amountIn);\\n\\n                data.balance = data.balance.sub(actualAmountIn.to128());\\n                emit LogStrategyDivest(token, actualAmountIn);\\n            }\\n        }\\n\\n        strategyData[token] = data;\\n    }\\n\\n    // Contract should be able to receive ETH deposits to support deposit & skim\\n    // solhint-disable-next-line no-empty-blocks\\n    receive() external payable {}\\n}\\n\",\"keccak256\":\"0xf5251397b9aaa5c66ddc18b0cb96350ffac09f5776a1255fedc0072641f916fe\",\"license\":\"UNLICENSED\"}},\"version\":1}",
          "storageLayout": {
            "storage": [
              {
                "astId": 900,
                "contract": "contracts/bentobox/BentoBoxV1.sol:BentoBoxV1",
                "label": "owner",
                "offset": 0,
                "slot": "0",
                "type": "t_address"
              },
              {
                "astId": 902,
                "contract": "contracts/bentobox/BentoBoxV1.sol:BentoBoxV1",
                "label": "pendingOwner",
                "offset": 0,
                "slot": "1",
                "type": "t_address"
              },
              {
                "astId": 1046,
                "contract": "contracts/bentobox/BentoBoxV1.sol:BentoBoxV1",
                "label": "masterContractOf",
                "offset": 0,
                "slot": "2",
                "type": "t_mapping(t_address,t_address)"
              },
              {
                "astId": 1140,
                "contract": "contracts/bentobox/BentoBoxV1.sol:BentoBoxV1",
                "label": "masterContractApproved",
                "offset": 0,
                "slot": "3",
                "type": "t_mapping(t_address,t_mapping(t_address,t_bool))"
              },
              {
                "astId": 1145,
                "contract": "contracts/bentobox/BentoBoxV1.sol:BentoBoxV1",
                "label": "whitelistedMasterContracts",
                "offset": 0,
                "slot": "4",
                "type": "t_mapping(t_address,t_bool)"
              },
              {
                "astId": 1150,
                "contract": "contracts/bentobox/BentoBoxV1.sol:BentoBoxV1",
                "label": "nonces",
                "offset": 0,
                "slot": "5",
                "type": "t_mapping(t_address,t_uint256)"
              },
              {
                "astId": 1701,
                "contract": "contracts/bentobox/BentoBoxV1.sol:BentoBoxV1",
                "label": "balanceOf",
                "offset": 0,
                "slot": "6",
                "type": "t_mapping(t_contract(IERC20)67,t_mapping(t_address,t_uint256))"
              },
              {
                "astId": 1705,
                "contract": "contracts/bentobox/BentoBoxV1.sol:BentoBoxV1",
                "label": "totals",
                "offset": 0,
                "slot": "7",
                "type": "t_mapping(t_contract(IERC20)67,t_struct(Rebase)550_storage)"
              },
              {
                "astId": 1709,
                "contract": "contracts/bentobox/BentoBoxV1.sol:BentoBoxV1",
                "label": "strategy",
                "offset": 0,
                "slot": "8",
                "type": "t_mapping(t_contract(IERC20)67,t_contract(IStrategy)142)"
              },
              {
                "astId": 1713,
                "contract": "contracts/bentobox/BentoBoxV1.sol:BentoBoxV1",
                "label": "pendingStrategy",
                "offset": 0,
                "slot": "9",
                "type": "t_mapping(t_contract(IERC20)67,t_contract(IStrategy)142)"
              },
              {
                "astId": 1717,
                "contract": "contracts/bentobox/BentoBoxV1.sol:BentoBoxV1",
                "label": "strategyData",
                "offset": 0,
                "slot": "10",
                "type": "t_mapping(t_contract(IERC20)67,t_struct(StrategyData)1673_storage)"
              }
            ],
            "types": {
              "t_address": {
                "encoding": "inplace",
                "label": "address",
                "numberOfBytes": "20"
              },
              "t_bool": {
                "encoding": "inplace",
                "label": "bool",
                "numberOfBytes": "1"
              },
              "t_contract(IERC20)67": {
                "encoding": "inplace",
                "label": "contract IERC20",
                "numberOfBytes": "20"
              },
              "t_contract(IStrategy)142": {
                "encoding": "inplace",
                "label": "contract IStrategy",
                "numberOfBytes": "20"
              },
              "t_mapping(t_address,t_address)": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => address)",
                "numberOfBytes": "32",
                "value": "t_address"
              },
              "t_mapping(t_address,t_bool)": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => bool)",
                "numberOfBytes": "32",
                "value": "t_bool"
              },
              "t_mapping(t_address,t_mapping(t_address,t_bool))": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => mapping(address => bool))",
                "numberOfBytes": "32",
                "value": "t_mapping(t_address,t_bool)"
              },
              "t_mapping(t_address,t_uint256)": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => uint256)",
                "numberOfBytes": "32",
                "value": "t_uint256"
              },
              "t_mapping(t_contract(IERC20)67,t_contract(IStrategy)142)": {
                "encoding": "mapping",
                "key": "t_contract(IERC20)67",
                "label": "mapping(contract IERC20 => contract IStrategy)",
                "numberOfBytes": "32",
                "value": "t_contract(IStrategy)142"
              },
              "t_mapping(t_contract(IERC20)67,t_mapping(t_address,t_uint256))": {
                "encoding": "mapping",
                "key": "t_contract(IERC20)67",
                "label": "mapping(contract IERC20 => mapping(address => uint256))",
                "numberOfBytes": "32",
                "value": "t_mapping(t_address,t_uint256)"
              },
              "t_mapping(t_contract(IERC20)67,t_struct(Rebase)550_storage)": {
                "encoding": "mapping",
                "key": "t_contract(IERC20)67",
                "label": "mapping(contract IERC20 => struct Rebase)",
                "numberOfBytes": "32",
                "value": "t_struct(Rebase)550_storage"
              },
              "t_mapping(t_contract(IERC20)67,t_struct(StrategyData)1673_storage)": {
                "encoding": "mapping",
                "key": "t_contract(IERC20)67",
                "label": "mapping(contract IERC20 => struct BentoBoxV1.StrategyData)",
                "numberOfBytes": "32",
                "value": "t_struct(StrategyData)1673_storage"
              },
              "t_struct(Rebase)550_storage": {
                "encoding": "inplace",
                "label": "struct Rebase",
                "members": [
                  {
                    "astId": 547,
                    "contract": "contracts/bentobox/BentoBoxV1.sol:BentoBoxV1",
                    "label": "elastic",
                    "offset": 0,
                    "slot": "0",
                    "type": "t_uint128"
                  },
                  {
                    "astId": 549,
                    "contract": "contracts/bentobox/BentoBoxV1.sol:BentoBoxV1",
                    "label": "base",
                    "offset": 16,
                    "slot": "0",
                    "type": "t_uint128"
                  }
                ],
                "numberOfBytes": "32"
              },
              "t_struct(StrategyData)1673_storage": {
                "encoding": "inplace",
                "label": "struct BentoBoxV1.StrategyData",
                "members": [
                  {
                    "astId": 1668,
                    "contract": "contracts/bentobox/BentoBoxV1.sol:BentoBoxV1",
                    "label": "strategyStartDate",
                    "offset": 0,
                    "slot": "0",
                    "type": "t_uint64"
                  },
                  {
                    "astId": 1670,
                    "contract": "contracts/bentobox/BentoBoxV1.sol:BentoBoxV1",
                    "label": "targetPercentage",
                    "offset": 8,
                    "slot": "0",
                    "type": "t_uint64"
                  },
                  {
                    "astId": 1672,
                    "contract": "contracts/bentobox/BentoBoxV1.sol:BentoBoxV1",
                    "label": "balance",
                    "offset": 16,
                    "slot": "0",
                    "type": "t_uint128"
                  }
                ],
                "numberOfBytes": "32"
              },
              "t_uint128": {
                "encoding": "inplace",
                "label": "uint128",
                "numberOfBytes": "16"
              },
              "t_uint256": {
                "encoding": "inplace",
                "label": "uint256",
                "numberOfBytes": "32"
              },
              "t_uint64": {
                "encoding": "inplace",
                "label": "uint64",
                "numberOfBytes": "8"
              }
            }
          },
          "userdoc": {
            "kind": "user",
            "methods": {
              "batch(bytes[],bool)": {
                "notice": "Allows batched call to self (this contract)."
              },
              "batchFlashLoan(address,address[],address[],uint256[],bytes)": {
                "notice": "Support for batched flashloans. Useful to request multiple different `tokens` in a single transaction."
              },
              "claimOwnership()": {
                "notice": "Needs to be called by `pendingOwner` to claim ownership."
              },
              "deploy(address,bytes,bool)": {
                "notice": "Deploys a given master Contract as a clone. Any ETH transferred with this call is forwarded to the new clone. Emits `LogDeploy`."
              },
              "deposit(address,address,address,uint256,uint256)": {
                "notice": "Deposit an amount of `token` represented in either `amount` or `share`."
              },
              "flashLoan(address,address,address,uint256,bytes)": {
                "notice": "Flashloan ability."
              },
              "harvest(address,bool,uint256)": {
                "notice": "The actual process of yield farming. Executes the strategy of `token`. Optionally does housekeeping if `balance` is true. `maxChangeAmount` is relevant for skimming or withdrawing if `balance` is true."
              },
              "masterContractApproved(address,address)": {
                "notice": "masterContract to user to approval state"
              },
              "masterContractOf(address)": {
                "notice": "Mapping from clone contracts to their masterContract."
              },
              "nonces(address)": {
                "notice": "user nonces for masterContract approvals"
              },
              "permitToken(address,address,address,uint256,uint256,uint8,bytes32,bytes32)": {
                "notice": "Call wrapper that performs `ERC20.permit` on `token`. Lookup `IERC20.permit`."
              },
              "registerProtocol()": {
                "notice": "Other contracts need to register with this master contract so that users can approve them for the BentoBox."
              },
              "setMasterContractApproval(address,address,bool,uint8,bytes32,bytes32)": {
                "notice": "Approves or revokes a `masterContract` access to `user` funds."
              },
              "setStrategy(address,address)": {
                "notice": "Sets the contract address of a new strategy that conforms to `IStrategy` for `token`. Must be called twice with the same arguments. A new strategy becomes pending first and can be activated once `STRATEGY_DELAY` is over."
              },
              "setStrategyTargetPercentage(address,uint64)": {
                "notice": "Sets the target percentage of the strategy for `token`."
              },
              "transfer(address,address,address,uint256)": {
                "notice": "Transfer shares from a user account to another one."
              },
              "transferMultiple(address,address,address[],uint256[])": {
                "notice": "Transfer shares from a user account to multiple other ones."
              },
              "transferOwnership(address,bool,bool)": {
                "notice": "Transfers ownership to `newOwner`. Either directly or claimable by the new pending owner. Can only be invoked by the current `owner`."
              },
              "whitelistMasterContract(address,bool)": {
                "notice": "Enables or disables a contract for approval without signed message."
              },
              "whitelistedMasterContracts(address)": {
                "notice": "masterContract to whitelisted state for approval without signed message"
              },
              "withdraw(address,address,address,uint256,uint256)": {
                "notice": "Withdraws an amount of `token` from a user account."
              }
            },
            "notice": "The BentoBox is a vault for tokens. The stored tokens can be flash loaned and used in strategies. Yield from this will go to the token depositors. Rebasing tokens ARE NOT supported and WILL cause loss of funds. Any funds transfered directly onto the BentoBox will be lost, use the deposit function instead.",
            "version": 1
          }
        },
        "BoringBatchable": {
          "abi": [
            {
              "inputs": [
                {
                  "internalType": "bytes[]",
                  "name": "calls",
                  "type": "bytes[]"
                },
                {
                  "internalType": "bool",
                  "name": "revertOnFail",
                  "type": "bool"
                }
              ],
              "name": "batch",
              "outputs": [
                {
                  "internalType": "bool[]",
                  "name": "successes",
                  "type": "bool[]"
                },
                {
                  "internalType": "bytes[]",
                  "name": "results",
                  "type": "bytes[]"
                }
              ],
              "stateMutability": "payable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract IERC20",
                  "name": "token",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "deadline",
                  "type": "uint256"
                },
                {
                  "internalType": "uint8",
                  "name": "v",
                  "type": "uint8"
                },
                {
                  "internalType": "bytes32",
                  "name": "r",
                  "type": "bytes32"
                },
                {
                  "internalType": "bytes32",
                  "name": "s",
                  "type": "bytes32"
                }
              ],
              "name": "permitToken",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {
              "batch(bytes[],bool)": {
                "params": {
                  "calls": "An array of inputs for each call.",
                  "revertOnFail": "If True then reverts after a failed call and stops doing further calls."
                },
                "returns": {
                  "results": "An array with the returned data of each function call, mapped one-to-one to `calls`.",
                  "successes": "An array indicating the success of a call, mapped one-to-one to `calls`."
                }
              }
            },
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b5061069b806100206000396000f3fe6080604052600436106100295760003560e01c80637c516e941461002e578063d2423b5114610050575b600080fd5b34801561003a57600080fd5b5061004e610049366004610375565b61007a565b005b61006361005e3660046102f1565b6100ee565b604051610071929190610514565b60405180910390f35b60405163d505accf60e01b81526001600160a01b0389169063d505accf906100b2908a908a908a908a908a908a908a906004016104d3565b600060405180830381600087803b1580156100cc57600080fd5b505af11580156100e0573d6000803e3d6000fd5b505050505050505050505050565b6060808367ffffffffffffffff8111801561010857600080fd5b50604051908082528060200260200182016040528015610132578160200160208202803683370190505b5091508367ffffffffffffffff8111801561014c57600080fd5b5060405190808252806020026020018201604052801561018057816020015b606081526020019060019003908161016b5790505b50905060005b8481101561028057600060603088888581811061019f57fe5b90506020028101906101b191906105c8565b6040516101bf9291906104c3565b600060405180830381855af49150503d80600081146101fa576040519150601f19603f3d011682016040523d82523d6000602084013e6101ff565b606091505b5091509150818061020e575085155b61021782610289565b9061023e5760405162461bcd60e51b815260040161023591906105ae565b60405180910390fd5b508185848151811061024c57fe5b6020026020010190151590811515815250508084848151811061026b57fe5b60209081029190910101525050600101610186565b50935093915050565b60606044825110156102cf575060408051808201909152601d81527f5472616e73616374696f6e2072657665727465642073696c656e746c7900000060208201526102ec565b600482019150818060200190518101906102e991906103fc565b90505b919050565b600080600060408486031215610305578283fd5b833567ffffffffffffffff8082111561031c578485fd5b818601915086601f83011261032f578485fd5b81358181111561033d578586fd5b8760208083028501011115610350578586fd5b60209283019550935050840135801515811461036a578182fd5b809150509250925092565b600080600080600080600080610100898b031215610391578384fd5b883561039c8161064d565b975060208901356103ac8161064d565b965060408901356103bc8161064d565b9550606089013594506080890135935060a089013560ff811681146103df578384fd5b979a969950949793969295929450505060c08201359160e0013590565b60006020828403121561040d578081fd5b815167ffffffffffffffff80821115610424578283fd5b818401915084601f830112610437578283fd5b815181811115610445578384fd5b604051601f8201601f191681016020018381118282101715610465578586fd5b60405281815283820160200187101561047c578485fd5b61048d82602083016020870161061d565b9695505050505050565b600081518084526104af81602086016020860161061d565b601f01601f19169290920160200192915050565b6000828483379101908152919050565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b604080825283519082018190526000906020906060840190828701845b8281101561054f578151151584529284019290840190600101610531565b505050838103828501528085516105668184610614565b91508192508381028201848801865b8381101561059f57858303855261058d838351610497565b94870194925090860190600101610575565b50909998505050505050505050565b6000602082526105c16020830184610497565b9392505050565b6000808335601e198436030181126105de578283fd5b83018035915067ffffffffffffffff8211156105f8578283fd5b60200191503681900382131561060d57600080fd5b9250929050565b90815260200190565b60005b83811015610638578181015183820152602001610620565b83811115610647576000848401525b50505050565b6001600160a01b038116811461066257600080fd5b5056fea26469706673582212208cd6ece7adf78535a26b3f44a4ec7e9ca7db425eec337c8554e03e09d4b5071e64736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x69B DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x29 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x7C516E94 EQ PUSH2 0x2E JUMPI DUP1 PUSH4 0xD2423B51 EQ PUSH2 0x50 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x4E PUSH2 0x49 CALLDATASIZE PUSH1 0x4 PUSH2 0x375 JUMP JUMPDEST PUSH2 0x7A JUMP JUMPDEST STOP JUMPDEST PUSH2 0x63 PUSH2 0x5E CALLDATASIZE PUSH1 0x4 PUSH2 0x2F1 JUMP JUMPDEST PUSH2 0xEE JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x71 SWAP3 SWAP2 SWAP1 PUSH2 0x514 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x40 MLOAD PUSH4 0xD505ACCF PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP10 AND SWAP1 PUSH4 0xD505ACCF SWAP1 PUSH2 0xB2 SWAP1 DUP11 SWAP1 DUP11 SWAP1 DUP11 SWAP1 DUP11 SWAP1 DUP11 SWAP1 DUP11 SWAP1 DUP11 SWAP1 PUSH1 0x4 ADD PUSH2 0x4D3 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xCC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xE0 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP1 DUP4 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0x108 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x132 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP SWAP2 POP DUP4 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0x14C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x180 JUMPI DUP2 PUSH1 0x20 ADD JUMPDEST PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x16B JUMPI SWAP1 POP JUMPDEST POP SWAP1 POP PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x280 JUMPI PUSH1 0x0 PUSH1 0x60 ADDRESS DUP9 DUP9 DUP6 DUP2 DUP2 LT PUSH2 0x19F JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0x1B1 SWAP2 SWAP1 PUSH2 0x5C8 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1BF SWAP3 SWAP2 SWAP1 PUSH2 0x4C3 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS DELEGATECALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x1FA 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 0x1FF JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 DUP1 PUSH2 0x20E JUMPI POP DUP6 ISZERO JUMPDEST PUSH2 0x217 DUP3 PUSH2 0x289 JUMP JUMPDEST SWAP1 PUSH2 0x23E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x235 SWAP2 SWAP1 PUSH2 0x5AE JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP DUP2 DUP6 DUP5 DUP2 MLOAD DUP2 LT PUSH2 0x24C JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD SWAP1 ISZERO ISZERO SWAP1 DUP2 ISZERO ISZERO DUP2 MSTORE POP POP DUP1 DUP5 DUP5 DUP2 MLOAD DUP2 LT PUSH2 0x26B JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD MSTORE POP POP PUSH1 0x1 ADD PUSH2 0x186 JUMP JUMPDEST POP SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x44 DUP3 MLOAD LT ISZERO PUSH2 0x2CF JUMPI POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x1D DUP2 MSTORE PUSH32 0x5472616E73616374696F6E2072657665727465642073696C656E746C79000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x2EC JUMP JUMPDEST PUSH1 0x4 DUP3 ADD SWAP2 POP DUP2 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x2E9 SWAP2 SWAP1 PUSH2 0x3FC JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x40 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x305 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x31C JUMPI DUP5 DUP6 REVERT JUMPDEST DUP2 DUP7 ADD SWAP2 POP DUP7 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x32F JUMPI DUP5 DUP6 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x33D JUMPI DUP6 DUP7 REVERT JUMPDEST DUP8 PUSH1 0x20 DUP1 DUP4 MUL DUP6 ADD ADD GT ISZERO PUSH2 0x350 JUMPI DUP6 DUP7 REVERT JUMPDEST PUSH1 0x20 SWAP3 DUP4 ADD SWAP6 POP SWAP4 POP POP DUP5 ADD CALLDATALOAD DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x36A JUMPI DUP2 DUP3 REVERT JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH2 0x100 DUP10 DUP12 SUB SLT ISZERO PUSH2 0x391 JUMPI DUP4 DUP5 REVERT JUMPDEST DUP9 CALLDATALOAD PUSH2 0x39C DUP2 PUSH2 0x64D JUMP JUMPDEST SWAP8 POP PUSH1 0x20 DUP10 ADD CALLDATALOAD PUSH2 0x3AC DUP2 PUSH2 0x64D JUMP JUMPDEST SWAP7 POP PUSH1 0x40 DUP10 ADD CALLDATALOAD PUSH2 0x3BC DUP2 PUSH2 0x64D JUMP JUMPDEST SWAP6 POP PUSH1 0x60 DUP10 ADD CALLDATALOAD SWAP5 POP PUSH1 0x80 DUP10 ADD CALLDATALOAD SWAP4 POP PUSH1 0xA0 DUP10 ADD CALLDATALOAD PUSH1 0xFF DUP2 AND DUP2 EQ PUSH2 0x3DF JUMPI DUP4 DUP5 REVERT JUMPDEST SWAP8 SWAP11 SWAP7 SWAP10 POP SWAP5 SWAP8 SWAP4 SWAP7 SWAP3 SWAP6 SWAP3 SWAP5 POP POP POP PUSH1 0xC0 DUP3 ADD CALLDATALOAD SWAP2 PUSH1 0xE0 ADD CALLDATALOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x40D JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x424 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP2 DUP5 ADD SWAP2 POP DUP5 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x437 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP2 MLOAD DUP2 DUP2 GT ISZERO PUSH2 0x445 JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1F DUP3 ADD PUSH1 0x1F NOT AND DUP2 ADD PUSH1 0x20 ADD DUP4 DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x465 JUMPI DUP6 DUP7 REVERT JUMPDEST PUSH1 0x40 MSTORE DUP2 DUP2 MSTORE DUP4 DUP3 ADD PUSH1 0x20 ADD DUP8 LT ISZERO PUSH2 0x47C JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH2 0x48D DUP3 PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP8 ADD PUSH2 0x61D JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH2 0x4AF DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x61D JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP5 DUP4 CALLDATACOPY SWAP2 ADD SWAP1 DUP2 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP8 DUP9 AND DUP2 MSTORE SWAP6 SWAP1 SWAP7 AND PUSH1 0x20 DUP7 ADD MSTORE PUSH1 0x40 DUP6 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x60 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xFF AND PUSH1 0x80 DUP4 ADD MSTORE PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xC0 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xE0 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 DUP3 MSTORE DUP4 MLOAD SWAP1 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP1 PUSH1 0x20 SWAP1 PUSH1 0x60 DUP5 ADD SWAP1 DUP3 DUP8 ADD DUP5 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x54F JUMPI DUP2 MLOAD ISZERO ISZERO DUP5 MSTORE SWAP3 DUP5 ADD SWAP3 SWAP1 DUP5 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x531 JUMP JUMPDEST POP POP POP DUP4 DUP2 SUB DUP3 DUP6 ADD MSTORE DUP1 DUP6 MLOAD PUSH2 0x566 DUP2 DUP5 PUSH2 0x614 JUMP JUMPDEST SWAP2 POP DUP2 SWAP3 POP DUP4 DUP2 MUL DUP3 ADD DUP5 DUP9 ADD DUP7 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x59F JUMPI DUP6 DUP4 SUB DUP6 MSTORE PUSH2 0x58D DUP4 DUP4 MLOAD PUSH2 0x497 JUMP JUMPDEST SWAP5 DUP8 ADD SWAP5 SWAP3 POP SWAP1 DUP7 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x575 JUMP JUMPDEST POP SWAP1 SWAP10 SWAP9 POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE PUSH2 0x5C1 PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x497 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH1 0x1E NOT DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x5DE JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 ADD DUP1 CALLDATALOAD SWAP2 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x5F8 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH1 0x20 ADD SWAP2 POP CALLDATASIZE DUP2 SWAP1 SUB DUP3 SGT ISZERO PUSH2 0x60D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x638 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x620 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x647 JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x662 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 DUP13 0xD6 0xEC 0xE7 0xAD 0xF7 DUP6 CALLDATALOAD LOG2 PUSH12 0x3F44A4EC7E9CA7DB425EEC33 PUSH29 0x8554E03E09D4B5071E64736F6C634300060C0033000000000000000000 ",
              "sourceMap": "26699:653:0:-:0;;;;;;;;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "6080604052600436106100295760003560e01c80637c516e941461002e578063d2423b5114610050575b600080fd5b34801561003a57600080fd5b5061004e610049366004610375565b61007a565b005b61006361005e3660046102f1565b6100ee565b604051610071929190610514565b60405180910390f35b60405163d505accf60e01b81526001600160a01b0389169063d505accf906100b2908a908a908a908a908a908a908a906004016104d3565b600060405180830381600087803b1580156100cc57600080fd5b505af11580156100e0573d6000803e3d6000fd5b505050505050505050505050565b6060808367ffffffffffffffff8111801561010857600080fd5b50604051908082528060200260200182016040528015610132578160200160208202803683370190505b5091508367ffffffffffffffff8111801561014c57600080fd5b5060405190808252806020026020018201604052801561018057816020015b606081526020019060019003908161016b5790505b50905060005b8481101561028057600060603088888581811061019f57fe5b90506020028101906101b191906105c8565b6040516101bf9291906104c3565b600060405180830381855af49150503d80600081146101fa576040519150601f19603f3d011682016040523d82523d6000602084013e6101ff565b606091505b5091509150818061020e575085155b61021782610289565b9061023e5760405162461bcd60e51b815260040161023591906105ae565b60405180910390fd5b508185848151811061024c57fe5b6020026020010190151590811515815250508084848151811061026b57fe5b60209081029190910101525050600101610186565b50935093915050565b60606044825110156102cf575060408051808201909152601d81527f5472616e73616374696f6e2072657665727465642073696c656e746c7900000060208201526102ec565b600482019150818060200190518101906102e991906103fc565b90505b919050565b600080600060408486031215610305578283fd5b833567ffffffffffffffff8082111561031c578485fd5b818601915086601f83011261032f578485fd5b81358181111561033d578586fd5b8760208083028501011115610350578586fd5b60209283019550935050840135801515811461036a578182fd5b809150509250925092565b600080600080600080600080610100898b031215610391578384fd5b883561039c8161064d565b975060208901356103ac8161064d565b965060408901356103bc8161064d565b9550606089013594506080890135935060a089013560ff811681146103df578384fd5b979a969950949793969295929450505060c08201359160e0013590565b60006020828403121561040d578081fd5b815167ffffffffffffffff80821115610424578283fd5b818401915084601f830112610437578283fd5b815181811115610445578384fd5b604051601f8201601f191681016020018381118282101715610465578586fd5b60405281815283820160200187101561047c578485fd5b61048d82602083016020870161061d565b9695505050505050565b600081518084526104af81602086016020860161061d565b601f01601f19169290920160200192915050565b6000828483379101908152919050565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b604080825283519082018190526000906020906060840190828701845b8281101561054f578151151584529284019290840190600101610531565b505050838103828501528085516105668184610614565b91508192508381028201848801865b8381101561059f57858303855261058d838351610497565b94870194925090860190600101610575565b50909998505050505050505050565b6000602082526105c16020830184610497565b9392505050565b6000808335601e198436030181126105de578283fd5b83018035915067ffffffffffffffff8211156105f8578283fd5b60200191503681900382131561060d57600080fd5b9250929050565b90815260200190565b60005b83811015610638578181015183820152602001610620565b83811115610647576000848401525b50505050565b6001600160a01b038116811461066257600080fd5b5056fea26469706673582212208cd6ece7adf78535a26b3f44a4ec7e9ca7db425eec337c8554e03e09d4b5071e64736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x29 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x7C516E94 EQ PUSH2 0x2E JUMPI DUP1 PUSH4 0xD2423B51 EQ PUSH2 0x50 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x4E PUSH2 0x49 CALLDATASIZE PUSH1 0x4 PUSH2 0x375 JUMP JUMPDEST PUSH2 0x7A JUMP JUMPDEST STOP JUMPDEST PUSH2 0x63 PUSH2 0x5E CALLDATASIZE PUSH1 0x4 PUSH2 0x2F1 JUMP JUMPDEST PUSH2 0xEE JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x71 SWAP3 SWAP2 SWAP1 PUSH2 0x514 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x40 MLOAD PUSH4 0xD505ACCF PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP10 AND SWAP1 PUSH4 0xD505ACCF SWAP1 PUSH2 0xB2 SWAP1 DUP11 SWAP1 DUP11 SWAP1 DUP11 SWAP1 DUP11 SWAP1 DUP11 SWAP1 DUP11 SWAP1 DUP11 SWAP1 PUSH1 0x4 ADD PUSH2 0x4D3 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xCC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xE0 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP1 DUP4 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0x108 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x132 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP SWAP2 POP DUP4 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0x14C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x180 JUMPI DUP2 PUSH1 0x20 ADD JUMPDEST PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x16B JUMPI SWAP1 POP JUMPDEST POP SWAP1 POP PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x280 JUMPI PUSH1 0x0 PUSH1 0x60 ADDRESS DUP9 DUP9 DUP6 DUP2 DUP2 LT PUSH2 0x19F JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0x1B1 SWAP2 SWAP1 PUSH2 0x5C8 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1BF SWAP3 SWAP2 SWAP1 PUSH2 0x4C3 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS DELEGATECALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x1FA 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 0x1FF JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 DUP1 PUSH2 0x20E JUMPI POP DUP6 ISZERO JUMPDEST PUSH2 0x217 DUP3 PUSH2 0x289 JUMP JUMPDEST SWAP1 PUSH2 0x23E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x235 SWAP2 SWAP1 PUSH2 0x5AE JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP DUP2 DUP6 DUP5 DUP2 MLOAD DUP2 LT PUSH2 0x24C JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD SWAP1 ISZERO ISZERO SWAP1 DUP2 ISZERO ISZERO DUP2 MSTORE POP POP DUP1 DUP5 DUP5 DUP2 MLOAD DUP2 LT PUSH2 0x26B JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD MSTORE POP POP PUSH1 0x1 ADD PUSH2 0x186 JUMP JUMPDEST POP SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x44 DUP3 MLOAD LT ISZERO PUSH2 0x2CF JUMPI POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x1D DUP2 MSTORE PUSH32 0x5472616E73616374696F6E2072657665727465642073696C656E746C79000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x2EC JUMP JUMPDEST PUSH1 0x4 DUP3 ADD SWAP2 POP DUP2 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x2E9 SWAP2 SWAP1 PUSH2 0x3FC JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x40 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x305 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x31C JUMPI DUP5 DUP6 REVERT JUMPDEST DUP2 DUP7 ADD SWAP2 POP DUP7 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x32F JUMPI DUP5 DUP6 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x33D JUMPI DUP6 DUP7 REVERT JUMPDEST DUP8 PUSH1 0x20 DUP1 DUP4 MUL DUP6 ADD ADD GT ISZERO PUSH2 0x350 JUMPI DUP6 DUP7 REVERT JUMPDEST PUSH1 0x20 SWAP3 DUP4 ADD SWAP6 POP SWAP4 POP POP DUP5 ADD CALLDATALOAD DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x36A JUMPI DUP2 DUP3 REVERT JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH2 0x100 DUP10 DUP12 SUB SLT ISZERO PUSH2 0x391 JUMPI DUP4 DUP5 REVERT JUMPDEST DUP9 CALLDATALOAD PUSH2 0x39C DUP2 PUSH2 0x64D JUMP JUMPDEST SWAP8 POP PUSH1 0x20 DUP10 ADD CALLDATALOAD PUSH2 0x3AC DUP2 PUSH2 0x64D JUMP JUMPDEST SWAP7 POP PUSH1 0x40 DUP10 ADD CALLDATALOAD PUSH2 0x3BC DUP2 PUSH2 0x64D JUMP JUMPDEST SWAP6 POP PUSH1 0x60 DUP10 ADD CALLDATALOAD SWAP5 POP PUSH1 0x80 DUP10 ADD CALLDATALOAD SWAP4 POP PUSH1 0xA0 DUP10 ADD CALLDATALOAD PUSH1 0xFF DUP2 AND DUP2 EQ PUSH2 0x3DF JUMPI DUP4 DUP5 REVERT JUMPDEST SWAP8 SWAP11 SWAP7 SWAP10 POP SWAP5 SWAP8 SWAP4 SWAP7 SWAP3 SWAP6 SWAP3 SWAP5 POP POP POP PUSH1 0xC0 DUP3 ADD CALLDATALOAD SWAP2 PUSH1 0xE0 ADD CALLDATALOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x40D JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x424 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP2 DUP5 ADD SWAP2 POP DUP5 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x437 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP2 MLOAD DUP2 DUP2 GT ISZERO PUSH2 0x445 JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1F DUP3 ADD PUSH1 0x1F NOT AND DUP2 ADD PUSH1 0x20 ADD DUP4 DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x465 JUMPI DUP6 DUP7 REVERT JUMPDEST PUSH1 0x40 MSTORE DUP2 DUP2 MSTORE DUP4 DUP3 ADD PUSH1 0x20 ADD DUP8 LT ISZERO PUSH2 0x47C JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH2 0x48D DUP3 PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP8 ADD PUSH2 0x61D JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH2 0x4AF DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x61D JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP5 DUP4 CALLDATACOPY SWAP2 ADD SWAP1 DUP2 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP8 DUP9 AND DUP2 MSTORE SWAP6 SWAP1 SWAP7 AND PUSH1 0x20 DUP7 ADD MSTORE PUSH1 0x40 DUP6 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x60 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xFF AND PUSH1 0x80 DUP4 ADD MSTORE PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xC0 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xE0 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 DUP3 MSTORE DUP4 MLOAD SWAP1 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP1 PUSH1 0x20 SWAP1 PUSH1 0x60 DUP5 ADD SWAP1 DUP3 DUP8 ADD DUP5 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x54F JUMPI DUP2 MLOAD ISZERO ISZERO DUP5 MSTORE SWAP3 DUP5 ADD SWAP3 SWAP1 DUP5 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x531 JUMP JUMPDEST POP POP POP DUP4 DUP2 SUB DUP3 DUP6 ADD MSTORE DUP1 DUP6 MLOAD PUSH2 0x566 DUP2 DUP5 PUSH2 0x614 JUMP JUMPDEST SWAP2 POP DUP2 SWAP3 POP DUP4 DUP2 MUL DUP3 ADD DUP5 DUP9 ADD DUP7 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x59F JUMPI DUP6 DUP4 SUB DUP6 MSTORE PUSH2 0x58D DUP4 DUP4 MLOAD PUSH2 0x497 JUMP JUMPDEST SWAP5 DUP8 ADD SWAP5 SWAP3 POP SWAP1 DUP7 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x575 JUMP JUMPDEST POP SWAP1 SWAP10 SWAP9 POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE PUSH2 0x5C1 PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x497 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH1 0x1E NOT DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x5DE JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 ADD DUP1 CALLDATALOAD SWAP2 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x5F8 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH1 0x20 ADD SWAP2 POP CALLDATASIZE DUP2 SWAP1 SUB DUP3 SGT ISZERO PUSH2 0x60D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x638 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x620 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x647 JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x662 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 DUP13 0xD6 0xEC 0xE7 0xAD 0xF7 DUP6 CALLDATALOAD LOG2 PUSH12 0x3F44A4EC7E9CA7DB425EEC33 PUSH29 0x8554E03E09D4B5071E64736F6C634300060C0033000000000000000000 ",
              "sourceMap": "26699:653:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;27081:269;;;;;;;;;;-1:-1:-1;27081:269:0;;;;;:::i;:::-;;:::i;:::-;;26174:521;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;27081:269;27294:49;;-1:-1:-1;;;27294:49:0;;-1:-1:-1;;;;;27294:12:0;;;;;:49;;27307:4;;27313:2;;27317:6;;27325:8;;27335:1;;27338;;27341;;27294:49;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27081:269;;;;;;;;:::o;26174:521::-;26258:23;;26340:5;26329:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26329:24:0;-1:-1:-1;26317:36:0;-1:-1:-1;26385:5:0;26373:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26363:35;;26413:9;26408:281;26428:16;;;26408:281;;;26466:12;26480:19;26511:4;26530:5;;26536:1;26530:8;;;;;;;;;;;;;;;;;;:::i;:::-;26503:36;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26465:74;;;;26561:7;:24;;;;26573:12;26572:13;26561:24;26587:21;26601:6;26587:13;:21::i;:::-;26553:56;;;;;-1:-1:-1;;;26553:56:0;;;;;;;;:::i;:::-;;;;;;;;;;26638:7;26623:9;26633:1;26623:12;;;;;;;;;;;;;:22;;;;;;;;;;;26672:6;26659:7;26667:1;26659:10;;;;;;;;;;;;;;;;;:19;-1:-1:-1;;26446:3:0;;26408:281;;;;26174:521;;;;;;:::o;24858:487::-;24930:13;25091:2;25070:11;:18;:23;25066:67;;;-1:-1:-1;25095:38:0;;;;;;;;;;;;;;;;;;;25066:67;25233:4;25220:11;25216:22;25201:37;;25275:11;25264:33;;;;;;;;;;;;:::i;:::-;25257:40;;24858:487;;;;:::o;1683:538:-1:-;;;;1847:2;1835:9;1826:7;1822:23;1818:32;1815:2;;;-1:-1;;1853:12;1815:2;1911:17;1898:31;1949:18;;1941:6;1938:30;1935:2;;;-1:-1;;1971:12;1935:2;2083:6;2072:9;2068:22;;;299:3;292:4;284:6;280:17;276:27;266:2;;-1:-1;;307:12;266:2;350:6;337:20;1949:18;369:6;366:30;363:2;;;-1:-1;;399:12;363:2;494:3;443:4;;478:6;474:17;435:6;460:32;;457:41;454:2;;;-1:-1;;501:12;454:2;443:4;431:17;;;;-1:-1;1991:109;-1:-1;;2173:22;;593:20;12779:13;;12772:21;14006:32;;13996:2;;-1:-1;;14042:12;13996:2;2145:60;;;;1809:412;;;;;:::o;2228:1143::-;;;;;;;;;2462:3;2450:9;2441:7;2437:23;2433:33;2430:2;;;-1:-1;;2469:12;2430:2;890:6;877:20;902:46;942:5;902:46;:::i;:::-;2521:76;-1:-1;2634:2;2673:22;;72:20;97:33;72:20;97:33;:::i;:::-;2642:63;-1:-1;2742:2;2781:22;;72:20;97:33;72:20;97:33;:::i;:::-;2750:63;-1:-1;2850:2;2889:22;;1480:20;;-1:-1;2958:3;2998:22;;1480:20;;-1:-1;3067:3;3105:22;;1615:20;13273:4;13262:16;;14523:33;;14513:2;;-1:-1;;14560:12;14513:2;2424:947;;;;-1:-1;2424:947;;;;;;3076:61;;-1:-1;;;3174:3;3214:22;;727:20;;3283:3;3323:22;727:20;;2424:947::o;3378:362::-;;3503:2;3491:9;3482:7;3478:23;3474:32;3471:2;;;-1:-1;;3509:12;3471:2;3560:17;3554:24;3598:18;;3590:6;3587:30;3584:2;;;-1:-1;;3620:12;3584:2;3707:6;3696:9;3692:22;;;1074:3;1067:4;1059:6;1055:17;1051:27;1041:2;;-1:-1;;1082:12;1041:2;1122:6;1116:13;3598:18;10447:6;10444:30;10441:2;;;-1:-1;;10477:12;10441:2;10110;10104:9;10550;10531:17;;-1:-1;;10527:33;10136:17;;3503:2;10136:17;10196:34;;;10232:22;;;10193:62;10190:2;;;-1:-1;;10258:12;10190:2;10110;10277:22;1215:21;;;1315:16;;;3503:2;1315:16;1312:25;-1:-1;1309:2;;;-1:-1;;1340:12;1309:2;1360:39;1392:6;3503:2;1291:5;1287:16;3503:2;1257:6;1253:17;1360:39;:::i;:::-;3640:84;3465:275;-1:-1;;;;;;3465:275::o;6451:323::-;;6583:5;11062:12;11877:6;11872:3;11865:19;6666:52;6711:6;11914:4;11909:3;11905:14;11914:4;6692:5;6688:16;6666:52;:::i;:::-;10550:9;13789:14;-1:-1;;13785:28;6730:39;;;;11914:4;6730:39;;6531:243;-1:-1;;6531:243::o;7369:291::-;;13372:6;13367:3;13362;13349:30;13410:16;;13403:27;;;13410:16;7513:147;-1:-1;7513:147::o;7667:884::-;-1:-1;;;;;13057:54;;;4186:37;;13057:54;;;;8123:2;8108:18;;4186:37;8206:2;8191:18;;6061:37;;;;8289:2;8274:18;;6061:37;;;;13273:4;13262:16;8368:3;8353:19;;7322:35;13068:42;8437:19;;6061:37;8536:3;8521:19;;6061:37;;;;7958:3;7943:19;;7929:622::o;8558:653::-;8825:2;8839:47;;;11062:12;;8810:18;;;11865:19;;;8558:653;;11914:4;;11905:14;;;;10752;;;8558:653;4653:251;4678:6;4675:1;4672:13;4653:251;;;4739:13;;12779;12772:21;5944:34;;3889:14;;;;11599;;;;4700:1;4693:9;4653:251;;;4657:14;;;9050:9;9044:4;9040:20;11914:4;9024:9;9020:18;9013:48;9075:126;5181:5;11062:12;5200:95;5288:6;5283:3;5200:95;:::i;:::-;5193:102;;;;;11914:4;5352:6;5348:17;5343:3;5339:27;11914:4;5446:5;10752:14;-1:-1;5485:357;5510:6;5507:1;5504:13;5485:357;;;5572:9;5566:4;5562:20;5557:3;5550:33;4037:64;4097:3;5617:6;5611:13;4037:64;:::i;:::-;5821:14;;;;5631:90;-1:-1;11599:14;;;;4700:1;5525:9;5485:357;;;-1:-1;9067:134;;8796:415;-1:-1;;;;;;;;;8796:415::o;9218:310::-;;9365:2;9386:17;9379:47;9440:78;9365:2;9354:9;9350:18;9504:6;9440:78;:::i;:::-;9432:86;9336:192;-1:-1;;;9336:192::o;9535:506::-;;;9670:11;9657:25;9721:48;;9745:8;9729:14;9725:29;9721:48;9701:18;9697:73;9687:2;;-1:-1;;9774:12;9687:2;9801:33;;9855:18;;;-1:-1;9893:18;9882:30;;9879:2;;;-1:-1;;9915:12;9879:2;9760:4;9943:13;;-1:-1;9729:14;9975:38;;;9965:49;;9962:2;;;10027:1;;10017:12;9962:2;9625:416;;;;;:::o;11750:175::-;11865:19;;;11914:4;11905:14;;11858:67::o;13445:268::-;13510:1;13517:101;13531:6;13528:1;13525:13;13517:101;;;13598:11;;;13592:18;13579:11;;;13572:39;13553:2;13546:10;13517:101;;;13633:6;13630:1;13627:13;13624:2;;;13510:1;13689:6;13684:3;13680:16;13673:27;13624:2;;13494:219;;;:::o;13826:117::-;-1:-1;;;;;13057:54;;13885:35;;13875:2;;13934:1;;13924:12;13875:2;13869:74;:::o"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "338200",
                "executionCost": "374",
                "totalCost": "338574"
              },
              "external": {
                "batch(bytes[],bool)": "infinite",
                "permitToken(address,address,address,uint256,uint256,uint8,bytes32,bytes32)": "infinite"
              }
            },
            "methodIdentifiers": {
              "batch(bytes[],bool)": "d2423b51",
              "permitToken(address,address,address,uint256,uint256,uint8,bytes32,bytes32)": "7c516e94"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"bytes[]\",\"name\":\"calls\",\"type\":\"bytes[]\"},{\"internalType\":\"bool\",\"name\":\"revertOnFail\",\"type\":\"bool\"}],\"name\":\"batch\",\"outputs\":[{\"internalType\":\"bool[]\",\"name\":\"successes\",\"type\":\"bool[]\"},{\"internalType\":\"bytes[]\",\"name\":\"results\",\"type\":\"bytes[]\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permitToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"batch(bytes[],bool)\":{\"params\":{\"calls\":\"An array of inputs for each call.\",\"revertOnFail\":\"If True then reverts after a failed call and stops doing further calls.\"},\"returns\":{\"results\":\"An array with the returned data of each function call, mapped one-to-one to `calls`.\",\"successes\":\"An array indicating the success of a call, mapped one-to-one to `calls`.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"batch(bytes[],bool)\":{\"notice\":\"Allows batched call to self (this contract).\"},\"permitToken(address,address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"notice\":\"Call wrapper that performs `ERC20.permit` on `token`. Lookup `IERC20.permit`.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/bentobox/BentoBoxV1.sol\":\"BoringBatchable\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/bentobox/BentoBoxV1.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\n// The BentoBox\\n\\n//  \\u2584\\u2584\\u2584\\u2584\\u00b7 \\u2584\\u2584\\u2584 . \\u2590 \\u2584 \\u2584\\u2584\\u2584\\u2584\\u2584      \\u2584\\u2584\\u2584\\u2584\\u00b7       \\u2590\\u2584\\u2022 \\u2584\\n//  \\u2590\\u2588 \\u2580\\u2588\\u25aa\\u2580\\u2584.\\u2580\\u00b7\\u2588\\u258c\\u2590\\u2588\\u2022\\u2588\\u2588  \\u25aa     \\u2590\\u2588 \\u2580\\u2588\\u25aa\\u25aa      \\u2588\\u258c\\u2588\\u258c\\u25aa\\n//  \\u2590\\u2588\\u2580\\u2580\\u2588\\u2584\\u2590\\u2580\\u2580\\u25aa\\u2584\\u2590\\u2588\\u2590\\u2590\\u258c \\u2590\\u2588.\\u25aa \\u2584\\u2588\\u2580\\u2584 \\u2590\\u2588\\u2580\\u2580\\u2588\\u2584 \\u2584\\u2588\\u2580\\u2584  \\u00b7\\u2588\\u2588\\u00b7\\n//  \\u2588\\u2588\\u2584\\u25aa\\u2590\\u2588\\u2590\\u2588\\u2584\\u2584\\u258c\\u2588\\u2588\\u2590\\u2588\\u258c \\u2590\\u2588\\u258c\\u00b7\\u2590\\u2588\\u258c.\\u2590\\u258c\\u2588\\u2588\\u2584\\u25aa\\u2590\\u2588\\u2590\\u2588\\u258c.\\u2590\\u258c\\u25aa\\u2590\\u2588\\u00b7\\u2588\\u258c\\n//  \\u00b7\\u2580\\u2580\\u2580\\u2580  \\u2580\\u2580\\u2580 \\u2580\\u2580 \\u2588\\u25aa \\u2580\\u2580\\u2580  \\u2580\\u2588\\u2584\\u2580\\u25aa\\u00b7\\u2580\\u2580\\u2580\\u2580  \\u2580\\u2588\\u2584\\u2580\\u25aa\\u2022\\u2580\\u2580 \\u2580\\u2580\\n\\n// This contract stores funds, handles their transfers, supports flash loans and strategies.\\n\\n// Copyright (c) 2021 BoringCrypto - All rights reserved\\n// Twitter: @Boring_Crypto\\n\\n// Special thanks to Keno for all his hard work and support\\n\\n// Version 22-Mar-2021\\n\\npragma solidity 0.6.12;\\npragma experimental ABIEncoderV2;\\n\\n// solhint-disable avoid-low-level-calls\\n// solhint-disable not-rely-on-time\\n// solhint-disable no-inline-assembly\\n\\n// File @boringcrypto/boring-solidity/contracts/interfaces/IERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ninterface IERC20 {\\n    function totalSupply() external view returns (uint256);\\n\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /// @notice EIP 2612\\n    function permit(\\n        address owner,\\n        address spender,\\n        uint256 value,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) external;\\n}\\n\\n// File contracts/interfaces/IFlashLoan.sol\\n// License-Identifier: MIT\\n\\ninterface IFlashBorrower {\\n    /// @notice The flashloan callback. `amount` + `fee` needs to repayed to msg.sender before this call returns.\\n    /// @param sender The address of the invoker of this flashloan.\\n    /// @param token The address of the token that is loaned.\\n    /// @param amount of the `token` that is loaned.\\n    /// @param fee The fee that needs to be paid on top for this loan. Needs to be the same as `token`.\\n    /// @param data Additional data that was passed to the flashloan function.\\n    function onFlashLoan(\\n        address sender,\\n        IERC20 token,\\n        uint256 amount,\\n        uint256 fee,\\n        bytes calldata data\\n    ) external;\\n}\\n\\ninterface IBatchFlashBorrower {\\n    /// @notice The callback for batched flashloans. Every amount + fee needs to repayed to msg.sender before this call returns.\\n    /// @param sender The address of the invoker of this flashloan.\\n    /// @param tokens Array of addresses for ERC-20 tokens that is loaned.\\n    /// @param amounts A one-to-one map to `tokens` that is loaned.\\n    /// @param fees A one-to-one map to `tokens` that needs to be paid on top for each loan. Needs to be the same token.\\n    /// @param data Additional data that was passed to the flashloan function.\\n    function onBatchFlashLoan(\\n        address sender,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        uint256[] calldata fees,\\n        bytes calldata data\\n    ) external;\\n}\\n\\n// File contracts/interfaces/IWETH.sol\\n// License-Identifier: MIT\\n\\ninterface IWETH {\\n    function deposit() external payable;\\n\\n    function withdraw(uint256) external;\\n}\\n\\n// File contracts/interfaces/IStrategy.sol\\n// License-Identifier: MIT\\n\\ninterface IStrategy {\\n    /// @notice Send the assets to the Strategy and call skim to invest them.\\n    /// @param amount The amount of tokens to invest.\\n    function skim(uint256 amount) external;\\n\\n    /// @notice Harvest any profits made converted to the asset and pass them to the caller.\\n    /// @param balance The amount of tokens the caller thinks it has invested.\\n    /// @param sender The address of the initiator of this transaction. Can be used for reimbursements, etc.\\n    /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.\\n    function harvest(uint256 balance, address sender) external returns (int256 amountAdded);\\n\\n    /// @notice Withdraw assets. The returned amount can differ from the requested amount due to rounding.\\n    /// @dev The `actualAmount` should be very close to the amount.\\n    /// The difference should NOT be used to report a loss. That's what harvest is for.\\n    /// @param amount The requested amount the caller wants to withdraw.\\n    /// @return actualAmount The real amount that is withdrawn.\\n    function withdraw(uint256 amount) external returns (uint256 actualAmount);\\n\\n    /// @notice Withdraw all assets in the safest way possible. This shouldn't fail.\\n    /// @param balance The amount of tokens the caller thinks it has invested.\\n    /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.\\n    function exit(uint256 balance) external returns (int256 amountAdded);\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\nlibrary BoringERC20 {\\n    bytes4 private constant SIG_SYMBOL = 0x95d89b41; // symbol()\\n    bytes4 private constant SIG_NAME = 0x06fdde03; // name()\\n    bytes4 private constant SIG_DECIMALS = 0x313ce567; // decimals()\\n    bytes4 private constant SIG_TRANSFER = 0xa9059cbb; // transfer(address,uint256)\\n    bytes4 private constant SIG_TRANSFER_FROM = 0x23b872dd; // transferFrom(address,address,uint256)\\n\\n    /// @notice Provides a safe ERC20.transfer version for different ERC-20 implementations.\\n    /// Reverts on a failed transfer.\\n    /// @param token The address of the ERC-20 token.\\n    /// @param to Transfer tokens to.\\n    /// @param amount The token amount.\\n    function safeTransfer(\\n        IERC20 token,\\n        address to,\\n        uint256 amount\\n    ) internal {\\n        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER, to, amount));\\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: Transfer failed\\\");\\n    }\\n\\n    /// @notice Provides a safe ERC20.transferFrom version for different ERC-20 implementations.\\n    /// Reverts on a failed transfer.\\n    /// @param token The address of the ERC-20 token.\\n    /// @param from Transfer tokens from.\\n    /// @param to Transfer tokens to.\\n    /// @param amount The token amount.\\n    function safeTransferFrom(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 amount\\n    ) internal {\\n        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER_FROM, from, to, amount));\\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: TransferFrom failed\\\");\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringMath.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n/// @notice A library for performing overflow-/underflow-safe math,\\n/// updated with awesomeness from of DappHub (https://github.com/dapphub/ds-math).\\nlibrary BoringMath {\\n    function add(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require(b == 0 || (c = a * b) / b == a, \\\"BoringMath: Mul Overflow\\\");\\n    }\\n\\n    function to128(uint256 a) internal pure returns (uint128 c) {\\n        require(a <= uint128(-1), \\\"BoringMath: uint128 Overflow\\\");\\n        c = uint128(a);\\n    }\\n\\n    function to64(uint256 a) internal pure returns (uint64 c) {\\n        require(a <= uint64(-1), \\\"BoringMath: uint64 Overflow\\\");\\n        c = uint64(a);\\n    }\\n\\n    function to32(uint256 a) internal pure returns (uint32 c) {\\n        require(a <= uint32(-1), \\\"BoringMath: uint32 Overflow\\\");\\n        c = uint32(a);\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint128.\\nlibrary BoringMath128 {\\n    function add(uint128 a, uint128 b) internal pure returns (uint128 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint128 a, uint128 b) internal pure returns (uint128 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint64.\\nlibrary BoringMath64 {\\n    function add(uint64 a, uint64 b) internal pure returns (uint64 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint64 a, uint64 b) internal pure returns (uint64 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint32.\\nlibrary BoringMath32 {\\n    function add(uint32 a, uint32 b) internal pure returns (uint32 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint32 a, uint32 b) internal pure returns (uint32 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringRebase.sol@v1.2.0\\n// License-Identifier: MIT\\n\\nstruct Rebase {\\n    uint128 elastic;\\n    uint128 base;\\n}\\n\\n/// @notice A rebasing library using overflow-/underflow-safe math.\\nlibrary RebaseLibrary {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n\\n    /// @notice Calculates the base value in relationship to `elastic` and `total`.\\n    function toBase(\\n        Rebase memory total,\\n        uint256 elastic,\\n        bool roundUp\\n    ) internal pure returns (uint256 base) {\\n        if (total.elastic == 0) {\\n            base = elastic;\\n        } else {\\n            base = elastic.mul(total.base) / total.elastic;\\n            if (roundUp && base.mul(total.elastic) / total.base < elastic) {\\n                base = base.add(1);\\n            }\\n        }\\n    }\\n\\n    /// @notice Calculates the elastic value in relationship to `base` and `total`.\\n    function toElastic(\\n        Rebase memory total,\\n        uint256 base,\\n        bool roundUp\\n    ) internal pure returns (uint256 elastic) {\\n        if (total.base == 0) {\\n            elastic = base;\\n        } else {\\n            elastic = base.mul(total.elastic) / total.base;\\n            if (roundUp && elastic.mul(total.base) / total.elastic < base) {\\n                elastic = elastic.add(1);\\n            }\\n        }\\n    }\\n\\n    /// @notice Add `elastic` to `total` and doubles `total.base`.\\n    /// @return (Rebase) The new total.\\n    /// @return base in relationship to `elastic`.\\n    function add(\\n        Rebase memory total,\\n        uint256 elastic,\\n        bool roundUp\\n    ) internal pure returns (Rebase memory, uint256 base) {\\n        base = toBase(total, elastic, roundUp);\\n        total.elastic = total.elastic.add(elastic.to128());\\n        total.base = total.base.add(base.to128());\\n        return (total, base);\\n    }\\n\\n    /// @notice Sub `base` from `total` and update `total.elastic`.\\n    /// @return (Rebase) The new total.\\n    /// @return elastic in relationship to `base`.\\n    function sub(\\n        Rebase memory total,\\n        uint256 base,\\n        bool roundUp\\n    ) internal pure returns (Rebase memory, uint256 elastic) {\\n        elastic = toElastic(total, base, roundUp);\\n        total.elastic = total.elastic.sub(elastic.to128());\\n        total.base = total.base.sub(base.to128());\\n        return (total, elastic);\\n    }\\n\\n    /// @notice Add `elastic` and `base` to `total`.\\n    function add(\\n        Rebase memory total,\\n        uint256 elastic,\\n        uint256 base\\n    ) internal pure returns (Rebase memory) {\\n        total.elastic = total.elastic.add(elastic.to128());\\n        total.base = total.base.add(base.to128());\\n        return total;\\n    }\\n\\n    /// @notice Subtract `elastic` and `base` to `total`.\\n    function sub(\\n        Rebase memory total,\\n        uint256 elastic,\\n        uint256 base\\n    ) internal pure returns (Rebase memory) {\\n        total.elastic = total.elastic.sub(elastic.to128());\\n        total.base = total.base.sub(base.to128());\\n        return total;\\n    }\\n\\n    /// @notice Add `elastic` to `total` and update storage.\\n    /// @return newElastic Returns updated `elastic`.\\n    function addElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {\\n        newElastic = total.elastic = total.elastic.add(elastic.to128());\\n    }\\n\\n    /// @notice Subtract `elastic` from `total` and update storage.\\n    /// @return newElastic Returns updated `elastic`.\\n    function subElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {\\n        newElastic = total.elastic = total.elastic.sub(elastic.to128());\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringOwnable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n// Source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol + Claimable.sol\\n// Edited by BoringCrypto\\n\\ncontract BoringOwnableData {\\n    address public owner;\\n    address public pendingOwner;\\n}\\n\\ncontract BoringOwnable is BoringOwnableData {\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /// @notice `owner` defaults to msg.sender on construction.\\n    constructor() public {\\n        owner = msg.sender;\\n        emit OwnershipTransferred(address(0), msg.sender);\\n    }\\n\\n    /// @notice Transfers ownership to `newOwner`. Either directly or claimable by the new pending owner.\\n    /// Can only be invoked by the current `owner`.\\n    /// @param newOwner Address of the new owner.\\n    /// @param direct True if `newOwner` should be set immediately. False if `newOwner` needs to use `claimOwnership`.\\n    /// @param renounce Allows the `newOwner` to be `address(0)` if `direct` and `renounce` is True. Has no effect otherwise.\\n    function transferOwnership(\\n        address newOwner,\\n        bool direct,\\n        bool renounce\\n    ) public onlyOwner {\\n        if (direct) {\\n            // Checks\\n            require(newOwner != address(0) || renounce, \\\"Ownable: zero address\\\");\\n\\n            // Effects\\n            emit OwnershipTransferred(owner, newOwner);\\n            owner = newOwner;\\n            pendingOwner = address(0);\\n        } else {\\n            // Effects\\n            pendingOwner = newOwner;\\n        }\\n    }\\n\\n    /// @notice Needs to be called by `pendingOwner` to claim ownership.\\n    function claimOwnership() public {\\n        address _pendingOwner = pendingOwner;\\n\\n        // Checks\\n        require(msg.sender == _pendingOwner, \\\"Ownable: caller != pending owner\\\");\\n\\n        // Effects\\n        emit OwnershipTransferred(owner, _pendingOwner);\\n        owner = _pendingOwner;\\n        pendingOwner = address(0);\\n    }\\n\\n    /// @notice Only allows the `owner` to execute the function.\\n    modifier onlyOwner() {\\n        require(msg.sender == owner, \\\"Ownable: caller is not the owner\\\");\\n        _;\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/interfaces/IMasterContract.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ninterface IMasterContract {\\n    /// @notice Init function that gets called from `BoringFactory.deploy`.\\n    /// Also kown as the constructor for cloned contracts.\\n    /// Any ETH send to `BoringFactory.deploy` ends up here.\\n    /// @param data Can be abi encoded arguments or anything else.\\n    function init(bytes calldata data) external payable;\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringFactory.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ncontract BoringFactory {\\n    event LogDeploy(address indexed masterContract, bytes data, address indexed cloneAddress);\\n\\n    /// @notice Mapping from clone contracts to their masterContract.\\n    mapping(address => address) public masterContractOf;\\n\\n    /// @notice Deploys a given master Contract as a clone.\\n    /// Any ETH transferred with this call is forwarded to the new clone.\\n    /// Emits `LogDeploy`.\\n    /// @param masterContract The address of the contract to clone.\\n    /// @param data Additional abi encoded calldata that is passed to the new clone via `IMasterContract.init`.\\n    /// @param useCreate2 Creates the clone by using the CREATE2 opcode, in this case `data` will be used as salt.\\n    /// @return cloneAddress Address of the created clone contract.\\n    function deploy(\\n        address masterContract,\\n        bytes calldata data,\\n        bool useCreate2\\n    ) public payable returns (address cloneAddress) {\\n        require(masterContract != address(0), \\\"BoringFactory: No masterContract\\\");\\n        bytes20 targetBytes = bytes20(masterContract); // Takes the first 20 bytes of the masterContract's address\\n\\n        if (useCreate2) {\\n            // each masterContract has different code already. So clones are distinguished by their data only.\\n            bytes32 salt = keccak256(data);\\n\\n            // Creates clone, more info here: https://blog.openzeppelin.com/deep-dive-into-the-minimal-proxy-contract/\\n            assembly {\\n                let clone := mload(0x40)\\n                mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n                mstore(add(clone, 0x14), targetBytes)\\n                mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n                cloneAddress := create2(0, clone, 0x37, salt)\\n            }\\n        } else {\\n            assembly {\\n                let clone := mload(0x40)\\n                mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n                mstore(add(clone, 0x14), targetBytes)\\n                mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n                cloneAddress := create(0, clone, 0x37)\\n            }\\n        }\\n        masterContractOf[cloneAddress] = masterContract;\\n\\n        IMasterContract(cloneAddress).init{value: msg.value}(data);\\n\\n        emit LogDeploy(masterContract, data, cloneAddress);\\n    }\\n}\\n\\n// File contracts/MasterContractManager.sol\\n// License-Identifier: UNLICENSED\\n\\ncontract MasterContractManager is BoringOwnable, BoringFactory {\\n    event LogWhiteListMasterContract(address indexed masterContract, bool approved);\\n    event LogSetMasterContractApproval(address indexed masterContract, address indexed user, bool approved);\\n    event LogRegisterProtocol(address indexed protocol);\\n\\n    /// @notice masterContract to user to approval state\\n    mapping(address => mapping(address => bool)) public masterContractApproved;\\n    /// @notice masterContract to whitelisted state for approval without signed message\\n    mapping(address => bool) public whitelistedMasterContracts;\\n    /// @notice user nonces for masterContract approvals\\n    mapping(address => uint256) public nonces;\\n\\n    bytes32 private constant DOMAIN_SEPARATOR_SIGNATURE_HASH = keccak256(\\\"EIP712Domain(string name,uint256 chainId,address verifyingContract)\\\");\\n    // See https://eips.ethereum.org/EIPS/eip-191\\n    string private constant EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA = \\\"\\\\x19\\\\x01\\\";\\n    bytes32 private constant APPROVAL_SIGNATURE_HASH =\\n        keccak256(\\\"SetMasterContractApproval(string warning,address user,address masterContract,bool approved,uint256 nonce)\\\");\\n\\n    // solhint-disable-next-line var-name-mixedcase\\n    bytes32 private immutable _DOMAIN_SEPARATOR;\\n    // solhint-disable-next-line var-name-mixedcase\\n    uint256 private immutable DOMAIN_SEPARATOR_CHAIN_ID;\\n\\n    constructor() public {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        _DOMAIN_SEPARATOR = _calculateDomainSeparator(DOMAIN_SEPARATOR_CHAIN_ID = chainId);\\n    }\\n\\n    function _calculateDomainSeparator(uint256 chainId) private view returns (bytes32) {\\n        return keccak256(abi.encode(DOMAIN_SEPARATOR_SIGNATURE_HASH, keccak256(\\\"BentoBox V1\\\"), chainId, address(this)));\\n    }\\n\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() public view returns (bytes32) {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        return chainId == DOMAIN_SEPARATOR_CHAIN_ID ? _DOMAIN_SEPARATOR : _calculateDomainSeparator(chainId);\\n    }\\n\\n    /// @notice Other contracts need to register with this master contract so that users can approve them for the BentoBox.\\n    function registerProtocol() public {\\n        masterContractOf[msg.sender] = msg.sender;\\n        emit LogRegisterProtocol(msg.sender);\\n    }\\n\\n    /// @notice Enables or disables a contract for approval without signed message.\\n    function whitelistMasterContract(address masterContract, bool approved) public onlyOwner {\\n        // Checks\\n        require(masterContract != address(0), \\\"MasterCMgr: Cannot approve 0\\\");\\n\\n        // Effects\\n        whitelistedMasterContracts[masterContract] = approved;\\n        emit LogWhiteListMasterContract(masterContract, approved);\\n    }\\n\\n    /// @notice Approves or revokes a `masterContract` access to `user` funds.\\n    /// @param user The address of the user that approves or revokes access.\\n    /// @param masterContract The address who gains or loses access.\\n    /// @param approved If True approves access. If False revokes access.\\n    /// @param v Part of the signature. (See EIP-191)\\n    /// @param r Part of the signature. (See EIP-191)\\n    /// @param s Part of the signature. (See EIP-191)\\n    // F4 - Check behaviour for all function arguments when wrong or extreme\\n    // F4: Don't allow masterContract 0 to be approved. Unknown contracts will have a masterContract of 0.\\n    // F4: User can't be 0 for signed approvals because the recoveredAddress will be 0 if ecrecover fails\\n    function setMasterContractApproval(\\n        address user,\\n        address masterContract,\\n        bool approved,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) public {\\n        // Checks\\n        require(masterContract != address(0), \\\"MasterCMgr: masterC not set\\\"); // Important for security\\n\\n        // If no signature is provided, the fallback is executed\\n        if (r == 0 && s == 0 && v == 0) {\\n            require(user == msg.sender, \\\"MasterCMgr: user not sender\\\");\\n            require(masterContractOf[user] == address(0), \\\"MasterCMgr: user is clone\\\");\\n            require(whitelistedMasterContracts[masterContract], \\\"MasterCMgr: not whitelisted\\\");\\n        } else {\\n            // Important for security - any address without masterContract has address(0) as masterContract\\n            // So approving address(0) would approve every address, leading to full loss of funds\\n            // Also, ecrecover returns address(0) on failure. So we check this:\\n            require(user != address(0), \\\"MasterCMgr: User cannot be 0\\\");\\n\\n            // C10 - Protect signatures against replay, use nonce and chainId (SWC-121)\\n            // C10: nonce + chainId are used to prevent replays\\n            // C11 - All signatures strictly EIP-712 (SWC-117 SWC-122)\\n            // C11: signature is EIP-712 compliant\\n            // C12 - abi.encodePacked can't contain variable length user input (SWC-133)\\n            // C12: abi.encodePacked has fixed length parameters\\n            bytes32 digest =\\n                keccak256(\\n                    abi.encodePacked(\\n                        EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA,\\n                        DOMAIN_SEPARATOR(),\\n                        keccak256(\\n                            abi.encode(\\n                                APPROVAL_SIGNATURE_HASH,\\n                                approved\\n                                    ? keccak256(\\\"Give FULL access to funds in (and approved to) BentoBox?\\\")\\n                                    : keccak256(\\\"Revoke access to BentoBox?\\\"),\\n                                user,\\n                                masterContract,\\n                                approved,\\n                                nonces[user]++\\n                            )\\n                        )\\n                    )\\n                );\\n            address recoveredAddress = ecrecover(digest, v, r, s);\\n            require(recoveredAddress == user, \\\"MasterCMgr: Invalid Signature\\\");\\n        }\\n\\n        // Effects\\n        masterContractApproved[masterContract][user] = approved;\\n        emit LogSetMasterContractApproval(masterContract, user, approved);\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringBatchable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ncontract BaseBoringBatchable {\\n    /// @dev Helper function to extract a useful revert message from a failed call.\\n    /// If the returned data is malformed or not correctly abi encoded then this call can fail itself.\\n    function _getRevertMsg(bytes memory _returnData) internal pure returns (string memory) {\\n        // If the _res length is less than 68, then the transaction failed silently (without a revert message)\\n        if (_returnData.length < 68) return \\\"Transaction reverted silently\\\";\\n\\n        assembly {\\n            // Slice the sighash.\\n            _returnData := add(_returnData, 0x04)\\n        }\\n        return abi.decode(_returnData, (string)); // All that remains is the revert string\\n    }\\n\\n    /// @notice Allows batched call to self (this contract).\\n    /// @param calls An array of inputs for each call.\\n    /// @param revertOnFail If True then reverts after a failed call and stops doing further calls.\\n    /// @return successes An array indicating the success of a call, mapped one-to-one to `calls`.\\n    /// @return results An array with the returned data of each function call, mapped one-to-one to `calls`.\\n    // F1: External is ok here because this is the batch function, adding it to a batch makes no sense\\n    // F2: Calls in the batch may be payable, delegatecall operates in the same context, so each call in the batch has access to msg.value\\n    // C3: The length of the loop is fully under user control, so can't be exploited\\n    // C7: Delegatecall is only used on the same contract, so it's safe\\n    function batch(bytes[] calldata calls, bool revertOnFail) external payable returns (bool[] memory successes, bytes[] memory results) {\\n        successes = new bool[](calls.length);\\n        results = new bytes[](calls.length);\\n        for (uint256 i = 0; i < calls.length; i++) {\\n            (bool success, bytes memory result) = address(this).delegatecall(calls[i]);\\n            require(success || !revertOnFail, _getRevertMsg(result));\\n            successes[i] = success;\\n            results[i] = result;\\n        }\\n    }\\n}\\n\\ncontract BoringBatchable is BaseBoringBatchable {\\n    /// @notice Call wrapper that performs `ERC20.permit` on `token`.\\n    /// Lookup `IERC20.permit`.\\n    // F6: Parameters can be used front-run the permit and the user's permit will fail (due to nonce or other revert)\\n    //     if part of a batch this could be used to grief once as the second call would not need the permit\\n    function permitToken(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) public {\\n        token.permit(from, to, amount, deadline, v, r, s);\\n    }\\n}\\n\\n// File contracts/BentoBox.sol\\n// License-Identifier: UNLICENSED\\n\\n/// @title BentoBox\\n/// @author BoringCrypto, Keno\\n/// @notice The BentoBox is a vault for tokens. The stored tokens can be flash loaned and used in strategies.\\n/// Yield from this will go to the token depositors.\\n/// Rebasing tokens ARE NOT supported and WILL cause loss of funds.\\n/// Any funds transfered directly onto the BentoBox will be lost, use the deposit function instead.\\ncontract BentoBoxV1 is MasterContractManager, BoringBatchable {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n    using BoringERC20 for IERC20;\\n    using RebaseLibrary for Rebase;\\n\\n    // ************** //\\n    // *** EVENTS *** //\\n    // ************** //\\n\\n    event LogDeposit(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogWithdraw(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogTransfer(IERC20 indexed token, address indexed from, address indexed to, uint256 share);\\n\\n    event LogFlashLoan(address indexed borrower, IERC20 indexed token, uint256 amount, uint256 feeAmount, address indexed receiver);\\n\\n    event LogStrategyTargetPercentage(IERC20 indexed token, uint256 targetPercentage);\\n    event LogStrategyQueued(IERC20 indexed token, IStrategy indexed strategy);\\n    event LogStrategySet(IERC20 indexed token, IStrategy indexed strategy);\\n    event LogStrategyInvest(IERC20 indexed token, uint256 amount);\\n    event LogStrategyDivest(IERC20 indexed token, uint256 amount);\\n    event LogStrategyProfit(IERC20 indexed token, uint256 amount);\\n    event LogStrategyLoss(IERC20 indexed token, uint256 amount);\\n\\n    // *************** //\\n    // *** STRUCTS *** //\\n    // *************** //\\n\\n    struct StrategyData {\\n        uint64 strategyStartDate;\\n        uint64 targetPercentage;\\n        uint128 balance; // the balance of the strategy that BentoBox thinks is in there\\n    }\\n\\n    // ******************************** //\\n    // *** CONSTANTS AND IMMUTABLES *** //\\n    // ******************************** //\\n\\n    // V2 - Can they be private?\\n    // V2: Private to save gas, to verify it's correct, check the constructor arguments\\n    IERC20 private immutable wethToken;\\n\\n    IERC20 private constant USE_ETHEREUM = IERC20(0);\\n    uint256 private constant FLASH_LOAN_FEE = 50; // 0.05%\\n    uint256 private constant FLASH_LOAN_FEE_PRECISION = 1e5;\\n    uint256 private constant STRATEGY_DELAY = 2 weeks;\\n    uint256 private constant MAX_TARGET_PERCENTAGE = 95; // 95%\\n    uint256 private constant MINIMUM_SHARE_BALANCE = 1000; // To prevent the ratio going off\\n\\n    // ***************** //\\n    // *** VARIABLES *** //\\n    // ***************** //\\n\\n    // Balance per token per address/contract in shares\\n    mapping(IERC20 => mapping(address => uint256)) public balanceOf;\\n\\n    // Rebase from amount to share\\n    mapping(IERC20 => Rebase) public totals;\\n\\n    mapping(IERC20 => IStrategy) public strategy;\\n    mapping(IERC20 => IStrategy) public pendingStrategy;\\n    mapping(IERC20 => StrategyData) public strategyData;\\n\\n    // ******************* //\\n    // *** CONSTRUCTOR *** //\\n    // ******************* //\\n\\n    constructor(IERC20 wethToken_) public {\\n        wethToken = wethToken_;\\n    }\\n\\n    // ***************** //\\n    // *** MODIFIERS *** //\\n    // ***************** //\\n\\n    /// Modifier to check if the msg.sender is allowed to use funds belonging to the 'from' address.\\n    /// If 'from' is msg.sender, it's allowed.\\n    /// If 'from' is the BentoBox itself, it's allowed. Any ETH, token balances (above the known balances) or BentoBox balances\\n    /// can be taken by anyone.\\n    /// This is to enable skimming, not just for deposits, but also for withdrawals or transfers, enabling better composability.\\n    /// If 'from' is a clone of a masterContract AND the 'from' address has approved that masterContract, it's allowed.\\n    modifier allowed(address from) {\\n        if (from != msg.sender && from != address(this)) {\\n            // From is sender or you are skimming\\n            address masterContract = masterContractOf[msg.sender];\\n            require(masterContract != address(0), \\\"BentoBox: no masterContract\\\");\\n            require(masterContractApproved[masterContract][from], \\\"BentoBox: Transfer not approved\\\");\\n        }\\n        _;\\n    }\\n\\n    // ************************** //\\n    // *** INTERNAL FUNCTIONS *** //\\n    // ************************** //\\n\\n    /// @dev Returns the total balance of `token` this contracts holds,\\n    /// plus the total amount this contract thinks the strategy holds.\\n    function _tokenBalanceOf(IERC20 token) internal view returns (uint256 amount) {\\n        amount = token.balanceOf(address(this)).add(strategyData[token].balance);\\n    }\\n\\n    // ************************ //\\n    // *** PUBLIC FUNCTIONS *** //\\n    // ************************ //\\n\\n    /// @dev Helper function to represent an `amount` of `token` in shares.\\n    /// @param token The ERC-20 token.\\n    /// @param amount The `token` amount.\\n    /// @param roundUp If the result `share` should be rounded up.\\n    /// @return share The token amount represented in shares.\\n    function toShare(\\n        IERC20 token,\\n        uint256 amount,\\n        bool roundUp\\n    ) external view returns (uint256 share) {\\n        share = totals[token].toBase(amount, roundUp);\\n    }\\n\\n    /// @dev Helper function represent shares back into the `token` amount.\\n    /// @param token The ERC-20 token.\\n    /// @param share The amount of shares.\\n    /// @param roundUp If the result should be rounded up.\\n    /// @return amount The share amount back into native representation.\\n    function toAmount(\\n        IERC20 token,\\n        uint256 share,\\n        bool roundUp\\n    ) external view returns (uint256 amount) {\\n        amount = totals[token].toElastic(share, roundUp);\\n    }\\n\\n    /// @notice Deposit an amount of `token` represented in either `amount` or `share`.\\n    /// @param token_ The ERC-20 token to deposit.\\n    /// @param from which account to pull the tokens.\\n    /// @param to which account to push the tokens.\\n    /// @param amount Token amount in native representation to deposit.\\n    /// @param share Token amount represented in shares to deposit. Takes precedence over `amount`.\\n    /// @return amountOut The amount deposited.\\n    /// @return shareOut The deposited amount repesented in shares.\\n    function deposit(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) public payable allowed(from) returns (uint256 amountOut, uint256 shareOut) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;\\n        Rebase memory total = totals[token];\\n\\n        // If a new token gets added, the tokenSupply call checks that this is a deployed contract. Needed for security.\\n        require(total.elastic != 0 || token.totalSupply() > 0, \\\"BentoBox: No tokens\\\");\\n        if (share == 0) {\\n            // value of the share may be lower than the amount due to rounding, that's ok\\n            share = total.toBase(amount, false);\\n            // Any deposit should lead to at least the minimum share balance, otherwise it's ignored (no amount taken)\\n            if (total.base.add(share.to128()) < MINIMUM_SHARE_BALANCE) {\\n                return (0, 0);\\n            }\\n        } else {\\n            // amount may be lower than the value of share due to rounding, in that case, add 1 to amount (Always round up)\\n            amount = total.toElastic(share, true);\\n        }\\n\\n        // In case of skimming, check that only the skimmable amount is taken.\\n        // For ETH, the full balance is available, so no need to check.\\n        // During flashloans the _tokenBalanceOf is lower than 'reality', so skimming deposits will mostly fail during a flashloan.\\n        require(\\n            from != address(this) || token_ == USE_ETHEREUM || amount <= _tokenBalanceOf(token).sub(total.elastic),\\n            \\\"BentoBox: Skim too much\\\"\\n        );\\n\\n        balanceOf[token][to] = balanceOf[token][to].add(share);\\n        total.base = total.base.add(share.to128());\\n        total.elastic = total.elastic.add(amount.to128());\\n        totals[token] = total;\\n\\n        // Interactions\\n        // During the first deposit, we check that this token is 'real'\\n        if (token_ == USE_ETHEREUM) {\\n            // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)\\n            // X2: If the WETH implementation is faulty or malicious, it will block adding ETH (but we know the WETH implementation)\\n            IWETH(address(wethToken)).deposit{value: amount}();\\n        } else if (from != address(this)) {\\n            // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)\\n            // X2: If the token implementation is faulty or malicious, it may block adding tokens. Good.\\n            token.safeTransferFrom(from, address(this), amount);\\n        }\\n        emit LogDeposit(token, from, to, amount, share);\\n        amountOut = amount;\\n        shareOut = share;\\n    }\\n\\n    /// @notice Withdraws an amount of `token` from a user account.\\n    /// @param token_ The ERC-20 token to withdraw.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param amount of tokens. Either one of `amount` or `share` needs to be supplied.\\n    /// @param share Like above, but `share` takes precedence over `amount`.\\n    function withdraw(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) public allowed(from) returns (uint256 amountOut, uint256 shareOut) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;\\n        Rebase memory total = totals[token];\\n        if (share == 0) {\\n            // value of the share paid could be lower than the amount paid due to rounding, in that case, add a share (Always round up)\\n            share = total.toBase(amount, true);\\n        } else {\\n            // amount may be lower than the value of share due to rounding, that's ok\\n            amount = total.toElastic(share, false);\\n        }\\n\\n        balanceOf[token][from] = balanceOf[token][from].sub(share);\\n        total.elastic = total.elastic.sub(amount.to128());\\n        total.base = total.base.sub(share.to128());\\n        // There have to be at least 1000 shares left to prevent reseting the share/amount ratio (unless it's fully emptied)\\n        require(total.base >= MINIMUM_SHARE_BALANCE || total.base == 0, \\\"BentoBox: cannot empty\\\");\\n        totals[token] = total;\\n\\n        // Interactions\\n        if (token_ == USE_ETHEREUM) {\\n            // X2, X3: A revert or big gas usage in the WETH contract could block withdrawals, but WETH9 is fine.\\n            IWETH(address(wethToken)).withdraw(amount);\\n            // X2, X3: A revert or big gas usage could block, however, the to address is under control of the caller.\\n            (bool success, ) = to.call{value: amount}(\\\"\\\");\\n            require(success, \\\"BentoBox: ETH transfer failed\\\");\\n        } else {\\n            // X2, X3: A malicious token could block withdrawal of just THAT token.\\n            //         masterContracts may want to take care not to rely on withdraw always succeeding.\\n            token.safeTransfer(to, amount);\\n        }\\n        emit LogWithdraw(token, from, to, amount, share);\\n        amountOut = amount;\\n        shareOut = share;\\n    }\\n\\n    /// @notice Transfer shares from a user account to another one.\\n    /// @param token The ERC-20 token to transfer.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param share The amount of `token` in shares.\\n    // Clones of master contracts can transfer from any account that has approved them\\n    // F3 - Can it be combined with another similar function?\\n    // F3: This isn't combined with transferMultiple for gas optimization\\n    function transfer(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 share\\n    ) public allowed(from) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        balanceOf[token][from] = balanceOf[token][from].sub(share);\\n        balanceOf[token][to] = balanceOf[token][to].add(share);\\n\\n        emit LogTransfer(token, from, to, share);\\n    }\\n\\n    /// @notice Transfer shares from a user account to multiple other ones.\\n    /// @param token The ERC-20 token to transfer.\\n    /// @param from which user to pull the tokens.\\n    /// @param tos The receivers of the tokens.\\n    /// @param shares The amount of `token` in shares for each receiver in `tos`.\\n    // F3 - Can it be combined with another similar function?\\n    // F3: This isn't combined with transfer for gas optimization\\n    function transferMultiple(\\n        IERC20 token,\\n        address from,\\n        address[] calldata tos,\\n        uint256[] calldata shares\\n    ) public allowed(from) {\\n        // Checks\\n        require(tos[0] != address(0), \\\"BentoBox: to[0] not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        uint256 totalAmount;\\n        uint256 len = tos.length;\\n        for (uint256 i = 0; i < len; i++) {\\n            address to = tos[i];\\n            balanceOf[token][to] = balanceOf[token][to].add(shares[i]);\\n            totalAmount = totalAmount.add(shares[i]);\\n            emit LogTransfer(token, from, to, shares[i]);\\n        }\\n        balanceOf[token][from] = balanceOf[token][from].sub(totalAmount);\\n    }\\n\\n    /// @notice Flashloan ability.\\n    /// @param borrower The address of the contract that implements and conforms to `IFlashBorrower` and handles the flashloan.\\n    /// @param receiver Address of the token receiver.\\n    /// @param token The address of the token to receive.\\n    /// @param amount of the tokens to receive.\\n    /// @param data The calldata to pass to the `borrower` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Not possible to follow this here, reentrancy has been reviewed\\n    // F6 - Check for front-running possibilities, such as the approve function (SWC-114)\\n    // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.\\n    function flashLoan(\\n        IFlashBorrower borrower,\\n        address receiver,\\n        IERC20 token,\\n        uint256 amount,\\n        bytes calldata data\\n    ) public {\\n        uint256 fee = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;\\n        token.safeTransfer(receiver, amount);\\n\\n        borrower.onFlashLoan(msg.sender, token, amount, fee, data);\\n\\n        require(_tokenBalanceOf(token) >= totals[token].addElastic(fee.to128()), \\\"BentoBox: Wrong amount\\\");\\n        emit LogFlashLoan(address(borrower), token, amount, fee, receiver);\\n    }\\n\\n    /// @notice Support for batched flashloans. Useful to request multiple different `tokens` in a single transaction.\\n    /// @param borrower The address of the contract that implements and conforms to `IBatchFlashBorrower` and handles the flashloan.\\n    /// @param receivers An array of the token receivers. A one-to-one mapping with `tokens` and `amounts`.\\n    /// @param tokens The addresses of the tokens.\\n    /// @param amounts of the tokens for each receiver.\\n    /// @param data The calldata to pass to the `borrower` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Not possible to follow this here, reentrancy has been reviewed\\n    // F6 - Check for front-running possibilities, such as the approve function (SWC-114)\\n    // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.\\n    function batchFlashLoan(\\n        IBatchFlashBorrower borrower,\\n        address[] calldata receivers,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        bytes calldata data\\n    ) public {\\n        uint256[] memory fees = new uint256[](tokens.length);\\n\\n        uint256 len = tokens.length;\\n        for (uint256 i = 0; i < len; i++) {\\n            uint256 amount = amounts[i];\\n            fees[i] = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;\\n\\n            tokens[i].safeTransfer(receivers[i], amounts[i]);\\n        }\\n\\n        borrower.onBatchFlashLoan(msg.sender, tokens, amounts, fees, data);\\n\\n        for (uint256 i = 0; i < len; i++) {\\n            IERC20 token = tokens[i];\\n            require(_tokenBalanceOf(token) >= totals[token].addElastic(fees[i].to128()), \\\"BentoBox: Wrong amount\\\");\\n            emit LogFlashLoan(address(borrower), token, amounts[i], fees[i], receivers[i]);\\n        }\\n    }\\n\\n    /// @notice Sets the target percentage of the strategy for `token`.\\n    /// @dev Only the owner of this contract is allowed to change this.\\n    /// @param token The address of the token that maps to a strategy to change.\\n    /// @param targetPercentage_ The new target in percent. Must be lesser or equal to `MAX_TARGET_PERCENTAGE`.\\n    function setStrategyTargetPercentage(IERC20 token, uint64 targetPercentage_) public onlyOwner {\\n        // Checks\\n        require(targetPercentage_ <= MAX_TARGET_PERCENTAGE, \\\"StrategyManager: Target too high\\\");\\n\\n        // Effects\\n        strategyData[token].targetPercentage = targetPercentage_;\\n        emit LogStrategyTargetPercentage(token, targetPercentage_);\\n    }\\n\\n    /// @notice Sets the contract address of a new strategy that conforms to `IStrategy` for `token`.\\n    /// Must be called twice with the same arguments.\\n    /// A new strategy becomes pending first and can be activated once `STRATEGY_DELAY` is over.\\n    /// @dev Only the owner of this contract is allowed to change this.\\n    /// @param token The address of the token that maps to a strategy to change.\\n    /// @param newStrategy The address of the contract that conforms to `IStrategy`.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Total amount is updated AFTER interaction. But strategy is under our control.\\n    // C4 - Use block.timestamp only for long intervals (SWC-116)\\n    // C4: block.timestamp is used for a period of 2 weeks, which is long enough\\n    function setStrategy(IERC20 token, IStrategy newStrategy) public onlyOwner {\\n        StrategyData memory data = strategyData[token];\\n        IStrategy pending = pendingStrategy[token];\\n        if (data.strategyStartDate == 0 || pending != newStrategy) {\\n            pendingStrategy[token] = newStrategy;\\n            // C1 - All math done through BoringMath (SWC-101)\\n            // C1: Our sun will swallow the earth well before this overflows\\n            data.strategyStartDate = (block.timestamp + STRATEGY_DELAY).to64();\\n            emit LogStrategyQueued(token, newStrategy);\\n        } else {\\n            require(data.strategyStartDate != 0 && block.timestamp >= data.strategyStartDate, \\\"StrategyManager: Too early\\\");\\n            if (address(strategy[token]) != address(0)) {\\n                int256 balanceChange = strategy[token].exit(data.balance);\\n                // Effects\\n                if (balanceChange > 0) {\\n                    uint256 add = uint256(balanceChange);\\n                    totals[token].addElastic(add);\\n                    emit LogStrategyProfit(token, add);\\n                } else if (balanceChange < 0) {\\n                    uint256 sub = uint256(-balanceChange);\\n                    totals[token].subElastic(sub);\\n                    emit LogStrategyLoss(token, sub);\\n                }\\n\\n                emit LogStrategyDivest(token, data.balance);\\n            }\\n            strategy[token] = pending;\\n            data.strategyStartDate = 0;\\n            data.balance = 0;\\n            pendingStrategy[token] = IStrategy(0);\\n            emit LogStrategySet(token, newStrategy);\\n        }\\n        strategyData[token] = data;\\n    }\\n\\n    /// @notice The actual process of yield farming. Executes the strategy of `token`.\\n    /// Optionally does housekeeping if `balance` is true.\\n    /// `maxChangeAmount` is relevant for skimming or withdrawing if `balance` is true.\\n    /// @param token The address of the token for which a strategy is deployed.\\n    /// @param balance True if housekeeping should be done.\\n    /// @param maxChangeAmount The maximum amount for either pulling or pushing from/to the `IStrategy` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Total amount is updated AFTER interaction. But strategy is under our control.\\n    // F5: Not followed to prevent reentrancy issues with flashloans and BentoBox skims?\\n    function harvest(\\n        IERC20 token,\\n        bool balance,\\n        uint256 maxChangeAmount\\n    ) public {\\n        StrategyData memory data = strategyData[token];\\n        IStrategy _strategy = strategy[token];\\n        int256 balanceChange = _strategy.harvest(data.balance, msg.sender);\\n        if (balanceChange == 0 && !balance) {\\n            return;\\n        }\\n\\n        uint256 totalElastic = totals[token].elastic;\\n\\n        if (balanceChange > 0) {\\n            uint256 add = uint256(balanceChange);\\n            totalElastic = totalElastic.add(add);\\n            totals[token].elastic = totalElastic.to128();\\n            emit LogStrategyProfit(token, add);\\n        } else if (balanceChange < 0) {\\n            // C1 - All math done through BoringMath (SWC-101)\\n            // C1: balanceChange could overflow if it's max negative int128.\\n            // But tokens with balances that large are not supported by the BentoBox.\\n            uint256 sub = uint256(-balanceChange);\\n            totalElastic = totalElastic.sub(sub);\\n            totals[token].elastic = totalElastic.to128();\\n            data.balance = data.balance.sub(sub.to128());\\n            emit LogStrategyLoss(token, sub);\\n        }\\n\\n        if (balance) {\\n            uint256 targetBalance = totalElastic.mul(data.targetPercentage) / 100;\\n            // if data.balance == targetBalance there is nothing to update\\n            if (data.balance < targetBalance) {\\n                uint256 amountOut = targetBalance.sub(data.balance);\\n                if (maxChangeAmount != 0 && amountOut > maxChangeAmount) {\\n                    amountOut = maxChangeAmount;\\n                }\\n                token.safeTransfer(address(_strategy), amountOut);\\n                data.balance = data.balance.add(amountOut.to128());\\n                _strategy.skim(amountOut);\\n                emit LogStrategyInvest(token, amountOut);\\n            } else if (data.balance > targetBalance) {\\n                uint256 amountIn = data.balance.sub(targetBalance.to128());\\n                if (maxChangeAmount != 0 && amountIn > maxChangeAmount) {\\n                    amountIn = maxChangeAmount;\\n                }\\n\\n                uint256 actualAmountIn = _strategy.withdraw(amountIn);\\n\\n                data.balance = data.balance.sub(actualAmountIn.to128());\\n                emit LogStrategyDivest(token, actualAmountIn);\\n            }\\n        }\\n\\n        strategyData[token] = data;\\n    }\\n\\n    // Contract should be able to receive ETH deposits to support deposit & skim\\n    // solhint-disable-next-line no-empty-blocks\\n    receive() external payable {}\\n}\\n\",\"keccak256\":\"0xf5251397b9aaa5c66ddc18b0cb96350ffac09f5776a1255fedc0072641f916fe\",\"license\":\"UNLICENSED\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {
              "batch(bytes[],bool)": {
                "notice": "Allows batched call to self (this contract)."
              },
              "permitToken(address,address,address,uint256,uint256,uint8,bytes32,bytes32)": {
                "notice": "Call wrapper that performs `ERC20.permit` on `token`. Lookup `IERC20.permit`."
              }
            },
            "version": 1
          }
        },
        "BoringERC20": {
          "abi": [],
          "devdoc": {
            "kind": "dev",
            "methods": {},
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "60566023600b82828239805160001a607314601657fe5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220cbd99a4aead46b4d63a6acc59e40489e769b047a344443e01cc8e1eca55cf78464736f6c634300060c0033",
              "opcodes": "PUSH1 0x56 PUSH1 0x23 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x16 JUMPI INVALID JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xCB 0xD9 SWAP11 0x4A 0xEA 0xD4 PUSH12 0x4D63A6ACC59E40489E769B04 PUSH27 0x344443E01CC8E1ECA55CF78464736F6C634300060C003300000000 ",
              "sourceMap": "5229:1694:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220cbd99a4aead46b4d63a6acc59e40489e769b047a344443e01cc8e1eca55cf78464736f6c634300060c0033",
              "opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xCB 0xD9 SWAP11 0x4A 0xEA 0xD4 PUSH12 0x4D63A6ACC59E40489E769B04 PUSH27 0x344443E01CC8E1ECA55CF78464736F6C634300060C003300000000 ",
              "sourceMap": "5229:1694:0:-:0;;;;;;;;"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "17200",
                "executionCost": "97",
                "totalCost": "17297"
              },
              "internal": {
                "safeTransfer(contract IERC20,address,uint256)": "infinite",
                "safeTransferFrom(contract IERC20,address,address,uint256)": "infinite"
              }
            },
            "methodIdentifiers": {}
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/bentobox/BentoBoxV1.sol\":\"BoringERC20\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/bentobox/BentoBoxV1.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\n// The BentoBox\\n\\n//  \\u2584\\u2584\\u2584\\u2584\\u00b7 \\u2584\\u2584\\u2584 . \\u2590 \\u2584 \\u2584\\u2584\\u2584\\u2584\\u2584      \\u2584\\u2584\\u2584\\u2584\\u00b7       \\u2590\\u2584\\u2022 \\u2584\\n//  \\u2590\\u2588 \\u2580\\u2588\\u25aa\\u2580\\u2584.\\u2580\\u00b7\\u2588\\u258c\\u2590\\u2588\\u2022\\u2588\\u2588  \\u25aa     \\u2590\\u2588 \\u2580\\u2588\\u25aa\\u25aa      \\u2588\\u258c\\u2588\\u258c\\u25aa\\n//  \\u2590\\u2588\\u2580\\u2580\\u2588\\u2584\\u2590\\u2580\\u2580\\u25aa\\u2584\\u2590\\u2588\\u2590\\u2590\\u258c \\u2590\\u2588.\\u25aa \\u2584\\u2588\\u2580\\u2584 \\u2590\\u2588\\u2580\\u2580\\u2588\\u2584 \\u2584\\u2588\\u2580\\u2584  \\u00b7\\u2588\\u2588\\u00b7\\n//  \\u2588\\u2588\\u2584\\u25aa\\u2590\\u2588\\u2590\\u2588\\u2584\\u2584\\u258c\\u2588\\u2588\\u2590\\u2588\\u258c \\u2590\\u2588\\u258c\\u00b7\\u2590\\u2588\\u258c.\\u2590\\u258c\\u2588\\u2588\\u2584\\u25aa\\u2590\\u2588\\u2590\\u2588\\u258c.\\u2590\\u258c\\u25aa\\u2590\\u2588\\u00b7\\u2588\\u258c\\n//  \\u00b7\\u2580\\u2580\\u2580\\u2580  \\u2580\\u2580\\u2580 \\u2580\\u2580 \\u2588\\u25aa \\u2580\\u2580\\u2580  \\u2580\\u2588\\u2584\\u2580\\u25aa\\u00b7\\u2580\\u2580\\u2580\\u2580  \\u2580\\u2588\\u2584\\u2580\\u25aa\\u2022\\u2580\\u2580 \\u2580\\u2580\\n\\n// This contract stores funds, handles their transfers, supports flash loans and strategies.\\n\\n// Copyright (c) 2021 BoringCrypto - All rights reserved\\n// Twitter: @Boring_Crypto\\n\\n// Special thanks to Keno for all his hard work and support\\n\\n// Version 22-Mar-2021\\n\\npragma solidity 0.6.12;\\npragma experimental ABIEncoderV2;\\n\\n// solhint-disable avoid-low-level-calls\\n// solhint-disable not-rely-on-time\\n// solhint-disable no-inline-assembly\\n\\n// File @boringcrypto/boring-solidity/contracts/interfaces/IERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ninterface IERC20 {\\n    function totalSupply() external view returns (uint256);\\n\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /// @notice EIP 2612\\n    function permit(\\n        address owner,\\n        address spender,\\n        uint256 value,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) external;\\n}\\n\\n// File contracts/interfaces/IFlashLoan.sol\\n// License-Identifier: MIT\\n\\ninterface IFlashBorrower {\\n    /// @notice The flashloan callback. `amount` + `fee` needs to repayed to msg.sender before this call returns.\\n    /// @param sender The address of the invoker of this flashloan.\\n    /// @param token The address of the token that is loaned.\\n    /// @param amount of the `token` that is loaned.\\n    /// @param fee The fee that needs to be paid on top for this loan. Needs to be the same as `token`.\\n    /// @param data Additional data that was passed to the flashloan function.\\n    function onFlashLoan(\\n        address sender,\\n        IERC20 token,\\n        uint256 amount,\\n        uint256 fee,\\n        bytes calldata data\\n    ) external;\\n}\\n\\ninterface IBatchFlashBorrower {\\n    /// @notice The callback for batched flashloans. Every amount + fee needs to repayed to msg.sender before this call returns.\\n    /// @param sender The address of the invoker of this flashloan.\\n    /// @param tokens Array of addresses for ERC-20 tokens that is loaned.\\n    /// @param amounts A one-to-one map to `tokens` that is loaned.\\n    /// @param fees A one-to-one map to `tokens` that needs to be paid on top for each loan. Needs to be the same token.\\n    /// @param data Additional data that was passed to the flashloan function.\\n    function onBatchFlashLoan(\\n        address sender,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        uint256[] calldata fees,\\n        bytes calldata data\\n    ) external;\\n}\\n\\n// File contracts/interfaces/IWETH.sol\\n// License-Identifier: MIT\\n\\ninterface IWETH {\\n    function deposit() external payable;\\n\\n    function withdraw(uint256) external;\\n}\\n\\n// File contracts/interfaces/IStrategy.sol\\n// License-Identifier: MIT\\n\\ninterface IStrategy {\\n    /// @notice Send the assets to the Strategy and call skim to invest them.\\n    /// @param amount The amount of tokens to invest.\\n    function skim(uint256 amount) external;\\n\\n    /// @notice Harvest any profits made converted to the asset and pass them to the caller.\\n    /// @param balance The amount of tokens the caller thinks it has invested.\\n    /// @param sender The address of the initiator of this transaction. Can be used for reimbursements, etc.\\n    /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.\\n    function harvest(uint256 balance, address sender) external returns (int256 amountAdded);\\n\\n    /// @notice Withdraw assets. The returned amount can differ from the requested amount due to rounding.\\n    /// @dev The `actualAmount` should be very close to the amount.\\n    /// The difference should NOT be used to report a loss. That's what harvest is for.\\n    /// @param amount The requested amount the caller wants to withdraw.\\n    /// @return actualAmount The real amount that is withdrawn.\\n    function withdraw(uint256 amount) external returns (uint256 actualAmount);\\n\\n    /// @notice Withdraw all assets in the safest way possible. This shouldn't fail.\\n    /// @param balance The amount of tokens the caller thinks it has invested.\\n    /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.\\n    function exit(uint256 balance) external returns (int256 amountAdded);\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\nlibrary BoringERC20 {\\n    bytes4 private constant SIG_SYMBOL = 0x95d89b41; // symbol()\\n    bytes4 private constant SIG_NAME = 0x06fdde03; // name()\\n    bytes4 private constant SIG_DECIMALS = 0x313ce567; // decimals()\\n    bytes4 private constant SIG_TRANSFER = 0xa9059cbb; // transfer(address,uint256)\\n    bytes4 private constant SIG_TRANSFER_FROM = 0x23b872dd; // transferFrom(address,address,uint256)\\n\\n    /// @notice Provides a safe ERC20.transfer version for different ERC-20 implementations.\\n    /// Reverts on a failed transfer.\\n    /// @param token The address of the ERC-20 token.\\n    /// @param to Transfer tokens to.\\n    /// @param amount The token amount.\\n    function safeTransfer(\\n        IERC20 token,\\n        address to,\\n        uint256 amount\\n    ) internal {\\n        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER, to, amount));\\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: Transfer failed\\\");\\n    }\\n\\n    /// @notice Provides a safe ERC20.transferFrom version for different ERC-20 implementations.\\n    /// Reverts on a failed transfer.\\n    /// @param token The address of the ERC-20 token.\\n    /// @param from Transfer tokens from.\\n    /// @param to Transfer tokens to.\\n    /// @param amount The token amount.\\n    function safeTransferFrom(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 amount\\n    ) internal {\\n        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER_FROM, from, to, amount));\\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: TransferFrom failed\\\");\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringMath.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n/// @notice A library for performing overflow-/underflow-safe math,\\n/// updated with awesomeness from of DappHub (https://github.com/dapphub/ds-math).\\nlibrary BoringMath {\\n    function add(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require(b == 0 || (c = a * b) / b == a, \\\"BoringMath: Mul Overflow\\\");\\n    }\\n\\n    function to128(uint256 a) internal pure returns (uint128 c) {\\n        require(a <= uint128(-1), \\\"BoringMath: uint128 Overflow\\\");\\n        c = uint128(a);\\n    }\\n\\n    function to64(uint256 a) internal pure returns (uint64 c) {\\n        require(a <= uint64(-1), \\\"BoringMath: uint64 Overflow\\\");\\n        c = uint64(a);\\n    }\\n\\n    function to32(uint256 a) internal pure returns (uint32 c) {\\n        require(a <= uint32(-1), \\\"BoringMath: uint32 Overflow\\\");\\n        c = uint32(a);\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint128.\\nlibrary BoringMath128 {\\n    function add(uint128 a, uint128 b) internal pure returns (uint128 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint128 a, uint128 b) internal pure returns (uint128 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint64.\\nlibrary BoringMath64 {\\n    function add(uint64 a, uint64 b) internal pure returns (uint64 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint64 a, uint64 b) internal pure returns (uint64 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint32.\\nlibrary BoringMath32 {\\n    function add(uint32 a, uint32 b) internal pure returns (uint32 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint32 a, uint32 b) internal pure returns (uint32 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringRebase.sol@v1.2.0\\n// License-Identifier: MIT\\n\\nstruct Rebase {\\n    uint128 elastic;\\n    uint128 base;\\n}\\n\\n/// @notice A rebasing library using overflow-/underflow-safe math.\\nlibrary RebaseLibrary {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n\\n    /// @notice Calculates the base value in relationship to `elastic` and `total`.\\n    function toBase(\\n        Rebase memory total,\\n        uint256 elastic,\\n        bool roundUp\\n    ) internal pure returns (uint256 base) {\\n        if (total.elastic == 0) {\\n            base = elastic;\\n        } else {\\n            base = elastic.mul(total.base) / total.elastic;\\n            if (roundUp && base.mul(total.elastic) / total.base < elastic) {\\n                base = base.add(1);\\n            }\\n        }\\n    }\\n\\n    /// @notice Calculates the elastic value in relationship to `base` and `total`.\\n    function toElastic(\\n        Rebase memory total,\\n        uint256 base,\\n        bool roundUp\\n    ) internal pure returns (uint256 elastic) {\\n        if (total.base == 0) {\\n            elastic = base;\\n        } else {\\n            elastic = base.mul(total.elastic) / total.base;\\n            if (roundUp && elastic.mul(total.base) / total.elastic < base) {\\n                elastic = elastic.add(1);\\n            }\\n        }\\n    }\\n\\n    /// @notice Add `elastic` to `total` and doubles `total.base`.\\n    /// @return (Rebase) The new total.\\n    /// @return base in relationship to `elastic`.\\n    function add(\\n        Rebase memory total,\\n        uint256 elastic,\\n        bool roundUp\\n    ) internal pure returns (Rebase memory, uint256 base) {\\n        base = toBase(total, elastic, roundUp);\\n        total.elastic = total.elastic.add(elastic.to128());\\n        total.base = total.base.add(base.to128());\\n        return (total, base);\\n    }\\n\\n    /// @notice Sub `base` from `total` and update `total.elastic`.\\n    /// @return (Rebase) The new total.\\n    /// @return elastic in relationship to `base`.\\n    function sub(\\n        Rebase memory total,\\n        uint256 base,\\n        bool roundUp\\n    ) internal pure returns (Rebase memory, uint256 elastic) {\\n        elastic = toElastic(total, base, roundUp);\\n        total.elastic = total.elastic.sub(elastic.to128());\\n        total.base = total.base.sub(base.to128());\\n        return (total, elastic);\\n    }\\n\\n    /// @notice Add `elastic` and `base` to `total`.\\n    function add(\\n        Rebase memory total,\\n        uint256 elastic,\\n        uint256 base\\n    ) internal pure returns (Rebase memory) {\\n        total.elastic = total.elastic.add(elastic.to128());\\n        total.base = total.base.add(base.to128());\\n        return total;\\n    }\\n\\n    /// @notice Subtract `elastic` and `base` to `total`.\\n    function sub(\\n        Rebase memory total,\\n        uint256 elastic,\\n        uint256 base\\n    ) internal pure returns (Rebase memory) {\\n        total.elastic = total.elastic.sub(elastic.to128());\\n        total.base = total.base.sub(base.to128());\\n        return total;\\n    }\\n\\n    /// @notice Add `elastic` to `total` and update storage.\\n    /// @return newElastic Returns updated `elastic`.\\n    function addElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {\\n        newElastic = total.elastic = total.elastic.add(elastic.to128());\\n    }\\n\\n    /// @notice Subtract `elastic` from `total` and update storage.\\n    /// @return newElastic Returns updated `elastic`.\\n    function subElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {\\n        newElastic = total.elastic = total.elastic.sub(elastic.to128());\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringOwnable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n// Source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol + Claimable.sol\\n// Edited by BoringCrypto\\n\\ncontract BoringOwnableData {\\n    address public owner;\\n    address public pendingOwner;\\n}\\n\\ncontract BoringOwnable is BoringOwnableData {\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /// @notice `owner` defaults to msg.sender on construction.\\n    constructor() public {\\n        owner = msg.sender;\\n        emit OwnershipTransferred(address(0), msg.sender);\\n    }\\n\\n    /// @notice Transfers ownership to `newOwner`. Either directly or claimable by the new pending owner.\\n    /// Can only be invoked by the current `owner`.\\n    /// @param newOwner Address of the new owner.\\n    /// @param direct True if `newOwner` should be set immediately. False if `newOwner` needs to use `claimOwnership`.\\n    /// @param renounce Allows the `newOwner` to be `address(0)` if `direct` and `renounce` is True. Has no effect otherwise.\\n    function transferOwnership(\\n        address newOwner,\\n        bool direct,\\n        bool renounce\\n    ) public onlyOwner {\\n        if (direct) {\\n            // Checks\\n            require(newOwner != address(0) || renounce, \\\"Ownable: zero address\\\");\\n\\n            // Effects\\n            emit OwnershipTransferred(owner, newOwner);\\n            owner = newOwner;\\n            pendingOwner = address(0);\\n        } else {\\n            // Effects\\n            pendingOwner = newOwner;\\n        }\\n    }\\n\\n    /// @notice Needs to be called by `pendingOwner` to claim ownership.\\n    function claimOwnership() public {\\n        address _pendingOwner = pendingOwner;\\n\\n        // Checks\\n        require(msg.sender == _pendingOwner, \\\"Ownable: caller != pending owner\\\");\\n\\n        // Effects\\n        emit OwnershipTransferred(owner, _pendingOwner);\\n        owner = _pendingOwner;\\n        pendingOwner = address(0);\\n    }\\n\\n    /// @notice Only allows the `owner` to execute the function.\\n    modifier onlyOwner() {\\n        require(msg.sender == owner, \\\"Ownable: caller is not the owner\\\");\\n        _;\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/interfaces/IMasterContract.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ninterface IMasterContract {\\n    /// @notice Init function that gets called from `BoringFactory.deploy`.\\n    /// Also kown as the constructor for cloned contracts.\\n    /// Any ETH send to `BoringFactory.deploy` ends up here.\\n    /// @param data Can be abi encoded arguments or anything else.\\n    function init(bytes calldata data) external payable;\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringFactory.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ncontract BoringFactory {\\n    event LogDeploy(address indexed masterContract, bytes data, address indexed cloneAddress);\\n\\n    /// @notice Mapping from clone contracts to their masterContract.\\n    mapping(address => address) public masterContractOf;\\n\\n    /// @notice Deploys a given master Contract as a clone.\\n    /// Any ETH transferred with this call is forwarded to the new clone.\\n    /// Emits `LogDeploy`.\\n    /// @param masterContract The address of the contract to clone.\\n    /// @param data Additional abi encoded calldata that is passed to the new clone via `IMasterContract.init`.\\n    /// @param useCreate2 Creates the clone by using the CREATE2 opcode, in this case `data` will be used as salt.\\n    /// @return cloneAddress Address of the created clone contract.\\n    function deploy(\\n        address masterContract,\\n        bytes calldata data,\\n        bool useCreate2\\n    ) public payable returns (address cloneAddress) {\\n        require(masterContract != address(0), \\\"BoringFactory: No masterContract\\\");\\n        bytes20 targetBytes = bytes20(masterContract); // Takes the first 20 bytes of the masterContract's address\\n\\n        if (useCreate2) {\\n            // each masterContract has different code already. So clones are distinguished by their data only.\\n            bytes32 salt = keccak256(data);\\n\\n            // Creates clone, more info here: https://blog.openzeppelin.com/deep-dive-into-the-minimal-proxy-contract/\\n            assembly {\\n                let clone := mload(0x40)\\n                mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n                mstore(add(clone, 0x14), targetBytes)\\n                mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n                cloneAddress := create2(0, clone, 0x37, salt)\\n            }\\n        } else {\\n            assembly {\\n                let clone := mload(0x40)\\n                mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n                mstore(add(clone, 0x14), targetBytes)\\n                mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n                cloneAddress := create(0, clone, 0x37)\\n            }\\n        }\\n        masterContractOf[cloneAddress] = masterContract;\\n\\n        IMasterContract(cloneAddress).init{value: msg.value}(data);\\n\\n        emit LogDeploy(masterContract, data, cloneAddress);\\n    }\\n}\\n\\n// File contracts/MasterContractManager.sol\\n// License-Identifier: UNLICENSED\\n\\ncontract MasterContractManager is BoringOwnable, BoringFactory {\\n    event LogWhiteListMasterContract(address indexed masterContract, bool approved);\\n    event LogSetMasterContractApproval(address indexed masterContract, address indexed user, bool approved);\\n    event LogRegisterProtocol(address indexed protocol);\\n\\n    /// @notice masterContract to user to approval state\\n    mapping(address => mapping(address => bool)) public masterContractApproved;\\n    /// @notice masterContract to whitelisted state for approval without signed message\\n    mapping(address => bool) public whitelistedMasterContracts;\\n    /// @notice user nonces for masterContract approvals\\n    mapping(address => uint256) public nonces;\\n\\n    bytes32 private constant DOMAIN_SEPARATOR_SIGNATURE_HASH = keccak256(\\\"EIP712Domain(string name,uint256 chainId,address verifyingContract)\\\");\\n    // See https://eips.ethereum.org/EIPS/eip-191\\n    string private constant EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA = \\\"\\\\x19\\\\x01\\\";\\n    bytes32 private constant APPROVAL_SIGNATURE_HASH =\\n        keccak256(\\\"SetMasterContractApproval(string warning,address user,address masterContract,bool approved,uint256 nonce)\\\");\\n\\n    // solhint-disable-next-line var-name-mixedcase\\n    bytes32 private immutable _DOMAIN_SEPARATOR;\\n    // solhint-disable-next-line var-name-mixedcase\\n    uint256 private immutable DOMAIN_SEPARATOR_CHAIN_ID;\\n\\n    constructor() public {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        _DOMAIN_SEPARATOR = _calculateDomainSeparator(DOMAIN_SEPARATOR_CHAIN_ID = chainId);\\n    }\\n\\n    function _calculateDomainSeparator(uint256 chainId) private view returns (bytes32) {\\n        return keccak256(abi.encode(DOMAIN_SEPARATOR_SIGNATURE_HASH, keccak256(\\\"BentoBox V1\\\"), chainId, address(this)));\\n    }\\n\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() public view returns (bytes32) {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        return chainId == DOMAIN_SEPARATOR_CHAIN_ID ? _DOMAIN_SEPARATOR : _calculateDomainSeparator(chainId);\\n    }\\n\\n    /// @notice Other contracts need to register with this master contract so that users can approve them for the BentoBox.\\n    function registerProtocol() public {\\n        masterContractOf[msg.sender] = msg.sender;\\n        emit LogRegisterProtocol(msg.sender);\\n    }\\n\\n    /// @notice Enables or disables a contract for approval without signed message.\\n    function whitelistMasterContract(address masterContract, bool approved) public onlyOwner {\\n        // Checks\\n        require(masterContract != address(0), \\\"MasterCMgr: Cannot approve 0\\\");\\n\\n        // Effects\\n        whitelistedMasterContracts[masterContract] = approved;\\n        emit LogWhiteListMasterContract(masterContract, approved);\\n    }\\n\\n    /// @notice Approves or revokes a `masterContract` access to `user` funds.\\n    /// @param user The address of the user that approves or revokes access.\\n    /// @param masterContract The address who gains or loses access.\\n    /// @param approved If True approves access. If False revokes access.\\n    /// @param v Part of the signature. (See EIP-191)\\n    /// @param r Part of the signature. (See EIP-191)\\n    /// @param s Part of the signature. (See EIP-191)\\n    // F4 - Check behaviour for all function arguments when wrong or extreme\\n    // F4: Don't allow masterContract 0 to be approved. Unknown contracts will have a masterContract of 0.\\n    // F4: User can't be 0 for signed approvals because the recoveredAddress will be 0 if ecrecover fails\\n    function setMasterContractApproval(\\n        address user,\\n        address masterContract,\\n        bool approved,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) public {\\n        // Checks\\n        require(masterContract != address(0), \\\"MasterCMgr: masterC not set\\\"); // Important for security\\n\\n        // If no signature is provided, the fallback is executed\\n        if (r == 0 && s == 0 && v == 0) {\\n            require(user == msg.sender, \\\"MasterCMgr: user not sender\\\");\\n            require(masterContractOf[user] == address(0), \\\"MasterCMgr: user is clone\\\");\\n            require(whitelistedMasterContracts[masterContract], \\\"MasterCMgr: not whitelisted\\\");\\n        } else {\\n            // Important for security - any address without masterContract has address(0) as masterContract\\n            // So approving address(0) would approve every address, leading to full loss of funds\\n            // Also, ecrecover returns address(0) on failure. So we check this:\\n            require(user != address(0), \\\"MasterCMgr: User cannot be 0\\\");\\n\\n            // C10 - Protect signatures against replay, use nonce and chainId (SWC-121)\\n            // C10: nonce + chainId are used to prevent replays\\n            // C11 - All signatures strictly EIP-712 (SWC-117 SWC-122)\\n            // C11: signature is EIP-712 compliant\\n            // C12 - abi.encodePacked can't contain variable length user input (SWC-133)\\n            // C12: abi.encodePacked has fixed length parameters\\n            bytes32 digest =\\n                keccak256(\\n                    abi.encodePacked(\\n                        EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA,\\n                        DOMAIN_SEPARATOR(),\\n                        keccak256(\\n                            abi.encode(\\n                                APPROVAL_SIGNATURE_HASH,\\n                                approved\\n                                    ? keccak256(\\\"Give FULL access to funds in (and approved to) BentoBox?\\\")\\n                                    : keccak256(\\\"Revoke access to BentoBox?\\\"),\\n                                user,\\n                                masterContract,\\n                                approved,\\n                                nonces[user]++\\n                            )\\n                        )\\n                    )\\n                );\\n            address recoveredAddress = ecrecover(digest, v, r, s);\\n            require(recoveredAddress == user, \\\"MasterCMgr: Invalid Signature\\\");\\n        }\\n\\n        // Effects\\n        masterContractApproved[masterContract][user] = approved;\\n        emit LogSetMasterContractApproval(masterContract, user, approved);\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringBatchable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ncontract BaseBoringBatchable {\\n    /// @dev Helper function to extract a useful revert message from a failed call.\\n    /// If the returned data is malformed or not correctly abi encoded then this call can fail itself.\\n    function _getRevertMsg(bytes memory _returnData) internal pure returns (string memory) {\\n        // If the _res length is less than 68, then the transaction failed silently (without a revert message)\\n        if (_returnData.length < 68) return \\\"Transaction reverted silently\\\";\\n\\n        assembly {\\n            // Slice the sighash.\\n            _returnData := add(_returnData, 0x04)\\n        }\\n        return abi.decode(_returnData, (string)); // All that remains is the revert string\\n    }\\n\\n    /// @notice Allows batched call to self (this contract).\\n    /// @param calls An array of inputs for each call.\\n    /// @param revertOnFail If True then reverts after a failed call and stops doing further calls.\\n    /// @return successes An array indicating the success of a call, mapped one-to-one to `calls`.\\n    /// @return results An array with the returned data of each function call, mapped one-to-one to `calls`.\\n    // F1: External is ok here because this is the batch function, adding it to a batch makes no sense\\n    // F2: Calls in the batch may be payable, delegatecall operates in the same context, so each call in the batch has access to msg.value\\n    // C3: The length of the loop is fully under user control, so can't be exploited\\n    // C7: Delegatecall is only used on the same contract, so it's safe\\n    function batch(bytes[] calldata calls, bool revertOnFail) external payable returns (bool[] memory successes, bytes[] memory results) {\\n        successes = new bool[](calls.length);\\n        results = new bytes[](calls.length);\\n        for (uint256 i = 0; i < calls.length; i++) {\\n            (bool success, bytes memory result) = address(this).delegatecall(calls[i]);\\n            require(success || !revertOnFail, _getRevertMsg(result));\\n            successes[i] = success;\\n            results[i] = result;\\n        }\\n    }\\n}\\n\\ncontract BoringBatchable is BaseBoringBatchable {\\n    /// @notice Call wrapper that performs `ERC20.permit` on `token`.\\n    /// Lookup `IERC20.permit`.\\n    // F6: Parameters can be used front-run the permit and the user's permit will fail (due to nonce or other revert)\\n    //     if part of a batch this could be used to grief once as the second call would not need the permit\\n    function permitToken(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) public {\\n        token.permit(from, to, amount, deadline, v, r, s);\\n    }\\n}\\n\\n// File contracts/BentoBox.sol\\n// License-Identifier: UNLICENSED\\n\\n/// @title BentoBox\\n/// @author BoringCrypto, Keno\\n/// @notice The BentoBox is a vault for tokens. The stored tokens can be flash loaned and used in strategies.\\n/// Yield from this will go to the token depositors.\\n/// Rebasing tokens ARE NOT supported and WILL cause loss of funds.\\n/// Any funds transfered directly onto the BentoBox will be lost, use the deposit function instead.\\ncontract BentoBoxV1 is MasterContractManager, BoringBatchable {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n    using BoringERC20 for IERC20;\\n    using RebaseLibrary for Rebase;\\n\\n    // ************** //\\n    // *** EVENTS *** //\\n    // ************** //\\n\\n    event LogDeposit(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogWithdraw(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogTransfer(IERC20 indexed token, address indexed from, address indexed to, uint256 share);\\n\\n    event LogFlashLoan(address indexed borrower, IERC20 indexed token, uint256 amount, uint256 feeAmount, address indexed receiver);\\n\\n    event LogStrategyTargetPercentage(IERC20 indexed token, uint256 targetPercentage);\\n    event LogStrategyQueued(IERC20 indexed token, IStrategy indexed strategy);\\n    event LogStrategySet(IERC20 indexed token, IStrategy indexed strategy);\\n    event LogStrategyInvest(IERC20 indexed token, uint256 amount);\\n    event LogStrategyDivest(IERC20 indexed token, uint256 amount);\\n    event LogStrategyProfit(IERC20 indexed token, uint256 amount);\\n    event LogStrategyLoss(IERC20 indexed token, uint256 amount);\\n\\n    // *************** //\\n    // *** STRUCTS *** //\\n    // *************** //\\n\\n    struct StrategyData {\\n        uint64 strategyStartDate;\\n        uint64 targetPercentage;\\n        uint128 balance; // the balance of the strategy that BentoBox thinks is in there\\n    }\\n\\n    // ******************************** //\\n    // *** CONSTANTS AND IMMUTABLES *** //\\n    // ******************************** //\\n\\n    // V2 - Can they be private?\\n    // V2: Private to save gas, to verify it's correct, check the constructor arguments\\n    IERC20 private immutable wethToken;\\n\\n    IERC20 private constant USE_ETHEREUM = IERC20(0);\\n    uint256 private constant FLASH_LOAN_FEE = 50; // 0.05%\\n    uint256 private constant FLASH_LOAN_FEE_PRECISION = 1e5;\\n    uint256 private constant STRATEGY_DELAY = 2 weeks;\\n    uint256 private constant MAX_TARGET_PERCENTAGE = 95; // 95%\\n    uint256 private constant MINIMUM_SHARE_BALANCE = 1000; // To prevent the ratio going off\\n\\n    // ***************** //\\n    // *** VARIABLES *** //\\n    // ***************** //\\n\\n    // Balance per token per address/contract in shares\\n    mapping(IERC20 => mapping(address => uint256)) public balanceOf;\\n\\n    // Rebase from amount to share\\n    mapping(IERC20 => Rebase) public totals;\\n\\n    mapping(IERC20 => IStrategy) public strategy;\\n    mapping(IERC20 => IStrategy) public pendingStrategy;\\n    mapping(IERC20 => StrategyData) public strategyData;\\n\\n    // ******************* //\\n    // *** CONSTRUCTOR *** //\\n    // ******************* //\\n\\n    constructor(IERC20 wethToken_) public {\\n        wethToken = wethToken_;\\n    }\\n\\n    // ***************** //\\n    // *** MODIFIERS *** //\\n    // ***************** //\\n\\n    /// Modifier to check if the msg.sender is allowed to use funds belonging to the 'from' address.\\n    /// If 'from' is msg.sender, it's allowed.\\n    /// If 'from' is the BentoBox itself, it's allowed. Any ETH, token balances (above the known balances) or BentoBox balances\\n    /// can be taken by anyone.\\n    /// This is to enable skimming, not just for deposits, but also for withdrawals or transfers, enabling better composability.\\n    /// If 'from' is a clone of a masterContract AND the 'from' address has approved that masterContract, it's allowed.\\n    modifier allowed(address from) {\\n        if (from != msg.sender && from != address(this)) {\\n            // From is sender or you are skimming\\n            address masterContract = masterContractOf[msg.sender];\\n            require(masterContract != address(0), \\\"BentoBox: no masterContract\\\");\\n            require(masterContractApproved[masterContract][from], \\\"BentoBox: Transfer not approved\\\");\\n        }\\n        _;\\n    }\\n\\n    // ************************** //\\n    // *** INTERNAL FUNCTIONS *** //\\n    // ************************** //\\n\\n    /// @dev Returns the total balance of `token` this contracts holds,\\n    /// plus the total amount this contract thinks the strategy holds.\\n    function _tokenBalanceOf(IERC20 token) internal view returns (uint256 amount) {\\n        amount = token.balanceOf(address(this)).add(strategyData[token].balance);\\n    }\\n\\n    // ************************ //\\n    // *** PUBLIC FUNCTIONS *** //\\n    // ************************ //\\n\\n    /// @dev Helper function to represent an `amount` of `token` in shares.\\n    /// @param token The ERC-20 token.\\n    /// @param amount The `token` amount.\\n    /// @param roundUp If the result `share` should be rounded up.\\n    /// @return share The token amount represented in shares.\\n    function toShare(\\n        IERC20 token,\\n        uint256 amount,\\n        bool roundUp\\n    ) external view returns (uint256 share) {\\n        share = totals[token].toBase(amount, roundUp);\\n    }\\n\\n    /// @dev Helper function represent shares back into the `token` amount.\\n    /// @param token The ERC-20 token.\\n    /// @param share The amount of shares.\\n    /// @param roundUp If the result should be rounded up.\\n    /// @return amount The share amount back into native representation.\\n    function toAmount(\\n        IERC20 token,\\n        uint256 share,\\n        bool roundUp\\n    ) external view returns (uint256 amount) {\\n        amount = totals[token].toElastic(share, roundUp);\\n    }\\n\\n    /// @notice Deposit an amount of `token` represented in either `amount` or `share`.\\n    /// @param token_ The ERC-20 token to deposit.\\n    /// @param from which account to pull the tokens.\\n    /// @param to which account to push the tokens.\\n    /// @param amount Token amount in native representation to deposit.\\n    /// @param share Token amount represented in shares to deposit. Takes precedence over `amount`.\\n    /// @return amountOut The amount deposited.\\n    /// @return shareOut The deposited amount repesented in shares.\\n    function deposit(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) public payable allowed(from) returns (uint256 amountOut, uint256 shareOut) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;\\n        Rebase memory total = totals[token];\\n\\n        // If a new token gets added, the tokenSupply call checks that this is a deployed contract. Needed for security.\\n        require(total.elastic != 0 || token.totalSupply() > 0, \\\"BentoBox: No tokens\\\");\\n        if (share == 0) {\\n            // value of the share may be lower than the amount due to rounding, that's ok\\n            share = total.toBase(amount, false);\\n            // Any deposit should lead to at least the minimum share balance, otherwise it's ignored (no amount taken)\\n            if (total.base.add(share.to128()) < MINIMUM_SHARE_BALANCE) {\\n                return (0, 0);\\n            }\\n        } else {\\n            // amount may be lower than the value of share due to rounding, in that case, add 1 to amount (Always round up)\\n            amount = total.toElastic(share, true);\\n        }\\n\\n        // In case of skimming, check that only the skimmable amount is taken.\\n        // For ETH, the full balance is available, so no need to check.\\n        // During flashloans the _tokenBalanceOf is lower than 'reality', so skimming deposits will mostly fail during a flashloan.\\n        require(\\n            from != address(this) || token_ == USE_ETHEREUM || amount <= _tokenBalanceOf(token).sub(total.elastic),\\n            \\\"BentoBox: Skim too much\\\"\\n        );\\n\\n        balanceOf[token][to] = balanceOf[token][to].add(share);\\n        total.base = total.base.add(share.to128());\\n        total.elastic = total.elastic.add(amount.to128());\\n        totals[token] = total;\\n\\n        // Interactions\\n        // During the first deposit, we check that this token is 'real'\\n        if (token_ == USE_ETHEREUM) {\\n            // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)\\n            // X2: If the WETH implementation is faulty or malicious, it will block adding ETH (but we know the WETH implementation)\\n            IWETH(address(wethToken)).deposit{value: amount}();\\n        } else if (from != address(this)) {\\n            // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)\\n            // X2: If the token implementation is faulty or malicious, it may block adding tokens. Good.\\n            token.safeTransferFrom(from, address(this), amount);\\n        }\\n        emit LogDeposit(token, from, to, amount, share);\\n        amountOut = amount;\\n        shareOut = share;\\n    }\\n\\n    /// @notice Withdraws an amount of `token` from a user account.\\n    /// @param token_ The ERC-20 token to withdraw.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param amount of tokens. Either one of `amount` or `share` needs to be supplied.\\n    /// @param share Like above, but `share` takes precedence over `amount`.\\n    function withdraw(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) public allowed(from) returns (uint256 amountOut, uint256 shareOut) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;\\n        Rebase memory total = totals[token];\\n        if (share == 0) {\\n            // value of the share paid could be lower than the amount paid due to rounding, in that case, add a share (Always round up)\\n            share = total.toBase(amount, true);\\n        } else {\\n            // amount may be lower than the value of share due to rounding, that's ok\\n            amount = total.toElastic(share, false);\\n        }\\n\\n        balanceOf[token][from] = balanceOf[token][from].sub(share);\\n        total.elastic = total.elastic.sub(amount.to128());\\n        total.base = total.base.sub(share.to128());\\n        // There have to be at least 1000 shares left to prevent reseting the share/amount ratio (unless it's fully emptied)\\n        require(total.base >= MINIMUM_SHARE_BALANCE || total.base == 0, \\\"BentoBox: cannot empty\\\");\\n        totals[token] = total;\\n\\n        // Interactions\\n        if (token_ == USE_ETHEREUM) {\\n            // X2, X3: A revert or big gas usage in the WETH contract could block withdrawals, but WETH9 is fine.\\n            IWETH(address(wethToken)).withdraw(amount);\\n            // X2, X3: A revert or big gas usage could block, however, the to address is under control of the caller.\\n            (bool success, ) = to.call{value: amount}(\\\"\\\");\\n            require(success, \\\"BentoBox: ETH transfer failed\\\");\\n        } else {\\n            // X2, X3: A malicious token could block withdrawal of just THAT token.\\n            //         masterContracts may want to take care not to rely on withdraw always succeeding.\\n            token.safeTransfer(to, amount);\\n        }\\n        emit LogWithdraw(token, from, to, amount, share);\\n        amountOut = amount;\\n        shareOut = share;\\n    }\\n\\n    /// @notice Transfer shares from a user account to another one.\\n    /// @param token The ERC-20 token to transfer.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param share The amount of `token` in shares.\\n    // Clones of master contracts can transfer from any account that has approved them\\n    // F3 - Can it be combined with another similar function?\\n    // F3: This isn't combined with transferMultiple for gas optimization\\n    function transfer(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 share\\n    ) public allowed(from) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        balanceOf[token][from] = balanceOf[token][from].sub(share);\\n        balanceOf[token][to] = balanceOf[token][to].add(share);\\n\\n        emit LogTransfer(token, from, to, share);\\n    }\\n\\n    /// @notice Transfer shares from a user account to multiple other ones.\\n    /// @param token The ERC-20 token to transfer.\\n    /// @param from which user to pull the tokens.\\n    /// @param tos The receivers of the tokens.\\n    /// @param shares The amount of `token` in shares for each receiver in `tos`.\\n    // F3 - Can it be combined with another similar function?\\n    // F3: This isn't combined with transfer for gas optimization\\n    function transferMultiple(\\n        IERC20 token,\\n        address from,\\n        address[] calldata tos,\\n        uint256[] calldata shares\\n    ) public allowed(from) {\\n        // Checks\\n        require(tos[0] != address(0), \\\"BentoBox: to[0] not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        uint256 totalAmount;\\n        uint256 len = tos.length;\\n        for (uint256 i = 0; i < len; i++) {\\n            address to = tos[i];\\n            balanceOf[token][to] = balanceOf[token][to].add(shares[i]);\\n            totalAmount = totalAmount.add(shares[i]);\\n            emit LogTransfer(token, from, to, shares[i]);\\n        }\\n        balanceOf[token][from] = balanceOf[token][from].sub(totalAmount);\\n    }\\n\\n    /// @notice Flashloan ability.\\n    /// @param borrower The address of the contract that implements and conforms to `IFlashBorrower` and handles the flashloan.\\n    /// @param receiver Address of the token receiver.\\n    /// @param token The address of the token to receive.\\n    /// @param amount of the tokens to receive.\\n    /// @param data The calldata to pass to the `borrower` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Not possible to follow this here, reentrancy has been reviewed\\n    // F6 - Check for front-running possibilities, such as the approve function (SWC-114)\\n    // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.\\n    function flashLoan(\\n        IFlashBorrower borrower,\\n        address receiver,\\n        IERC20 token,\\n        uint256 amount,\\n        bytes calldata data\\n    ) public {\\n        uint256 fee = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;\\n        token.safeTransfer(receiver, amount);\\n\\n        borrower.onFlashLoan(msg.sender, token, amount, fee, data);\\n\\n        require(_tokenBalanceOf(token) >= totals[token].addElastic(fee.to128()), \\\"BentoBox: Wrong amount\\\");\\n        emit LogFlashLoan(address(borrower), token, amount, fee, receiver);\\n    }\\n\\n    /// @notice Support for batched flashloans. Useful to request multiple different `tokens` in a single transaction.\\n    /// @param borrower The address of the contract that implements and conforms to `IBatchFlashBorrower` and handles the flashloan.\\n    /// @param receivers An array of the token receivers. A one-to-one mapping with `tokens` and `amounts`.\\n    /// @param tokens The addresses of the tokens.\\n    /// @param amounts of the tokens for each receiver.\\n    /// @param data The calldata to pass to the `borrower` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Not possible to follow this here, reentrancy has been reviewed\\n    // F6 - Check for front-running possibilities, such as the approve function (SWC-114)\\n    // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.\\n    function batchFlashLoan(\\n        IBatchFlashBorrower borrower,\\n        address[] calldata receivers,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        bytes calldata data\\n    ) public {\\n        uint256[] memory fees = new uint256[](tokens.length);\\n\\n        uint256 len = tokens.length;\\n        for (uint256 i = 0; i < len; i++) {\\n            uint256 amount = amounts[i];\\n            fees[i] = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;\\n\\n            tokens[i].safeTransfer(receivers[i], amounts[i]);\\n        }\\n\\n        borrower.onBatchFlashLoan(msg.sender, tokens, amounts, fees, data);\\n\\n        for (uint256 i = 0; i < len; i++) {\\n            IERC20 token = tokens[i];\\n            require(_tokenBalanceOf(token) >= totals[token].addElastic(fees[i].to128()), \\\"BentoBox: Wrong amount\\\");\\n            emit LogFlashLoan(address(borrower), token, amounts[i], fees[i], receivers[i]);\\n        }\\n    }\\n\\n    /// @notice Sets the target percentage of the strategy for `token`.\\n    /// @dev Only the owner of this contract is allowed to change this.\\n    /// @param token The address of the token that maps to a strategy to change.\\n    /// @param targetPercentage_ The new target in percent. Must be lesser or equal to `MAX_TARGET_PERCENTAGE`.\\n    function setStrategyTargetPercentage(IERC20 token, uint64 targetPercentage_) public onlyOwner {\\n        // Checks\\n        require(targetPercentage_ <= MAX_TARGET_PERCENTAGE, \\\"StrategyManager: Target too high\\\");\\n\\n        // Effects\\n        strategyData[token].targetPercentage = targetPercentage_;\\n        emit LogStrategyTargetPercentage(token, targetPercentage_);\\n    }\\n\\n    /// @notice Sets the contract address of a new strategy that conforms to `IStrategy` for `token`.\\n    /// Must be called twice with the same arguments.\\n    /// A new strategy becomes pending first and can be activated once `STRATEGY_DELAY` is over.\\n    /// @dev Only the owner of this contract is allowed to change this.\\n    /// @param token The address of the token that maps to a strategy to change.\\n    /// @param newStrategy The address of the contract that conforms to `IStrategy`.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Total amount is updated AFTER interaction. But strategy is under our control.\\n    // C4 - Use block.timestamp only for long intervals (SWC-116)\\n    // C4: block.timestamp is used for a period of 2 weeks, which is long enough\\n    function setStrategy(IERC20 token, IStrategy newStrategy) public onlyOwner {\\n        StrategyData memory data = strategyData[token];\\n        IStrategy pending = pendingStrategy[token];\\n        if (data.strategyStartDate == 0 || pending != newStrategy) {\\n            pendingStrategy[token] = newStrategy;\\n            // C1 - All math done through BoringMath (SWC-101)\\n            // C1: Our sun will swallow the earth well before this overflows\\n            data.strategyStartDate = (block.timestamp + STRATEGY_DELAY).to64();\\n            emit LogStrategyQueued(token, newStrategy);\\n        } else {\\n            require(data.strategyStartDate != 0 && block.timestamp >= data.strategyStartDate, \\\"StrategyManager: Too early\\\");\\n            if (address(strategy[token]) != address(0)) {\\n                int256 balanceChange = strategy[token].exit(data.balance);\\n                // Effects\\n                if (balanceChange > 0) {\\n                    uint256 add = uint256(balanceChange);\\n                    totals[token].addElastic(add);\\n                    emit LogStrategyProfit(token, add);\\n                } else if (balanceChange < 0) {\\n                    uint256 sub = uint256(-balanceChange);\\n                    totals[token].subElastic(sub);\\n                    emit LogStrategyLoss(token, sub);\\n                }\\n\\n                emit LogStrategyDivest(token, data.balance);\\n            }\\n            strategy[token] = pending;\\n            data.strategyStartDate = 0;\\n            data.balance = 0;\\n            pendingStrategy[token] = IStrategy(0);\\n            emit LogStrategySet(token, newStrategy);\\n        }\\n        strategyData[token] = data;\\n    }\\n\\n    /// @notice The actual process of yield farming. Executes the strategy of `token`.\\n    /// Optionally does housekeeping if `balance` is true.\\n    /// `maxChangeAmount` is relevant for skimming or withdrawing if `balance` is true.\\n    /// @param token The address of the token for which a strategy is deployed.\\n    /// @param balance True if housekeeping should be done.\\n    /// @param maxChangeAmount The maximum amount for either pulling or pushing from/to the `IStrategy` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Total amount is updated AFTER interaction. But strategy is under our control.\\n    // F5: Not followed to prevent reentrancy issues with flashloans and BentoBox skims?\\n    function harvest(\\n        IERC20 token,\\n        bool balance,\\n        uint256 maxChangeAmount\\n    ) public {\\n        StrategyData memory data = strategyData[token];\\n        IStrategy _strategy = strategy[token];\\n        int256 balanceChange = _strategy.harvest(data.balance, msg.sender);\\n        if (balanceChange == 0 && !balance) {\\n            return;\\n        }\\n\\n        uint256 totalElastic = totals[token].elastic;\\n\\n        if (balanceChange > 0) {\\n            uint256 add = uint256(balanceChange);\\n            totalElastic = totalElastic.add(add);\\n            totals[token].elastic = totalElastic.to128();\\n            emit LogStrategyProfit(token, add);\\n        } else if (balanceChange < 0) {\\n            // C1 - All math done through BoringMath (SWC-101)\\n            // C1: balanceChange could overflow if it's max negative int128.\\n            // But tokens with balances that large are not supported by the BentoBox.\\n            uint256 sub = uint256(-balanceChange);\\n            totalElastic = totalElastic.sub(sub);\\n            totals[token].elastic = totalElastic.to128();\\n            data.balance = data.balance.sub(sub.to128());\\n            emit LogStrategyLoss(token, sub);\\n        }\\n\\n        if (balance) {\\n            uint256 targetBalance = totalElastic.mul(data.targetPercentage) / 100;\\n            // if data.balance == targetBalance there is nothing to update\\n            if (data.balance < targetBalance) {\\n                uint256 amountOut = targetBalance.sub(data.balance);\\n                if (maxChangeAmount != 0 && amountOut > maxChangeAmount) {\\n                    amountOut = maxChangeAmount;\\n                }\\n                token.safeTransfer(address(_strategy), amountOut);\\n                data.balance = data.balance.add(amountOut.to128());\\n                _strategy.skim(amountOut);\\n                emit LogStrategyInvest(token, amountOut);\\n            } else if (data.balance > targetBalance) {\\n                uint256 amountIn = data.balance.sub(targetBalance.to128());\\n                if (maxChangeAmount != 0 && amountIn > maxChangeAmount) {\\n                    amountIn = maxChangeAmount;\\n                }\\n\\n                uint256 actualAmountIn = _strategy.withdraw(amountIn);\\n\\n                data.balance = data.balance.sub(actualAmountIn.to128());\\n                emit LogStrategyDivest(token, actualAmountIn);\\n            }\\n        }\\n\\n        strategyData[token] = data;\\n    }\\n\\n    // Contract should be able to receive ETH deposits to support deposit & skim\\n    // solhint-disable-next-line no-empty-blocks\\n    receive() external payable {}\\n}\\n\",\"keccak256\":\"0xf5251397b9aaa5c66ddc18b0cb96350ffac09f5776a1255fedc0072641f916fe\",\"license\":\"UNLICENSED\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        },
        "BoringFactory": {
          "abi": [
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "masterContract",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "bytes",
                  "name": "data",
                  "type": "bytes"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "cloneAddress",
                  "type": "address"
                }
              ],
              "name": "LogDeploy",
              "type": "event"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "masterContract",
                  "type": "address"
                },
                {
                  "internalType": "bytes",
                  "name": "data",
                  "type": "bytes"
                },
                {
                  "internalType": "bool",
                  "name": "useCreate2",
                  "type": "bool"
                }
              ],
              "name": "deploy",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "cloneAddress",
                  "type": "address"
                }
              ],
              "stateMutability": "payable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "name": "masterContractOf",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {
              "deploy(address,bytes,bool)": {
                "params": {
                  "data": "Additional abi encoded calldata that is passed to the new clone via `IMasterContract.init`.",
                  "masterContract": "The address of the contract to clone.",
                  "useCreate2": "Creates the clone by using the CREATE2 opcode, in this case `data` will be used as salt."
                },
                "returns": {
                  "cloneAddress": "Address of the created clone contract."
                }
              }
            },
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b506103ea806100206000396000f3fe6080604052600436106100295760003560e01c80631f54245b1461002e578063bafe4f1414610057575b600080fd5b61004161003c366004610296565b610077565b60405161004e919061033c565b60405180910390f35b34801561006357600080fd5b50610041610072366004610274565b61023c565b60006001600160a01b0385166100a85760405162461bcd60e51b815260040161009f9061037f565b60405180910390fd5b606085901b821561011a57600085856040516100c592919061032c565b60405180910390209050604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81528260148201526e5af43d82803e903d91602b57fd5bf360881b6028820152816037826000f59350505061015f565b604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81528160148201526e5af43d82803e903d91602b57fd5bf360881b60288201526037816000f09250505b6001600160a01b038281166000818152602081905260409081902080546001600160a01b031916938a16939093179092559051631377d1f560e21b8152634ddf47d49034906101b49089908990600401610350565b6000604051808303818588803b1580156101cd57600080fd5b505af11580156101e1573d6000803e3d6000fd5b5050505050816001600160a01b0316866001600160a01b03167fd62166f3c2149208e51788b1401cc356bf5da1fc6c7886a32e18570f57d88b3b878760405161022b929190610350565b60405180910390a350949350505050565b6000602081905290815260409020546001600160a01b031681565b80356001600160a01b038116811461026e57600080fd5b92915050565b600060208284031215610285578081fd5b61028f8383610257565b9392505050565b600080600080606085870312156102ab578283fd5b6102b58686610257565b9350602085013567ffffffffffffffff808211156102d1578485fd5b818701915087601f8301126102e4578485fd5b8135818111156102f2578586fd5b886020828501011115610303578586fd5b60208301955080945050505060408501358015158114610321578182fd5b939692955090935050565b6000828483379101908152919050565b6001600160a01b0391909116815260200190565b60006020825282602083015282846040840137818301604090810191909152601f909201601f19160101919050565b6020808252818101527f426f72696e67466163746f72793a204e6f206d6173746572436f6e747261637460408201526060019056fea2646970667358221220b7653d4db89275f901a67b26c7fc45481776a1b16211aa1af985ba936a08bb8264736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3EA DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x29 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1F54245B EQ PUSH2 0x2E JUMPI DUP1 PUSH4 0xBAFE4F14 EQ PUSH2 0x57 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x41 PUSH2 0x3C CALLDATASIZE PUSH1 0x4 PUSH2 0x296 JUMP JUMPDEST PUSH2 0x77 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x4E SWAP2 SWAP1 PUSH2 0x33C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x63 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x41 PUSH2 0x72 CALLDATASIZE PUSH1 0x4 PUSH2 0x274 JUMP JUMPDEST PUSH2 0x23C JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH2 0xA8 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x9F SWAP1 PUSH2 0x37F JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x60 DUP6 SWAP1 SHL DUP3 ISZERO PUSH2 0x11A JUMPI PUSH1 0x0 DUP6 DUP6 PUSH1 0x40 MLOAD PUSH2 0xC5 SWAP3 SWAP2 SWAP1 PUSH2 0x32C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 SWAP1 POP PUSH1 0x40 MLOAD PUSH20 0x3D602D80600A3D3981F3363D3D373D3D3D363D73 PUSH1 0x60 SHL DUP2 MSTORE DUP3 PUSH1 0x14 DUP3 ADD MSTORE PUSH15 0x5AF43D82803E903D91602B57FD5BF3 PUSH1 0x88 SHL PUSH1 0x28 DUP3 ADD MSTORE DUP2 PUSH1 0x37 DUP3 PUSH1 0x0 CREATE2 SWAP4 POP POP POP PUSH2 0x15F JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0x3D602D80600A3D3981F3363D3D373D3D3D363D73 PUSH1 0x60 SHL DUP2 MSTORE DUP2 PUSH1 0x14 DUP3 ADD MSTORE PUSH15 0x5AF43D82803E903D91602B57FD5BF3 PUSH1 0x88 SHL PUSH1 0x28 DUP3 ADD MSTORE PUSH1 0x37 DUP2 PUSH1 0x0 CREATE SWAP3 POP POP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP4 DUP11 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 SSTORE SWAP1 MLOAD PUSH4 0x1377D1F5 PUSH1 0xE2 SHL DUP2 MSTORE PUSH4 0x4DDF47D4 SWAP1 CALLVALUE SWAP1 PUSH2 0x1B4 SWAP1 DUP10 SWAP1 DUP10 SWAP1 PUSH1 0x4 ADD PUSH2 0x350 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1CD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1E1 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xD62166F3C2149208E51788B1401CC356BF5DA1FC6C7886A32E18570F57D88B3B DUP8 DUP8 PUSH1 0x40 MLOAD PUSH2 0x22B SWAP3 SWAP2 SWAP1 PUSH2 0x350 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP2 SWAP1 MSTORE SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST DUP1 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x26E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x285 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x28F DUP4 DUP4 PUSH2 0x257 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x2AB JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0x2B5 DUP7 DUP7 PUSH2 0x257 JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x2D1 JUMPI DUP5 DUP6 REVERT JUMPDEST DUP2 DUP8 ADD SWAP2 POP DUP8 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x2E4 JUMPI DUP5 DUP6 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x2F2 JUMPI DUP6 DUP7 REVERT JUMPDEST DUP9 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x303 JUMPI DUP6 DUP7 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP6 POP DUP1 SWAP5 POP POP POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x321 JUMPI DUP2 DUP3 REVERT JUMPDEST SWAP4 SWAP7 SWAP3 SWAP6 POP SWAP1 SWAP4 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP5 DUP4 CALLDATACOPY SWAP2 ADD SWAP1 DUP2 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD 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 PUSH1 0x1F NOT AND ADD ADD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 DUP2 ADD MSTORE PUSH32 0x426F72696E67466163746F72793A204E6F206D6173746572436F6E7472616374 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xB7 PUSH6 0x3D4DB89275F9 ADD 0xA6 PUSH28 0x26C7FC45481776A1B16211AA1AF985BA936A08BB8264736F6C634300 MOD 0xC STOP CALLER ",
              "sourceMap": "15776:2449:0:-:0;;;;;;;;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "6080604052600436106100295760003560e01c80631f54245b1461002e578063bafe4f1414610057575b600080fd5b61004161003c366004610296565b610077565b60405161004e919061033c565b60405180910390f35b34801561006357600080fd5b50610041610072366004610274565b61023c565b60006001600160a01b0385166100a85760405162461bcd60e51b815260040161009f9061037f565b60405180910390fd5b606085901b821561011a57600085856040516100c592919061032c565b60405180910390209050604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81528260148201526e5af43d82803e903d91602b57fd5bf360881b6028820152816037826000f59350505061015f565b604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81528160148201526e5af43d82803e903d91602b57fd5bf360881b60288201526037816000f09250505b6001600160a01b038281166000818152602081905260409081902080546001600160a01b031916938a16939093179092559051631377d1f560e21b8152634ddf47d49034906101b49089908990600401610350565b6000604051808303818588803b1580156101cd57600080fd5b505af11580156101e1573d6000803e3d6000fd5b5050505050816001600160a01b0316866001600160a01b03167fd62166f3c2149208e51788b1401cc356bf5da1fc6c7886a32e18570f57d88b3b878760405161022b929190610350565b60405180910390a350949350505050565b6000602081905290815260409020546001600160a01b031681565b80356001600160a01b038116811461026e57600080fd5b92915050565b600060208284031215610285578081fd5b61028f8383610257565b9392505050565b600080600080606085870312156102ab578283fd5b6102b58686610257565b9350602085013567ffffffffffffffff808211156102d1578485fd5b818701915087601f8301126102e4578485fd5b8135818111156102f2578586fd5b886020828501011115610303578586fd5b60208301955080945050505060408501358015158114610321578182fd5b939692955090935050565b6000828483379101908152919050565b6001600160a01b0391909116815260200190565b60006020825282602083015282846040840137818301604090810191909152601f909201601f19160101919050565b6020808252818101527f426f72696e67466163746f72793a204e6f206d6173746572436f6e747261637460408201526060019056fea2646970667358221220b7653d4db89275f901a67b26c7fc45481776a1b16211aa1af985ba936a08bb8264736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x29 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1F54245B EQ PUSH2 0x2E JUMPI DUP1 PUSH4 0xBAFE4F14 EQ PUSH2 0x57 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x41 PUSH2 0x3C CALLDATASIZE PUSH1 0x4 PUSH2 0x296 JUMP JUMPDEST PUSH2 0x77 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x4E SWAP2 SWAP1 PUSH2 0x33C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x63 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x41 PUSH2 0x72 CALLDATASIZE PUSH1 0x4 PUSH2 0x274 JUMP JUMPDEST PUSH2 0x23C JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH2 0xA8 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x9F SWAP1 PUSH2 0x37F JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x60 DUP6 SWAP1 SHL DUP3 ISZERO PUSH2 0x11A JUMPI PUSH1 0x0 DUP6 DUP6 PUSH1 0x40 MLOAD PUSH2 0xC5 SWAP3 SWAP2 SWAP1 PUSH2 0x32C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 SWAP1 POP PUSH1 0x40 MLOAD PUSH20 0x3D602D80600A3D3981F3363D3D373D3D3D363D73 PUSH1 0x60 SHL DUP2 MSTORE DUP3 PUSH1 0x14 DUP3 ADD MSTORE PUSH15 0x5AF43D82803E903D91602B57FD5BF3 PUSH1 0x88 SHL PUSH1 0x28 DUP3 ADD MSTORE DUP2 PUSH1 0x37 DUP3 PUSH1 0x0 CREATE2 SWAP4 POP POP POP PUSH2 0x15F JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0x3D602D80600A3D3981F3363D3D373D3D3D363D73 PUSH1 0x60 SHL DUP2 MSTORE DUP2 PUSH1 0x14 DUP3 ADD MSTORE PUSH15 0x5AF43D82803E903D91602B57FD5BF3 PUSH1 0x88 SHL PUSH1 0x28 DUP3 ADD MSTORE PUSH1 0x37 DUP2 PUSH1 0x0 CREATE SWAP3 POP POP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP4 DUP11 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 SSTORE SWAP1 MLOAD PUSH4 0x1377D1F5 PUSH1 0xE2 SHL DUP2 MSTORE PUSH4 0x4DDF47D4 SWAP1 CALLVALUE SWAP1 PUSH2 0x1B4 SWAP1 DUP10 SWAP1 DUP10 SWAP1 PUSH1 0x4 ADD PUSH2 0x350 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1CD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1E1 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xD62166F3C2149208E51788B1401CC356BF5DA1FC6C7886A32E18570F57D88B3B DUP8 DUP8 PUSH1 0x40 MLOAD PUSH2 0x22B SWAP3 SWAP2 SWAP1 PUSH2 0x350 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP2 SWAP1 MSTORE SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST DUP1 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x26E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x285 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x28F DUP4 DUP4 PUSH2 0x257 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x2AB JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0x2B5 DUP7 DUP7 PUSH2 0x257 JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x2D1 JUMPI DUP5 DUP6 REVERT JUMPDEST DUP2 DUP8 ADD SWAP2 POP DUP8 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x2E4 JUMPI DUP5 DUP6 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x2F2 JUMPI DUP6 DUP7 REVERT JUMPDEST DUP9 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x303 JUMPI DUP6 DUP7 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP6 POP DUP1 SWAP5 POP POP POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x321 JUMPI DUP2 DUP3 REVERT JUMPDEST SWAP4 SWAP7 SWAP3 SWAP6 POP SWAP1 SWAP4 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP5 DUP4 CALLDATACOPY SWAP2 ADD SWAP1 DUP2 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD 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 PUSH1 0x1F NOT AND ADD ADD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 DUP2 ADD MSTORE PUSH32 0x426F72696E67466163746F72793A204E6F206D6173746572436F6E7472616374 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xB7 PUSH6 0x3D4DB89275F9 ADD 0xA6 PUSH28 0x26C7FC45481776A1B16211AA1AF985BA936A08BB8264736F6C634300 MOD 0xC STOP CALLER ",
              "sourceMap": "15776:2449:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;16553:1670;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15971:51;;;;;;;;;;-1:-1:-1;15971:51:0;;;;;:::i;:::-;;:::i;16553:1670::-;16685:20;-1:-1:-1;;;;;16725:28:0;;16717:73;;;;-1:-1:-1;;;16717:73:0;;;;;;;:::i;:::-;;;;;;;;;16822:23;;;;16916:1114;;;;17057:12;17082:4;;17072:15;;;;;;;:::i;:::-;;;;;;;;17057:30;;17267:4;17261:11;-1:-1:-1;;;17296:5:0;17289:81;17412:11;17405:4;17398:5;17394:16;17387:37;-1:-1:-1;;;17459:4:0;17452:5;17448:16;17441:92;17590:4;17584;17577:5;17574:1;17566:29;17550:45;;;17230:379;;;;17685:4;17679:11;-1:-1:-1;;;17714:5:0;17707:81;17830:11;17823:4;17816:5;17812:16;17805:37;-1:-1:-1;;;17877:4:0;17870:5;17866:16;17859:92;18001:4;17994:5;17991:1;17984:22;17968:38;;;17648:372;-1:-1:-1;;;;;18039:30:0;;;:16;:30;;;;;;;;;;;;:47;;-1:-1:-1;;;;;;18039:47:0;;;;;;;;;;;18097:58;;-1:-1:-1;;;18097:58:0;;:34;;18139:9;;18097:58;;18150:4;;;;18097:58;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18203:12;-1:-1:-1;;;;;18171:45:0;18181:14;-1:-1:-1;;;;;18171:45:0;;18197:4;;18171:45;;;;;;;:::i;:::-;;;;;;;;16553:1670;;;;;;;:::o;15971:51::-;;;;;;;;;;;;;-1:-1:-1;;;;;15971:51:0;;:::o;5:130:-1:-;72:20;;-1:-1;;;;;4656:54;;5040:35;;5030:2;;5089:1;;5079:12;5030:2;57:78;;;;:::o;631:241::-;;735:2;723:9;714:7;710:23;706:32;703:2;;;-1:-1;;741:12;703:2;803:53;848:7;824:22;803:53;:::i;:::-;793:63;697:175;-1:-1;;;697:175::o;879:609::-;;;;;1033:2;1021:9;1012:7;1008:23;1004:32;1001:2;;;-1:-1;;1039:12;1001:2;1101:53;1146:7;1122:22;1101:53;:::i;:::-;1091:63;;1219:2;1208:9;1204:18;1191:32;1243:18;;1235:6;1232:30;1229:2;;;-1:-1;;1265:12;1229:2;1350:6;1339:9;1335:22;;;401:3;394:4;386:6;382:17;378:27;368:2;;-1:-1;;409:12;368:2;452:6;439:20;1243:18;471:6;468:30;465:2;;;-1:-1;;501:12;465:2;596:3;1219:2;576:17;537:6;562:32;;559:41;556:2;;;-1:-1;;603:12;556:2;1219;537:6;533:17;1285:82;;;;;;;;1404:2;1444:9;1440:22;206:20;5186:5;4568:13;4561:21;5164:5;5161:32;5151:2;;-1:-1;;5197:12;5151:2;995:493;;;;-1:-1;995:493;;-1:-1;;995:493::o;2625:291::-;;4804:6;4799:3;4794;4781:30;4842:16;;4835:27;;;4842:16;2769:147;-1:-1;2769:147::o;2923:222::-;-1:-1;;;;;4656:54;;;;1566:37;;3050:2;3035:18;;3021:124::o;3152:326::-;;3307:2;3328:17;3321:47;4023:6;3307:2;3296:9;3292:18;4011:19;4804:6;4799:3;4051:14;3296:9;4051:14;4781:30;4842:16;;;4051:14;4842:16;;;4835:27;;;;4960:7;4944:14;;;-1:-1;;4940:28;1890:39;;;3278:200;-1:-1;3278:200::o;3485:416::-;3685:2;3699:47;;;3670:18;;;4011:19;2545:34;4051:14;;;2525:55;2599:12;;;3656:245::o"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "200400",
                "executionCost": "245",
                "totalCost": "200645"
              },
              "external": {
                "deploy(address,bytes,bool)": "infinite",
                "masterContractOf(address)": "1302"
              }
            },
            "methodIdentifiers": {
              "deploy(address,bytes,bool)": "1f54245b",
              "masterContractOf(address)": "bafe4f14"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"masterContract\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"cloneAddress\",\"type\":\"address\"}],\"name\":\"LogDeploy\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"masterContract\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"bool\",\"name\":\"useCreate2\",\"type\":\"bool\"}],\"name\":\"deploy\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"cloneAddress\",\"type\":\"address\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"masterContractOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"deploy(address,bytes,bool)\":{\"params\":{\"data\":\"Additional abi encoded calldata that is passed to the new clone via `IMasterContract.init`.\",\"masterContract\":\"The address of the contract to clone.\",\"useCreate2\":\"Creates the clone by using the CREATE2 opcode, in this case `data` will be used as salt.\"},\"returns\":{\"cloneAddress\":\"Address of the created clone contract.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"deploy(address,bytes,bool)\":{\"notice\":\"Deploys a given master Contract as a clone. Any ETH transferred with this call is forwarded to the new clone. Emits `LogDeploy`.\"},\"masterContractOf(address)\":{\"notice\":\"Mapping from clone contracts to their masterContract.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/bentobox/BentoBoxV1.sol\":\"BoringFactory\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/bentobox/BentoBoxV1.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\n// The BentoBox\\n\\n//  \\u2584\\u2584\\u2584\\u2584\\u00b7 \\u2584\\u2584\\u2584 . \\u2590 \\u2584 \\u2584\\u2584\\u2584\\u2584\\u2584      \\u2584\\u2584\\u2584\\u2584\\u00b7       \\u2590\\u2584\\u2022 \\u2584\\n//  \\u2590\\u2588 \\u2580\\u2588\\u25aa\\u2580\\u2584.\\u2580\\u00b7\\u2588\\u258c\\u2590\\u2588\\u2022\\u2588\\u2588  \\u25aa     \\u2590\\u2588 \\u2580\\u2588\\u25aa\\u25aa      \\u2588\\u258c\\u2588\\u258c\\u25aa\\n//  \\u2590\\u2588\\u2580\\u2580\\u2588\\u2584\\u2590\\u2580\\u2580\\u25aa\\u2584\\u2590\\u2588\\u2590\\u2590\\u258c \\u2590\\u2588.\\u25aa \\u2584\\u2588\\u2580\\u2584 \\u2590\\u2588\\u2580\\u2580\\u2588\\u2584 \\u2584\\u2588\\u2580\\u2584  \\u00b7\\u2588\\u2588\\u00b7\\n//  \\u2588\\u2588\\u2584\\u25aa\\u2590\\u2588\\u2590\\u2588\\u2584\\u2584\\u258c\\u2588\\u2588\\u2590\\u2588\\u258c \\u2590\\u2588\\u258c\\u00b7\\u2590\\u2588\\u258c.\\u2590\\u258c\\u2588\\u2588\\u2584\\u25aa\\u2590\\u2588\\u2590\\u2588\\u258c.\\u2590\\u258c\\u25aa\\u2590\\u2588\\u00b7\\u2588\\u258c\\n//  \\u00b7\\u2580\\u2580\\u2580\\u2580  \\u2580\\u2580\\u2580 \\u2580\\u2580 \\u2588\\u25aa \\u2580\\u2580\\u2580  \\u2580\\u2588\\u2584\\u2580\\u25aa\\u00b7\\u2580\\u2580\\u2580\\u2580  \\u2580\\u2588\\u2584\\u2580\\u25aa\\u2022\\u2580\\u2580 \\u2580\\u2580\\n\\n// This contract stores funds, handles their transfers, supports flash loans and strategies.\\n\\n// Copyright (c) 2021 BoringCrypto - All rights reserved\\n// Twitter: @Boring_Crypto\\n\\n// Special thanks to Keno for all his hard work and support\\n\\n// Version 22-Mar-2021\\n\\npragma solidity 0.6.12;\\npragma experimental ABIEncoderV2;\\n\\n// solhint-disable avoid-low-level-calls\\n// solhint-disable not-rely-on-time\\n// solhint-disable no-inline-assembly\\n\\n// File @boringcrypto/boring-solidity/contracts/interfaces/IERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ninterface IERC20 {\\n    function totalSupply() external view returns (uint256);\\n\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /// @notice EIP 2612\\n    function permit(\\n        address owner,\\n        address spender,\\n        uint256 value,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) external;\\n}\\n\\n// File contracts/interfaces/IFlashLoan.sol\\n// License-Identifier: MIT\\n\\ninterface IFlashBorrower {\\n    /// @notice The flashloan callback. `amount` + `fee` needs to repayed to msg.sender before this call returns.\\n    /// @param sender The address of the invoker of this flashloan.\\n    /// @param token The address of the token that is loaned.\\n    /// @param amount of the `token` that is loaned.\\n    /// @param fee The fee that needs to be paid on top for this loan. Needs to be the same as `token`.\\n    /// @param data Additional data that was passed to the flashloan function.\\n    function onFlashLoan(\\n        address sender,\\n        IERC20 token,\\n        uint256 amount,\\n        uint256 fee,\\n        bytes calldata data\\n    ) external;\\n}\\n\\ninterface IBatchFlashBorrower {\\n    /// @notice The callback for batched flashloans. Every amount + fee needs to repayed to msg.sender before this call returns.\\n    /// @param sender The address of the invoker of this flashloan.\\n    /// @param tokens Array of addresses for ERC-20 tokens that is loaned.\\n    /// @param amounts A one-to-one map to `tokens` that is loaned.\\n    /// @param fees A one-to-one map to `tokens` that needs to be paid on top for each loan. Needs to be the same token.\\n    /// @param data Additional data that was passed to the flashloan function.\\n    function onBatchFlashLoan(\\n        address sender,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        uint256[] calldata fees,\\n        bytes calldata data\\n    ) external;\\n}\\n\\n// File contracts/interfaces/IWETH.sol\\n// License-Identifier: MIT\\n\\ninterface IWETH {\\n    function deposit() external payable;\\n\\n    function withdraw(uint256) external;\\n}\\n\\n// File contracts/interfaces/IStrategy.sol\\n// License-Identifier: MIT\\n\\ninterface IStrategy {\\n    /// @notice Send the assets to the Strategy and call skim to invest them.\\n    /// @param amount The amount of tokens to invest.\\n    function skim(uint256 amount) external;\\n\\n    /// @notice Harvest any profits made converted to the asset and pass them to the caller.\\n    /// @param balance The amount of tokens the caller thinks it has invested.\\n    /// @param sender The address of the initiator of this transaction. Can be used for reimbursements, etc.\\n    /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.\\n    function harvest(uint256 balance, address sender) external returns (int256 amountAdded);\\n\\n    /// @notice Withdraw assets. The returned amount can differ from the requested amount due to rounding.\\n    /// @dev The `actualAmount` should be very close to the amount.\\n    /// The difference should NOT be used to report a loss. That's what harvest is for.\\n    /// @param amount The requested amount the caller wants to withdraw.\\n    /// @return actualAmount The real amount that is withdrawn.\\n    function withdraw(uint256 amount) external returns (uint256 actualAmount);\\n\\n    /// @notice Withdraw all assets in the safest way possible. This shouldn't fail.\\n    /// @param balance The amount of tokens the caller thinks it has invested.\\n    /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.\\n    function exit(uint256 balance) external returns (int256 amountAdded);\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\nlibrary BoringERC20 {\\n    bytes4 private constant SIG_SYMBOL = 0x95d89b41; // symbol()\\n    bytes4 private constant SIG_NAME = 0x06fdde03; // name()\\n    bytes4 private constant SIG_DECIMALS = 0x313ce567; // decimals()\\n    bytes4 private constant SIG_TRANSFER = 0xa9059cbb; // transfer(address,uint256)\\n    bytes4 private constant SIG_TRANSFER_FROM = 0x23b872dd; // transferFrom(address,address,uint256)\\n\\n    /// @notice Provides a safe ERC20.transfer version for different ERC-20 implementations.\\n    /// Reverts on a failed transfer.\\n    /// @param token The address of the ERC-20 token.\\n    /// @param to Transfer tokens to.\\n    /// @param amount The token amount.\\n    function safeTransfer(\\n        IERC20 token,\\n        address to,\\n        uint256 amount\\n    ) internal {\\n        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER, to, amount));\\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: Transfer failed\\\");\\n    }\\n\\n    /// @notice Provides a safe ERC20.transferFrom version for different ERC-20 implementations.\\n    /// Reverts on a failed transfer.\\n    /// @param token The address of the ERC-20 token.\\n    /// @param from Transfer tokens from.\\n    /// @param to Transfer tokens to.\\n    /// @param amount The token amount.\\n    function safeTransferFrom(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 amount\\n    ) internal {\\n        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER_FROM, from, to, amount));\\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: TransferFrom failed\\\");\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringMath.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n/// @notice A library for performing overflow-/underflow-safe math,\\n/// updated with awesomeness from of DappHub (https://github.com/dapphub/ds-math).\\nlibrary BoringMath {\\n    function add(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require(b == 0 || (c = a * b) / b == a, \\\"BoringMath: Mul Overflow\\\");\\n    }\\n\\n    function to128(uint256 a) internal pure returns (uint128 c) {\\n        require(a <= uint128(-1), \\\"BoringMath: uint128 Overflow\\\");\\n        c = uint128(a);\\n    }\\n\\n    function to64(uint256 a) internal pure returns (uint64 c) {\\n        require(a <= uint64(-1), \\\"BoringMath: uint64 Overflow\\\");\\n        c = uint64(a);\\n    }\\n\\n    function to32(uint256 a) internal pure returns (uint32 c) {\\n        require(a <= uint32(-1), \\\"BoringMath: uint32 Overflow\\\");\\n        c = uint32(a);\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint128.\\nlibrary BoringMath128 {\\n    function add(uint128 a, uint128 b) internal pure returns (uint128 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint128 a, uint128 b) internal pure returns (uint128 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint64.\\nlibrary BoringMath64 {\\n    function add(uint64 a, uint64 b) internal pure returns (uint64 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint64 a, uint64 b) internal pure returns (uint64 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint32.\\nlibrary BoringMath32 {\\n    function add(uint32 a, uint32 b) internal pure returns (uint32 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint32 a, uint32 b) internal pure returns (uint32 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringRebase.sol@v1.2.0\\n// License-Identifier: MIT\\n\\nstruct Rebase {\\n    uint128 elastic;\\n    uint128 base;\\n}\\n\\n/// @notice A rebasing library using overflow-/underflow-safe math.\\nlibrary RebaseLibrary {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n\\n    /// @notice Calculates the base value in relationship to `elastic` and `total`.\\n    function toBase(\\n        Rebase memory total,\\n        uint256 elastic,\\n        bool roundUp\\n    ) internal pure returns (uint256 base) {\\n        if (total.elastic == 0) {\\n            base = elastic;\\n        } else {\\n            base = elastic.mul(total.base) / total.elastic;\\n            if (roundUp && base.mul(total.elastic) / total.base < elastic) {\\n                base = base.add(1);\\n            }\\n        }\\n    }\\n\\n    /// @notice Calculates the elastic value in relationship to `base` and `total`.\\n    function toElastic(\\n        Rebase memory total,\\n        uint256 base,\\n        bool roundUp\\n    ) internal pure returns (uint256 elastic) {\\n        if (total.base == 0) {\\n            elastic = base;\\n        } else {\\n            elastic = base.mul(total.elastic) / total.base;\\n            if (roundUp && elastic.mul(total.base) / total.elastic < base) {\\n                elastic = elastic.add(1);\\n            }\\n        }\\n    }\\n\\n    /// @notice Add `elastic` to `total` and doubles `total.base`.\\n    /// @return (Rebase) The new total.\\n    /// @return base in relationship to `elastic`.\\n    function add(\\n        Rebase memory total,\\n        uint256 elastic,\\n        bool roundUp\\n    ) internal pure returns (Rebase memory, uint256 base) {\\n        base = toBase(total, elastic, roundUp);\\n        total.elastic = total.elastic.add(elastic.to128());\\n        total.base = total.base.add(base.to128());\\n        return (total, base);\\n    }\\n\\n    /// @notice Sub `base` from `total` and update `total.elastic`.\\n    /// @return (Rebase) The new total.\\n    /// @return elastic in relationship to `base`.\\n    function sub(\\n        Rebase memory total,\\n        uint256 base,\\n        bool roundUp\\n    ) internal pure returns (Rebase memory, uint256 elastic) {\\n        elastic = toElastic(total, base, roundUp);\\n        total.elastic = total.elastic.sub(elastic.to128());\\n        total.base = total.base.sub(base.to128());\\n        return (total, elastic);\\n    }\\n\\n    /// @notice Add `elastic` and `base` to `total`.\\n    function add(\\n        Rebase memory total,\\n        uint256 elastic,\\n        uint256 base\\n    ) internal pure returns (Rebase memory) {\\n        total.elastic = total.elastic.add(elastic.to128());\\n        total.base = total.base.add(base.to128());\\n        return total;\\n    }\\n\\n    /// @notice Subtract `elastic` and `base` to `total`.\\n    function sub(\\n        Rebase memory total,\\n        uint256 elastic,\\n        uint256 base\\n    ) internal pure returns (Rebase memory) {\\n        total.elastic = total.elastic.sub(elastic.to128());\\n        total.base = total.base.sub(base.to128());\\n        return total;\\n    }\\n\\n    /// @notice Add `elastic` to `total` and update storage.\\n    /// @return newElastic Returns updated `elastic`.\\n    function addElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {\\n        newElastic = total.elastic = total.elastic.add(elastic.to128());\\n    }\\n\\n    /// @notice Subtract `elastic` from `total` and update storage.\\n    /// @return newElastic Returns updated `elastic`.\\n    function subElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {\\n        newElastic = total.elastic = total.elastic.sub(elastic.to128());\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringOwnable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n// Source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol + Claimable.sol\\n// Edited by BoringCrypto\\n\\ncontract BoringOwnableData {\\n    address public owner;\\n    address public pendingOwner;\\n}\\n\\ncontract BoringOwnable is BoringOwnableData {\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /// @notice `owner` defaults to msg.sender on construction.\\n    constructor() public {\\n        owner = msg.sender;\\n        emit OwnershipTransferred(address(0), msg.sender);\\n    }\\n\\n    /// @notice Transfers ownership to `newOwner`. Either directly or claimable by the new pending owner.\\n    /// Can only be invoked by the current `owner`.\\n    /// @param newOwner Address of the new owner.\\n    /// @param direct True if `newOwner` should be set immediately. False if `newOwner` needs to use `claimOwnership`.\\n    /// @param renounce Allows the `newOwner` to be `address(0)` if `direct` and `renounce` is True. Has no effect otherwise.\\n    function transferOwnership(\\n        address newOwner,\\n        bool direct,\\n        bool renounce\\n    ) public onlyOwner {\\n        if (direct) {\\n            // Checks\\n            require(newOwner != address(0) || renounce, \\\"Ownable: zero address\\\");\\n\\n            // Effects\\n            emit OwnershipTransferred(owner, newOwner);\\n            owner = newOwner;\\n            pendingOwner = address(0);\\n        } else {\\n            // Effects\\n            pendingOwner = newOwner;\\n        }\\n    }\\n\\n    /// @notice Needs to be called by `pendingOwner` to claim ownership.\\n    function claimOwnership() public {\\n        address _pendingOwner = pendingOwner;\\n\\n        // Checks\\n        require(msg.sender == _pendingOwner, \\\"Ownable: caller != pending owner\\\");\\n\\n        // Effects\\n        emit OwnershipTransferred(owner, _pendingOwner);\\n        owner = _pendingOwner;\\n        pendingOwner = address(0);\\n    }\\n\\n    /// @notice Only allows the `owner` to execute the function.\\n    modifier onlyOwner() {\\n        require(msg.sender == owner, \\\"Ownable: caller is not the owner\\\");\\n        _;\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/interfaces/IMasterContract.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ninterface IMasterContract {\\n    /// @notice Init function that gets called from `BoringFactory.deploy`.\\n    /// Also kown as the constructor for cloned contracts.\\n    /// Any ETH send to `BoringFactory.deploy` ends up here.\\n    /// @param data Can be abi encoded arguments or anything else.\\n    function init(bytes calldata data) external payable;\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringFactory.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ncontract BoringFactory {\\n    event LogDeploy(address indexed masterContract, bytes data, address indexed cloneAddress);\\n\\n    /// @notice Mapping from clone contracts to their masterContract.\\n    mapping(address => address) public masterContractOf;\\n\\n    /// @notice Deploys a given master Contract as a clone.\\n    /// Any ETH transferred with this call is forwarded to the new clone.\\n    /// Emits `LogDeploy`.\\n    /// @param masterContract The address of the contract to clone.\\n    /// @param data Additional abi encoded calldata that is passed to the new clone via `IMasterContract.init`.\\n    /// @param useCreate2 Creates the clone by using the CREATE2 opcode, in this case `data` will be used as salt.\\n    /// @return cloneAddress Address of the created clone contract.\\n    function deploy(\\n        address masterContract,\\n        bytes calldata data,\\n        bool useCreate2\\n    ) public payable returns (address cloneAddress) {\\n        require(masterContract != address(0), \\\"BoringFactory: No masterContract\\\");\\n        bytes20 targetBytes = bytes20(masterContract); // Takes the first 20 bytes of the masterContract's address\\n\\n        if (useCreate2) {\\n            // each masterContract has different code already. So clones are distinguished by their data only.\\n            bytes32 salt = keccak256(data);\\n\\n            // Creates clone, more info here: https://blog.openzeppelin.com/deep-dive-into-the-minimal-proxy-contract/\\n            assembly {\\n                let clone := mload(0x40)\\n                mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n                mstore(add(clone, 0x14), targetBytes)\\n                mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n                cloneAddress := create2(0, clone, 0x37, salt)\\n            }\\n        } else {\\n            assembly {\\n                let clone := mload(0x40)\\n                mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n                mstore(add(clone, 0x14), targetBytes)\\n                mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n                cloneAddress := create(0, clone, 0x37)\\n            }\\n        }\\n        masterContractOf[cloneAddress] = masterContract;\\n\\n        IMasterContract(cloneAddress).init{value: msg.value}(data);\\n\\n        emit LogDeploy(masterContract, data, cloneAddress);\\n    }\\n}\\n\\n// File contracts/MasterContractManager.sol\\n// License-Identifier: UNLICENSED\\n\\ncontract MasterContractManager is BoringOwnable, BoringFactory {\\n    event LogWhiteListMasterContract(address indexed masterContract, bool approved);\\n    event LogSetMasterContractApproval(address indexed masterContract, address indexed user, bool approved);\\n    event LogRegisterProtocol(address indexed protocol);\\n\\n    /// @notice masterContract to user to approval state\\n    mapping(address => mapping(address => bool)) public masterContractApproved;\\n    /// @notice masterContract to whitelisted state for approval without signed message\\n    mapping(address => bool) public whitelistedMasterContracts;\\n    /// @notice user nonces for masterContract approvals\\n    mapping(address => uint256) public nonces;\\n\\n    bytes32 private constant DOMAIN_SEPARATOR_SIGNATURE_HASH = keccak256(\\\"EIP712Domain(string name,uint256 chainId,address verifyingContract)\\\");\\n    // See https://eips.ethereum.org/EIPS/eip-191\\n    string private constant EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA = \\\"\\\\x19\\\\x01\\\";\\n    bytes32 private constant APPROVAL_SIGNATURE_HASH =\\n        keccak256(\\\"SetMasterContractApproval(string warning,address user,address masterContract,bool approved,uint256 nonce)\\\");\\n\\n    // solhint-disable-next-line var-name-mixedcase\\n    bytes32 private immutable _DOMAIN_SEPARATOR;\\n    // solhint-disable-next-line var-name-mixedcase\\n    uint256 private immutable DOMAIN_SEPARATOR_CHAIN_ID;\\n\\n    constructor() public {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        _DOMAIN_SEPARATOR = _calculateDomainSeparator(DOMAIN_SEPARATOR_CHAIN_ID = chainId);\\n    }\\n\\n    function _calculateDomainSeparator(uint256 chainId) private view returns (bytes32) {\\n        return keccak256(abi.encode(DOMAIN_SEPARATOR_SIGNATURE_HASH, keccak256(\\\"BentoBox V1\\\"), chainId, address(this)));\\n    }\\n\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() public view returns (bytes32) {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        return chainId == DOMAIN_SEPARATOR_CHAIN_ID ? _DOMAIN_SEPARATOR : _calculateDomainSeparator(chainId);\\n    }\\n\\n    /// @notice Other contracts need to register with this master contract so that users can approve them for the BentoBox.\\n    function registerProtocol() public {\\n        masterContractOf[msg.sender] = msg.sender;\\n        emit LogRegisterProtocol(msg.sender);\\n    }\\n\\n    /// @notice Enables or disables a contract for approval without signed message.\\n    function whitelistMasterContract(address masterContract, bool approved) public onlyOwner {\\n        // Checks\\n        require(masterContract != address(0), \\\"MasterCMgr: Cannot approve 0\\\");\\n\\n        // Effects\\n        whitelistedMasterContracts[masterContract] = approved;\\n        emit LogWhiteListMasterContract(masterContract, approved);\\n    }\\n\\n    /// @notice Approves or revokes a `masterContract` access to `user` funds.\\n    /// @param user The address of the user that approves or revokes access.\\n    /// @param masterContract The address who gains or loses access.\\n    /// @param approved If True approves access. If False revokes access.\\n    /// @param v Part of the signature. (See EIP-191)\\n    /// @param r Part of the signature. (See EIP-191)\\n    /// @param s Part of the signature. (See EIP-191)\\n    // F4 - Check behaviour for all function arguments when wrong or extreme\\n    // F4: Don't allow masterContract 0 to be approved. Unknown contracts will have a masterContract of 0.\\n    // F4: User can't be 0 for signed approvals because the recoveredAddress will be 0 if ecrecover fails\\n    function setMasterContractApproval(\\n        address user,\\n        address masterContract,\\n        bool approved,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) public {\\n        // Checks\\n        require(masterContract != address(0), \\\"MasterCMgr: masterC not set\\\"); // Important for security\\n\\n        // If no signature is provided, the fallback is executed\\n        if (r == 0 && s == 0 && v == 0) {\\n            require(user == msg.sender, \\\"MasterCMgr: user not sender\\\");\\n            require(masterContractOf[user] == address(0), \\\"MasterCMgr: user is clone\\\");\\n            require(whitelistedMasterContracts[masterContract], \\\"MasterCMgr: not whitelisted\\\");\\n        } else {\\n            // Important for security - any address without masterContract has address(0) as masterContract\\n            // So approving address(0) would approve every address, leading to full loss of funds\\n            // Also, ecrecover returns address(0) on failure. So we check this:\\n            require(user != address(0), \\\"MasterCMgr: User cannot be 0\\\");\\n\\n            // C10 - Protect signatures against replay, use nonce and chainId (SWC-121)\\n            // C10: nonce + chainId are used to prevent replays\\n            // C11 - All signatures strictly EIP-712 (SWC-117 SWC-122)\\n            // C11: signature is EIP-712 compliant\\n            // C12 - abi.encodePacked can't contain variable length user input (SWC-133)\\n            // C12: abi.encodePacked has fixed length parameters\\n            bytes32 digest =\\n                keccak256(\\n                    abi.encodePacked(\\n                        EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA,\\n                        DOMAIN_SEPARATOR(),\\n                        keccak256(\\n                            abi.encode(\\n                                APPROVAL_SIGNATURE_HASH,\\n                                approved\\n                                    ? keccak256(\\\"Give FULL access to funds in (and approved to) BentoBox?\\\")\\n                                    : keccak256(\\\"Revoke access to BentoBox?\\\"),\\n                                user,\\n                                masterContract,\\n                                approved,\\n                                nonces[user]++\\n                            )\\n                        )\\n                    )\\n                );\\n            address recoveredAddress = ecrecover(digest, v, r, s);\\n            require(recoveredAddress == user, \\\"MasterCMgr: Invalid Signature\\\");\\n        }\\n\\n        // Effects\\n        masterContractApproved[masterContract][user] = approved;\\n        emit LogSetMasterContractApproval(masterContract, user, approved);\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringBatchable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ncontract BaseBoringBatchable {\\n    /// @dev Helper function to extract a useful revert message from a failed call.\\n    /// If the returned data is malformed or not correctly abi encoded then this call can fail itself.\\n    function _getRevertMsg(bytes memory _returnData) internal pure returns (string memory) {\\n        // If the _res length is less than 68, then the transaction failed silently (without a revert message)\\n        if (_returnData.length < 68) return \\\"Transaction reverted silently\\\";\\n\\n        assembly {\\n            // Slice the sighash.\\n            _returnData := add(_returnData, 0x04)\\n        }\\n        return abi.decode(_returnData, (string)); // All that remains is the revert string\\n    }\\n\\n    /// @notice Allows batched call to self (this contract).\\n    /// @param calls An array of inputs for each call.\\n    /// @param revertOnFail If True then reverts after a failed call and stops doing further calls.\\n    /// @return successes An array indicating the success of a call, mapped one-to-one to `calls`.\\n    /// @return results An array with the returned data of each function call, mapped one-to-one to `calls`.\\n    // F1: External is ok here because this is the batch function, adding it to a batch makes no sense\\n    // F2: Calls in the batch may be payable, delegatecall operates in the same context, so each call in the batch has access to msg.value\\n    // C3: The length of the loop is fully under user control, so can't be exploited\\n    // C7: Delegatecall is only used on the same contract, so it's safe\\n    function batch(bytes[] calldata calls, bool revertOnFail) external payable returns (bool[] memory successes, bytes[] memory results) {\\n        successes = new bool[](calls.length);\\n        results = new bytes[](calls.length);\\n        for (uint256 i = 0; i < calls.length; i++) {\\n            (bool success, bytes memory result) = address(this).delegatecall(calls[i]);\\n            require(success || !revertOnFail, _getRevertMsg(result));\\n            successes[i] = success;\\n            results[i] = result;\\n        }\\n    }\\n}\\n\\ncontract BoringBatchable is BaseBoringBatchable {\\n    /// @notice Call wrapper that performs `ERC20.permit` on `token`.\\n    /// Lookup `IERC20.permit`.\\n    // F6: Parameters can be used front-run the permit and the user's permit will fail (due to nonce or other revert)\\n    //     if part of a batch this could be used to grief once as the second call would not need the permit\\n    function permitToken(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) public {\\n        token.permit(from, to, amount, deadline, v, r, s);\\n    }\\n}\\n\\n// File contracts/BentoBox.sol\\n// License-Identifier: UNLICENSED\\n\\n/// @title BentoBox\\n/// @author BoringCrypto, Keno\\n/// @notice The BentoBox is a vault for tokens. The stored tokens can be flash loaned and used in strategies.\\n/// Yield from this will go to the token depositors.\\n/// Rebasing tokens ARE NOT supported and WILL cause loss of funds.\\n/// Any funds transfered directly onto the BentoBox will be lost, use the deposit function instead.\\ncontract BentoBoxV1 is MasterContractManager, BoringBatchable {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n    using BoringERC20 for IERC20;\\n    using RebaseLibrary for Rebase;\\n\\n    // ************** //\\n    // *** EVENTS *** //\\n    // ************** //\\n\\n    event LogDeposit(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogWithdraw(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogTransfer(IERC20 indexed token, address indexed from, address indexed to, uint256 share);\\n\\n    event LogFlashLoan(address indexed borrower, IERC20 indexed token, uint256 amount, uint256 feeAmount, address indexed receiver);\\n\\n    event LogStrategyTargetPercentage(IERC20 indexed token, uint256 targetPercentage);\\n    event LogStrategyQueued(IERC20 indexed token, IStrategy indexed strategy);\\n    event LogStrategySet(IERC20 indexed token, IStrategy indexed strategy);\\n    event LogStrategyInvest(IERC20 indexed token, uint256 amount);\\n    event LogStrategyDivest(IERC20 indexed token, uint256 amount);\\n    event LogStrategyProfit(IERC20 indexed token, uint256 amount);\\n    event LogStrategyLoss(IERC20 indexed token, uint256 amount);\\n\\n    // *************** //\\n    // *** STRUCTS *** //\\n    // *************** //\\n\\n    struct StrategyData {\\n        uint64 strategyStartDate;\\n        uint64 targetPercentage;\\n        uint128 balance; // the balance of the strategy that BentoBox thinks is in there\\n    }\\n\\n    // ******************************** //\\n    // *** CONSTANTS AND IMMUTABLES *** //\\n    // ******************************** //\\n\\n    // V2 - Can they be private?\\n    // V2: Private to save gas, to verify it's correct, check the constructor arguments\\n    IERC20 private immutable wethToken;\\n\\n    IERC20 private constant USE_ETHEREUM = IERC20(0);\\n    uint256 private constant FLASH_LOAN_FEE = 50; // 0.05%\\n    uint256 private constant FLASH_LOAN_FEE_PRECISION = 1e5;\\n    uint256 private constant STRATEGY_DELAY = 2 weeks;\\n    uint256 private constant MAX_TARGET_PERCENTAGE = 95; // 95%\\n    uint256 private constant MINIMUM_SHARE_BALANCE = 1000; // To prevent the ratio going off\\n\\n    // ***************** //\\n    // *** VARIABLES *** //\\n    // ***************** //\\n\\n    // Balance per token per address/contract in shares\\n    mapping(IERC20 => mapping(address => uint256)) public balanceOf;\\n\\n    // Rebase from amount to share\\n    mapping(IERC20 => Rebase) public totals;\\n\\n    mapping(IERC20 => IStrategy) public strategy;\\n    mapping(IERC20 => IStrategy) public pendingStrategy;\\n    mapping(IERC20 => StrategyData) public strategyData;\\n\\n    // ******************* //\\n    // *** CONSTRUCTOR *** //\\n    // ******************* //\\n\\n    constructor(IERC20 wethToken_) public {\\n        wethToken = wethToken_;\\n    }\\n\\n    // ***************** //\\n    // *** MODIFIERS *** //\\n    // ***************** //\\n\\n    /// Modifier to check if the msg.sender is allowed to use funds belonging to the 'from' address.\\n    /// If 'from' is msg.sender, it's allowed.\\n    /// If 'from' is the BentoBox itself, it's allowed. Any ETH, token balances (above the known balances) or BentoBox balances\\n    /// can be taken by anyone.\\n    /// This is to enable skimming, not just for deposits, but also for withdrawals or transfers, enabling better composability.\\n    /// If 'from' is a clone of a masterContract AND the 'from' address has approved that masterContract, it's allowed.\\n    modifier allowed(address from) {\\n        if (from != msg.sender && from != address(this)) {\\n            // From is sender or you are skimming\\n            address masterContract = masterContractOf[msg.sender];\\n            require(masterContract != address(0), \\\"BentoBox: no masterContract\\\");\\n            require(masterContractApproved[masterContract][from], \\\"BentoBox: Transfer not approved\\\");\\n        }\\n        _;\\n    }\\n\\n    // ************************** //\\n    // *** INTERNAL FUNCTIONS *** //\\n    // ************************** //\\n\\n    /// @dev Returns the total balance of `token` this contracts holds,\\n    /// plus the total amount this contract thinks the strategy holds.\\n    function _tokenBalanceOf(IERC20 token) internal view returns (uint256 amount) {\\n        amount = token.balanceOf(address(this)).add(strategyData[token].balance);\\n    }\\n\\n    // ************************ //\\n    // *** PUBLIC FUNCTIONS *** //\\n    // ************************ //\\n\\n    /// @dev Helper function to represent an `amount` of `token` in shares.\\n    /// @param token The ERC-20 token.\\n    /// @param amount The `token` amount.\\n    /// @param roundUp If the result `share` should be rounded up.\\n    /// @return share The token amount represented in shares.\\n    function toShare(\\n        IERC20 token,\\n        uint256 amount,\\n        bool roundUp\\n    ) external view returns (uint256 share) {\\n        share = totals[token].toBase(amount, roundUp);\\n    }\\n\\n    /// @dev Helper function represent shares back into the `token` amount.\\n    /// @param token The ERC-20 token.\\n    /// @param share The amount of shares.\\n    /// @param roundUp If the result should be rounded up.\\n    /// @return amount The share amount back into native representation.\\n    function toAmount(\\n        IERC20 token,\\n        uint256 share,\\n        bool roundUp\\n    ) external view returns (uint256 amount) {\\n        amount = totals[token].toElastic(share, roundUp);\\n    }\\n\\n    /// @notice Deposit an amount of `token` represented in either `amount` or `share`.\\n    /// @param token_ The ERC-20 token to deposit.\\n    /// @param from which account to pull the tokens.\\n    /// @param to which account to push the tokens.\\n    /// @param amount Token amount in native representation to deposit.\\n    /// @param share Token amount represented in shares to deposit. Takes precedence over `amount`.\\n    /// @return amountOut The amount deposited.\\n    /// @return shareOut The deposited amount repesented in shares.\\n    function deposit(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) public payable allowed(from) returns (uint256 amountOut, uint256 shareOut) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;\\n        Rebase memory total = totals[token];\\n\\n        // If a new token gets added, the tokenSupply call checks that this is a deployed contract. Needed for security.\\n        require(total.elastic != 0 || token.totalSupply() > 0, \\\"BentoBox: No tokens\\\");\\n        if (share == 0) {\\n            // value of the share may be lower than the amount due to rounding, that's ok\\n            share = total.toBase(amount, false);\\n            // Any deposit should lead to at least the minimum share balance, otherwise it's ignored (no amount taken)\\n            if (total.base.add(share.to128()) < MINIMUM_SHARE_BALANCE) {\\n                return (0, 0);\\n            }\\n        } else {\\n            // amount may be lower than the value of share due to rounding, in that case, add 1 to amount (Always round up)\\n            amount = total.toElastic(share, true);\\n        }\\n\\n        // In case of skimming, check that only the skimmable amount is taken.\\n        // For ETH, the full balance is available, so no need to check.\\n        // During flashloans the _tokenBalanceOf is lower than 'reality', so skimming deposits will mostly fail during a flashloan.\\n        require(\\n            from != address(this) || token_ == USE_ETHEREUM || amount <= _tokenBalanceOf(token).sub(total.elastic),\\n            \\\"BentoBox: Skim too much\\\"\\n        );\\n\\n        balanceOf[token][to] = balanceOf[token][to].add(share);\\n        total.base = total.base.add(share.to128());\\n        total.elastic = total.elastic.add(amount.to128());\\n        totals[token] = total;\\n\\n        // Interactions\\n        // During the first deposit, we check that this token is 'real'\\n        if (token_ == USE_ETHEREUM) {\\n            // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)\\n            // X2: If the WETH implementation is faulty or malicious, it will block adding ETH (but we know the WETH implementation)\\n            IWETH(address(wethToken)).deposit{value: amount}();\\n        } else if (from != address(this)) {\\n            // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)\\n            // X2: If the token implementation is faulty or malicious, it may block adding tokens. Good.\\n            token.safeTransferFrom(from, address(this), amount);\\n        }\\n        emit LogDeposit(token, from, to, amount, share);\\n        amountOut = amount;\\n        shareOut = share;\\n    }\\n\\n    /// @notice Withdraws an amount of `token` from a user account.\\n    /// @param token_ The ERC-20 token to withdraw.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param amount of tokens. Either one of `amount` or `share` needs to be supplied.\\n    /// @param share Like above, but `share` takes precedence over `amount`.\\n    function withdraw(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) public allowed(from) returns (uint256 amountOut, uint256 shareOut) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;\\n        Rebase memory total = totals[token];\\n        if (share == 0) {\\n            // value of the share paid could be lower than the amount paid due to rounding, in that case, add a share (Always round up)\\n            share = total.toBase(amount, true);\\n        } else {\\n            // amount may be lower than the value of share due to rounding, that's ok\\n            amount = total.toElastic(share, false);\\n        }\\n\\n        balanceOf[token][from] = balanceOf[token][from].sub(share);\\n        total.elastic = total.elastic.sub(amount.to128());\\n        total.base = total.base.sub(share.to128());\\n        // There have to be at least 1000 shares left to prevent reseting the share/amount ratio (unless it's fully emptied)\\n        require(total.base >= MINIMUM_SHARE_BALANCE || total.base == 0, \\\"BentoBox: cannot empty\\\");\\n        totals[token] = total;\\n\\n        // Interactions\\n        if (token_ == USE_ETHEREUM) {\\n            // X2, X3: A revert or big gas usage in the WETH contract could block withdrawals, but WETH9 is fine.\\n            IWETH(address(wethToken)).withdraw(amount);\\n            // X2, X3: A revert or big gas usage could block, however, the to address is under control of the caller.\\n            (bool success, ) = to.call{value: amount}(\\\"\\\");\\n            require(success, \\\"BentoBox: ETH transfer failed\\\");\\n        } else {\\n            // X2, X3: A malicious token could block withdrawal of just THAT token.\\n            //         masterContracts may want to take care not to rely on withdraw always succeeding.\\n            token.safeTransfer(to, amount);\\n        }\\n        emit LogWithdraw(token, from, to, amount, share);\\n        amountOut = amount;\\n        shareOut = share;\\n    }\\n\\n    /// @notice Transfer shares from a user account to another one.\\n    /// @param token The ERC-20 token to transfer.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param share The amount of `token` in shares.\\n    // Clones of master contracts can transfer from any account that has approved them\\n    // F3 - Can it be combined with another similar function?\\n    // F3: This isn't combined with transferMultiple for gas optimization\\n    function transfer(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 share\\n    ) public allowed(from) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        balanceOf[token][from] = balanceOf[token][from].sub(share);\\n        balanceOf[token][to] = balanceOf[token][to].add(share);\\n\\n        emit LogTransfer(token, from, to, share);\\n    }\\n\\n    /// @notice Transfer shares from a user account to multiple other ones.\\n    /// @param token The ERC-20 token to transfer.\\n    /// @param from which user to pull the tokens.\\n    /// @param tos The receivers of the tokens.\\n    /// @param shares The amount of `token` in shares for each receiver in `tos`.\\n    // F3 - Can it be combined with another similar function?\\n    // F3: This isn't combined with transfer for gas optimization\\n    function transferMultiple(\\n        IERC20 token,\\n        address from,\\n        address[] calldata tos,\\n        uint256[] calldata shares\\n    ) public allowed(from) {\\n        // Checks\\n        require(tos[0] != address(0), \\\"BentoBox: to[0] not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        uint256 totalAmount;\\n        uint256 len = tos.length;\\n        for (uint256 i = 0; i < len; i++) {\\n            address to = tos[i];\\n            balanceOf[token][to] = balanceOf[token][to].add(shares[i]);\\n            totalAmount = totalAmount.add(shares[i]);\\n            emit LogTransfer(token, from, to, shares[i]);\\n        }\\n        balanceOf[token][from] = balanceOf[token][from].sub(totalAmount);\\n    }\\n\\n    /// @notice Flashloan ability.\\n    /// @param borrower The address of the contract that implements and conforms to `IFlashBorrower` and handles the flashloan.\\n    /// @param receiver Address of the token receiver.\\n    /// @param token The address of the token to receive.\\n    /// @param amount of the tokens to receive.\\n    /// @param data The calldata to pass to the `borrower` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Not possible to follow this here, reentrancy has been reviewed\\n    // F6 - Check for front-running possibilities, such as the approve function (SWC-114)\\n    // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.\\n    function flashLoan(\\n        IFlashBorrower borrower,\\n        address receiver,\\n        IERC20 token,\\n        uint256 amount,\\n        bytes calldata data\\n    ) public {\\n        uint256 fee = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;\\n        token.safeTransfer(receiver, amount);\\n\\n        borrower.onFlashLoan(msg.sender, token, amount, fee, data);\\n\\n        require(_tokenBalanceOf(token) >= totals[token].addElastic(fee.to128()), \\\"BentoBox: Wrong amount\\\");\\n        emit LogFlashLoan(address(borrower), token, amount, fee, receiver);\\n    }\\n\\n    /// @notice Support for batched flashloans. Useful to request multiple different `tokens` in a single transaction.\\n    /// @param borrower The address of the contract that implements and conforms to `IBatchFlashBorrower` and handles the flashloan.\\n    /// @param receivers An array of the token receivers. A one-to-one mapping with `tokens` and `amounts`.\\n    /// @param tokens The addresses of the tokens.\\n    /// @param amounts of the tokens for each receiver.\\n    /// @param data The calldata to pass to the `borrower` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Not possible to follow this here, reentrancy has been reviewed\\n    // F6 - Check for front-running possibilities, such as the approve function (SWC-114)\\n    // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.\\n    function batchFlashLoan(\\n        IBatchFlashBorrower borrower,\\n        address[] calldata receivers,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        bytes calldata data\\n    ) public {\\n        uint256[] memory fees = new uint256[](tokens.length);\\n\\n        uint256 len = tokens.length;\\n        for (uint256 i = 0; i < len; i++) {\\n            uint256 amount = amounts[i];\\n            fees[i] = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;\\n\\n            tokens[i].safeTransfer(receivers[i], amounts[i]);\\n        }\\n\\n        borrower.onBatchFlashLoan(msg.sender, tokens, amounts, fees, data);\\n\\n        for (uint256 i = 0; i < len; i++) {\\n            IERC20 token = tokens[i];\\n            require(_tokenBalanceOf(token) >= totals[token].addElastic(fees[i].to128()), \\\"BentoBox: Wrong amount\\\");\\n            emit LogFlashLoan(address(borrower), token, amounts[i], fees[i], receivers[i]);\\n        }\\n    }\\n\\n    /// @notice Sets the target percentage of the strategy for `token`.\\n    /// @dev Only the owner of this contract is allowed to change this.\\n    /// @param token The address of the token that maps to a strategy to change.\\n    /// @param targetPercentage_ The new target in percent. Must be lesser or equal to `MAX_TARGET_PERCENTAGE`.\\n    function setStrategyTargetPercentage(IERC20 token, uint64 targetPercentage_) public onlyOwner {\\n        // Checks\\n        require(targetPercentage_ <= MAX_TARGET_PERCENTAGE, \\\"StrategyManager: Target too high\\\");\\n\\n        // Effects\\n        strategyData[token].targetPercentage = targetPercentage_;\\n        emit LogStrategyTargetPercentage(token, targetPercentage_);\\n    }\\n\\n    /// @notice Sets the contract address of a new strategy that conforms to `IStrategy` for `token`.\\n    /// Must be called twice with the same arguments.\\n    /// A new strategy becomes pending first and can be activated once `STRATEGY_DELAY` is over.\\n    /// @dev Only the owner of this contract is allowed to change this.\\n    /// @param token The address of the token that maps to a strategy to change.\\n    /// @param newStrategy The address of the contract that conforms to `IStrategy`.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Total amount is updated AFTER interaction. But strategy is under our control.\\n    // C4 - Use block.timestamp only for long intervals (SWC-116)\\n    // C4: block.timestamp is used for a period of 2 weeks, which is long enough\\n    function setStrategy(IERC20 token, IStrategy newStrategy) public onlyOwner {\\n        StrategyData memory data = strategyData[token];\\n        IStrategy pending = pendingStrategy[token];\\n        if (data.strategyStartDate == 0 || pending != newStrategy) {\\n            pendingStrategy[token] = newStrategy;\\n            // C1 - All math done through BoringMath (SWC-101)\\n            // C1: Our sun will swallow the earth well before this overflows\\n            data.strategyStartDate = (block.timestamp + STRATEGY_DELAY).to64();\\n            emit LogStrategyQueued(token, newStrategy);\\n        } else {\\n            require(data.strategyStartDate != 0 && block.timestamp >= data.strategyStartDate, \\\"StrategyManager: Too early\\\");\\n            if (address(strategy[token]) != address(0)) {\\n                int256 balanceChange = strategy[token].exit(data.balance);\\n                // Effects\\n                if (balanceChange > 0) {\\n                    uint256 add = uint256(balanceChange);\\n                    totals[token].addElastic(add);\\n                    emit LogStrategyProfit(token, add);\\n                } else if (balanceChange < 0) {\\n                    uint256 sub = uint256(-balanceChange);\\n                    totals[token].subElastic(sub);\\n                    emit LogStrategyLoss(token, sub);\\n                }\\n\\n                emit LogStrategyDivest(token, data.balance);\\n            }\\n            strategy[token] = pending;\\n            data.strategyStartDate = 0;\\n            data.balance = 0;\\n            pendingStrategy[token] = IStrategy(0);\\n            emit LogStrategySet(token, newStrategy);\\n        }\\n        strategyData[token] = data;\\n    }\\n\\n    /// @notice The actual process of yield farming. Executes the strategy of `token`.\\n    /// Optionally does housekeeping if `balance` is true.\\n    /// `maxChangeAmount` is relevant for skimming or withdrawing if `balance` is true.\\n    /// @param token The address of the token for which a strategy is deployed.\\n    /// @param balance True if housekeeping should be done.\\n    /// @param maxChangeAmount The maximum amount for either pulling or pushing from/to the `IStrategy` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Total amount is updated AFTER interaction. But strategy is under our control.\\n    // F5: Not followed to prevent reentrancy issues with flashloans and BentoBox skims?\\n    function harvest(\\n        IERC20 token,\\n        bool balance,\\n        uint256 maxChangeAmount\\n    ) public {\\n        StrategyData memory data = strategyData[token];\\n        IStrategy _strategy = strategy[token];\\n        int256 balanceChange = _strategy.harvest(data.balance, msg.sender);\\n        if (balanceChange == 0 && !balance) {\\n            return;\\n        }\\n\\n        uint256 totalElastic = totals[token].elastic;\\n\\n        if (balanceChange > 0) {\\n            uint256 add = uint256(balanceChange);\\n            totalElastic = totalElastic.add(add);\\n            totals[token].elastic = totalElastic.to128();\\n            emit LogStrategyProfit(token, add);\\n        } else if (balanceChange < 0) {\\n            // C1 - All math done through BoringMath (SWC-101)\\n            // C1: balanceChange could overflow if it's max negative int128.\\n            // But tokens with balances that large are not supported by the BentoBox.\\n            uint256 sub = uint256(-balanceChange);\\n            totalElastic = totalElastic.sub(sub);\\n            totals[token].elastic = totalElastic.to128();\\n            data.balance = data.balance.sub(sub.to128());\\n            emit LogStrategyLoss(token, sub);\\n        }\\n\\n        if (balance) {\\n            uint256 targetBalance = totalElastic.mul(data.targetPercentage) / 100;\\n            // if data.balance == targetBalance there is nothing to update\\n            if (data.balance < targetBalance) {\\n                uint256 amountOut = targetBalance.sub(data.balance);\\n                if (maxChangeAmount != 0 && amountOut > maxChangeAmount) {\\n                    amountOut = maxChangeAmount;\\n                }\\n                token.safeTransfer(address(_strategy), amountOut);\\n                data.balance = data.balance.add(amountOut.to128());\\n                _strategy.skim(amountOut);\\n                emit LogStrategyInvest(token, amountOut);\\n            } else if (data.balance > targetBalance) {\\n                uint256 amountIn = data.balance.sub(targetBalance.to128());\\n                if (maxChangeAmount != 0 && amountIn > maxChangeAmount) {\\n                    amountIn = maxChangeAmount;\\n                }\\n\\n                uint256 actualAmountIn = _strategy.withdraw(amountIn);\\n\\n                data.balance = data.balance.sub(actualAmountIn.to128());\\n                emit LogStrategyDivest(token, actualAmountIn);\\n            }\\n        }\\n\\n        strategyData[token] = data;\\n    }\\n\\n    // Contract should be able to receive ETH deposits to support deposit & skim\\n    // solhint-disable-next-line no-empty-blocks\\n    receive() external payable {}\\n}\\n\",\"keccak256\":\"0xf5251397b9aaa5c66ddc18b0cb96350ffac09f5776a1255fedc0072641f916fe\",\"license\":\"UNLICENSED\"}},\"version\":1}",
          "storageLayout": {
            "storage": [
              {
                "astId": 1046,
                "contract": "contracts/bentobox/BentoBoxV1.sol:BoringFactory",
                "label": "masterContractOf",
                "offset": 0,
                "slot": "0",
                "type": "t_mapping(t_address,t_address)"
              }
            ],
            "types": {
              "t_address": {
                "encoding": "inplace",
                "label": "address",
                "numberOfBytes": "20"
              },
              "t_mapping(t_address,t_address)": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => address)",
                "numberOfBytes": "32",
                "value": "t_address"
              }
            }
          },
          "userdoc": {
            "kind": "user",
            "methods": {
              "deploy(address,bytes,bool)": {
                "notice": "Deploys a given master Contract as a clone. Any ETH transferred with this call is forwarded to the new clone. Emits `LogDeploy`."
              },
              "masterContractOf(address)": {
                "notice": "Mapping from clone contracts to their masterContract."
              }
            },
            "version": 1
          }
        },
        "BoringMath": {
          "abi": [],
          "devdoc": {
            "kind": "dev",
            "methods": {},
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "60566023600b82828239805160001a607314601657fe5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212201b9adec8ba612c8c4b660f3a525b2cfffce108f42bf1d757306170b064dc232964736f6c634300060c0033",
              "opcodes": "PUSH1 0x56 PUSH1 0x23 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x16 JUMPI INVALID JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SHL SWAP11 0xDE 0xC8 0xBA PUSH2 0x2C8C 0x4B PUSH7 0xF3A525B2CFFFC 0xE1 ADDMOD DELEGATECALL 0x2B CALL 0xD7 JUMPI ADDRESS PUSH2 0x70B0 PUSH5 0xDC23296473 PUSH16 0x6C634300060C00330000000000000000 ",
              "sourceMap": "7184:949:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212201b9adec8ba612c8c4b660f3a525b2cfffce108f42bf1d757306170b064dc232964736f6c634300060c0033",
              "opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SHL SWAP11 0xDE 0xC8 0xBA PUSH2 0x2C8C 0x4B PUSH7 0xF3A525B2CFFFC 0xE1 ADDMOD DELEGATECALL 0x2B CALL 0xD7 JUMPI ADDRESS PUSH2 0x70B0 PUSH5 0xDC23296473 PUSH16 0x6C634300060C00330000000000000000 ",
              "sourceMap": "7184:949:0:-:0;;;;;;;;"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "17200",
                "executionCost": "97",
                "totalCost": "17297"
              },
              "internal": {
                "add(uint256,uint256)": "infinite",
                "mul(uint256,uint256)": "infinite",
                "sub(uint256,uint256)": "infinite",
                "to128(uint256)": "infinite",
                "to32(uint256)": "infinite",
                "to64(uint256)": "infinite"
              }
            },
            "methodIdentifiers": {}
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"A library for performing overflow-/underflow-safe math, updated with awesomeness from of DappHub (https://github.com/dapphub/ds-math).\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/bentobox/BentoBoxV1.sol\":\"BoringMath\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/bentobox/BentoBoxV1.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\n// The BentoBox\\n\\n//  \\u2584\\u2584\\u2584\\u2584\\u00b7 \\u2584\\u2584\\u2584 . \\u2590 \\u2584 \\u2584\\u2584\\u2584\\u2584\\u2584      \\u2584\\u2584\\u2584\\u2584\\u00b7       \\u2590\\u2584\\u2022 \\u2584\\n//  \\u2590\\u2588 \\u2580\\u2588\\u25aa\\u2580\\u2584.\\u2580\\u00b7\\u2588\\u258c\\u2590\\u2588\\u2022\\u2588\\u2588  \\u25aa     \\u2590\\u2588 \\u2580\\u2588\\u25aa\\u25aa      \\u2588\\u258c\\u2588\\u258c\\u25aa\\n//  \\u2590\\u2588\\u2580\\u2580\\u2588\\u2584\\u2590\\u2580\\u2580\\u25aa\\u2584\\u2590\\u2588\\u2590\\u2590\\u258c \\u2590\\u2588.\\u25aa \\u2584\\u2588\\u2580\\u2584 \\u2590\\u2588\\u2580\\u2580\\u2588\\u2584 \\u2584\\u2588\\u2580\\u2584  \\u00b7\\u2588\\u2588\\u00b7\\n//  \\u2588\\u2588\\u2584\\u25aa\\u2590\\u2588\\u2590\\u2588\\u2584\\u2584\\u258c\\u2588\\u2588\\u2590\\u2588\\u258c \\u2590\\u2588\\u258c\\u00b7\\u2590\\u2588\\u258c.\\u2590\\u258c\\u2588\\u2588\\u2584\\u25aa\\u2590\\u2588\\u2590\\u2588\\u258c.\\u2590\\u258c\\u25aa\\u2590\\u2588\\u00b7\\u2588\\u258c\\n//  \\u00b7\\u2580\\u2580\\u2580\\u2580  \\u2580\\u2580\\u2580 \\u2580\\u2580 \\u2588\\u25aa \\u2580\\u2580\\u2580  \\u2580\\u2588\\u2584\\u2580\\u25aa\\u00b7\\u2580\\u2580\\u2580\\u2580  \\u2580\\u2588\\u2584\\u2580\\u25aa\\u2022\\u2580\\u2580 \\u2580\\u2580\\n\\n// This contract stores funds, handles their transfers, supports flash loans and strategies.\\n\\n// Copyright (c) 2021 BoringCrypto - All rights reserved\\n// Twitter: @Boring_Crypto\\n\\n// Special thanks to Keno for all his hard work and support\\n\\n// Version 22-Mar-2021\\n\\npragma solidity 0.6.12;\\npragma experimental ABIEncoderV2;\\n\\n// solhint-disable avoid-low-level-calls\\n// solhint-disable not-rely-on-time\\n// solhint-disable no-inline-assembly\\n\\n// File @boringcrypto/boring-solidity/contracts/interfaces/IERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ninterface IERC20 {\\n    function totalSupply() external view returns (uint256);\\n\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /// @notice EIP 2612\\n    function permit(\\n        address owner,\\n        address spender,\\n        uint256 value,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) external;\\n}\\n\\n// File contracts/interfaces/IFlashLoan.sol\\n// License-Identifier: MIT\\n\\ninterface IFlashBorrower {\\n    /// @notice The flashloan callback. `amount` + `fee` needs to repayed to msg.sender before this call returns.\\n    /// @param sender The address of the invoker of this flashloan.\\n    /// @param token The address of the token that is loaned.\\n    /// @param amount of the `token` that is loaned.\\n    /// @param fee The fee that needs to be paid on top for this loan. Needs to be the same as `token`.\\n    /// @param data Additional data that was passed to the flashloan function.\\n    function onFlashLoan(\\n        address sender,\\n        IERC20 token,\\n        uint256 amount,\\n        uint256 fee,\\n        bytes calldata data\\n    ) external;\\n}\\n\\ninterface IBatchFlashBorrower {\\n    /// @notice The callback for batched flashloans. Every amount + fee needs to repayed to msg.sender before this call returns.\\n    /// @param sender The address of the invoker of this flashloan.\\n    /// @param tokens Array of addresses for ERC-20 tokens that is loaned.\\n    /// @param amounts A one-to-one map to `tokens` that is loaned.\\n    /// @param fees A one-to-one map to `tokens` that needs to be paid on top for each loan. Needs to be the same token.\\n    /// @param data Additional data that was passed to the flashloan function.\\n    function onBatchFlashLoan(\\n        address sender,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        uint256[] calldata fees,\\n        bytes calldata data\\n    ) external;\\n}\\n\\n// File contracts/interfaces/IWETH.sol\\n// License-Identifier: MIT\\n\\ninterface IWETH {\\n    function deposit() external payable;\\n\\n    function withdraw(uint256) external;\\n}\\n\\n// File contracts/interfaces/IStrategy.sol\\n// License-Identifier: MIT\\n\\ninterface IStrategy {\\n    /// @notice Send the assets to the Strategy and call skim to invest them.\\n    /// @param amount The amount of tokens to invest.\\n    function skim(uint256 amount) external;\\n\\n    /// @notice Harvest any profits made converted to the asset and pass them to the caller.\\n    /// @param balance The amount of tokens the caller thinks it has invested.\\n    /// @param sender The address of the initiator of this transaction. Can be used for reimbursements, etc.\\n    /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.\\n    function harvest(uint256 balance, address sender) external returns (int256 amountAdded);\\n\\n    /// @notice Withdraw assets. The returned amount can differ from the requested amount due to rounding.\\n    /// @dev The `actualAmount` should be very close to the amount.\\n    /// The difference should NOT be used to report a loss. That's what harvest is for.\\n    /// @param amount The requested amount the caller wants to withdraw.\\n    /// @return actualAmount The real amount that is withdrawn.\\n    function withdraw(uint256 amount) external returns (uint256 actualAmount);\\n\\n    /// @notice Withdraw all assets in the safest way possible. This shouldn't fail.\\n    /// @param balance The amount of tokens the caller thinks it has invested.\\n    /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.\\n    function exit(uint256 balance) external returns (int256 amountAdded);\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\nlibrary BoringERC20 {\\n    bytes4 private constant SIG_SYMBOL = 0x95d89b41; // symbol()\\n    bytes4 private constant SIG_NAME = 0x06fdde03; // name()\\n    bytes4 private constant SIG_DECIMALS = 0x313ce567; // decimals()\\n    bytes4 private constant SIG_TRANSFER = 0xa9059cbb; // transfer(address,uint256)\\n    bytes4 private constant SIG_TRANSFER_FROM = 0x23b872dd; // transferFrom(address,address,uint256)\\n\\n    /// @notice Provides a safe ERC20.transfer version for different ERC-20 implementations.\\n    /// Reverts on a failed transfer.\\n    /// @param token The address of the ERC-20 token.\\n    /// @param to Transfer tokens to.\\n    /// @param amount The token amount.\\n    function safeTransfer(\\n        IERC20 token,\\n        address to,\\n        uint256 amount\\n    ) internal {\\n        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER, to, amount));\\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: Transfer failed\\\");\\n    }\\n\\n    /// @notice Provides a safe ERC20.transferFrom version for different ERC-20 implementations.\\n    /// Reverts on a failed transfer.\\n    /// @param token The address of the ERC-20 token.\\n    /// @param from Transfer tokens from.\\n    /// @param to Transfer tokens to.\\n    /// @param amount The token amount.\\n    function safeTransferFrom(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 amount\\n    ) internal {\\n        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER_FROM, from, to, amount));\\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: TransferFrom failed\\\");\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringMath.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n/// @notice A library for performing overflow-/underflow-safe math,\\n/// updated with awesomeness from of DappHub (https://github.com/dapphub/ds-math).\\nlibrary BoringMath {\\n    function add(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require(b == 0 || (c = a * b) / b == a, \\\"BoringMath: Mul Overflow\\\");\\n    }\\n\\n    function to128(uint256 a) internal pure returns (uint128 c) {\\n        require(a <= uint128(-1), \\\"BoringMath: uint128 Overflow\\\");\\n        c = uint128(a);\\n    }\\n\\n    function to64(uint256 a) internal pure returns (uint64 c) {\\n        require(a <= uint64(-1), \\\"BoringMath: uint64 Overflow\\\");\\n        c = uint64(a);\\n    }\\n\\n    function to32(uint256 a) internal pure returns (uint32 c) {\\n        require(a <= uint32(-1), \\\"BoringMath: uint32 Overflow\\\");\\n        c = uint32(a);\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint128.\\nlibrary BoringMath128 {\\n    function add(uint128 a, uint128 b) internal pure returns (uint128 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint128 a, uint128 b) internal pure returns (uint128 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint64.\\nlibrary BoringMath64 {\\n    function add(uint64 a, uint64 b) internal pure returns (uint64 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint64 a, uint64 b) internal pure returns (uint64 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint32.\\nlibrary BoringMath32 {\\n    function add(uint32 a, uint32 b) internal pure returns (uint32 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint32 a, uint32 b) internal pure returns (uint32 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringRebase.sol@v1.2.0\\n// License-Identifier: MIT\\n\\nstruct Rebase {\\n    uint128 elastic;\\n    uint128 base;\\n}\\n\\n/// @notice A rebasing library using overflow-/underflow-safe math.\\nlibrary RebaseLibrary {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n\\n    /// @notice Calculates the base value in relationship to `elastic` and `total`.\\n    function toBase(\\n        Rebase memory total,\\n        uint256 elastic,\\n        bool roundUp\\n    ) internal pure returns (uint256 base) {\\n        if (total.elastic == 0) {\\n            base = elastic;\\n        } else {\\n            base = elastic.mul(total.base) / total.elastic;\\n            if (roundUp && base.mul(total.elastic) / total.base < elastic) {\\n                base = base.add(1);\\n            }\\n        }\\n    }\\n\\n    /// @notice Calculates the elastic value in relationship to `base` and `total`.\\n    function toElastic(\\n        Rebase memory total,\\n        uint256 base,\\n        bool roundUp\\n    ) internal pure returns (uint256 elastic) {\\n        if (total.base == 0) {\\n            elastic = base;\\n        } else {\\n            elastic = base.mul(total.elastic) / total.base;\\n            if (roundUp && elastic.mul(total.base) / total.elastic < base) {\\n                elastic = elastic.add(1);\\n            }\\n        }\\n    }\\n\\n    /// @notice Add `elastic` to `total` and doubles `total.base`.\\n    /// @return (Rebase) The new total.\\n    /// @return base in relationship to `elastic`.\\n    function add(\\n        Rebase memory total,\\n        uint256 elastic,\\n        bool roundUp\\n    ) internal pure returns (Rebase memory, uint256 base) {\\n        base = toBase(total, elastic, roundUp);\\n        total.elastic = total.elastic.add(elastic.to128());\\n        total.base = total.base.add(base.to128());\\n        return (total, base);\\n    }\\n\\n    /// @notice Sub `base` from `total` and update `total.elastic`.\\n    /// @return (Rebase) The new total.\\n    /// @return elastic in relationship to `base`.\\n    function sub(\\n        Rebase memory total,\\n        uint256 base,\\n        bool roundUp\\n    ) internal pure returns (Rebase memory, uint256 elastic) {\\n        elastic = toElastic(total, base, roundUp);\\n        total.elastic = total.elastic.sub(elastic.to128());\\n        total.base = total.base.sub(base.to128());\\n        return (total, elastic);\\n    }\\n\\n    /// @notice Add `elastic` and `base` to `total`.\\n    function add(\\n        Rebase memory total,\\n        uint256 elastic,\\n        uint256 base\\n    ) internal pure returns (Rebase memory) {\\n        total.elastic = total.elastic.add(elastic.to128());\\n        total.base = total.base.add(base.to128());\\n        return total;\\n    }\\n\\n    /// @notice Subtract `elastic` and `base` to `total`.\\n    function sub(\\n        Rebase memory total,\\n        uint256 elastic,\\n        uint256 base\\n    ) internal pure returns (Rebase memory) {\\n        total.elastic = total.elastic.sub(elastic.to128());\\n        total.base = total.base.sub(base.to128());\\n        return total;\\n    }\\n\\n    /// @notice Add `elastic` to `total` and update storage.\\n    /// @return newElastic Returns updated `elastic`.\\n    function addElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {\\n        newElastic = total.elastic = total.elastic.add(elastic.to128());\\n    }\\n\\n    /// @notice Subtract `elastic` from `total` and update storage.\\n    /// @return newElastic Returns updated `elastic`.\\n    function subElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {\\n        newElastic = total.elastic = total.elastic.sub(elastic.to128());\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringOwnable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n// Source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol + Claimable.sol\\n// Edited by BoringCrypto\\n\\ncontract BoringOwnableData {\\n    address public owner;\\n    address public pendingOwner;\\n}\\n\\ncontract BoringOwnable is BoringOwnableData {\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /// @notice `owner` defaults to msg.sender on construction.\\n    constructor() public {\\n        owner = msg.sender;\\n        emit OwnershipTransferred(address(0), msg.sender);\\n    }\\n\\n    /// @notice Transfers ownership to `newOwner`. Either directly or claimable by the new pending owner.\\n    /// Can only be invoked by the current `owner`.\\n    /// @param newOwner Address of the new owner.\\n    /// @param direct True if `newOwner` should be set immediately. False if `newOwner` needs to use `claimOwnership`.\\n    /// @param renounce Allows the `newOwner` to be `address(0)` if `direct` and `renounce` is True. Has no effect otherwise.\\n    function transferOwnership(\\n        address newOwner,\\n        bool direct,\\n        bool renounce\\n    ) public onlyOwner {\\n        if (direct) {\\n            // Checks\\n            require(newOwner != address(0) || renounce, \\\"Ownable: zero address\\\");\\n\\n            // Effects\\n            emit OwnershipTransferred(owner, newOwner);\\n            owner = newOwner;\\n            pendingOwner = address(0);\\n        } else {\\n            // Effects\\n            pendingOwner = newOwner;\\n        }\\n    }\\n\\n    /// @notice Needs to be called by `pendingOwner` to claim ownership.\\n    function claimOwnership() public {\\n        address _pendingOwner = pendingOwner;\\n\\n        // Checks\\n        require(msg.sender == _pendingOwner, \\\"Ownable: caller != pending owner\\\");\\n\\n        // Effects\\n        emit OwnershipTransferred(owner, _pendingOwner);\\n        owner = _pendingOwner;\\n        pendingOwner = address(0);\\n    }\\n\\n    /// @notice Only allows the `owner` to execute the function.\\n    modifier onlyOwner() {\\n        require(msg.sender == owner, \\\"Ownable: caller is not the owner\\\");\\n        _;\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/interfaces/IMasterContract.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ninterface IMasterContract {\\n    /// @notice Init function that gets called from `BoringFactory.deploy`.\\n    /// Also kown as the constructor for cloned contracts.\\n    /// Any ETH send to `BoringFactory.deploy` ends up here.\\n    /// @param data Can be abi encoded arguments or anything else.\\n    function init(bytes calldata data) external payable;\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringFactory.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ncontract BoringFactory {\\n    event LogDeploy(address indexed masterContract, bytes data, address indexed cloneAddress);\\n\\n    /// @notice Mapping from clone contracts to their masterContract.\\n    mapping(address => address) public masterContractOf;\\n\\n    /// @notice Deploys a given master Contract as a clone.\\n    /// Any ETH transferred with this call is forwarded to the new clone.\\n    /// Emits `LogDeploy`.\\n    /// @param masterContract The address of the contract to clone.\\n    /// @param data Additional abi encoded calldata that is passed to the new clone via `IMasterContract.init`.\\n    /// @param useCreate2 Creates the clone by using the CREATE2 opcode, in this case `data` will be used as salt.\\n    /// @return cloneAddress Address of the created clone contract.\\n    function deploy(\\n        address masterContract,\\n        bytes calldata data,\\n        bool useCreate2\\n    ) public payable returns (address cloneAddress) {\\n        require(masterContract != address(0), \\\"BoringFactory: No masterContract\\\");\\n        bytes20 targetBytes = bytes20(masterContract); // Takes the first 20 bytes of the masterContract's address\\n\\n        if (useCreate2) {\\n            // each masterContract has different code already. So clones are distinguished by their data only.\\n            bytes32 salt = keccak256(data);\\n\\n            // Creates clone, more info here: https://blog.openzeppelin.com/deep-dive-into-the-minimal-proxy-contract/\\n            assembly {\\n                let clone := mload(0x40)\\n                mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n                mstore(add(clone, 0x14), targetBytes)\\n                mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n                cloneAddress := create2(0, clone, 0x37, salt)\\n            }\\n        } else {\\n            assembly {\\n                let clone := mload(0x40)\\n                mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n                mstore(add(clone, 0x14), targetBytes)\\n                mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n                cloneAddress := create(0, clone, 0x37)\\n            }\\n        }\\n        masterContractOf[cloneAddress] = masterContract;\\n\\n        IMasterContract(cloneAddress).init{value: msg.value}(data);\\n\\n        emit LogDeploy(masterContract, data, cloneAddress);\\n    }\\n}\\n\\n// File contracts/MasterContractManager.sol\\n// License-Identifier: UNLICENSED\\n\\ncontract MasterContractManager is BoringOwnable, BoringFactory {\\n    event LogWhiteListMasterContract(address indexed masterContract, bool approved);\\n    event LogSetMasterContractApproval(address indexed masterContract, address indexed user, bool approved);\\n    event LogRegisterProtocol(address indexed protocol);\\n\\n    /// @notice masterContract to user to approval state\\n    mapping(address => mapping(address => bool)) public masterContractApproved;\\n    /// @notice masterContract to whitelisted state for approval without signed message\\n    mapping(address => bool) public whitelistedMasterContracts;\\n    /// @notice user nonces for masterContract approvals\\n    mapping(address => uint256) public nonces;\\n\\n    bytes32 private constant DOMAIN_SEPARATOR_SIGNATURE_HASH = keccak256(\\\"EIP712Domain(string name,uint256 chainId,address verifyingContract)\\\");\\n    // See https://eips.ethereum.org/EIPS/eip-191\\n    string private constant EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA = \\\"\\\\x19\\\\x01\\\";\\n    bytes32 private constant APPROVAL_SIGNATURE_HASH =\\n        keccak256(\\\"SetMasterContractApproval(string warning,address user,address masterContract,bool approved,uint256 nonce)\\\");\\n\\n    // solhint-disable-next-line var-name-mixedcase\\n    bytes32 private immutable _DOMAIN_SEPARATOR;\\n    // solhint-disable-next-line var-name-mixedcase\\n    uint256 private immutable DOMAIN_SEPARATOR_CHAIN_ID;\\n\\n    constructor() public {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        _DOMAIN_SEPARATOR = _calculateDomainSeparator(DOMAIN_SEPARATOR_CHAIN_ID = chainId);\\n    }\\n\\n    function _calculateDomainSeparator(uint256 chainId) private view returns (bytes32) {\\n        return keccak256(abi.encode(DOMAIN_SEPARATOR_SIGNATURE_HASH, keccak256(\\\"BentoBox V1\\\"), chainId, address(this)));\\n    }\\n\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() public view returns (bytes32) {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        return chainId == DOMAIN_SEPARATOR_CHAIN_ID ? _DOMAIN_SEPARATOR : _calculateDomainSeparator(chainId);\\n    }\\n\\n    /// @notice Other contracts need to register with this master contract so that users can approve them for the BentoBox.\\n    function registerProtocol() public {\\n        masterContractOf[msg.sender] = msg.sender;\\n        emit LogRegisterProtocol(msg.sender);\\n    }\\n\\n    /// @notice Enables or disables a contract for approval without signed message.\\n    function whitelistMasterContract(address masterContract, bool approved) public onlyOwner {\\n        // Checks\\n        require(masterContract != address(0), \\\"MasterCMgr: Cannot approve 0\\\");\\n\\n        // Effects\\n        whitelistedMasterContracts[masterContract] = approved;\\n        emit LogWhiteListMasterContract(masterContract, approved);\\n    }\\n\\n    /// @notice Approves or revokes a `masterContract` access to `user` funds.\\n    /// @param user The address of the user that approves or revokes access.\\n    /// @param masterContract The address who gains or loses access.\\n    /// @param approved If True approves access. If False revokes access.\\n    /// @param v Part of the signature. (See EIP-191)\\n    /// @param r Part of the signature. (See EIP-191)\\n    /// @param s Part of the signature. (See EIP-191)\\n    // F4 - Check behaviour for all function arguments when wrong or extreme\\n    // F4: Don't allow masterContract 0 to be approved. Unknown contracts will have a masterContract of 0.\\n    // F4: User can't be 0 for signed approvals because the recoveredAddress will be 0 if ecrecover fails\\n    function setMasterContractApproval(\\n        address user,\\n        address masterContract,\\n        bool approved,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) public {\\n        // Checks\\n        require(masterContract != address(0), \\\"MasterCMgr: masterC not set\\\"); // Important for security\\n\\n        // If no signature is provided, the fallback is executed\\n        if (r == 0 && s == 0 && v == 0) {\\n            require(user == msg.sender, \\\"MasterCMgr: user not sender\\\");\\n            require(masterContractOf[user] == address(0), \\\"MasterCMgr: user is clone\\\");\\n            require(whitelistedMasterContracts[masterContract], \\\"MasterCMgr: not whitelisted\\\");\\n        } else {\\n            // Important for security - any address without masterContract has address(0) as masterContract\\n            // So approving address(0) would approve every address, leading to full loss of funds\\n            // Also, ecrecover returns address(0) on failure. So we check this:\\n            require(user != address(0), \\\"MasterCMgr: User cannot be 0\\\");\\n\\n            // C10 - Protect signatures against replay, use nonce and chainId (SWC-121)\\n            // C10: nonce + chainId are used to prevent replays\\n            // C11 - All signatures strictly EIP-712 (SWC-117 SWC-122)\\n            // C11: signature is EIP-712 compliant\\n            // C12 - abi.encodePacked can't contain variable length user input (SWC-133)\\n            // C12: abi.encodePacked has fixed length parameters\\n            bytes32 digest =\\n                keccak256(\\n                    abi.encodePacked(\\n                        EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA,\\n                        DOMAIN_SEPARATOR(),\\n                        keccak256(\\n                            abi.encode(\\n                                APPROVAL_SIGNATURE_HASH,\\n                                approved\\n                                    ? keccak256(\\\"Give FULL access to funds in (and approved to) BentoBox?\\\")\\n                                    : keccak256(\\\"Revoke access to BentoBox?\\\"),\\n                                user,\\n                                masterContract,\\n                                approved,\\n                                nonces[user]++\\n                            )\\n                        )\\n                    )\\n                );\\n            address recoveredAddress = ecrecover(digest, v, r, s);\\n            require(recoveredAddress == user, \\\"MasterCMgr: Invalid Signature\\\");\\n        }\\n\\n        // Effects\\n        masterContractApproved[masterContract][user] = approved;\\n        emit LogSetMasterContractApproval(masterContract, user, approved);\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringBatchable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ncontract BaseBoringBatchable {\\n    /// @dev Helper function to extract a useful revert message from a failed call.\\n    /// If the returned data is malformed or not correctly abi encoded then this call can fail itself.\\n    function _getRevertMsg(bytes memory _returnData) internal pure returns (string memory) {\\n        // If the _res length is less than 68, then the transaction failed silently (without a revert message)\\n        if (_returnData.length < 68) return \\\"Transaction reverted silently\\\";\\n\\n        assembly {\\n            // Slice the sighash.\\n            _returnData := add(_returnData, 0x04)\\n        }\\n        return abi.decode(_returnData, (string)); // All that remains is the revert string\\n    }\\n\\n    /// @notice Allows batched call to self (this contract).\\n    /// @param calls An array of inputs for each call.\\n    /// @param revertOnFail If True then reverts after a failed call and stops doing further calls.\\n    /// @return successes An array indicating the success of a call, mapped one-to-one to `calls`.\\n    /// @return results An array with the returned data of each function call, mapped one-to-one to `calls`.\\n    // F1: External is ok here because this is the batch function, adding it to a batch makes no sense\\n    // F2: Calls in the batch may be payable, delegatecall operates in the same context, so each call in the batch has access to msg.value\\n    // C3: The length of the loop is fully under user control, so can't be exploited\\n    // C7: Delegatecall is only used on the same contract, so it's safe\\n    function batch(bytes[] calldata calls, bool revertOnFail) external payable returns (bool[] memory successes, bytes[] memory results) {\\n        successes = new bool[](calls.length);\\n        results = new bytes[](calls.length);\\n        for (uint256 i = 0; i < calls.length; i++) {\\n            (bool success, bytes memory result) = address(this).delegatecall(calls[i]);\\n            require(success || !revertOnFail, _getRevertMsg(result));\\n            successes[i] = success;\\n            results[i] = result;\\n        }\\n    }\\n}\\n\\ncontract BoringBatchable is BaseBoringBatchable {\\n    /// @notice Call wrapper that performs `ERC20.permit` on `token`.\\n    /// Lookup `IERC20.permit`.\\n    // F6: Parameters can be used front-run the permit and the user's permit will fail (due to nonce or other revert)\\n    //     if part of a batch this could be used to grief once as the second call would not need the permit\\n    function permitToken(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) public {\\n        token.permit(from, to, amount, deadline, v, r, s);\\n    }\\n}\\n\\n// File contracts/BentoBox.sol\\n// License-Identifier: UNLICENSED\\n\\n/// @title BentoBox\\n/// @author BoringCrypto, Keno\\n/// @notice The BentoBox is a vault for tokens. The stored tokens can be flash loaned and used in strategies.\\n/// Yield from this will go to the token depositors.\\n/// Rebasing tokens ARE NOT supported and WILL cause loss of funds.\\n/// Any funds transfered directly onto the BentoBox will be lost, use the deposit function instead.\\ncontract BentoBoxV1 is MasterContractManager, BoringBatchable {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n    using BoringERC20 for IERC20;\\n    using RebaseLibrary for Rebase;\\n\\n    // ************** //\\n    // *** EVENTS *** //\\n    // ************** //\\n\\n    event LogDeposit(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogWithdraw(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogTransfer(IERC20 indexed token, address indexed from, address indexed to, uint256 share);\\n\\n    event LogFlashLoan(address indexed borrower, IERC20 indexed token, uint256 amount, uint256 feeAmount, address indexed receiver);\\n\\n    event LogStrategyTargetPercentage(IERC20 indexed token, uint256 targetPercentage);\\n    event LogStrategyQueued(IERC20 indexed token, IStrategy indexed strategy);\\n    event LogStrategySet(IERC20 indexed token, IStrategy indexed strategy);\\n    event LogStrategyInvest(IERC20 indexed token, uint256 amount);\\n    event LogStrategyDivest(IERC20 indexed token, uint256 amount);\\n    event LogStrategyProfit(IERC20 indexed token, uint256 amount);\\n    event LogStrategyLoss(IERC20 indexed token, uint256 amount);\\n\\n    // *************** //\\n    // *** STRUCTS *** //\\n    // *************** //\\n\\n    struct StrategyData {\\n        uint64 strategyStartDate;\\n        uint64 targetPercentage;\\n        uint128 balance; // the balance of the strategy that BentoBox thinks is in there\\n    }\\n\\n    // ******************************** //\\n    // *** CONSTANTS AND IMMUTABLES *** //\\n    // ******************************** //\\n\\n    // V2 - Can they be private?\\n    // V2: Private to save gas, to verify it's correct, check the constructor arguments\\n    IERC20 private immutable wethToken;\\n\\n    IERC20 private constant USE_ETHEREUM = IERC20(0);\\n    uint256 private constant FLASH_LOAN_FEE = 50; // 0.05%\\n    uint256 private constant FLASH_LOAN_FEE_PRECISION = 1e5;\\n    uint256 private constant STRATEGY_DELAY = 2 weeks;\\n    uint256 private constant MAX_TARGET_PERCENTAGE = 95; // 95%\\n    uint256 private constant MINIMUM_SHARE_BALANCE = 1000; // To prevent the ratio going off\\n\\n    // ***************** //\\n    // *** VARIABLES *** //\\n    // ***************** //\\n\\n    // Balance per token per address/contract in shares\\n    mapping(IERC20 => mapping(address => uint256)) public balanceOf;\\n\\n    // Rebase from amount to share\\n    mapping(IERC20 => Rebase) public totals;\\n\\n    mapping(IERC20 => IStrategy) public strategy;\\n    mapping(IERC20 => IStrategy) public pendingStrategy;\\n    mapping(IERC20 => StrategyData) public strategyData;\\n\\n    // ******************* //\\n    // *** CONSTRUCTOR *** //\\n    // ******************* //\\n\\n    constructor(IERC20 wethToken_) public {\\n        wethToken = wethToken_;\\n    }\\n\\n    // ***************** //\\n    // *** MODIFIERS *** //\\n    // ***************** //\\n\\n    /// Modifier to check if the msg.sender is allowed to use funds belonging to the 'from' address.\\n    /// If 'from' is msg.sender, it's allowed.\\n    /// If 'from' is the BentoBox itself, it's allowed. Any ETH, token balances (above the known balances) or BentoBox balances\\n    /// can be taken by anyone.\\n    /// This is to enable skimming, not just for deposits, but also for withdrawals or transfers, enabling better composability.\\n    /// If 'from' is a clone of a masterContract AND the 'from' address has approved that masterContract, it's allowed.\\n    modifier allowed(address from) {\\n        if (from != msg.sender && from != address(this)) {\\n            // From is sender or you are skimming\\n            address masterContract = masterContractOf[msg.sender];\\n            require(masterContract != address(0), \\\"BentoBox: no masterContract\\\");\\n            require(masterContractApproved[masterContract][from], \\\"BentoBox: Transfer not approved\\\");\\n        }\\n        _;\\n    }\\n\\n    // ************************** //\\n    // *** INTERNAL FUNCTIONS *** //\\n    // ************************** //\\n\\n    /// @dev Returns the total balance of `token` this contracts holds,\\n    /// plus the total amount this contract thinks the strategy holds.\\n    function _tokenBalanceOf(IERC20 token) internal view returns (uint256 amount) {\\n        amount = token.balanceOf(address(this)).add(strategyData[token].balance);\\n    }\\n\\n    // ************************ //\\n    // *** PUBLIC FUNCTIONS *** //\\n    // ************************ //\\n\\n    /// @dev Helper function to represent an `amount` of `token` in shares.\\n    /// @param token The ERC-20 token.\\n    /// @param amount The `token` amount.\\n    /// @param roundUp If the result `share` should be rounded up.\\n    /// @return share The token amount represented in shares.\\n    function toShare(\\n        IERC20 token,\\n        uint256 amount,\\n        bool roundUp\\n    ) external view returns (uint256 share) {\\n        share = totals[token].toBase(amount, roundUp);\\n    }\\n\\n    /// @dev Helper function represent shares back into the `token` amount.\\n    /// @param token The ERC-20 token.\\n    /// @param share The amount of shares.\\n    /// @param roundUp If the result should be rounded up.\\n    /// @return amount The share amount back into native representation.\\n    function toAmount(\\n        IERC20 token,\\n        uint256 share,\\n        bool roundUp\\n    ) external view returns (uint256 amount) {\\n        amount = totals[token].toElastic(share, roundUp);\\n    }\\n\\n    /// @notice Deposit an amount of `token` represented in either `amount` or `share`.\\n    /// @param token_ The ERC-20 token to deposit.\\n    /// @param from which account to pull the tokens.\\n    /// @param to which account to push the tokens.\\n    /// @param amount Token amount in native representation to deposit.\\n    /// @param share Token amount represented in shares to deposit. Takes precedence over `amount`.\\n    /// @return amountOut The amount deposited.\\n    /// @return shareOut The deposited amount repesented in shares.\\n    function deposit(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) public payable allowed(from) returns (uint256 amountOut, uint256 shareOut) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;\\n        Rebase memory total = totals[token];\\n\\n        // If a new token gets added, the tokenSupply call checks that this is a deployed contract. Needed for security.\\n        require(total.elastic != 0 || token.totalSupply() > 0, \\\"BentoBox: No tokens\\\");\\n        if (share == 0) {\\n            // value of the share may be lower than the amount due to rounding, that's ok\\n            share = total.toBase(amount, false);\\n            // Any deposit should lead to at least the minimum share balance, otherwise it's ignored (no amount taken)\\n            if (total.base.add(share.to128()) < MINIMUM_SHARE_BALANCE) {\\n                return (0, 0);\\n            }\\n        } else {\\n            // amount may be lower than the value of share due to rounding, in that case, add 1 to amount (Always round up)\\n            amount = total.toElastic(share, true);\\n        }\\n\\n        // In case of skimming, check that only the skimmable amount is taken.\\n        // For ETH, the full balance is available, so no need to check.\\n        // During flashloans the _tokenBalanceOf is lower than 'reality', so skimming deposits will mostly fail during a flashloan.\\n        require(\\n            from != address(this) || token_ == USE_ETHEREUM || amount <= _tokenBalanceOf(token).sub(total.elastic),\\n            \\\"BentoBox: Skim too much\\\"\\n        );\\n\\n        balanceOf[token][to] = balanceOf[token][to].add(share);\\n        total.base = total.base.add(share.to128());\\n        total.elastic = total.elastic.add(amount.to128());\\n        totals[token] = total;\\n\\n        // Interactions\\n        // During the first deposit, we check that this token is 'real'\\n        if (token_ == USE_ETHEREUM) {\\n            // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)\\n            // X2: If the WETH implementation is faulty or malicious, it will block adding ETH (but we know the WETH implementation)\\n            IWETH(address(wethToken)).deposit{value: amount}();\\n        } else if (from != address(this)) {\\n            // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)\\n            // X2: If the token implementation is faulty or malicious, it may block adding tokens. Good.\\n            token.safeTransferFrom(from, address(this), amount);\\n        }\\n        emit LogDeposit(token, from, to, amount, share);\\n        amountOut = amount;\\n        shareOut = share;\\n    }\\n\\n    /// @notice Withdraws an amount of `token` from a user account.\\n    /// @param token_ The ERC-20 token to withdraw.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param amount of tokens. Either one of `amount` or `share` needs to be supplied.\\n    /// @param share Like above, but `share` takes precedence over `amount`.\\n    function withdraw(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) public allowed(from) returns (uint256 amountOut, uint256 shareOut) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;\\n        Rebase memory total = totals[token];\\n        if (share == 0) {\\n            // value of the share paid could be lower than the amount paid due to rounding, in that case, add a share (Always round up)\\n            share = total.toBase(amount, true);\\n        } else {\\n            // amount may be lower than the value of share due to rounding, that's ok\\n            amount = total.toElastic(share, false);\\n        }\\n\\n        balanceOf[token][from] = balanceOf[token][from].sub(share);\\n        total.elastic = total.elastic.sub(amount.to128());\\n        total.base = total.base.sub(share.to128());\\n        // There have to be at least 1000 shares left to prevent reseting the share/amount ratio (unless it's fully emptied)\\n        require(total.base >= MINIMUM_SHARE_BALANCE || total.base == 0, \\\"BentoBox: cannot empty\\\");\\n        totals[token] = total;\\n\\n        // Interactions\\n        if (token_ == USE_ETHEREUM) {\\n            // X2, X3: A revert or big gas usage in the WETH contract could block withdrawals, but WETH9 is fine.\\n            IWETH(address(wethToken)).withdraw(amount);\\n            // X2, X3: A revert or big gas usage could block, however, the to address is under control of the caller.\\n            (bool success, ) = to.call{value: amount}(\\\"\\\");\\n            require(success, \\\"BentoBox: ETH transfer failed\\\");\\n        } else {\\n            // X2, X3: A malicious token could block withdrawal of just THAT token.\\n            //         masterContracts may want to take care not to rely on withdraw always succeeding.\\n            token.safeTransfer(to, amount);\\n        }\\n        emit LogWithdraw(token, from, to, amount, share);\\n        amountOut = amount;\\n        shareOut = share;\\n    }\\n\\n    /// @notice Transfer shares from a user account to another one.\\n    /// @param token The ERC-20 token to transfer.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param share The amount of `token` in shares.\\n    // Clones of master contracts can transfer from any account that has approved them\\n    // F3 - Can it be combined with another similar function?\\n    // F3: This isn't combined with transferMultiple for gas optimization\\n    function transfer(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 share\\n    ) public allowed(from) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        balanceOf[token][from] = balanceOf[token][from].sub(share);\\n        balanceOf[token][to] = balanceOf[token][to].add(share);\\n\\n        emit LogTransfer(token, from, to, share);\\n    }\\n\\n    /// @notice Transfer shares from a user account to multiple other ones.\\n    /// @param token The ERC-20 token to transfer.\\n    /// @param from which user to pull the tokens.\\n    /// @param tos The receivers of the tokens.\\n    /// @param shares The amount of `token` in shares for each receiver in `tos`.\\n    // F3 - Can it be combined with another similar function?\\n    // F3: This isn't combined with transfer for gas optimization\\n    function transferMultiple(\\n        IERC20 token,\\n        address from,\\n        address[] calldata tos,\\n        uint256[] calldata shares\\n    ) public allowed(from) {\\n        // Checks\\n        require(tos[0] != address(0), \\\"BentoBox: to[0] not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        uint256 totalAmount;\\n        uint256 len = tos.length;\\n        for (uint256 i = 0; i < len; i++) {\\n            address to = tos[i];\\n            balanceOf[token][to] = balanceOf[token][to].add(shares[i]);\\n            totalAmount = totalAmount.add(shares[i]);\\n            emit LogTransfer(token, from, to, shares[i]);\\n        }\\n        balanceOf[token][from] = balanceOf[token][from].sub(totalAmount);\\n    }\\n\\n    /// @notice Flashloan ability.\\n    /// @param borrower The address of the contract that implements and conforms to `IFlashBorrower` and handles the flashloan.\\n    /// @param receiver Address of the token receiver.\\n    /// @param token The address of the token to receive.\\n    /// @param amount of the tokens to receive.\\n    /// @param data The calldata to pass to the `borrower` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Not possible to follow this here, reentrancy has been reviewed\\n    // F6 - Check for front-running possibilities, such as the approve function (SWC-114)\\n    // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.\\n    function flashLoan(\\n        IFlashBorrower borrower,\\n        address receiver,\\n        IERC20 token,\\n        uint256 amount,\\n        bytes calldata data\\n    ) public {\\n        uint256 fee = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;\\n        token.safeTransfer(receiver, amount);\\n\\n        borrower.onFlashLoan(msg.sender, token, amount, fee, data);\\n\\n        require(_tokenBalanceOf(token) >= totals[token].addElastic(fee.to128()), \\\"BentoBox: Wrong amount\\\");\\n        emit LogFlashLoan(address(borrower), token, amount, fee, receiver);\\n    }\\n\\n    /// @notice Support for batched flashloans. Useful to request multiple different `tokens` in a single transaction.\\n    /// @param borrower The address of the contract that implements and conforms to `IBatchFlashBorrower` and handles the flashloan.\\n    /// @param receivers An array of the token receivers. A one-to-one mapping with `tokens` and `amounts`.\\n    /// @param tokens The addresses of the tokens.\\n    /// @param amounts of the tokens for each receiver.\\n    /// @param data The calldata to pass to the `borrower` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Not possible to follow this here, reentrancy has been reviewed\\n    // F6 - Check for front-running possibilities, such as the approve function (SWC-114)\\n    // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.\\n    function batchFlashLoan(\\n        IBatchFlashBorrower borrower,\\n        address[] calldata receivers,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        bytes calldata data\\n    ) public {\\n        uint256[] memory fees = new uint256[](tokens.length);\\n\\n        uint256 len = tokens.length;\\n        for (uint256 i = 0; i < len; i++) {\\n            uint256 amount = amounts[i];\\n            fees[i] = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;\\n\\n            tokens[i].safeTransfer(receivers[i], amounts[i]);\\n        }\\n\\n        borrower.onBatchFlashLoan(msg.sender, tokens, amounts, fees, data);\\n\\n        for (uint256 i = 0; i < len; i++) {\\n            IERC20 token = tokens[i];\\n            require(_tokenBalanceOf(token) >= totals[token].addElastic(fees[i].to128()), \\\"BentoBox: Wrong amount\\\");\\n            emit LogFlashLoan(address(borrower), token, amounts[i], fees[i], receivers[i]);\\n        }\\n    }\\n\\n    /// @notice Sets the target percentage of the strategy for `token`.\\n    /// @dev Only the owner of this contract is allowed to change this.\\n    /// @param token The address of the token that maps to a strategy to change.\\n    /// @param targetPercentage_ The new target in percent. Must be lesser or equal to `MAX_TARGET_PERCENTAGE`.\\n    function setStrategyTargetPercentage(IERC20 token, uint64 targetPercentage_) public onlyOwner {\\n        // Checks\\n        require(targetPercentage_ <= MAX_TARGET_PERCENTAGE, \\\"StrategyManager: Target too high\\\");\\n\\n        // Effects\\n        strategyData[token].targetPercentage = targetPercentage_;\\n        emit LogStrategyTargetPercentage(token, targetPercentage_);\\n    }\\n\\n    /// @notice Sets the contract address of a new strategy that conforms to `IStrategy` for `token`.\\n    /// Must be called twice with the same arguments.\\n    /// A new strategy becomes pending first and can be activated once `STRATEGY_DELAY` is over.\\n    /// @dev Only the owner of this contract is allowed to change this.\\n    /// @param token The address of the token that maps to a strategy to change.\\n    /// @param newStrategy The address of the contract that conforms to `IStrategy`.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Total amount is updated AFTER interaction. But strategy is under our control.\\n    // C4 - Use block.timestamp only for long intervals (SWC-116)\\n    // C4: block.timestamp is used for a period of 2 weeks, which is long enough\\n    function setStrategy(IERC20 token, IStrategy newStrategy) public onlyOwner {\\n        StrategyData memory data = strategyData[token];\\n        IStrategy pending = pendingStrategy[token];\\n        if (data.strategyStartDate == 0 || pending != newStrategy) {\\n            pendingStrategy[token] = newStrategy;\\n            // C1 - All math done through BoringMath (SWC-101)\\n            // C1: Our sun will swallow the earth well before this overflows\\n            data.strategyStartDate = (block.timestamp + STRATEGY_DELAY).to64();\\n            emit LogStrategyQueued(token, newStrategy);\\n        } else {\\n            require(data.strategyStartDate != 0 && block.timestamp >= data.strategyStartDate, \\\"StrategyManager: Too early\\\");\\n            if (address(strategy[token]) != address(0)) {\\n                int256 balanceChange = strategy[token].exit(data.balance);\\n                // Effects\\n                if (balanceChange > 0) {\\n                    uint256 add = uint256(balanceChange);\\n                    totals[token].addElastic(add);\\n                    emit LogStrategyProfit(token, add);\\n                } else if (balanceChange < 0) {\\n                    uint256 sub = uint256(-balanceChange);\\n                    totals[token].subElastic(sub);\\n                    emit LogStrategyLoss(token, sub);\\n                }\\n\\n                emit LogStrategyDivest(token, data.balance);\\n            }\\n            strategy[token] = pending;\\n            data.strategyStartDate = 0;\\n            data.balance = 0;\\n            pendingStrategy[token] = IStrategy(0);\\n            emit LogStrategySet(token, newStrategy);\\n        }\\n        strategyData[token] = data;\\n    }\\n\\n    /// @notice The actual process of yield farming. Executes the strategy of `token`.\\n    /// Optionally does housekeeping if `balance` is true.\\n    /// `maxChangeAmount` is relevant for skimming or withdrawing if `balance` is true.\\n    /// @param token The address of the token for which a strategy is deployed.\\n    /// @param balance True if housekeeping should be done.\\n    /// @param maxChangeAmount The maximum amount for either pulling or pushing from/to the `IStrategy` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Total amount is updated AFTER interaction. But strategy is under our control.\\n    // F5: Not followed to prevent reentrancy issues with flashloans and BentoBox skims?\\n    function harvest(\\n        IERC20 token,\\n        bool balance,\\n        uint256 maxChangeAmount\\n    ) public {\\n        StrategyData memory data = strategyData[token];\\n        IStrategy _strategy = strategy[token];\\n        int256 balanceChange = _strategy.harvest(data.balance, msg.sender);\\n        if (balanceChange == 0 && !balance) {\\n            return;\\n        }\\n\\n        uint256 totalElastic = totals[token].elastic;\\n\\n        if (balanceChange > 0) {\\n            uint256 add = uint256(balanceChange);\\n            totalElastic = totalElastic.add(add);\\n            totals[token].elastic = totalElastic.to128();\\n            emit LogStrategyProfit(token, add);\\n        } else if (balanceChange < 0) {\\n            // C1 - All math done through BoringMath (SWC-101)\\n            // C1: balanceChange could overflow if it's max negative int128.\\n            // But tokens with balances that large are not supported by the BentoBox.\\n            uint256 sub = uint256(-balanceChange);\\n            totalElastic = totalElastic.sub(sub);\\n            totals[token].elastic = totalElastic.to128();\\n            data.balance = data.balance.sub(sub.to128());\\n            emit LogStrategyLoss(token, sub);\\n        }\\n\\n        if (balance) {\\n            uint256 targetBalance = totalElastic.mul(data.targetPercentage) / 100;\\n            // if data.balance == targetBalance there is nothing to update\\n            if (data.balance < targetBalance) {\\n                uint256 amountOut = targetBalance.sub(data.balance);\\n                if (maxChangeAmount != 0 && amountOut > maxChangeAmount) {\\n                    amountOut = maxChangeAmount;\\n                }\\n                token.safeTransfer(address(_strategy), amountOut);\\n                data.balance = data.balance.add(amountOut.to128());\\n                _strategy.skim(amountOut);\\n                emit LogStrategyInvest(token, amountOut);\\n            } else if (data.balance > targetBalance) {\\n                uint256 amountIn = data.balance.sub(targetBalance.to128());\\n                if (maxChangeAmount != 0 && amountIn > maxChangeAmount) {\\n                    amountIn = maxChangeAmount;\\n                }\\n\\n                uint256 actualAmountIn = _strategy.withdraw(amountIn);\\n\\n                data.balance = data.balance.sub(actualAmountIn.to128());\\n                emit LogStrategyDivest(token, actualAmountIn);\\n            }\\n        }\\n\\n        strategyData[token] = data;\\n    }\\n\\n    // Contract should be able to receive ETH deposits to support deposit & skim\\n    // solhint-disable-next-line no-empty-blocks\\n    receive() external payable {}\\n}\\n\",\"keccak256\":\"0xf5251397b9aaa5c66ddc18b0cb96350ffac09f5776a1255fedc0072641f916fe\",\"license\":\"UNLICENSED\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "notice": "A library for performing overflow-/underflow-safe math, updated with awesomeness from of DappHub (https://github.com/dapphub/ds-math).",
            "version": 1
          }
        },
        "BoringMath128": {
          "abi": [],
          "devdoc": {
            "kind": "dev",
            "methods": {},
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "60566023600b82828239805160001a607314601657fe5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea264697066735822122057ac96890a0ebffa42b438f04b273c22fdb6129d6ef5f6a8daf5b2821599350364736f6c634300060c0033",
              "opcodes": "PUSH1 0x56 PUSH1 0x23 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x16 JUMPI INVALID JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 JUMPI 0xAC SWAP7 DUP10 EXP 0xE 0xBF STATICCALL TIMESTAMP 0xB4 CODESIZE CREATE 0x4B 0x27 EXTCODECOPY 0x22 REVERT 0xB6 SLT SWAP14 PUSH15 0xF5F6A8DAF5B2821599350364736F6C PUSH4 0x4300060C STOP CALLER ",
              "sourceMap": "8234:311:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "73000000000000000000000000000000000000000030146080604052600080fdfea264697066735822122057ac96890a0ebffa42b438f04b273c22fdb6129d6ef5f6a8daf5b2821599350364736f6c634300060c0033",
              "opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 JUMPI 0xAC SWAP7 DUP10 EXP 0xE 0xBF STATICCALL TIMESTAMP 0xB4 CODESIZE CREATE 0x4B 0x27 EXTCODECOPY 0x22 REVERT 0xB6 SLT SWAP14 PUSH15 0xF5F6A8DAF5B2821599350364736F6C PUSH4 0x4300060C STOP CALLER ",
              "sourceMap": "8234:311:0:-:0;;;;;;;;"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "17200",
                "executionCost": "97",
                "totalCost": "17297"
              },
              "internal": {
                "add(uint128,uint128)": "infinite",
                "sub(uint128,uint128)": "infinite"
              }
            },
            "methodIdentifiers": {}
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"A library for performing overflow-/underflow-safe addition and subtraction on uint128.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/bentobox/BentoBoxV1.sol\":\"BoringMath128\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/bentobox/BentoBoxV1.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\n// The BentoBox\\n\\n//  \\u2584\\u2584\\u2584\\u2584\\u00b7 \\u2584\\u2584\\u2584 . \\u2590 \\u2584 \\u2584\\u2584\\u2584\\u2584\\u2584      \\u2584\\u2584\\u2584\\u2584\\u00b7       \\u2590\\u2584\\u2022 \\u2584\\n//  \\u2590\\u2588 \\u2580\\u2588\\u25aa\\u2580\\u2584.\\u2580\\u00b7\\u2588\\u258c\\u2590\\u2588\\u2022\\u2588\\u2588  \\u25aa     \\u2590\\u2588 \\u2580\\u2588\\u25aa\\u25aa      \\u2588\\u258c\\u2588\\u258c\\u25aa\\n//  \\u2590\\u2588\\u2580\\u2580\\u2588\\u2584\\u2590\\u2580\\u2580\\u25aa\\u2584\\u2590\\u2588\\u2590\\u2590\\u258c \\u2590\\u2588.\\u25aa \\u2584\\u2588\\u2580\\u2584 \\u2590\\u2588\\u2580\\u2580\\u2588\\u2584 \\u2584\\u2588\\u2580\\u2584  \\u00b7\\u2588\\u2588\\u00b7\\n//  \\u2588\\u2588\\u2584\\u25aa\\u2590\\u2588\\u2590\\u2588\\u2584\\u2584\\u258c\\u2588\\u2588\\u2590\\u2588\\u258c \\u2590\\u2588\\u258c\\u00b7\\u2590\\u2588\\u258c.\\u2590\\u258c\\u2588\\u2588\\u2584\\u25aa\\u2590\\u2588\\u2590\\u2588\\u258c.\\u2590\\u258c\\u25aa\\u2590\\u2588\\u00b7\\u2588\\u258c\\n//  \\u00b7\\u2580\\u2580\\u2580\\u2580  \\u2580\\u2580\\u2580 \\u2580\\u2580 \\u2588\\u25aa \\u2580\\u2580\\u2580  \\u2580\\u2588\\u2584\\u2580\\u25aa\\u00b7\\u2580\\u2580\\u2580\\u2580  \\u2580\\u2588\\u2584\\u2580\\u25aa\\u2022\\u2580\\u2580 \\u2580\\u2580\\n\\n// This contract stores funds, handles their transfers, supports flash loans and strategies.\\n\\n// Copyright (c) 2021 BoringCrypto - All rights reserved\\n// Twitter: @Boring_Crypto\\n\\n// Special thanks to Keno for all his hard work and support\\n\\n// Version 22-Mar-2021\\n\\npragma solidity 0.6.12;\\npragma experimental ABIEncoderV2;\\n\\n// solhint-disable avoid-low-level-calls\\n// solhint-disable not-rely-on-time\\n// solhint-disable no-inline-assembly\\n\\n// File @boringcrypto/boring-solidity/contracts/interfaces/IERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ninterface IERC20 {\\n    function totalSupply() external view returns (uint256);\\n\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /// @notice EIP 2612\\n    function permit(\\n        address owner,\\n        address spender,\\n        uint256 value,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) external;\\n}\\n\\n// File contracts/interfaces/IFlashLoan.sol\\n// License-Identifier: MIT\\n\\ninterface IFlashBorrower {\\n    /// @notice The flashloan callback. `amount` + `fee` needs to repayed to msg.sender before this call returns.\\n    /// @param sender The address of the invoker of this flashloan.\\n    /// @param token The address of the token that is loaned.\\n    /// @param amount of the `token` that is loaned.\\n    /// @param fee The fee that needs to be paid on top for this loan. Needs to be the same as `token`.\\n    /// @param data Additional data that was passed to the flashloan function.\\n    function onFlashLoan(\\n        address sender,\\n        IERC20 token,\\n        uint256 amount,\\n        uint256 fee,\\n        bytes calldata data\\n    ) external;\\n}\\n\\ninterface IBatchFlashBorrower {\\n    /// @notice The callback for batched flashloans. Every amount + fee needs to repayed to msg.sender before this call returns.\\n    /// @param sender The address of the invoker of this flashloan.\\n    /// @param tokens Array of addresses for ERC-20 tokens that is loaned.\\n    /// @param amounts A one-to-one map to `tokens` that is loaned.\\n    /// @param fees A one-to-one map to `tokens` that needs to be paid on top for each loan. Needs to be the same token.\\n    /// @param data Additional data that was passed to the flashloan function.\\n    function onBatchFlashLoan(\\n        address sender,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        uint256[] calldata fees,\\n        bytes calldata data\\n    ) external;\\n}\\n\\n// File contracts/interfaces/IWETH.sol\\n// License-Identifier: MIT\\n\\ninterface IWETH {\\n    function deposit() external payable;\\n\\n    function withdraw(uint256) external;\\n}\\n\\n// File contracts/interfaces/IStrategy.sol\\n// License-Identifier: MIT\\n\\ninterface IStrategy {\\n    /// @notice Send the assets to the Strategy and call skim to invest them.\\n    /// @param amount The amount of tokens to invest.\\n    function skim(uint256 amount) external;\\n\\n    /// @notice Harvest any profits made converted to the asset and pass them to the caller.\\n    /// @param balance The amount of tokens the caller thinks it has invested.\\n    /// @param sender The address of the initiator of this transaction. Can be used for reimbursements, etc.\\n    /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.\\n    function harvest(uint256 balance, address sender) external returns (int256 amountAdded);\\n\\n    /// @notice Withdraw assets. The returned amount can differ from the requested amount due to rounding.\\n    /// @dev The `actualAmount` should be very close to the amount.\\n    /// The difference should NOT be used to report a loss. That's what harvest is for.\\n    /// @param amount The requested amount the caller wants to withdraw.\\n    /// @return actualAmount The real amount that is withdrawn.\\n    function withdraw(uint256 amount) external returns (uint256 actualAmount);\\n\\n    /// @notice Withdraw all assets in the safest way possible. This shouldn't fail.\\n    /// @param balance The amount of tokens the caller thinks it has invested.\\n    /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.\\n    function exit(uint256 balance) external returns (int256 amountAdded);\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\nlibrary BoringERC20 {\\n    bytes4 private constant SIG_SYMBOL = 0x95d89b41; // symbol()\\n    bytes4 private constant SIG_NAME = 0x06fdde03; // name()\\n    bytes4 private constant SIG_DECIMALS = 0x313ce567; // decimals()\\n    bytes4 private constant SIG_TRANSFER = 0xa9059cbb; // transfer(address,uint256)\\n    bytes4 private constant SIG_TRANSFER_FROM = 0x23b872dd; // transferFrom(address,address,uint256)\\n\\n    /// @notice Provides a safe ERC20.transfer version for different ERC-20 implementations.\\n    /// Reverts on a failed transfer.\\n    /// @param token The address of the ERC-20 token.\\n    /// @param to Transfer tokens to.\\n    /// @param amount The token amount.\\n    function safeTransfer(\\n        IERC20 token,\\n        address to,\\n        uint256 amount\\n    ) internal {\\n        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER, to, amount));\\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: Transfer failed\\\");\\n    }\\n\\n    /// @notice Provides a safe ERC20.transferFrom version for different ERC-20 implementations.\\n    /// Reverts on a failed transfer.\\n    /// @param token The address of the ERC-20 token.\\n    /// @param from Transfer tokens from.\\n    /// @param to Transfer tokens to.\\n    /// @param amount The token amount.\\n    function safeTransferFrom(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 amount\\n    ) internal {\\n        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER_FROM, from, to, amount));\\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: TransferFrom failed\\\");\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringMath.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n/// @notice A library for performing overflow-/underflow-safe math,\\n/// updated with awesomeness from of DappHub (https://github.com/dapphub/ds-math).\\nlibrary BoringMath {\\n    function add(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require(b == 0 || (c = a * b) / b == a, \\\"BoringMath: Mul Overflow\\\");\\n    }\\n\\n    function to128(uint256 a) internal pure returns (uint128 c) {\\n        require(a <= uint128(-1), \\\"BoringMath: uint128 Overflow\\\");\\n        c = uint128(a);\\n    }\\n\\n    function to64(uint256 a) internal pure returns (uint64 c) {\\n        require(a <= uint64(-1), \\\"BoringMath: uint64 Overflow\\\");\\n        c = uint64(a);\\n    }\\n\\n    function to32(uint256 a) internal pure returns (uint32 c) {\\n        require(a <= uint32(-1), \\\"BoringMath: uint32 Overflow\\\");\\n        c = uint32(a);\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint128.\\nlibrary BoringMath128 {\\n    function add(uint128 a, uint128 b) internal pure returns (uint128 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint128 a, uint128 b) internal pure returns (uint128 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint64.\\nlibrary BoringMath64 {\\n    function add(uint64 a, uint64 b) internal pure returns (uint64 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint64 a, uint64 b) internal pure returns (uint64 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint32.\\nlibrary BoringMath32 {\\n    function add(uint32 a, uint32 b) internal pure returns (uint32 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint32 a, uint32 b) internal pure returns (uint32 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringRebase.sol@v1.2.0\\n// License-Identifier: MIT\\n\\nstruct Rebase {\\n    uint128 elastic;\\n    uint128 base;\\n}\\n\\n/// @notice A rebasing library using overflow-/underflow-safe math.\\nlibrary RebaseLibrary {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n\\n    /// @notice Calculates the base value in relationship to `elastic` and `total`.\\n    function toBase(\\n        Rebase memory total,\\n        uint256 elastic,\\n        bool roundUp\\n    ) internal pure returns (uint256 base) {\\n        if (total.elastic == 0) {\\n            base = elastic;\\n        } else {\\n            base = elastic.mul(total.base) / total.elastic;\\n            if (roundUp && base.mul(total.elastic) / total.base < elastic) {\\n                base = base.add(1);\\n            }\\n        }\\n    }\\n\\n    /// @notice Calculates the elastic value in relationship to `base` and `total`.\\n    function toElastic(\\n        Rebase memory total,\\n        uint256 base,\\n        bool roundUp\\n    ) internal pure returns (uint256 elastic) {\\n        if (total.base == 0) {\\n            elastic = base;\\n        } else {\\n            elastic = base.mul(total.elastic) / total.base;\\n            if (roundUp && elastic.mul(total.base) / total.elastic < base) {\\n                elastic = elastic.add(1);\\n            }\\n        }\\n    }\\n\\n    /// @notice Add `elastic` to `total` and doubles `total.base`.\\n    /// @return (Rebase) The new total.\\n    /// @return base in relationship to `elastic`.\\n    function add(\\n        Rebase memory total,\\n        uint256 elastic,\\n        bool roundUp\\n    ) internal pure returns (Rebase memory, uint256 base) {\\n        base = toBase(total, elastic, roundUp);\\n        total.elastic = total.elastic.add(elastic.to128());\\n        total.base = total.base.add(base.to128());\\n        return (total, base);\\n    }\\n\\n    /// @notice Sub `base` from `total` and update `total.elastic`.\\n    /// @return (Rebase) The new total.\\n    /// @return elastic in relationship to `base`.\\n    function sub(\\n        Rebase memory total,\\n        uint256 base,\\n        bool roundUp\\n    ) internal pure returns (Rebase memory, uint256 elastic) {\\n        elastic = toElastic(total, base, roundUp);\\n        total.elastic = total.elastic.sub(elastic.to128());\\n        total.base = total.base.sub(base.to128());\\n        return (total, elastic);\\n    }\\n\\n    /// @notice Add `elastic` and `base` to `total`.\\n    function add(\\n        Rebase memory total,\\n        uint256 elastic,\\n        uint256 base\\n    ) internal pure returns (Rebase memory) {\\n        total.elastic = total.elastic.add(elastic.to128());\\n        total.base = total.base.add(base.to128());\\n        return total;\\n    }\\n\\n    /// @notice Subtract `elastic` and `base` to `total`.\\n    function sub(\\n        Rebase memory total,\\n        uint256 elastic,\\n        uint256 base\\n    ) internal pure returns (Rebase memory) {\\n        total.elastic = total.elastic.sub(elastic.to128());\\n        total.base = total.base.sub(base.to128());\\n        return total;\\n    }\\n\\n    /// @notice Add `elastic` to `total` and update storage.\\n    /// @return newElastic Returns updated `elastic`.\\n    function addElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {\\n        newElastic = total.elastic = total.elastic.add(elastic.to128());\\n    }\\n\\n    /// @notice Subtract `elastic` from `total` and update storage.\\n    /// @return newElastic Returns updated `elastic`.\\n    function subElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {\\n        newElastic = total.elastic = total.elastic.sub(elastic.to128());\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringOwnable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n// Source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol + Claimable.sol\\n// Edited by BoringCrypto\\n\\ncontract BoringOwnableData {\\n    address public owner;\\n    address public pendingOwner;\\n}\\n\\ncontract BoringOwnable is BoringOwnableData {\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /// @notice `owner` defaults to msg.sender on construction.\\n    constructor() public {\\n        owner = msg.sender;\\n        emit OwnershipTransferred(address(0), msg.sender);\\n    }\\n\\n    /// @notice Transfers ownership to `newOwner`. Either directly or claimable by the new pending owner.\\n    /// Can only be invoked by the current `owner`.\\n    /// @param newOwner Address of the new owner.\\n    /// @param direct True if `newOwner` should be set immediately. False if `newOwner` needs to use `claimOwnership`.\\n    /// @param renounce Allows the `newOwner` to be `address(0)` if `direct` and `renounce` is True. Has no effect otherwise.\\n    function transferOwnership(\\n        address newOwner,\\n        bool direct,\\n        bool renounce\\n    ) public onlyOwner {\\n        if (direct) {\\n            // Checks\\n            require(newOwner != address(0) || renounce, \\\"Ownable: zero address\\\");\\n\\n            // Effects\\n            emit OwnershipTransferred(owner, newOwner);\\n            owner = newOwner;\\n            pendingOwner = address(0);\\n        } else {\\n            // Effects\\n            pendingOwner = newOwner;\\n        }\\n    }\\n\\n    /// @notice Needs to be called by `pendingOwner` to claim ownership.\\n    function claimOwnership() public {\\n        address _pendingOwner = pendingOwner;\\n\\n        // Checks\\n        require(msg.sender == _pendingOwner, \\\"Ownable: caller != pending owner\\\");\\n\\n        // Effects\\n        emit OwnershipTransferred(owner, _pendingOwner);\\n        owner = _pendingOwner;\\n        pendingOwner = address(0);\\n    }\\n\\n    /// @notice Only allows the `owner` to execute the function.\\n    modifier onlyOwner() {\\n        require(msg.sender == owner, \\\"Ownable: caller is not the owner\\\");\\n        _;\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/interfaces/IMasterContract.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ninterface IMasterContract {\\n    /// @notice Init function that gets called from `BoringFactory.deploy`.\\n    /// Also kown as the constructor for cloned contracts.\\n    /// Any ETH send to `BoringFactory.deploy` ends up here.\\n    /// @param data Can be abi encoded arguments or anything else.\\n    function init(bytes calldata data) external payable;\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringFactory.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ncontract BoringFactory {\\n    event LogDeploy(address indexed masterContract, bytes data, address indexed cloneAddress);\\n\\n    /// @notice Mapping from clone contracts to their masterContract.\\n    mapping(address => address) public masterContractOf;\\n\\n    /// @notice Deploys a given master Contract as a clone.\\n    /// Any ETH transferred with this call is forwarded to the new clone.\\n    /// Emits `LogDeploy`.\\n    /// @param masterContract The address of the contract to clone.\\n    /// @param data Additional abi encoded calldata that is passed to the new clone via `IMasterContract.init`.\\n    /// @param useCreate2 Creates the clone by using the CREATE2 opcode, in this case `data` will be used as salt.\\n    /// @return cloneAddress Address of the created clone contract.\\n    function deploy(\\n        address masterContract,\\n        bytes calldata data,\\n        bool useCreate2\\n    ) public payable returns (address cloneAddress) {\\n        require(masterContract != address(0), \\\"BoringFactory: No masterContract\\\");\\n        bytes20 targetBytes = bytes20(masterContract); // Takes the first 20 bytes of the masterContract's address\\n\\n        if (useCreate2) {\\n            // each masterContract has different code already. So clones are distinguished by their data only.\\n            bytes32 salt = keccak256(data);\\n\\n            // Creates clone, more info here: https://blog.openzeppelin.com/deep-dive-into-the-minimal-proxy-contract/\\n            assembly {\\n                let clone := mload(0x40)\\n                mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n                mstore(add(clone, 0x14), targetBytes)\\n                mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n                cloneAddress := create2(0, clone, 0x37, salt)\\n            }\\n        } else {\\n            assembly {\\n                let clone := mload(0x40)\\n                mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n                mstore(add(clone, 0x14), targetBytes)\\n                mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n                cloneAddress := create(0, clone, 0x37)\\n            }\\n        }\\n        masterContractOf[cloneAddress] = masterContract;\\n\\n        IMasterContract(cloneAddress).init{value: msg.value}(data);\\n\\n        emit LogDeploy(masterContract, data, cloneAddress);\\n    }\\n}\\n\\n// File contracts/MasterContractManager.sol\\n// License-Identifier: UNLICENSED\\n\\ncontract MasterContractManager is BoringOwnable, BoringFactory {\\n    event LogWhiteListMasterContract(address indexed masterContract, bool approved);\\n    event LogSetMasterContractApproval(address indexed masterContract, address indexed user, bool approved);\\n    event LogRegisterProtocol(address indexed protocol);\\n\\n    /// @notice masterContract to user to approval state\\n    mapping(address => mapping(address => bool)) public masterContractApproved;\\n    /// @notice masterContract to whitelisted state for approval without signed message\\n    mapping(address => bool) public whitelistedMasterContracts;\\n    /// @notice user nonces for masterContract approvals\\n    mapping(address => uint256) public nonces;\\n\\n    bytes32 private constant DOMAIN_SEPARATOR_SIGNATURE_HASH = keccak256(\\\"EIP712Domain(string name,uint256 chainId,address verifyingContract)\\\");\\n    // See https://eips.ethereum.org/EIPS/eip-191\\n    string private constant EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA = \\\"\\\\x19\\\\x01\\\";\\n    bytes32 private constant APPROVAL_SIGNATURE_HASH =\\n        keccak256(\\\"SetMasterContractApproval(string warning,address user,address masterContract,bool approved,uint256 nonce)\\\");\\n\\n    // solhint-disable-next-line var-name-mixedcase\\n    bytes32 private immutable _DOMAIN_SEPARATOR;\\n    // solhint-disable-next-line var-name-mixedcase\\n    uint256 private immutable DOMAIN_SEPARATOR_CHAIN_ID;\\n\\n    constructor() public {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        _DOMAIN_SEPARATOR = _calculateDomainSeparator(DOMAIN_SEPARATOR_CHAIN_ID = chainId);\\n    }\\n\\n    function _calculateDomainSeparator(uint256 chainId) private view returns (bytes32) {\\n        return keccak256(abi.encode(DOMAIN_SEPARATOR_SIGNATURE_HASH, keccak256(\\\"BentoBox V1\\\"), chainId, address(this)));\\n    }\\n\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() public view returns (bytes32) {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        return chainId == DOMAIN_SEPARATOR_CHAIN_ID ? _DOMAIN_SEPARATOR : _calculateDomainSeparator(chainId);\\n    }\\n\\n    /// @notice Other contracts need to register with this master contract so that users can approve them for the BentoBox.\\n    function registerProtocol() public {\\n        masterContractOf[msg.sender] = msg.sender;\\n        emit LogRegisterProtocol(msg.sender);\\n    }\\n\\n    /// @notice Enables or disables a contract for approval without signed message.\\n    function whitelistMasterContract(address masterContract, bool approved) public onlyOwner {\\n        // Checks\\n        require(masterContract != address(0), \\\"MasterCMgr: Cannot approve 0\\\");\\n\\n        // Effects\\n        whitelistedMasterContracts[masterContract] = approved;\\n        emit LogWhiteListMasterContract(masterContract, approved);\\n    }\\n\\n    /// @notice Approves or revokes a `masterContract` access to `user` funds.\\n    /// @param user The address of the user that approves or revokes access.\\n    /// @param masterContract The address who gains or loses access.\\n    /// @param approved If True approves access. If False revokes access.\\n    /// @param v Part of the signature. (See EIP-191)\\n    /// @param r Part of the signature. (See EIP-191)\\n    /// @param s Part of the signature. (See EIP-191)\\n    // F4 - Check behaviour for all function arguments when wrong or extreme\\n    // F4: Don't allow masterContract 0 to be approved. Unknown contracts will have a masterContract of 0.\\n    // F4: User can't be 0 for signed approvals because the recoveredAddress will be 0 if ecrecover fails\\n    function setMasterContractApproval(\\n        address user,\\n        address masterContract,\\n        bool approved,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) public {\\n        // Checks\\n        require(masterContract != address(0), \\\"MasterCMgr: masterC not set\\\"); // Important for security\\n\\n        // If no signature is provided, the fallback is executed\\n        if (r == 0 && s == 0 && v == 0) {\\n            require(user == msg.sender, \\\"MasterCMgr: user not sender\\\");\\n            require(masterContractOf[user] == address(0), \\\"MasterCMgr: user is clone\\\");\\n            require(whitelistedMasterContracts[masterContract], \\\"MasterCMgr: not whitelisted\\\");\\n        } else {\\n            // Important for security - any address without masterContract has address(0) as masterContract\\n            // So approving address(0) would approve every address, leading to full loss of funds\\n            // Also, ecrecover returns address(0) on failure. So we check this:\\n            require(user != address(0), \\\"MasterCMgr: User cannot be 0\\\");\\n\\n            // C10 - Protect signatures against replay, use nonce and chainId (SWC-121)\\n            // C10: nonce + chainId are used to prevent replays\\n            // C11 - All signatures strictly EIP-712 (SWC-117 SWC-122)\\n            // C11: signature is EIP-712 compliant\\n            // C12 - abi.encodePacked can't contain variable length user input (SWC-133)\\n            // C12: abi.encodePacked has fixed length parameters\\n            bytes32 digest =\\n                keccak256(\\n                    abi.encodePacked(\\n                        EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA,\\n                        DOMAIN_SEPARATOR(),\\n                        keccak256(\\n                            abi.encode(\\n                                APPROVAL_SIGNATURE_HASH,\\n                                approved\\n                                    ? keccak256(\\\"Give FULL access to funds in (and approved to) BentoBox?\\\")\\n                                    : keccak256(\\\"Revoke access to BentoBox?\\\"),\\n                                user,\\n                                masterContract,\\n                                approved,\\n                                nonces[user]++\\n                            )\\n                        )\\n                    )\\n                );\\n            address recoveredAddress = ecrecover(digest, v, r, s);\\n            require(recoveredAddress == user, \\\"MasterCMgr: Invalid Signature\\\");\\n        }\\n\\n        // Effects\\n        masterContractApproved[masterContract][user] = approved;\\n        emit LogSetMasterContractApproval(masterContract, user, approved);\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringBatchable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ncontract BaseBoringBatchable {\\n    /// @dev Helper function to extract a useful revert message from a failed call.\\n    /// If the returned data is malformed or not correctly abi encoded then this call can fail itself.\\n    function _getRevertMsg(bytes memory _returnData) internal pure returns (string memory) {\\n        // If the _res length is less than 68, then the transaction failed silently (without a revert message)\\n        if (_returnData.length < 68) return \\\"Transaction reverted silently\\\";\\n\\n        assembly {\\n            // Slice the sighash.\\n            _returnData := add(_returnData, 0x04)\\n        }\\n        return abi.decode(_returnData, (string)); // All that remains is the revert string\\n    }\\n\\n    /// @notice Allows batched call to self (this contract).\\n    /// @param calls An array of inputs for each call.\\n    /// @param revertOnFail If True then reverts after a failed call and stops doing further calls.\\n    /// @return successes An array indicating the success of a call, mapped one-to-one to `calls`.\\n    /// @return results An array with the returned data of each function call, mapped one-to-one to `calls`.\\n    // F1: External is ok here because this is the batch function, adding it to a batch makes no sense\\n    // F2: Calls in the batch may be payable, delegatecall operates in the same context, so each call in the batch has access to msg.value\\n    // C3: The length of the loop is fully under user control, so can't be exploited\\n    // C7: Delegatecall is only used on the same contract, so it's safe\\n    function batch(bytes[] calldata calls, bool revertOnFail) external payable returns (bool[] memory successes, bytes[] memory results) {\\n        successes = new bool[](calls.length);\\n        results = new bytes[](calls.length);\\n        for (uint256 i = 0; i < calls.length; i++) {\\n            (bool success, bytes memory result) = address(this).delegatecall(calls[i]);\\n            require(success || !revertOnFail, _getRevertMsg(result));\\n            successes[i] = success;\\n            results[i] = result;\\n        }\\n    }\\n}\\n\\ncontract BoringBatchable is BaseBoringBatchable {\\n    /// @notice Call wrapper that performs `ERC20.permit` on `token`.\\n    /// Lookup `IERC20.permit`.\\n    // F6: Parameters can be used front-run the permit and the user's permit will fail (due to nonce or other revert)\\n    //     if part of a batch this could be used to grief once as the second call would not need the permit\\n    function permitToken(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) public {\\n        token.permit(from, to, amount, deadline, v, r, s);\\n    }\\n}\\n\\n// File contracts/BentoBox.sol\\n// License-Identifier: UNLICENSED\\n\\n/// @title BentoBox\\n/// @author BoringCrypto, Keno\\n/// @notice The BentoBox is a vault for tokens. The stored tokens can be flash loaned and used in strategies.\\n/// Yield from this will go to the token depositors.\\n/// Rebasing tokens ARE NOT supported and WILL cause loss of funds.\\n/// Any funds transfered directly onto the BentoBox will be lost, use the deposit function instead.\\ncontract BentoBoxV1 is MasterContractManager, BoringBatchable {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n    using BoringERC20 for IERC20;\\n    using RebaseLibrary for Rebase;\\n\\n    // ************** //\\n    // *** EVENTS *** //\\n    // ************** //\\n\\n    event LogDeposit(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogWithdraw(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogTransfer(IERC20 indexed token, address indexed from, address indexed to, uint256 share);\\n\\n    event LogFlashLoan(address indexed borrower, IERC20 indexed token, uint256 amount, uint256 feeAmount, address indexed receiver);\\n\\n    event LogStrategyTargetPercentage(IERC20 indexed token, uint256 targetPercentage);\\n    event LogStrategyQueued(IERC20 indexed token, IStrategy indexed strategy);\\n    event LogStrategySet(IERC20 indexed token, IStrategy indexed strategy);\\n    event LogStrategyInvest(IERC20 indexed token, uint256 amount);\\n    event LogStrategyDivest(IERC20 indexed token, uint256 amount);\\n    event LogStrategyProfit(IERC20 indexed token, uint256 amount);\\n    event LogStrategyLoss(IERC20 indexed token, uint256 amount);\\n\\n    // *************** //\\n    // *** STRUCTS *** //\\n    // *************** //\\n\\n    struct StrategyData {\\n        uint64 strategyStartDate;\\n        uint64 targetPercentage;\\n        uint128 balance; // the balance of the strategy that BentoBox thinks is in there\\n    }\\n\\n    // ******************************** //\\n    // *** CONSTANTS AND IMMUTABLES *** //\\n    // ******************************** //\\n\\n    // V2 - Can they be private?\\n    // V2: Private to save gas, to verify it's correct, check the constructor arguments\\n    IERC20 private immutable wethToken;\\n\\n    IERC20 private constant USE_ETHEREUM = IERC20(0);\\n    uint256 private constant FLASH_LOAN_FEE = 50; // 0.05%\\n    uint256 private constant FLASH_LOAN_FEE_PRECISION = 1e5;\\n    uint256 private constant STRATEGY_DELAY = 2 weeks;\\n    uint256 private constant MAX_TARGET_PERCENTAGE = 95; // 95%\\n    uint256 private constant MINIMUM_SHARE_BALANCE = 1000; // To prevent the ratio going off\\n\\n    // ***************** //\\n    // *** VARIABLES *** //\\n    // ***************** //\\n\\n    // Balance per token per address/contract in shares\\n    mapping(IERC20 => mapping(address => uint256)) public balanceOf;\\n\\n    // Rebase from amount to share\\n    mapping(IERC20 => Rebase) public totals;\\n\\n    mapping(IERC20 => IStrategy) public strategy;\\n    mapping(IERC20 => IStrategy) public pendingStrategy;\\n    mapping(IERC20 => StrategyData) public strategyData;\\n\\n    // ******************* //\\n    // *** CONSTRUCTOR *** //\\n    // ******************* //\\n\\n    constructor(IERC20 wethToken_) public {\\n        wethToken = wethToken_;\\n    }\\n\\n    // ***************** //\\n    // *** MODIFIERS *** //\\n    // ***************** //\\n\\n    /// Modifier to check if the msg.sender is allowed to use funds belonging to the 'from' address.\\n    /// If 'from' is msg.sender, it's allowed.\\n    /// If 'from' is the BentoBox itself, it's allowed. Any ETH, token balances (above the known balances) or BentoBox balances\\n    /// can be taken by anyone.\\n    /// This is to enable skimming, not just for deposits, but also for withdrawals or transfers, enabling better composability.\\n    /// If 'from' is a clone of a masterContract AND the 'from' address has approved that masterContract, it's allowed.\\n    modifier allowed(address from) {\\n        if (from != msg.sender && from != address(this)) {\\n            // From is sender or you are skimming\\n            address masterContract = masterContractOf[msg.sender];\\n            require(masterContract != address(0), \\\"BentoBox: no masterContract\\\");\\n            require(masterContractApproved[masterContract][from], \\\"BentoBox: Transfer not approved\\\");\\n        }\\n        _;\\n    }\\n\\n    // ************************** //\\n    // *** INTERNAL FUNCTIONS *** //\\n    // ************************** //\\n\\n    /// @dev Returns the total balance of `token` this contracts holds,\\n    /// plus the total amount this contract thinks the strategy holds.\\n    function _tokenBalanceOf(IERC20 token) internal view returns (uint256 amount) {\\n        amount = token.balanceOf(address(this)).add(strategyData[token].balance);\\n    }\\n\\n    // ************************ //\\n    // *** PUBLIC FUNCTIONS *** //\\n    // ************************ //\\n\\n    /// @dev Helper function to represent an `amount` of `token` in shares.\\n    /// @param token The ERC-20 token.\\n    /// @param amount The `token` amount.\\n    /// @param roundUp If the result `share` should be rounded up.\\n    /// @return share The token amount represented in shares.\\n    function toShare(\\n        IERC20 token,\\n        uint256 amount,\\n        bool roundUp\\n    ) external view returns (uint256 share) {\\n        share = totals[token].toBase(amount, roundUp);\\n    }\\n\\n    /// @dev Helper function represent shares back into the `token` amount.\\n    /// @param token The ERC-20 token.\\n    /// @param share The amount of shares.\\n    /// @param roundUp If the result should be rounded up.\\n    /// @return amount The share amount back into native representation.\\n    function toAmount(\\n        IERC20 token,\\n        uint256 share,\\n        bool roundUp\\n    ) external view returns (uint256 amount) {\\n        amount = totals[token].toElastic(share, roundUp);\\n    }\\n\\n    /// @notice Deposit an amount of `token` represented in either `amount` or `share`.\\n    /// @param token_ The ERC-20 token to deposit.\\n    /// @param from which account to pull the tokens.\\n    /// @param to which account to push the tokens.\\n    /// @param amount Token amount in native representation to deposit.\\n    /// @param share Token amount represented in shares to deposit. Takes precedence over `amount`.\\n    /// @return amountOut The amount deposited.\\n    /// @return shareOut The deposited amount repesented in shares.\\n    function deposit(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) public payable allowed(from) returns (uint256 amountOut, uint256 shareOut) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;\\n        Rebase memory total = totals[token];\\n\\n        // If a new token gets added, the tokenSupply call checks that this is a deployed contract. Needed for security.\\n        require(total.elastic != 0 || token.totalSupply() > 0, \\\"BentoBox: No tokens\\\");\\n        if (share == 0) {\\n            // value of the share may be lower than the amount due to rounding, that's ok\\n            share = total.toBase(amount, false);\\n            // Any deposit should lead to at least the minimum share balance, otherwise it's ignored (no amount taken)\\n            if (total.base.add(share.to128()) < MINIMUM_SHARE_BALANCE) {\\n                return (0, 0);\\n            }\\n        } else {\\n            // amount may be lower than the value of share due to rounding, in that case, add 1 to amount (Always round up)\\n            amount = total.toElastic(share, true);\\n        }\\n\\n        // In case of skimming, check that only the skimmable amount is taken.\\n        // For ETH, the full balance is available, so no need to check.\\n        // During flashloans the _tokenBalanceOf is lower than 'reality', so skimming deposits will mostly fail during a flashloan.\\n        require(\\n            from != address(this) || token_ == USE_ETHEREUM || amount <= _tokenBalanceOf(token).sub(total.elastic),\\n            \\\"BentoBox: Skim too much\\\"\\n        );\\n\\n        balanceOf[token][to] = balanceOf[token][to].add(share);\\n        total.base = total.base.add(share.to128());\\n        total.elastic = total.elastic.add(amount.to128());\\n        totals[token] = total;\\n\\n        // Interactions\\n        // During the first deposit, we check that this token is 'real'\\n        if (token_ == USE_ETHEREUM) {\\n            // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)\\n            // X2: If the WETH implementation is faulty or malicious, it will block adding ETH (but we know the WETH implementation)\\n            IWETH(address(wethToken)).deposit{value: amount}();\\n        } else if (from != address(this)) {\\n            // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)\\n            // X2: If the token implementation is faulty or malicious, it may block adding tokens. Good.\\n            token.safeTransferFrom(from, address(this), amount);\\n        }\\n        emit LogDeposit(token, from, to, amount, share);\\n        amountOut = amount;\\n        shareOut = share;\\n    }\\n\\n    /// @notice Withdraws an amount of `token` from a user account.\\n    /// @param token_ The ERC-20 token to withdraw.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param amount of tokens. Either one of `amount` or `share` needs to be supplied.\\n    /// @param share Like above, but `share` takes precedence over `amount`.\\n    function withdraw(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) public allowed(from) returns (uint256 amountOut, uint256 shareOut) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;\\n        Rebase memory total = totals[token];\\n        if (share == 0) {\\n            // value of the share paid could be lower than the amount paid due to rounding, in that case, add a share (Always round up)\\n            share = total.toBase(amount, true);\\n        } else {\\n            // amount may be lower than the value of share due to rounding, that's ok\\n            amount = total.toElastic(share, false);\\n        }\\n\\n        balanceOf[token][from] = balanceOf[token][from].sub(share);\\n        total.elastic = total.elastic.sub(amount.to128());\\n        total.base = total.base.sub(share.to128());\\n        // There have to be at least 1000 shares left to prevent reseting the share/amount ratio (unless it's fully emptied)\\n        require(total.base >= MINIMUM_SHARE_BALANCE || total.base == 0, \\\"BentoBox: cannot empty\\\");\\n        totals[token] = total;\\n\\n        // Interactions\\n        if (token_ == USE_ETHEREUM) {\\n            // X2, X3: A revert or big gas usage in the WETH contract could block withdrawals, but WETH9 is fine.\\n            IWETH(address(wethToken)).withdraw(amount);\\n            // X2, X3: A revert or big gas usage could block, however, the to address is under control of the caller.\\n            (bool success, ) = to.call{value: amount}(\\\"\\\");\\n            require(success, \\\"BentoBox: ETH transfer failed\\\");\\n        } else {\\n            // X2, X3: A malicious token could block withdrawal of just THAT token.\\n            //         masterContracts may want to take care not to rely on withdraw always succeeding.\\n            token.safeTransfer(to, amount);\\n        }\\n        emit LogWithdraw(token, from, to, amount, share);\\n        amountOut = amount;\\n        shareOut = share;\\n    }\\n\\n    /// @notice Transfer shares from a user account to another one.\\n    /// @param token The ERC-20 token to transfer.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param share The amount of `token` in shares.\\n    // Clones of master contracts can transfer from any account that has approved them\\n    // F3 - Can it be combined with another similar function?\\n    // F3: This isn't combined with transferMultiple for gas optimization\\n    function transfer(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 share\\n    ) public allowed(from) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        balanceOf[token][from] = balanceOf[token][from].sub(share);\\n        balanceOf[token][to] = balanceOf[token][to].add(share);\\n\\n        emit LogTransfer(token, from, to, share);\\n    }\\n\\n    /// @notice Transfer shares from a user account to multiple other ones.\\n    /// @param token The ERC-20 token to transfer.\\n    /// @param from which user to pull the tokens.\\n    /// @param tos The receivers of the tokens.\\n    /// @param shares The amount of `token` in shares for each receiver in `tos`.\\n    // F3 - Can it be combined with another similar function?\\n    // F3: This isn't combined with transfer for gas optimization\\n    function transferMultiple(\\n        IERC20 token,\\n        address from,\\n        address[] calldata tos,\\n        uint256[] calldata shares\\n    ) public allowed(from) {\\n        // Checks\\n        require(tos[0] != address(0), \\\"BentoBox: to[0] not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        uint256 totalAmount;\\n        uint256 len = tos.length;\\n        for (uint256 i = 0; i < len; i++) {\\n            address to = tos[i];\\n            balanceOf[token][to] = balanceOf[token][to].add(shares[i]);\\n            totalAmount = totalAmount.add(shares[i]);\\n            emit LogTransfer(token, from, to, shares[i]);\\n        }\\n        balanceOf[token][from] = balanceOf[token][from].sub(totalAmount);\\n    }\\n\\n    /// @notice Flashloan ability.\\n    /// @param borrower The address of the contract that implements and conforms to `IFlashBorrower` and handles the flashloan.\\n    /// @param receiver Address of the token receiver.\\n    /// @param token The address of the token to receive.\\n    /// @param amount of the tokens to receive.\\n    /// @param data The calldata to pass to the `borrower` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Not possible to follow this here, reentrancy has been reviewed\\n    // F6 - Check for front-running possibilities, such as the approve function (SWC-114)\\n    // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.\\n    function flashLoan(\\n        IFlashBorrower borrower,\\n        address receiver,\\n        IERC20 token,\\n        uint256 amount,\\n        bytes calldata data\\n    ) public {\\n        uint256 fee = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;\\n        token.safeTransfer(receiver, amount);\\n\\n        borrower.onFlashLoan(msg.sender, token, amount, fee, data);\\n\\n        require(_tokenBalanceOf(token) >= totals[token].addElastic(fee.to128()), \\\"BentoBox: Wrong amount\\\");\\n        emit LogFlashLoan(address(borrower), token, amount, fee, receiver);\\n    }\\n\\n    /// @notice Support for batched flashloans. Useful to request multiple different `tokens` in a single transaction.\\n    /// @param borrower The address of the contract that implements and conforms to `IBatchFlashBorrower` and handles the flashloan.\\n    /// @param receivers An array of the token receivers. A one-to-one mapping with `tokens` and `amounts`.\\n    /// @param tokens The addresses of the tokens.\\n    /// @param amounts of the tokens for each receiver.\\n    /// @param data The calldata to pass to the `borrower` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Not possible to follow this here, reentrancy has been reviewed\\n    // F6 - Check for front-running possibilities, such as the approve function (SWC-114)\\n    // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.\\n    function batchFlashLoan(\\n        IBatchFlashBorrower borrower,\\n        address[] calldata receivers,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        bytes calldata data\\n    ) public {\\n        uint256[] memory fees = new uint256[](tokens.length);\\n\\n        uint256 len = tokens.length;\\n        for (uint256 i = 0; i < len; i++) {\\n            uint256 amount = amounts[i];\\n            fees[i] = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;\\n\\n            tokens[i].safeTransfer(receivers[i], amounts[i]);\\n        }\\n\\n        borrower.onBatchFlashLoan(msg.sender, tokens, amounts, fees, data);\\n\\n        for (uint256 i = 0; i < len; i++) {\\n            IERC20 token = tokens[i];\\n            require(_tokenBalanceOf(token) >= totals[token].addElastic(fees[i].to128()), \\\"BentoBox: Wrong amount\\\");\\n            emit LogFlashLoan(address(borrower), token, amounts[i], fees[i], receivers[i]);\\n        }\\n    }\\n\\n    /// @notice Sets the target percentage of the strategy for `token`.\\n    /// @dev Only the owner of this contract is allowed to change this.\\n    /// @param token The address of the token that maps to a strategy to change.\\n    /// @param targetPercentage_ The new target in percent. Must be lesser or equal to `MAX_TARGET_PERCENTAGE`.\\n    function setStrategyTargetPercentage(IERC20 token, uint64 targetPercentage_) public onlyOwner {\\n        // Checks\\n        require(targetPercentage_ <= MAX_TARGET_PERCENTAGE, \\\"StrategyManager: Target too high\\\");\\n\\n        // Effects\\n        strategyData[token].targetPercentage = targetPercentage_;\\n        emit LogStrategyTargetPercentage(token, targetPercentage_);\\n    }\\n\\n    /// @notice Sets the contract address of a new strategy that conforms to `IStrategy` for `token`.\\n    /// Must be called twice with the same arguments.\\n    /// A new strategy becomes pending first and can be activated once `STRATEGY_DELAY` is over.\\n    /// @dev Only the owner of this contract is allowed to change this.\\n    /// @param token The address of the token that maps to a strategy to change.\\n    /// @param newStrategy The address of the contract that conforms to `IStrategy`.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Total amount is updated AFTER interaction. But strategy is under our control.\\n    // C4 - Use block.timestamp only for long intervals (SWC-116)\\n    // C4: block.timestamp is used for a period of 2 weeks, which is long enough\\n    function setStrategy(IERC20 token, IStrategy newStrategy) public onlyOwner {\\n        StrategyData memory data = strategyData[token];\\n        IStrategy pending = pendingStrategy[token];\\n        if (data.strategyStartDate == 0 || pending != newStrategy) {\\n            pendingStrategy[token] = newStrategy;\\n            // C1 - All math done through BoringMath (SWC-101)\\n            // C1: Our sun will swallow the earth well before this overflows\\n            data.strategyStartDate = (block.timestamp + STRATEGY_DELAY).to64();\\n            emit LogStrategyQueued(token, newStrategy);\\n        } else {\\n            require(data.strategyStartDate != 0 && block.timestamp >= data.strategyStartDate, \\\"StrategyManager: Too early\\\");\\n            if (address(strategy[token]) != address(0)) {\\n                int256 balanceChange = strategy[token].exit(data.balance);\\n                // Effects\\n                if (balanceChange > 0) {\\n                    uint256 add = uint256(balanceChange);\\n                    totals[token].addElastic(add);\\n                    emit LogStrategyProfit(token, add);\\n                } else if (balanceChange < 0) {\\n                    uint256 sub = uint256(-balanceChange);\\n                    totals[token].subElastic(sub);\\n                    emit LogStrategyLoss(token, sub);\\n                }\\n\\n                emit LogStrategyDivest(token, data.balance);\\n            }\\n            strategy[token] = pending;\\n            data.strategyStartDate = 0;\\n            data.balance = 0;\\n            pendingStrategy[token] = IStrategy(0);\\n            emit LogStrategySet(token, newStrategy);\\n        }\\n        strategyData[token] = data;\\n    }\\n\\n    /// @notice The actual process of yield farming. Executes the strategy of `token`.\\n    /// Optionally does housekeeping if `balance` is true.\\n    /// `maxChangeAmount` is relevant for skimming or withdrawing if `balance` is true.\\n    /// @param token The address of the token for which a strategy is deployed.\\n    /// @param balance True if housekeeping should be done.\\n    /// @param maxChangeAmount The maximum amount for either pulling or pushing from/to the `IStrategy` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Total amount is updated AFTER interaction. But strategy is under our control.\\n    // F5: Not followed to prevent reentrancy issues with flashloans and BentoBox skims?\\n    function harvest(\\n        IERC20 token,\\n        bool balance,\\n        uint256 maxChangeAmount\\n    ) public {\\n        StrategyData memory data = strategyData[token];\\n        IStrategy _strategy = strategy[token];\\n        int256 balanceChange = _strategy.harvest(data.balance, msg.sender);\\n        if (balanceChange == 0 && !balance) {\\n            return;\\n        }\\n\\n        uint256 totalElastic = totals[token].elastic;\\n\\n        if (balanceChange > 0) {\\n            uint256 add = uint256(balanceChange);\\n            totalElastic = totalElastic.add(add);\\n            totals[token].elastic = totalElastic.to128();\\n            emit LogStrategyProfit(token, add);\\n        } else if (balanceChange < 0) {\\n            // C1 - All math done through BoringMath (SWC-101)\\n            // C1: balanceChange could overflow if it's max negative int128.\\n            // But tokens with balances that large are not supported by the BentoBox.\\n            uint256 sub = uint256(-balanceChange);\\n            totalElastic = totalElastic.sub(sub);\\n            totals[token].elastic = totalElastic.to128();\\n            data.balance = data.balance.sub(sub.to128());\\n            emit LogStrategyLoss(token, sub);\\n        }\\n\\n        if (balance) {\\n            uint256 targetBalance = totalElastic.mul(data.targetPercentage) / 100;\\n            // if data.balance == targetBalance there is nothing to update\\n            if (data.balance < targetBalance) {\\n                uint256 amountOut = targetBalance.sub(data.balance);\\n                if (maxChangeAmount != 0 && amountOut > maxChangeAmount) {\\n                    amountOut = maxChangeAmount;\\n                }\\n                token.safeTransfer(address(_strategy), amountOut);\\n                data.balance = data.balance.add(amountOut.to128());\\n                _strategy.skim(amountOut);\\n                emit LogStrategyInvest(token, amountOut);\\n            } else if (data.balance > targetBalance) {\\n                uint256 amountIn = data.balance.sub(targetBalance.to128());\\n                if (maxChangeAmount != 0 && amountIn > maxChangeAmount) {\\n                    amountIn = maxChangeAmount;\\n                }\\n\\n                uint256 actualAmountIn = _strategy.withdraw(amountIn);\\n\\n                data.balance = data.balance.sub(actualAmountIn.to128());\\n                emit LogStrategyDivest(token, actualAmountIn);\\n            }\\n        }\\n\\n        strategyData[token] = data;\\n    }\\n\\n    // Contract should be able to receive ETH deposits to support deposit & skim\\n    // solhint-disable-next-line no-empty-blocks\\n    receive() external payable {}\\n}\\n\",\"keccak256\":\"0xf5251397b9aaa5c66ddc18b0cb96350ffac09f5776a1255fedc0072641f916fe\",\"license\":\"UNLICENSED\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "notice": "A library for performing overflow-/underflow-safe addition and subtraction on uint128.",
            "version": 1
          }
        },
        "BoringMath32": {
          "abi": [],
          "devdoc": {
            "kind": "dev",
            "methods": {},
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "60566023600b82828239805160001a607314601657fe5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220167b2e21a0b3438c7d327f99650900e19f0b38146d8a5cb797f5f3a593a9b78164736f6c634300060c0033",
              "opcodes": "PUSH1 0x56 PUSH1 0x23 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x16 JUMPI INVALID JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 AND PUSH28 0x2E21A0B3438C7D327F99650900E19F0B38146D8A5CB797F5F3A593A9 0xB7 DUP2 PUSH5 0x736F6C6343 STOP MOD 0xC STOP CALLER ",
              "sourceMap": "9049:304:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220167b2e21a0b3438c7d327f99650900e19f0b38146d8a5cb797f5f3a593a9b78164736f6c634300060c0033",
              "opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 AND PUSH28 0x2E21A0B3438C7D327F99650900E19F0B38146D8A5CB797F5F3A593A9 0xB7 DUP2 PUSH5 0x736F6C6343 STOP MOD 0xC STOP CALLER ",
              "sourceMap": "9049:304:0:-:0;;;;;;;;"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "17200",
                "executionCost": "97",
                "totalCost": "17297"
              },
              "internal": {
                "add(uint32,uint32)": "infinite",
                "sub(uint32,uint32)": "infinite"
              }
            },
            "methodIdentifiers": {}
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"A library for performing overflow-/underflow-safe addition and subtraction on uint32.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/bentobox/BentoBoxV1.sol\":\"BoringMath32\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/bentobox/BentoBoxV1.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\n// The BentoBox\\n\\n//  \\u2584\\u2584\\u2584\\u2584\\u00b7 \\u2584\\u2584\\u2584 . \\u2590 \\u2584 \\u2584\\u2584\\u2584\\u2584\\u2584      \\u2584\\u2584\\u2584\\u2584\\u00b7       \\u2590\\u2584\\u2022 \\u2584\\n//  \\u2590\\u2588 \\u2580\\u2588\\u25aa\\u2580\\u2584.\\u2580\\u00b7\\u2588\\u258c\\u2590\\u2588\\u2022\\u2588\\u2588  \\u25aa     \\u2590\\u2588 \\u2580\\u2588\\u25aa\\u25aa      \\u2588\\u258c\\u2588\\u258c\\u25aa\\n//  \\u2590\\u2588\\u2580\\u2580\\u2588\\u2584\\u2590\\u2580\\u2580\\u25aa\\u2584\\u2590\\u2588\\u2590\\u2590\\u258c \\u2590\\u2588.\\u25aa \\u2584\\u2588\\u2580\\u2584 \\u2590\\u2588\\u2580\\u2580\\u2588\\u2584 \\u2584\\u2588\\u2580\\u2584  \\u00b7\\u2588\\u2588\\u00b7\\n//  \\u2588\\u2588\\u2584\\u25aa\\u2590\\u2588\\u2590\\u2588\\u2584\\u2584\\u258c\\u2588\\u2588\\u2590\\u2588\\u258c \\u2590\\u2588\\u258c\\u00b7\\u2590\\u2588\\u258c.\\u2590\\u258c\\u2588\\u2588\\u2584\\u25aa\\u2590\\u2588\\u2590\\u2588\\u258c.\\u2590\\u258c\\u25aa\\u2590\\u2588\\u00b7\\u2588\\u258c\\n//  \\u00b7\\u2580\\u2580\\u2580\\u2580  \\u2580\\u2580\\u2580 \\u2580\\u2580 \\u2588\\u25aa \\u2580\\u2580\\u2580  \\u2580\\u2588\\u2584\\u2580\\u25aa\\u00b7\\u2580\\u2580\\u2580\\u2580  \\u2580\\u2588\\u2584\\u2580\\u25aa\\u2022\\u2580\\u2580 \\u2580\\u2580\\n\\n// This contract stores funds, handles their transfers, supports flash loans and strategies.\\n\\n// Copyright (c) 2021 BoringCrypto - All rights reserved\\n// Twitter: @Boring_Crypto\\n\\n// Special thanks to Keno for all his hard work and support\\n\\n// Version 22-Mar-2021\\n\\npragma solidity 0.6.12;\\npragma experimental ABIEncoderV2;\\n\\n// solhint-disable avoid-low-level-calls\\n// solhint-disable not-rely-on-time\\n// solhint-disable no-inline-assembly\\n\\n// File @boringcrypto/boring-solidity/contracts/interfaces/IERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ninterface IERC20 {\\n    function totalSupply() external view returns (uint256);\\n\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /// @notice EIP 2612\\n    function permit(\\n        address owner,\\n        address spender,\\n        uint256 value,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) external;\\n}\\n\\n// File contracts/interfaces/IFlashLoan.sol\\n// License-Identifier: MIT\\n\\ninterface IFlashBorrower {\\n    /// @notice The flashloan callback. `amount` + `fee` needs to repayed to msg.sender before this call returns.\\n    /// @param sender The address of the invoker of this flashloan.\\n    /// @param token The address of the token that is loaned.\\n    /// @param amount of the `token` that is loaned.\\n    /// @param fee The fee that needs to be paid on top for this loan. Needs to be the same as `token`.\\n    /// @param data Additional data that was passed to the flashloan function.\\n    function onFlashLoan(\\n        address sender,\\n        IERC20 token,\\n        uint256 amount,\\n        uint256 fee,\\n        bytes calldata data\\n    ) external;\\n}\\n\\ninterface IBatchFlashBorrower {\\n    /// @notice The callback for batched flashloans. Every amount + fee needs to repayed to msg.sender before this call returns.\\n    /// @param sender The address of the invoker of this flashloan.\\n    /// @param tokens Array of addresses for ERC-20 tokens that is loaned.\\n    /// @param amounts A one-to-one map to `tokens` that is loaned.\\n    /// @param fees A one-to-one map to `tokens` that needs to be paid on top for each loan. Needs to be the same token.\\n    /// @param data Additional data that was passed to the flashloan function.\\n    function onBatchFlashLoan(\\n        address sender,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        uint256[] calldata fees,\\n        bytes calldata data\\n    ) external;\\n}\\n\\n// File contracts/interfaces/IWETH.sol\\n// License-Identifier: MIT\\n\\ninterface IWETH {\\n    function deposit() external payable;\\n\\n    function withdraw(uint256) external;\\n}\\n\\n// File contracts/interfaces/IStrategy.sol\\n// License-Identifier: MIT\\n\\ninterface IStrategy {\\n    /// @notice Send the assets to the Strategy and call skim to invest them.\\n    /// @param amount The amount of tokens to invest.\\n    function skim(uint256 amount) external;\\n\\n    /// @notice Harvest any profits made converted to the asset and pass them to the caller.\\n    /// @param balance The amount of tokens the caller thinks it has invested.\\n    /// @param sender The address of the initiator of this transaction. Can be used for reimbursements, etc.\\n    /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.\\n    function harvest(uint256 balance, address sender) external returns (int256 amountAdded);\\n\\n    /// @notice Withdraw assets. The returned amount can differ from the requested amount due to rounding.\\n    /// @dev The `actualAmount` should be very close to the amount.\\n    /// The difference should NOT be used to report a loss. That's what harvest is for.\\n    /// @param amount The requested amount the caller wants to withdraw.\\n    /// @return actualAmount The real amount that is withdrawn.\\n    function withdraw(uint256 amount) external returns (uint256 actualAmount);\\n\\n    /// @notice Withdraw all assets in the safest way possible. This shouldn't fail.\\n    /// @param balance The amount of tokens the caller thinks it has invested.\\n    /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.\\n    function exit(uint256 balance) external returns (int256 amountAdded);\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\nlibrary BoringERC20 {\\n    bytes4 private constant SIG_SYMBOL = 0x95d89b41; // symbol()\\n    bytes4 private constant SIG_NAME = 0x06fdde03; // name()\\n    bytes4 private constant SIG_DECIMALS = 0x313ce567; // decimals()\\n    bytes4 private constant SIG_TRANSFER = 0xa9059cbb; // transfer(address,uint256)\\n    bytes4 private constant SIG_TRANSFER_FROM = 0x23b872dd; // transferFrom(address,address,uint256)\\n\\n    /// @notice Provides a safe ERC20.transfer version for different ERC-20 implementations.\\n    /// Reverts on a failed transfer.\\n    /// @param token The address of the ERC-20 token.\\n    /// @param to Transfer tokens to.\\n    /// @param amount The token amount.\\n    function safeTransfer(\\n        IERC20 token,\\n        address to,\\n        uint256 amount\\n    ) internal {\\n        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER, to, amount));\\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: Transfer failed\\\");\\n    }\\n\\n    /// @notice Provides a safe ERC20.transferFrom version for different ERC-20 implementations.\\n    /// Reverts on a failed transfer.\\n    /// @param token The address of the ERC-20 token.\\n    /// @param from Transfer tokens from.\\n    /// @param to Transfer tokens to.\\n    /// @param amount The token amount.\\n    function safeTransferFrom(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 amount\\n    ) internal {\\n        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER_FROM, from, to, amount));\\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: TransferFrom failed\\\");\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringMath.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n/// @notice A library for performing overflow-/underflow-safe math,\\n/// updated with awesomeness from of DappHub (https://github.com/dapphub/ds-math).\\nlibrary BoringMath {\\n    function add(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require(b == 0 || (c = a * b) / b == a, \\\"BoringMath: Mul Overflow\\\");\\n    }\\n\\n    function to128(uint256 a) internal pure returns (uint128 c) {\\n        require(a <= uint128(-1), \\\"BoringMath: uint128 Overflow\\\");\\n        c = uint128(a);\\n    }\\n\\n    function to64(uint256 a) internal pure returns (uint64 c) {\\n        require(a <= uint64(-1), \\\"BoringMath: uint64 Overflow\\\");\\n        c = uint64(a);\\n    }\\n\\n    function to32(uint256 a) internal pure returns (uint32 c) {\\n        require(a <= uint32(-1), \\\"BoringMath: uint32 Overflow\\\");\\n        c = uint32(a);\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint128.\\nlibrary BoringMath128 {\\n    function add(uint128 a, uint128 b) internal pure returns (uint128 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint128 a, uint128 b) internal pure returns (uint128 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint64.\\nlibrary BoringMath64 {\\n    function add(uint64 a, uint64 b) internal pure returns (uint64 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint64 a, uint64 b) internal pure returns (uint64 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint32.\\nlibrary BoringMath32 {\\n    function add(uint32 a, uint32 b) internal pure returns (uint32 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint32 a, uint32 b) internal pure returns (uint32 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringRebase.sol@v1.2.0\\n// License-Identifier: MIT\\n\\nstruct Rebase {\\n    uint128 elastic;\\n    uint128 base;\\n}\\n\\n/// @notice A rebasing library using overflow-/underflow-safe math.\\nlibrary RebaseLibrary {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n\\n    /// @notice Calculates the base value in relationship to `elastic` and `total`.\\n    function toBase(\\n        Rebase memory total,\\n        uint256 elastic,\\n        bool roundUp\\n    ) internal pure returns (uint256 base) {\\n        if (total.elastic == 0) {\\n            base = elastic;\\n        } else {\\n            base = elastic.mul(total.base) / total.elastic;\\n            if (roundUp && base.mul(total.elastic) / total.base < elastic) {\\n                base = base.add(1);\\n            }\\n        }\\n    }\\n\\n    /// @notice Calculates the elastic value in relationship to `base` and `total`.\\n    function toElastic(\\n        Rebase memory total,\\n        uint256 base,\\n        bool roundUp\\n    ) internal pure returns (uint256 elastic) {\\n        if (total.base == 0) {\\n            elastic = base;\\n        } else {\\n            elastic = base.mul(total.elastic) / total.base;\\n            if (roundUp && elastic.mul(total.base) / total.elastic < base) {\\n                elastic = elastic.add(1);\\n            }\\n        }\\n    }\\n\\n    /// @notice Add `elastic` to `total` and doubles `total.base`.\\n    /// @return (Rebase) The new total.\\n    /// @return base in relationship to `elastic`.\\n    function add(\\n        Rebase memory total,\\n        uint256 elastic,\\n        bool roundUp\\n    ) internal pure returns (Rebase memory, uint256 base) {\\n        base = toBase(total, elastic, roundUp);\\n        total.elastic = total.elastic.add(elastic.to128());\\n        total.base = total.base.add(base.to128());\\n        return (total, base);\\n    }\\n\\n    /// @notice Sub `base` from `total` and update `total.elastic`.\\n    /// @return (Rebase) The new total.\\n    /// @return elastic in relationship to `base`.\\n    function sub(\\n        Rebase memory total,\\n        uint256 base,\\n        bool roundUp\\n    ) internal pure returns (Rebase memory, uint256 elastic) {\\n        elastic = toElastic(total, base, roundUp);\\n        total.elastic = total.elastic.sub(elastic.to128());\\n        total.base = total.base.sub(base.to128());\\n        return (total, elastic);\\n    }\\n\\n    /// @notice Add `elastic` and `base` to `total`.\\n    function add(\\n        Rebase memory total,\\n        uint256 elastic,\\n        uint256 base\\n    ) internal pure returns (Rebase memory) {\\n        total.elastic = total.elastic.add(elastic.to128());\\n        total.base = total.base.add(base.to128());\\n        return total;\\n    }\\n\\n    /// @notice Subtract `elastic` and `base` to `total`.\\n    function sub(\\n        Rebase memory total,\\n        uint256 elastic,\\n        uint256 base\\n    ) internal pure returns (Rebase memory) {\\n        total.elastic = total.elastic.sub(elastic.to128());\\n        total.base = total.base.sub(base.to128());\\n        return total;\\n    }\\n\\n    /// @notice Add `elastic` to `total` and update storage.\\n    /// @return newElastic Returns updated `elastic`.\\n    function addElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {\\n        newElastic = total.elastic = total.elastic.add(elastic.to128());\\n    }\\n\\n    /// @notice Subtract `elastic` from `total` and update storage.\\n    /// @return newElastic Returns updated `elastic`.\\n    function subElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {\\n        newElastic = total.elastic = total.elastic.sub(elastic.to128());\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringOwnable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n// Source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol + Claimable.sol\\n// Edited by BoringCrypto\\n\\ncontract BoringOwnableData {\\n    address public owner;\\n    address public pendingOwner;\\n}\\n\\ncontract BoringOwnable is BoringOwnableData {\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /// @notice `owner` defaults to msg.sender on construction.\\n    constructor() public {\\n        owner = msg.sender;\\n        emit OwnershipTransferred(address(0), msg.sender);\\n    }\\n\\n    /// @notice Transfers ownership to `newOwner`. Either directly or claimable by the new pending owner.\\n    /// Can only be invoked by the current `owner`.\\n    /// @param newOwner Address of the new owner.\\n    /// @param direct True if `newOwner` should be set immediately. False if `newOwner` needs to use `claimOwnership`.\\n    /// @param renounce Allows the `newOwner` to be `address(0)` if `direct` and `renounce` is True. Has no effect otherwise.\\n    function transferOwnership(\\n        address newOwner,\\n        bool direct,\\n        bool renounce\\n    ) public onlyOwner {\\n        if (direct) {\\n            // Checks\\n            require(newOwner != address(0) || renounce, \\\"Ownable: zero address\\\");\\n\\n            // Effects\\n            emit OwnershipTransferred(owner, newOwner);\\n            owner = newOwner;\\n            pendingOwner = address(0);\\n        } else {\\n            // Effects\\n            pendingOwner = newOwner;\\n        }\\n    }\\n\\n    /// @notice Needs to be called by `pendingOwner` to claim ownership.\\n    function claimOwnership() public {\\n        address _pendingOwner = pendingOwner;\\n\\n        // Checks\\n        require(msg.sender == _pendingOwner, \\\"Ownable: caller != pending owner\\\");\\n\\n        // Effects\\n        emit OwnershipTransferred(owner, _pendingOwner);\\n        owner = _pendingOwner;\\n        pendingOwner = address(0);\\n    }\\n\\n    /// @notice Only allows the `owner` to execute the function.\\n    modifier onlyOwner() {\\n        require(msg.sender == owner, \\\"Ownable: caller is not the owner\\\");\\n        _;\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/interfaces/IMasterContract.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ninterface IMasterContract {\\n    /// @notice Init function that gets called from `BoringFactory.deploy`.\\n    /// Also kown as the constructor for cloned contracts.\\n    /// Any ETH send to `BoringFactory.deploy` ends up here.\\n    /// @param data Can be abi encoded arguments or anything else.\\n    function init(bytes calldata data) external payable;\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringFactory.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ncontract BoringFactory {\\n    event LogDeploy(address indexed masterContract, bytes data, address indexed cloneAddress);\\n\\n    /// @notice Mapping from clone contracts to their masterContract.\\n    mapping(address => address) public masterContractOf;\\n\\n    /// @notice Deploys a given master Contract as a clone.\\n    /// Any ETH transferred with this call is forwarded to the new clone.\\n    /// Emits `LogDeploy`.\\n    /// @param masterContract The address of the contract to clone.\\n    /// @param data Additional abi encoded calldata that is passed to the new clone via `IMasterContract.init`.\\n    /// @param useCreate2 Creates the clone by using the CREATE2 opcode, in this case `data` will be used as salt.\\n    /// @return cloneAddress Address of the created clone contract.\\n    function deploy(\\n        address masterContract,\\n        bytes calldata data,\\n        bool useCreate2\\n    ) public payable returns (address cloneAddress) {\\n        require(masterContract != address(0), \\\"BoringFactory: No masterContract\\\");\\n        bytes20 targetBytes = bytes20(masterContract); // Takes the first 20 bytes of the masterContract's address\\n\\n        if (useCreate2) {\\n            // each masterContract has different code already. So clones are distinguished by their data only.\\n            bytes32 salt = keccak256(data);\\n\\n            // Creates clone, more info here: https://blog.openzeppelin.com/deep-dive-into-the-minimal-proxy-contract/\\n            assembly {\\n                let clone := mload(0x40)\\n                mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n                mstore(add(clone, 0x14), targetBytes)\\n                mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n                cloneAddress := create2(0, clone, 0x37, salt)\\n            }\\n        } else {\\n            assembly {\\n                let clone := mload(0x40)\\n                mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n                mstore(add(clone, 0x14), targetBytes)\\n                mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n                cloneAddress := create(0, clone, 0x37)\\n            }\\n        }\\n        masterContractOf[cloneAddress] = masterContract;\\n\\n        IMasterContract(cloneAddress).init{value: msg.value}(data);\\n\\n        emit LogDeploy(masterContract, data, cloneAddress);\\n    }\\n}\\n\\n// File contracts/MasterContractManager.sol\\n// License-Identifier: UNLICENSED\\n\\ncontract MasterContractManager is BoringOwnable, BoringFactory {\\n    event LogWhiteListMasterContract(address indexed masterContract, bool approved);\\n    event LogSetMasterContractApproval(address indexed masterContract, address indexed user, bool approved);\\n    event LogRegisterProtocol(address indexed protocol);\\n\\n    /// @notice masterContract to user to approval state\\n    mapping(address => mapping(address => bool)) public masterContractApproved;\\n    /// @notice masterContract to whitelisted state for approval without signed message\\n    mapping(address => bool) public whitelistedMasterContracts;\\n    /// @notice user nonces for masterContract approvals\\n    mapping(address => uint256) public nonces;\\n\\n    bytes32 private constant DOMAIN_SEPARATOR_SIGNATURE_HASH = keccak256(\\\"EIP712Domain(string name,uint256 chainId,address verifyingContract)\\\");\\n    // See https://eips.ethereum.org/EIPS/eip-191\\n    string private constant EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA = \\\"\\\\x19\\\\x01\\\";\\n    bytes32 private constant APPROVAL_SIGNATURE_HASH =\\n        keccak256(\\\"SetMasterContractApproval(string warning,address user,address masterContract,bool approved,uint256 nonce)\\\");\\n\\n    // solhint-disable-next-line var-name-mixedcase\\n    bytes32 private immutable _DOMAIN_SEPARATOR;\\n    // solhint-disable-next-line var-name-mixedcase\\n    uint256 private immutable DOMAIN_SEPARATOR_CHAIN_ID;\\n\\n    constructor() public {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        _DOMAIN_SEPARATOR = _calculateDomainSeparator(DOMAIN_SEPARATOR_CHAIN_ID = chainId);\\n    }\\n\\n    function _calculateDomainSeparator(uint256 chainId) private view returns (bytes32) {\\n        return keccak256(abi.encode(DOMAIN_SEPARATOR_SIGNATURE_HASH, keccak256(\\\"BentoBox V1\\\"), chainId, address(this)));\\n    }\\n\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() public view returns (bytes32) {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        return chainId == DOMAIN_SEPARATOR_CHAIN_ID ? _DOMAIN_SEPARATOR : _calculateDomainSeparator(chainId);\\n    }\\n\\n    /// @notice Other contracts need to register with this master contract so that users can approve them for the BentoBox.\\n    function registerProtocol() public {\\n        masterContractOf[msg.sender] = msg.sender;\\n        emit LogRegisterProtocol(msg.sender);\\n    }\\n\\n    /// @notice Enables or disables a contract for approval without signed message.\\n    function whitelistMasterContract(address masterContract, bool approved) public onlyOwner {\\n        // Checks\\n        require(masterContract != address(0), \\\"MasterCMgr: Cannot approve 0\\\");\\n\\n        // Effects\\n        whitelistedMasterContracts[masterContract] = approved;\\n        emit LogWhiteListMasterContract(masterContract, approved);\\n    }\\n\\n    /// @notice Approves or revokes a `masterContract` access to `user` funds.\\n    /// @param user The address of the user that approves or revokes access.\\n    /// @param masterContract The address who gains or loses access.\\n    /// @param approved If True approves access. If False revokes access.\\n    /// @param v Part of the signature. (See EIP-191)\\n    /// @param r Part of the signature. (See EIP-191)\\n    /// @param s Part of the signature. (See EIP-191)\\n    // F4 - Check behaviour for all function arguments when wrong or extreme\\n    // F4: Don't allow masterContract 0 to be approved. Unknown contracts will have a masterContract of 0.\\n    // F4: User can't be 0 for signed approvals because the recoveredAddress will be 0 if ecrecover fails\\n    function setMasterContractApproval(\\n        address user,\\n        address masterContract,\\n        bool approved,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) public {\\n        // Checks\\n        require(masterContract != address(0), \\\"MasterCMgr: masterC not set\\\"); // Important for security\\n\\n        // If no signature is provided, the fallback is executed\\n        if (r == 0 && s == 0 && v == 0) {\\n            require(user == msg.sender, \\\"MasterCMgr: user not sender\\\");\\n            require(masterContractOf[user] == address(0), \\\"MasterCMgr: user is clone\\\");\\n            require(whitelistedMasterContracts[masterContract], \\\"MasterCMgr: not whitelisted\\\");\\n        } else {\\n            // Important for security - any address without masterContract has address(0) as masterContract\\n            // So approving address(0) would approve every address, leading to full loss of funds\\n            // Also, ecrecover returns address(0) on failure. So we check this:\\n            require(user != address(0), \\\"MasterCMgr: User cannot be 0\\\");\\n\\n            // C10 - Protect signatures against replay, use nonce and chainId (SWC-121)\\n            // C10: nonce + chainId are used to prevent replays\\n            // C11 - All signatures strictly EIP-712 (SWC-117 SWC-122)\\n            // C11: signature is EIP-712 compliant\\n            // C12 - abi.encodePacked can't contain variable length user input (SWC-133)\\n            // C12: abi.encodePacked has fixed length parameters\\n            bytes32 digest =\\n                keccak256(\\n                    abi.encodePacked(\\n                        EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA,\\n                        DOMAIN_SEPARATOR(),\\n                        keccak256(\\n                            abi.encode(\\n                                APPROVAL_SIGNATURE_HASH,\\n                                approved\\n                                    ? keccak256(\\\"Give FULL access to funds in (and approved to) BentoBox?\\\")\\n                                    : keccak256(\\\"Revoke access to BentoBox?\\\"),\\n                                user,\\n                                masterContract,\\n                                approved,\\n                                nonces[user]++\\n                            )\\n                        )\\n                    )\\n                );\\n            address recoveredAddress = ecrecover(digest, v, r, s);\\n            require(recoveredAddress == user, \\\"MasterCMgr: Invalid Signature\\\");\\n        }\\n\\n        // Effects\\n        masterContractApproved[masterContract][user] = approved;\\n        emit LogSetMasterContractApproval(masterContract, user, approved);\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringBatchable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ncontract BaseBoringBatchable {\\n    /// @dev Helper function to extract a useful revert message from a failed call.\\n    /// If the returned data is malformed or not correctly abi encoded then this call can fail itself.\\n    function _getRevertMsg(bytes memory _returnData) internal pure returns (string memory) {\\n        // If the _res length is less than 68, then the transaction failed silently (without a revert message)\\n        if (_returnData.length < 68) return \\\"Transaction reverted silently\\\";\\n\\n        assembly {\\n            // Slice the sighash.\\n            _returnData := add(_returnData, 0x04)\\n        }\\n        return abi.decode(_returnData, (string)); // All that remains is the revert string\\n    }\\n\\n    /// @notice Allows batched call to self (this contract).\\n    /// @param calls An array of inputs for each call.\\n    /// @param revertOnFail If True then reverts after a failed call and stops doing further calls.\\n    /// @return successes An array indicating the success of a call, mapped one-to-one to `calls`.\\n    /// @return results An array with the returned data of each function call, mapped one-to-one to `calls`.\\n    // F1: External is ok here because this is the batch function, adding it to a batch makes no sense\\n    // F2: Calls in the batch may be payable, delegatecall operates in the same context, so each call in the batch has access to msg.value\\n    // C3: The length of the loop is fully under user control, so can't be exploited\\n    // C7: Delegatecall is only used on the same contract, so it's safe\\n    function batch(bytes[] calldata calls, bool revertOnFail) external payable returns (bool[] memory successes, bytes[] memory results) {\\n        successes = new bool[](calls.length);\\n        results = new bytes[](calls.length);\\n        for (uint256 i = 0; i < calls.length; i++) {\\n            (bool success, bytes memory result) = address(this).delegatecall(calls[i]);\\n            require(success || !revertOnFail, _getRevertMsg(result));\\n            successes[i] = success;\\n            results[i] = result;\\n        }\\n    }\\n}\\n\\ncontract BoringBatchable is BaseBoringBatchable {\\n    /// @notice Call wrapper that performs `ERC20.permit` on `token`.\\n    /// Lookup `IERC20.permit`.\\n    // F6: Parameters can be used front-run the permit and the user's permit will fail (due to nonce or other revert)\\n    //     if part of a batch this could be used to grief once as the second call would not need the permit\\n    function permitToken(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) public {\\n        token.permit(from, to, amount, deadline, v, r, s);\\n    }\\n}\\n\\n// File contracts/BentoBox.sol\\n// License-Identifier: UNLICENSED\\n\\n/// @title BentoBox\\n/// @author BoringCrypto, Keno\\n/// @notice The BentoBox is a vault for tokens. The stored tokens can be flash loaned and used in strategies.\\n/// Yield from this will go to the token depositors.\\n/// Rebasing tokens ARE NOT supported and WILL cause loss of funds.\\n/// Any funds transfered directly onto the BentoBox will be lost, use the deposit function instead.\\ncontract BentoBoxV1 is MasterContractManager, BoringBatchable {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n    using BoringERC20 for IERC20;\\n    using RebaseLibrary for Rebase;\\n\\n    // ************** //\\n    // *** EVENTS *** //\\n    // ************** //\\n\\n    event LogDeposit(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogWithdraw(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogTransfer(IERC20 indexed token, address indexed from, address indexed to, uint256 share);\\n\\n    event LogFlashLoan(address indexed borrower, IERC20 indexed token, uint256 amount, uint256 feeAmount, address indexed receiver);\\n\\n    event LogStrategyTargetPercentage(IERC20 indexed token, uint256 targetPercentage);\\n    event LogStrategyQueued(IERC20 indexed token, IStrategy indexed strategy);\\n    event LogStrategySet(IERC20 indexed token, IStrategy indexed strategy);\\n    event LogStrategyInvest(IERC20 indexed token, uint256 amount);\\n    event LogStrategyDivest(IERC20 indexed token, uint256 amount);\\n    event LogStrategyProfit(IERC20 indexed token, uint256 amount);\\n    event LogStrategyLoss(IERC20 indexed token, uint256 amount);\\n\\n    // *************** //\\n    // *** STRUCTS *** //\\n    // *************** //\\n\\n    struct StrategyData {\\n        uint64 strategyStartDate;\\n        uint64 targetPercentage;\\n        uint128 balance; // the balance of the strategy that BentoBox thinks is in there\\n    }\\n\\n    // ******************************** //\\n    // *** CONSTANTS AND IMMUTABLES *** //\\n    // ******************************** //\\n\\n    // V2 - Can they be private?\\n    // V2: Private to save gas, to verify it's correct, check the constructor arguments\\n    IERC20 private immutable wethToken;\\n\\n    IERC20 private constant USE_ETHEREUM = IERC20(0);\\n    uint256 private constant FLASH_LOAN_FEE = 50; // 0.05%\\n    uint256 private constant FLASH_LOAN_FEE_PRECISION = 1e5;\\n    uint256 private constant STRATEGY_DELAY = 2 weeks;\\n    uint256 private constant MAX_TARGET_PERCENTAGE = 95; // 95%\\n    uint256 private constant MINIMUM_SHARE_BALANCE = 1000; // To prevent the ratio going off\\n\\n    // ***************** //\\n    // *** VARIABLES *** //\\n    // ***************** //\\n\\n    // Balance per token per address/contract in shares\\n    mapping(IERC20 => mapping(address => uint256)) public balanceOf;\\n\\n    // Rebase from amount to share\\n    mapping(IERC20 => Rebase) public totals;\\n\\n    mapping(IERC20 => IStrategy) public strategy;\\n    mapping(IERC20 => IStrategy) public pendingStrategy;\\n    mapping(IERC20 => StrategyData) public strategyData;\\n\\n    // ******************* //\\n    // *** CONSTRUCTOR *** //\\n    // ******************* //\\n\\n    constructor(IERC20 wethToken_) public {\\n        wethToken = wethToken_;\\n    }\\n\\n    // ***************** //\\n    // *** MODIFIERS *** //\\n    // ***************** //\\n\\n    /// Modifier to check if the msg.sender is allowed to use funds belonging to the 'from' address.\\n    /// If 'from' is msg.sender, it's allowed.\\n    /// If 'from' is the BentoBox itself, it's allowed. Any ETH, token balances (above the known balances) or BentoBox balances\\n    /// can be taken by anyone.\\n    /// This is to enable skimming, not just for deposits, but also for withdrawals or transfers, enabling better composability.\\n    /// If 'from' is a clone of a masterContract AND the 'from' address has approved that masterContract, it's allowed.\\n    modifier allowed(address from) {\\n        if (from != msg.sender && from != address(this)) {\\n            // From is sender or you are skimming\\n            address masterContract = masterContractOf[msg.sender];\\n            require(masterContract != address(0), \\\"BentoBox: no masterContract\\\");\\n            require(masterContractApproved[masterContract][from], \\\"BentoBox: Transfer not approved\\\");\\n        }\\n        _;\\n    }\\n\\n    // ************************** //\\n    // *** INTERNAL FUNCTIONS *** //\\n    // ************************** //\\n\\n    /// @dev Returns the total balance of `token` this contracts holds,\\n    /// plus the total amount this contract thinks the strategy holds.\\n    function _tokenBalanceOf(IERC20 token) internal view returns (uint256 amount) {\\n        amount = token.balanceOf(address(this)).add(strategyData[token].balance);\\n    }\\n\\n    // ************************ //\\n    // *** PUBLIC FUNCTIONS *** //\\n    // ************************ //\\n\\n    /// @dev Helper function to represent an `amount` of `token` in shares.\\n    /// @param token The ERC-20 token.\\n    /// @param amount The `token` amount.\\n    /// @param roundUp If the result `share` should be rounded up.\\n    /// @return share The token amount represented in shares.\\n    function toShare(\\n        IERC20 token,\\n        uint256 amount,\\n        bool roundUp\\n    ) external view returns (uint256 share) {\\n        share = totals[token].toBase(amount, roundUp);\\n    }\\n\\n    /// @dev Helper function represent shares back into the `token` amount.\\n    /// @param token The ERC-20 token.\\n    /// @param share The amount of shares.\\n    /// @param roundUp If the result should be rounded up.\\n    /// @return amount The share amount back into native representation.\\n    function toAmount(\\n        IERC20 token,\\n        uint256 share,\\n        bool roundUp\\n    ) external view returns (uint256 amount) {\\n        amount = totals[token].toElastic(share, roundUp);\\n    }\\n\\n    /// @notice Deposit an amount of `token` represented in either `amount` or `share`.\\n    /// @param token_ The ERC-20 token to deposit.\\n    /// @param from which account to pull the tokens.\\n    /// @param to which account to push the tokens.\\n    /// @param amount Token amount in native representation to deposit.\\n    /// @param share Token amount represented in shares to deposit. Takes precedence over `amount`.\\n    /// @return amountOut The amount deposited.\\n    /// @return shareOut The deposited amount repesented in shares.\\n    function deposit(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) public payable allowed(from) returns (uint256 amountOut, uint256 shareOut) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;\\n        Rebase memory total = totals[token];\\n\\n        // If a new token gets added, the tokenSupply call checks that this is a deployed contract. Needed for security.\\n        require(total.elastic != 0 || token.totalSupply() > 0, \\\"BentoBox: No tokens\\\");\\n        if (share == 0) {\\n            // value of the share may be lower than the amount due to rounding, that's ok\\n            share = total.toBase(amount, false);\\n            // Any deposit should lead to at least the minimum share balance, otherwise it's ignored (no amount taken)\\n            if (total.base.add(share.to128()) < MINIMUM_SHARE_BALANCE) {\\n                return (0, 0);\\n            }\\n        } else {\\n            // amount may be lower than the value of share due to rounding, in that case, add 1 to amount (Always round up)\\n            amount = total.toElastic(share, true);\\n        }\\n\\n        // In case of skimming, check that only the skimmable amount is taken.\\n        // For ETH, the full balance is available, so no need to check.\\n        // During flashloans the _tokenBalanceOf is lower than 'reality', so skimming deposits will mostly fail during a flashloan.\\n        require(\\n            from != address(this) || token_ == USE_ETHEREUM || amount <= _tokenBalanceOf(token).sub(total.elastic),\\n            \\\"BentoBox: Skim too much\\\"\\n        );\\n\\n        balanceOf[token][to] = balanceOf[token][to].add(share);\\n        total.base = total.base.add(share.to128());\\n        total.elastic = total.elastic.add(amount.to128());\\n        totals[token] = total;\\n\\n        // Interactions\\n        // During the first deposit, we check that this token is 'real'\\n        if (token_ == USE_ETHEREUM) {\\n            // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)\\n            // X2: If the WETH implementation is faulty or malicious, it will block adding ETH (but we know the WETH implementation)\\n            IWETH(address(wethToken)).deposit{value: amount}();\\n        } else if (from != address(this)) {\\n            // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)\\n            // X2: If the token implementation is faulty or malicious, it may block adding tokens. Good.\\n            token.safeTransferFrom(from, address(this), amount);\\n        }\\n        emit LogDeposit(token, from, to, amount, share);\\n        amountOut = amount;\\n        shareOut = share;\\n    }\\n\\n    /// @notice Withdraws an amount of `token` from a user account.\\n    /// @param token_ The ERC-20 token to withdraw.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param amount of tokens. Either one of `amount` or `share` needs to be supplied.\\n    /// @param share Like above, but `share` takes precedence over `amount`.\\n    function withdraw(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) public allowed(from) returns (uint256 amountOut, uint256 shareOut) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;\\n        Rebase memory total = totals[token];\\n        if (share == 0) {\\n            // value of the share paid could be lower than the amount paid due to rounding, in that case, add a share (Always round up)\\n            share = total.toBase(amount, true);\\n        } else {\\n            // amount may be lower than the value of share due to rounding, that's ok\\n            amount = total.toElastic(share, false);\\n        }\\n\\n        balanceOf[token][from] = balanceOf[token][from].sub(share);\\n        total.elastic = total.elastic.sub(amount.to128());\\n        total.base = total.base.sub(share.to128());\\n        // There have to be at least 1000 shares left to prevent reseting the share/amount ratio (unless it's fully emptied)\\n        require(total.base >= MINIMUM_SHARE_BALANCE || total.base == 0, \\\"BentoBox: cannot empty\\\");\\n        totals[token] = total;\\n\\n        // Interactions\\n        if (token_ == USE_ETHEREUM) {\\n            // X2, X3: A revert or big gas usage in the WETH contract could block withdrawals, but WETH9 is fine.\\n            IWETH(address(wethToken)).withdraw(amount);\\n            // X2, X3: A revert or big gas usage could block, however, the to address is under control of the caller.\\n            (bool success, ) = to.call{value: amount}(\\\"\\\");\\n            require(success, \\\"BentoBox: ETH transfer failed\\\");\\n        } else {\\n            // X2, X3: A malicious token could block withdrawal of just THAT token.\\n            //         masterContracts may want to take care not to rely on withdraw always succeeding.\\n            token.safeTransfer(to, amount);\\n        }\\n        emit LogWithdraw(token, from, to, amount, share);\\n        amountOut = amount;\\n        shareOut = share;\\n    }\\n\\n    /// @notice Transfer shares from a user account to another one.\\n    /// @param token The ERC-20 token to transfer.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param share The amount of `token` in shares.\\n    // Clones of master contracts can transfer from any account that has approved them\\n    // F3 - Can it be combined with another similar function?\\n    // F3: This isn't combined with transferMultiple for gas optimization\\n    function transfer(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 share\\n    ) public allowed(from) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        balanceOf[token][from] = balanceOf[token][from].sub(share);\\n        balanceOf[token][to] = balanceOf[token][to].add(share);\\n\\n        emit LogTransfer(token, from, to, share);\\n    }\\n\\n    /// @notice Transfer shares from a user account to multiple other ones.\\n    /// @param token The ERC-20 token to transfer.\\n    /// @param from which user to pull the tokens.\\n    /// @param tos The receivers of the tokens.\\n    /// @param shares The amount of `token` in shares for each receiver in `tos`.\\n    // F3 - Can it be combined with another similar function?\\n    // F3: This isn't combined with transfer for gas optimization\\n    function transferMultiple(\\n        IERC20 token,\\n        address from,\\n        address[] calldata tos,\\n        uint256[] calldata shares\\n    ) public allowed(from) {\\n        // Checks\\n        require(tos[0] != address(0), \\\"BentoBox: to[0] not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        uint256 totalAmount;\\n        uint256 len = tos.length;\\n        for (uint256 i = 0; i < len; i++) {\\n            address to = tos[i];\\n            balanceOf[token][to] = balanceOf[token][to].add(shares[i]);\\n            totalAmount = totalAmount.add(shares[i]);\\n            emit LogTransfer(token, from, to, shares[i]);\\n        }\\n        balanceOf[token][from] = balanceOf[token][from].sub(totalAmount);\\n    }\\n\\n    /// @notice Flashloan ability.\\n    /// @param borrower The address of the contract that implements and conforms to `IFlashBorrower` and handles the flashloan.\\n    /// @param receiver Address of the token receiver.\\n    /// @param token The address of the token to receive.\\n    /// @param amount of the tokens to receive.\\n    /// @param data The calldata to pass to the `borrower` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Not possible to follow this here, reentrancy has been reviewed\\n    // F6 - Check for front-running possibilities, such as the approve function (SWC-114)\\n    // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.\\n    function flashLoan(\\n        IFlashBorrower borrower,\\n        address receiver,\\n        IERC20 token,\\n        uint256 amount,\\n        bytes calldata data\\n    ) public {\\n        uint256 fee = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;\\n        token.safeTransfer(receiver, amount);\\n\\n        borrower.onFlashLoan(msg.sender, token, amount, fee, data);\\n\\n        require(_tokenBalanceOf(token) >= totals[token].addElastic(fee.to128()), \\\"BentoBox: Wrong amount\\\");\\n        emit LogFlashLoan(address(borrower), token, amount, fee, receiver);\\n    }\\n\\n    /// @notice Support for batched flashloans. Useful to request multiple different `tokens` in a single transaction.\\n    /// @param borrower The address of the contract that implements and conforms to `IBatchFlashBorrower` and handles the flashloan.\\n    /// @param receivers An array of the token receivers. A one-to-one mapping with `tokens` and `amounts`.\\n    /// @param tokens The addresses of the tokens.\\n    /// @param amounts of the tokens for each receiver.\\n    /// @param data The calldata to pass to the `borrower` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Not possible to follow this here, reentrancy has been reviewed\\n    // F6 - Check for front-running possibilities, such as the approve function (SWC-114)\\n    // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.\\n    function batchFlashLoan(\\n        IBatchFlashBorrower borrower,\\n        address[] calldata receivers,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        bytes calldata data\\n    ) public {\\n        uint256[] memory fees = new uint256[](tokens.length);\\n\\n        uint256 len = tokens.length;\\n        for (uint256 i = 0; i < len; i++) {\\n            uint256 amount = amounts[i];\\n            fees[i] = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;\\n\\n            tokens[i].safeTransfer(receivers[i], amounts[i]);\\n        }\\n\\n        borrower.onBatchFlashLoan(msg.sender, tokens, amounts, fees, data);\\n\\n        for (uint256 i = 0; i < len; i++) {\\n            IERC20 token = tokens[i];\\n            require(_tokenBalanceOf(token) >= totals[token].addElastic(fees[i].to128()), \\\"BentoBox: Wrong amount\\\");\\n            emit LogFlashLoan(address(borrower), token, amounts[i], fees[i], receivers[i]);\\n        }\\n    }\\n\\n    /// @notice Sets the target percentage of the strategy for `token`.\\n    /// @dev Only the owner of this contract is allowed to change this.\\n    /// @param token The address of the token that maps to a strategy to change.\\n    /// @param targetPercentage_ The new target in percent. Must be lesser or equal to `MAX_TARGET_PERCENTAGE`.\\n    function setStrategyTargetPercentage(IERC20 token, uint64 targetPercentage_) public onlyOwner {\\n        // Checks\\n        require(targetPercentage_ <= MAX_TARGET_PERCENTAGE, \\\"StrategyManager: Target too high\\\");\\n\\n        // Effects\\n        strategyData[token].targetPercentage = targetPercentage_;\\n        emit LogStrategyTargetPercentage(token, targetPercentage_);\\n    }\\n\\n    /// @notice Sets the contract address of a new strategy that conforms to `IStrategy` for `token`.\\n    /// Must be called twice with the same arguments.\\n    /// A new strategy becomes pending first and can be activated once `STRATEGY_DELAY` is over.\\n    /// @dev Only the owner of this contract is allowed to change this.\\n    /// @param token The address of the token that maps to a strategy to change.\\n    /// @param newStrategy The address of the contract that conforms to `IStrategy`.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Total amount is updated AFTER interaction. But strategy is under our control.\\n    // C4 - Use block.timestamp only for long intervals (SWC-116)\\n    // C4: block.timestamp is used for a period of 2 weeks, which is long enough\\n    function setStrategy(IERC20 token, IStrategy newStrategy) public onlyOwner {\\n        StrategyData memory data = strategyData[token];\\n        IStrategy pending = pendingStrategy[token];\\n        if (data.strategyStartDate == 0 || pending != newStrategy) {\\n            pendingStrategy[token] = newStrategy;\\n            // C1 - All math done through BoringMath (SWC-101)\\n            // C1: Our sun will swallow the earth well before this overflows\\n            data.strategyStartDate = (block.timestamp + STRATEGY_DELAY).to64();\\n            emit LogStrategyQueued(token, newStrategy);\\n        } else {\\n            require(data.strategyStartDate != 0 && block.timestamp >= data.strategyStartDate, \\\"StrategyManager: Too early\\\");\\n            if (address(strategy[token]) != address(0)) {\\n                int256 balanceChange = strategy[token].exit(data.balance);\\n                // Effects\\n                if (balanceChange > 0) {\\n                    uint256 add = uint256(balanceChange);\\n                    totals[token].addElastic(add);\\n                    emit LogStrategyProfit(token, add);\\n                } else if (balanceChange < 0) {\\n                    uint256 sub = uint256(-balanceChange);\\n                    totals[token].subElastic(sub);\\n                    emit LogStrategyLoss(token, sub);\\n                }\\n\\n                emit LogStrategyDivest(token, data.balance);\\n            }\\n            strategy[token] = pending;\\n            data.strategyStartDate = 0;\\n            data.balance = 0;\\n            pendingStrategy[token] = IStrategy(0);\\n            emit LogStrategySet(token, newStrategy);\\n        }\\n        strategyData[token] = data;\\n    }\\n\\n    /// @notice The actual process of yield farming. Executes the strategy of `token`.\\n    /// Optionally does housekeeping if `balance` is true.\\n    /// `maxChangeAmount` is relevant for skimming or withdrawing if `balance` is true.\\n    /// @param token The address of the token for which a strategy is deployed.\\n    /// @param balance True if housekeeping should be done.\\n    /// @param maxChangeAmount The maximum amount for either pulling or pushing from/to the `IStrategy` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Total amount is updated AFTER interaction. But strategy is under our control.\\n    // F5: Not followed to prevent reentrancy issues with flashloans and BentoBox skims?\\n    function harvest(\\n        IERC20 token,\\n        bool balance,\\n        uint256 maxChangeAmount\\n    ) public {\\n        StrategyData memory data = strategyData[token];\\n        IStrategy _strategy = strategy[token];\\n        int256 balanceChange = _strategy.harvest(data.balance, msg.sender);\\n        if (balanceChange == 0 && !balance) {\\n            return;\\n        }\\n\\n        uint256 totalElastic = totals[token].elastic;\\n\\n        if (balanceChange > 0) {\\n            uint256 add = uint256(balanceChange);\\n            totalElastic = totalElastic.add(add);\\n            totals[token].elastic = totalElastic.to128();\\n            emit LogStrategyProfit(token, add);\\n        } else if (balanceChange < 0) {\\n            // C1 - All math done through BoringMath (SWC-101)\\n            // C1: balanceChange could overflow if it's max negative int128.\\n            // But tokens with balances that large are not supported by the BentoBox.\\n            uint256 sub = uint256(-balanceChange);\\n            totalElastic = totalElastic.sub(sub);\\n            totals[token].elastic = totalElastic.to128();\\n            data.balance = data.balance.sub(sub.to128());\\n            emit LogStrategyLoss(token, sub);\\n        }\\n\\n        if (balance) {\\n            uint256 targetBalance = totalElastic.mul(data.targetPercentage) / 100;\\n            // if data.balance == targetBalance there is nothing to update\\n            if (data.balance < targetBalance) {\\n                uint256 amountOut = targetBalance.sub(data.balance);\\n                if (maxChangeAmount != 0 && amountOut > maxChangeAmount) {\\n                    amountOut = maxChangeAmount;\\n                }\\n                token.safeTransfer(address(_strategy), amountOut);\\n                data.balance = data.balance.add(amountOut.to128());\\n                _strategy.skim(amountOut);\\n                emit LogStrategyInvest(token, amountOut);\\n            } else if (data.balance > targetBalance) {\\n                uint256 amountIn = data.balance.sub(targetBalance.to128());\\n                if (maxChangeAmount != 0 && amountIn > maxChangeAmount) {\\n                    amountIn = maxChangeAmount;\\n                }\\n\\n                uint256 actualAmountIn = _strategy.withdraw(amountIn);\\n\\n                data.balance = data.balance.sub(actualAmountIn.to128());\\n                emit LogStrategyDivest(token, actualAmountIn);\\n            }\\n        }\\n\\n        strategyData[token] = data;\\n    }\\n\\n    // Contract should be able to receive ETH deposits to support deposit & skim\\n    // solhint-disable-next-line no-empty-blocks\\n    receive() external payable {}\\n}\\n\",\"keccak256\":\"0xf5251397b9aaa5c66ddc18b0cb96350ffac09f5776a1255fedc0072641f916fe\",\"license\":\"UNLICENSED\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "notice": "A library for performing overflow-/underflow-safe addition and subtraction on uint32.",
            "version": 1
          }
        },
        "BoringMath64": {
          "abi": [],
          "devdoc": {
            "kind": "dev",
            "methods": {},
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "60566023600b82828239805160001a607314601657fe5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220bb7d2f19c30d6ab8c2c059c191cc68d568b26a8f863597d05348c5254d7ab63f64736f6c634300060c0033",
              "opcodes": "PUSH1 0x56 PUSH1 0x23 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x16 JUMPI INVALID JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xBB PUSH30 0x2F19C30D6AB8C2C059C191CC68D568B26A8F863597D05348C5254D7AB63F PUSH5 0x736F6C6343 STOP MOD 0xC STOP CALLER ",
              "sourceMap": "8645:304:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220bb7d2f19c30d6ab8c2c059c191cc68d568b26a8f863597d05348c5254d7ab63f64736f6c634300060c0033",
              "opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xBB PUSH30 0x2F19C30D6AB8C2C059C191CC68D568B26A8F863597D05348C5254D7AB63F PUSH5 0x736F6C6343 STOP MOD 0xC STOP CALLER ",
              "sourceMap": "8645:304:0:-:0;;;;;;;;"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "17200",
                "executionCost": "97",
                "totalCost": "17297"
              },
              "internal": {
                "add(uint64,uint64)": "infinite",
                "sub(uint64,uint64)": "infinite"
              }
            },
            "methodIdentifiers": {}
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"A library for performing overflow-/underflow-safe addition and subtraction on uint64.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/bentobox/BentoBoxV1.sol\":\"BoringMath64\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/bentobox/BentoBoxV1.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\n// The BentoBox\\n\\n//  \\u2584\\u2584\\u2584\\u2584\\u00b7 \\u2584\\u2584\\u2584 . \\u2590 \\u2584 \\u2584\\u2584\\u2584\\u2584\\u2584      \\u2584\\u2584\\u2584\\u2584\\u00b7       \\u2590\\u2584\\u2022 \\u2584\\n//  \\u2590\\u2588 \\u2580\\u2588\\u25aa\\u2580\\u2584.\\u2580\\u00b7\\u2588\\u258c\\u2590\\u2588\\u2022\\u2588\\u2588  \\u25aa     \\u2590\\u2588 \\u2580\\u2588\\u25aa\\u25aa      \\u2588\\u258c\\u2588\\u258c\\u25aa\\n//  \\u2590\\u2588\\u2580\\u2580\\u2588\\u2584\\u2590\\u2580\\u2580\\u25aa\\u2584\\u2590\\u2588\\u2590\\u2590\\u258c \\u2590\\u2588.\\u25aa \\u2584\\u2588\\u2580\\u2584 \\u2590\\u2588\\u2580\\u2580\\u2588\\u2584 \\u2584\\u2588\\u2580\\u2584  \\u00b7\\u2588\\u2588\\u00b7\\n//  \\u2588\\u2588\\u2584\\u25aa\\u2590\\u2588\\u2590\\u2588\\u2584\\u2584\\u258c\\u2588\\u2588\\u2590\\u2588\\u258c \\u2590\\u2588\\u258c\\u00b7\\u2590\\u2588\\u258c.\\u2590\\u258c\\u2588\\u2588\\u2584\\u25aa\\u2590\\u2588\\u2590\\u2588\\u258c.\\u2590\\u258c\\u25aa\\u2590\\u2588\\u00b7\\u2588\\u258c\\n//  \\u00b7\\u2580\\u2580\\u2580\\u2580  \\u2580\\u2580\\u2580 \\u2580\\u2580 \\u2588\\u25aa \\u2580\\u2580\\u2580  \\u2580\\u2588\\u2584\\u2580\\u25aa\\u00b7\\u2580\\u2580\\u2580\\u2580  \\u2580\\u2588\\u2584\\u2580\\u25aa\\u2022\\u2580\\u2580 \\u2580\\u2580\\n\\n// This contract stores funds, handles their transfers, supports flash loans and strategies.\\n\\n// Copyright (c) 2021 BoringCrypto - All rights reserved\\n// Twitter: @Boring_Crypto\\n\\n// Special thanks to Keno for all his hard work and support\\n\\n// Version 22-Mar-2021\\n\\npragma solidity 0.6.12;\\npragma experimental ABIEncoderV2;\\n\\n// solhint-disable avoid-low-level-calls\\n// solhint-disable not-rely-on-time\\n// solhint-disable no-inline-assembly\\n\\n// File @boringcrypto/boring-solidity/contracts/interfaces/IERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ninterface IERC20 {\\n    function totalSupply() external view returns (uint256);\\n\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /// @notice EIP 2612\\n    function permit(\\n        address owner,\\n        address spender,\\n        uint256 value,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) external;\\n}\\n\\n// File contracts/interfaces/IFlashLoan.sol\\n// License-Identifier: MIT\\n\\ninterface IFlashBorrower {\\n    /// @notice The flashloan callback. `amount` + `fee` needs to repayed to msg.sender before this call returns.\\n    /// @param sender The address of the invoker of this flashloan.\\n    /// @param token The address of the token that is loaned.\\n    /// @param amount of the `token` that is loaned.\\n    /// @param fee The fee that needs to be paid on top for this loan. Needs to be the same as `token`.\\n    /// @param data Additional data that was passed to the flashloan function.\\n    function onFlashLoan(\\n        address sender,\\n        IERC20 token,\\n        uint256 amount,\\n        uint256 fee,\\n        bytes calldata data\\n    ) external;\\n}\\n\\ninterface IBatchFlashBorrower {\\n    /// @notice The callback for batched flashloans. Every amount + fee needs to repayed to msg.sender before this call returns.\\n    /// @param sender The address of the invoker of this flashloan.\\n    /// @param tokens Array of addresses for ERC-20 tokens that is loaned.\\n    /// @param amounts A one-to-one map to `tokens` that is loaned.\\n    /// @param fees A one-to-one map to `tokens` that needs to be paid on top for each loan. Needs to be the same token.\\n    /// @param data Additional data that was passed to the flashloan function.\\n    function onBatchFlashLoan(\\n        address sender,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        uint256[] calldata fees,\\n        bytes calldata data\\n    ) external;\\n}\\n\\n// File contracts/interfaces/IWETH.sol\\n// License-Identifier: MIT\\n\\ninterface IWETH {\\n    function deposit() external payable;\\n\\n    function withdraw(uint256) external;\\n}\\n\\n// File contracts/interfaces/IStrategy.sol\\n// License-Identifier: MIT\\n\\ninterface IStrategy {\\n    /// @notice Send the assets to the Strategy and call skim to invest them.\\n    /// @param amount The amount of tokens to invest.\\n    function skim(uint256 amount) external;\\n\\n    /// @notice Harvest any profits made converted to the asset and pass them to the caller.\\n    /// @param balance The amount of tokens the caller thinks it has invested.\\n    /// @param sender The address of the initiator of this transaction. Can be used for reimbursements, etc.\\n    /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.\\n    function harvest(uint256 balance, address sender) external returns (int256 amountAdded);\\n\\n    /// @notice Withdraw assets. The returned amount can differ from the requested amount due to rounding.\\n    /// @dev The `actualAmount` should be very close to the amount.\\n    /// The difference should NOT be used to report a loss. That's what harvest is for.\\n    /// @param amount The requested amount the caller wants to withdraw.\\n    /// @return actualAmount The real amount that is withdrawn.\\n    function withdraw(uint256 amount) external returns (uint256 actualAmount);\\n\\n    /// @notice Withdraw all assets in the safest way possible. This shouldn't fail.\\n    /// @param balance The amount of tokens the caller thinks it has invested.\\n    /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.\\n    function exit(uint256 balance) external returns (int256 amountAdded);\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\nlibrary BoringERC20 {\\n    bytes4 private constant SIG_SYMBOL = 0x95d89b41; // symbol()\\n    bytes4 private constant SIG_NAME = 0x06fdde03; // name()\\n    bytes4 private constant SIG_DECIMALS = 0x313ce567; // decimals()\\n    bytes4 private constant SIG_TRANSFER = 0xa9059cbb; // transfer(address,uint256)\\n    bytes4 private constant SIG_TRANSFER_FROM = 0x23b872dd; // transferFrom(address,address,uint256)\\n\\n    /// @notice Provides a safe ERC20.transfer version for different ERC-20 implementations.\\n    /// Reverts on a failed transfer.\\n    /// @param token The address of the ERC-20 token.\\n    /// @param to Transfer tokens to.\\n    /// @param amount The token amount.\\n    function safeTransfer(\\n        IERC20 token,\\n        address to,\\n        uint256 amount\\n    ) internal {\\n        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER, to, amount));\\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: Transfer failed\\\");\\n    }\\n\\n    /// @notice Provides a safe ERC20.transferFrom version for different ERC-20 implementations.\\n    /// Reverts on a failed transfer.\\n    /// @param token The address of the ERC-20 token.\\n    /// @param from Transfer tokens from.\\n    /// @param to Transfer tokens to.\\n    /// @param amount The token amount.\\n    function safeTransferFrom(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 amount\\n    ) internal {\\n        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER_FROM, from, to, amount));\\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: TransferFrom failed\\\");\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringMath.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n/// @notice A library for performing overflow-/underflow-safe math,\\n/// updated with awesomeness from of DappHub (https://github.com/dapphub/ds-math).\\nlibrary BoringMath {\\n    function add(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require(b == 0 || (c = a * b) / b == a, \\\"BoringMath: Mul Overflow\\\");\\n    }\\n\\n    function to128(uint256 a) internal pure returns (uint128 c) {\\n        require(a <= uint128(-1), \\\"BoringMath: uint128 Overflow\\\");\\n        c = uint128(a);\\n    }\\n\\n    function to64(uint256 a) internal pure returns (uint64 c) {\\n        require(a <= uint64(-1), \\\"BoringMath: uint64 Overflow\\\");\\n        c = uint64(a);\\n    }\\n\\n    function to32(uint256 a) internal pure returns (uint32 c) {\\n        require(a <= uint32(-1), \\\"BoringMath: uint32 Overflow\\\");\\n        c = uint32(a);\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint128.\\nlibrary BoringMath128 {\\n    function add(uint128 a, uint128 b) internal pure returns (uint128 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint128 a, uint128 b) internal pure returns (uint128 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint64.\\nlibrary BoringMath64 {\\n    function add(uint64 a, uint64 b) internal pure returns (uint64 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint64 a, uint64 b) internal pure returns (uint64 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint32.\\nlibrary BoringMath32 {\\n    function add(uint32 a, uint32 b) internal pure returns (uint32 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint32 a, uint32 b) internal pure returns (uint32 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringRebase.sol@v1.2.0\\n// License-Identifier: MIT\\n\\nstruct Rebase {\\n    uint128 elastic;\\n    uint128 base;\\n}\\n\\n/// @notice A rebasing library using overflow-/underflow-safe math.\\nlibrary RebaseLibrary {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n\\n    /// @notice Calculates the base value in relationship to `elastic` and `total`.\\n    function toBase(\\n        Rebase memory total,\\n        uint256 elastic,\\n        bool roundUp\\n    ) internal pure returns (uint256 base) {\\n        if (total.elastic == 0) {\\n            base = elastic;\\n        } else {\\n            base = elastic.mul(total.base) / total.elastic;\\n            if (roundUp && base.mul(total.elastic) / total.base < elastic) {\\n                base = base.add(1);\\n            }\\n        }\\n    }\\n\\n    /// @notice Calculates the elastic value in relationship to `base` and `total`.\\n    function toElastic(\\n        Rebase memory total,\\n        uint256 base,\\n        bool roundUp\\n    ) internal pure returns (uint256 elastic) {\\n        if (total.base == 0) {\\n            elastic = base;\\n        } else {\\n            elastic = base.mul(total.elastic) / total.base;\\n            if (roundUp && elastic.mul(total.base) / total.elastic < base) {\\n                elastic = elastic.add(1);\\n            }\\n        }\\n    }\\n\\n    /// @notice Add `elastic` to `total` and doubles `total.base`.\\n    /// @return (Rebase) The new total.\\n    /// @return base in relationship to `elastic`.\\n    function add(\\n        Rebase memory total,\\n        uint256 elastic,\\n        bool roundUp\\n    ) internal pure returns (Rebase memory, uint256 base) {\\n        base = toBase(total, elastic, roundUp);\\n        total.elastic = total.elastic.add(elastic.to128());\\n        total.base = total.base.add(base.to128());\\n        return (total, base);\\n    }\\n\\n    /// @notice Sub `base` from `total` and update `total.elastic`.\\n    /// @return (Rebase) The new total.\\n    /// @return elastic in relationship to `base`.\\n    function sub(\\n        Rebase memory total,\\n        uint256 base,\\n        bool roundUp\\n    ) internal pure returns (Rebase memory, uint256 elastic) {\\n        elastic = toElastic(total, base, roundUp);\\n        total.elastic = total.elastic.sub(elastic.to128());\\n        total.base = total.base.sub(base.to128());\\n        return (total, elastic);\\n    }\\n\\n    /// @notice Add `elastic` and `base` to `total`.\\n    function add(\\n        Rebase memory total,\\n        uint256 elastic,\\n        uint256 base\\n    ) internal pure returns (Rebase memory) {\\n        total.elastic = total.elastic.add(elastic.to128());\\n        total.base = total.base.add(base.to128());\\n        return total;\\n    }\\n\\n    /// @notice Subtract `elastic` and `base` to `total`.\\n    function sub(\\n        Rebase memory total,\\n        uint256 elastic,\\n        uint256 base\\n    ) internal pure returns (Rebase memory) {\\n        total.elastic = total.elastic.sub(elastic.to128());\\n        total.base = total.base.sub(base.to128());\\n        return total;\\n    }\\n\\n    /// @notice Add `elastic` to `total` and update storage.\\n    /// @return newElastic Returns updated `elastic`.\\n    function addElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {\\n        newElastic = total.elastic = total.elastic.add(elastic.to128());\\n    }\\n\\n    /// @notice Subtract `elastic` from `total` and update storage.\\n    /// @return newElastic Returns updated `elastic`.\\n    function subElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {\\n        newElastic = total.elastic = total.elastic.sub(elastic.to128());\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringOwnable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n// Source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol + Claimable.sol\\n// Edited by BoringCrypto\\n\\ncontract BoringOwnableData {\\n    address public owner;\\n    address public pendingOwner;\\n}\\n\\ncontract BoringOwnable is BoringOwnableData {\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /// @notice `owner` defaults to msg.sender on construction.\\n    constructor() public {\\n        owner = msg.sender;\\n        emit OwnershipTransferred(address(0), msg.sender);\\n    }\\n\\n    /// @notice Transfers ownership to `newOwner`. Either directly or claimable by the new pending owner.\\n    /// Can only be invoked by the current `owner`.\\n    /// @param newOwner Address of the new owner.\\n    /// @param direct True if `newOwner` should be set immediately. False if `newOwner` needs to use `claimOwnership`.\\n    /// @param renounce Allows the `newOwner` to be `address(0)` if `direct` and `renounce` is True. Has no effect otherwise.\\n    function transferOwnership(\\n        address newOwner,\\n        bool direct,\\n        bool renounce\\n    ) public onlyOwner {\\n        if (direct) {\\n            // Checks\\n            require(newOwner != address(0) || renounce, \\\"Ownable: zero address\\\");\\n\\n            // Effects\\n            emit OwnershipTransferred(owner, newOwner);\\n            owner = newOwner;\\n            pendingOwner = address(0);\\n        } else {\\n            // Effects\\n            pendingOwner = newOwner;\\n        }\\n    }\\n\\n    /// @notice Needs to be called by `pendingOwner` to claim ownership.\\n    function claimOwnership() public {\\n        address _pendingOwner = pendingOwner;\\n\\n        // Checks\\n        require(msg.sender == _pendingOwner, \\\"Ownable: caller != pending owner\\\");\\n\\n        // Effects\\n        emit OwnershipTransferred(owner, _pendingOwner);\\n        owner = _pendingOwner;\\n        pendingOwner = address(0);\\n    }\\n\\n    /// @notice Only allows the `owner` to execute the function.\\n    modifier onlyOwner() {\\n        require(msg.sender == owner, \\\"Ownable: caller is not the owner\\\");\\n        _;\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/interfaces/IMasterContract.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ninterface IMasterContract {\\n    /// @notice Init function that gets called from `BoringFactory.deploy`.\\n    /// Also kown as the constructor for cloned contracts.\\n    /// Any ETH send to `BoringFactory.deploy` ends up here.\\n    /// @param data Can be abi encoded arguments or anything else.\\n    function init(bytes calldata data) external payable;\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringFactory.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ncontract BoringFactory {\\n    event LogDeploy(address indexed masterContract, bytes data, address indexed cloneAddress);\\n\\n    /// @notice Mapping from clone contracts to their masterContract.\\n    mapping(address => address) public masterContractOf;\\n\\n    /// @notice Deploys a given master Contract as a clone.\\n    /// Any ETH transferred with this call is forwarded to the new clone.\\n    /// Emits `LogDeploy`.\\n    /// @param masterContract The address of the contract to clone.\\n    /// @param data Additional abi encoded calldata that is passed to the new clone via `IMasterContract.init`.\\n    /// @param useCreate2 Creates the clone by using the CREATE2 opcode, in this case `data` will be used as salt.\\n    /// @return cloneAddress Address of the created clone contract.\\n    function deploy(\\n        address masterContract,\\n        bytes calldata data,\\n        bool useCreate2\\n    ) public payable returns (address cloneAddress) {\\n        require(masterContract != address(0), \\\"BoringFactory: No masterContract\\\");\\n        bytes20 targetBytes = bytes20(masterContract); // Takes the first 20 bytes of the masterContract's address\\n\\n        if (useCreate2) {\\n            // each masterContract has different code already. So clones are distinguished by their data only.\\n            bytes32 salt = keccak256(data);\\n\\n            // Creates clone, more info here: https://blog.openzeppelin.com/deep-dive-into-the-minimal-proxy-contract/\\n            assembly {\\n                let clone := mload(0x40)\\n                mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n                mstore(add(clone, 0x14), targetBytes)\\n                mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n                cloneAddress := create2(0, clone, 0x37, salt)\\n            }\\n        } else {\\n            assembly {\\n                let clone := mload(0x40)\\n                mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n                mstore(add(clone, 0x14), targetBytes)\\n                mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n                cloneAddress := create(0, clone, 0x37)\\n            }\\n        }\\n        masterContractOf[cloneAddress] = masterContract;\\n\\n        IMasterContract(cloneAddress).init{value: msg.value}(data);\\n\\n        emit LogDeploy(masterContract, data, cloneAddress);\\n    }\\n}\\n\\n// File contracts/MasterContractManager.sol\\n// License-Identifier: UNLICENSED\\n\\ncontract MasterContractManager is BoringOwnable, BoringFactory {\\n    event LogWhiteListMasterContract(address indexed masterContract, bool approved);\\n    event LogSetMasterContractApproval(address indexed masterContract, address indexed user, bool approved);\\n    event LogRegisterProtocol(address indexed protocol);\\n\\n    /// @notice masterContract to user to approval state\\n    mapping(address => mapping(address => bool)) public masterContractApproved;\\n    /// @notice masterContract to whitelisted state for approval without signed message\\n    mapping(address => bool) public whitelistedMasterContracts;\\n    /// @notice user nonces for masterContract approvals\\n    mapping(address => uint256) public nonces;\\n\\n    bytes32 private constant DOMAIN_SEPARATOR_SIGNATURE_HASH = keccak256(\\\"EIP712Domain(string name,uint256 chainId,address verifyingContract)\\\");\\n    // See https://eips.ethereum.org/EIPS/eip-191\\n    string private constant EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA = \\\"\\\\x19\\\\x01\\\";\\n    bytes32 private constant APPROVAL_SIGNATURE_HASH =\\n        keccak256(\\\"SetMasterContractApproval(string warning,address user,address masterContract,bool approved,uint256 nonce)\\\");\\n\\n    // solhint-disable-next-line var-name-mixedcase\\n    bytes32 private immutable _DOMAIN_SEPARATOR;\\n    // solhint-disable-next-line var-name-mixedcase\\n    uint256 private immutable DOMAIN_SEPARATOR_CHAIN_ID;\\n\\n    constructor() public {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        _DOMAIN_SEPARATOR = _calculateDomainSeparator(DOMAIN_SEPARATOR_CHAIN_ID = chainId);\\n    }\\n\\n    function _calculateDomainSeparator(uint256 chainId) private view returns (bytes32) {\\n        return keccak256(abi.encode(DOMAIN_SEPARATOR_SIGNATURE_HASH, keccak256(\\\"BentoBox V1\\\"), chainId, address(this)));\\n    }\\n\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() public view returns (bytes32) {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        return chainId == DOMAIN_SEPARATOR_CHAIN_ID ? _DOMAIN_SEPARATOR : _calculateDomainSeparator(chainId);\\n    }\\n\\n    /// @notice Other contracts need to register with this master contract so that users can approve them for the BentoBox.\\n    function registerProtocol() public {\\n        masterContractOf[msg.sender] = msg.sender;\\n        emit LogRegisterProtocol(msg.sender);\\n    }\\n\\n    /// @notice Enables or disables a contract for approval without signed message.\\n    function whitelistMasterContract(address masterContract, bool approved) public onlyOwner {\\n        // Checks\\n        require(masterContract != address(0), \\\"MasterCMgr: Cannot approve 0\\\");\\n\\n        // Effects\\n        whitelistedMasterContracts[masterContract] = approved;\\n        emit LogWhiteListMasterContract(masterContract, approved);\\n    }\\n\\n    /// @notice Approves or revokes a `masterContract` access to `user` funds.\\n    /// @param user The address of the user that approves or revokes access.\\n    /// @param masterContract The address who gains or loses access.\\n    /// @param approved If True approves access. If False revokes access.\\n    /// @param v Part of the signature. (See EIP-191)\\n    /// @param r Part of the signature. (See EIP-191)\\n    /// @param s Part of the signature. (See EIP-191)\\n    // F4 - Check behaviour for all function arguments when wrong or extreme\\n    // F4: Don't allow masterContract 0 to be approved. Unknown contracts will have a masterContract of 0.\\n    // F4: User can't be 0 for signed approvals because the recoveredAddress will be 0 if ecrecover fails\\n    function setMasterContractApproval(\\n        address user,\\n        address masterContract,\\n        bool approved,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) public {\\n        // Checks\\n        require(masterContract != address(0), \\\"MasterCMgr: masterC not set\\\"); // Important for security\\n\\n        // If no signature is provided, the fallback is executed\\n        if (r == 0 && s == 0 && v == 0) {\\n            require(user == msg.sender, \\\"MasterCMgr: user not sender\\\");\\n            require(masterContractOf[user] == address(0), \\\"MasterCMgr: user is clone\\\");\\n            require(whitelistedMasterContracts[masterContract], \\\"MasterCMgr: not whitelisted\\\");\\n        } else {\\n            // Important for security - any address without masterContract has address(0) as masterContract\\n            // So approving address(0) would approve every address, leading to full loss of funds\\n            // Also, ecrecover returns address(0) on failure. So we check this:\\n            require(user != address(0), \\\"MasterCMgr: User cannot be 0\\\");\\n\\n            // C10 - Protect signatures against replay, use nonce and chainId (SWC-121)\\n            // C10: nonce + chainId are used to prevent replays\\n            // C11 - All signatures strictly EIP-712 (SWC-117 SWC-122)\\n            // C11: signature is EIP-712 compliant\\n            // C12 - abi.encodePacked can't contain variable length user input (SWC-133)\\n            // C12: abi.encodePacked has fixed length parameters\\n            bytes32 digest =\\n                keccak256(\\n                    abi.encodePacked(\\n                        EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA,\\n                        DOMAIN_SEPARATOR(),\\n                        keccak256(\\n                            abi.encode(\\n                                APPROVAL_SIGNATURE_HASH,\\n                                approved\\n                                    ? keccak256(\\\"Give FULL access to funds in (and approved to) BentoBox?\\\")\\n                                    : keccak256(\\\"Revoke access to BentoBox?\\\"),\\n                                user,\\n                                masterContract,\\n                                approved,\\n                                nonces[user]++\\n                            )\\n                        )\\n                    )\\n                );\\n            address recoveredAddress = ecrecover(digest, v, r, s);\\n            require(recoveredAddress == user, \\\"MasterCMgr: Invalid Signature\\\");\\n        }\\n\\n        // Effects\\n        masterContractApproved[masterContract][user] = approved;\\n        emit LogSetMasterContractApproval(masterContract, user, approved);\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringBatchable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ncontract BaseBoringBatchable {\\n    /// @dev Helper function to extract a useful revert message from a failed call.\\n    /// If the returned data is malformed or not correctly abi encoded then this call can fail itself.\\n    function _getRevertMsg(bytes memory _returnData) internal pure returns (string memory) {\\n        // If the _res length is less than 68, then the transaction failed silently (without a revert message)\\n        if (_returnData.length < 68) return \\\"Transaction reverted silently\\\";\\n\\n        assembly {\\n            // Slice the sighash.\\n            _returnData := add(_returnData, 0x04)\\n        }\\n        return abi.decode(_returnData, (string)); // All that remains is the revert string\\n    }\\n\\n    /// @notice Allows batched call to self (this contract).\\n    /// @param calls An array of inputs for each call.\\n    /// @param revertOnFail If True then reverts after a failed call and stops doing further calls.\\n    /// @return successes An array indicating the success of a call, mapped one-to-one to `calls`.\\n    /// @return results An array with the returned data of each function call, mapped one-to-one to `calls`.\\n    // F1: External is ok here because this is the batch function, adding it to a batch makes no sense\\n    // F2: Calls in the batch may be payable, delegatecall operates in the same context, so each call in the batch has access to msg.value\\n    // C3: The length of the loop is fully under user control, so can't be exploited\\n    // C7: Delegatecall is only used on the same contract, so it's safe\\n    function batch(bytes[] calldata calls, bool revertOnFail) external payable returns (bool[] memory successes, bytes[] memory results) {\\n        successes = new bool[](calls.length);\\n        results = new bytes[](calls.length);\\n        for (uint256 i = 0; i < calls.length; i++) {\\n            (bool success, bytes memory result) = address(this).delegatecall(calls[i]);\\n            require(success || !revertOnFail, _getRevertMsg(result));\\n            successes[i] = success;\\n            results[i] = result;\\n        }\\n    }\\n}\\n\\ncontract BoringBatchable is BaseBoringBatchable {\\n    /// @notice Call wrapper that performs `ERC20.permit` on `token`.\\n    /// Lookup `IERC20.permit`.\\n    // F6: Parameters can be used front-run the permit and the user's permit will fail (due to nonce or other revert)\\n    //     if part of a batch this could be used to grief once as the second call would not need the permit\\n    function permitToken(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) public {\\n        token.permit(from, to, amount, deadline, v, r, s);\\n    }\\n}\\n\\n// File contracts/BentoBox.sol\\n// License-Identifier: UNLICENSED\\n\\n/// @title BentoBox\\n/// @author BoringCrypto, Keno\\n/// @notice The BentoBox is a vault for tokens. The stored tokens can be flash loaned and used in strategies.\\n/// Yield from this will go to the token depositors.\\n/// Rebasing tokens ARE NOT supported and WILL cause loss of funds.\\n/// Any funds transfered directly onto the BentoBox will be lost, use the deposit function instead.\\ncontract BentoBoxV1 is MasterContractManager, BoringBatchable {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n    using BoringERC20 for IERC20;\\n    using RebaseLibrary for Rebase;\\n\\n    // ************** //\\n    // *** EVENTS *** //\\n    // ************** //\\n\\n    event LogDeposit(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogWithdraw(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogTransfer(IERC20 indexed token, address indexed from, address indexed to, uint256 share);\\n\\n    event LogFlashLoan(address indexed borrower, IERC20 indexed token, uint256 amount, uint256 feeAmount, address indexed receiver);\\n\\n    event LogStrategyTargetPercentage(IERC20 indexed token, uint256 targetPercentage);\\n    event LogStrategyQueued(IERC20 indexed token, IStrategy indexed strategy);\\n    event LogStrategySet(IERC20 indexed token, IStrategy indexed strategy);\\n    event LogStrategyInvest(IERC20 indexed token, uint256 amount);\\n    event LogStrategyDivest(IERC20 indexed token, uint256 amount);\\n    event LogStrategyProfit(IERC20 indexed token, uint256 amount);\\n    event LogStrategyLoss(IERC20 indexed token, uint256 amount);\\n\\n    // *************** //\\n    // *** STRUCTS *** //\\n    // *************** //\\n\\n    struct StrategyData {\\n        uint64 strategyStartDate;\\n        uint64 targetPercentage;\\n        uint128 balance; // the balance of the strategy that BentoBox thinks is in there\\n    }\\n\\n    // ******************************** //\\n    // *** CONSTANTS AND IMMUTABLES *** //\\n    // ******************************** //\\n\\n    // V2 - Can they be private?\\n    // V2: Private to save gas, to verify it's correct, check the constructor arguments\\n    IERC20 private immutable wethToken;\\n\\n    IERC20 private constant USE_ETHEREUM = IERC20(0);\\n    uint256 private constant FLASH_LOAN_FEE = 50; // 0.05%\\n    uint256 private constant FLASH_LOAN_FEE_PRECISION = 1e5;\\n    uint256 private constant STRATEGY_DELAY = 2 weeks;\\n    uint256 private constant MAX_TARGET_PERCENTAGE = 95; // 95%\\n    uint256 private constant MINIMUM_SHARE_BALANCE = 1000; // To prevent the ratio going off\\n\\n    // ***************** //\\n    // *** VARIABLES *** //\\n    // ***************** //\\n\\n    // Balance per token per address/contract in shares\\n    mapping(IERC20 => mapping(address => uint256)) public balanceOf;\\n\\n    // Rebase from amount to share\\n    mapping(IERC20 => Rebase) public totals;\\n\\n    mapping(IERC20 => IStrategy) public strategy;\\n    mapping(IERC20 => IStrategy) public pendingStrategy;\\n    mapping(IERC20 => StrategyData) public strategyData;\\n\\n    // ******************* //\\n    // *** CONSTRUCTOR *** //\\n    // ******************* //\\n\\n    constructor(IERC20 wethToken_) public {\\n        wethToken = wethToken_;\\n    }\\n\\n    // ***************** //\\n    // *** MODIFIERS *** //\\n    // ***************** //\\n\\n    /// Modifier to check if the msg.sender is allowed to use funds belonging to the 'from' address.\\n    /// If 'from' is msg.sender, it's allowed.\\n    /// If 'from' is the BentoBox itself, it's allowed. Any ETH, token balances (above the known balances) or BentoBox balances\\n    /// can be taken by anyone.\\n    /// This is to enable skimming, not just for deposits, but also for withdrawals or transfers, enabling better composability.\\n    /// If 'from' is a clone of a masterContract AND the 'from' address has approved that masterContract, it's allowed.\\n    modifier allowed(address from) {\\n        if (from != msg.sender && from != address(this)) {\\n            // From is sender or you are skimming\\n            address masterContract = masterContractOf[msg.sender];\\n            require(masterContract != address(0), \\\"BentoBox: no masterContract\\\");\\n            require(masterContractApproved[masterContract][from], \\\"BentoBox: Transfer not approved\\\");\\n        }\\n        _;\\n    }\\n\\n    // ************************** //\\n    // *** INTERNAL FUNCTIONS *** //\\n    // ************************** //\\n\\n    /// @dev Returns the total balance of `token` this contracts holds,\\n    /// plus the total amount this contract thinks the strategy holds.\\n    function _tokenBalanceOf(IERC20 token) internal view returns (uint256 amount) {\\n        amount = token.balanceOf(address(this)).add(strategyData[token].balance);\\n    }\\n\\n    // ************************ //\\n    // *** PUBLIC FUNCTIONS *** //\\n    // ************************ //\\n\\n    /// @dev Helper function to represent an `amount` of `token` in shares.\\n    /// @param token The ERC-20 token.\\n    /// @param amount The `token` amount.\\n    /// @param roundUp If the result `share` should be rounded up.\\n    /// @return share The token amount represented in shares.\\n    function toShare(\\n        IERC20 token,\\n        uint256 amount,\\n        bool roundUp\\n    ) external view returns (uint256 share) {\\n        share = totals[token].toBase(amount, roundUp);\\n    }\\n\\n    /// @dev Helper function represent shares back into the `token` amount.\\n    /// @param token The ERC-20 token.\\n    /// @param share The amount of shares.\\n    /// @param roundUp If the result should be rounded up.\\n    /// @return amount The share amount back into native representation.\\n    function toAmount(\\n        IERC20 token,\\n        uint256 share,\\n        bool roundUp\\n    ) external view returns (uint256 amount) {\\n        amount = totals[token].toElastic(share, roundUp);\\n    }\\n\\n    /// @notice Deposit an amount of `token` represented in either `amount` or `share`.\\n    /// @param token_ The ERC-20 token to deposit.\\n    /// @param from which account to pull the tokens.\\n    /// @param to which account to push the tokens.\\n    /// @param amount Token amount in native representation to deposit.\\n    /// @param share Token amount represented in shares to deposit. Takes precedence over `amount`.\\n    /// @return amountOut The amount deposited.\\n    /// @return shareOut The deposited amount repesented in shares.\\n    function deposit(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) public payable allowed(from) returns (uint256 amountOut, uint256 shareOut) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;\\n        Rebase memory total = totals[token];\\n\\n        // If a new token gets added, the tokenSupply call checks that this is a deployed contract. Needed for security.\\n        require(total.elastic != 0 || token.totalSupply() > 0, \\\"BentoBox: No tokens\\\");\\n        if (share == 0) {\\n            // value of the share may be lower than the amount due to rounding, that's ok\\n            share = total.toBase(amount, false);\\n            // Any deposit should lead to at least the minimum share balance, otherwise it's ignored (no amount taken)\\n            if (total.base.add(share.to128()) < MINIMUM_SHARE_BALANCE) {\\n                return (0, 0);\\n            }\\n        } else {\\n            // amount may be lower than the value of share due to rounding, in that case, add 1 to amount (Always round up)\\n            amount = total.toElastic(share, true);\\n        }\\n\\n        // In case of skimming, check that only the skimmable amount is taken.\\n        // For ETH, the full balance is available, so no need to check.\\n        // During flashloans the _tokenBalanceOf is lower than 'reality', so skimming deposits will mostly fail during a flashloan.\\n        require(\\n            from != address(this) || token_ == USE_ETHEREUM || amount <= _tokenBalanceOf(token).sub(total.elastic),\\n            \\\"BentoBox: Skim too much\\\"\\n        );\\n\\n        balanceOf[token][to] = balanceOf[token][to].add(share);\\n        total.base = total.base.add(share.to128());\\n        total.elastic = total.elastic.add(amount.to128());\\n        totals[token] = total;\\n\\n        // Interactions\\n        // During the first deposit, we check that this token is 'real'\\n        if (token_ == USE_ETHEREUM) {\\n            // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)\\n            // X2: If the WETH implementation is faulty or malicious, it will block adding ETH (but we know the WETH implementation)\\n            IWETH(address(wethToken)).deposit{value: amount}();\\n        } else if (from != address(this)) {\\n            // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)\\n            // X2: If the token implementation is faulty or malicious, it may block adding tokens. Good.\\n            token.safeTransferFrom(from, address(this), amount);\\n        }\\n        emit LogDeposit(token, from, to, amount, share);\\n        amountOut = amount;\\n        shareOut = share;\\n    }\\n\\n    /// @notice Withdraws an amount of `token` from a user account.\\n    /// @param token_ The ERC-20 token to withdraw.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param amount of tokens. Either one of `amount` or `share` needs to be supplied.\\n    /// @param share Like above, but `share` takes precedence over `amount`.\\n    function withdraw(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) public allowed(from) returns (uint256 amountOut, uint256 shareOut) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;\\n        Rebase memory total = totals[token];\\n        if (share == 0) {\\n            // value of the share paid could be lower than the amount paid due to rounding, in that case, add a share (Always round up)\\n            share = total.toBase(amount, true);\\n        } else {\\n            // amount may be lower than the value of share due to rounding, that's ok\\n            amount = total.toElastic(share, false);\\n        }\\n\\n        balanceOf[token][from] = balanceOf[token][from].sub(share);\\n        total.elastic = total.elastic.sub(amount.to128());\\n        total.base = total.base.sub(share.to128());\\n        // There have to be at least 1000 shares left to prevent reseting the share/amount ratio (unless it's fully emptied)\\n        require(total.base >= MINIMUM_SHARE_BALANCE || total.base == 0, \\\"BentoBox: cannot empty\\\");\\n        totals[token] = total;\\n\\n        // Interactions\\n        if (token_ == USE_ETHEREUM) {\\n            // X2, X3: A revert or big gas usage in the WETH contract could block withdrawals, but WETH9 is fine.\\n            IWETH(address(wethToken)).withdraw(amount);\\n            // X2, X3: A revert or big gas usage could block, however, the to address is under control of the caller.\\n            (bool success, ) = to.call{value: amount}(\\\"\\\");\\n            require(success, \\\"BentoBox: ETH transfer failed\\\");\\n        } else {\\n            // X2, X3: A malicious token could block withdrawal of just THAT token.\\n            //         masterContracts may want to take care not to rely on withdraw always succeeding.\\n            token.safeTransfer(to, amount);\\n        }\\n        emit LogWithdraw(token, from, to, amount, share);\\n        amountOut = amount;\\n        shareOut = share;\\n    }\\n\\n    /// @notice Transfer shares from a user account to another one.\\n    /// @param token The ERC-20 token to transfer.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param share The amount of `token` in shares.\\n    // Clones of master contracts can transfer from any account that has approved them\\n    // F3 - Can it be combined with another similar function?\\n    // F3: This isn't combined with transferMultiple for gas optimization\\n    function transfer(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 share\\n    ) public allowed(from) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        balanceOf[token][from] = balanceOf[token][from].sub(share);\\n        balanceOf[token][to] = balanceOf[token][to].add(share);\\n\\n        emit LogTransfer(token, from, to, share);\\n    }\\n\\n    /// @notice Transfer shares from a user account to multiple other ones.\\n    /// @param token The ERC-20 token to transfer.\\n    /// @param from which user to pull the tokens.\\n    /// @param tos The receivers of the tokens.\\n    /// @param shares The amount of `token` in shares for each receiver in `tos`.\\n    // F3 - Can it be combined with another similar function?\\n    // F3: This isn't combined with transfer for gas optimization\\n    function transferMultiple(\\n        IERC20 token,\\n        address from,\\n        address[] calldata tos,\\n        uint256[] calldata shares\\n    ) public allowed(from) {\\n        // Checks\\n        require(tos[0] != address(0), \\\"BentoBox: to[0] not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        uint256 totalAmount;\\n        uint256 len = tos.length;\\n        for (uint256 i = 0; i < len; i++) {\\n            address to = tos[i];\\n            balanceOf[token][to] = balanceOf[token][to].add(shares[i]);\\n            totalAmount = totalAmount.add(shares[i]);\\n            emit LogTransfer(token, from, to, shares[i]);\\n        }\\n        balanceOf[token][from] = balanceOf[token][from].sub(totalAmount);\\n    }\\n\\n    /// @notice Flashloan ability.\\n    /// @param borrower The address of the contract that implements and conforms to `IFlashBorrower` and handles the flashloan.\\n    /// @param receiver Address of the token receiver.\\n    /// @param token The address of the token to receive.\\n    /// @param amount of the tokens to receive.\\n    /// @param data The calldata to pass to the `borrower` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Not possible to follow this here, reentrancy has been reviewed\\n    // F6 - Check for front-running possibilities, such as the approve function (SWC-114)\\n    // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.\\n    function flashLoan(\\n        IFlashBorrower borrower,\\n        address receiver,\\n        IERC20 token,\\n        uint256 amount,\\n        bytes calldata data\\n    ) public {\\n        uint256 fee = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;\\n        token.safeTransfer(receiver, amount);\\n\\n        borrower.onFlashLoan(msg.sender, token, amount, fee, data);\\n\\n        require(_tokenBalanceOf(token) >= totals[token].addElastic(fee.to128()), \\\"BentoBox: Wrong amount\\\");\\n        emit LogFlashLoan(address(borrower), token, amount, fee, receiver);\\n    }\\n\\n    /// @notice Support for batched flashloans. Useful to request multiple different `tokens` in a single transaction.\\n    /// @param borrower The address of the contract that implements and conforms to `IBatchFlashBorrower` and handles the flashloan.\\n    /// @param receivers An array of the token receivers. A one-to-one mapping with `tokens` and `amounts`.\\n    /// @param tokens The addresses of the tokens.\\n    /// @param amounts of the tokens for each receiver.\\n    /// @param data The calldata to pass to the `borrower` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Not possible to follow this here, reentrancy has been reviewed\\n    // F6 - Check for front-running possibilities, such as the approve function (SWC-114)\\n    // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.\\n    function batchFlashLoan(\\n        IBatchFlashBorrower borrower,\\n        address[] calldata receivers,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        bytes calldata data\\n    ) public {\\n        uint256[] memory fees = new uint256[](tokens.length);\\n\\n        uint256 len = tokens.length;\\n        for (uint256 i = 0; i < len; i++) {\\n            uint256 amount = amounts[i];\\n            fees[i] = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;\\n\\n            tokens[i].safeTransfer(receivers[i], amounts[i]);\\n        }\\n\\n        borrower.onBatchFlashLoan(msg.sender, tokens, amounts, fees, data);\\n\\n        for (uint256 i = 0; i < len; i++) {\\n            IERC20 token = tokens[i];\\n            require(_tokenBalanceOf(token) >= totals[token].addElastic(fees[i].to128()), \\\"BentoBox: Wrong amount\\\");\\n            emit LogFlashLoan(address(borrower), token, amounts[i], fees[i], receivers[i]);\\n        }\\n    }\\n\\n    /// @notice Sets the target percentage of the strategy for `token`.\\n    /// @dev Only the owner of this contract is allowed to change this.\\n    /// @param token The address of the token that maps to a strategy to change.\\n    /// @param targetPercentage_ The new target in percent. Must be lesser or equal to `MAX_TARGET_PERCENTAGE`.\\n    function setStrategyTargetPercentage(IERC20 token, uint64 targetPercentage_) public onlyOwner {\\n        // Checks\\n        require(targetPercentage_ <= MAX_TARGET_PERCENTAGE, \\\"StrategyManager: Target too high\\\");\\n\\n        // Effects\\n        strategyData[token].targetPercentage = targetPercentage_;\\n        emit LogStrategyTargetPercentage(token, targetPercentage_);\\n    }\\n\\n    /// @notice Sets the contract address of a new strategy that conforms to `IStrategy` for `token`.\\n    /// Must be called twice with the same arguments.\\n    /// A new strategy becomes pending first and can be activated once `STRATEGY_DELAY` is over.\\n    /// @dev Only the owner of this contract is allowed to change this.\\n    /// @param token The address of the token that maps to a strategy to change.\\n    /// @param newStrategy The address of the contract that conforms to `IStrategy`.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Total amount is updated AFTER interaction. But strategy is under our control.\\n    // C4 - Use block.timestamp only for long intervals (SWC-116)\\n    // C4: block.timestamp is used for a period of 2 weeks, which is long enough\\n    function setStrategy(IERC20 token, IStrategy newStrategy) public onlyOwner {\\n        StrategyData memory data = strategyData[token];\\n        IStrategy pending = pendingStrategy[token];\\n        if (data.strategyStartDate == 0 || pending != newStrategy) {\\n            pendingStrategy[token] = newStrategy;\\n            // C1 - All math done through BoringMath (SWC-101)\\n            // C1: Our sun will swallow the earth well before this overflows\\n            data.strategyStartDate = (block.timestamp + STRATEGY_DELAY).to64();\\n            emit LogStrategyQueued(token, newStrategy);\\n        } else {\\n            require(data.strategyStartDate != 0 && block.timestamp >= data.strategyStartDate, \\\"StrategyManager: Too early\\\");\\n            if (address(strategy[token]) != address(0)) {\\n                int256 balanceChange = strategy[token].exit(data.balance);\\n                // Effects\\n                if (balanceChange > 0) {\\n                    uint256 add = uint256(balanceChange);\\n                    totals[token].addElastic(add);\\n                    emit LogStrategyProfit(token, add);\\n                } else if (balanceChange < 0) {\\n                    uint256 sub = uint256(-balanceChange);\\n                    totals[token].subElastic(sub);\\n                    emit LogStrategyLoss(token, sub);\\n                }\\n\\n                emit LogStrategyDivest(token, data.balance);\\n            }\\n            strategy[token] = pending;\\n            data.strategyStartDate = 0;\\n            data.balance = 0;\\n            pendingStrategy[token] = IStrategy(0);\\n            emit LogStrategySet(token, newStrategy);\\n        }\\n        strategyData[token] = data;\\n    }\\n\\n    /// @notice The actual process of yield farming. Executes the strategy of `token`.\\n    /// Optionally does housekeeping if `balance` is true.\\n    /// `maxChangeAmount` is relevant for skimming or withdrawing if `balance` is true.\\n    /// @param token The address of the token for which a strategy is deployed.\\n    /// @param balance True if housekeeping should be done.\\n    /// @param maxChangeAmount The maximum amount for either pulling or pushing from/to the `IStrategy` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Total amount is updated AFTER interaction. But strategy is under our control.\\n    // F5: Not followed to prevent reentrancy issues with flashloans and BentoBox skims?\\n    function harvest(\\n        IERC20 token,\\n        bool balance,\\n        uint256 maxChangeAmount\\n    ) public {\\n        StrategyData memory data = strategyData[token];\\n        IStrategy _strategy = strategy[token];\\n        int256 balanceChange = _strategy.harvest(data.balance, msg.sender);\\n        if (balanceChange == 0 && !balance) {\\n            return;\\n        }\\n\\n        uint256 totalElastic = totals[token].elastic;\\n\\n        if (balanceChange > 0) {\\n            uint256 add = uint256(balanceChange);\\n            totalElastic = totalElastic.add(add);\\n            totals[token].elastic = totalElastic.to128();\\n            emit LogStrategyProfit(token, add);\\n        } else if (balanceChange < 0) {\\n            // C1 - All math done through BoringMath (SWC-101)\\n            // C1: balanceChange could overflow if it's max negative int128.\\n            // But tokens with balances that large are not supported by the BentoBox.\\n            uint256 sub = uint256(-balanceChange);\\n            totalElastic = totalElastic.sub(sub);\\n            totals[token].elastic = totalElastic.to128();\\n            data.balance = data.balance.sub(sub.to128());\\n            emit LogStrategyLoss(token, sub);\\n        }\\n\\n        if (balance) {\\n            uint256 targetBalance = totalElastic.mul(data.targetPercentage) / 100;\\n            // if data.balance == targetBalance there is nothing to update\\n            if (data.balance < targetBalance) {\\n                uint256 amountOut = targetBalance.sub(data.balance);\\n                if (maxChangeAmount != 0 && amountOut > maxChangeAmount) {\\n                    amountOut = maxChangeAmount;\\n                }\\n                token.safeTransfer(address(_strategy), amountOut);\\n                data.balance = data.balance.add(amountOut.to128());\\n                _strategy.skim(amountOut);\\n                emit LogStrategyInvest(token, amountOut);\\n            } else if (data.balance > targetBalance) {\\n                uint256 amountIn = data.balance.sub(targetBalance.to128());\\n                if (maxChangeAmount != 0 && amountIn > maxChangeAmount) {\\n                    amountIn = maxChangeAmount;\\n                }\\n\\n                uint256 actualAmountIn = _strategy.withdraw(amountIn);\\n\\n                data.balance = data.balance.sub(actualAmountIn.to128());\\n                emit LogStrategyDivest(token, actualAmountIn);\\n            }\\n        }\\n\\n        strategyData[token] = data;\\n    }\\n\\n    // Contract should be able to receive ETH deposits to support deposit & skim\\n    // solhint-disable-next-line no-empty-blocks\\n    receive() external payable {}\\n}\\n\",\"keccak256\":\"0xf5251397b9aaa5c66ddc18b0cb96350ffac09f5776a1255fedc0072641f916fe\",\"license\":\"UNLICENSED\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "notice": "A library for performing overflow-/underflow-safe addition and subtraction on uint64.",
            "version": 1
          }
        },
        "BoringOwnable": {
          "abi": [
            {
              "inputs": [],
              "stateMutability": "nonpayable",
              "type": "constructor"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "previousOwner",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "newOwner",
                  "type": "address"
                }
              ],
              "name": "OwnershipTransferred",
              "type": "event"
            },
            {
              "inputs": [],
              "name": "claimOwnership",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "owner",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "pendingOwner",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "newOwner",
                  "type": "address"
                },
                {
                  "internalType": "bool",
                  "name": "direct",
                  "type": "bool"
                },
                {
                  "internalType": "bool",
                  "name": "renounce",
                  "type": "bool"
                }
              ],
              "name": "transferOwnership",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {
              "transferOwnership(address,bool,bool)": {
                "params": {
                  "direct": "True if `newOwner` should be set immediately. False if `newOwner` needs to use `claimOwnership`.",
                  "newOwner": "Address of the new owner.",
                  "renounce": "Allows the `newOwner` to be `address(0)` if `direct` and `renounce` is True. Has no effect otherwise."
                }
              }
            },
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b50600080546001600160a01b0319163390811782556040519091907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a36103778061005f6000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c8063078dfbe7146100515780634e71e0c8146100665780638da5cb5b1461006e578063e30c39781461008c575b600080fd5b61006461005f36600461022e565b610094565b005b610064610183565b610076610210565b6040516100839190610283565b60405180910390f35b61007661021f565b6000546001600160a01b031633146100c75760405162461bcd60e51b81526004016100be906102c6565b60405180910390fd5b8115610162576001600160a01b0383161515806100e15750805b6100fd5760405162461bcd60e51b81526004016100be90610297565b600080546040516001600160a01b03808716939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0385166001600160a01b03199182161790915560018054909116905561017e565b600180546001600160a01b0319166001600160a01b0385161790555b505050565b6001546001600160a01b03163381146101ae5760405162461bcd60e51b81526004016100be906102fb565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b039092166001600160a01b0319928316179055600180549091169055565b6000546001600160a01b031681565b6001546001600160a01b031681565b600080600060608486031215610242578283fd5b83356001600160a01b0381168114610258578384fd5b9250602084013561026881610330565b9150604084013561027881610330565b809150509250925092565b6001600160a01b0391909116815260200190565b6020808252601590820152744f776e61626c653a207a65726f206164647265737360581b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c657220213d2070656e64696e67206f776e6572604082015260600190565b801515811461033e57600080fd5b5056fea264697066735822122002580ddbe3feee0d8e3a3f0cbb1036a47a302579c2435547d39dfd9f8b1ba56264736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND CALLER SWAP1 DUP2 OR DUP3 SSTORE PUSH1 0x40 MLOAD SWAP1 SWAP2 SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP3 SWAP1 LOG3 PUSH2 0x377 DUP1 PUSH2 0x5F PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x4C JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x78DFBE7 EQ PUSH2 0x51 JUMPI DUP1 PUSH4 0x4E71E0C8 EQ PUSH2 0x66 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x6E JUMPI DUP1 PUSH4 0xE30C3978 EQ PUSH2 0x8C JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x64 PUSH2 0x5F CALLDATASIZE PUSH1 0x4 PUSH2 0x22E JUMP JUMPDEST PUSH2 0x94 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x64 PUSH2 0x183 JUMP JUMPDEST PUSH2 0x76 PUSH2 0x210 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x83 SWAP2 SWAP1 PUSH2 0x283 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x76 PUSH2 0x21F JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0xC7 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xBE SWAP1 PUSH2 0x2C6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP2 ISZERO PUSH2 0x162 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND ISZERO ISZERO DUP1 PUSH2 0xE1 JUMPI POP DUP1 JUMPDEST PUSH2 0xFD JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xBE SWAP1 PUSH2 0x297 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP8 AND SWAP4 SWAP3 AND SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 LOG3 PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP2 DUP3 AND OR SWAP1 SWAP2 SSTORE PUSH1 0x1 DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SSTORE PUSH2 0x17E JUMP JUMPDEST PUSH1 0x1 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND OR SWAP1 SSTORE JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER DUP2 EQ PUSH2 0x1AE JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xBE SWAP1 PUSH2 0x2FB JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND SWAP4 SWAP3 AND SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 LOG3 PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP3 DUP4 AND OR SWAP1 SSTORE PUSH1 0x1 DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x242 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x258 JUMPI DUP4 DUP5 REVERT JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x268 DUP2 PUSH2 0x330 JUMP JUMPDEST SWAP2 POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH2 0x278 DUP2 PUSH2 0x330 JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x15 SWAP1 DUP3 ADD MSTORE PUSH21 0x4F776E61626C653A207A65726F2061646472657373 PUSH1 0x58 SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 DUP2 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 DUP2 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C657220213D2070656E64696E67206F776E6572 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x33E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 MUL PC 0xD 0xDB 0xE3 INVALID 0xEE 0xD DUP15 GASPRICE EXTCODEHASH 0xC 0xBB LT CALLDATASIZE LOG4 PUSH27 0x302579C2435547D39DFD9F8B1BA56264736F6C634300060C003300 ",
              "sourceMap": "13346:1862:0:-:0;;;13550:115;;;;;;;;;-1:-1:-1;13581:5:0;:18;;-1:-1:-1;;;;;;13581:18:0;13589:10;13581:18;;;;;13614:44;;13589:10;;13581:5;13614:44;;13581:5;;13614:44;13346:1862;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b506004361061004c5760003560e01c8063078dfbe7146100515780634e71e0c8146100665780638da5cb5b1461006e578063e30c39781461008c575b600080fd5b61006461005f36600461022e565b610094565b005b610064610183565b610076610210565b6040516100839190610283565b60405180910390f35b61007661021f565b6000546001600160a01b031633146100c75760405162461bcd60e51b81526004016100be906102c6565b60405180910390fd5b8115610162576001600160a01b0383161515806100e15750805b6100fd5760405162461bcd60e51b81526004016100be90610297565b600080546040516001600160a01b03808716939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0385166001600160a01b03199182161790915560018054909116905561017e565b600180546001600160a01b0319166001600160a01b0385161790555b505050565b6001546001600160a01b03163381146101ae5760405162461bcd60e51b81526004016100be906102fb565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b039092166001600160a01b0319928316179055600180549091169055565b6000546001600160a01b031681565b6001546001600160a01b031681565b600080600060608486031215610242578283fd5b83356001600160a01b0381168114610258578384fd5b9250602084013561026881610330565b9150604084013561027881610330565b809150509250925092565b6001600160a01b0391909116815260200190565b6020808252601590820152744f776e61626c653a207a65726f206164647265737360581b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c657220213d2070656e64696e67206f776e6572604082015260600190565b801515811461033e57600080fd5b5056fea264697066735822122002580ddbe3feee0d8e3a3f0cbb1036a47a302579c2435547d39dfd9f8b1ba56264736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x4C JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x78DFBE7 EQ PUSH2 0x51 JUMPI DUP1 PUSH4 0x4E71E0C8 EQ PUSH2 0x66 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x6E JUMPI DUP1 PUSH4 0xE30C3978 EQ PUSH2 0x8C JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x64 PUSH2 0x5F CALLDATASIZE PUSH1 0x4 PUSH2 0x22E JUMP JUMPDEST PUSH2 0x94 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x64 PUSH2 0x183 JUMP JUMPDEST PUSH2 0x76 PUSH2 0x210 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x83 SWAP2 SWAP1 PUSH2 0x283 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x76 PUSH2 0x21F JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0xC7 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xBE SWAP1 PUSH2 0x2C6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP2 ISZERO PUSH2 0x162 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND ISZERO ISZERO DUP1 PUSH2 0xE1 JUMPI POP DUP1 JUMPDEST PUSH2 0xFD JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xBE SWAP1 PUSH2 0x297 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP8 AND SWAP4 SWAP3 AND SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 LOG3 PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP2 DUP3 AND OR SWAP1 SWAP2 SSTORE PUSH1 0x1 DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SSTORE PUSH2 0x17E JUMP JUMPDEST PUSH1 0x1 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND OR SWAP1 SSTORE JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER DUP2 EQ PUSH2 0x1AE JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xBE SWAP1 PUSH2 0x2FB JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND SWAP4 SWAP3 AND SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 LOG3 PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP3 DUP4 AND OR SWAP1 SSTORE PUSH1 0x1 DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x242 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x258 JUMPI DUP4 DUP5 REVERT JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x268 DUP2 PUSH2 0x330 JUMP JUMPDEST SWAP2 POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH2 0x278 DUP2 PUSH2 0x330 JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x15 SWAP1 DUP3 ADD MSTORE PUSH21 0x4F776E61626C653A207A65726F2061646472657373 PUSH1 0x58 SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 DUP2 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 DUP2 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C657220213D2070656E64696E67206F776E6572 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x33E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 MUL PC 0xD 0xDB 0xE3 INVALID 0xEE 0xD DUP15 GASPRICE EXTCODEHASH 0xC 0xBB LT CALLDATASIZE LOG4 PUSH27 0x302579C2435547D39DFD9F8B1BA56264736F6C634300060C003300 ",
              "sourceMap": "13346:1862:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14124:489;;;;;;:::i;:::-;;:::i;:::-;;14692:330;;;:::i;13288:20::-;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13314:27;;;:::i;14124:489::-;15146:5;;-1:-1:-1;;;;;15146:5:0;15132:10;:19;15124:64;;;;-1:-1:-1;;;15124:64:0;;;;;;;:::i;:::-;;;;;;;;;14258:6:::1;14254:353;;;-1:-1:-1::0;;;;;14310:22:0;::::1;::::0;::::1;::::0;:34:::1;;;14336:8;14310:34;14302:68;;;;-1:-1:-1::0;;;14302:68:0::1;;;;;;;:::i;:::-;14434:5;::::0;;14413:37:::1;::::0;-1:-1:-1;;;;;14413:37:0;;::::1;::::0;14434:5;::::1;::::0;14413:37:::1;::::0;::::1;14464:5;:16:::0;;-1:-1:-1;;;;;14464:16:0;::::1;-1:-1:-1::0;;;;;;14464:16:0;;::::1;;::::0;;;;14494:25;;;;::::1;::::0;;14254:353:::1;;;14573:12;:23:::0;;-1:-1:-1;;;;;;14573:23:0::1;-1:-1:-1::0;;;;;14573:23:0;::::1;;::::0;;14254:353:::1;14124:489:::0;;;:::o;14692:330::-;14759:12;;-1:-1:-1;;;;;14759:12:0;14808:10;:27;;14800:72;;;;-1:-1:-1;;;14800:72:0;;;;;;;:::i;:::-;14928:5;;;14907:42;;-1:-1:-1;;;;;14907:42:0;;;;14928:5;;;14907:42;;;14959:5;:21;;-1:-1:-1;;;;;14959:21:0;;;-1:-1:-1;;;;;;14959:21:0;;;;;;;14990:25;;;;;;;14692:330::o;13288:20::-;;;-1:-1:-1;;;;;13288:20:0;;:::o;13314:27::-;;;-1:-1:-1;;;;;13314:27:0;;:::o;273:479:-1:-;;;;405:2;393:9;384:7;380:23;376:32;373:2;;;-1:-1;;411:12;373:2;72:20;;-1:-1;;;;;3813:54;;3938:35;;3928:2;;-1:-1;;3977:12;3928:2;463:63;-1:-1;563:2;599:22;;206:20;231:30;206:20;231:30;:::i;:::-;571:60;-1:-1;668:2;704:22;;206:20;231:30;206:20;231:30;:::i;:::-;676:60;;;;367:385;;;;;:::o;1891:222::-;-1:-1;;;;;3813:54;;;;830:37;;2018:2;2003:18;;1989:124::o;2120:416::-;2320:2;2334:47;;;1104:2;2305:18;;;3493:19;-1:-1;;;3533:14;;;1120:44;1183:12;;;2291:245::o;2543:416::-;2743:2;2757:47;;;2728:18;;;3493:19;1470:34;3533:14;;;1450:55;1524:12;;;2714:245::o;2966:416::-;3166:2;3180:47;;;3151:18;;;3493:19;1811:34;3533:14;;;1791:55;1865:12;;;3137:245::o;4003:111::-;4084:5;3725:13;3718:21;4062:5;4059:32;4049:2;;4105:1;;4095:12;4049:2;4043:71;:::o"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "177400",
                "executionCost": "22588",
                "totalCost": "199988"
              },
              "external": {
                "claimOwnership()": "45022",
                "owner()": "1092",
                "pendingOwner()": "1114",
                "transferOwnership(address,bool,bool)": "infinite"
              }
            },
            "methodIdentifiers": {
              "claimOwnership()": "4e71e0c8",
              "owner()": "8da5cb5b",
              "pendingOwner()": "e30c3978",
              "transferOwnership(address,bool,bool)": "078dfbe7"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"claimOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pendingOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"direct\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"renounce\",\"type\":\"bool\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"transferOwnership(address,bool,bool)\":{\"params\":{\"direct\":\"True if `newOwner` should be set immediately. False if `newOwner` needs to use `claimOwnership`.\",\"newOwner\":\"Address of the new owner.\",\"renounce\":\"Allows the `newOwner` to be `address(0)` if `direct` and `renounce` is True. Has no effect otherwise.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"claimOwnership()\":{\"notice\":\"Needs to be called by `pendingOwner` to claim ownership.\"},\"constructor\":\"`owner` defaults to msg.sender on construction.\",\"transferOwnership(address,bool,bool)\":{\"notice\":\"Transfers ownership to `newOwner`. Either directly or claimable by the new pending owner. Can only be invoked by the current `owner`.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/bentobox/BentoBoxV1.sol\":\"BoringOwnable\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/bentobox/BentoBoxV1.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\n// The BentoBox\\n\\n//  \\u2584\\u2584\\u2584\\u2584\\u00b7 \\u2584\\u2584\\u2584 . \\u2590 \\u2584 \\u2584\\u2584\\u2584\\u2584\\u2584      \\u2584\\u2584\\u2584\\u2584\\u00b7       \\u2590\\u2584\\u2022 \\u2584\\n//  \\u2590\\u2588 \\u2580\\u2588\\u25aa\\u2580\\u2584.\\u2580\\u00b7\\u2588\\u258c\\u2590\\u2588\\u2022\\u2588\\u2588  \\u25aa     \\u2590\\u2588 \\u2580\\u2588\\u25aa\\u25aa      \\u2588\\u258c\\u2588\\u258c\\u25aa\\n//  \\u2590\\u2588\\u2580\\u2580\\u2588\\u2584\\u2590\\u2580\\u2580\\u25aa\\u2584\\u2590\\u2588\\u2590\\u2590\\u258c \\u2590\\u2588.\\u25aa \\u2584\\u2588\\u2580\\u2584 \\u2590\\u2588\\u2580\\u2580\\u2588\\u2584 \\u2584\\u2588\\u2580\\u2584  \\u00b7\\u2588\\u2588\\u00b7\\n//  \\u2588\\u2588\\u2584\\u25aa\\u2590\\u2588\\u2590\\u2588\\u2584\\u2584\\u258c\\u2588\\u2588\\u2590\\u2588\\u258c \\u2590\\u2588\\u258c\\u00b7\\u2590\\u2588\\u258c.\\u2590\\u258c\\u2588\\u2588\\u2584\\u25aa\\u2590\\u2588\\u2590\\u2588\\u258c.\\u2590\\u258c\\u25aa\\u2590\\u2588\\u00b7\\u2588\\u258c\\n//  \\u00b7\\u2580\\u2580\\u2580\\u2580  \\u2580\\u2580\\u2580 \\u2580\\u2580 \\u2588\\u25aa \\u2580\\u2580\\u2580  \\u2580\\u2588\\u2584\\u2580\\u25aa\\u00b7\\u2580\\u2580\\u2580\\u2580  \\u2580\\u2588\\u2584\\u2580\\u25aa\\u2022\\u2580\\u2580 \\u2580\\u2580\\n\\n// This contract stores funds, handles their transfers, supports flash loans and strategies.\\n\\n// Copyright (c) 2021 BoringCrypto - All rights reserved\\n// Twitter: @Boring_Crypto\\n\\n// Special thanks to Keno for all his hard work and support\\n\\n// Version 22-Mar-2021\\n\\npragma solidity 0.6.12;\\npragma experimental ABIEncoderV2;\\n\\n// solhint-disable avoid-low-level-calls\\n// solhint-disable not-rely-on-time\\n// solhint-disable no-inline-assembly\\n\\n// File @boringcrypto/boring-solidity/contracts/interfaces/IERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ninterface IERC20 {\\n    function totalSupply() external view returns (uint256);\\n\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /// @notice EIP 2612\\n    function permit(\\n        address owner,\\n        address spender,\\n        uint256 value,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) external;\\n}\\n\\n// File contracts/interfaces/IFlashLoan.sol\\n// License-Identifier: MIT\\n\\ninterface IFlashBorrower {\\n    /// @notice The flashloan callback. `amount` + `fee` needs to repayed to msg.sender before this call returns.\\n    /// @param sender The address of the invoker of this flashloan.\\n    /// @param token The address of the token that is loaned.\\n    /// @param amount of the `token` that is loaned.\\n    /// @param fee The fee that needs to be paid on top for this loan. Needs to be the same as `token`.\\n    /// @param data Additional data that was passed to the flashloan function.\\n    function onFlashLoan(\\n        address sender,\\n        IERC20 token,\\n        uint256 amount,\\n        uint256 fee,\\n        bytes calldata data\\n    ) external;\\n}\\n\\ninterface IBatchFlashBorrower {\\n    /// @notice The callback for batched flashloans. Every amount + fee needs to repayed to msg.sender before this call returns.\\n    /// @param sender The address of the invoker of this flashloan.\\n    /// @param tokens Array of addresses for ERC-20 tokens that is loaned.\\n    /// @param amounts A one-to-one map to `tokens` that is loaned.\\n    /// @param fees A one-to-one map to `tokens` that needs to be paid on top for each loan. Needs to be the same token.\\n    /// @param data Additional data that was passed to the flashloan function.\\n    function onBatchFlashLoan(\\n        address sender,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        uint256[] calldata fees,\\n        bytes calldata data\\n    ) external;\\n}\\n\\n// File contracts/interfaces/IWETH.sol\\n// License-Identifier: MIT\\n\\ninterface IWETH {\\n    function deposit() external payable;\\n\\n    function withdraw(uint256) external;\\n}\\n\\n// File contracts/interfaces/IStrategy.sol\\n// License-Identifier: MIT\\n\\ninterface IStrategy {\\n    /// @notice Send the assets to the Strategy and call skim to invest them.\\n    /// @param amount The amount of tokens to invest.\\n    function skim(uint256 amount) external;\\n\\n    /// @notice Harvest any profits made converted to the asset and pass them to the caller.\\n    /// @param balance The amount of tokens the caller thinks it has invested.\\n    /// @param sender The address of the initiator of this transaction. Can be used for reimbursements, etc.\\n    /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.\\n    function harvest(uint256 balance, address sender) external returns (int256 amountAdded);\\n\\n    /// @notice Withdraw assets. The returned amount can differ from the requested amount due to rounding.\\n    /// @dev The `actualAmount` should be very close to the amount.\\n    /// The difference should NOT be used to report a loss. That's what harvest is for.\\n    /// @param amount The requested amount the caller wants to withdraw.\\n    /// @return actualAmount The real amount that is withdrawn.\\n    function withdraw(uint256 amount) external returns (uint256 actualAmount);\\n\\n    /// @notice Withdraw all assets in the safest way possible. This shouldn't fail.\\n    /// @param balance The amount of tokens the caller thinks it has invested.\\n    /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.\\n    function exit(uint256 balance) external returns (int256 amountAdded);\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\nlibrary BoringERC20 {\\n    bytes4 private constant SIG_SYMBOL = 0x95d89b41; // symbol()\\n    bytes4 private constant SIG_NAME = 0x06fdde03; // name()\\n    bytes4 private constant SIG_DECIMALS = 0x313ce567; // decimals()\\n    bytes4 private constant SIG_TRANSFER = 0xa9059cbb; // transfer(address,uint256)\\n    bytes4 private constant SIG_TRANSFER_FROM = 0x23b872dd; // transferFrom(address,address,uint256)\\n\\n    /// @notice Provides a safe ERC20.transfer version for different ERC-20 implementations.\\n    /// Reverts on a failed transfer.\\n    /// @param token The address of the ERC-20 token.\\n    /// @param to Transfer tokens to.\\n    /// @param amount The token amount.\\n    function safeTransfer(\\n        IERC20 token,\\n        address to,\\n        uint256 amount\\n    ) internal {\\n        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER, to, amount));\\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: Transfer failed\\\");\\n    }\\n\\n    /// @notice Provides a safe ERC20.transferFrom version for different ERC-20 implementations.\\n    /// Reverts on a failed transfer.\\n    /// @param token The address of the ERC-20 token.\\n    /// @param from Transfer tokens from.\\n    /// @param to Transfer tokens to.\\n    /// @param amount The token amount.\\n    function safeTransferFrom(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 amount\\n    ) internal {\\n        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER_FROM, from, to, amount));\\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: TransferFrom failed\\\");\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringMath.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n/// @notice A library for performing overflow-/underflow-safe math,\\n/// updated with awesomeness from of DappHub (https://github.com/dapphub/ds-math).\\nlibrary BoringMath {\\n    function add(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require(b == 0 || (c = a * b) / b == a, \\\"BoringMath: Mul Overflow\\\");\\n    }\\n\\n    function to128(uint256 a) internal pure returns (uint128 c) {\\n        require(a <= uint128(-1), \\\"BoringMath: uint128 Overflow\\\");\\n        c = uint128(a);\\n    }\\n\\n    function to64(uint256 a) internal pure returns (uint64 c) {\\n        require(a <= uint64(-1), \\\"BoringMath: uint64 Overflow\\\");\\n        c = uint64(a);\\n    }\\n\\n    function to32(uint256 a) internal pure returns (uint32 c) {\\n        require(a <= uint32(-1), \\\"BoringMath: uint32 Overflow\\\");\\n        c = uint32(a);\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint128.\\nlibrary BoringMath128 {\\n    function add(uint128 a, uint128 b) internal pure returns (uint128 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint128 a, uint128 b) internal pure returns (uint128 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint64.\\nlibrary BoringMath64 {\\n    function add(uint64 a, uint64 b) internal pure returns (uint64 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint64 a, uint64 b) internal pure returns (uint64 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint32.\\nlibrary BoringMath32 {\\n    function add(uint32 a, uint32 b) internal pure returns (uint32 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint32 a, uint32 b) internal pure returns (uint32 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringRebase.sol@v1.2.0\\n// License-Identifier: MIT\\n\\nstruct Rebase {\\n    uint128 elastic;\\n    uint128 base;\\n}\\n\\n/// @notice A rebasing library using overflow-/underflow-safe math.\\nlibrary RebaseLibrary {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n\\n    /// @notice Calculates the base value in relationship to `elastic` and `total`.\\n    function toBase(\\n        Rebase memory total,\\n        uint256 elastic,\\n        bool roundUp\\n    ) internal pure returns (uint256 base) {\\n        if (total.elastic == 0) {\\n            base = elastic;\\n        } else {\\n            base = elastic.mul(total.base) / total.elastic;\\n            if (roundUp && base.mul(total.elastic) / total.base < elastic) {\\n                base = base.add(1);\\n            }\\n        }\\n    }\\n\\n    /// @notice Calculates the elastic value in relationship to `base` and `total`.\\n    function toElastic(\\n        Rebase memory total,\\n        uint256 base,\\n        bool roundUp\\n    ) internal pure returns (uint256 elastic) {\\n        if (total.base == 0) {\\n            elastic = base;\\n        } else {\\n            elastic = base.mul(total.elastic) / total.base;\\n            if (roundUp && elastic.mul(total.base) / total.elastic < base) {\\n                elastic = elastic.add(1);\\n            }\\n        }\\n    }\\n\\n    /// @notice Add `elastic` to `total` and doubles `total.base`.\\n    /// @return (Rebase) The new total.\\n    /// @return base in relationship to `elastic`.\\n    function add(\\n        Rebase memory total,\\n        uint256 elastic,\\n        bool roundUp\\n    ) internal pure returns (Rebase memory, uint256 base) {\\n        base = toBase(total, elastic, roundUp);\\n        total.elastic = total.elastic.add(elastic.to128());\\n        total.base = total.base.add(base.to128());\\n        return (total, base);\\n    }\\n\\n    /// @notice Sub `base` from `total` and update `total.elastic`.\\n    /// @return (Rebase) The new total.\\n    /// @return elastic in relationship to `base`.\\n    function sub(\\n        Rebase memory total,\\n        uint256 base,\\n        bool roundUp\\n    ) internal pure returns (Rebase memory, uint256 elastic) {\\n        elastic = toElastic(total, base, roundUp);\\n        total.elastic = total.elastic.sub(elastic.to128());\\n        total.base = total.base.sub(base.to128());\\n        return (total, elastic);\\n    }\\n\\n    /// @notice Add `elastic` and `base` to `total`.\\n    function add(\\n        Rebase memory total,\\n        uint256 elastic,\\n        uint256 base\\n    ) internal pure returns (Rebase memory) {\\n        total.elastic = total.elastic.add(elastic.to128());\\n        total.base = total.base.add(base.to128());\\n        return total;\\n    }\\n\\n    /// @notice Subtract `elastic` and `base` to `total`.\\n    function sub(\\n        Rebase memory total,\\n        uint256 elastic,\\n        uint256 base\\n    ) internal pure returns (Rebase memory) {\\n        total.elastic = total.elastic.sub(elastic.to128());\\n        total.base = total.base.sub(base.to128());\\n        return total;\\n    }\\n\\n    /// @notice Add `elastic` to `total` and update storage.\\n    /// @return newElastic Returns updated `elastic`.\\n    function addElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {\\n        newElastic = total.elastic = total.elastic.add(elastic.to128());\\n    }\\n\\n    /// @notice Subtract `elastic` from `total` and update storage.\\n    /// @return newElastic Returns updated `elastic`.\\n    function subElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {\\n        newElastic = total.elastic = total.elastic.sub(elastic.to128());\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringOwnable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n// Source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol + Claimable.sol\\n// Edited by BoringCrypto\\n\\ncontract BoringOwnableData {\\n    address public owner;\\n    address public pendingOwner;\\n}\\n\\ncontract BoringOwnable is BoringOwnableData {\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /// @notice `owner` defaults to msg.sender on construction.\\n    constructor() public {\\n        owner = msg.sender;\\n        emit OwnershipTransferred(address(0), msg.sender);\\n    }\\n\\n    /// @notice Transfers ownership to `newOwner`. Either directly or claimable by the new pending owner.\\n    /// Can only be invoked by the current `owner`.\\n    /// @param newOwner Address of the new owner.\\n    /// @param direct True if `newOwner` should be set immediately. False if `newOwner` needs to use `claimOwnership`.\\n    /// @param renounce Allows the `newOwner` to be `address(0)` if `direct` and `renounce` is True. Has no effect otherwise.\\n    function transferOwnership(\\n        address newOwner,\\n        bool direct,\\n        bool renounce\\n    ) public onlyOwner {\\n        if (direct) {\\n            // Checks\\n            require(newOwner != address(0) || renounce, \\\"Ownable: zero address\\\");\\n\\n            // Effects\\n            emit OwnershipTransferred(owner, newOwner);\\n            owner = newOwner;\\n            pendingOwner = address(0);\\n        } else {\\n            // Effects\\n            pendingOwner = newOwner;\\n        }\\n    }\\n\\n    /// @notice Needs to be called by `pendingOwner` to claim ownership.\\n    function claimOwnership() public {\\n        address _pendingOwner = pendingOwner;\\n\\n        // Checks\\n        require(msg.sender == _pendingOwner, \\\"Ownable: caller != pending owner\\\");\\n\\n        // Effects\\n        emit OwnershipTransferred(owner, _pendingOwner);\\n        owner = _pendingOwner;\\n        pendingOwner = address(0);\\n    }\\n\\n    /// @notice Only allows the `owner` to execute the function.\\n    modifier onlyOwner() {\\n        require(msg.sender == owner, \\\"Ownable: caller is not the owner\\\");\\n        _;\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/interfaces/IMasterContract.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ninterface IMasterContract {\\n    /// @notice Init function that gets called from `BoringFactory.deploy`.\\n    /// Also kown as the constructor for cloned contracts.\\n    /// Any ETH send to `BoringFactory.deploy` ends up here.\\n    /// @param data Can be abi encoded arguments or anything else.\\n    function init(bytes calldata data) external payable;\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringFactory.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ncontract BoringFactory {\\n    event LogDeploy(address indexed masterContract, bytes data, address indexed cloneAddress);\\n\\n    /// @notice Mapping from clone contracts to their masterContract.\\n    mapping(address => address) public masterContractOf;\\n\\n    /// @notice Deploys a given master Contract as a clone.\\n    /// Any ETH transferred with this call is forwarded to the new clone.\\n    /// Emits `LogDeploy`.\\n    /// @param masterContract The address of the contract to clone.\\n    /// @param data Additional abi encoded calldata that is passed to the new clone via `IMasterContract.init`.\\n    /// @param useCreate2 Creates the clone by using the CREATE2 opcode, in this case `data` will be used as salt.\\n    /// @return cloneAddress Address of the created clone contract.\\n    function deploy(\\n        address masterContract,\\n        bytes calldata data,\\n        bool useCreate2\\n    ) public payable returns (address cloneAddress) {\\n        require(masterContract != address(0), \\\"BoringFactory: No masterContract\\\");\\n        bytes20 targetBytes = bytes20(masterContract); // Takes the first 20 bytes of the masterContract's address\\n\\n        if (useCreate2) {\\n            // each masterContract has different code already. So clones are distinguished by their data only.\\n            bytes32 salt = keccak256(data);\\n\\n            // Creates clone, more info here: https://blog.openzeppelin.com/deep-dive-into-the-minimal-proxy-contract/\\n            assembly {\\n                let clone := mload(0x40)\\n                mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n                mstore(add(clone, 0x14), targetBytes)\\n                mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n                cloneAddress := create2(0, clone, 0x37, salt)\\n            }\\n        } else {\\n            assembly {\\n                let clone := mload(0x40)\\n                mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n                mstore(add(clone, 0x14), targetBytes)\\n                mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n                cloneAddress := create(0, clone, 0x37)\\n            }\\n        }\\n        masterContractOf[cloneAddress] = masterContract;\\n\\n        IMasterContract(cloneAddress).init{value: msg.value}(data);\\n\\n        emit LogDeploy(masterContract, data, cloneAddress);\\n    }\\n}\\n\\n// File contracts/MasterContractManager.sol\\n// License-Identifier: UNLICENSED\\n\\ncontract MasterContractManager is BoringOwnable, BoringFactory {\\n    event LogWhiteListMasterContract(address indexed masterContract, bool approved);\\n    event LogSetMasterContractApproval(address indexed masterContract, address indexed user, bool approved);\\n    event LogRegisterProtocol(address indexed protocol);\\n\\n    /// @notice masterContract to user to approval state\\n    mapping(address => mapping(address => bool)) public masterContractApproved;\\n    /// @notice masterContract to whitelisted state for approval without signed message\\n    mapping(address => bool) public whitelistedMasterContracts;\\n    /// @notice user nonces for masterContract approvals\\n    mapping(address => uint256) public nonces;\\n\\n    bytes32 private constant DOMAIN_SEPARATOR_SIGNATURE_HASH = keccak256(\\\"EIP712Domain(string name,uint256 chainId,address verifyingContract)\\\");\\n    // See https://eips.ethereum.org/EIPS/eip-191\\n    string private constant EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA = \\\"\\\\x19\\\\x01\\\";\\n    bytes32 private constant APPROVAL_SIGNATURE_HASH =\\n        keccak256(\\\"SetMasterContractApproval(string warning,address user,address masterContract,bool approved,uint256 nonce)\\\");\\n\\n    // solhint-disable-next-line var-name-mixedcase\\n    bytes32 private immutable _DOMAIN_SEPARATOR;\\n    // solhint-disable-next-line var-name-mixedcase\\n    uint256 private immutable DOMAIN_SEPARATOR_CHAIN_ID;\\n\\n    constructor() public {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        _DOMAIN_SEPARATOR = _calculateDomainSeparator(DOMAIN_SEPARATOR_CHAIN_ID = chainId);\\n    }\\n\\n    function _calculateDomainSeparator(uint256 chainId) private view returns (bytes32) {\\n        return keccak256(abi.encode(DOMAIN_SEPARATOR_SIGNATURE_HASH, keccak256(\\\"BentoBox V1\\\"), chainId, address(this)));\\n    }\\n\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() public view returns (bytes32) {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        return chainId == DOMAIN_SEPARATOR_CHAIN_ID ? _DOMAIN_SEPARATOR : _calculateDomainSeparator(chainId);\\n    }\\n\\n    /// @notice Other contracts need to register with this master contract so that users can approve them for the BentoBox.\\n    function registerProtocol() public {\\n        masterContractOf[msg.sender] = msg.sender;\\n        emit LogRegisterProtocol(msg.sender);\\n    }\\n\\n    /// @notice Enables or disables a contract for approval without signed message.\\n    function whitelistMasterContract(address masterContract, bool approved) public onlyOwner {\\n        // Checks\\n        require(masterContract != address(0), \\\"MasterCMgr: Cannot approve 0\\\");\\n\\n        // Effects\\n        whitelistedMasterContracts[masterContract] = approved;\\n        emit LogWhiteListMasterContract(masterContract, approved);\\n    }\\n\\n    /// @notice Approves or revokes a `masterContract` access to `user` funds.\\n    /// @param user The address of the user that approves or revokes access.\\n    /// @param masterContract The address who gains or loses access.\\n    /// @param approved If True approves access. If False revokes access.\\n    /// @param v Part of the signature. (See EIP-191)\\n    /// @param r Part of the signature. (See EIP-191)\\n    /// @param s Part of the signature. (See EIP-191)\\n    // F4 - Check behaviour for all function arguments when wrong or extreme\\n    // F4: Don't allow masterContract 0 to be approved. Unknown contracts will have a masterContract of 0.\\n    // F4: User can't be 0 for signed approvals because the recoveredAddress will be 0 if ecrecover fails\\n    function setMasterContractApproval(\\n        address user,\\n        address masterContract,\\n        bool approved,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) public {\\n        // Checks\\n        require(masterContract != address(0), \\\"MasterCMgr: masterC not set\\\"); // Important for security\\n\\n        // If no signature is provided, the fallback is executed\\n        if (r == 0 && s == 0 && v == 0) {\\n            require(user == msg.sender, \\\"MasterCMgr: user not sender\\\");\\n            require(masterContractOf[user] == address(0), \\\"MasterCMgr: user is clone\\\");\\n            require(whitelistedMasterContracts[masterContract], \\\"MasterCMgr: not whitelisted\\\");\\n        } else {\\n            // Important for security - any address without masterContract has address(0) as masterContract\\n            // So approving address(0) would approve every address, leading to full loss of funds\\n            // Also, ecrecover returns address(0) on failure. So we check this:\\n            require(user != address(0), \\\"MasterCMgr: User cannot be 0\\\");\\n\\n            // C10 - Protect signatures against replay, use nonce and chainId (SWC-121)\\n            // C10: nonce + chainId are used to prevent replays\\n            // C11 - All signatures strictly EIP-712 (SWC-117 SWC-122)\\n            // C11: signature is EIP-712 compliant\\n            // C12 - abi.encodePacked can't contain variable length user input (SWC-133)\\n            // C12: abi.encodePacked has fixed length parameters\\n            bytes32 digest =\\n                keccak256(\\n                    abi.encodePacked(\\n                        EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA,\\n                        DOMAIN_SEPARATOR(),\\n                        keccak256(\\n                            abi.encode(\\n                                APPROVAL_SIGNATURE_HASH,\\n                                approved\\n                                    ? keccak256(\\\"Give FULL access to funds in (and approved to) BentoBox?\\\")\\n                                    : keccak256(\\\"Revoke access to BentoBox?\\\"),\\n                                user,\\n                                masterContract,\\n                                approved,\\n                                nonces[user]++\\n                            )\\n                        )\\n                    )\\n                );\\n            address recoveredAddress = ecrecover(digest, v, r, s);\\n            require(recoveredAddress == user, \\\"MasterCMgr: Invalid Signature\\\");\\n        }\\n\\n        // Effects\\n        masterContractApproved[masterContract][user] = approved;\\n        emit LogSetMasterContractApproval(masterContract, user, approved);\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringBatchable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ncontract BaseBoringBatchable {\\n    /// @dev Helper function to extract a useful revert message from a failed call.\\n    /// If the returned data is malformed or not correctly abi encoded then this call can fail itself.\\n    function _getRevertMsg(bytes memory _returnData) internal pure returns (string memory) {\\n        // If the _res length is less than 68, then the transaction failed silently (without a revert message)\\n        if (_returnData.length < 68) return \\\"Transaction reverted silently\\\";\\n\\n        assembly {\\n            // Slice the sighash.\\n            _returnData := add(_returnData, 0x04)\\n        }\\n        return abi.decode(_returnData, (string)); // All that remains is the revert string\\n    }\\n\\n    /// @notice Allows batched call to self (this contract).\\n    /// @param calls An array of inputs for each call.\\n    /// @param revertOnFail If True then reverts after a failed call and stops doing further calls.\\n    /// @return successes An array indicating the success of a call, mapped one-to-one to `calls`.\\n    /// @return results An array with the returned data of each function call, mapped one-to-one to `calls`.\\n    // F1: External is ok here because this is the batch function, adding it to a batch makes no sense\\n    // F2: Calls in the batch may be payable, delegatecall operates in the same context, so each call in the batch has access to msg.value\\n    // C3: The length of the loop is fully under user control, so can't be exploited\\n    // C7: Delegatecall is only used on the same contract, so it's safe\\n    function batch(bytes[] calldata calls, bool revertOnFail) external payable returns (bool[] memory successes, bytes[] memory results) {\\n        successes = new bool[](calls.length);\\n        results = new bytes[](calls.length);\\n        for (uint256 i = 0; i < calls.length; i++) {\\n            (bool success, bytes memory result) = address(this).delegatecall(calls[i]);\\n            require(success || !revertOnFail, _getRevertMsg(result));\\n            successes[i] = success;\\n            results[i] = result;\\n        }\\n    }\\n}\\n\\ncontract BoringBatchable is BaseBoringBatchable {\\n    /// @notice Call wrapper that performs `ERC20.permit` on `token`.\\n    /// Lookup `IERC20.permit`.\\n    // F6: Parameters can be used front-run the permit and the user's permit will fail (due to nonce or other revert)\\n    //     if part of a batch this could be used to grief once as the second call would not need the permit\\n    function permitToken(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) public {\\n        token.permit(from, to, amount, deadline, v, r, s);\\n    }\\n}\\n\\n// File contracts/BentoBox.sol\\n// License-Identifier: UNLICENSED\\n\\n/// @title BentoBox\\n/// @author BoringCrypto, Keno\\n/// @notice The BentoBox is a vault for tokens. The stored tokens can be flash loaned and used in strategies.\\n/// Yield from this will go to the token depositors.\\n/// Rebasing tokens ARE NOT supported and WILL cause loss of funds.\\n/// Any funds transfered directly onto the BentoBox will be lost, use the deposit function instead.\\ncontract BentoBoxV1 is MasterContractManager, BoringBatchable {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n    using BoringERC20 for IERC20;\\n    using RebaseLibrary for Rebase;\\n\\n    // ************** //\\n    // *** EVENTS *** //\\n    // ************** //\\n\\n    event LogDeposit(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogWithdraw(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogTransfer(IERC20 indexed token, address indexed from, address indexed to, uint256 share);\\n\\n    event LogFlashLoan(address indexed borrower, IERC20 indexed token, uint256 amount, uint256 feeAmount, address indexed receiver);\\n\\n    event LogStrategyTargetPercentage(IERC20 indexed token, uint256 targetPercentage);\\n    event LogStrategyQueued(IERC20 indexed token, IStrategy indexed strategy);\\n    event LogStrategySet(IERC20 indexed token, IStrategy indexed strategy);\\n    event LogStrategyInvest(IERC20 indexed token, uint256 amount);\\n    event LogStrategyDivest(IERC20 indexed token, uint256 amount);\\n    event LogStrategyProfit(IERC20 indexed token, uint256 amount);\\n    event LogStrategyLoss(IERC20 indexed token, uint256 amount);\\n\\n    // *************** //\\n    // *** STRUCTS *** //\\n    // *************** //\\n\\n    struct StrategyData {\\n        uint64 strategyStartDate;\\n        uint64 targetPercentage;\\n        uint128 balance; // the balance of the strategy that BentoBox thinks is in there\\n    }\\n\\n    // ******************************** //\\n    // *** CONSTANTS AND IMMUTABLES *** //\\n    // ******************************** //\\n\\n    // V2 - Can they be private?\\n    // V2: Private to save gas, to verify it's correct, check the constructor arguments\\n    IERC20 private immutable wethToken;\\n\\n    IERC20 private constant USE_ETHEREUM = IERC20(0);\\n    uint256 private constant FLASH_LOAN_FEE = 50; // 0.05%\\n    uint256 private constant FLASH_LOAN_FEE_PRECISION = 1e5;\\n    uint256 private constant STRATEGY_DELAY = 2 weeks;\\n    uint256 private constant MAX_TARGET_PERCENTAGE = 95; // 95%\\n    uint256 private constant MINIMUM_SHARE_BALANCE = 1000; // To prevent the ratio going off\\n\\n    // ***************** //\\n    // *** VARIABLES *** //\\n    // ***************** //\\n\\n    // Balance per token per address/contract in shares\\n    mapping(IERC20 => mapping(address => uint256)) public balanceOf;\\n\\n    // Rebase from amount to share\\n    mapping(IERC20 => Rebase) public totals;\\n\\n    mapping(IERC20 => IStrategy) public strategy;\\n    mapping(IERC20 => IStrategy) public pendingStrategy;\\n    mapping(IERC20 => StrategyData) public strategyData;\\n\\n    // ******************* //\\n    // *** CONSTRUCTOR *** //\\n    // ******************* //\\n\\n    constructor(IERC20 wethToken_) public {\\n        wethToken = wethToken_;\\n    }\\n\\n    // ***************** //\\n    // *** MODIFIERS *** //\\n    // ***************** //\\n\\n    /// Modifier to check if the msg.sender is allowed to use funds belonging to the 'from' address.\\n    /// If 'from' is msg.sender, it's allowed.\\n    /// If 'from' is the BentoBox itself, it's allowed. Any ETH, token balances (above the known balances) or BentoBox balances\\n    /// can be taken by anyone.\\n    /// This is to enable skimming, not just for deposits, but also for withdrawals or transfers, enabling better composability.\\n    /// If 'from' is a clone of a masterContract AND the 'from' address has approved that masterContract, it's allowed.\\n    modifier allowed(address from) {\\n        if (from != msg.sender && from != address(this)) {\\n            // From is sender or you are skimming\\n            address masterContract = masterContractOf[msg.sender];\\n            require(masterContract != address(0), \\\"BentoBox: no masterContract\\\");\\n            require(masterContractApproved[masterContract][from], \\\"BentoBox: Transfer not approved\\\");\\n        }\\n        _;\\n    }\\n\\n    // ************************** //\\n    // *** INTERNAL FUNCTIONS *** //\\n    // ************************** //\\n\\n    /// @dev Returns the total balance of `token` this contracts holds,\\n    /// plus the total amount this contract thinks the strategy holds.\\n    function _tokenBalanceOf(IERC20 token) internal view returns (uint256 amount) {\\n        amount = token.balanceOf(address(this)).add(strategyData[token].balance);\\n    }\\n\\n    // ************************ //\\n    // *** PUBLIC FUNCTIONS *** //\\n    // ************************ //\\n\\n    /// @dev Helper function to represent an `amount` of `token` in shares.\\n    /// @param token The ERC-20 token.\\n    /// @param amount The `token` amount.\\n    /// @param roundUp If the result `share` should be rounded up.\\n    /// @return share The token amount represented in shares.\\n    function toShare(\\n        IERC20 token,\\n        uint256 amount,\\n        bool roundUp\\n    ) external view returns (uint256 share) {\\n        share = totals[token].toBase(amount, roundUp);\\n    }\\n\\n    /// @dev Helper function represent shares back into the `token` amount.\\n    /// @param token The ERC-20 token.\\n    /// @param share The amount of shares.\\n    /// @param roundUp If the result should be rounded up.\\n    /// @return amount The share amount back into native representation.\\n    function toAmount(\\n        IERC20 token,\\n        uint256 share,\\n        bool roundUp\\n    ) external view returns (uint256 amount) {\\n        amount = totals[token].toElastic(share, roundUp);\\n    }\\n\\n    /// @notice Deposit an amount of `token` represented in either `amount` or `share`.\\n    /// @param token_ The ERC-20 token to deposit.\\n    /// @param from which account to pull the tokens.\\n    /// @param to which account to push the tokens.\\n    /// @param amount Token amount in native representation to deposit.\\n    /// @param share Token amount represented in shares to deposit. Takes precedence over `amount`.\\n    /// @return amountOut The amount deposited.\\n    /// @return shareOut The deposited amount repesented in shares.\\n    function deposit(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) public payable allowed(from) returns (uint256 amountOut, uint256 shareOut) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;\\n        Rebase memory total = totals[token];\\n\\n        // If a new token gets added, the tokenSupply call checks that this is a deployed contract. Needed for security.\\n        require(total.elastic != 0 || token.totalSupply() > 0, \\\"BentoBox: No tokens\\\");\\n        if (share == 0) {\\n            // value of the share may be lower than the amount due to rounding, that's ok\\n            share = total.toBase(amount, false);\\n            // Any deposit should lead to at least the minimum share balance, otherwise it's ignored (no amount taken)\\n            if (total.base.add(share.to128()) < MINIMUM_SHARE_BALANCE) {\\n                return (0, 0);\\n            }\\n        } else {\\n            // amount may be lower than the value of share due to rounding, in that case, add 1 to amount (Always round up)\\n            amount = total.toElastic(share, true);\\n        }\\n\\n        // In case of skimming, check that only the skimmable amount is taken.\\n        // For ETH, the full balance is available, so no need to check.\\n        // During flashloans the _tokenBalanceOf is lower than 'reality', so skimming deposits will mostly fail during a flashloan.\\n        require(\\n            from != address(this) || token_ == USE_ETHEREUM || amount <= _tokenBalanceOf(token).sub(total.elastic),\\n            \\\"BentoBox: Skim too much\\\"\\n        );\\n\\n        balanceOf[token][to] = balanceOf[token][to].add(share);\\n        total.base = total.base.add(share.to128());\\n        total.elastic = total.elastic.add(amount.to128());\\n        totals[token] = total;\\n\\n        // Interactions\\n        // During the first deposit, we check that this token is 'real'\\n        if (token_ == USE_ETHEREUM) {\\n            // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)\\n            // X2: If the WETH implementation is faulty or malicious, it will block adding ETH (but we know the WETH implementation)\\n            IWETH(address(wethToken)).deposit{value: amount}();\\n        } else if (from != address(this)) {\\n            // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)\\n            // X2: If the token implementation is faulty or malicious, it may block adding tokens. Good.\\n            token.safeTransferFrom(from, address(this), amount);\\n        }\\n        emit LogDeposit(token, from, to, amount, share);\\n        amountOut = amount;\\n        shareOut = share;\\n    }\\n\\n    /// @notice Withdraws an amount of `token` from a user account.\\n    /// @param token_ The ERC-20 token to withdraw.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param amount of tokens. Either one of `amount` or `share` needs to be supplied.\\n    /// @param share Like above, but `share` takes precedence over `amount`.\\n    function withdraw(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) public allowed(from) returns (uint256 amountOut, uint256 shareOut) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;\\n        Rebase memory total = totals[token];\\n        if (share == 0) {\\n            // value of the share paid could be lower than the amount paid due to rounding, in that case, add a share (Always round up)\\n            share = total.toBase(amount, true);\\n        } else {\\n            // amount may be lower than the value of share due to rounding, that's ok\\n            amount = total.toElastic(share, false);\\n        }\\n\\n        balanceOf[token][from] = balanceOf[token][from].sub(share);\\n        total.elastic = total.elastic.sub(amount.to128());\\n        total.base = total.base.sub(share.to128());\\n        // There have to be at least 1000 shares left to prevent reseting the share/amount ratio (unless it's fully emptied)\\n        require(total.base >= MINIMUM_SHARE_BALANCE || total.base == 0, \\\"BentoBox: cannot empty\\\");\\n        totals[token] = total;\\n\\n        // Interactions\\n        if (token_ == USE_ETHEREUM) {\\n            // X2, X3: A revert or big gas usage in the WETH contract could block withdrawals, but WETH9 is fine.\\n            IWETH(address(wethToken)).withdraw(amount);\\n            // X2, X3: A revert or big gas usage could block, however, the to address is under control of the caller.\\n            (bool success, ) = to.call{value: amount}(\\\"\\\");\\n            require(success, \\\"BentoBox: ETH transfer failed\\\");\\n        } else {\\n            // X2, X3: A malicious token could block withdrawal of just THAT token.\\n            //         masterContracts may want to take care not to rely on withdraw always succeeding.\\n            token.safeTransfer(to, amount);\\n        }\\n        emit LogWithdraw(token, from, to, amount, share);\\n        amountOut = amount;\\n        shareOut = share;\\n    }\\n\\n    /// @notice Transfer shares from a user account to another one.\\n    /// @param token The ERC-20 token to transfer.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param share The amount of `token` in shares.\\n    // Clones of master contracts can transfer from any account that has approved them\\n    // F3 - Can it be combined with another similar function?\\n    // F3: This isn't combined with transferMultiple for gas optimization\\n    function transfer(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 share\\n    ) public allowed(from) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        balanceOf[token][from] = balanceOf[token][from].sub(share);\\n        balanceOf[token][to] = balanceOf[token][to].add(share);\\n\\n        emit LogTransfer(token, from, to, share);\\n    }\\n\\n    /// @notice Transfer shares from a user account to multiple other ones.\\n    /// @param token The ERC-20 token to transfer.\\n    /// @param from which user to pull the tokens.\\n    /// @param tos The receivers of the tokens.\\n    /// @param shares The amount of `token` in shares for each receiver in `tos`.\\n    // F3 - Can it be combined with another similar function?\\n    // F3: This isn't combined with transfer for gas optimization\\n    function transferMultiple(\\n        IERC20 token,\\n        address from,\\n        address[] calldata tos,\\n        uint256[] calldata shares\\n    ) public allowed(from) {\\n        // Checks\\n        require(tos[0] != address(0), \\\"BentoBox: to[0] not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        uint256 totalAmount;\\n        uint256 len = tos.length;\\n        for (uint256 i = 0; i < len; i++) {\\n            address to = tos[i];\\n            balanceOf[token][to] = balanceOf[token][to].add(shares[i]);\\n            totalAmount = totalAmount.add(shares[i]);\\n            emit LogTransfer(token, from, to, shares[i]);\\n        }\\n        balanceOf[token][from] = balanceOf[token][from].sub(totalAmount);\\n    }\\n\\n    /// @notice Flashloan ability.\\n    /// @param borrower The address of the contract that implements and conforms to `IFlashBorrower` and handles the flashloan.\\n    /// @param receiver Address of the token receiver.\\n    /// @param token The address of the token to receive.\\n    /// @param amount of the tokens to receive.\\n    /// @param data The calldata to pass to the `borrower` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Not possible to follow this here, reentrancy has been reviewed\\n    // F6 - Check for front-running possibilities, such as the approve function (SWC-114)\\n    // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.\\n    function flashLoan(\\n        IFlashBorrower borrower,\\n        address receiver,\\n        IERC20 token,\\n        uint256 amount,\\n        bytes calldata data\\n    ) public {\\n        uint256 fee = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;\\n        token.safeTransfer(receiver, amount);\\n\\n        borrower.onFlashLoan(msg.sender, token, amount, fee, data);\\n\\n        require(_tokenBalanceOf(token) >= totals[token].addElastic(fee.to128()), \\\"BentoBox: Wrong amount\\\");\\n        emit LogFlashLoan(address(borrower), token, amount, fee, receiver);\\n    }\\n\\n    /// @notice Support for batched flashloans. Useful to request multiple different `tokens` in a single transaction.\\n    /// @param borrower The address of the contract that implements and conforms to `IBatchFlashBorrower` and handles the flashloan.\\n    /// @param receivers An array of the token receivers. A one-to-one mapping with `tokens` and `amounts`.\\n    /// @param tokens The addresses of the tokens.\\n    /// @param amounts of the tokens for each receiver.\\n    /// @param data The calldata to pass to the `borrower` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Not possible to follow this here, reentrancy has been reviewed\\n    // F6 - Check for front-running possibilities, such as the approve function (SWC-114)\\n    // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.\\n    function batchFlashLoan(\\n        IBatchFlashBorrower borrower,\\n        address[] calldata receivers,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        bytes calldata data\\n    ) public {\\n        uint256[] memory fees = new uint256[](tokens.length);\\n\\n        uint256 len = tokens.length;\\n        for (uint256 i = 0; i < len; i++) {\\n            uint256 amount = amounts[i];\\n            fees[i] = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;\\n\\n            tokens[i].safeTransfer(receivers[i], amounts[i]);\\n        }\\n\\n        borrower.onBatchFlashLoan(msg.sender, tokens, amounts, fees, data);\\n\\n        for (uint256 i = 0; i < len; i++) {\\n            IERC20 token = tokens[i];\\n            require(_tokenBalanceOf(token) >= totals[token].addElastic(fees[i].to128()), \\\"BentoBox: Wrong amount\\\");\\n            emit LogFlashLoan(address(borrower), token, amounts[i], fees[i], receivers[i]);\\n        }\\n    }\\n\\n    /// @notice Sets the target percentage of the strategy for `token`.\\n    /// @dev Only the owner of this contract is allowed to change this.\\n    /// @param token The address of the token that maps to a strategy to change.\\n    /// @param targetPercentage_ The new target in percent. Must be lesser or equal to `MAX_TARGET_PERCENTAGE`.\\n    function setStrategyTargetPercentage(IERC20 token, uint64 targetPercentage_) public onlyOwner {\\n        // Checks\\n        require(targetPercentage_ <= MAX_TARGET_PERCENTAGE, \\\"StrategyManager: Target too high\\\");\\n\\n        // Effects\\n        strategyData[token].targetPercentage = targetPercentage_;\\n        emit LogStrategyTargetPercentage(token, targetPercentage_);\\n    }\\n\\n    /// @notice Sets the contract address of a new strategy that conforms to `IStrategy` for `token`.\\n    /// Must be called twice with the same arguments.\\n    /// A new strategy becomes pending first and can be activated once `STRATEGY_DELAY` is over.\\n    /// @dev Only the owner of this contract is allowed to change this.\\n    /// @param token The address of the token that maps to a strategy to change.\\n    /// @param newStrategy The address of the contract that conforms to `IStrategy`.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Total amount is updated AFTER interaction. But strategy is under our control.\\n    // C4 - Use block.timestamp only for long intervals (SWC-116)\\n    // C4: block.timestamp is used for a period of 2 weeks, which is long enough\\n    function setStrategy(IERC20 token, IStrategy newStrategy) public onlyOwner {\\n        StrategyData memory data = strategyData[token];\\n        IStrategy pending = pendingStrategy[token];\\n        if (data.strategyStartDate == 0 || pending != newStrategy) {\\n            pendingStrategy[token] = newStrategy;\\n            // C1 - All math done through BoringMath (SWC-101)\\n            // C1: Our sun will swallow the earth well before this overflows\\n            data.strategyStartDate = (block.timestamp + STRATEGY_DELAY).to64();\\n            emit LogStrategyQueued(token, newStrategy);\\n        } else {\\n            require(data.strategyStartDate != 0 && block.timestamp >= data.strategyStartDate, \\\"StrategyManager: Too early\\\");\\n            if (address(strategy[token]) != address(0)) {\\n                int256 balanceChange = strategy[token].exit(data.balance);\\n                // Effects\\n                if (balanceChange > 0) {\\n                    uint256 add = uint256(balanceChange);\\n                    totals[token].addElastic(add);\\n                    emit LogStrategyProfit(token, add);\\n                } else if (balanceChange < 0) {\\n                    uint256 sub = uint256(-balanceChange);\\n                    totals[token].subElastic(sub);\\n                    emit LogStrategyLoss(token, sub);\\n                }\\n\\n                emit LogStrategyDivest(token, data.balance);\\n            }\\n            strategy[token] = pending;\\n            data.strategyStartDate = 0;\\n            data.balance = 0;\\n            pendingStrategy[token] = IStrategy(0);\\n            emit LogStrategySet(token, newStrategy);\\n        }\\n        strategyData[token] = data;\\n    }\\n\\n    /// @notice The actual process of yield farming. Executes the strategy of `token`.\\n    /// Optionally does housekeeping if `balance` is true.\\n    /// `maxChangeAmount` is relevant for skimming or withdrawing if `balance` is true.\\n    /// @param token The address of the token for which a strategy is deployed.\\n    /// @param balance True if housekeeping should be done.\\n    /// @param maxChangeAmount The maximum amount for either pulling or pushing from/to the `IStrategy` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Total amount is updated AFTER interaction. But strategy is under our control.\\n    // F5: Not followed to prevent reentrancy issues with flashloans and BentoBox skims?\\n    function harvest(\\n        IERC20 token,\\n        bool balance,\\n        uint256 maxChangeAmount\\n    ) public {\\n        StrategyData memory data = strategyData[token];\\n        IStrategy _strategy = strategy[token];\\n        int256 balanceChange = _strategy.harvest(data.balance, msg.sender);\\n        if (balanceChange == 0 && !balance) {\\n            return;\\n        }\\n\\n        uint256 totalElastic = totals[token].elastic;\\n\\n        if (balanceChange > 0) {\\n            uint256 add = uint256(balanceChange);\\n            totalElastic = totalElastic.add(add);\\n            totals[token].elastic = totalElastic.to128();\\n            emit LogStrategyProfit(token, add);\\n        } else if (balanceChange < 0) {\\n            // C1 - All math done through BoringMath (SWC-101)\\n            // C1: balanceChange could overflow if it's max negative int128.\\n            // But tokens with balances that large are not supported by the BentoBox.\\n            uint256 sub = uint256(-balanceChange);\\n            totalElastic = totalElastic.sub(sub);\\n            totals[token].elastic = totalElastic.to128();\\n            data.balance = data.balance.sub(sub.to128());\\n            emit LogStrategyLoss(token, sub);\\n        }\\n\\n        if (balance) {\\n            uint256 targetBalance = totalElastic.mul(data.targetPercentage) / 100;\\n            // if data.balance == targetBalance there is nothing to update\\n            if (data.balance < targetBalance) {\\n                uint256 amountOut = targetBalance.sub(data.balance);\\n                if (maxChangeAmount != 0 && amountOut > maxChangeAmount) {\\n                    amountOut = maxChangeAmount;\\n                }\\n                token.safeTransfer(address(_strategy), amountOut);\\n                data.balance = data.balance.add(amountOut.to128());\\n                _strategy.skim(amountOut);\\n                emit LogStrategyInvest(token, amountOut);\\n            } else if (data.balance > targetBalance) {\\n                uint256 amountIn = data.balance.sub(targetBalance.to128());\\n                if (maxChangeAmount != 0 && amountIn > maxChangeAmount) {\\n                    amountIn = maxChangeAmount;\\n                }\\n\\n                uint256 actualAmountIn = _strategy.withdraw(amountIn);\\n\\n                data.balance = data.balance.sub(actualAmountIn.to128());\\n                emit LogStrategyDivest(token, actualAmountIn);\\n            }\\n        }\\n\\n        strategyData[token] = data;\\n    }\\n\\n    // Contract should be able to receive ETH deposits to support deposit & skim\\n    // solhint-disable-next-line no-empty-blocks\\n    receive() external payable {}\\n}\\n\",\"keccak256\":\"0xf5251397b9aaa5c66ddc18b0cb96350ffac09f5776a1255fedc0072641f916fe\",\"license\":\"UNLICENSED\"}},\"version\":1}",
          "storageLayout": {
            "storage": [
              {
                "astId": 900,
                "contract": "contracts/bentobox/BentoBoxV1.sol:BoringOwnable",
                "label": "owner",
                "offset": 0,
                "slot": "0",
                "type": "t_address"
              },
              {
                "astId": 902,
                "contract": "contracts/bentobox/BentoBoxV1.sol:BoringOwnable",
                "label": "pendingOwner",
                "offset": 0,
                "slot": "1",
                "type": "t_address"
              }
            ],
            "types": {
              "t_address": {
                "encoding": "inplace",
                "label": "address",
                "numberOfBytes": "20"
              }
            }
          },
          "userdoc": {
            "kind": "user",
            "methods": {
              "claimOwnership()": {
                "notice": "Needs to be called by `pendingOwner` to claim ownership."
              },
              "constructor": "`owner` defaults to msg.sender on construction.",
              "transferOwnership(address,bool,bool)": {
                "notice": "Transfers ownership to `newOwner`. Either directly or claimable by the new pending owner. Can only be invoked by the current `owner`."
              }
            },
            "version": 1
          }
        },
        "BoringOwnableData": {
          "abi": [
            {
              "inputs": [],
              "name": "owner",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "pendingOwner",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {},
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b5060bf8061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060325760003560e01c80638da5cb5b146037578063e30c3978146051575b600080fd5b603d6057565b604051604891906075565b60405180910390f35b603d6066565b6000546001600160a01b031681565b6001546001600160a01b031681565b6001600160a01b039190911681526020019056fea26469706673582212208c60b37ec9b028238ae711efcd9683c5d4e195bb01e441d9907e44efb2fbb45964736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0xBF DUP1 PUSH2 0x1F PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH1 0xF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH1 0x32 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x8DA5CB5B EQ PUSH1 0x37 JUMPI DUP1 PUSH4 0xE30C3978 EQ PUSH1 0x51 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x3D PUSH1 0x57 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x48 SWAP2 SWAP1 PUSH1 0x75 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x3D PUSH1 0x66 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 DUP13 PUSH1 0xB3 PUSH31 0xC9B028238AE711EFCD9683C5D4E195BB01E441D9907E44EFB2FBB45964736F PUSH13 0x634300060C0033000000000000 ",
              "sourceMap": "13255:89:0:-:0;;;;;;;;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "6080604052348015600f57600080fd5b506004361060325760003560e01c80638da5cb5b146037578063e30c3978146051575b600080fd5b603d6057565b604051604891906075565b60405180910390f35b603d6066565b6000546001600160a01b031681565b6001546001600160a01b031681565b6001600160a01b039190911681526020019056fea26469706673582212208c60b37ec9b028238ae711efcd9683c5d4e195bb01e441d9907e44efb2fbb45964736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH1 0xF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH1 0x32 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x8DA5CB5B EQ PUSH1 0x37 JUMPI DUP1 PUSH4 0xE30C3978 EQ PUSH1 0x51 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x3D PUSH1 0x57 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x48 SWAP2 SWAP1 PUSH1 0x75 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x3D PUSH1 0x66 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 DUP13 PUSH1 0xB3 PUSH31 0xC9B028238AE711EFCD9683C5D4E195BB01E441D9907E44EFB2FBB45964736F PUSH13 0x634300060C0033000000000000 ",
              "sourceMap": "13255:89:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13288:20;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13314:27;;;:::i;13288:20::-;;;-1:-1:-1;;;;;13288:20:0;;:::o;13314:27::-;;;-1:-1:-1;;;;;13314:27:0;;:::o;125:222:-1:-;-1:-1;;;;;514:54;;;;76:37;;252:2;237:18;;223:124::o"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "38200",
                "executionCost": "87",
                "totalCost": "38287"
              },
              "external": {
                "owner()": "1048",
                "pendingOwner()": "1070"
              }
            },
            "methodIdentifiers": {
              "owner()": "8da5cb5b",
              "pendingOwner()": "e30c3978"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pendingOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/bentobox/BentoBoxV1.sol\":\"BoringOwnableData\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/bentobox/BentoBoxV1.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\n// The BentoBox\\n\\n//  \\u2584\\u2584\\u2584\\u2584\\u00b7 \\u2584\\u2584\\u2584 . \\u2590 \\u2584 \\u2584\\u2584\\u2584\\u2584\\u2584      \\u2584\\u2584\\u2584\\u2584\\u00b7       \\u2590\\u2584\\u2022 \\u2584\\n//  \\u2590\\u2588 \\u2580\\u2588\\u25aa\\u2580\\u2584.\\u2580\\u00b7\\u2588\\u258c\\u2590\\u2588\\u2022\\u2588\\u2588  \\u25aa     \\u2590\\u2588 \\u2580\\u2588\\u25aa\\u25aa      \\u2588\\u258c\\u2588\\u258c\\u25aa\\n//  \\u2590\\u2588\\u2580\\u2580\\u2588\\u2584\\u2590\\u2580\\u2580\\u25aa\\u2584\\u2590\\u2588\\u2590\\u2590\\u258c \\u2590\\u2588.\\u25aa \\u2584\\u2588\\u2580\\u2584 \\u2590\\u2588\\u2580\\u2580\\u2588\\u2584 \\u2584\\u2588\\u2580\\u2584  \\u00b7\\u2588\\u2588\\u00b7\\n//  \\u2588\\u2588\\u2584\\u25aa\\u2590\\u2588\\u2590\\u2588\\u2584\\u2584\\u258c\\u2588\\u2588\\u2590\\u2588\\u258c \\u2590\\u2588\\u258c\\u00b7\\u2590\\u2588\\u258c.\\u2590\\u258c\\u2588\\u2588\\u2584\\u25aa\\u2590\\u2588\\u2590\\u2588\\u258c.\\u2590\\u258c\\u25aa\\u2590\\u2588\\u00b7\\u2588\\u258c\\n//  \\u00b7\\u2580\\u2580\\u2580\\u2580  \\u2580\\u2580\\u2580 \\u2580\\u2580 \\u2588\\u25aa \\u2580\\u2580\\u2580  \\u2580\\u2588\\u2584\\u2580\\u25aa\\u00b7\\u2580\\u2580\\u2580\\u2580  \\u2580\\u2588\\u2584\\u2580\\u25aa\\u2022\\u2580\\u2580 \\u2580\\u2580\\n\\n// This contract stores funds, handles their transfers, supports flash loans and strategies.\\n\\n// Copyright (c) 2021 BoringCrypto - All rights reserved\\n// Twitter: @Boring_Crypto\\n\\n// Special thanks to Keno for all his hard work and support\\n\\n// Version 22-Mar-2021\\n\\npragma solidity 0.6.12;\\npragma experimental ABIEncoderV2;\\n\\n// solhint-disable avoid-low-level-calls\\n// solhint-disable not-rely-on-time\\n// solhint-disable no-inline-assembly\\n\\n// File @boringcrypto/boring-solidity/contracts/interfaces/IERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ninterface IERC20 {\\n    function totalSupply() external view returns (uint256);\\n\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /// @notice EIP 2612\\n    function permit(\\n        address owner,\\n        address spender,\\n        uint256 value,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) external;\\n}\\n\\n// File contracts/interfaces/IFlashLoan.sol\\n// License-Identifier: MIT\\n\\ninterface IFlashBorrower {\\n    /// @notice The flashloan callback. `amount` + `fee` needs to repayed to msg.sender before this call returns.\\n    /// @param sender The address of the invoker of this flashloan.\\n    /// @param token The address of the token that is loaned.\\n    /// @param amount of the `token` that is loaned.\\n    /// @param fee The fee that needs to be paid on top for this loan. Needs to be the same as `token`.\\n    /// @param data Additional data that was passed to the flashloan function.\\n    function onFlashLoan(\\n        address sender,\\n        IERC20 token,\\n        uint256 amount,\\n        uint256 fee,\\n        bytes calldata data\\n    ) external;\\n}\\n\\ninterface IBatchFlashBorrower {\\n    /// @notice The callback for batched flashloans. Every amount + fee needs to repayed to msg.sender before this call returns.\\n    /// @param sender The address of the invoker of this flashloan.\\n    /// @param tokens Array of addresses for ERC-20 tokens that is loaned.\\n    /// @param amounts A one-to-one map to `tokens` that is loaned.\\n    /// @param fees A one-to-one map to `tokens` that needs to be paid on top for each loan. Needs to be the same token.\\n    /// @param data Additional data that was passed to the flashloan function.\\n    function onBatchFlashLoan(\\n        address sender,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        uint256[] calldata fees,\\n        bytes calldata data\\n    ) external;\\n}\\n\\n// File contracts/interfaces/IWETH.sol\\n// License-Identifier: MIT\\n\\ninterface IWETH {\\n    function deposit() external payable;\\n\\n    function withdraw(uint256) external;\\n}\\n\\n// File contracts/interfaces/IStrategy.sol\\n// License-Identifier: MIT\\n\\ninterface IStrategy {\\n    /// @notice Send the assets to the Strategy and call skim to invest them.\\n    /// @param amount The amount of tokens to invest.\\n    function skim(uint256 amount) external;\\n\\n    /// @notice Harvest any profits made converted to the asset and pass them to the caller.\\n    /// @param balance The amount of tokens the caller thinks it has invested.\\n    /// @param sender The address of the initiator of this transaction. Can be used for reimbursements, etc.\\n    /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.\\n    function harvest(uint256 balance, address sender) external returns (int256 amountAdded);\\n\\n    /// @notice Withdraw assets. The returned amount can differ from the requested amount due to rounding.\\n    /// @dev The `actualAmount` should be very close to the amount.\\n    /// The difference should NOT be used to report a loss. That's what harvest is for.\\n    /// @param amount The requested amount the caller wants to withdraw.\\n    /// @return actualAmount The real amount that is withdrawn.\\n    function withdraw(uint256 amount) external returns (uint256 actualAmount);\\n\\n    /// @notice Withdraw all assets in the safest way possible. This shouldn't fail.\\n    /// @param balance The amount of tokens the caller thinks it has invested.\\n    /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.\\n    function exit(uint256 balance) external returns (int256 amountAdded);\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\nlibrary BoringERC20 {\\n    bytes4 private constant SIG_SYMBOL = 0x95d89b41; // symbol()\\n    bytes4 private constant SIG_NAME = 0x06fdde03; // name()\\n    bytes4 private constant SIG_DECIMALS = 0x313ce567; // decimals()\\n    bytes4 private constant SIG_TRANSFER = 0xa9059cbb; // transfer(address,uint256)\\n    bytes4 private constant SIG_TRANSFER_FROM = 0x23b872dd; // transferFrom(address,address,uint256)\\n\\n    /// @notice Provides a safe ERC20.transfer version for different ERC-20 implementations.\\n    /// Reverts on a failed transfer.\\n    /// @param token The address of the ERC-20 token.\\n    /// @param to Transfer tokens to.\\n    /// @param amount The token amount.\\n    function safeTransfer(\\n        IERC20 token,\\n        address to,\\n        uint256 amount\\n    ) internal {\\n        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER, to, amount));\\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: Transfer failed\\\");\\n    }\\n\\n    /// @notice Provides a safe ERC20.transferFrom version for different ERC-20 implementations.\\n    /// Reverts on a failed transfer.\\n    /// @param token The address of the ERC-20 token.\\n    /// @param from Transfer tokens from.\\n    /// @param to Transfer tokens to.\\n    /// @param amount The token amount.\\n    function safeTransferFrom(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 amount\\n    ) internal {\\n        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER_FROM, from, to, amount));\\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: TransferFrom failed\\\");\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringMath.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n/// @notice A library for performing overflow-/underflow-safe math,\\n/// updated with awesomeness from of DappHub (https://github.com/dapphub/ds-math).\\nlibrary BoringMath {\\n    function add(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require(b == 0 || (c = a * b) / b == a, \\\"BoringMath: Mul Overflow\\\");\\n    }\\n\\n    function to128(uint256 a) internal pure returns (uint128 c) {\\n        require(a <= uint128(-1), \\\"BoringMath: uint128 Overflow\\\");\\n        c = uint128(a);\\n    }\\n\\n    function to64(uint256 a) internal pure returns (uint64 c) {\\n        require(a <= uint64(-1), \\\"BoringMath: uint64 Overflow\\\");\\n        c = uint64(a);\\n    }\\n\\n    function to32(uint256 a) internal pure returns (uint32 c) {\\n        require(a <= uint32(-1), \\\"BoringMath: uint32 Overflow\\\");\\n        c = uint32(a);\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint128.\\nlibrary BoringMath128 {\\n    function add(uint128 a, uint128 b) internal pure returns (uint128 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint128 a, uint128 b) internal pure returns (uint128 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint64.\\nlibrary BoringMath64 {\\n    function add(uint64 a, uint64 b) internal pure returns (uint64 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint64 a, uint64 b) internal pure returns (uint64 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint32.\\nlibrary BoringMath32 {\\n    function add(uint32 a, uint32 b) internal pure returns (uint32 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint32 a, uint32 b) internal pure returns (uint32 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringRebase.sol@v1.2.0\\n// License-Identifier: MIT\\n\\nstruct Rebase {\\n    uint128 elastic;\\n    uint128 base;\\n}\\n\\n/// @notice A rebasing library using overflow-/underflow-safe math.\\nlibrary RebaseLibrary {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n\\n    /// @notice Calculates the base value in relationship to `elastic` and `total`.\\n    function toBase(\\n        Rebase memory total,\\n        uint256 elastic,\\n        bool roundUp\\n    ) internal pure returns (uint256 base) {\\n        if (total.elastic == 0) {\\n            base = elastic;\\n        } else {\\n            base = elastic.mul(total.base) / total.elastic;\\n            if (roundUp && base.mul(total.elastic) / total.base < elastic) {\\n                base = base.add(1);\\n            }\\n        }\\n    }\\n\\n    /// @notice Calculates the elastic value in relationship to `base` and `total`.\\n    function toElastic(\\n        Rebase memory total,\\n        uint256 base,\\n        bool roundUp\\n    ) internal pure returns (uint256 elastic) {\\n        if (total.base == 0) {\\n            elastic = base;\\n        } else {\\n            elastic = base.mul(total.elastic) / total.base;\\n            if (roundUp && elastic.mul(total.base) / total.elastic < base) {\\n                elastic = elastic.add(1);\\n            }\\n        }\\n    }\\n\\n    /// @notice Add `elastic` to `total` and doubles `total.base`.\\n    /// @return (Rebase) The new total.\\n    /// @return base in relationship to `elastic`.\\n    function add(\\n        Rebase memory total,\\n        uint256 elastic,\\n        bool roundUp\\n    ) internal pure returns (Rebase memory, uint256 base) {\\n        base = toBase(total, elastic, roundUp);\\n        total.elastic = total.elastic.add(elastic.to128());\\n        total.base = total.base.add(base.to128());\\n        return (total, base);\\n    }\\n\\n    /// @notice Sub `base` from `total` and update `total.elastic`.\\n    /// @return (Rebase) The new total.\\n    /// @return elastic in relationship to `base`.\\n    function sub(\\n        Rebase memory total,\\n        uint256 base,\\n        bool roundUp\\n    ) internal pure returns (Rebase memory, uint256 elastic) {\\n        elastic = toElastic(total, base, roundUp);\\n        total.elastic = total.elastic.sub(elastic.to128());\\n        total.base = total.base.sub(base.to128());\\n        return (total, elastic);\\n    }\\n\\n    /// @notice Add `elastic` and `base` to `total`.\\n    function add(\\n        Rebase memory total,\\n        uint256 elastic,\\n        uint256 base\\n    ) internal pure returns (Rebase memory) {\\n        total.elastic = total.elastic.add(elastic.to128());\\n        total.base = total.base.add(base.to128());\\n        return total;\\n    }\\n\\n    /// @notice Subtract `elastic` and `base` to `total`.\\n    function sub(\\n        Rebase memory total,\\n        uint256 elastic,\\n        uint256 base\\n    ) internal pure returns (Rebase memory) {\\n        total.elastic = total.elastic.sub(elastic.to128());\\n        total.base = total.base.sub(base.to128());\\n        return total;\\n    }\\n\\n    /// @notice Add `elastic` to `total` and update storage.\\n    /// @return newElastic Returns updated `elastic`.\\n    function addElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {\\n        newElastic = total.elastic = total.elastic.add(elastic.to128());\\n    }\\n\\n    /// @notice Subtract `elastic` from `total` and update storage.\\n    /// @return newElastic Returns updated `elastic`.\\n    function subElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {\\n        newElastic = total.elastic = total.elastic.sub(elastic.to128());\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringOwnable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n// Source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol + Claimable.sol\\n// Edited by BoringCrypto\\n\\ncontract BoringOwnableData {\\n    address public owner;\\n    address public pendingOwner;\\n}\\n\\ncontract BoringOwnable is BoringOwnableData {\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /// @notice `owner` defaults to msg.sender on construction.\\n    constructor() public {\\n        owner = msg.sender;\\n        emit OwnershipTransferred(address(0), msg.sender);\\n    }\\n\\n    /// @notice Transfers ownership to `newOwner`. Either directly or claimable by the new pending owner.\\n    /// Can only be invoked by the current `owner`.\\n    /// @param newOwner Address of the new owner.\\n    /// @param direct True if `newOwner` should be set immediately. False if `newOwner` needs to use `claimOwnership`.\\n    /// @param renounce Allows the `newOwner` to be `address(0)` if `direct` and `renounce` is True. Has no effect otherwise.\\n    function transferOwnership(\\n        address newOwner,\\n        bool direct,\\n        bool renounce\\n    ) public onlyOwner {\\n        if (direct) {\\n            // Checks\\n            require(newOwner != address(0) || renounce, \\\"Ownable: zero address\\\");\\n\\n            // Effects\\n            emit OwnershipTransferred(owner, newOwner);\\n            owner = newOwner;\\n            pendingOwner = address(0);\\n        } else {\\n            // Effects\\n            pendingOwner = newOwner;\\n        }\\n    }\\n\\n    /// @notice Needs to be called by `pendingOwner` to claim ownership.\\n    function claimOwnership() public {\\n        address _pendingOwner = pendingOwner;\\n\\n        // Checks\\n        require(msg.sender == _pendingOwner, \\\"Ownable: caller != pending owner\\\");\\n\\n        // Effects\\n        emit OwnershipTransferred(owner, _pendingOwner);\\n        owner = _pendingOwner;\\n        pendingOwner = address(0);\\n    }\\n\\n    /// @notice Only allows the `owner` to execute the function.\\n    modifier onlyOwner() {\\n        require(msg.sender == owner, \\\"Ownable: caller is not the owner\\\");\\n        _;\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/interfaces/IMasterContract.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ninterface IMasterContract {\\n    /// @notice Init function that gets called from `BoringFactory.deploy`.\\n    /// Also kown as the constructor for cloned contracts.\\n    /// Any ETH send to `BoringFactory.deploy` ends up here.\\n    /// @param data Can be abi encoded arguments or anything else.\\n    function init(bytes calldata data) external payable;\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringFactory.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ncontract BoringFactory {\\n    event LogDeploy(address indexed masterContract, bytes data, address indexed cloneAddress);\\n\\n    /// @notice Mapping from clone contracts to their masterContract.\\n    mapping(address => address) public masterContractOf;\\n\\n    /// @notice Deploys a given master Contract as a clone.\\n    /// Any ETH transferred with this call is forwarded to the new clone.\\n    /// Emits `LogDeploy`.\\n    /// @param masterContract The address of the contract to clone.\\n    /// @param data Additional abi encoded calldata that is passed to the new clone via `IMasterContract.init`.\\n    /// @param useCreate2 Creates the clone by using the CREATE2 opcode, in this case `data` will be used as salt.\\n    /// @return cloneAddress Address of the created clone contract.\\n    function deploy(\\n        address masterContract,\\n        bytes calldata data,\\n        bool useCreate2\\n    ) public payable returns (address cloneAddress) {\\n        require(masterContract != address(0), \\\"BoringFactory: No masterContract\\\");\\n        bytes20 targetBytes = bytes20(masterContract); // Takes the first 20 bytes of the masterContract's address\\n\\n        if (useCreate2) {\\n            // each masterContract has different code already. So clones are distinguished by their data only.\\n            bytes32 salt = keccak256(data);\\n\\n            // Creates clone, more info here: https://blog.openzeppelin.com/deep-dive-into-the-minimal-proxy-contract/\\n            assembly {\\n                let clone := mload(0x40)\\n                mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n                mstore(add(clone, 0x14), targetBytes)\\n                mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n                cloneAddress := create2(0, clone, 0x37, salt)\\n            }\\n        } else {\\n            assembly {\\n                let clone := mload(0x40)\\n                mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n                mstore(add(clone, 0x14), targetBytes)\\n                mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n                cloneAddress := create(0, clone, 0x37)\\n            }\\n        }\\n        masterContractOf[cloneAddress] = masterContract;\\n\\n        IMasterContract(cloneAddress).init{value: msg.value}(data);\\n\\n        emit LogDeploy(masterContract, data, cloneAddress);\\n    }\\n}\\n\\n// File contracts/MasterContractManager.sol\\n// License-Identifier: UNLICENSED\\n\\ncontract MasterContractManager is BoringOwnable, BoringFactory {\\n    event LogWhiteListMasterContract(address indexed masterContract, bool approved);\\n    event LogSetMasterContractApproval(address indexed masterContract, address indexed user, bool approved);\\n    event LogRegisterProtocol(address indexed protocol);\\n\\n    /// @notice masterContract to user to approval state\\n    mapping(address => mapping(address => bool)) public masterContractApproved;\\n    /// @notice masterContract to whitelisted state for approval without signed message\\n    mapping(address => bool) public whitelistedMasterContracts;\\n    /// @notice user nonces for masterContract approvals\\n    mapping(address => uint256) public nonces;\\n\\n    bytes32 private constant DOMAIN_SEPARATOR_SIGNATURE_HASH = keccak256(\\\"EIP712Domain(string name,uint256 chainId,address verifyingContract)\\\");\\n    // See https://eips.ethereum.org/EIPS/eip-191\\n    string private constant EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA = \\\"\\\\x19\\\\x01\\\";\\n    bytes32 private constant APPROVAL_SIGNATURE_HASH =\\n        keccak256(\\\"SetMasterContractApproval(string warning,address user,address masterContract,bool approved,uint256 nonce)\\\");\\n\\n    // solhint-disable-next-line var-name-mixedcase\\n    bytes32 private immutable _DOMAIN_SEPARATOR;\\n    // solhint-disable-next-line var-name-mixedcase\\n    uint256 private immutable DOMAIN_SEPARATOR_CHAIN_ID;\\n\\n    constructor() public {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        _DOMAIN_SEPARATOR = _calculateDomainSeparator(DOMAIN_SEPARATOR_CHAIN_ID = chainId);\\n    }\\n\\n    function _calculateDomainSeparator(uint256 chainId) private view returns (bytes32) {\\n        return keccak256(abi.encode(DOMAIN_SEPARATOR_SIGNATURE_HASH, keccak256(\\\"BentoBox V1\\\"), chainId, address(this)));\\n    }\\n\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() public view returns (bytes32) {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        return chainId == DOMAIN_SEPARATOR_CHAIN_ID ? _DOMAIN_SEPARATOR : _calculateDomainSeparator(chainId);\\n    }\\n\\n    /// @notice Other contracts need to register with this master contract so that users can approve them for the BentoBox.\\n    function registerProtocol() public {\\n        masterContractOf[msg.sender] = msg.sender;\\n        emit LogRegisterProtocol(msg.sender);\\n    }\\n\\n    /// @notice Enables or disables a contract for approval without signed message.\\n    function whitelistMasterContract(address masterContract, bool approved) public onlyOwner {\\n        // Checks\\n        require(masterContract != address(0), \\\"MasterCMgr: Cannot approve 0\\\");\\n\\n        // Effects\\n        whitelistedMasterContracts[masterContract] = approved;\\n        emit LogWhiteListMasterContract(masterContract, approved);\\n    }\\n\\n    /// @notice Approves or revokes a `masterContract` access to `user` funds.\\n    /// @param user The address of the user that approves or revokes access.\\n    /// @param masterContract The address who gains or loses access.\\n    /// @param approved If True approves access. If False revokes access.\\n    /// @param v Part of the signature. (See EIP-191)\\n    /// @param r Part of the signature. (See EIP-191)\\n    /// @param s Part of the signature. (See EIP-191)\\n    // F4 - Check behaviour for all function arguments when wrong or extreme\\n    // F4: Don't allow masterContract 0 to be approved. Unknown contracts will have a masterContract of 0.\\n    // F4: User can't be 0 for signed approvals because the recoveredAddress will be 0 if ecrecover fails\\n    function setMasterContractApproval(\\n        address user,\\n        address masterContract,\\n        bool approved,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) public {\\n        // Checks\\n        require(masterContract != address(0), \\\"MasterCMgr: masterC not set\\\"); // Important for security\\n\\n        // If no signature is provided, the fallback is executed\\n        if (r == 0 && s == 0 && v == 0) {\\n            require(user == msg.sender, \\\"MasterCMgr: user not sender\\\");\\n            require(masterContractOf[user] == address(0), \\\"MasterCMgr: user is clone\\\");\\n            require(whitelistedMasterContracts[masterContract], \\\"MasterCMgr: not whitelisted\\\");\\n        } else {\\n            // Important for security - any address without masterContract has address(0) as masterContract\\n            // So approving address(0) would approve every address, leading to full loss of funds\\n            // Also, ecrecover returns address(0) on failure. So we check this:\\n            require(user != address(0), \\\"MasterCMgr: User cannot be 0\\\");\\n\\n            // C10 - Protect signatures against replay, use nonce and chainId (SWC-121)\\n            // C10: nonce + chainId are used to prevent replays\\n            // C11 - All signatures strictly EIP-712 (SWC-117 SWC-122)\\n            // C11: signature is EIP-712 compliant\\n            // C12 - abi.encodePacked can't contain variable length user input (SWC-133)\\n            // C12: abi.encodePacked has fixed length parameters\\n            bytes32 digest =\\n                keccak256(\\n                    abi.encodePacked(\\n                        EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA,\\n                        DOMAIN_SEPARATOR(),\\n                        keccak256(\\n                            abi.encode(\\n                                APPROVAL_SIGNATURE_HASH,\\n                                approved\\n                                    ? keccak256(\\\"Give FULL access to funds in (and approved to) BentoBox?\\\")\\n                                    : keccak256(\\\"Revoke access to BentoBox?\\\"),\\n                                user,\\n                                masterContract,\\n                                approved,\\n                                nonces[user]++\\n                            )\\n                        )\\n                    )\\n                );\\n            address recoveredAddress = ecrecover(digest, v, r, s);\\n            require(recoveredAddress == user, \\\"MasterCMgr: Invalid Signature\\\");\\n        }\\n\\n        // Effects\\n        masterContractApproved[masterContract][user] = approved;\\n        emit LogSetMasterContractApproval(masterContract, user, approved);\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringBatchable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ncontract BaseBoringBatchable {\\n    /// @dev Helper function to extract a useful revert message from a failed call.\\n    /// If the returned data is malformed or not correctly abi encoded then this call can fail itself.\\n    function _getRevertMsg(bytes memory _returnData) internal pure returns (string memory) {\\n        // If the _res length is less than 68, then the transaction failed silently (without a revert message)\\n        if (_returnData.length < 68) return \\\"Transaction reverted silently\\\";\\n\\n        assembly {\\n            // Slice the sighash.\\n            _returnData := add(_returnData, 0x04)\\n        }\\n        return abi.decode(_returnData, (string)); // All that remains is the revert string\\n    }\\n\\n    /// @notice Allows batched call to self (this contract).\\n    /// @param calls An array of inputs for each call.\\n    /// @param revertOnFail If True then reverts after a failed call and stops doing further calls.\\n    /// @return successes An array indicating the success of a call, mapped one-to-one to `calls`.\\n    /// @return results An array with the returned data of each function call, mapped one-to-one to `calls`.\\n    // F1: External is ok here because this is the batch function, adding it to a batch makes no sense\\n    // F2: Calls in the batch may be payable, delegatecall operates in the same context, so each call in the batch has access to msg.value\\n    // C3: The length of the loop is fully under user control, so can't be exploited\\n    // C7: Delegatecall is only used on the same contract, so it's safe\\n    function batch(bytes[] calldata calls, bool revertOnFail) external payable returns (bool[] memory successes, bytes[] memory results) {\\n        successes = new bool[](calls.length);\\n        results = new bytes[](calls.length);\\n        for (uint256 i = 0; i < calls.length; i++) {\\n            (bool success, bytes memory result) = address(this).delegatecall(calls[i]);\\n            require(success || !revertOnFail, _getRevertMsg(result));\\n            successes[i] = success;\\n            results[i] = result;\\n        }\\n    }\\n}\\n\\ncontract BoringBatchable is BaseBoringBatchable {\\n    /// @notice Call wrapper that performs `ERC20.permit` on `token`.\\n    /// Lookup `IERC20.permit`.\\n    // F6: Parameters can be used front-run the permit and the user's permit will fail (due to nonce or other revert)\\n    //     if part of a batch this could be used to grief once as the second call would not need the permit\\n    function permitToken(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) public {\\n        token.permit(from, to, amount, deadline, v, r, s);\\n    }\\n}\\n\\n// File contracts/BentoBox.sol\\n// License-Identifier: UNLICENSED\\n\\n/// @title BentoBox\\n/// @author BoringCrypto, Keno\\n/// @notice The BentoBox is a vault for tokens. The stored tokens can be flash loaned and used in strategies.\\n/// Yield from this will go to the token depositors.\\n/// Rebasing tokens ARE NOT supported and WILL cause loss of funds.\\n/// Any funds transfered directly onto the BentoBox will be lost, use the deposit function instead.\\ncontract BentoBoxV1 is MasterContractManager, BoringBatchable {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n    using BoringERC20 for IERC20;\\n    using RebaseLibrary for Rebase;\\n\\n    // ************** //\\n    // *** EVENTS *** //\\n    // ************** //\\n\\n    event LogDeposit(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogWithdraw(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogTransfer(IERC20 indexed token, address indexed from, address indexed to, uint256 share);\\n\\n    event LogFlashLoan(address indexed borrower, IERC20 indexed token, uint256 amount, uint256 feeAmount, address indexed receiver);\\n\\n    event LogStrategyTargetPercentage(IERC20 indexed token, uint256 targetPercentage);\\n    event LogStrategyQueued(IERC20 indexed token, IStrategy indexed strategy);\\n    event LogStrategySet(IERC20 indexed token, IStrategy indexed strategy);\\n    event LogStrategyInvest(IERC20 indexed token, uint256 amount);\\n    event LogStrategyDivest(IERC20 indexed token, uint256 amount);\\n    event LogStrategyProfit(IERC20 indexed token, uint256 amount);\\n    event LogStrategyLoss(IERC20 indexed token, uint256 amount);\\n\\n    // *************** //\\n    // *** STRUCTS *** //\\n    // *************** //\\n\\n    struct StrategyData {\\n        uint64 strategyStartDate;\\n        uint64 targetPercentage;\\n        uint128 balance; // the balance of the strategy that BentoBox thinks is in there\\n    }\\n\\n    // ******************************** //\\n    // *** CONSTANTS AND IMMUTABLES *** //\\n    // ******************************** //\\n\\n    // V2 - Can they be private?\\n    // V2: Private to save gas, to verify it's correct, check the constructor arguments\\n    IERC20 private immutable wethToken;\\n\\n    IERC20 private constant USE_ETHEREUM = IERC20(0);\\n    uint256 private constant FLASH_LOAN_FEE = 50; // 0.05%\\n    uint256 private constant FLASH_LOAN_FEE_PRECISION = 1e5;\\n    uint256 private constant STRATEGY_DELAY = 2 weeks;\\n    uint256 private constant MAX_TARGET_PERCENTAGE = 95; // 95%\\n    uint256 private constant MINIMUM_SHARE_BALANCE = 1000; // To prevent the ratio going off\\n\\n    // ***************** //\\n    // *** VARIABLES *** //\\n    // ***************** //\\n\\n    // Balance per token per address/contract in shares\\n    mapping(IERC20 => mapping(address => uint256)) public balanceOf;\\n\\n    // Rebase from amount to share\\n    mapping(IERC20 => Rebase) public totals;\\n\\n    mapping(IERC20 => IStrategy) public strategy;\\n    mapping(IERC20 => IStrategy) public pendingStrategy;\\n    mapping(IERC20 => StrategyData) public strategyData;\\n\\n    // ******************* //\\n    // *** CONSTRUCTOR *** //\\n    // ******************* //\\n\\n    constructor(IERC20 wethToken_) public {\\n        wethToken = wethToken_;\\n    }\\n\\n    // ***************** //\\n    // *** MODIFIERS *** //\\n    // ***************** //\\n\\n    /// Modifier to check if the msg.sender is allowed to use funds belonging to the 'from' address.\\n    /// If 'from' is msg.sender, it's allowed.\\n    /// If 'from' is the BentoBox itself, it's allowed. Any ETH, token balances (above the known balances) or BentoBox balances\\n    /// can be taken by anyone.\\n    /// This is to enable skimming, not just for deposits, but also for withdrawals or transfers, enabling better composability.\\n    /// If 'from' is a clone of a masterContract AND the 'from' address has approved that masterContract, it's allowed.\\n    modifier allowed(address from) {\\n        if (from != msg.sender && from != address(this)) {\\n            // From is sender or you are skimming\\n            address masterContract = masterContractOf[msg.sender];\\n            require(masterContract != address(0), \\\"BentoBox: no masterContract\\\");\\n            require(masterContractApproved[masterContract][from], \\\"BentoBox: Transfer not approved\\\");\\n        }\\n        _;\\n    }\\n\\n    // ************************** //\\n    // *** INTERNAL FUNCTIONS *** //\\n    // ************************** //\\n\\n    /// @dev Returns the total balance of `token` this contracts holds,\\n    /// plus the total amount this contract thinks the strategy holds.\\n    function _tokenBalanceOf(IERC20 token) internal view returns (uint256 amount) {\\n        amount = token.balanceOf(address(this)).add(strategyData[token].balance);\\n    }\\n\\n    // ************************ //\\n    // *** PUBLIC FUNCTIONS *** //\\n    // ************************ //\\n\\n    /// @dev Helper function to represent an `amount` of `token` in shares.\\n    /// @param token The ERC-20 token.\\n    /// @param amount The `token` amount.\\n    /// @param roundUp If the result `share` should be rounded up.\\n    /// @return share The token amount represented in shares.\\n    function toShare(\\n        IERC20 token,\\n        uint256 amount,\\n        bool roundUp\\n    ) external view returns (uint256 share) {\\n        share = totals[token].toBase(amount, roundUp);\\n    }\\n\\n    /// @dev Helper function represent shares back into the `token` amount.\\n    /// @param token The ERC-20 token.\\n    /// @param share The amount of shares.\\n    /// @param roundUp If the result should be rounded up.\\n    /// @return amount The share amount back into native representation.\\n    function toAmount(\\n        IERC20 token,\\n        uint256 share,\\n        bool roundUp\\n    ) external view returns (uint256 amount) {\\n        amount = totals[token].toElastic(share, roundUp);\\n    }\\n\\n    /// @notice Deposit an amount of `token` represented in either `amount` or `share`.\\n    /// @param token_ The ERC-20 token to deposit.\\n    /// @param from which account to pull the tokens.\\n    /// @param to which account to push the tokens.\\n    /// @param amount Token amount in native representation to deposit.\\n    /// @param share Token amount represented in shares to deposit. Takes precedence over `amount`.\\n    /// @return amountOut The amount deposited.\\n    /// @return shareOut The deposited amount repesented in shares.\\n    function deposit(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) public payable allowed(from) returns (uint256 amountOut, uint256 shareOut) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;\\n        Rebase memory total = totals[token];\\n\\n        // If a new token gets added, the tokenSupply call checks that this is a deployed contract. Needed for security.\\n        require(total.elastic != 0 || token.totalSupply() > 0, \\\"BentoBox: No tokens\\\");\\n        if (share == 0) {\\n            // value of the share may be lower than the amount due to rounding, that's ok\\n            share = total.toBase(amount, false);\\n            // Any deposit should lead to at least the minimum share balance, otherwise it's ignored (no amount taken)\\n            if (total.base.add(share.to128()) < MINIMUM_SHARE_BALANCE) {\\n                return (0, 0);\\n            }\\n        } else {\\n            // amount may be lower than the value of share due to rounding, in that case, add 1 to amount (Always round up)\\n            amount = total.toElastic(share, true);\\n        }\\n\\n        // In case of skimming, check that only the skimmable amount is taken.\\n        // For ETH, the full balance is available, so no need to check.\\n        // During flashloans the _tokenBalanceOf is lower than 'reality', so skimming deposits will mostly fail during a flashloan.\\n        require(\\n            from != address(this) || token_ == USE_ETHEREUM || amount <= _tokenBalanceOf(token).sub(total.elastic),\\n            \\\"BentoBox: Skim too much\\\"\\n        );\\n\\n        balanceOf[token][to] = balanceOf[token][to].add(share);\\n        total.base = total.base.add(share.to128());\\n        total.elastic = total.elastic.add(amount.to128());\\n        totals[token] = total;\\n\\n        // Interactions\\n        // During the first deposit, we check that this token is 'real'\\n        if (token_ == USE_ETHEREUM) {\\n            // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)\\n            // X2: If the WETH implementation is faulty or malicious, it will block adding ETH (but we know the WETH implementation)\\n            IWETH(address(wethToken)).deposit{value: amount}();\\n        } else if (from != address(this)) {\\n            // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)\\n            // X2: If the token implementation is faulty or malicious, it may block adding tokens. Good.\\n            token.safeTransferFrom(from, address(this), amount);\\n        }\\n        emit LogDeposit(token, from, to, amount, share);\\n        amountOut = amount;\\n        shareOut = share;\\n    }\\n\\n    /// @notice Withdraws an amount of `token` from a user account.\\n    /// @param token_ The ERC-20 token to withdraw.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param amount of tokens. Either one of `amount` or `share` needs to be supplied.\\n    /// @param share Like above, but `share` takes precedence over `amount`.\\n    function withdraw(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) public allowed(from) returns (uint256 amountOut, uint256 shareOut) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;\\n        Rebase memory total = totals[token];\\n        if (share == 0) {\\n            // value of the share paid could be lower than the amount paid due to rounding, in that case, add a share (Always round up)\\n            share = total.toBase(amount, true);\\n        } else {\\n            // amount may be lower than the value of share due to rounding, that's ok\\n            amount = total.toElastic(share, false);\\n        }\\n\\n        balanceOf[token][from] = balanceOf[token][from].sub(share);\\n        total.elastic = total.elastic.sub(amount.to128());\\n        total.base = total.base.sub(share.to128());\\n        // There have to be at least 1000 shares left to prevent reseting the share/amount ratio (unless it's fully emptied)\\n        require(total.base >= MINIMUM_SHARE_BALANCE || total.base == 0, \\\"BentoBox: cannot empty\\\");\\n        totals[token] = total;\\n\\n        // Interactions\\n        if (token_ == USE_ETHEREUM) {\\n            // X2, X3: A revert or big gas usage in the WETH contract could block withdrawals, but WETH9 is fine.\\n            IWETH(address(wethToken)).withdraw(amount);\\n            // X2, X3: A revert or big gas usage could block, however, the to address is under control of the caller.\\n            (bool success, ) = to.call{value: amount}(\\\"\\\");\\n            require(success, \\\"BentoBox: ETH transfer failed\\\");\\n        } else {\\n            // X2, X3: A malicious token could block withdrawal of just THAT token.\\n            //         masterContracts may want to take care not to rely on withdraw always succeeding.\\n            token.safeTransfer(to, amount);\\n        }\\n        emit LogWithdraw(token, from, to, amount, share);\\n        amountOut = amount;\\n        shareOut = share;\\n    }\\n\\n    /// @notice Transfer shares from a user account to another one.\\n    /// @param token The ERC-20 token to transfer.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param share The amount of `token` in shares.\\n    // Clones of master contracts can transfer from any account that has approved them\\n    // F3 - Can it be combined with another similar function?\\n    // F3: This isn't combined with transferMultiple for gas optimization\\n    function transfer(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 share\\n    ) public allowed(from) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        balanceOf[token][from] = balanceOf[token][from].sub(share);\\n        balanceOf[token][to] = balanceOf[token][to].add(share);\\n\\n        emit LogTransfer(token, from, to, share);\\n    }\\n\\n    /// @notice Transfer shares from a user account to multiple other ones.\\n    /// @param token The ERC-20 token to transfer.\\n    /// @param from which user to pull the tokens.\\n    /// @param tos The receivers of the tokens.\\n    /// @param shares The amount of `token` in shares for each receiver in `tos`.\\n    // F3 - Can it be combined with another similar function?\\n    // F3: This isn't combined with transfer for gas optimization\\n    function transferMultiple(\\n        IERC20 token,\\n        address from,\\n        address[] calldata tos,\\n        uint256[] calldata shares\\n    ) public allowed(from) {\\n        // Checks\\n        require(tos[0] != address(0), \\\"BentoBox: to[0] not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        uint256 totalAmount;\\n        uint256 len = tos.length;\\n        for (uint256 i = 0; i < len; i++) {\\n            address to = tos[i];\\n            balanceOf[token][to] = balanceOf[token][to].add(shares[i]);\\n            totalAmount = totalAmount.add(shares[i]);\\n            emit LogTransfer(token, from, to, shares[i]);\\n        }\\n        balanceOf[token][from] = balanceOf[token][from].sub(totalAmount);\\n    }\\n\\n    /// @notice Flashloan ability.\\n    /// @param borrower The address of the contract that implements and conforms to `IFlashBorrower` and handles the flashloan.\\n    /// @param receiver Address of the token receiver.\\n    /// @param token The address of the token to receive.\\n    /// @param amount of the tokens to receive.\\n    /// @param data The calldata to pass to the `borrower` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Not possible to follow this here, reentrancy has been reviewed\\n    // F6 - Check for front-running possibilities, such as the approve function (SWC-114)\\n    // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.\\n    function flashLoan(\\n        IFlashBorrower borrower,\\n        address receiver,\\n        IERC20 token,\\n        uint256 amount,\\n        bytes calldata data\\n    ) public {\\n        uint256 fee = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;\\n        token.safeTransfer(receiver, amount);\\n\\n        borrower.onFlashLoan(msg.sender, token, amount, fee, data);\\n\\n        require(_tokenBalanceOf(token) >= totals[token].addElastic(fee.to128()), \\\"BentoBox: Wrong amount\\\");\\n        emit LogFlashLoan(address(borrower), token, amount, fee, receiver);\\n    }\\n\\n    /// @notice Support for batched flashloans. Useful to request multiple different `tokens` in a single transaction.\\n    /// @param borrower The address of the contract that implements and conforms to `IBatchFlashBorrower` and handles the flashloan.\\n    /// @param receivers An array of the token receivers. A one-to-one mapping with `tokens` and `amounts`.\\n    /// @param tokens The addresses of the tokens.\\n    /// @param amounts of the tokens for each receiver.\\n    /// @param data The calldata to pass to the `borrower` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Not possible to follow this here, reentrancy has been reviewed\\n    // F6 - Check for front-running possibilities, such as the approve function (SWC-114)\\n    // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.\\n    function batchFlashLoan(\\n        IBatchFlashBorrower borrower,\\n        address[] calldata receivers,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        bytes calldata data\\n    ) public {\\n        uint256[] memory fees = new uint256[](tokens.length);\\n\\n        uint256 len = tokens.length;\\n        for (uint256 i = 0; i < len; i++) {\\n            uint256 amount = amounts[i];\\n            fees[i] = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;\\n\\n            tokens[i].safeTransfer(receivers[i], amounts[i]);\\n        }\\n\\n        borrower.onBatchFlashLoan(msg.sender, tokens, amounts, fees, data);\\n\\n        for (uint256 i = 0; i < len; i++) {\\n            IERC20 token = tokens[i];\\n            require(_tokenBalanceOf(token) >= totals[token].addElastic(fees[i].to128()), \\\"BentoBox: Wrong amount\\\");\\n            emit LogFlashLoan(address(borrower), token, amounts[i], fees[i], receivers[i]);\\n        }\\n    }\\n\\n    /// @notice Sets the target percentage of the strategy for `token`.\\n    /// @dev Only the owner of this contract is allowed to change this.\\n    /// @param token The address of the token that maps to a strategy to change.\\n    /// @param targetPercentage_ The new target in percent. Must be lesser or equal to `MAX_TARGET_PERCENTAGE`.\\n    function setStrategyTargetPercentage(IERC20 token, uint64 targetPercentage_) public onlyOwner {\\n        // Checks\\n        require(targetPercentage_ <= MAX_TARGET_PERCENTAGE, \\\"StrategyManager: Target too high\\\");\\n\\n        // Effects\\n        strategyData[token].targetPercentage = targetPercentage_;\\n        emit LogStrategyTargetPercentage(token, targetPercentage_);\\n    }\\n\\n    /// @notice Sets the contract address of a new strategy that conforms to `IStrategy` for `token`.\\n    /// Must be called twice with the same arguments.\\n    /// A new strategy becomes pending first and can be activated once `STRATEGY_DELAY` is over.\\n    /// @dev Only the owner of this contract is allowed to change this.\\n    /// @param token The address of the token that maps to a strategy to change.\\n    /// @param newStrategy The address of the contract that conforms to `IStrategy`.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Total amount is updated AFTER interaction. But strategy is under our control.\\n    // C4 - Use block.timestamp only for long intervals (SWC-116)\\n    // C4: block.timestamp is used for a period of 2 weeks, which is long enough\\n    function setStrategy(IERC20 token, IStrategy newStrategy) public onlyOwner {\\n        StrategyData memory data = strategyData[token];\\n        IStrategy pending = pendingStrategy[token];\\n        if (data.strategyStartDate == 0 || pending != newStrategy) {\\n            pendingStrategy[token] = newStrategy;\\n            // C1 - All math done through BoringMath (SWC-101)\\n            // C1: Our sun will swallow the earth well before this overflows\\n            data.strategyStartDate = (block.timestamp + STRATEGY_DELAY).to64();\\n            emit LogStrategyQueued(token, newStrategy);\\n        } else {\\n            require(data.strategyStartDate != 0 && block.timestamp >= data.strategyStartDate, \\\"StrategyManager: Too early\\\");\\n            if (address(strategy[token]) != address(0)) {\\n                int256 balanceChange = strategy[token].exit(data.balance);\\n                // Effects\\n                if (balanceChange > 0) {\\n                    uint256 add = uint256(balanceChange);\\n                    totals[token].addElastic(add);\\n                    emit LogStrategyProfit(token, add);\\n                } else if (balanceChange < 0) {\\n                    uint256 sub = uint256(-balanceChange);\\n                    totals[token].subElastic(sub);\\n                    emit LogStrategyLoss(token, sub);\\n                }\\n\\n                emit LogStrategyDivest(token, data.balance);\\n            }\\n            strategy[token] = pending;\\n            data.strategyStartDate = 0;\\n            data.balance = 0;\\n            pendingStrategy[token] = IStrategy(0);\\n            emit LogStrategySet(token, newStrategy);\\n        }\\n        strategyData[token] = data;\\n    }\\n\\n    /// @notice The actual process of yield farming. Executes the strategy of `token`.\\n    /// Optionally does housekeeping if `balance` is true.\\n    /// `maxChangeAmount` is relevant for skimming or withdrawing if `balance` is true.\\n    /// @param token The address of the token for which a strategy is deployed.\\n    /// @param balance True if housekeeping should be done.\\n    /// @param maxChangeAmount The maximum amount for either pulling or pushing from/to the `IStrategy` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Total amount is updated AFTER interaction. But strategy is under our control.\\n    // F5: Not followed to prevent reentrancy issues with flashloans and BentoBox skims?\\n    function harvest(\\n        IERC20 token,\\n        bool balance,\\n        uint256 maxChangeAmount\\n    ) public {\\n        StrategyData memory data = strategyData[token];\\n        IStrategy _strategy = strategy[token];\\n        int256 balanceChange = _strategy.harvest(data.balance, msg.sender);\\n        if (balanceChange == 0 && !balance) {\\n            return;\\n        }\\n\\n        uint256 totalElastic = totals[token].elastic;\\n\\n        if (balanceChange > 0) {\\n            uint256 add = uint256(balanceChange);\\n            totalElastic = totalElastic.add(add);\\n            totals[token].elastic = totalElastic.to128();\\n            emit LogStrategyProfit(token, add);\\n        } else if (balanceChange < 0) {\\n            // C1 - All math done through BoringMath (SWC-101)\\n            // C1: balanceChange could overflow if it's max negative int128.\\n            // But tokens with balances that large are not supported by the BentoBox.\\n            uint256 sub = uint256(-balanceChange);\\n            totalElastic = totalElastic.sub(sub);\\n            totals[token].elastic = totalElastic.to128();\\n            data.balance = data.balance.sub(sub.to128());\\n            emit LogStrategyLoss(token, sub);\\n        }\\n\\n        if (balance) {\\n            uint256 targetBalance = totalElastic.mul(data.targetPercentage) / 100;\\n            // if data.balance == targetBalance there is nothing to update\\n            if (data.balance < targetBalance) {\\n                uint256 amountOut = targetBalance.sub(data.balance);\\n                if (maxChangeAmount != 0 && amountOut > maxChangeAmount) {\\n                    amountOut = maxChangeAmount;\\n                }\\n                token.safeTransfer(address(_strategy), amountOut);\\n                data.balance = data.balance.add(amountOut.to128());\\n                _strategy.skim(amountOut);\\n                emit LogStrategyInvest(token, amountOut);\\n            } else if (data.balance > targetBalance) {\\n                uint256 amountIn = data.balance.sub(targetBalance.to128());\\n                if (maxChangeAmount != 0 && amountIn > maxChangeAmount) {\\n                    amountIn = maxChangeAmount;\\n                }\\n\\n                uint256 actualAmountIn = _strategy.withdraw(amountIn);\\n\\n                data.balance = data.balance.sub(actualAmountIn.to128());\\n                emit LogStrategyDivest(token, actualAmountIn);\\n            }\\n        }\\n\\n        strategyData[token] = data;\\n    }\\n\\n    // Contract should be able to receive ETH deposits to support deposit & skim\\n    // solhint-disable-next-line no-empty-blocks\\n    receive() external payable {}\\n}\\n\",\"keccak256\":\"0xf5251397b9aaa5c66ddc18b0cb96350ffac09f5776a1255fedc0072641f916fe\",\"license\":\"UNLICENSED\"}},\"version\":1}",
          "storageLayout": {
            "storage": [
              {
                "astId": 900,
                "contract": "contracts/bentobox/BentoBoxV1.sol:BoringOwnableData",
                "label": "owner",
                "offset": 0,
                "slot": "0",
                "type": "t_address"
              },
              {
                "astId": 902,
                "contract": "contracts/bentobox/BentoBoxV1.sol:BoringOwnableData",
                "label": "pendingOwner",
                "offset": 0,
                "slot": "1",
                "type": "t_address"
              }
            ],
            "types": {
              "t_address": {
                "encoding": "inplace",
                "label": "address",
                "numberOfBytes": "20"
              }
            }
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        },
        "IBatchFlashBorrower": {
          "abi": [
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "sender",
                  "type": "address"
                },
                {
                  "internalType": "contract IERC20[]",
                  "name": "tokens",
                  "type": "address[]"
                },
                {
                  "internalType": "uint256[]",
                  "name": "amounts",
                  "type": "uint256[]"
                },
                {
                  "internalType": "uint256[]",
                  "name": "fees",
                  "type": "uint256[]"
                },
                {
                  "internalType": "bytes",
                  "name": "data",
                  "type": "bytes"
                }
              ],
              "name": "onBatchFlashLoan",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {
              "onBatchFlashLoan(address,address[],uint256[],uint256[],bytes)": {
                "params": {
                  "amounts": "A one-to-one map to `tokens` that is loaned.",
                  "data": "Additional data that was passed to the flashloan function.",
                  "fees": "A one-to-one map to `tokens` that needs to be paid on top for each loan. Needs to be the same token.",
                  "sender": "The address of the invoker of this flashloan.",
                  "tokens": "Array of addresses for ERC-20 tokens that is loaned."
                }
              }
            },
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "gasEstimates": null,
            "methodIdentifiers": {
              "onBatchFlashLoan(address,address[],uint256[],uint256[],bytes)": "d9d17623"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"contract IERC20[]\",\"name\":\"tokens\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"fees\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"onBatchFlashLoan\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"onBatchFlashLoan(address,address[],uint256[],uint256[],bytes)\":{\"params\":{\"amounts\":\"A one-to-one map to `tokens` that is loaned.\",\"data\":\"Additional data that was passed to the flashloan function.\",\"fees\":\"A one-to-one map to `tokens` that needs to be paid on top for each loan. Needs to be the same token.\",\"sender\":\"The address of the invoker of this flashloan.\",\"tokens\":\"Array of addresses for ERC-20 tokens that is loaned.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"onBatchFlashLoan(address,address[],uint256[],uint256[],bytes)\":{\"notice\":\"The callback for batched flashloans. Every amount + fee needs to repayed to msg.sender before this call returns.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/bentobox/BentoBoxV1.sol\":\"IBatchFlashBorrower\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/bentobox/BentoBoxV1.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\n// The BentoBox\\n\\n//  \\u2584\\u2584\\u2584\\u2584\\u00b7 \\u2584\\u2584\\u2584 . \\u2590 \\u2584 \\u2584\\u2584\\u2584\\u2584\\u2584      \\u2584\\u2584\\u2584\\u2584\\u00b7       \\u2590\\u2584\\u2022 \\u2584\\n//  \\u2590\\u2588 \\u2580\\u2588\\u25aa\\u2580\\u2584.\\u2580\\u00b7\\u2588\\u258c\\u2590\\u2588\\u2022\\u2588\\u2588  \\u25aa     \\u2590\\u2588 \\u2580\\u2588\\u25aa\\u25aa      \\u2588\\u258c\\u2588\\u258c\\u25aa\\n//  \\u2590\\u2588\\u2580\\u2580\\u2588\\u2584\\u2590\\u2580\\u2580\\u25aa\\u2584\\u2590\\u2588\\u2590\\u2590\\u258c \\u2590\\u2588.\\u25aa \\u2584\\u2588\\u2580\\u2584 \\u2590\\u2588\\u2580\\u2580\\u2588\\u2584 \\u2584\\u2588\\u2580\\u2584  \\u00b7\\u2588\\u2588\\u00b7\\n//  \\u2588\\u2588\\u2584\\u25aa\\u2590\\u2588\\u2590\\u2588\\u2584\\u2584\\u258c\\u2588\\u2588\\u2590\\u2588\\u258c \\u2590\\u2588\\u258c\\u00b7\\u2590\\u2588\\u258c.\\u2590\\u258c\\u2588\\u2588\\u2584\\u25aa\\u2590\\u2588\\u2590\\u2588\\u258c.\\u2590\\u258c\\u25aa\\u2590\\u2588\\u00b7\\u2588\\u258c\\n//  \\u00b7\\u2580\\u2580\\u2580\\u2580  \\u2580\\u2580\\u2580 \\u2580\\u2580 \\u2588\\u25aa \\u2580\\u2580\\u2580  \\u2580\\u2588\\u2584\\u2580\\u25aa\\u00b7\\u2580\\u2580\\u2580\\u2580  \\u2580\\u2588\\u2584\\u2580\\u25aa\\u2022\\u2580\\u2580 \\u2580\\u2580\\n\\n// This contract stores funds, handles their transfers, supports flash loans and strategies.\\n\\n// Copyright (c) 2021 BoringCrypto - All rights reserved\\n// Twitter: @Boring_Crypto\\n\\n// Special thanks to Keno for all his hard work and support\\n\\n// Version 22-Mar-2021\\n\\npragma solidity 0.6.12;\\npragma experimental ABIEncoderV2;\\n\\n// solhint-disable avoid-low-level-calls\\n// solhint-disable not-rely-on-time\\n// solhint-disable no-inline-assembly\\n\\n// File @boringcrypto/boring-solidity/contracts/interfaces/IERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ninterface IERC20 {\\n    function totalSupply() external view returns (uint256);\\n\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /// @notice EIP 2612\\n    function permit(\\n        address owner,\\n        address spender,\\n        uint256 value,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) external;\\n}\\n\\n// File contracts/interfaces/IFlashLoan.sol\\n// License-Identifier: MIT\\n\\ninterface IFlashBorrower {\\n    /// @notice The flashloan callback. `amount` + `fee` needs to repayed to msg.sender before this call returns.\\n    /// @param sender The address of the invoker of this flashloan.\\n    /// @param token The address of the token that is loaned.\\n    /// @param amount of the `token` that is loaned.\\n    /// @param fee The fee that needs to be paid on top for this loan. Needs to be the same as `token`.\\n    /// @param data Additional data that was passed to the flashloan function.\\n    function onFlashLoan(\\n        address sender,\\n        IERC20 token,\\n        uint256 amount,\\n        uint256 fee,\\n        bytes calldata data\\n    ) external;\\n}\\n\\ninterface IBatchFlashBorrower {\\n    /// @notice The callback for batched flashloans. Every amount + fee needs to repayed to msg.sender before this call returns.\\n    /// @param sender The address of the invoker of this flashloan.\\n    /// @param tokens Array of addresses for ERC-20 tokens that is loaned.\\n    /// @param amounts A one-to-one map to `tokens` that is loaned.\\n    /// @param fees A one-to-one map to `tokens` that needs to be paid on top for each loan. Needs to be the same token.\\n    /// @param data Additional data that was passed to the flashloan function.\\n    function onBatchFlashLoan(\\n        address sender,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        uint256[] calldata fees,\\n        bytes calldata data\\n    ) external;\\n}\\n\\n// File contracts/interfaces/IWETH.sol\\n// License-Identifier: MIT\\n\\ninterface IWETH {\\n    function deposit() external payable;\\n\\n    function withdraw(uint256) external;\\n}\\n\\n// File contracts/interfaces/IStrategy.sol\\n// License-Identifier: MIT\\n\\ninterface IStrategy {\\n    /// @notice Send the assets to the Strategy and call skim to invest them.\\n    /// @param amount The amount of tokens to invest.\\n    function skim(uint256 amount) external;\\n\\n    /// @notice Harvest any profits made converted to the asset and pass them to the caller.\\n    /// @param balance The amount of tokens the caller thinks it has invested.\\n    /// @param sender The address of the initiator of this transaction. Can be used for reimbursements, etc.\\n    /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.\\n    function harvest(uint256 balance, address sender) external returns (int256 amountAdded);\\n\\n    /// @notice Withdraw assets. The returned amount can differ from the requested amount due to rounding.\\n    /// @dev The `actualAmount` should be very close to the amount.\\n    /// The difference should NOT be used to report a loss. That's what harvest is for.\\n    /// @param amount The requested amount the caller wants to withdraw.\\n    /// @return actualAmount The real amount that is withdrawn.\\n    function withdraw(uint256 amount) external returns (uint256 actualAmount);\\n\\n    /// @notice Withdraw all assets in the safest way possible. This shouldn't fail.\\n    /// @param balance The amount of tokens the caller thinks it has invested.\\n    /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.\\n    function exit(uint256 balance) external returns (int256 amountAdded);\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\nlibrary BoringERC20 {\\n    bytes4 private constant SIG_SYMBOL = 0x95d89b41; // symbol()\\n    bytes4 private constant SIG_NAME = 0x06fdde03; // name()\\n    bytes4 private constant SIG_DECIMALS = 0x313ce567; // decimals()\\n    bytes4 private constant SIG_TRANSFER = 0xa9059cbb; // transfer(address,uint256)\\n    bytes4 private constant SIG_TRANSFER_FROM = 0x23b872dd; // transferFrom(address,address,uint256)\\n\\n    /// @notice Provides a safe ERC20.transfer version for different ERC-20 implementations.\\n    /// Reverts on a failed transfer.\\n    /// @param token The address of the ERC-20 token.\\n    /// @param to Transfer tokens to.\\n    /// @param amount The token amount.\\n    function safeTransfer(\\n        IERC20 token,\\n        address to,\\n        uint256 amount\\n    ) internal {\\n        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER, to, amount));\\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: Transfer failed\\\");\\n    }\\n\\n    /// @notice Provides a safe ERC20.transferFrom version for different ERC-20 implementations.\\n    /// Reverts on a failed transfer.\\n    /// @param token The address of the ERC-20 token.\\n    /// @param from Transfer tokens from.\\n    /// @param to Transfer tokens to.\\n    /// @param amount The token amount.\\n    function safeTransferFrom(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 amount\\n    ) internal {\\n        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER_FROM, from, to, amount));\\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: TransferFrom failed\\\");\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringMath.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n/// @notice A library for performing overflow-/underflow-safe math,\\n/// updated with awesomeness from of DappHub (https://github.com/dapphub/ds-math).\\nlibrary BoringMath {\\n    function add(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require(b == 0 || (c = a * b) / b == a, \\\"BoringMath: Mul Overflow\\\");\\n    }\\n\\n    function to128(uint256 a) internal pure returns (uint128 c) {\\n        require(a <= uint128(-1), \\\"BoringMath: uint128 Overflow\\\");\\n        c = uint128(a);\\n    }\\n\\n    function to64(uint256 a) internal pure returns (uint64 c) {\\n        require(a <= uint64(-1), \\\"BoringMath: uint64 Overflow\\\");\\n        c = uint64(a);\\n    }\\n\\n    function to32(uint256 a) internal pure returns (uint32 c) {\\n        require(a <= uint32(-1), \\\"BoringMath: uint32 Overflow\\\");\\n        c = uint32(a);\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint128.\\nlibrary BoringMath128 {\\n    function add(uint128 a, uint128 b) internal pure returns (uint128 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint128 a, uint128 b) internal pure returns (uint128 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint64.\\nlibrary BoringMath64 {\\n    function add(uint64 a, uint64 b) internal pure returns (uint64 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint64 a, uint64 b) internal pure returns (uint64 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint32.\\nlibrary BoringMath32 {\\n    function add(uint32 a, uint32 b) internal pure returns (uint32 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint32 a, uint32 b) internal pure returns (uint32 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringRebase.sol@v1.2.0\\n// License-Identifier: MIT\\n\\nstruct Rebase {\\n    uint128 elastic;\\n    uint128 base;\\n}\\n\\n/// @notice A rebasing library using overflow-/underflow-safe math.\\nlibrary RebaseLibrary {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n\\n    /// @notice Calculates the base value in relationship to `elastic` and `total`.\\n    function toBase(\\n        Rebase memory total,\\n        uint256 elastic,\\n        bool roundUp\\n    ) internal pure returns (uint256 base) {\\n        if (total.elastic == 0) {\\n            base = elastic;\\n        } else {\\n            base = elastic.mul(total.base) / total.elastic;\\n            if (roundUp && base.mul(total.elastic) / total.base < elastic) {\\n                base = base.add(1);\\n            }\\n        }\\n    }\\n\\n    /// @notice Calculates the elastic value in relationship to `base` and `total`.\\n    function toElastic(\\n        Rebase memory total,\\n        uint256 base,\\n        bool roundUp\\n    ) internal pure returns (uint256 elastic) {\\n        if (total.base == 0) {\\n            elastic = base;\\n        } else {\\n            elastic = base.mul(total.elastic) / total.base;\\n            if (roundUp && elastic.mul(total.base) / total.elastic < base) {\\n                elastic = elastic.add(1);\\n            }\\n        }\\n    }\\n\\n    /// @notice Add `elastic` to `total` and doubles `total.base`.\\n    /// @return (Rebase) The new total.\\n    /// @return base in relationship to `elastic`.\\n    function add(\\n        Rebase memory total,\\n        uint256 elastic,\\n        bool roundUp\\n    ) internal pure returns (Rebase memory, uint256 base) {\\n        base = toBase(total, elastic, roundUp);\\n        total.elastic = total.elastic.add(elastic.to128());\\n        total.base = total.base.add(base.to128());\\n        return (total, base);\\n    }\\n\\n    /// @notice Sub `base` from `total` and update `total.elastic`.\\n    /// @return (Rebase) The new total.\\n    /// @return elastic in relationship to `base`.\\n    function sub(\\n        Rebase memory total,\\n        uint256 base,\\n        bool roundUp\\n    ) internal pure returns (Rebase memory, uint256 elastic) {\\n        elastic = toElastic(total, base, roundUp);\\n        total.elastic = total.elastic.sub(elastic.to128());\\n        total.base = total.base.sub(base.to128());\\n        return (total, elastic);\\n    }\\n\\n    /// @notice Add `elastic` and `base` to `total`.\\n    function add(\\n        Rebase memory total,\\n        uint256 elastic,\\n        uint256 base\\n    ) internal pure returns (Rebase memory) {\\n        total.elastic = total.elastic.add(elastic.to128());\\n        total.base = total.base.add(base.to128());\\n        return total;\\n    }\\n\\n    /// @notice Subtract `elastic` and `base` to `total`.\\n    function sub(\\n        Rebase memory total,\\n        uint256 elastic,\\n        uint256 base\\n    ) internal pure returns (Rebase memory) {\\n        total.elastic = total.elastic.sub(elastic.to128());\\n        total.base = total.base.sub(base.to128());\\n        return total;\\n    }\\n\\n    /// @notice Add `elastic` to `total` and update storage.\\n    /// @return newElastic Returns updated `elastic`.\\n    function addElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {\\n        newElastic = total.elastic = total.elastic.add(elastic.to128());\\n    }\\n\\n    /// @notice Subtract `elastic` from `total` and update storage.\\n    /// @return newElastic Returns updated `elastic`.\\n    function subElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {\\n        newElastic = total.elastic = total.elastic.sub(elastic.to128());\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringOwnable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n// Source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol + Claimable.sol\\n// Edited by BoringCrypto\\n\\ncontract BoringOwnableData {\\n    address public owner;\\n    address public pendingOwner;\\n}\\n\\ncontract BoringOwnable is BoringOwnableData {\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /// @notice `owner` defaults to msg.sender on construction.\\n    constructor() public {\\n        owner = msg.sender;\\n        emit OwnershipTransferred(address(0), msg.sender);\\n    }\\n\\n    /// @notice Transfers ownership to `newOwner`. Either directly or claimable by the new pending owner.\\n    /// Can only be invoked by the current `owner`.\\n    /// @param newOwner Address of the new owner.\\n    /// @param direct True if `newOwner` should be set immediately. False if `newOwner` needs to use `claimOwnership`.\\n    /// @param renounce Allows the `newOwner` to be `address(0)` if `direct` and `renounce` is True. Has no effect otherwise.\\n    function transferOwnership(\\n        address newOwner,\\n        bool direct,\\n        bool renounce\\n    ) public onlyOwner {\\n        if (direct) {\\n            // Checks\\n            require(newOwner != address(0) || renounce, \\\"Ownable: zero address\\\");\\n\\n            // Effects\\n            emit OwnershipTransferred(owner, newOwner);\\n            owner = newOwner;\\n            pendingOwner = address(0);\\n        } else {\\n            // Effects\\n            pendingOwner = newOwner;\\n        }\\n    }\\n\\n    /// @notice Needs to be called by `pendingOwner` to claim ownership.\\n    function claimOwnership() public {\\n        address _pendingOwner = pendingOwner;\\n\\n        // Checks\\n        require(msg.sender == _pendingOwner, \\\"Ownable: caller != pending owner\\\");\\n\\n        // Effects\\n        emit OwnershipTransferred(owner, _pendingOwner);\\n        owner = _pendingOwner;\\n        pendingOwner = address(0);\\n    }\\n\\n    /// @notice Only allows the `owner` to execute the function.\\n    modifier onlyOwner() {\\n        require(msg.sender == owner, \\\"Ownable: caller is not the owner\\\");\\n        _;\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/interfaces/IMasterContract.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ninterface IMasterContract {\\n    /// @notice Init function that gets called from `BoringFactory.deploy`.\\n    /// Also kown as the constructor for cloned contracts.\\n    /// Any ETH send to `BoringFactory.deploy` ends up here.\\n    /// @param data Can be abi encoded arguments or anything else.\\n    function init(bytes calldata data) external payable;\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringFactory.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ncontract BoringFactory {\\n    event LogDeploy(address indexed masterContract, bytes data, address indexed cloneAddress);\\n\\n    /// @notice Mapping from clone contracts to their masterContract.\\n    mapping(address => address) public masterContractOf;\\n\\n    /// @notice Deploys a given master Contract as a clone.\\n    /// Any ETH transferred with this call is forwarded to the new clone.\\n    /// Emits `LogDeploy`.\\n    /// @param masterContract The address of the contract to clone.\\n    /// @param data Additional abi encoded calldata that is passed to the new clone via `IMasterContract.init`.\\n    /// @param useCreate2 Creates the clone by using the CREATE2 opcode, in this case `data` will be used as salt.\\n    /// @return cloneAddress Address of the created clone contract.\\n    function deploy(\\n        address masterContract,\\n        bytes calldata data,\\n        bool useCreate2\\n    ) public payable returns (address cloneAddress) {\\n        require(masterContract != address(0), \\\"BoringFactory: No masterContract\\\");\\n        bytes20 targetBytes = bytes20(masterContract); // Takes the first 20 bytes of the masterContract's address\\n\\n        if (useCreate2) {\\n            // each masterContract has different code already. So clones are distinguished by their data only.\\n            bytes32 salt = keccak256(data);\\n\\n            // Creates clone, more info here: https://blog.openzeppelin.com/deep-dive-into-the-minimal-proxy-contract/\\n            assembly {\\n                let clone := mload(0x40)\\n                mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n                mstore(add(clone, 0x14), targetBytes)\\n                mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n                cloneAddress := create2(0, clone, 0x37, salt)\\n            }\\n        } else {\\n            assembly {\\n                let clone := mload(0x40)\\n                mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n                mstore(add(clone, 0x14), targetBytes)\\n                mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n                cloneAddress := create(0, clone, 0x37)\\n            }\\n        }\\n        masterContractOf[cloneAddress] = masterContract;\\n\\n        IMasterContract(cloneAddress).init{value: msg.value}(data);\\n\\n        emit LogDeploy(masterContract, data, cloneAddress);\\n    }\\n}\\n\\n// File contracts/MasterContractManager.sol\\n// License-Identifier: UNLICENSED\\n\\ncontract MasterContractManager is BoringOwnable, BoringFactory {\\n    event LogWhiteListMasterContract(address indexed masterContract, bool approved);\\n    event LogSetMasterContractApproval(address indexed masterContract, address indexed user, bool approved);\\n    event LogRegisterProtocol(address indexed protocol);\\n\\n    /// @notice masterContract to user to approval state\\n    mapping(address => mapping(address => bool)) public masterContractApproved;\\n    /// @notice masterContract to whitelisted state for approval without signed message\\n    mapping(address => bool) public whitelistedMasterContracts;\\n    /// @notice user nonces for masterContract approvals\\n    mapping(address => uint256) public nonces;\\n\\n    bytes32 private constant DOMAIN_SEPARATOR_SIGNATURE_HASH = keccak256(\\\"EIP712Domain(string name,uint256 chainId,address verifyingContract)\\\");\\n    // See https://eips.ethereum.org/EIPS/eip-191\\n    string private constant EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA = \\\"\\\\x19\\\\x01\\\";\\n    bytes32 private constant APPROVAL_SIGNATURE_HASH =\\n        keccak256(\\\"SetMasterContractApproval(string warning,address user,address masterContract,bool approved,uint256 nonce)\\\");\\n\\n    // solhint-disable-next-line var-name-mixedcase\\n    bytes32 private immutable _DOMAIN_SEPARATOR;\\n    // solhint-disable-next-line var-name-mixedcase\\n    uint256 private immutable DOMAIN_SEPARATOR_CHAIN_ID;\\n\\n    constructor() public {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        _DOMAIN_SEPARATOR = _calculateDomainSeparator(DOMAIN_SEPARATOR_CHAIN_ID = chainId);\\n    }\\n\\n    function _calculateDomainSeparator(uint256 chainId) private view returns (bytes32) {\\n        return keccak256(abi.encode(DOMAIN_SEPARATOR_SIGNATURE_HASH, keccak256(\\\"BentoBox V1\\\"), chainId, address(this)));\\n    }\\n\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() public view returns (bytes32) {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        return chainId == DOMAIN_SEPARATOR_CHAIN_ID ? _DOMAIN_SEPARATOR : _calculateDomainSeparator(chainId);\\n    }\\n\\n    /// @notice Other contracts need to register with this master contract so that users can approve them for the BentoBox.\\n    function registerProtocol() public {\\n        masterContractOf[msg.sender] = msg.sender;\\n        emit LogRegisterProtocol(msg.sender);\\n    }\\n\\n    /// @notice Enables or disables a contract for approval without signed message.\\n    function whitelistMasterContract(address masterContract, bool approved) public onlyOwner {\\n        // Checks\\n        require(masterContract != address(0), \\\"MasterCMgr: Cannot approve 0\\\");\\n\\n        // Effects\\n        whitelistedMasterContracts[masterContract] = approved;\\n        emit LogWhiteListMasterContract(masterContract, approved);\\n    }\\n\\n    /// @notice Approves or revokes a `masterContract` access to `user` funds.\\n    /// @param user The address of the user that approves or revokes access.\\n    /// @param masterContract The address who gains or loses access.\\n    /// @param approved If True approves access. If False revokes access.\\n    /// @param v Part of the signature. (See EIP-191)\\n    /// @param r Part of the signature. (See EIP-191)\\n    /// @param s Part of the signature. (See EIP-191)\\n    // F4 - Check behaviour for all function arguments when wrong or extreme\\n    // F4: Don't allow masterContract 0 to be approved. Unknown contracts will have a masterContract of 0.\\n    // F4: User can't be 0 for signed approvals because the recoveredAddress will be 0 if ecrecover fails\\n    function setMasterContractApproval(\\n        address user,\\n        address masterContract,\\n        bool approved,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) public {\\n        // Checks\\n        require(masterContract != address(0), \\\"MasterCMgr: masterC not set\\\"); // Important for security\\n\\n        // If no signature is provided, the fallback is executed\\n        if (r == 0 && s == 0 && v == 0) {\\n            require(user == msg.sender, \\\"MasterCMgr: user not sender\\\");\\n            require(masterContractOf[user] == address(0), \\\"MasterCMgr: user is clone\\\");\\n            require(whitelistedMasterContracts[masterContract], \\\"MasterCMgr: not whitelisted\\\");\\n        } else {\\n            // Important for security - any address without masterContract has address(0) as masterContract\\n            // So approving address(0) would approve every address, leading to full loss of funds\\n            // Also, ecrecover returns address(0) on failure. So we check this:\\n            require(user != address(0), \\\"MasterCMgr: User cannot be 0\\\");\\n\\n            // C10 - Protect signatures against replay, use nonce and chainId (SWC-121)\\n            // C10: nonce + chainId are used to prevent replays\\n            // C11 - All signatures strictly EIP-712 (SWC-117 SWC-122)\\n            // C11: signature is EIP-712 compliant\\n            // C12 - abi.encodePacked can't contain variable length user input (SWC-133)\\n            // C12: abi.encodePacked has fixed length parameters\\n            bytes32 digest =\\n                keccak256(\\n                    abi.encodePacked(\\n                        EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA,\\n                        DOMAIN_SEPARATOR(),\\n                        keccak256(\\n                            abi.encode(\\n                                APPROVAL_SIGNATURE_HASH,\\n                                approved\\n                                    ? keccak256(\\\"Give FULL access to funds in (and approved to) BentoBox?\\\")\\n                                    : keccak256(\\\"Revoke access to BentoBox?\\\"),\\n                                user,\\n                                masterContract,\\n                                approved,\\n                                nonces[user]++\\n                            )\\n                        )\\n                    )\\n                );\\n            address recoveredAddress = ecrecover(digest, v, r, s);\\n            require(recoveredAddress == user, \\\"MasterCMgr: Invalid Signature\\\");\\n        }\\n\\n        // Effects\\n        masterContractApproved[masterContract][user] = approved;\\n        emit LogSetMasterContractApproval(masterContract, user, approved);\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringBatchable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ncontract BaseBoringBatchable {\\n    /// @dev Helper function to extract a useful revert message from a failed call.\\n    /// If the returned data is malformed or not correctly abi encoded then this call can fail itself.\\n    function _getRevertMsg(bytes memory _returnData) internal pure returns (string memory) {\\n        // If the _res length is less than 68, then the transaction failed silently (without a revert message)\\n        if (_returnData.length < 68) return \\\"Transaction reverted silently\\\";\\n\\n        assembly {\\n            // Slice the sighash.\\n            _returnData := add(_returnData, 0x04)\\n        }\\n        return abi.decode(_returnData, (string)); // All that remains is the revert string\\n    }\\n\\n    /// @notice Allows batched call to self (this contract).\\n    /// @param calls An array of inputs for each call.\\n    /// @param revertOnFail If True then reverts after a failed call and stops doing further calls.\\n    /// @return successes An array indicating the success of a call, mapped one-to-one to `calls`.\\n    /// @return results An array with the returned data of each function call, mapped one-to-one to `calls`.\\n    // F1: External is ok here because this is the batch function, adding it to a batch makes no sense\\n    // F2: Calls in the batch may be payable, delegatecall operates in the same context, so each call in the batch has access to msg.value\\n    // C3: The length of the loop is fully under user control, so can't be exploited\\n    // C7: Delegatecall is only used on the same contract, so it's safe\\n    function batch(bytes[] calldata calls, bool revertOnFail) external payable returns (bool[] memory successes, bytes[] memory results) {\\n        successes = new bool[](calls.length);\\n        results = new bytes[](calls.length);\\n        for (uint256 i = 0; i < calls.length; i++) {\\n            (bool success, bytes memory result) = address(this).delegatecall(calls[i]);\\n            require(success || !revertOnFail, _getRevertMsg(result));\\n            successes[i] = success;\\n            results[i] = result;\\n        }\\n    }\\n}\\n\\ncontract BoringBatchable is BaseBoringBatchable {\\n    /// @notice Call wrapper that performs `ERC20.permit` on `token`.\\n    /// Lookup `IERC20.permit`.\\n    // F6: Parameters can be used front-run the permit and the user's permit will fail (due to nonce or other revert)\\n    //     if part of a batch this could be used to grief once as the second call would not need the permit\\n    function permitToken(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) public {\\n        token.permit(from, to, amount, deadline, v, r, s);\\n    }\\n}\\n\\n// File contracts/BentoBox.sol\\n// License-Identifier: UNLICENSED\\n\\n/// @title BentoBox\\n/// @author BoringCrypto, Keno\\n/// @notice The BentoBox is a vault for tokens. The stored tokens can be flash loaned and used in strategies.\\n/// Yield from this will go to the token depositors.\\n/// Rebasing tokens ARE NOT supported and WILL cause loss of funds.\\n/// Any funds transfered directly onto the BentoBox will be lost, use the deposit function instead.\\ncontract BentoBoxV1 is MasterContractManager, BoringBatchable {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n    using BoringERC20 for IERC20;\\n    using RebaseLibrary for Rebase;\\n\\n    // ************** //\\n    // *** EVENTS *** //\\n    // ************** //\\n\\n    event LogDeposit(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogWithdraw(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogTransfer(IERC20 indexed token, address indexed from, address indexed to, uint256 share);\\n\\n    event LogFlashLoan(address indexed borrower, IERC20 indexed token, uint256 amount, uint256 feeAmount, address indexed receiver);\\n\\n    event LogStrategyTargetPercentage(IERC20 indexed token, uint256 targetPercentage);\\n    event LogStrategyQueued(IERC20 indexed token, IStrategy indexed strategy);\\n    event LogStrategySet(IERC20 indexed token, IStrategy indexed strategy);\\n    event LogStrategyInvest(IERC20 indexed token, uint256 amount);\\n    event LogStrategyDivest(IERC20 indexed token, uint256 amount);\\n    event LogStrategyProfit(IERC20 indexed token, uint256 amount);\\n    event LogStrategyLoss(IERC20 indexed token, uint256 amount);\\n\\n    // *************** //\\n    // *** STRUCTS *** //\\n    // *************** //\\n\\n    struct StrategyData {\\n        uint64 strategyStartDate;\\n        uint64 targetPercentage;\\n        uint128 balance; // the balance of the strategy that BentoBox thinks is in there\\n    }\\n\\n    // ******************************** //\\n    // *** CONSTANTS AND IMMUTABLES *** //\\n    // ******************************** //\\n\\n    // V2 - Can they be private?\\n    // V2: Private to save gas, to verify it's correct, check the constructor arguments\\n    IERC20 private immutable wethToken;\\n\\n    IERC20 private constant USE_ETHEREUM = IERC20(0);\\n    uint256 private constant FLASH_LOAN_FEE = 50; // 0.05%\\n    uint256 private constant FLASH_LOAN_FEE_PRECISION = 1e5;\\n    uint256 private constant STRATEGY_DELAY = 2 weeks;\\n    uint256 private constant MAX_TARGET_PERCENTAGE = 95; // 95%\\n    uint256 private constant MINIMUM_SHARE_BALANCE = 1000; // To prevent the ratio going off\\n\\n    // ***************** //\\n    // *** VARIABLES *** //\\n    // ***************** //\\n\\n    // Balance per token per address/contract in shares\\n    mapping(IERC20 => mapping(address => uint256)) public balanceOf;\\n\\n    // Rebase from amount to share\\n    mapping(IERC20 => Rebase) public totals;\\n\\n    mapping(IERC20 => IStrategy) public strategy;\\n    mapping(IERC20 => IStrategy) public pendingStrategy;\\n    mapping(IERC20 => StrategyData) public strategyData;\\n\\n    // ******************* //\\n    // *** CONSTRUCTOR *** //\\n    // ******************* //\\n\\n    constructor(IERC20 wethToken_) public {\\n        wethToken = wethToken_;\\n    }\\n\\n    // ***************** //\\n    // *** MODIFIERS *** //\\n    // ***************** //\\n\\n    /// Modifier to check if the msg.sender is allowed to use funds belonging to the 'from' address.\\n    /// If 'from' is msg.sender, it's allowed.\\n    /// If 'from' is the BentoBox itself, it's allowed. Any ETH, token balances (above the known balances) or BentoBox balances\\n    /// can be taken by anyone.\\n    /// This is to enable skimming, not just for deposits, but also for withdrawals or transfers, enabling better composability.\\n    /// If 'from' is a clone of a masterContract AND the 'from' address has approved that masterContract, it's allowed.\\n    modifier allowed(address from) {\\n        if (from != msg.sender && from != address(this)) {\\n            // From is sender or you are skimming\\n            address masterContract = masterContractOf[msg.sender];\\n            require(masterContract != address(0), \\\"BentoBox: no masterContract\\\");\\n            require(masterContractApproved[masterContract][from], \\\"BentoBox: Transfer not approved\\\");\\n        }\\n        _;\\n    }\\n\\n    // ************************** //\\n    // *** INTERNAL FUNCTIONS *** //\\n    // ************************** //\\n\\n    /// @dev Returns the total balance of `token` this contracts holds,\\n    /// plus the total amount this contract thinks the strategy holds.\\n    function _tokenBalanceOf(IERC20 token) internal view returns (uint256 amount) {\\n        amount = token.balanceOf(address(this)).add(strategyData[token].balance);\\n    }\\n\\n    // ************************ //\\n    // *** PUBLIC FUNCTIONS *** //\\n    // ************************ //\\n\\n    /// @dev Helper function to represent an `amount` of `token` in shares.\\n    /// @param token The ERC-20 token.\\n    /// @param amount The `token` amount.\\n    /// @param roundUp If the result `share` should be rounded up.\\n    /// @return share The token amount represented in shares.\\n    function toShare(\\n        IERC20 token,\\n        uint256 amount,\\n        bool roundUp\\n    ) external view returns (uint256 share) {\\n        share = totals[token].toBase(amount, roundUp);\\n    }\\n\\n    /// @dev Helper function represent shares back into the `token` amount.\\n    /// @param token The ERC-20 token.\\n    /// @param share The amount of shares.\\n    /// @param roundUp If the result should be rounded up.\\n    /// @return amount The share amount back into native representation.\\n    function toAmount(\\n        IERC20 token,\\n        uint256 share,\\n        bool roundUp\\n    ) external view returns (uint256 amount) {\\n        amount = totals[token].toElastic(share, roundUp);\\n    }\\n\\n    /// @notice Deposit an amount of `token` represented in either `amount` or `share`.\\n    /// @param token_ The ERC-20 token to deposit.\\n    /// @param from which account to pull the tokens.\\n    /// @param to which account to push the tokens.\\n    /// @param amount Token amount in native representation to deposit.\\n    /// @param share Token amount represented in shares to deposit. Takes precedence over `amount`.\\n    /// @return amountOut The amount deposited.\\n    /// @return shareOut The deposited amount repesented in shares.\\n    function deposit(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) public payable allowed(from) returns (uint256 amountOut, uint256 shareOut) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;\\n        Rebase memory total = totals[token];\\n\\n        // If a new token gets added, the tokenSupply call checks that this is a deployed contract. Needed for security.\\n        require(total.elastic != 0 || token.totalSupply() > 0, \\\"BentoBox: No tokens\\\");\\n        if (share == 0) {\\n            // value of the share may be lower than the amount due to rounding, that's ok\\n            share = total.toBase(amount, false);\\n            // Any deposit should lead to at least the minimum share balance, otherwise it's ignored (no amount taken)\\n            if (total.base.add(share.to128()) < MINIMUM_SHARE_BALANCE) {\\n                return (0, 0);\\n            }\\n        } else {\\n            // amount may be lower than the value of share due to rounding, in that case, add 1 to amount (Always round up)\\n            amount = total.toElastic(share, true);\\n        }\\n\\n        // In case of skimming, check that only the skimmable amount is taken.\\n        // For ETH, the full balance is available, so no need to check.\\n        // During flashloans the _tokenBalanceOf is lower than 'reality', so skimming deposits will mostly fail during a flashloan.\\n        require(\\n            from != address(this) || token_ == USE_ETHEREUM || amount <= _tokenBalanceOf(token).sub(total.elastic),\\n            \\\"BentoBox: Skim too much\\\"\\n        );\\n\\n        balanceOf[token][to] = balanceOf[token][to].add(share);\\n        total.base = total.base.add(share.to128());\\n        total.elastic = total.elastic.add(amount.to128());\\n        totals[token] = total;\\n\\n        // Interactions\\n        // During the first deposit, we check that this token is 'real'\\n        if (token_ == USE_ETHEREUM) {\\n            // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)\\n            // X2: If the WETH implementation is faulty or malicious, it will block adding ETH (but we know the WETH implementation)\\n            IWETH(address(wethToken)).deposit{value: amount}();\\n        } else if (from != address(this)) {\\n            // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)\\n            // X2: If the token implementation is faulty or malicious, it may block adding tokens. Good.\\n            token.safeTransferFrom(from, address(this), amount);\\n        }\\n        emit LogDeposit(token, from, to, amount, share);\\n        amountOut = amount;\\n        shareOut = share;\\n    }\\n\\n    /// @notice Withdraws an amount of `token` from a user account.\\n    /// @param token_ The ERC-20 token to withdraw.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param amount of tokens. Either one of `amount` or `share` needs to be supplied.\\n    /// @param share Like above, but `share` takes precedence over `amount`.\\n    function withdraw(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) public allowed(from) returns (uint256 amountOut, uint256 shareOut) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;\\n        Rebase memory total = totals[token];\\n        if (share == 0) {\\n            // value of the share paid could be lower than the amount paid due to rounding, in that case, add a share (Always round up)\\n            share = total.toBase(amount, true);\\n        } else {\\n            // amount may be lower than the value of share due to rounding, that's ok\\n            amount = total.toElastic(share, false);\\n        }\\n\\n        balanceOf[token][from] = balanceOf[token][from].sub(share);\\n        total.elastic = total.elastic.sub(amount.to128());\\n        total.base = total.base.sub(share.to128());\\n        // There have to be at least 1000 shares left to prevent reseting the share/amount ratio (unless it's fully emptied)\\n        require(total.base >= MINIMUM_SHARE_BALANCE || total.base == 0, \\\"BentoBox: cannot empty\\\");\\n        totals[token] = total;\\n\\n        // Interactions\\n        if (token_ == USE_ETHEREUM) {\\n            // X2, X3: A revert or big gas usage in the WETH contract could block withdrawals, but WETH9 is fine.\\n            IWETH(address(wethToken)).withdraw(amount);\\n            // X2, X3: A revert or big gas usage could block, however, the to address is under control of the caller.\\n            (bool success, ) = to.call{value: amount}(\\\"\\\");\\n            require(success, \\\"BentoBox: ETH transfer failed\\\");\\n        } else {\\n            // X2, X3: A malicious token could block withdrawal of just THAT token.\\n            //         masterContracts may want to take care not to rely on withdraw always succeeding.\\n            token.safeTransfer(to, amount);\\n        }\\n        emit LogWithdraw(token, from, to, amount, share);\\n        amountOut = amount;\\n        shareOut = share;\\n    }\\n\\n    /// @notice Transfer shares from a user account to another one.\\n    /// @param token The ERC-20 token to transfer.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param share The amount of `token` in shares.\\n    // Clones of master contracts can transfer from any account that has approved them\\n    // F3 - Can it be combined with another similar function?\\n    // F3: This isn't combined with transferMultiple for gas optimization\\n    function transfer(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 share\\n    ) public allowed(from) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        balanceOf[token][from] = balanceOf[token][from].sub(share);\\n        balanceOf[token][to] = balanceOf[token][to].add(share);\\n\\n        emit LogTransfer(token, from, to, share);\\n    }\\n\\n    /// @notice Transfer shares from a user account to multiple other ones.\\n    /// @param token The ERC-20 token to transfer.\\n    /// @param from which user to pull the tokens.\\n    /// @param tos The receivers of the tokens.\\n    /// @param shares The amount of `token` in shares for each receiver in `tos`.\\n    // F3 - Can it be combined with another similar function?\\n    // F3: This isn't combined with transfer for gas optimization\\n    function transferMultiple(\\n        IERC20 token,\\n        address from,\\n        address[] calldata tos,\\n        uint256[] calldata shares\\n    ) public allowed(from) {\\n        // Checks\\n        require(tos[0] != address(0), \\\"BentoBox: to[0] not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        uint256 totalAmount;\\n        uint256 len = tos.length;\\n        for (uint256 i = 0; i < len; i++) {\\n            address to = tos[i];\\n            balanceOf[token][to] = balanceOf[token][to].add(shares[i]);\\n            totalAmount = totalAmount.add(shares[i]);\\n            emit LogTransfer(token, from, to, shares[i]);\\n        }\\n        balanceOf[token][from] = balanceOf[token][from].sub(totalAmount);\\n    }\\n\\n    /// @notice Flashloan ability.\\n    /// @param borrower The address of the contract that implements and conforms to `IFlashBorrower` and handles the flashloan.\\n    /// @param receiver Address of the token receiver.\\n    /// @param token The address of the token to receive.\\n    /// @param amount of the tokens to receive.\\n    /// @param data The calldata to pass to the `borrower` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Not possible to follow this here, reentrancy has been reviewed\\n    // F6 - Check for front-running possibilities, such as the approve function (SWC-114)\\n    // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.\\n    function flashLoan(\\n        IFlashBorrower borrower,\\n        address receiver,\\n        IERC20 token,\\n        uint256 amount,\\n        bytes calldata data\\n    ) public {\\n        uint256 fee = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;\\n        token.safeTransfer(receiver, amount);\\n\\n        borrower.onFlashLoan(msg.sender, token, amount, fee, data);\\n\\n        require(_tokenBalanceOf(token) >= totals[token].addElastic(fee.to128()), \\\"BentoBox: Wrong amount\\\");\\n        emit LogFlashLoan(address(borrower), token, amount, fee, receiver);\\n    }\\n\\n    /// @notice Support for batched flashloans. Useful to request multiple different `tokens` in a single transaction.\\n    /// @param borrower The address of the contract that implements and conforms to `IBatchFlashBorrower` and handles the flashloan.\\n    /// @param receivers An array of the token receivers. A one-to-one mapping with `tokens` and `amounts`.\\n    /// @param tokens The addresses of the tokens.\\n    /// @param amounts of the tokens for each receiver.\\n    /// @param data The calldata to pass to the `borrower` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Not possible to follow this here, reentrancy has been reviewed\\n    // F6 - Check for front-running possibilities, such as the approve function (SWC-114)\\n    // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.\\n    function batchFlashLoan(\\n        IBatchFlashBorrower borrower,\\n        address[] calldata receivers,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        bytes calldata data\\n    ) public {\\n        uint256[] memory fees = new uint256[](tokens.length);\\n\\n        uint256 len = tokens.length;\\n        for (uint256 i = 0; i < len; i++) {\\n            uint256 amount = amounts[i];\\n            fees[i] = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;\\n\\n            tokens[i].safeTransfer(receivers[i], amounts[i]);\\n        }\\n\\n        borrower.onBatchFlashLoan(msg.sender, tokens, amounts, fees, data);\\n\\n        for (uint256 i = 0; i < len; i++) {\\n            IERC20 token = tokens[i];\\n            require(_tokenBalanceOf(token) >= totals[token].addElastic(fees[i].to128()), \\\"BentoBox: Wrong amount\\\");\\n            emit LogFlashLoan(address(borrower), token, amounts[i], fees[i], receivers[i]);\\n        }\\n    }\\n\\n    /// @notice Sets the target percentage of the strategy for `token`.\\n    /// @dev Only the owner of this contract is allowed to change this.\\n    /// @param token The address of the token that maps to a strategy to change.\\n    /// @param targetPercentage_ The new target in percent. Must be lesser or equal to `MAX_TARGET_PERCENTAGE`.\\n    function setStrategyTargetPercentage(IERC20 token, uint64 targetPercentage_) public onlyOwner {\\n        // Checks\\n        require(targetPercentage_ <= MAX_TARGET_PERCENTAGE, \\\"StrategyManager: Target too high\\\");\\n\\n        // Effects\\n        strategyData[token].targetPercentage = targetPercentage_;\\n        emit LogStrategyTargetPercentage(token, targetPercentage_);\\n    }\\n\\n    /// @notice Sets the contract address of a new strategy that conforms to `IStrategy` for `token`.\\n    /// Must be called twice with the same arguments.\\n    /// A new strategy becomes pending first and can be activated once `STRATEGY_DELAY` is over.\\n    /// @dev Only the owner of this contract is allowed to change this.\\n    /// @param token The address of the token that maps to a strategy to change.\\n    /// @param newStrategy The address of the contract that conforms to `IStrategy`.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Total amount is updated AFTER interaction. But strategy is under our control.\\n    // C4 - Use block.timestamp only for long intervals (SWC-116)\\n    // C4: block.timestamp is used for a period of 2 weeks, which is long enough\\n    function setStrategy(IERC20 token, IStrategy newStrategy) public onlyOwner {\\n        StrategyData memory data = strategyData[token];\\n        IStrategy pending = pendingStrategy[token];\\n        if (data.strategyStartDate == 0 || pending != newStrategy) {\\n            pendingStrategy[token] = newStrategy;\\n            // C1 - All math done through BoringMath (SWC-101)\\n            // C1: Our sun will swallow the earth well before this overflows\\n            data.strategyStartDate = (block.timestamp + STRATEGY_DELAY).to64();\\n            emit LogStrategyQueued(token, newStrategy);\\n        } else {\\n            require(data.strategyStartDate != 0 && block.timestamp >= data.strategyStartDate, \\\"StrategyManager: Too early\\\");\\n            if (address(strategy[token]) != address(0)) {\\n                int256 balanceChange = strategy[token].exit(data.balance);\\n                // Effects\\n                if (balanceChange > 0) {\\n                    uint256 add = uint256(balanceChange);\\n                    totals[token].addElastic(add);\\n                    emit LogStrategyProfit(token, add);\\n                } else if (balanceChange < 0) {\\n                    uint256 sub = uint256(-balanceChange);\\n                    totals[token].subElastic(sub);\\n                    emit LogStrategyLoss(token, sub);\\n                }\\n\\n                emit LogStrategyDivest(token, data.balance);\\n            }\\n            strategy[token] = pending;\\n            data.strategyStartDate = 0;\\n            data.balance = 0;\\n            pendingStrategy[token] = IStrategy(0);\\n            emit LogStrategySet(token, newStrategy);\\n        }\\n        strategyData[token] = data;\\n    }\\n\\n    /// @notice The actual process of yield farming. Executes the strategy of `token`.\\n    /// Optionally does housekeeping if `balance` is true.\\n    /// `maxChangeAmount` is relevant for skimming or withdrawing if `balance` is true.\\n    /// @param token The address of the token for which a strategy is deployed.\\n    /// @param balance True if housekeeping should be done.\\n    /// @param maxChangeAmount The maximum amount for either pulling or pushing from/to the `IStrategy` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Total amount is updated AFTER interaction. But strategy is under our control.\\n    // F5: Not followed to prevent reentrancy issues with flashloans and BentoBox skims?\\n    function harvest(\\n        IERC20 token,\\n        bool balance,\\n        uint256 maxChangeAmount\\n    ) public {\\n        StrategyData memory data = strategyData[token];\\n        IStrategy _strategy = strategy[token];\\n        int256 balanceChange = _strategy.harvest(data.balance, msg.sender);\\n        if (balanceChange == 0 && !balance) {\\n            return;\\n        }\\n\\n        uint256 totalElastic = totals[token].elastic;\\n\\n        if (balanceChange > 0) {\\n            uint256 add = uint256(balanceChange);\\n            totalElastic = totalElastic.add(add);\\n            totals[token].elastic = totalElastic.to128();\\n            emit LogStrategyProfit(token, add);\\n        } else if (balanceChange < 0) {\\n            // C1 - All math done through BoringMath (SWC-101)\\n            // C1: balanceChange could overflow if it's max negative int128.\\n            // But tokens with balances that large are not supported by the BentoBox.\\n            uint256 sub = uint256(-balanceChange);\\n            totalElastic = totalElastic.sub(sub);\\n            totals[token].elastic = totalElastic.to128();\\n            data.balance = data.balance.sub(sub.to128());\\n            emit LogStrategyLoss(token, sub);\\n        }\\n\\n        if (balance) {\\n            uint256 targetBalance = totalElastic.mul(data.targetPercentage) / 100;\\n            // if data.balance == targetBalance there is nothing to update\\n            if (data.balance < targetBalance) {\\n                uint256 amountOut = targetBalance.sub(data.balance);\\n                if (maxChangeAmount != 0 && amountOut > maxChangeAmount) {\\n                    amountOut = maxChangeAmount;\\n                }\\n                token.safeTransfer(address(_strategy), amountOut);\\n                data.balance = data.balance.add(amountOut.to128());\\n                _strategy.skim(amountOut);\\n                emit LogStrategyInvest(token, amountOut);\\n            } else if (data.balance > targetBalance) {\\n                uint256 amountIn = data.balance.sub(targetBalance.to128());\\n                if (maxChangeAmount != 0 && amountIn > maxChangeAmount) {\\n                    amountIn = maxChangeAmount;\\n                }\\n\\n                uint256 actualAmountIn = _strategy.withdraw(amountIn);\\n\\n                data.balance = data.balance.sub(actualAmountIn.to128());\\n                emit LogStrategyDivest(token, actualAmountIn);\\n            }\\n        }\\n\\n        strategyData[token] = data;\\n    }\\n\\n    // Contract should be able to receive ETH deposits to support deposit & skim\\n    // solhint-disable-next-line no-empty-blocks\\n    receive() external payable {}\\n}\\n\",\"keccak256\":\"0xf5251397b9aaa5c66ddc18b0cb96350ffac09f5776a1255fedc0072641f916fe\",\"license\":\"UNLICENSED\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {
              "onBatchFlashLoan(address,address[],uint256[],uint256[],bytes)": {
                "notice": "The callback for batched flashloans. Every amount + fee needs to repayed to msg.sender before this call returns."
              }
            },
            "version": 1
          }
        },
        "IERC20": {
          "abi": [
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "owner",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "spender",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "name": "Approval",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "name": "Transfer",
              "type": "event"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "owner",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "spender",
                  "type": "address"
                }
              ],
              "name": "allowance",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "spender",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "approve",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "account",
                  "type": "address"
                }
              ],
              "name": "balanceOf",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "owner",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "spender",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "deadline",
                  "type": "uint256"
                },
                {
                  "internalType": "uint8",
                  "name": "v",
                  "type": "uint8"
                },
                {
                  "internalType": "bytes32",
                  "name": "r",
                  "type": "bytes32"
                },
                {
                  "internalType": "bytes32",
                  "name": "s",
                  "type": "bytes32"
                }
              ],
              "name": "permit",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "totalSupply",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {},
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "gasEstimates": null,
            "methodIdentifiers": {
              "allowance(address,address)": "dd62ed3e",
              "approve(address,uint256)": "095ea7b3",
              "balanceOf(address)": "70a08231",
              "permit(address,address,uint256,uint256,uint8,bytes32,bytes32)": "d505accf",
              "totalSupply()": "18160ddd"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"notice\":\"EIP 2612\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/bentobox/BentoBoxV1.sol\":\"IERC20\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/bentobox/BentoBoxV1.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\n// The BentoBox\\n\\n//  \\u2584\\u2584\\u2584\\u2584\\u00b7 \\u2584\\u2584\\u2584 . \\u2590 \\u2584 \\u2584\\u2584\\u2584\\u2584\\u2584      \\u2584\\u2584\\u2584\\u2584\\u00b7       \\u2590\\u2584\\u2022 \\u2584\\n//  \\u2590\\u2588 \\u2580\\u2588\\u25aa\\u2580\\u2584.\\u2580\\u00b7\\u2588\\u258c\\u2590\\u2588\\u2022\\u2588\\u2588  \\u25aa     \\u2590\\u2588 \\u2580\\u2588\\u25aa\\u25aa      \\u2588\\u258c\\u2588\\u258c\\u25aa\\n//  \\u2590\\u2588\\u2580\\u2580\\u2588\\u2584\\u2590\\u2580\\u2580\\u25aa\\u2584\\u2590\\u2588\\u2590\\u2590\\u258c \\u2590\\u2588.\\u25aa \\u2584\\u2588\\u2580\\u2584 \\u2590\\u2588\\u2580\\u2580\\u2588\\u2584 \\u2584\\u2588\\u2580\\u2584  \\u00b7\\u2588\\u2588\\u00b7\\n//  \\u2588\\u2588\\u2584\\u25aa\\u2590\\u2588\\u2590\\u2588\\u2584\\u2584\\u258c\\u2588\\u2588\\u2590\\u2588\\u258c \\u2590\\u2588\\u258c\\u00b7\\u2590\\u2588\\u258c.\\u2590\\u258c\\u2588\\u2588\\u2584\\u25aa\\u2590\\u2588\\u2590\\u2588\\u258c.\\u2590\\u258c\\u25aa\\u2590\\u2588\\u00b7\\u2588\\u258c\\n//  \\u00b7\\u2580\\u2580\\u2580\\u2580  \\u2580\\u2580\\u2580 \\u2580\\u2580 \\u2588\\u25aa \\u2580\\u2580\\u2580  \\u2580\\u2588\\u2584\\u2580\\u25aa\\u00b7\\u2580\\u2580\\u2580\\u2580  \\u2580\\u2588\\u2584\\u2580\\u25aa\\u2022\\u2580\\u2580 \\u2580\\u2580\\n\\n// This contract stores funds, handles their transfers, supports flash loans and strategies.\\n\\n// Copyright (c) 2021 BoringCrypto - All rights reserved\\n// Twitter: @Boring_Crypto\\n\\n// Special thanks to Keno for all his hard work and support\\n\\n// Version 22-Mar-2021\\n\\npragma solidity 0.6.12;\\npragma experimental ABIEncoderV2;\\n\\n// solhint-disable avoid-low-level-calls\\n// solhint-disable not-rely-on-time\\n// solhint-disable no-inline-assembly\\n\\n// File @boringcrypto/boring-solidity/contracts/interfaces/IERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ninterface IERC20 {\\n    function totalSupply() external view returns (uint256);\\n\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /// @notice EIP 2612\\n    function permit(\\n        address owner,\\n        address spender,\\n        uint256 value,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) external;\\n}\\n\\n// File contracts/interfaces/IFlashLoan.sol\\n// License-Identifier: MIT\\n\\ninterface IFlashBorrower {\\n    /// @notice The flashloan callback. `amount` + `fee` needs to repayed to msg.sender before this call returns.\\n    /// @param sender The address of the invoker of this flashloan.\\n    /// @param token The address of the token that is loaned.\\n    /// @param amount of the `token` that is loaned.\\n    /// @param fee The fee that needs to be paid on top for this loan. Needs to be the same as `token`.\\n    /// @param data Additional data that was passed to the flashloan function.\\n    function onFlashLoan(\\n        address sender,\\n        IERC20 token,\\n        uint256 amount,\\n        uint256 fee,\\n        bytes calldata data\\n    ) external;\\n}\\n\\ninterface IBatchFlashBorrower {\\n    /// @notice The callback for batched flashloans. Every amount + fee needs to repayed to msg.sender before this call returns.\\n    /// @param sender The address of the invoker of this flashloan.\\n    /// @param tokens Array of addresses for ERC-20 tokens that is loaned.\\n    /// @param amounts A one-to-one map to `tokens` that is loaned.\\n    /// @param fees A one-to-one map to `tokens` that needs to be paid on top for each loan. Needs to be the same token.\\n    /// @param data Additional data that was passed to the flashloan function.\\n    function onBatchFlashLoan(\\n        address sender,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        uint256[] calldata fees,\\n        bytes calldata data\\n    ) external;\\n}\\n\\n// File contracts/interfaces/IWETH.sol\\n// License-Identifier: MIT\\n\\ninterface IWETH {\\n    function deposit() external payable;\\n\\n    function withdraw(uint256) external;\\n}\\n\\n// File contracts/interfaces/IStrategy.sol\\n// License-Identifier: MIT\\n\\ninterface IStrategy {\\n    /// @notice Send the assets to the Strategy and call skim to invest them.\\n    /// @param amount The amount of tokens to invest.\\n    function skim(uint256 amount) external;\\n\\n    /// @notice Harvest any profits made converted to the asset and pass them to the caller.\\n    /// @param balance The amount of tokens the caller thinks it has invested.\\n    /// @param sender The address of the initiator of this transaction. Can be used for reimbursements, etc.\\n    /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.\\n    function harvest(uint256 balance, address sender) external returns (int256 amountAdded);\\n\\n    /// @notice Withdraw assets. The returned amount can differ from the requested amount due to rounding.\\n    /// @dev The `actualAmount` should be very close to the amount.\\n    /// The difference should NOT be used to report a loss. That's what harvest is for.\\n    /// @param amount The requested amount the caller wants to withdraw.\\n    /// @return actualAmount The real amount that is withdrawn.\\n    function withdraw(uint256 amount) external returns (uint256 actualAmount);\\n\\n    /// @notice Withdraw all assets in the safest way possible. This shouldn't fail.\\n    /// @param balance The amount of tokens the caller thinks it has invested.\\n    /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.\\n    function exit(uint256 balance) external returns (int256 amountAdded);\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\nlibrary BoringERC20 {\\n    bytes4 private constant SIG_SYMBOL = 0x95d89b41; // symbol()\\n    bytes4 private constant SIG_NAME = 0x06fdde03; // name()\\n    bytes4 private constant SIG_DECIMALS = 0x313ce567; // decimals()\\n    bytes4 private constant SIG_TRANSFER = 0xa9059cbb; // transfer(address,uint256)\\n    bytes4 private constant SIG_TRANSFER_FROM = 0x23b872dd; // transferFrom(address,address,uint256)\\n\\n    /// @notice Provides a safe ERC20.transfer version for different ERC-20 implementations.\\n    /// Reverts on a failed transfer.\\n    /// @param token The address of the ERC-20 token.\\n    /// @param to Transfer tokens to.\\n    /// @param amount The token amount.\\n    function safeTransfer(\\n        IERC20 token,\\n        address to,\\n        uint256 amount\\n    ) internal {\\n        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER, to, amount));\\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: Transfer failed\\\");\\n    }\\n\\n    /// @notice Provides a safe ERC20.transferFrom version for different ERC-20 implementations.\\n    /// Reverts on a failed transfer.\\n    /// @param token The address of the ERC-20 token.\\n    /// @param from Transfer tokens from.\\n    /// @param to Transfer tokens to.\\n    /// @param amount The token amount.\\n    function safeTransferFrom(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 amount\\n    ) internal {\\n        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER_FROM, from, to, amount));\\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: TransferFrom failed\\\");\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringMath.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n/// @notice A library for performing overflow-/underflow-safe math,\\n/// updated with awesomeness from of DappHub (https://github.com/dapphub/ds-math).\\nlibrary BoringMath {\\n    function add(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require(b == 0 || (c = a * b) / b == a, \\\"BoringMath: Mul Overflow\\\");\\n    }\\n\\n    function to128(uint256 a) internal pure returns (uint128 c) {\\n        require(a <= uint128(-1), \\\"BoringMath: uint128 Overflow\\\");\\n        c = uint128(a);\\n    }\\n\\n    function to64(uint256 a) internal pure returns (uint64 c) {\\n        require(a <= uint64(-1), \\\"BoringMath: uint64 Overflow\\\");\\n        c = uint64(a);\\n    }\\n\\n    function to32(uint256 a) internal pure returns (uint32 c) {\\n        require(a <= uint32(-1), \\\"BoringMath: uint32 Overflow\\\");\\n        c = uint32(a);\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint128.\\nlibrary BoringMath128 {\\n    function add(uint128 a, uint128 b) internal pure returns (uint128 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint128 a, uint128 b) internal pure returns (uint128 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint64.\\nlibrary BoringMath64 {\\n    function add(uint64 a, uint64 b) internal pure returns (uint64 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint64 a, uint64 b) internal pure returns (uint64 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint32.\\nlibrary BoringMath32 {\\n    function add(uint32 a, uint32 b) internal pure returns (uint32 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint32 a, uint32 b) internal pure returns (uint32 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringRebase.sol@v1.2.0\\n// License-Identifier: MIT\\n\\nstruct Rebase {\\n    uint128 elastic;\\n    uint128 base;\\n}\\n\\n/// @notice A rebasing library using overflow-/underflow-safe math.\\nlibrary RebaseLibrary {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n\\n    /// @notice Calculates the base value in relationship to `elastic` and `total`.\\n    function toBase(\\n        Rebase memory total,\\n        uint256 elastic,\\n        bool roundUp\\n    ) internal pure returns (uint256 base) {\\n        if (total.elastic == 0) {\\n            base = elastic;\\n        } else {\\n            base = elastic.mul(total.base) / total.elastic;\\n            if (roundUp && base.mul(total.elastic) / total.base < elastic) {\\n                base = base.add(1);\\n            }\\n        }\\n    }\\n\\n    /// @notice Calculates the elastic value in relationship to `base` and `total`.\\n    function toElastic(\\n        Rebase memory total,\\n        uint256 base,\\n        bool roundUp\\n    ) internal pure returns (uint256 elastic) {\\n        if (total.base == 0) {\\n            elastic = base;\\n        } else {\\n            elastic = base.mul(total.elastic) / total.base;\\n            if (roundUp && elastic.mul(total.base) / total.elastic < base) {\\n                elastic = elastic.add(1);\\n            }\\n        }\\n    }\\n\\n    /// @notice Add `elastic` to `total` and doubles `total.base`.\\n    /// @return (Rebase) The new total.\\n    /// @return base in relationship to `elastic`.\\n    function add(\\n        Rebase memory total,\\n        uint256 elastic,\\n        bool roundUp\\n    ) internal pure returns (Rebase memory, uint256 base) {\\n        base = toBase(total, elastic, roundUp);\\n        total.elastic = total.elastic.add(elastic.to128());\\n        total.base = total.base.add(base.to128());\\n        return (total, base);\\n    }\\n\\n    /// @notice Sub `base` from `total` and update `total.elastic`.\\n    /// @return (Rebase) The new total.\\n    /// @return elastic in relationship to `base`.\\n    function sub(\\n        Rebase memory total,\\n        uint256 base,\\n        bool roundUp\\n    ) internal pure returns (Rebase memory, uint256 elastic) {\\n        elastic = toElastic(total, base, roundUp);\\n        total.elastic = total.elastic.sub(elastic.to128());\\n        total.base = total.base.sub(base.to128());\\n        return (total, elastic);\\n    }\\n\\n    /// @notice Add `elastic` and `base` to `total`.\\n    function add(\\n        Rebase memory total,\\n        uint256 elastic,\\n        uint256 base\\n    ) internal pure returns (Rebase memory) {\\n        total.elastic = total.elastic.add(elastic.to128());\\n        total.base = total.base.add(base.to128());\\n        return total;\\n    }\\n\\n    /// @notice Subtract `elastic` and `base` to `total`.\\n    function sub(\\n        Rebase memory total,\\n        uint256 elastic,\\n        uint256 base\\n    ) internal pure returns (Rebase memory) {\\n        total.elastic = total.elastic.sub(elastic.to128());\\n        total.base = total.base.sub(base.to128());\\n        return total;\\n    }\\n\\n    /// @notice Add `elastic` to `total` and update storage.\\n    /// @return newElastic Returns updated `elastic`.\\n    function addElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {\\n        newElastic = total.elastic = total.elastic.add(elastic.to128());\\n    }\\n\\n    /// @notice Subtract `elastic` from `total` and update storage.\\n    /// @return newElastic Returns updated `elastic`.\\n    function subElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {\\n        newElastic = total.elastic = total.elastic.sub(elastic.to128());\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringOwnable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n// Source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol + Claimable.sol\\n// Edited by BoringCrypto\\n\\ncontract BoringOwnableData {\\n    address public owner;\\n    address public pendingOwner;\\n}\\n\\ncontract BoringOwnable is BoringOwnableData {\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /// @notice `owner` defaults to msg.sender on construction.\\n    constructor() public {\\n        owner = msg.sender;\\n        emit OwnershipTransferred(address(0), msg.sender);\\n    }\\n\\n    /// @notice Transfers ownership to `newOwner`. Either directly or claimable by the new pending owner.\\n    /// Can only be invoked by the current `owner`.\\n    /// @param newOwner Address of the new owner.\\n    /// @param direct True if `newOwner` should be set immediately. False if `newOwner` needs to use `claimOwnership`.\\n    /// @param renounce Allows the `newOwner` to be `address(0)` if `direct` and `renounce` is True. Has no effect otherwise.\\n    function transferOwnership(\\n        address newOwner,\\n        bool direct,\\n        bool renounce\\n    ) public onlyOwner {\\n        if (direct) {\\n            // Checks\\n            require(newOwner != address(0) || renounce, \\\"Ownable: zero address\\\");\\n\\n            // Effects\\n            emit OwnershipTransferred(owner, newOwner);\\n            owner = newOwner;\\n            pendingOwner = address(0);\\n        } else {\\n            // Effects\\n            pendingOwner = newOwner;\\n        }\\n    }\\n\\n    /// @notice Needs to be called by `pendingOwner` to claim ownership.\\n    function claimOwnership() public {\\n        address _pendingOwner = pendingOwner;\\n\\n        // Checks\\n        require(msg.sender == _pendingOwner, \\\"Ownable: caller != pending owner\\\");\\n\\n        // Effects\\n        emit OwnershipTransferred(owner, _pendingOwner);\\n        owner = _pendingOwner;\\n        pendingOwner = address(0);\\n    }\\n\\n    /// @notice Only allows the `owner` to execute the function.\\n    modifier onlyOwner() {\\n        require(msg.sender == owner, \\\"Ownable: caller is not the owner\\\");\\n        _;\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/interfaces/IMasterContract.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ninterface IMasterContract {\\n    /// @notice Init function that gets called from `BoringFactory.deploy`.\\n    /// Also kown as the constructor for cloned contracts.\\n    /// Any ETH send to `BoringFactory.deploy` ends up here.\\n    /// @param data Can be abi encoded arguments or anything else.\\n    function init(bytes calldata data) external payable;\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringFactory.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ncontract BoringFactory {\\n    event LogDeploy(address indexed masterContract, bytes data, address indexed cloneAddress);\\n\\n    /// @notice Mapping from clone contracts to their masterContract.\\n    mapping(address => address) public masterContractOf;\\n\\n    /// @notice Deploys a given master Contract as a clone.\\n    /// Any ETH transferred with this call is forwarded to the new clone.\\n    /// Emits `LogDeploy`.\\n    /// @param masterContract The address of the contract to clone.\\n    /// @param data Additional abi encoded calldata that is passed to the new clone via `IMasterContract.init`.\\n    /// @param useCreate2 Creates the clone by using the CREATE2 opcode, in this case `data` will be used as salt.\\n    /// @return cloneAddress Address of the created clone contract.\\n    function deploy(\\n        address masterContract,\\n        bytes calldata data,\\n        bool useCreate2\\n    ) public payable returns (address cloneAddress) {\\n        require(masterContract != address(0), \\\"BoringFactory: No masterContract\\\");\\n        bytes20 targetBytes = bytes20(masterContract); // Takes the first 20 bytes of the masterContract's address\\n\\n        if (useCreate2) {\\n            // each masterContract has different code already. So clones are distinguished by their data only.\\n            bytes32 salt = keccak256(data);\\n\\n            // Creates clone, more info here: https://blog.openzeppelin.com/deep-dive-into-the-minimal-proxy-contract/\\n            assembly {\\n                let clone := mload(0x40)\\n                mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n                mstore(add(clone, 0x14), targetBytes)\\n                mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n                cloneAddress := create2(0, clone, 0x37, salt)\\n            }\\n        } else {\\n            assembly {\\n                let clone := mload(0x40)\\n                mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n                mstore(add(clone, 0x14), targetBytes)\\n                mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n                cloneAddress := create(0, clone, 0x37)\\n            }\\n        }\\n        masterContractOf[cloneAddress] = masterContract;\\n\\n        IMasterContract(cloneAddress).init{value: msg.value}(data);\\n\\n        emit LogDeploy(masterContract, data, cloneAddress);\\n    }\\n}\\n\\n// File contracts/MasterContractManager.sol\\n// License-Identifier: UNLICENSED\\n\\ncontract MasterContractManager is BoringOwnable, BoringFactory {\\n    event LogWhiteListMasterContract(address indexed masterContract, bool approved);\\n    event LogSetMasterContractApproval(address indexed masterContract, address indexed user, bool approved);\\n    event LogRegisterProtocol(address indexed protocol);\\n\\n    /// @notice masterContract to user to approval state\\n    mapping(address => mapping(address => bool)) public masterContractApproved;\\n    /// @notice masterContract to whitelisted state for approval without signed message\\n    mapping(address => bool) public whitelistedMasterContracts;\\n    /// @notice user nonces for masterContract approvals\\n    mapping(address => uint256) public nonces;\\n\\n    bytes32 private constant DOMAIN_SEPARATOR_SIGNATURE_HASH = keccak256(\\\"EIP712Domain(string name,uint256 chainId,address verifyingContract)\\\");\\n    // See https://eips.ethereum.org/EIPS/eip-191\\n    string private constant EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA = \\\"\\\\x19\\\\x01\\\";\\n    bytes32 private constant APPROVAL_SIGNATURE_HASH =\\n        keccak256(\\\"SetMasterContractApproval(string warning,address user,address masterContract,bool approved,uint256 nonce)\\\");\\n\\n    // solhint-disable-next-line var-name-mixedcase\\n    bytes32 private immutable _DOMAIN_SEPARATOR;\\n    // solhint-disable-next-line var-name-mixedcase\\n    uint256 private immutable DOMAIN_SEPARATOR_CHAIN_ID;\\n\\n    constructor() public {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        _DOMAIN_SEPARATOR = _calculateDomainSeparator(DOMAIN_SEPARATOR_CHAIN_ID = chainId);\\n    }\\n\\n    function _calculateDomainSeparator(uint256 chainId) private view returns (bytes32) {\\n        return keccak256(abi.encode(DOMAIN_SEPARATOR_SIGNATURE_HASH, keccak256(\\\"BentoBox V1\\\"), chainId, address(this)));\\n    }\\n\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() public view returns (bytes32) {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        return chainId == DOMAIN_SEPARATOR_CHAIN_ID ? _DOMAIN_SEPARATOR : _calculateDomainSeparator(chainId);\\n    }\\n\\n    /// @notice Other contracts need to register with this master contract so that users can approve them for the BentoBox.\\n    function registerProtocol() public {\\n        masterContractOf[msg.sender] = msg.sender;\\n        emit LogRegisterProtocol(msg.sender);\\n    }\\n\\n    /// @notice Enables or disables a contract for approval without signed message.\\n    function whitelistMasterContract(address masterContract, bool approved) public onlyOwner {\\n        // Checks\\n        require(masterContract != address(0), \\\"MasterCMgr: Cannot approve 0\\\");\\n\\n        // Effects\\n        whitelistedMasterContracts[masterContract] = approved;\\n        emit LogWhiteListMasterContract(masterContract, approved);\\n    }\\n\\n    /// @notice Approves or revokes a `masterContract` access to `user` funds.\\n    /// @param user The address of the user that approves or revokes access.\\n    /// @param masterContract The address who gains or loses access.\\n    /// @param approved If True approves access. If False revokes access.\\n    /// @param v Part of the signature. (See EIP-191)\\n    /// @param r Part of the signature. (See EIP-191)\\n    /// @param s Part of the signature. (See EIP-191)\\n    // F4 - Check behaviour for all function arguments when wrong or extreme\\n    // F4: Don't allow masterContract 0 to be approved. Unknown contracts will have a masterContract of 0.\\n    // F4: User can't be 0 for signed approvals because the recoveredAddress will be 0 if ecrecover fails\\n    function setMasterContractApproval(\\n        address user,\\n        address masterContract,\\n        bool approved,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) public {\\n        // Checks\\n        require(masterContract != address(0), \\\"MasterCMgr: masterC not set\\\"); // Important for security\\n\\n        // If no signature is provided, the fallback is executed\\n        if (r == 0 && s == 0 && v == 0) {\\n            require(user == msg.sender, \\\"MasterCMgr: user not sender\\\");\\n            require(masterContractOf[user] == address(0), \\\"MasterCMgr: user is clone\\\");\\n            require(whitelistedMasterContracts[masterContract], \\\"MasterCMgr: not whitelisted\\\");\\n        } else {\\n            // Important for security - any address without masterContract has address(0) as masterContract\\n            // So approving address(0) would approve every address, leading to full loss of funds\\n            // Also, ecrecover returns address(0) on failure. So we check this:\\n            require(user != address(0), \\\"MasterCMgr: User cannot be 0\\\");\\n\\n            // C10 - Protect signatures against replay, use nonce and chainId (SWC-121)\\n            // C10: nonce + chainId are used to prevent replays\\n            // C11 - All signatures strictly EIP-712 (SWC-117 SWC-122)\\n            // C11: signature is EIP-712 compliant\\n            // C12 - abi.encodePacked can't contain variable length user input (SWC-133)\\n            // C12: abi.encodePacked has fixed length parameters\\n            bytes32 digest =\\n                keccak256(\\n                    abi.encodePacked(\\n                        EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA,\\n                        DOMAIN_SEPARATOR(),\\n                        keccak256(\\n                            abi.encode(\\n                                APPROVAL_SIGNATURE_HASH,\\n                                approved\\n                                    ? keccak256(\\\"Give FULL access to funds in (and approved to) BentoBox?\\\")\\n                                    : keccak256(\\\"Revoke access to BentoBox?\\\"),\\n                                user,\\n                                masterContract,\\n                                approved,\\n                                nonces[user]++\\n                            )\\n                        )\\n                    )\\n                );\\n            address recoveredAddress = ecrecover(digest, v, r, s);\\n            require(recoveredAddress == user, \\\"MasterCMgr: Invalid Signature\\\");\\n        }\\n\\n        // Effects\\n        masterContractApproved[masterContract][user] = approved;\\n        emit LogSetMasterContractApproval(masterContract, user, approved);\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringBatchable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ncontract BaseBoringBatchable {\\n    /// @dev Helper function to extract a useful revert message from a failed call.\\n    /// If the returned data is malformed or not correctly abi encoded then this call can fail itself.\\n    function _getRevertMsg(bytes memory _returnData) internal pure returns (string memory) {\\n        // If the _res length is less than 68, then the transaction failed silently (without a revert message)\\n        if (_returnData.length < 68) return \\\"Transaction reverted silently\\\";\\n\\n        assembly {\\n            // Slice the sighash.\\n            _returnData := add(_returnData, 0x04)\\n        }\\n        return abi.decode(_returnData, (string)); // All that remains is the revert string\\n    }\\n\\n    /// @notice Allows batched call to self (this contract).\\n    /// @param calls An array of inputs for each call.\\n    /// @param revertOnFail If True then reverts after a failed call and stops doing further calls.\\n    /// @return successes An array indicating the success of a call, mapped one-to-one to `calls`.\\n    /// @return results An array with the returned data of each function call, mapped one-to-one to `calls`.\\n    // F1: External is ok here because this is the batch function, adding it to a batch makes no sense\\n    // F2: Calls in the batch may be payable, delegatecall operates in the same context, so each call in the batch has access to msg.value\\n    // C3: The length of the loop is fully under user control, so can't be exploited\\n    // C7: Delegatecall is only used on the same contract, so it's safe\\n    function batch(bytes[] calldata calls, bool revertOnFail) external payable returns (bool[] memory successes, bytes[] memory results) {\\n        successes = new bool[](calls.length);\\n        results = new bytes[](calls.length);\\n        for (uint256 i = 0; i < calls.length; i++) {\\n            (bool success, bytes memory result) = address(this).delegatecall(calls[i]);\\n            require(success || !revertOnFail, _getRevertMsg(result));\\n            successes[i] = success;\\n            results[i] = result;\\n        }\\n    }\\n}\\n\\ncontract BoringBatchable is BaseBoringBatchable {\\n    /// @notice Call wrapper that performs `ERC20.permit` on `token`.\\n    /// Lookup `IERC20.permit`.\\n    // F6: Parameters can be used front-run the permit and the user's permit will fail (due to nonce or other revert)\\n    //     if part of a batch this could be used to grief once as the second call would not need the permit\\n    function permitToken(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) public {\\n        token.permit(from, to, amount, deadline, v, r, s);\\n    }\\n}\\n\\n// File contracts/BentoBox.sol\\n// License-Identifier: UNLICENSED\\n\\n/// @title BentoBox\\n/// @author BoringCrypto, Keno\\n/// @notice The BentoBox is a vault for tokens. The stored tokens can be flash loaned and used in strategies.\\n/// Yield from this will go to the token depositors.\\n/// Rebasing tokens ARE NOT supported and WILL cause loss of funds.\\n/// Any funds transfered directly onto the BentoBox will be lost, use the deposit function instead.\\ncontract BentoBoxV1 is MasterContractManager, BoringBatchable {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n    using BoringERC20 for IERC20;\\n    using RebaseLibrary for Rebase;\\n\\n    // ************** //\\n    // *** EVENTS *** //\\n    // ************** //\\n\\n    event LogDeposit(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogWithdraw(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogTransfer(IERC20 indexed token, address indexed from, address indexed to, uint256 share);\\n\\n    event LogFlashLoan(address indexed borrower, IERC20 indexed token, uint256 amount, uint256 feeAmount, address indexed receiver);\\n\\n    event LogStrategyTargetPercentage(IERC20 indexed token, uint256 targetPercentage);\\n    event LogStrategyQueued(IERC20 indexed token, IStrategy indexed strategy);\\n    event LogStrategySet(IERC20 indexed token, IStrategy indexed strategy);\\n    event LogStrategyInvest(IERC20 indexed token, uint256 amount);\\n    event LogStrategyDivest(IERC20 indexed token, uint256 amount);\\n    event LogStrategyProfit(IERC20 indexed token, uint256 amount);\\n    event LogStrategyLoss(IERC20 indexed token, uint256 amount);\\n\\n    // *************** //\\n    // *** STRUCTS *** //\\n    // *************** //\\n\\n    struct StrategyData {\\n        uint64 strategyStartDate;\\n        uint64 targetPercentage;\\n        uint128 balance; // the balance of the strategy that BentoBox thinks is in there\\n    }\\n\\n    // ******************************** //\\n    // *** CONSTANTS AND IMMUTABLES *** //\\n    // ******************************** //\\n\\n    // V2 - Can they be private?\\n    // V2: Private to save gas, to verify it's correct, check the constructor arguments\\n    IERC20 private immutable wethToken;\\n\\n    IERC20 private constant USE_ETHEREUM = IERC20(0);\\n    uint256 private constant FLASH_LOAN_FEE = 50; // 0.05%\\n    uint256 private constant FLASH_LOAN_FEE_PRECISION = 1e5;\\n    uint256 private constant STRATEGY_DELAY = 2 weeks;\\n    uint256 private constant MAX_TARGET_PERCENTAGE = 95; // 95%\\n    uint256 private constant MINIMUM_SHARE_BALANCE = 1000; // To prevent the ratio going off\\n\\n    // ***************** //\\n    // *** VARIABLES *** //\\n    // ***************** //\\n\\n    // Balance per token per address/contract in shares\\n    mapping(IERC20 => mapping(address => uint256)) public balanceOf;\\n\\n    // Rebase from amount to share\\n    mapping(IERC20 => Rebase) public totals;\\n\\n    mapping(IERC20 => IStrategy) public strategy;\\n    mapping(IERC20 => IStrategy) public pendingStrategy;\\n    mapping(IERC20 => StrategyData) public strategyData;\\n\\n    // ******************* //\\n    // *** CONSTRUCTOR *** //\\n    // ******************* //\\n\\n    constructor(IERC20 wethToken_) public {\\n        wethToken = wethToken_;\\n    }\\n\\n    // ***************** //\\n    // *** MODIFIERS *** //\\n    // ***************** //\\n\\n    /// Modifier to check if the msg.sender is allowed to use funds belonging to the 'from' address.\\n    /// If 'from' is msg.sender, it's allowed.\\n    /// If 'from' is the BentoBox itself, it's allowed. Any ETH, token balances (above the known balances) or BentoBox balances\\n    /// can be taken by anyone.\\n    /// This is to enable skimming, not just for deposits, but also for withdrawals or transfers, enabling better composability.\\n    /// If 'from' is a clone of a masterContract AND the 'from' address has approved that masterContract, it's allowed.\\n    modifier allowed(address from) {\\n        if (from != msg.sender && from != address(this)) {\\n            // From is sender or you are skimming\\n            address masterContract = masterContractOf[msg.sender];\\n            require(masterContract != address(0), \\\"BentoBox: no masterContract\\\");\\n            require(masterContractApproved[masterContract][from], \\\"BentoBox: Transfer not approved\\\");\\n        }\\n        _;\\n    }\\n\\n    // ************************** //\\n    // *** INTERNAL FUNCTIONS *** //\\n    // ************************** //\\n\\n    /// @dev Returns the total balance of `token` this contracts holds,\\n    /// plus the total amount this contract thinks the strategy holds.\\n    function _tokenBalanceOf(IERC20 token) internal view returns (uint256 amount) {\\n        amount = token.balanceOf(address(this)).add(strategyData[token].balance);\\n    }\\n\\n    // ************************ //\\n    // *** PUBLIC FUNCTIONS *** //\\n    // ************************ //\\n\\n    /// @dev Helper function to represent an `amount` of `token` in shares.\\n    /// @param token The ERC-20 token.\\n    /// @param amount The `token` amount.\\n    /// @param roundUp If the result `share` should be rounded up.\\n    /// @return share The token amount represented in shares.\\n    function toShare(\\n        IERC20 token,\\n        uint256 amount,\\n        bool roundUp\\n    ) external view returns (uint256 share) {\\n        share = totals[token].toBase(amount, roundUp);\\n    }\\n\\n    /// @dev Helper function represent shares back into the `token` amount.\\n    /// @param token The ERC-20 token.\\n    /// @param share The amount of shares.\\n    /// @param roundUp If the result should be rounded up.\\n    /// @return amount The share amount back into native representation.\\n    function toAmount(\\n        IERC20 token,\\n        uint256 share,\\n        bool roundUp\\n    ) external view returns (uint256 amount) {\\n        amount = totals[token].toElastic(share, roundUp);\\n    }\\n\\n    /// @notice Deposit an amount of `token` represented in either `amount` or `share`.\\n    /// @param token_ The ERC-20 token to deposit.\\n    /// @param from which account to pull the tokens.\\n    /// @param to which account to push the tokens.\\n    /// @param amount Token amount in native representation to deposit.\\n    /// @param share Token amount represented in shares to deposit. Takes precedence over `amount`.\\n    /// @return amountOut The amount deposited.\\n    /// @return shareOut The deposited amount repesented in shares.\\n    function deposit(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) public payable allowed(from) returns (uint256 amountOut, uint256 shareOut) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;\\n        Rebase memory total = totals[token];\\n\\n        // If a new token gets added, the tokenSupply call checks that this is a deployed contract. Needed for security.\\n        require(total.elastic != 0 || token.totalSupply() > 0, \\\"BentoBox: No tokens\\\");\\n        if (share == 0) {\\n            // value of the share may be lower than the amount due to rounding, that's ok\\n            share = total.toBase(amount, false);\\n            // Any deposit should lead to at least the minimum share balance, otherwise it's ignored (no amount taken)\\n            if (total.base.add(share.to128()) < MINIMUM_SHARE_BALANCE) {\\n                return (0, 0);\\n            }\\n        } else {\\n            // amount may be lower than the value of share due to rounding, in that case, add 1 to amount (Always round up)\\n            amount = total.toElastic(share, true);\\n        }\\n\\n        // In case of skimming, check that only the skimmable amount is taken.\\n        // For ETH, the full balance is available, so no need to check.\\n        // During flashloans the _tokenBalanceOf is lower than 'reality', so skimming deposits will mostly fail during a flashloan.\\n        require(\\n            from != address(this) || token_ == USE_ETHEREUM || amount <= _tokenBalanceOf(token).sub(total.elastic),\\n            \\\"BentoBox: Skim too much\\\"\\n        );\\n\\n        balanceOf[token][to] = balanceOf[token][to].add(share);\\n        total.base = total.base.add(share.to128());\\n        total.elastic = total.elastic.add(amount.to128());\\n        totals[token] = total;\\n\\n        // Interactions\\n        // During the first deposit, we check that this token is 'real'\\n        if (token_ == USE_ETHEREUM) {\\n            // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)\\n            // X2: If the WETH implementation is faulty or malicious, it will block adding ETH (but we know the WETH implementation)\\n            IWETH(address(wethToken)).deposit{value: amount}();\\n        } else if (from != address(this)) {\\n            // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)\\n            // X2: If the token implementation is faulty or malicious, it may block adding tokens. Good.\\n            token.safeTransferFrom(from, address(this), amount);\\n        }\\n        emit LogDeposit(token, from, to, amount, share);\\n        amountOut = amount;\\n        shareOut = share;\\n    }\\n\\n    /// @notice Withdraws an amount of `token` from a user account.\\n    /// @param token_ The ERC-20 token to withdraw.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param amount of tokens. Either one of `amount` or `share` needs to be supplied.\\n    /// @param share Like above, but `share` takes precedence over `amount`.\\n    function withdraw(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) public allowed(from) returns (uint256 amountOut, uint256 shareOut) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;\\n        Rebase memory total = totals[token];\\n        if (share == 0) {\\n            // value of the share paid could be lower than the amount paid due to rounding, in that case, add a share (Always round up)\\n            share = total.toBase(amount, true);\\n        } else {\\n            // amount may be lower than the value of share due to rounding, that's ok\\n            amount = total.toElastic(share, false);\\n        }\\n\\n        balanceOf[token][from] = balanceOf[token][from].sub(share);\\n        total.elastic = total.elastic.sub(amount.to128());\\n        total.base = total.base.sub(share.to128());\\n        // There have to be at least 1000 shares left to prevent reseting the share/amount ratio (unless it's fully emptied)\\n        require(total.base >= MINIMUM_SHARE_BALANCE || total.base == 0, \\\"BentoBox: cannot empty\\\");\\n        totals[token] = total;\\n\\n        // Interactions\\n        if (token_ == USE_ETHEREUM) {\\n            // X2, X3: A revert or big gas usage in the WETH contract could block withdrawals, but WETH9 is fine.\\n            IWETH(address(wethToken)).withdraw(amount);\\n            // X2, X3: A revert or big gas usage could block, however, the to address is under control of the caller.\\n            (bool success, ) = to.call{value: amount}(\\\"\\\");\\n            require(success, \\\"BentoBox: ETH transfer failed\\\");\\n        } else {\\n            // X2, X3: A malicious token could block withdrawal of just THAT token.\\n            //         masterContracts may want to take care not to rely on withdraw always succeeding.\\n            token.safeTransfer(to, amount);\\n        }\\n        emit LogWithdraw(token, from, to, amount, share);\\n        amountOut = amount;\\n        shareOut = share;\\n    }\\n\\n    /// @notice Transfer shares from a user account to another one.\\n    /// @param token The ERC-20 token to transfer.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param share The amount of `token` in shares.\\n    // Clones of master contracts can transfer from any account that has approved them\\n    // F3 - Can it be combined with another similar function?\\n    // F3: This isn't combined with transferMultiple for gas optimization\\n    function transfer(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 share\\n    ) public allowed(from) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        balanceOf[token][from] = balanceOf[token][from].sub(share);\\n        balanceOf[token][to] = balanceOf[token][to].add(share);\\n\\n        emit LogTransfer(token, from, to, share);\\n    }\\n\\n    /// @notice Transfer shares from a user account to multiple other ones.\\n    /// @param token The ERC-20 token to transfer.\\n    /// @param from which user to pull the tokens.\\n    /// @param tos The receivers of the tokens.\\n    /// @param shares The amount of `token` in shares for each receiver in `tos`.\\n    // F3 - Can it be combined with another similar function?\\n    // F3: This isn't combined with transfer for gas optimization\\n    function transferMultiple(\\n        IERC20 token,\\n        address from,\\n        address[] calldata tos,\\n        uint256[] calldata shares\\n    ) public allowed(from) {\\n        // Checks\\n        require(tos[0] != address(0), \\\"BentoBox: to[0] not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        uint256 totalAmount;\\n        uint256 len = tos.length;\\n        for (uint256 i = 0; i < len; i++) {\\n            address to = tos[i];\\n            balanceOf[token][to] = balanceOf[token][to].add(shares[i]);\\n            totalAmount = totalAmount.add(shares[i]);\\n            emit LogTransfer(token, from, to, shares[i]);\\n        }\\n        balanceOf[token][from] = balanceOf[token][from].sub(totalAmount);\\n    }\\n\\n    /// @notice Flashloan ability.\\n    /// @param borrower The address of the contract that implements and conforms to `IFlashBorrower` and handles the flashloan.\\n    /// @param receiver Address of the token receiver.\\n    /// @param token The address of the token to receive.\\n    /// @param amount of the tokens to receive.\\n    /// @param data The calldata to pass to the `borrower` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Not possible to follow this here, reentrancy has been reviewed\\n    // F6 - Check for front-running possibilities, such as the approve function (SWC-114)\\n    // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.\\n    function flashLoan(\\n        IFlashBorrower borrower,\\n        address receiver,\\n        IERC20 token,\\n        uint256 amount,\\n        bytes calldata data\\n    ) public {\\n        uint256 fee = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;\\n        token.safeTransfer(receiver, amount);\\n\\n        borrower.onFlashLoan(msg.sender, token, amount, fee, data);\\n\\n        require(_tokenBalanceOf(token) >= totals[token].addElastic(fee.to128()), \\\"BentoBox: Wrong amount\\\");\\n        emit LogFlashLoan(address(borrower), token, amount, fee, receiver);\\n    }\\n\\n    /// @notice Support for batched flashloans. Useful to request multiple different `tokens` in a single transaction.\\n    /// @param borrower The address of the contract that implements and conforms to `IBatchFlashBorrower` and handles the flashloan.\\n    /// @param receivers An array of the token receivers. A one-to-one mapping with `tokens` and `amounts`.\\n    /// @param tokens The addresses of the tokens.\\n    /// @param amounts of the tokens for each receiver.\\n    /// @param data The calldata to pass to the `borrower` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Not possible to follow this here, reentrancy has been reviewed\\n    // F6 - Check for front-running possibilities, such as the approve function (SWC-114)\\n    // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.\\n    function batchFlashLoan(\\n        IBatchFlashBorrower borrower,\\n        address[] calldata receivers,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        bytes calldata data\\n    ) public {\\n        uint256[] memory fees = new uint256[](tokens.length);\\n\\n        uint256 len = tokens.length;\\n        for (uint256 i = 0; i < len; i++) {\\n            uint256 amount = amounts[i];\\n            fees[i] = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;\\n\\n            tokens[i].safeTransfer(receivers[i], amounts[i]);\\n        }\\n\\n        borrower.onBatchFlashLoan(msg.sender, tokens, amounts, fees, data);\\n\\n        for (uint256 i = 0; i < len; i++) {\\n            IERC20 token = tokens[i];\\n            require(_tokenBalanceOf(token) >= totals[token].addElastic(fees[i].to128()), \\\"BentoBox: Wrong amount\\\");\\n            emit LogFlashLoan(address(borrower), token, amounts[i], fees[i], receivers[i]);\\n        }\\n    }\\n\\n    /// @notice Sets the target percentage of the strategy for `token`.\\n    /// @dev Only the owner of this contract is allowed to change this.\\n    /// @param token The address of the token that maps to a strategy to change.\\n    /// @param targetPercentage_ The new target in percent. Must be lesser or equal to `MAX_TARGET_PERCENTAGE`.\\n    function setStrategyTargetPercentage(IERC20 token, uint64 targetPercentage_) public onlyOwner {\\n        // Checks\\n        require(targetPercentage_ <= MAX_TARGET_PERCENTAGE, \\\"StrategyManager: Target too high\\\");\\n\\n        // Effects\\n        strategyData[token].targetPercentage = targetPercentage_;\\n        emit LogStrategyTargetPercentage(token, targetPercentage_);\\n    }\\n\\n    /// @notice Sets the contract address of a new strategy that conforms to `IStrategy` for `token`.\\n    /// Must be called twice with the same arguments.\\n    /// A new strategy becomes pending first and can be activated once `STRATEGY_DELAY` is over.\\n    /// @dev Only the owner of this contract is allowed to change this.\\n    /// @param token The address of the token that maps to a strategy to change.\\n    /// @param newStrategy The address of the contract that conforms to `IStrategy`.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Total amount is updated AFTER interaction. But strategy is under our control.\\n    // C4 - Use block.timestamp only for long intervals (SWC-116)\\n    // C4: block.timestamp is used for a period of 2 weeks, which is long enough\\n    function setStrategy(IERC20 token, IStrategy newStrategy) public onlyOwner {\\n        StrategyData memory data = strategyData[token];\\n        IStrategy pending = pendingStrategy[token];\\n        if (data.strategyStartDate == 0 || pending != newStrategy) {\\n            pendingStrategy[token] = newStrategy;\\n            // C1 - All math done through BoringMath (SWC-101)\\n            // C1: Our sun will swallow the earth well before this overflows\\n            data.strategyStartDate = (block.timestamp + STRATEGY_DELAY).to64();\\n            emit LogStrategyQueued(token, newStrategy);\\n        } else {\\n            require(data.strategyStartDate != 0 && block.timestamp >= data.strategyStartDate, \\\"StrategyManager: Too early\\\");\\n            if (address(strategy[token]) != address(0)) {\\n                int256 balanceChange = strategy[token].exit(data.balance);\\n                // Effects\\n                if (balanceChange > 0) {\\n                    uint256 add = uint256(balanceChange);\\n                    totals[token].addElastic(add);\\n                    emit LogStrategyProfit(token, add);\\n                } else if (balanceChange < 0) {\\n                    uint256 sub = uint256(-balanceChange);\\n                    totals[token].subElastic(sub);\\n                    emit LogStrategyLoss(token, sub);\\n                }\\n\\n                emit LogStrategyDivest(token, data.balance);\\n            }\\n            strategy[token] = pending;\\n            data.strategyStartDate = 0;\\n            data.balance = 0;\\n            pendingStrategy[token] = IStrategy(0);\\n            emit LogStrategySet(token, newStrategy);\\n        }\\n        strategyData[token] = data;\\n    }\\n\\n    /// @notice The actual process of yield farming. Executes the strategy of `token`.\\n    /// Optionally does housekeeping if `balance` is true.\\n    /// `maxChangeAmount` is relevant for skimming or withdrawing if `balance` is true.\\n    /// @param token The address of the token for which a strategy is deployed.\\n    /// @param balance True if housekeeping should be done.\\n    /// @param maxChangeAmount The maximum amount for either pulling or pushing from/to the `IStrategy` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Total amount is updated AFTER interaction. But strategy is under our control.\\n    // F5: Not followed to prevent reentrancy issues with flashloans and BentoBox skims?\\n    function harvest(\\n        IERC20 token,\\n        bool balance,\\n        uint256 maxChangeAmount\\n    ) public {\\n        StrategyData memory data = strategyData[token];\\n        IStrategy _strategy = strategy[token];\\n        int256 balanceChange = _strategy.harvest(data.balance, msg.sender);\\n        if (balanceChange == 0 && !balance) {\\n            return;\\n        }\\n\\n        uint256 totalElastic = totals[token].elastic;\\n\\n        if (balanceChange > 0) {\\n            uint256 add = uint256(balanceChange);\\n            totalElastic = totalElastic.add(add);\\n            totals[token].elastic = totalElastic.to128();\\n            emit LogStrategyProfit(token, add);\\n        } else if (balanceChange < 0) {\\n            // C1 - All math done through BoringMath (SWC-101)\\n            // C1: balanceChange could overflow if it's max negative int128.\\n            // But tokens with balances that large are not supported by the BentoBox.\\n            uint256 sub = uint256(-balanceChange);\\n            totalElastic = totalElastic.sub(sub);\\n            totals[token].elastic = totalElastic.to128();\\n            data.balance = data.balance.sub(sub.to128());\\n            emit LogStrategyLoss(token, sub);\\n        }\\n\\n        if (balance) {\\n            uint256 targetBalance = totalElastic.mul(data.targetPercentage) / 100;\\n            // if data.balance == targetBalance there is nothing to update\\n            if (data.balance < targetBalance) {\\n                uint256 amountOut = targetBalance.sub(data.balance);\\n                if (maxChangeAmount != 0 && amountOut > maxChangeAmount) {\\n                    amountOut = maxChangeAmount;\\n                }\\n                token.safeTransfer(address(_strategy), amountOut);\\n                data.balance = data.balance.add(amountOut.to128());\\n                _strategy.skim(amountOut);\\n                emit LogStrategyInvest(token, amountOut);\\n            } else if (data.balance > targetBalance) {\\n                uint256 amountIn = data.balance.sub(targetBalance.to128());\\n                if (maxChangeAmount != 0 && amountIn > maxChangeAmount) {\\n                    amountIn = maxChangeAmount;\\n                }\\n\\n                uint256 actualAmountIn = _strategy.withdraw(amountIn);\\n\\n                data.balance = data.balance.sub(actualAmountIn.to128());\\n                emit LogStrategyDivest(token, actualAmountIn);\\n            }\\n        }\\n\\n        strategyData[token] = data;\\n    }\\n\\n    // Contract should be able to receive ETH deposits to support deposit & skim\\n    // solhint-disable-next-line no-empty-blocks\\n    receive() external payable {}\\n}\\n\",\"keccak256\":\"0xf5251397b9aaa5c66ddc18b0cb96350ffac09f5776a1255fedc0072641f916fe\",\"license\":\"UNLICENSED\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {
              "permit(address,address,uint256,uint256,uint8,bytes32,bytes32)": {
                "notice": "EIP 2612"
              }
            },
            "version": 1
          }
        },
        "IFlashBorrower": {
          "abi": [
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "sender",
                  "type": "address"
                },
                {
                  "internalType": "contract IERC20",
                  "name": "token",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "fee",
                  "type": "uint256"
                },
                {
                  "internalType": "bytes",
                  "name": "data",
                  "type": "bytes"
                }
              ],
              "name": "onFlashLoan",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {
              "onFlashLoan(address,address,uint256,uint256,bytes)": {
                "params": {
                  "amount": "of the `token` that is loaned.",
                  "data": "Additional data that was passed to the flashloan function.",
                  "fee": "The fee that needs to be paid on top for this loan. Needs to be the same as `token`.",
                  "sender": "The address of the invoker of this flashloan.",
                  "token": "The address of the token that is loaned."
                }
              }
            },
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "gasEstimates": null,
            "methodIdentifiers": {
              "onFlashLoan(address,address,uint256,uint256,bytes)": "23e30c8b"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"fee\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"onFlashLoan\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"onFlashLoan(address,address,uint256,uint256,bytes)\":{\"params\":{\"amount\":\"of the `token` that is loaned.\",\"data\":\"Additional data that was passed to the flashloan function.\",\"fee\":\"The fee that needs to be paid on top for this loan. Needs to be the same as `token`.\",\"sender\":\"The address of the invoker of this flashloan.\",\"token\":\"The address of the token that is loaned.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"onFlashLoan(address,address,uint256,uint256,bytes)\":{\"notice\":\"The flashloan callback. `amount` + `fee` needs to repayed to msg.sender before this call returns.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/bentobox/BentoBoxV1.sol\":\"IFlashBorrower\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/bentobox/BentoBoxV1.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\n// The BentoBox\\n\\n//  \\u2584\\u2584\\u2584\\u2584\\u00b7 \\u2584\\u2584\\u2584 . \\u2590 \\u2584 \\u2584\\u2584\\u2584\\u2584\\u2584      \\u2584\\u2584\\u2584\\u2584\\u00b7       \\u2590\\u2584\\u2022 \\u2584\\n//  \\u2590\\u2588 \\u2580\\u2588\\u25aa\\u2580\\u2584.\\u2580\\u00b7\\u2588\\u258c\\u2590\\u2588\\u2022\\u2588\\u2588  \\u25aa     \\u2590\\u2588 \\u2580\\u2588\\u25aa\\u25aa      \\u2588\\u258c\\u2588\\u258c\\u25aa\\n//  \\u2590\\u2588\\u2580\\u2580\\u2588\\u2584\\u2590\\u2580\\u2580\\u25aa\\u2584\\u2590\\u2588\\u2590\\u2590\\u258c \\u2590\\u2588.\\u25aa \\u2584\\u2588\\u2580\\u2584 \\u2590\\u2588\\u2580\\u2580\\u2588\\u2584 \\u2584\\u2588\\u2580\\u2584  \\u00b7\\u2588\\u2588\\u00b7\\n//  \\u2588\\u2588\\u2584\\u25aa\\u2590\\u2588\\u2590\\u2588\\u2584\\u2584\\u258c\\u2588\\u2588\\u2590\\u2588\\u258c \\u2590\\u2588\\u258c\\u00b7\\u2590\\u2588\\u258c.\\u2590\\u258c\\u2588\\u2588\\u2584\\u25aa\\u2590\\u2588\\u2590\\u2588\\u258c.\\u2590\\u258c\\u25aa\\u2590\\u2588\\u00b7\\u2588\\u258c\\n//  \\u00b7\\u2580\\u2580\\u2580\\u2580  \\u2580\\u2580\\u2580 \\u2580\\u2580 \\u2588\\u25aa \\u2580\\u2580\\u2580  \\u2580\\u2588\\u2584\\u2580\\u25aa\\u00b7\\u2580\\u2580\\u2580\\u2580  \\u2580\\u2588\\u2584\\u2580\\u25aa\\u2022\\u2580\\u2580 \\u2580\\u2580\\n\\n// This contract stores funds, handles their transfers, supports flash loans and strategies.\\n\\n// Copyright (c) 2021 BoringCrypto - All rights reserved\\n// Twitter: @Boring_Crypto\\n\\n// Special thanks to Keno for all his hard work and support\\n\\n// Version 22-Mar-2021\\n\\npragma solidity 0.6.12;\\npragma experimental ABIEncoderV2;\\n\\n// solhint-disable avoid-low-level-calls\\n// solhint-disable not-rely-on-time\\n// solhint-disable no-inline-assembly\\n\\n// File @boringcrypto/boring-solidity/contracts/interfaces/IERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ninterface IERC20 {\\n    function totalSupply() external view returns (uint256);\\n\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /// @notice EIP 2612\\n    function permit(\\n        address owner,\\n        address spender,\\n        uint256 value,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) external;\\n}\\n\\n// File contracts/interfaces/IFlashLoan.sol\\n// License-Identifier: MIT\\n\\ninterface IFlashBorrower {\\n    /// @notice The flashloan callback. `amount` + `fee` needs to repayed to msg.sender before this call returns.\\n    /// @param sender The address of the invoker of this flashloan.\\n    /// @param token The address of the token that is loaned.\\n    /// @param amount of the `token` that is loaned.\\n    /// @param fee The fee that needs to be paid on top for this loan. Needs to be the same as `token`.\\n    /// @param data Additional data that was passed to the flashloan function.\\n    function onFlashLoan(\\n        address sender,\\n        IERC20 token,\\n        uint256 amount,\\n        uint256 fee,\\n        bytes calldata data\\n    ) external;\\n}\\n\\ninterface IBatchFlashBorrower {\\n    /// @notice The callback for batched flashloans. Every amount + fee needs to repayed to msg.sender before this call returns.\\n    /// @param sender The address of the invoker of this flashloan.\\n    /// @param tokens Array of addresses for ERC-20 tokens that is loaned.\\n    /// @param amounts A one-to-one map to `tokens` that is loaned.\\n    /// @param fees A one-to-one map to `tokens` that needs to be paid on top for each loan. Needs to be the same token.\\n    /// @param data Additional data that was passed to the flashloan function.\\n    function onBatchFlashLoan(\\n        address sender,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        uint256[] calldata fees,\\n        bytes calldata data\\n    ) external;\\n}\\n\\n// File contracts/interfaces/IWETH.sol\\n// License-Identifier: MIT\\n\\ninterface IWETH {\\n    function deposit() external payable;\\n\\n    function withdraw(uint256) external;\\n}\\n\\n// File contracts/interfaces/IStrategy.sol\\n// License-Identifier: MIT\\n\\ninterface IStrategy {\\n    /// @notice Send the assets to the Strategy and call skim to invest them.\\n    /// @param amount The amount of tokens to invest.\\n    function skim(uint256 amount) external;\\n\\n    /// @notice Harvest any profits made converted to the asset and pass them to the caller.\\n    /// @param balance The amount of tokens the caller thinks it has invested.\\n    /// @param sender The address of the initiator of this transaction. Can be used for reimbursements, etc.\\n    /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.\\n    function harvest(uint256 balance, address sender) external returns (int256 amountAdded);\\n\\n    /// @notice Withdraw assets. The returned amount can differ from the requested amount due to rounding.\\n    /// @dev The `actualAmount` should be very close to the amount.\\n    /// The difference should NOT be used to report a loss. That's what harvest is for.\\n    /// @param amount The requested amount the caller wants to withdraw.\\n    /// @return actualAmount The real amount that is withdrawn.\\n    function withdraw(uint256 amount) external returns (uint256 actualAmount);\\n\\n    /// @notice Withdraw all assets in the safest way possible. This shouldn't fail.\\n    /// @param balance The amount of tokens the caller thinks it has invested.\\n    /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.\\n    function exit(uint256 balance) external returns (int256 amountAdded);\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\nlibrary BoringERC20 {\\n    bytes4 private constant SIG_SYMBOL = 0x95d89b41; // symbol()\\n    bytes4 private constant SIG_NAME = 0x06fdde03; // name()\\n    bytes4 private constant SIG_DECIMALS = 0x313ce567; // decimals()\\n    bytes4 private constant SIG_TRANSFER = 0xa9059cbb; // transfer(address,uint256)\\n    bytes4 private constant SIG_TRANSFER_FROM = 0x23b872dd; // transferFrom(address,address,uint256)\\n\\n    /// @notice Provides a safe ERC20.transfer version for different ERC-20 implementations.\\n    /// Reverts on a failed transfer.\\n    /// @param token The address of the ERC-20 token.\\n    /// @param to Transfer tokens to.\\n    /// @param amount The token amount.\\n    function safeTransfer(\\n        IERC20 token,\\n        address to,\\n        uint256 amount\\n    ) internal {\\n        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER, to, amount));\\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: Transfer failed\\\");\\n    }\\n\\n    /// @notice Provides a safe ERC20.transferFrom version for different ERC-20 implementations.\\n    /// Reverts on a failed transfer.\\n    /// @param token The address of the ERC-20 token.\\n    /// @param from Transfer tokens from.\\n    /// @param to Transfer tokens to.\\n    /// @param amount The token amount.\\n    function safeTransferFrom(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 amount\\n    ) internal {\\n        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER_FROM, from, to, amount));\\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: TransferFrom failed\\\");\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringMath.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n/// @notice A library for performing overflow-/underflow-safe math,\\n/// updated with awesomeness from of DappHub (https://github.com/dapphub/ds-math).\\nlibrary BoringMath {\\n    function add(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require(b == 0 || (c = a * b) / b == a, \\\"BoringMath: Mul Overflow\\\");\\n    }\\n\\n    function to128(uint256 a) internal pure returns (uint128 c) {\\n        require(a <= uint128(-1), \\\"BoringMath: uint128 Overflow\\\");\\n        c = uint128(a);\\n    }\\n\\n    function to64(uint256 a) internal pure returns (uint64 c) {\\n        require(a <= uint64(-1), \\\"BoringMath: uint64 Overflow\\\");\\n        c = uint64(a);\\n    }\\n\\n    function to32(uint256 a) internal pure returns (uint32 c) {\\n        require(a <= uint32(-1), \\\"BoringMath: uint32 Overflow\\\");\\n        c = uint32(a);\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint128.\\nlibrary BoringMath128 {\\n    function add(uint128 a, uint128 b) internal pure returns (uint128 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint128 a, uint128 b) internal pure returns (uint128 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint64.\\nlibrary BoringMath64 {\\n    function add(uint64 a, uint64 b) internal pure returns (uint64 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint64 a, uint64 b) internal pure returns (uint64 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint32.\\nlibrary BoringMath32 {\\n    function add(uint32 a, uint32 b) internal pure returns (uint32 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint32 a, uint32 b) internal pure returns (uint32 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringRebase.sol@v1.2.0\\n// License-Identifier: MIT\\n\\nstruct Rebase {\\n    uint128 elastic;\\n    uint128 base;\\n}\\n\\n/// @notice A rebasing library using overflow-/underflow-safe math.\\nlibrary RebaseLibrary {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n\\n    /// @notice Calculates the base value in relationship to `elastic` and `total`.\\n    function toBase(\\n        Rebase memory total,\\n        uint256 elastic,\\n        bool roundUp\\n    ) internal pure returns (uint256 base) {\\n        if (total.elastic == 0) {\\n            base = elastic;\\n        } else {\\n            base = elastic.mul(total.base) / total.elastic;\\n            if (roundUp && base.mul(total.elastic) / total.base < elastic) {\\n                base = base.add(1);\\n            }\\n        }\\n    }\\n\\n    /// @notice Calculates the elastic value in relationship to `base` and `total`.\\n    function toElastic(\\n        Rebase memory total,\\n        uint256 base,\\n        bool roundUp\\n    ) internal pure returns (uint256 elastic) {\\n        if (total.base == 0) {\\n            elastic = base;\\n        } else {\\n            elastic = base.mul(total.elastic) / total.base;\\n            if (roundUp && elastic.mul(total.base) / total.elastic < base) {\\n                elastic = elastic.add(1);\\n            }\\n        }\\n    }\\n\\n    /// @notice Add `elastic` to `total` and doubles `total.base`.\\n    /// @return (Rebase) The new total.\\n    /// @return base in relationship to `elastic`.\\n    function add(\\n        Rebase memory total,\\n        uint256 elastic,\\n        bool roundUp\\n    ) internal pure returns (Rebase memory, uint256 base) {\\n        base = toBase(total, elastic, roundUp);\\n        total.elastic = total.elastic.add(elastic.to128());\\n        total.base = total.base.add(base.to128());\\n        return (total, base);\\n    }\\n\\n    /// @notice Sub `base` from `total` and update `total.elastic`.\\n    /// @return (Rebase) The new total.\\n    /// @return elastic in relationship to `base`.\\n    function sub(\\n        Rebase memory total,\\n        uint256 base,\\n        bool roundUp\\n    ) internal pure returns (Rebase memory, uint256 elastic) {\\n        elastic = toElastic(total, base, roundUp);\\n        total.elastic = total.elastic.sub(elastic.to128());\\n        total.base = total.base.sub(base.to128());\\n        return (total, elastic);\\n    }\\n\\n    /// @notice Add `elastic` and `base` to `total`.\\n    function add(\\n        Rebase memory total,\\n        uint256 elastic,\\n        uint256 base\\n    ) internal pure returns (Rebase memory) {\\n        total.elastic = total.elastic.add(elastic.to128());\\n        total.base = total.base.add(base.to128());\\n        return total;\\n    }\\n\\n    /// @notice Subtract `elastic` and `base` to `total`.\\n    function sub(\\n        Rebase memory total,\\n        uint256 elastic,\\n        uint256 base\\n    ) internal pure returns (Rebase memory) {\\n        total.elastic = total.elastic.sub(elastic.to128());\\n        total.base = total.base.sub(base.to128());\\n        return total;\\n    }\\n\\n    /// @notice Add `elastic` to `total` and update storage.\\n    /// @return newElastic Returns updated `elastic`.\\n    function addElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {\\n        newElastic = total.elastic = total.elastic.add(elastic.to128());\\n    }\\n\\n    /// @notice Subtract `elastic` from `total` and update storage.\\n    /// @return newElastic Returns updated `elastic`.\\n    function subElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {\\n        newElastic = total.elastic = total.elastic.sub(elastic.to128());\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringOwnable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n// Source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol + Claimable.sol\\n// Edited by BoringCrypto\\n\\ncontract BoringOwnableData {\\n    address public owner;\\n    address public pendingOwner;\\n}\\n\\ncontract BoringOwnable is BoringOwnableData {\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /// @notice `owner` defaults to msg.sender on construction.\\n    constructor() public {\\n        owner = msg.sender;\\n        emit OwnershipTransferred(address(0), msg.sender);\\n    }\\n\\n    /// @notice Transfers ownership to `newOwner`. Either directly or claimable by the new pending owner.\\n    /// Can only be invoked by the current `owner`.\\n    /// @param newOwner Address of the new owner.\\n    /// @param direct True if `newOwner` should be set immediately. False if `newOwner` needs to use `claimOwnership`.\\n    /// @param renounce Allows the `newOwner` to be `address(0)` if `direct` and `renounce` is True. Has no effect otherwise.\\n    function transferOwnership(\\n        address newOwner,\\n        bool direct,\\n        bool renounce\\n    ) public onlyOwner {\\n        if (direct) {\\n            // Checks\\n            require(newOwner != address(0) || renounce, \\\"Ownable: zero address\\\");\\n\\n            // Effects\\n            emit OwnershipTransferred(owner, newOwner);\\n            owner = newOwner;\\n            pendingOwner = address(0);\\n        } else {\\n            // Effects\\n            pendingOwner = newOwner;\\n        }\\n    }\\n\\n    /// @notice Needs to be called by `pendingOwner` to claim ownership.\\n    function claimOwnership() public {\\n        address _pendingOwner = pendingOwner;\\n\\n        // Checks\\n        require(msg.sender == _pendingOwner, \\\"Ownable: caller != pending owner\\\");\\n\\n        // Effects\\n        emit OwnershipTransferred(owner, _pendingOwner);\\n        owner = _pendingOwner;\\n        pendingOwner = address(0);\\n    }\\n\\n    /// @notice Only allows the `owner` to execute the function.\\n    modifier onlyOwner() {\\n        require(msg.sender == owner, \\\"Ownable: caller is not the owner\\\");\\n        _;\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/interfaces/IMasterContract.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ninterface IMasterContract {\\n    /// @notice Init function that gets called from `BoringFactory.deploy`.\\n    /// Also kown as the constructor for cloned contracts.\\n    /// Any ETH send to `BoringFactory.deploy` ends up here.\\n    /// @param data Can be abi encoded arguments or anything else.\\n    function init(bytes calldata data) external payable;\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringFactory.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ncontract BoringFactory {\\n    event LogDeploy(address indexed masterContract, bytes data, address indexed cloneAddress);\\n\\n    /// @notice Mapping from clone contracts to their masterContract.\\n    mapping(address => address) public masterContractOf;\\n\\n    /// @notice Deploys a given master Contract as a clone.\\n    /// Any ETH transferred with this call is forwarded to the new clone.\\n    /// Emits `LogDeploy`.\\n    /// @param masterContract The address of the contract to clone.\\n    /// @param data Additional abi encoded calldata that is passed to the new clone via `IMasterContract.init`.\\n    /// @param useCreate2 Creates the clone by using the CREATE2 opcode, in this case `data` will be used as salt.\\n    /// @return cloneAddress Address of the created clone contract.\\n    function deploy(\\n        address masterContract,\\n        bytes calldata data,\\n        bool useCreate2\\n    ) public payable returns (address cloneAddress) {\\n        require(masterContract != address(0), \\\"BoringFactory: No masterContract\\\");\\n        bytes20 targetBytes = bytes20(masterContract); // Takes the first 20 bytes of the masterContract's address\\n\\n        if (useCreate2) {\\n            // each masterContract has different code already. So clones are distinguished by their data only.\\n            bytes32 salt = keccak256(data);\\n\\n            // Creates clone, more info here: https://blog.openzeppelin.com/deep-dive-into-the-minimal-proxy-contract/\\n            assembly {\\n                let clone := mload(0x40)\\n                mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n                mstore(add(clone, 0x14), targetBytes)\\n                mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n                cloneAddress := create2(0, clone, 0x37, salt)\\n            }\\n        } else {\\n            assembly {\\n                let clone := mload(0x40)\\n                mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n                mstore(add(clone, 0x14), targetBytes)\\n                mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n                cloneAddress := create(0, clone, 0x37)\\n            }\\n        }\\n        masterContractOf[cloneAddress] = masterContract;\\n\\n        IMasterContract(cloneAddress).init{value: msg.value}(data);\\n\\n        emit LogDeploy(masterContract, data, cloneAddress);\\n    }\\n}\\n\\n// File contracts/MasterContractManager.sol\\n// License-Identifier: UNLICENSED\\n\\ncontract MasterContractManager is BoringOwnable, BoringFactory {\\n    event LogWhiteListMasterContract(address indexed masterContract, bool approved);\\n    event LogSetMasterContractApproval(address indexed masterContract, address indexed user, bool approved);\\n    event LogRegisterProtocol(address indexed protocol);\\n\\n    /// @notice masterContract to user to approval state\\n    mapping(address => mapping(address => bool)) public masterContractApproved;\\n    /// @notice masterContract to whitelisted state for approval without signed message\\n    mapping(address => bool) public whitelistedMasterContracts;\\n    /// @notice user nonces for masterContract approvals\\n    mapping(address => uint256) public nonces;\\n\\n    bytes32 private constant DOMAIN_SEPARATOR_SIGNATURE_HASH = keccak256(\\\"EIP712Domain(string name,uint256 chainId,address verifyingContract)\\\");\\n    // See https://eips.ethereum.org/EIPS/eip-191\\n    string private constant EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA = \\\"\\\\x19\\\\x01\\\";\\n    bytes32 private constant APPROVAL_SIGNATURE_HASH =\\n        keccak256(\\\"SetMasterContractApproval(string warning,address user,address masterContract,bool approved,uint256 nonce)\\\");\\n\\n    // solhint-disable-next-line var-name-mixedcase\\n    bytes32 private immutable _DOMAIN_SEPARATOR;\\n    // solhint-disable-next-line var-name-mixedcase\\n    uint256 private immutable DOMAIN_SEPARATOR_CHAIN_ID;\\n\\n    constructor() public {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        _DOMAIN_SEPARATOR = _calculateDomainSeparator(DOMAIN_SEPARATOR_CHAIN_ID = chainId);\\n    }\\n\\n    function _calculateDomainSeparator(uint256 chainId) private view returns (bytes32) {\\n        return keccak256(abi.encode(DOMAIN_SEPARATOR_SIGNATURE_HASH, keccak256(\\\"BentoBox V1\\\"), chainId, address(this)));\\n    }\\n\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() public view returns (bytes32) {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        return chainId == DOMAIN_SEPARATOR_CHAIN_ID ? _DOMAIN_SEPARATOR : _calculateDomainSeparator(chainId);\\n    }\\n\\n    /// @notice Other contracts need to register with this master contract so that users can approve them for the BentoBox.\\n    function registerProtocol() public {\\n        masterContractOf[msg.sender] = msg.sender;\\n        emit LogRegisterProtocol(msg.sender);\\n    }\\n\\n    /// @notice Enables or disables a contract for approval without signed message.\\n    function whitelistMasterContract(address masterContract, bool approved) public onlyOwner {\\n        // Checks\\n        require(masterContract != address(0), \\\"MasterCMgr: Cannot approve 0\\\");\\n\\n        // Effects\\n        whitelistedMasterContracts[masterContract] = approved;\\n        emit LogWhiteListMasterContract(masterContract, approved);\\n    }\\n\\n    /// @notice Approves or revokes a `masterContract` access to `user` funds.\\n    /// @param user The address of the user that approves or revokes access.\\n    /// @param masterContract The address who gains or loses access.\\n    /// @param approved If True approves access. If False revokes access.\\n    /// @param v Part of the signature. (See EIP-191)\\n    /// @param r Part of the signature. (See EIP-191)\\n    /// @param s Part of the signature. (See EIP-191)\\n    // F4 - Check behaviour for all function arguments when wrong or extreme\\n    // F4: Don't allow masterContract 0 to be approved. Unknown contracts will have a masterContract of 0.\\n    // F4: User can't be 0 for signed approvals because the recoveredAddress will be 0 if ecrecover fails\\n    function setMasterContractApproval(\\n        address user,\\n        address masterContract,\\n        bool approved,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) public {\\n        // Checks\\n        require(masterContract != address(0), \\\"MasterCMgr: masterC not set\\\"); // Important for security\\n\\n        // If no signature is provided, the fallback is executed\\n        if (r == 0 && s == 0 && v == 0) {\\n            require(user == msg.sender, \\\"MasterCMgr: user not sender\\\");\\n            require(masterContractOf[user] == address(0), \\\"MasterCMgr: user is clone\\\");\\n            require(whitelistedMasterContracts[masterContract], \\\"MasterCMgr: not whitelisted\\\");\\n        } else {\\n            // Important for security - any address without masterContract has address(0) as masterContract\\n            // So approving address(0) would approve every address, leading to full loss of funds\\n            // Also, ecrecover returns address(0) on failure. So we check this:\\n            require(user != address(0), \\\"MasterCMgr: User cannot be 0\\\");\\n\\n            // C10 - Protect signatures against replay, use nonce and chainId (SWC-121)\\n            // C10: nonce + chainId are used to prevent replays\\n            // C11 - All signatures strictly EIP-712 (SWC-117 SWC-122)\\n            // C11: signature is EIP-712 compliant\\n            // C12 - abi.encodePacked can't contain variable length user input (SWC-133)\\n            // C12: abi.encodePacked has fixed length parameters\\n            bytes32 digest =\\n                keccak256(\\n                    abi.encodePacked(\\n                        EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA,\\n                        DOMAIN_SEPARATOR(),\\n                        keccak256(\\n                            abi.encode(\\n                                APPROVAL_SIGNATURE_HASH,\\n                                approved\\n                                    ? keccak256(\\\"Give FULL access to funds in (and approved to) BentoBox?\\\")\\n                                    : keccak256(\\\"Revoke access to BentoBox?\\\"),\\n                                user,\\n                                masterContract,\\n                                approved,\\n                                nonces[user]++\\n                            )\\n                        )\\n                    )\\n                );\\n            address recoveredAddress = ecrecover(digest, v, r, s);\\n            require(recoveredAddress == user, \\\"MasterCMgr: Invalid Signature\\\");\\n        }\\n\\n        // Effects\\n        masterContractApproved[masterContract][user] = approved;\\n        emit LogSetMasterContractApproval(masterContract, user, approved);\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringBatchable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ncontract BaseBoringBatchable {\\n    /// @dev Helper function to extract a useful revert message from a failed call.\\n    /// If the returned data is malformed or not correctly abi encoded then this call can fail itself.\\n    function _getRevertMsg(bytes memory _returnData) internal pure returns (string memory) {\\n        // If the _res length is less than 68, then the transaction failed silently (without a revert message)\\n        if (_returnData.length < 68) return \\\"Transaction reverted silently\\\";\\n\\n        assembly {\\n            // Slice the sighash.\\n            _returnData := add(_returnData, 0x04)\\n        }\\n        return abi.decode(_returnData, (string)); // All that remains is the revert string\\n    }\\n\\n    /// @notice Allows batched call to self (this contract).\\n    /// @param calls An array of inputs for each call.\\n    /// @param revertOnFail If True then reverts after a failed call and stops doing further calls.\\n    /// @return successes An array indicating the success of a call, mapped one-to-one to `calls`.\\n    /// @return results An array with the returned data of each function call, mapped one-to-one to `calls`.\\n    // F1: External is ok here because this is the batch function, adding it to a batch makes no sense\\n    // F2: Calls in the batch may be payable, delegatecall operates in the same context, so each call in the batch has access to msg.value\\n    // C3: The length of the loop is fully under user control, so can't be exploited\\n    // C7: Delegatecall is only used on the same contract, so it's safe\\n    function batch(bytes[] calldata calls, bool revertOnFail) external payable returns (bool[] memory successes, bytes[] memory results) {\\n        successes = new bool[](calls.length);\\n        results = new bytes[](calls.length);\\n        for (uint256 i = 0; i < calls.length; i++) {\\n            (bool success, bytes memory result) = address(this).delegatecall(calls[i]);\\n            require(success || !revertOnFail, _getRevertMsg(result));\\n            successes[i] = success;\\n            results[i] = result;\\n        }\\n    }\\n}\\n\\ncontract BoringBatchable is BaseBoringBatchable {\\n    /// @notice Call wrapper that performs `ERC20.permit` on `token`.\\n    /// Lookup `IERC20.permit`.\\n    // F6: Parameters can be used front-run the permit and the user's permit will fail (due to nonce or other revert)\\n    //     if part of a batch this could be used to grief once as the second call would not need the permit\\n    function permitToken(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) public {\\n        token.permit(from, to, amount, deadline, v, r, s);\\n    }\\n}\\n\\n// File contracts/BentoBox.sol\\n// License-Identifier: UNLICENSED\\n\\n/// @title BentoBox\\n/// @author BoringCrypto, Keno\\n/// @notice The BentoBox is a vault for tokens. The stored tokens can be flash loaned and used in strategies.\\n/// Yield from this will go to the token depositors.\\n/// Rebasing tokens ARE NOT supported and WILL cause loss of funds.\\n/// Any funds transfered directly onto the BentoBox will be lost, use the deposit function instead.\\ncontract BentoBoxV1 is MasterContractManager, BoringBatchable {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n    using BoringERC20 for IERC20;\\n    using RebaseLibrary for Rebase;\\n\\n    // ************** //\\n    // *** EVENTS *** //\\n    // ************** //\\n\\n    event LogDeposit(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogWithdraw(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogTransfer(IERC20 indexed token, address indexed from, address indexed to, uint256 share);\\n\\n    event LogFlashLoan(address indexed borrower, IERC20 indexed token, uint256 amount, uint256 feeAmount, address indexed receiver);\\n\\n    event LogStrategyTargetPercentage(IERC20 indexed token, uint256 targetPercentage);\\n    event LogStrategyQueued(IERC20 indexed token, IStrategy indexed strategy);\\n    event LogStrategySet(IERC20 indexed token, IStrategy indexed strategy);\\n    event LogStrategyInvest(IERC20 indexed token, uint256 amount);\\n    event LogStrategyDivest(IERC20 indexed token, uint256 amount);\\n    event LogStrategyProfit(IERC20 indexed token, uint256 amount);\\n    event LogStrategyLoss(IERC20 indexed token, uint256 amount);\\n\\n    // *************** //\\n    // *** STRUCTS *** //\\n    // *************** //\\n\\n    struct StrategyData {\\n        uint64 strategyStartDate;\\n        uint64 targetPercentage;\\n        uint128 balance; // the balance of the strategy that BentoBox thinks is in there\\n    }\\n\\n    // ******************************** //\\n    // *** CONSTANTS AND IMMUTABLES *** //\\n    // ******************************** //\\n\\n    // V2 - Can they be private?\\n    // V2: Private to save gas, to verify it's correct, check the constructor arguments\\n    IERC20 private immutable wethToken;\\n\\n    IERC20 private constant USE_ETHEREUM = IERC20(0);\\n    uint256 private constant FLASH_LOAN_FEE = 50; // 0.05%\\n    uint256 private constant FLASH_LOAN_FEE_PRECISION = 1e5;\\n    uint256 private constant STRATEGY_DELAY = 2 weeks;\\n    uint256 private constant MAX_TARGET_PERCENTAGE = 95; // 95%\\n    uint256 private constant MINIMUM_SHARE_BALANCE = 1000; // To prevent the ratio going off\\n\\n    // ***************** //\\n    // *** VARIABLES *** //\\n    // ***************** //\\n\\n    // Balance per token per address/contract in shares\\n    mapping(IERC20 => mapping(address => uint256)) public balanceOf;\\n\\n    // Rebase from amount to share\\n    mapping(IERC20 => Rebase) public totals;\\n\\n    mapping(IERC20 => IStrategy) public strategy;\\n    mapping(IERC20 => IStrategy) public pendingStrategy;\\n    mapping(IERC20 => StrategyData) public strategyData;\\n\\n    // ******************* //\\n    // *** CONSTRUCTOR *** //\\n    // ******************* //\\n\\n    constructor(IERC20 wethToken_) public {\\n        wethToken = wethToken_;\\n    }\\n\\n    // ***************** //\\n    // *** MODIFIERS *** //\\n    // ***************** //\\n\\n    /// Modifier to check if the msg.sender is allowed to use funds belonging to the 'from' address.\\n    /// If 'from' is msg.sender, it's allowed.\\n    /// If 'from' is the BentoBox itself, it's allowed. Any ETH, token balances (above the known balances) or BentoBox balances\\n    /// can be taken by anyone.\\n    /// This is to enable skimming, not just for deposits, but also for withdrawals or transfers, enabling better composability.\\n    /// If 'from' is a clone of a masterContract AND the 'from' address has approved that masterContract, it's allowed.\\n    modifier allowed(address from) {\\n        if (from != msg.sender && from != address(this)) {\\n            // From is sender or you are skimming\\n            address masterContract = masterContractOf[msg.sender];\\n            require(masterContract != address(0), \\\"BentoBox: no masterContract\\\");\\n            require(masterContractApproved[masterContract][from], \\\"BentoBox: Transfer not approved\\\");\\n        }\\n        _;\\n    }\\n\\n    // ************************** //\\n    // *** INTERNAL FUNCTIONS *** //\\n    // ************************** //\\n\\n    /// @dev Returns the total balance of `token` this contracts holds,\\n    /// plus the total amount this contract thinks the strategy holds.\\n    function _tokenBalanceOf(IERC20 token) internal view returns (uint256 amount) {\\n        amount = token.balanceOf(address(this)).add(strategyData[token].balance);\\n    }\\n\\n    // ************************ //\\n    // *** PUBLIC FUNCTIONS *** //\\n    // ************************ //\\n\\n    /// @dev Helper function to represent an `amount` of `token` in shares.\\n    /// @param token The ERC-20 token.\\n    /// @param amount The `token` amount.\\n    /// @param roundUp If the result `share` should be rounded up.\\n    /// @return share The token amount represented in shares.\\n    function toShare(\\n        IERC20 token,\\n        uint256 amount,\\n        bool roundUp\\n    ) external view returns (uint256 share) {\\n        share = totals[token].toBase(amount, roundUp);\\n    }\\n\\n    /// @dev Helper function represent shares back into the `token` amount.\\n    /// @param token The ERC-20 token.\\n    /// @param share The amount of shares.\\n    /// @param roundUp If the result should be rounded up.\\n    /// @return amount The share amount back into native representation.\\n    function toAmount(\\n        IERC20 token,\\n        uint256 share,\\n        bool roundUp\\n    ) external view returns (uint256 amount) {\\n        amount = totals[token].toElastic(share, roundUp);\\n    }\\n\\n    /// @notice Deposit an amount of `token` represented in either `amount` or `share`.\\n    /// @param token_ The ERC-20 token to deposit.\\n    /// @param from which account to pull the tokens.\\n    /// @param to which account to push the tokens.\\n    /// @param amount Token amount in native representation to deposit.\\n    /// @param share Token amount represented in shares to deposit. Takes precedence over `amount`.\\n    /// @return amountOut The amount deposited.\\n    /// @return shareOut The deposited amount repesented in shares.\\n    function deposit(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) public payable allowed(from) returns (uint256 amountOut, uint256 shareOut) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;\\n        Rebase memory total = totals[token];\\n\\n        // If a new token gets added, the tokenSupply call checks that this is a deployed contract. Needed for security.\\n        require(total.elastic != 0 || token.totalSupply() > 0, \\\"BentoBox: No tokens\\\");\\n        if (share == 0) {\\n            // value of the share may be lower than the amount due to rounding, that's ok\\n            share = total.toBase(amount, false);\\n            // Any deposit should lead to at least the minimum share balance, otherwise it's ignored (no amount taken)\\n            if (total.base.add(share.to128()) < MINIMUM_SHARE_BALANCE) {\\n                return (0, 0);\\n            }\\n        } else {\\n            // amount may be lower than the value of share due to rounding, in that case, add 1 to amount (Always round up)\\n            amount = total.toElastic(share, true);\\n        }\\n\\n        // In case of skimming, check that only the skimmable amount is taken.\\n        // For ETH, the full balance is available, so no need to check.\\n        // During flashloans the _tokenBalanceOf is lower than 'reality', so skimming deposits will mostly fail during a flashloan.\\n        require(\\n            from != address(this) || token_ == USE_ETHEREUM || amount <= _tokenBalanceOf(token).sub(total.elastic),\\n            \\\"BentoBox: Skim too much\\\"\\n        );\\n\\n        balanceOf[token][to] = balanceOf[token][to].add(share);\\n        total.base = total.base.add(share.to128());\\n        total.elastic = total.elastic.add(amount.to128());\\n        totals[token] = total;\\n\\n        // Interactions\\n        // During the first deposit, we check that this token is 'real'\\n        if (token_ == USE_ETHEREUM) {\\n            // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)\\n            // X2: If the WETH implementation is faulty or malicious, it will block adding ETH (but we know the WETH implementation)\\n            IWETH(address(wethToken)).deposit{value: amount}();\\n        } else if (from != address(this)) {\\n            // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)\\n            // X2: If the token implementation is faulty or malicious, it may block adding tokens. Good.\\n            token.safeTransferFrom(from, address(this), amount);\\n        }\\n        emit LogDeposit(token, from, to, amount, share);\\n        amountOut = amount;\\n        shareOut = share;\\n    }\\n\\n    /// @notice Withdraws an amount of `token` from a user account.\\n    /// @param token_ The ERC-20 token to withdraw.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param amount of tokens. Either one of `amount` or `share` needs to be supplied.\\n    /// @param share Like above, but `share` takes precedence over `amount`.\\n    function withdraw(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) public allowed(from) returns (uint256 amountOut, uint256 shareOut) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;\\n        Rebase memory total = totals[token];\\n        if (share == 0) {\\n            // value of the share paid could be lower than the amount paid due to rounding, in that case, add a share (Always round up)\\n            share = total.toBase(amount, true);\\n        } else {\\n            // amount may be lower than the value of share due to rounding, that's ok\\n            amount = total.toElastic(share, false);\\n        }\\n\\n        balanceOf[token][from] = balanceOf[token][from].sub(share);\\n        total.elastic = total.elastic.sub(amount.to128());\\n        total.base = total.base.sub(share.to128());\\n        // There have to be at least 1000 shares left to prevent reseting the share/amount ratio (unless it's fully emptied)\\n        require(total.base >= MINIMUM_SHARE_BALANCE || total.base == 0, \\\"BentoBox: cannot empty\\\");\\n        totals[token] = total;\\n\\n        // Interactions\\n        if (token_ == USE_ETHEREUM) {\\n            // X2, X3: A revert or big gas usage in the WETH contract could block withdrawals, but WETH9 is fine.\\n            IWETH(address(wethToken)).withdraw(amount);\\n            // X2, X3: A revert or big gas usage could block, however, the to address is under control of the caller.\\n            (bool success, ) = to.call{value: amount}(\\\"\\\");\\n            require(success, \\\"BentoBox: ETH transfer failed\\\");\\n        } else {\\n            // X2, X3: A malicious token could block withdrawal of just THAT token.\\n            //         masterContracts may want to take care not to rely on withdraw always succeeding.\\n            token.safeTransfer(to, amount);\\n        }\\n        emit LogWithdraw(token, from, to, amount, share);\\n        amountOut = amount;\\n        shareOut = share;\\n    }\\n\\n    /// @notice Transfer shares from a user account to another one.\\n    /// @param token The ERC-20 token to transfer.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param share The amount of `token` in shares.\\n    // Clones of master contracts can transfer from any account that has approved them\\n    // F3 - Can it be combined with another similar function?\\n    // F3: This isn't combined with transferMultiple for gas optimization\\n    function transfer(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 share\\n    ) public allowed(from) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        balanceOf[token][from] = balanceOf[token][from].sub(share);\\n        balanceOf[token][to] = balanceOf[token][to].add(share);\\n\\n        emit LogTransfer(token, from, to, share);\\n    }\\n\\n    /// @notice Transfer shares from a user account to multiple other ones.\\n    /// @param token The ERC-20 token to transfer.\\n    /// @param from which user to pull the tokens.\\n    /// @param tos The receivers of the tokens.\\n    /// @param shares The amount of `token` in shares for each receiver in `tos`.\\n    // F3 - Can it be combined with another similar function?\\n    // F3: This isn't combined with transfer for gas optimization\\n    function transferMultiple(\\n        IERC20 token,\\n        address from,\\n        address[] calldata tos,\\n        uint256[] calldata shares\\n    ) public allowed(from) {\\n        // Checks\\n        require(tos[0] != address(0), \\\"BentoBox: to[0] not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        uint256 totalAmount;\\n        uint256 len = tos.length;\\n        for (uint256 i = 0; i < len; i++) {\\n            address to = tos[i];\\n            balanceOf[token][to] = balanceOf[token][to].add(shares[i]);\\n            totalAmount = totalAmount.add(shares[i]);\\n            emit LogTransfer(token, from, to, shares[i]);\\n        }\\n        balanceOf[token][from] = balanceOf[token][from].sub(totalAmount);\\n    }\\n\\n    /// @notice Flashloan ability.\\n    /// @param borrower The address of the contract that implements and conforms to `IFlashBorrower` and handles the flashloan.\\n    /// @param receiver Address of the token receiver.\\n    /// @param token The address of the token to receive.\\n    /// @param amount of the tokens to receive.\\n    /// @param data The calldata to pass to the `borrower` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Not possible to follow this here, reentrancy has been reviewed\\n    // F6 - Check for front-running possibilities, such as the approve function (SWC-114)\\n    // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.\\n    function flashLoan(\\n        IFlashBorrower borrower,\\n        address receiver,\\n        IERC20 token,\\n        uint256 amount,\\n        bytes calldata data\\n    ) public {\\n        uint256 fee = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;\\n        token.safeTransfer(receiver, amount);\\n\\n        borrower.onFlashLoan(msg.sender, token, amount, fee, data);\\n\\n        require(_tokenBalanceOf(token) >= totals[token].addElastic(fee.to128()), \\\"BentoBox: Wrong amount\\\");\\n        emit LogFlashLoan(address(borrower), token, amount, fee, receiver);\\n    }\\n\\n    /// @notice Support for batched flashloans. Useful to request multiple different `tokens` in a single transaction.\\n    /// @param borrower The address of the contract that implements and conforms to `IBatchFlashBorrower` and handles the flashloan.\\n    /// @param receivers An array of the token receivers. A one-to-one mapping with `tokens` and `amounts`.\\n    /// @param tokens The addresses of the tokens.\\n    /// @param amounts of the tokens for each receiver.\\n    /// @param data The calldata to pass to the `borrower` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Not possible to follow this here, reentrancy has been reviewed\\n    // F6 - Check for front-running possibilities, such as the approve function (SWC-114)\\n    // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.\\n    function batchFlashLoan(\\n        IBatchFlashBorrower borrower,\\n        address[] calldata receivers,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        bytes calldata data\\n    ) public {\\n        uint256[] memory fees = new uint256[](tokens.length);\\n\\n        uint256 len = tokens.length;\\n        for (uint256 i = 0; i < len; i++) {\\n            uint256 amount = amounts[i];\\n            fees[i] = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;\\n\\n            tokens[i].safeTransfer(receivers[i], amounts[i]);\\n        }\\n\\n        borrower.onBatchFlashLoan(msg.sender, tokens, amounts, fees, data);\\n\\n        for (uint256 i = 0; i < len; i++) {\\n            IERC20 token = tokens[i];\\n            require(_tokenBalanceOf(token) >= totals[token].addElastic(fees[i].to128()), \\\"BentoBox: Wrong amount\\\");\\n            emit LogFlashLoan(address(borrower), token, amounts[i], fees[i], receivers[i]);\\n        }\\n    }\\n\\n    /// @notice Sets the target percentage of the strategy for `token`.\\n    /// @dev Only the owner of this contract is allowed to change this.\\n    /// @param token The address of the token that maps to a strategy to change.\\n    /// @param targetPercentage_ The new target in percent. Must be lesser or equal to `MAX_TARGET_PERCENTAGE`.\\n    function setStrategyTargetPercentage(IERC20 token, uint64 targetPercentage_) public onlyOwner {\\n        // Checks\\n        require(targetPercentage_ <= MAX_TARGET_PERCENTAGE, \\\"StrategyManager: Target too high\\\");\\n\\n        // Effects\\n        strategyData[token].targetPercentage = targetPercentage_;\\n        emit LogStrategyTargetPercentage(token, targetPercentage_);\\n    }\\n\\n    /// @notice Sets the contract address of a new strategy that conforms to `IStrategy` for `token`.\\n    /// Must be called twice with the same arguments.\\n    /// A new strategy becomes pending first and can be activated once `STRATEGY_DELAY` is over.\\n    /// @dev Only the owner of this contract is allowed to change this.\\n    /// @param token The address of the token that maps to a strategy to change.\\n    /// @param newStrategy The address of the contract that conforms to `IStrategy`.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Total amount is updated AFTER interaction. But strategy is under our control.\\n    // C4 - Use block.timestamp only for long intervals (SWC-116)\\n    // C4: block.timestamp is used for a period of 2 weeks, which is long enough\\n    function setStrategy(IERC20 token, IStrategy newStrategy) public onlyOwner {\\n        StrategyData memory data = strategyData[token];\\n        IStrategy pending = pendingStrategy[token];\\n        if (data.strategyStartDate == 0 || pending != newStrategy) {\\n            pendingStrategy[token] = newStrategy;\\n            // C1 - All math done through BoringMath (SWC-101)\\n            // C1: Our sun will swallow the earth well before this overflows\\n            data.strategyStartDate = (block.timestamp + STRATEGY_DELAY).to64();\\n            emit LogStrategyQueued(token, newStrategy);\\n        } else {\\n            require(data.strategyStartDate != 0 && block.timestamp >= data.strategyStartDate, \\\"StrategyManager: Too early\\\");\\n            if (address(strategy[token]) != address(0)) {\\n                int256 balanceChange = strategy[token].exit(data.balance);\\n                // Effects\\n                if (balanceChange > 0) {\\n                    uint256 add = uint256(balanceChange);\\n                    totals[token].addElastic(add);\\n                    emit LogStrategyProfit(token, add);\\n                } else if (balanceChange < 0) {\\n                    uint256 sub = uint256(-balanceChange);\\n                    totals[token].subElastic(sub);\\n                    emit LogStrategyLoss(token, sub);\\n                }\\n\\n                emit LogStrategyDivest(token, data.balance);\\n            }\\n            strategy[token] = pending;\\n            data.strategyStartDate = 0;\\n            data.balance = 0;\\n            pendingStrategy[token] = IStrategy(0);\\n            emit LogStrategySet(token, newStrategy);\\n        }\\n        strategyData[token] = data;\\n    }\\n\\n    /// @notice The actual process of yield farming. Executes the strategy of `token`.\\n    /// Optionally does housekeeping if `balance` is true.\\n    /// `maxChangeAmount` is relevant for skimming or withdrawing if `balance` is true.\\n    /// @param token The address of the token for which a strategy is deployed.\\n    /// @param balance True if housekeeping should be done.\\n    /// @param maxChangeAmount The maximum amount for either pulling or pushing from/to the `IStrategy` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Total amount is updated AFTER interaction. But strategy is under our control.\\n    // F5: Not followed to prevent reentrancy issues with flashloans and BentoBox skims?\\n    function harvest(\\n        IERC20 token,\\n        bool balance,\\n        uint256 maxChangeAmount\\n    ) public {\\n        StrategyData memory data = strategyData[token];\\n        IStrategy _strategy = strategy[token];\\n        int256 balanceChange = _strategy.harvest(data.balance, msg.sender);\\n        if (balanceChange == 0 && !balance) {\\n            return;\\n        }\\n\\n        uint256 totalElastic = totals[token].elastic;\\n\\n        if (balanceChange > 0) {\\n            uint256 add = uint256(balanceChange);\\n            totalElastic = totalElastic.add(add);\\n            totals[token].elastic = totalElastic.to128();\\n            emit LogStrategyProfit(token, add);\\n        } else if (balanceChange < 0) {\\n            // C1 - All math done through BoringMath (SWC-101)\\n            // C1: balanceChange could overflow if it's max negative int128.\\n            // But tokens with balances that large are not supported by the BentoBox.\\n            uint256 sub = uint256(-balanceChange);\\n            totalElastic = totalElastic.sub(sub);\\n            totals[token].elastic = totalElastic.to128();\\n            data.balance = data.balance.sub(sub.to128());\\n            emit LogStrategyLoss(token, sub);\\n        }\\n\\n        if (balance) {\\n            uint256 targetBalance = totalElastic.mul(data.targetPercentage) / 100;\\n            // if data.balance == targetBalance there is nothing to update\\n            if (data.balance < targetBalance) {\\n                uint256 amountOut = targetBalance.sub(data.balance);\\n                if (maxChangeAmount != 0 && amountOut > maxChangeAmount) {\\n                    amountOut = maxChangeAmount;\\n                }\\n                token.safeTransfer(address(_strategy), amountOut);\\n                data.balance = data.balance.add(amountOut.to128());\\n                _strategy.skim(amountOut);\\n                emit LogStrategyInvest(token, amountOut);\\n            } else if (data.balance > targetBalance) {\\n                uint256 amountIn = data.balance.sub(targetBalance.to128());\\n                if (maxChangeAmount != 0 && amountIn > maxChangeAmount) {\\n                    amountIn = maxChangeAmount;\\n                }\\n\\n                uint256 actualAmountIn = _strategy.withdraw(amountIn);\\n\\n                data.balance = data.balance.sub(actualAmountIn.to128());\\n                emit LogStrategyDivest(token, actualAmountIn);\\n            }\\n        }\\n\\n        strategyData[token] = data;\\n    }\\n\\n    // Contract should be able to receive ETH deposits to support deposit & skim\\n    // solhint-disable-next-line no-empty-blocks\\n    receive() external payable {}\\n}\\n\",\"keccak256\":\"0xf5251397b9aaa5c66ddc18b0cb96350ffac09f5776a1255fedc0072641f916fe\",\"license\":\"UNLICENSED\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {
              "onFlashLoan(address,address,uint256,uint256,bytes)": {
                "notice": "The flashloan callback. `amount` + `fee` needs to repayed to msg.sender before this call returns."
              }
            },
            "version": 1
          }
        },
        "IMasterContract": {
          "abi": [
            {
              "inputs": [
                {
                  "internalType": "bytes",
                  "name": "data",
                  "type": "bytes"
                }
              ],
              "name": "init",
              "outputs": [],
              "stateMutability": "payable",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {
              "init(bytes)": {
                "params": {
                  "data": "Can be abi encoded arguments or anything else."
                }
              }
            },
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "gasEstimates": null,
            "methodIdentifiers": {
              "init(bytes)": "4ddf47d4"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"init\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"init(bytes)\":{\"params\":{\"data\":\"Can be abi encoded arguments or anything else.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"init(bytes)\":{\"notice\":\"Init function that gets called from `BoringFactory.deploy`. Also kown as the constructor for cloned contracts. Any ETH send to `BoringFactory.deploy` ends up here.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/bentobox/BentoBoxV1.sol\":\"IMasterContract\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/bentobox/BentoBoxV1.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\n// The BentoBox\\n\\n//  \\u2584\\u2584\\u2584\\u2584\\u00b7 \\u2584\\u2584\\u2584 . \\u2590 \\u2584 \\u2584\\u2584\\u2584\\u2584\\u2584      \\u2584\\u2584\\u2584\\u2584\\u00b7       \\u2590\\u2584\\u2022 \\u2584\\n//  \\u2590\\u2588 \\u2580\\u2588\\u25aa\\u2580\\u2584.\\u2580\\u00b7\\u2588\\u258c\\u2590\\u2588\\u2022\\u2588\\u2588  \\u25aa     \\u2590\\u2588 \\u2580\\u2588\\u25aa\\u25aa      \\u2588\\u258c\\u2588\\u258c\\u25aa\\n//  \\u2590\\u2588\\u2580\\u2580\\u2588\\u2584\\u2590\\u2580\\u2580\\u25aa\\u2584\\u2590\\u2588\\u2590\\u2590\\u258c \\u2590\\u2588.\\u25aa \\u2584\\u2588\\u2580\\u2584 \\u2590\\u2588\\u2580\\u2580\\u2588\\u2584 \\u2584\\u2588\\u2580\\u2584  \\u00b7\\u2588\\u2588\\u00b7\\n//  \\u2588\\u2588\\u2584\\u25aa\\u2590\\u2588\\u2590\\u2588\\u2584\\u2584\\u258c\\u2588\\u2588\\u2590\\u2588\\u258c \\u2590\\u2588\\u258c\\u00b7\\u2590\\u2588\\u258c.\\u2590\\u258c\\u2588\\u2588\\u2584\\u25aa\\u2590\\u2588\\u2590\\u2588\\u258c.\\u2590\\u258c\\u25aa\\u2590\\u2588\\u00b7\\u2588\\u258c\\n//  \\u00b7\\u2580\\u2580\\u2580\\u2580  \\u2580\\u2580\\u2580 \\u2580\\u2580 \\u2588\\u25aa \\u2580\\u2580\\u2580  \\u2580\\u2588\\u2584\\u2580\\u25aa\\u00b7\\u2580\\u2580\\u2580\\u2580  \\u2580\\u2588\\u2584\\u2580\\u25aa\\u2022\\u2580\\u2580 \\u2580\\u2580\\n\\n// This contract stores funds, handles their transfers, supports flash loans and strategies.\\n\\n// Copyright (c) 2021 BoringCrypto - All rights reserved\\n// Twitter: @Boring_Crypto\\n\\n// Special thanks to Keno for all his hard work and support\\n\\n// Version 22-Mar-2021\\n\\npragma solidity 0.6.12;\\npragma experimental ABIEncoderV2;\\n\\n// solhint-disable avoid-low-level-calls\\n// solhint-disable not-rely-on-time\\n// solhint-disable no-inline-assembly\\n\\n// File @boringcrypto/boring-solidity/contracts/interfaces/IERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ninterface IERC20 {\\n    function totalSupply() external view returns (uint256);\\n\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /// @notice EIP 2612\\n    function permit(\\n        address owner,\\n        address spender,\\n        uint256 value,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) external;\\n}\\n\\n// File contracts/interfaces/IFlashLoan.sol\\n// License-Identifier: MIT\\n\\ninterface IFlashBorrower {\\n    /// @notice The flashloan callback. `amount` + `fee` needs to repayed to msg.sender before this call returns.\\n    /// @param sender The address of the invoker of this flashloan.\\n    /// @param token The address of the token that is loaned.\\n    /// @param amount of the `token` that is loaned.\\n    /// @param fee The fee that needs to be paid on top for this loan. Needs to be the same as `token`.\\n    /// @param data Additional data that was passed to the flashloan function.\\n    function onFlashLoan(\\n        address sender,\\n        IERC20 token,\\n        uint256 amount,\\n        uint256 fee,\\n        bytes calldata data\\n    ) external;\\n}\\n\\ninterface IBatchFlashBorrower {\\n    /// @notice The callback for batched flashloans. Every amount + fee needs to repayed to msg.sender before this call returns.\\n    /// @param sender The address of the invoker of this flashloan.\\n    /// @param tokens Array of addresses for ERC-20 tokens that is loaned.\\n    /// @param amounts A one-to-one map to `tokens` that is loaned.\\n    /// @param fees A one-to-one map to `tokens` that needs to be paid on top for each loan. Needs to be the same token.\\n    /// @param data Additional data that was passed to the flashloan function.\\n    function onBatchFlashLoan(\\n        address sender,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        uint256[] calldata fees,\\n        bytes calldata data\\n    ) external;\\n}\\n\\n// File contracts/interfaces/IWETH.sol\\n// License-Identifier: MIT\\n\\ninterface IWETH {\\n    function deposit() external payable;\\n\\n    function withdraw(uint256) external;\\n}\\n\\n// File contracts/interfaces/IStrategy.sol\\n// License-Identifier: MIT\\n\\ninterface IStrategy {\\n    /// @notice Send the assets to the Strategy and call skim to invest them.\\n    /// @param amount The amount of tokens to invest.\\n    function skim(uint256 amount) external;\\n\\n    /// @notice Harvest any profits made converted to the asset and pass them to the caller.\\n    /// @param balance The amount of tokens the caller thinks it has invested.\\n    /// @param sender The address of the initiator of this transaction. Can be used for reimbursements, etc.\\n    /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.\\n    function harvest(uint256 balance, address sender) external returns (int256 amountAdded);\\n\\n    /// @notice Withdraw assets. The returned amount can differ from the requested amount due to rounding.\\n    /// @dev The `actualAmount` should be very close to the amount.\\n    /// The difference should NOT be used to report a loss. That's what harvest is for.\\n    /// @param amount The requested amount the caller wants to withdraw.\\n    /// @return actualAmount The real amount that is withdrawn.\\n    function withdraw(uint256 amount) external returns (uint256 actualAmount);\\n\\n    /// @notice Withdraw all assets in the safest way possible. This shouldn't fail.\\n    /// @param balance The amount of tokens the caller thinks it has invested.\\n    /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.\\n    function exit(uint256 balance) external returns (int256 amountAdded);\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\nlibrary BoringERC20 {\\n    bytes4 private constant SIG_SYMBOL = 0x95d89b41; // symbol()\\n    bytes4 private constant SIG_NAME = 0x06fdde03; // name()\\n    bytes4 private constant SIG_DECIMALS = 0x313ce567; // decimals()\\n    bytes4 private constant SIG_TRANSFER = 0xa9059cbb; // transfer(address,uint256)\\n    bytes4 private constant SIG_TRANSFER_FROM = 0x23b872dd; // transferFrom(address,address,uint256)\\n\\n    /// @notice Provides a safe ERC20.transfer version for different ERC-20 implementations.\\n    /// Reverts on a failed transfer.\\n    /// @param token The address of the ERC-20 token.\\n    /// @param to Transfer tokens to.\\n    /// @param amount The token amount.\\n    function safeTransfer(\\n        IERC20 token,\\n        address to,\\n        uint256 amount\\n    ) internal {\\n        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER, to, amount));\\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: Transfer failed\\\");\\n    }\\n\\n    /// @notice Provides a safe ERC20.transferFrom version for different ERC-20 implementations.\\n    /// Reverts on a failed transfer.\\n    /// @param token The address of the ERC-20 token.\\n    /// @param from Transfer tokens from.\\n    /// @param to Transfer tokens to.\\n    /// @param amount The token amount.\\n    function safeTransferFrom(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 amount\\n    ) internal {\\n        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER_FROM, from, to, amount));\\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: TransferFrom failed\\\");\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringMath.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n/// @notice A library for performing overflow-/underflow-safe math,\\n/// updated with awesomeness from of DappHub (https://github.com/dapphub/ds-math).\\nlibrary BoringMath {\\n    function add(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require(b == 0 || (c = a * b) / b == a, \\\"BoringMath: Mul Overflow\\\");\\n    }\\n\\n    function to128(uint256 a) internal pure returns (uint128 c) {\\n        require(a <= uint128(-1), \\\"BoringMath: uint128 Overflow\\\");\\n        c = uint128(a);\\n    }\\n\\n    function to64(uint256 a) internal pure returns (uint64 c) {\\n        require(a <= uint64(-1), \\\"BoringMath: uint64 Overflow\\\");\\n        c = uint64(a);\\n    }\\n\\n    function to32(uint256 a) internal pure returns (uint32 c) {\\n        require(a <= uint32(-1), \\\"BoringMath: uint32 Overflow\\\");\\n        c = uint32(a);\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint128.\\nlibrary BoringMath128 {\\n    function add(uint128 a, uint128 b) internal pure returns (uint128 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint128 a, uint128 b) internal pure returns (uint128 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint64.\\nlibrary BoringMath64 {\\n    function add(uint64 a, uint64 b) internal pure returns (uint64 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint64 a, uint64 b) internal pure returns (uint64 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint32.\\nlibrary BoringMath32 {\\n    function add(uint32 a, uint32 b) internal pure returns (uint32 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint32 a, uint32 b) internal pure returns (uint32 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringRebase.sol@v1.2.0\\n// License-Identifier: MIT\\n\\nstruct Rebase {\\n    uint128 elastic;\\n    uint128 base;\\n}\\n\\n/// @notice A rebasing library using overflow-/underflow-safe math.\\nlibrary RebaseLibrary {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n\\n    /// @notice Calculates the base value in relationship to `elastic` and `total`.\\n    function toBase(\\n        Rebase memory total,\\n        uint256 elastic,\\n        bool roundUp\\n    ) internal pure returns (uint256 base) {\\n        if (total.elastic == 0) {\\n            base = elastic;\\n        } else {\\n            base = elastic.mul(total.base) / total.elastic;\\n            if (roundUp && base.mul(total.elastic) / total.base < elastic) {\\n                base = base.add(1);\\n            }\\n        }\\n    }\\n\\n    /// @notice Calculates the elastic value in relationship to `base` and `total`.\\n    function toElastic(\\n        Rebase memory total,\\n        uint256 base,\\n        bool roundUp\\n    ) internal pure returns (uint256 elastic) {\\n        if (total.base == 0) {\\n            elastic = base;\\n        } else {\\n            elastic = base.mul(total.elastic) / total.base;\\n            if (roundUp && elastic.mul(total.base) / total.elastic < base) {\\n                elastic = elastic.add(1);\\n            }\\n        }\\n    }\\n\\n    /// @notice Add `elastic` to `total` and doubles `total.base`.\\n    /// @return (Rebase) The new total.\\n    /// @return base in relationship to `elastic`.\\n    function add(\\n        Rebase memory total,\\n        uint256 elastic,\\n        bool roundUp\\n    ) internal pure returns (Rebase memory, uint256 base) {\\n        base = toBase(total, elastic, roundUp);\\n        total.elastic = total.elastic.add(elastic.to128());\\n        total.base = total.base.add(base.to128());\\n        return (total, base);\\n    }\\n\\n    /// @notice Sub `base` from `total` and update `total.elastic`.\\n    /// @return (Rebase) The new total.\\n    /// @return elastic in relationship to `base`.\\n    function sub(\\n        Rebase memory total,\\n        uint256 base,\\n        bool roundUp\\n    ) internal pure returns (Rebase memory, uint256 elastic) {\\n        elastic = toElastic(total, base, roundUp);\\n        total.elastic = total.elastic.sub(elastic.to128());\\n        total.base = total.base.sub(base.to128());\\n        return (total, elastic);\\n    }\\n\\n    /// @notice Add `elastic` and `base` to `total`.\\n    function add(\\n        Rebase memory total,\\n        uint256 elastic,\\n        uint256 base\\n    ) internal pure returns (Rebase memory) {\\n        total.elastic = total.elastic.add(elastic.to128());\\n        total.base = total.base.add(base.to128());\\n        return total;\\n    }\\n\\n    /// @notice Subtract `elastic` and `base` to `total`.\\n    function sub(\\n        Rebase memory total,\\n        uint256 elastic,\\n        uint256 base\\n    ) internal pure returns (Rebase memory) {\\n        total.elastic = total.elastic.sub(elastic.to128());\\n        total.base = total.base.sub(base.to128());\\n        return total;\\n    }\\n\\n    /// @notice Add `elastic` to `total` and update storage.\\n    /// @return newElastic Returns updated `elastic`.\\n    function addElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {\\n        newElastic = total.elastic = total.elastic.add(elastic.to128());\\n    }\\n\\n    /// @notice Subtract `elastic` from `total` and update storage.\\n    /// @return newElastic Returns updated `elastic`.\\n    function subElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {\\n        newElastic = total.elastic = total.elastic.sub(elastic.to128());\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringOwnable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n// Source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol + Claimable.sol\\n// Edited by BoringCrypto\\n\\ncontract BoringOwnableData {\\n    address public owner;\\n    address public pendingOwner;\\n}\\n\\ncontract BoringOwnable is BoringOwnableData {\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /// @notice `owner` defaults to msg.sender on construction.\\n    constructor() public {\\n        owner = msg.sender;\\n        emit OwnershipTransferred(address(0), msg.sender);\\n    }\\n\\n    /// @notice Transfers ownership to `newOwner`. Either directly or claimable by the new pending owner.\\n    /// Can only be invoked by the current `owner`.\\n    /// @param newOwner Address of the new owner.\\n    /// @param direct True if `newOwner` should be set immediately. False if `newOwner` needs to use `claimOwnership`.\\n    /// @param renounce Allows the `newOwner` to be `address(0)` if `direct` and `renounce` is True. Has no effect otherwise.\\n    function transferOwnership(\\n        address newOwner,\\n        bool direct,\\n        bool renounce\\n    ) public onlyOwner {\\n        if (direct) {\\n            // Checks\\n            require(newOwner != address(0) || renounce, \\\"Ownable: zero address\\\");\\n\\n            // Effects\\n            emit OwnershipTransferred(owner, newOwner);\\n            owner = newOwner;\\n            pendingOwner = address(0);\\n        } else {\\n            // Effects\\n            pendingOwner = newOwner;\\n        }\\n    }\\n\\n    /// @notice Needs to be called by `pendingOwner` to claim ownership.\\n    function claimOwnership() public {\\n        address _pendingOwner = pendingOwner;\\n\\n        // Checks\\n        require(msg.sender == _pendingOwner, \\\"Ownable: caller != pending owner\\\");\\n\\n        // Effects\\n        emit OwnershipTransferred(owner, _pendingOwner);\\n        owner = _pendingOwner;\\n        pendingOwner = address(0);\\n    }\\n\\n    /// @notice Only allows the `owner` to execute the function.\\n    modifier onlyOwner() {\\n        require(msg.sender == owner, \\\"Ownable: caller is not the owner\\\");\\n        _;\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/interfaces/IMasterContract.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ninterface IMasterContract {\\n    /// @notice Init function that gets called from `BoringFactory.deploy`.\\n    /// Also kown as the constructor for cloned contracts.\\n    /// Any ETH send to `BoringFactory.deploy` ends up here.\\n    /// @param data Can be abi encoded arguments or anything else.\\n    function init(bytes calldata data) external payable;\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringFactory.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ncontract BoringFactory {\\n    event LogDeploy(address indexed masterContract, bytes data, address indexed cloneAddress);\\n\\n    /// @notice Mapping from clone contracts to their masterContract.\\n    mapping(address => address) public masterContractOf;\\n\\n    /// @notice Deploys a given master Contract as a clone.\\n    /// Any ETH transferred with this call is forwarded to the new clone.\\n    /// Emits `LogDeploy`.\\n    /// @param masterContract The address of the contract to clone.\\n    /// @param data Additional abi encoded calldata that is passed to the new clone via `IMasterContract.init`.\\n    /// @param useCreate2 Creates the clone by using the CREATE2 opcode, in this case `data` will be used as salt.\\n    /// @return cloneAddress Address of the created clone contract.\\n    function deploy(\\n        address masterContract,\\n        bytes calldata data,\\n        bool useCreate2\\n    ) public payable returns (address cloneAddress) {\\n        require(masterContract != address(0), \\\"BoringFactory: No masterContract\\\");\\n        bytes20 targetBytes = bytes20(masterContract); // Takes the first 20 bytes of the masterContract's address\\n\\n        if (useCreate2) {\\n            // each masterContract has different code already. So clones are distinguished by their data only.\\n            bytes32 salt = keccak256(data);\\n\\n            // Creates clone, more info here: https://blog.openzeppelin.com/deep-dive-into-the-minimal-proxy-contract/\\n            assembly {\\n                let clone := mload(0x40)\\n                mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n                mstore(add(clone, 0x14), targetBytes)\\n                mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n                cloneAddress := create2(0, clone, 0x37, salt)\\n            }\\n        } else {\\n            assembly {\\n                let clone := mload(0x40)\\n                mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n                mstore(add(clone, 0x14), targetBytes)\\n                mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n                cloneAddress := create(0, clone, 0x37)\\n            }\\n        }\\n        masterContractOf[cloneAddress] = masterContract;\\n\\n        IMasterContract(cloneAddress).init{value: msg.value}(data);\\n\\n        emit LogDeploy(masterContract, data, cloneAddress);\\n    }\\n}\\n\\n// File contracts/MasterContractManager.sol\\n// License-Identifier: UNLICENSED\\n\\ncontract MasterContractManager is BoringOwnable, BoringFactory {\\n    event LogWhiteListMasterContract(address indexed masterContract, bool approved);\\n    event LogSetMasterContractApproval(address indexed masterContract, address indexed user, bool approved);\\n    event LogRegisterProtocol(address indexed protocol);\\n\\n    /// @notice masterContract to user to approval state\\n    mapping(address => mapping(address => bool)) public masterContractApproved;\\n    /// @notice masterContract to whitelisted state for approval without signed message\\n    mapping(address => bool) public whitelistedMasterContracts;\\n    /// @notice user nonces for masterContract approvals\\n    mapping(address => uint256) public nonces;\\n\\n    bytes32 private constant DOMAIN_SEPARATOR_SIGNATURE_HASH = keccak256(\\\"EIP712Domain(string name,uint256 chainId,address verifyingContract)\\\");\\n    // See https://eips.ethereum.org/EIPS/eip-191\\n    string private constant EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA = \\\"\\\\x19\\\\x01\\\";\\n    bytes32 private constant APPROVAL_SIGNATURE_HASH =\\n        keccak256(\\\"SetMasterContractApproval(string warning,address user,address masterContract,bool approved,uint256 nonce)\\\");\\n\\n    // solhint-disable-next-line var-name-mixedcase\\n    bytes32 private immutable _DOMAIN_SEPARATOR;\\n    // solhint-disable-next-line var-name-mixedcase\\n    uint256 private immutable DOMAIN_SEPARATOR_CHAIN_ID;\\n\\n    constructor() public {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        _DOMAIN_SEPARATOR = _calculateDomainSeparator(DOMAIN_SEPARATOR_CHAIN_ID = chainId);\\n    }\\n\\n    function _calculateDomainSeparator(uint256 chainId) private view returns (bytes32) {\\n        return keccak256(abi.encode(DOMAIN_SEPARATOR_SIGNATURE_HASH, keccak256(\\\"BentoBox V1\\\"), chainId, address(this)));\\n    }\\n\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() public view returns (bytes32) {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        return chainId == DOMAIN_SEPARATOR_CHAIN_ID ? _DOMAIN_SEPARATOR : _calculateDomainSeparator(chainId);\\n    }\\n\\n    /// @notice Other contracts need to register with this master contract so that users can approve them for the BentoBox.\\n    function registerProtocol() public {\\n        masterContractOf[msg.sender] = msg.sender;\\n        emit LogRegisterProtocol(msg.sender);\\n    }\\n\\n    /// @notice Enables or disables a contract for approval without signed message.\\n    function whitelistMasterContract(address masterContract, bool approved) public onlyOwner {\\n        // Checks\\n        require(masterContract != address(0), \\\"MasterCMgr: Cannot approve 0\\\");\\n\\n        // Effects\\n        whitelistedMasterContracts[masterContract] = approved;\\n        emit LogWhiteListMasterContract(masterContract, approved);\\n    }\\n\\n    /// @notice Approves or revokes a `masterContract` access to `user` funds.\\n    /// @param user The address of the user that approves or revokes access.\\n    /// @param masterContract The address who gains or loses access.\\n    /// @param approved If True approves access. If False revokes access.\\n    /// @param v Part of the signature. (See EIP-191)\\n    /// @param r Part of the signature. (See EIP-191)\\n    /// @param s Part of the signature. (See EIP-191)\\n    // F4 - Check behaviour for all function arguments when wrong or extreme\\n    // F4: Don't allow masterContract 0 to be approved. Unknown contracts will have a masterContract of 0.\\n    // F4: User can't be 0 for signed approvals because the recoveredAddress will be 0 if ecrecover fails\\n    function setMasterContractApproval(\\n        address user,\\n        address masterContract,\\n        bool approved,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) public {\\n        // Checks\\n        require(masterContract != address(0), \\\"MasterCMgr: masterC not set\\\"); // Important for security\\n\\n        // If no signature is provided, the fallback is executed\\n        if (r == 0 && s == 0 && v == 0) {\\n            require(user == msg.sender, \\\"MasterCMgr: user not sender\\\");\\n            require(masterContractOf[user] == address(0), \\\"MasterCMgr: user is clone\\\");\\n            require(whitelistedMasterContracts[masterContract], \\\"MasterCMgr: not whitelisted\\\");\\n        } else {\\n            // Important for security - any address without masterContract has address(0) as masterContract\\n            // So approving address(0) would approve every address, leading to full loss of funds\\n            // Also, ecrecover returns address(0) on failure. So we check this:\\n            require(user != address(0), \\\"MasterCMgr: User cannot be 0\\\");\\n\\n            // C10 - Protect signatures against replay, use nonce and chainId (SWC-121)\\n            // C10: nonce + chainId are used to prevent replays\\n            // C11 - All signatures strictly EIP-712 (SWC-117 SWC-122)\\n            // C11: signature is EIP-712 compliant\\n            // C12 - abi.encodePacked can't contain variable length user input (SWC-133)\\n            // C12: abi.encodePacked has fixed length parameters\\n            bytes32 digest =\\n                keccak256(\\n                    abi.encodePacked(\\n                        EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA,\\n                        DOMAIN_SEPARATOR(),\\n                        keccak256(\\n                            abi.encode(\\n                                APPROVAL_SIGNATURE_HASH,\\n                                approved\\n                                    ? keccak256(\\\"Give FULL access to funds in (and approved to) BentoBox?\\\")\\n                                    : keccak256(\\\"Revoke access to BentoBox?\\\"),\\n                                user,\\n                                masterContract,\\n                                approved,\\n                                nonces[user]++\\n                            )\\n                        )\\n                    )\\n                );\\n            address recoveredAddress = ecrecover(digest, v, r, s);\\n            require(recoveredAddress == user, \\\"MasterCMgr: Invalid Signature\\\");\\n        }\\n\\n        // Effects\\n        masterContractApproved[masterContract][user] = approved;\\n        emit LogSetMasterContractApproval(masterContract, user, approved);\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringBatchable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ncontract BaseBoringBatchable {\\n    /// @dev Helper function to extract a useful revert message from a failed call.\\n    /// If the returned data is malformed or not correctly abi encoded then this call can fail itself.\\n    function _getRevertMsg(bytes memory _returnData) internal pure returns (string memory) {\\n        // If the _res length is less than 68, then the transaction failed silently (without a revert message)\\n        if (_returnData.length < 68) return \\\"Transaction reverted silently\\\";\\n\\n        assembly {\\n            // Slice the sighash.\\n            _returnData := add(_returnData, 0x04)\\n        }\\n        return abi.decode(_returnData, (string)); // All that remains is the revert string\\n    }\\n\\n    /// @notice Allows batched call to self (this contract).\\n    /// @param calls An array of inputs for each call.\\n    /// @param revertOnFail If True then reverts after a failed call and stops doing further calls.\\n    /// @return successes An array indicating the success of a call, mapped one-to-one to `calls`.\\n    /// @return results An array with the returned data of each function call, mapped one-to-one to `calls`.\\n    // F1: External is ok here because this is the batch function, adding it to a batch makes no sense\\n    // F2: Calls in the batch may be payable, delegatecall operates in the same context, so each call in the batch has access to msg.value\\n    // C3: The length of the loop is fully under user control, so can't be exploited\\n    // C7: Delegatecall is only used on the same contract, so it's safe\\n    function batch(bytes[] calldata calls, bool revertOnFail) external payable returns (bool[] memory successes, bytes[] memory results) {\\n        successes = new bool[](calls.length);\\n        results = new bytes[](calls.length);\\n        for (uint256 i = 0; i < calls.length; i++) {\\n            (bool success, bytes memory result) = address(this).delegatecall(calls[i]);\\n            require(success || !revertOnFail, _getRevertMsg(result));\\n            successes[i] = success;\\n            results[i] = result;\\n        }\\n    }\\n}\\n\\ncontract BoringBatchable is BaseBoringBatchable {\\n    /// @notice Call wrapper that performs `ERC20.permit` on `token`.\\n    /// Lookup `IERC20.permit`.\\n    // F6: Parameters can be used front-run the permit and the user's permit will fail (due to nonce or other revert)\\n    //     if part of a batch this could be used to grief once as the second call would not need the permit\\n    function permitToken(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) public {\\n        token.permit(from, to, amount, deadline, v, r, s);\\n    }\\n}\\n\\n// File contracts/BentoBox.sol\\n// License-Identifier: UNLICENSED\\n\\n/// @title BentoBox\\n/// @author BoringCrypto, Keno\\n/// @notice The BentoBox is a vault for tokens. The stored tokens can be flash loaned and used in strategies.\\n/// Yield from this will go to the token depositors.\\n/// Rebasing tokens ARE NOT supported and WILL cause loss of funds.\\n/// Any funds transfered directly onto the BentoBox will be lost, use the deposit function instead.\\ncontract BentoBoxV1 is MasterContractManager, BoringBatchable {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n    using BoringERC20 for IERC20;\\n    using RebaseLibrary for Rebase;\\n\\n    // ************** //\\n    // *** EVENTS *** //\\n    // ************** //\\n\\n    event LogDeposit(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogWithdraw(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogTransfer(IERC20 indexed token, address indexed from, address indexed to, uint256 share);\\n\\n    event LogFlashLoan(address indexed borrower, IERC20 indexed token, uint256 amount, uint256 feeAmount, address indexed receiver);\\n\\n    event LogStrategyTargetPercentage(IERC20 indexed token, uint256 targetPercentage);\\n    event LogStrategyQueued(IERC20 indexed token, IStrategy indexed strategy);\\n    event LogStrategySet(IERC20 indexed token, IStrategy indexed strategy);\\n    event LogStrategyInvest(IERC20 indexed token, uint256 amount);\\n    event LogStrategyDivest(IERC20 indexed token, uint256 amount);\\n    event LogStrategyProfit(IERC20 indexed token, uint256 amount);\\n    event LogStrategyLoss(IERC20 indexed token, uint256 amount);\\n\\n    // *************** //\\n    // *** STRUCTS *** //\\n    // *************** //\\n\\n    struct StrategyData {\\n        uint64 strategyStartDate;\\n        uint64 targetPercentage;\\n        uint128 balance; // the balance of the strategy that BentoBox thinks is in there\\n    }\\n\\n    // ******************************** //\\n    // *** CONSTANTS AND IMMUTABLES *** //\\n    // ******************************** //\\n\\n    // V2 - Can they be private?\\n    // V2: Private to save gas, to verify it's correct, check the constructor arguments\\n    IERC20 private immutable wethToken;\\n\\n    IERC20 private constant USE_ETHEREUM = IERC20(0);\\n    uint256 private constant FLASH_LOAN_FEE = 50; // 0.05%\\n    uint256 private constant FLASH_LOAN_FEE_PRECISION = 1e5;\\n    uint256 private constant STRATEGY_DELAY = 2 weeks;\\n    uint256 private constant MAX_TARGET_PERCENTAGE = 95; // 95%\\n    uint256 private constant MINIMUM_SHARE_BALANCE = 1000; // To prevent the ratio going off\\n\\n    // ***************** //\\n    // *** VARIABLES *** //\\n    // ***************** //\\n\\n    // Balance per token per address/contract in shares\\n    mapping(IERC20 => mapping(address => uint256)) public balanceOf;\\n\\n    // Rebase from amount to share\\n    mapping(IERC20 => Rebase) public totals;\\n\\n    mapping(IERC20 => IStrategy) public strategy;\\n    mapping(IERC20 => IStrategy) public pendingStrategy;\\n    mapping(IERC20 => StrategyData) public strategyData;\\n\\n    // ******************* //\\n    // *** CONSTRUCTOR *** //\\n    // ******************* //\\n\\n    constructor(IERC20 wethToken_) public {\\n        wethToken = wethToken_;\\n    }\\n\\n    // ***************** //\\n    // *** MODIFIERS *** //\\n    // ***************** //\\n\\n    /// Modifier to check if the msg.sender is allowed to use funds belonging to the 'from' address.\\n    /// If 'from' is msg.sender, it's allowed.\\n    /// If 'from' is the BentoBox itself, it's allowed. Any ETH, token balances (above the known balances) or BentoBox balances\\n    /// can be taken by anyone.\\n    /// This is to enable skimming, not just for deposits, but also for withdrawals or transfers, enabling better composability.\\n    /// If 'from' is a clone of a masterContract AND the 'from' address has approved that masterContract, it's allowed.\\n    modifier allowed(address from) {\\n        if (from != msg.sender && from != address(this)) {\\n            // From is sender or you are skimming\\n            address masterContract = masterContractOf[msg.sender];\\n            require(masterContract != address(0), \\\"BentoBox: no masterContract\\\");\\n            require(masterContractApproved[masterContract][from], \\\"BentoBox: Transfer not approved\\\");\\n        }\\n        _;\\n    }\\n\\n    // ************************** //\\n    // *** INTERNAL FUNCTIONS *** //\\n    // ************************** //\\n\\n    /// @dev Returns the total balance of `token` this contracts holds,\\n    /// plus the total amount this contract thinks the strategy holds.\\n    function _tokenBalanceOf(IERC20 token) internal view returns (uint256 amount) {\\n        amount = token.balanceOf(address(this)).add(strategyData[token].balance);\\n    }\\n\\n    // ************************ //\\n    // *** PUBLIC FUNCTIONS *** //\\n    // ************************ //\\n\\n    /// @dev Helper function to represent an `amount` of `token` in shares.\\n    /// @param token The ERC-20 token.\\n    /// @param amount The `token` amount.\\n    /// @param roundUp If the result `share` should be rounded up.\\n    /// @return share The token amount represented in shares.\\n    function toShare(\\n        IERC20 token,\\n        uint256 amount,\\n        bool roundUp\\n    ) external view returns (uint256 share) {\\n        share = totals[token].toBase(amount, roundUp);\\n    }\\n\\n    /// @dev Helper function represent shares back into the `token` amount.\\n    /// @param token The ERC-20 token.\\n    /// @param share The amount of shares.\\n    /// @param roundUp If the result should be rounded up.\\n    /// @return amount The share amount back into native representation.\\n    function toAmount(\\n        IERC20 token,\\n        uint256 share,\\n        bool roundUp\\n    ) external view returns (uint256 amount) {\\n        amount = totals[token].toElastic(share, roundUp);\\n    }\\n\\n    /// @notice Deposit an amount of `token` represented in either `amount` or `share`.\\n    /// @param token_ The ERC-20 token to deposit.\\n    /// @param from which account to pull the tokens.\\n    /// @param to which account to push the tokens.\\n    /// @param amount Token amount in native representation to deposit.\\n    /// @param share Token amount represented in shares to deposit. Takes precedence over `amount`.\\n    /// @return amountOut The amount deposited.\\n    /// @return shareOut The deposited amount repesented in shares.\\n    function deposit(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) public payable allowed(from) returns (uint256 amountOut, uint256 shareOut) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;\\n        Rebase memory total = totals[token];\\n\\n        // If a new token gets added, the tokenSupply call checks that this is a deployed contract. Needed for security.\\n        require(total.elastic != 0 || token.totalSupply() > 0, \\\"BentoBox: No tokens\\\");\\n        if (share == 0) {\\n            // value of the share may be lower than the amount due to rounding, that's ok\\n            share = total.toBase(amount, false);\\n            // Any deposit should lead to at least the minimum share balance, otherwise it's ignored (no amount taken)\\n            if (total.base.add(share.to128()) < MINIMUM_SHARE_BALANCE) {\\n                return (0, 0);\\n            }\\n        } else {\\n            // amount may be lower than the value of share due to rounding, in that case, add 1 to amount (Always round up)\\n            amount = total.toElastic(share, true);\\n        }\\n\\n        // In case of skimming, check that only the skimmable amount is taken.\\n        // For ETH, the full balance is available, so no need to check.\\n        // During flashloans the _tokenBalanceOf is lower than 'reality', so skimming deposits will mostly fail during a flashloan.\\n        require(\\n            from != address(this) || token_ == USE_ETHEREUM || amount <= _tokenBalanceOf(token).sub(total.elastic),\\n            \\\"BentoBox: Skim too much\\\"\\n        );\\n\\n        balanceOf[token][to] = balanceOf[token][to].add(share);\\n        total.base = total.base.add(share.to128());\\n        total.elastic = total.elastic.add(amount.to128());\\n        totals[token] = total;\\n\\n        // Interactions\\n        // During the first deposit, we check that this token is 'real'\\n        if (token_ == USE_ETHEREUM) {\\n            // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)\\n            // X2: If the WETH implementation is faulty or malicious, it will block adding ETH (but we know the WETH implementation)\\n            IWETH(address(wethToken)).deposit{value: amount}();\\n        } else if (from != address(this)) {\\n            // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)\\n            // X2: If the token implementation is faulty or malicious, it may block adding tokens. Good.\\n            token.safeTransferFrom(from, address(this), amount);\\n        }\\n        emit LogDeposit(token, from, to, amount, share);\\n        amountOut = amount;\\n        shareOut = share;\\n    }\\n\\n    /// @notice Withdraws an amount of `token` from a user account.\\n    /// @param token_ The ERC-20 token to withdraw.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param amount of tokens. Either one of `amount` or `share` needs to be supplied.\\n    /// @param share Like above, but `share` takes precedence over `amount`.\\n    function withdraw(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) public allowed(from) returns (uint256 amountOut, uint256 shareOut) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;\\n        Rebase memory total = totals[token];\\n        if (share == 0) {\\n            // value of the share paid could be lower than the amount paid due to rounding, in that case, add a share (Always round up)\\n            share = total.toBase(amount, true);\\n        } else {\\n            // amount may be lower than the value of share due to rounding, that's ok\\n            amount = total.toElastic(share, false);\\n        }\\n\\n        balanceOf[token][from] = balanceOf[token][from].sub(share);\\n        total.elastic = total.elastic.sub(amount.to128());\\n        total.base = total.base.sub(share.to128());\\n        // There have to be at least 1000 shares left to prevent reseting the share/amount ratio (unless it's fully emptied)\\n        require(total.base >= MINIMUM_SHARE_BALANCE || total.base == 0, \\\"BentoBox: cannot empty\\\");\\n        totals[token] = total;\\n\\n        // Interactions\\n        if (token_ == USE_ETHEREUM) {\\n            // X2, X3: A revert or big gas usage in the WETH contract could block withdrawals, but WETH9 is fine.\\n            IWETH(address(wethToken)).withdraw(amount);\\n            // X2, X3: A revert or big gas usage could block, however, the to address is under control of the caller.\\n            (bool success, ) = to.call{value: amount}(\\\"\\\");\\n            require(success, \\\"BentoBox: ETH transfer failed\\\");\\n        } else {\\n            // X2, X3: A malicious token could block withdrawal of just THAT token.\\n            //         masterContracts may want to take care not to rely on withdraw always succeeding.\\n            token.safeTransfer(to, amount);\\n        }\\n        emit LogWithdraw(token, from, to, amount, share);\\n        amountOut = amount;\\n        shareOut = share;\\n    }\\n\\n    /// @notice Transfer shares from a user account to another one.\\n    /// @param token The ERC-20 token to transfer.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param share The amount of `token` in shares.\\n    // Clones of master contracts can transfer from any account that has approved them\\n    // F3 - Can it be combined with another similar function?\\n    // F3: This isn't combined with transferMultiple for gas optimization\\n    function transfer(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 share\\n    ) public allowed(from) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        balanceOf[token][from] = balanceOf[token][from].sub(share);\\n        balanceOf[token][to] = balanceOf[token][to].add(share);\\n\\n        emit LogTransfer(token, from, to, share);\\n    }\\n\\n    /// @notice Transfer shares from a user account to multiple other ones.\\n    /// @param token The ERC-20 token to transfer.\\n    /// @param from which user to pull the tokens.\\n    /// @param tos The receivers of the tokens.\\n    /// @param shares The amount of `token` in shares for each receiver in `tos`.\\n    // F3 - Can it be combined with another similar function?\\n    // F3: This isn't combined with transfer for gas optimization\\n    function transferMultiple(\\n        IERC20 token,\\n        address from,\\n        address[] calldata tos,\\n        uint256[] calldata shares\\n    ) public allowed(from) {\\n        // Checks\\n        require(tos[0] != address(0), \\\"BentoBox: to[0] not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        uint256 totalAmount;\\n        uint256 len = tos.length;\\n        for (uint256 i = 0; i < len; i++) {\\n            address to = tos[i];\\n            balanceOf[token][to] = balanceOf[token][to].add(shares[i]);\\n            totalAmount = totalAmount.add(shares[i]);\\n            emit LogTransfer(token, from, to, shares[i]);\\n        }\\n        balanceOf[token][from] = balanceOf[token][from].sub(totalAmount);\\n    }\\n\\n    /// @notice Flashloan ability.\\n    /// @param borrower The address of the contract that implements and conforms to `IFlashBorrower` and handles the flashloan.\\n    /// @param receiver Address of the token receiver.\\n    /// @param token The address of the token to receive.\\n    /// @param amount of the tokens to receive.\\n    /// @param data The calldata to pass to the `borrower` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Not possible to follow this here, reentrancy has been reviewed\\n    // F6 - Check for front-running possibilities, such as the approve function (SWC-114)\\n    // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.\\n    function flashLoan(\\n        IFlashBorrower borrower,\\n        address receiver,\\n        IERC20 token,\\n        uint256 amount,\\n        bytes calldata data\\n    ) public {\\n        uint256 fee = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;\\n        token.safeTransfer(receiver, amount);\\n\\n        borrower.onFlashLoan(msg.sender, token, amount, fee, data);\\n\\n        require(_tokenBalanceOf(token) >= totals[token].addElastic(fee.to128()), \\\"BentoBox: Wrong amount\\\");\\n        emit LogFlashLoan(address(borrower), token, amount, fee, receiver);\\n    }\\n\\n    /// @notice Support for batched flashloans. Useful to request multiple different `tokens` in a single transaction.\\n    /// @param borrower The address of the contract that implements and conforms to `IBatchFlashBorrower` and handles the flashloan.\\n    /// @param receivers An array of the token receivers. A one-to-one mapping with `tokens` and `amounts`.\\n    /// @param tokens The addresses of the tokens.\\n    /// @param amounts of the tokens for each receiver.\\n    /// @param data The calldata to pass to the `borrower` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Not possible to follow this here, reentrancy has been reviewed\\n    // F6 - Check for front-running possibilities, such as the approve function (SWC-114)\\n    // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.\\n    function batchFlashLoan(\\n        IBatchFlashBorrower borrower,\\n        address[] calldata receivers,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        bytes calldata data\\n    ) public {\\n        uint256[] memory fees = new uint256[](tokens.length);\\n\\n        uint256 len = tokens.length;\\n        for (uint256 i = 0; i < len; i++) {\\n            uint256 amount = amounts[i];\\n            fees[i] = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;\\n\\n            tokens[i].safeTransfer(receivers[i], amounts[i]);\\n        }\\n\\n        borrower.onBatchFlashLoan(msg.sender, tokens, amounts, fees, data);\\n\\n        for (uint256 i = 0; i < len; i++) {\\n            IERC20 token = tokens[i];\\n            require(_tokenBalanceOf(token) >= totals[token].addElastic(fees[i].to128()), \\\"BentoBox: Wrong amount\\\");\\n            emit LogFlashLoan(address(borrower), token, amounts[i], fees[i], receivers[i]);\\n        }\\n    }\\n\\n    /// @notice Sets the target percentage of the strategy for `token`.\\n    /// @dev Only the owner of this contract is allowed to change this.\\n    /// @param token The address of the token that maps to a strategy to change.\\n    /// @param targetPercentage_ The new target in percent. Must be lesser or equal to `MAX_TARGET_PERCENTAGE`.\\n    function setStrategyTargetPercentage(IERC20 token, uint64 targetPercentage_) public onlyOwner {\\n        // Checks\\n        require(targetPercentage_ <= MAX_TARGET_PERCENTAGE, \\\"StrategyManager: Target too high\\\");\\n\\n        // Effects\\n        strategyData[token].targetPercentage = targetPercentage_;\\n        emit LogStrategyTargetPercentage(token, targetPercentage_);\\n    }\\n\\n    /// @notice Sets the contract address of a new strategy that conforms to `IStrategy` for `token`.\\n    /// Must be called twice with the same arguments.\\n    /// A new strategy becomes pending first and can be activated once `STRATEGY_DELAY` is over.\\n    /// @dev Only the owner of this contract is allowed to change this.\\n    /// @param token The address of the token that maps to a strategy to change.\\n    /// @param newStrategy The address of the contract that conforms to `IStrategy`.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Total amount is updated AFTER interaction. But strategy is under our control.\\n    // C4 - Use block.timestamp only for long intervals (SWC-116)\\n    // C4: block.timestamp is used for a period of 2 weeks, which is long enough\\n    function setStrategy(IERC20 token, IStrategy newStrategy) public onlyOwner {\\n        StrategyData memory data = strategyData[token];\\n        IStrategy pending = pendingStrategy[token];\\n        if (data.strategyStartDate == 0 || pending != newStrategy) {\\n            pendingStrategy[token] = newStrategy;\\n            // C1 - All math done through BoringMath (SWC-101)\\n            // C1: Our sun will swallow the earth well before this overflows\\n            data.strategyStartDate = (block.timestamp + STRATEGY_DELAY).to64();\\n            emit LogStrategyQueued(token, newStrategy);\\n        } else {\\n            require(data.strategyStartDate != 0 && block.timestamp >= data.strategyStartDate, \\\"StrategyManager: Too early\\\");\\n            if (address(strategy[token]) != address(0)) {\\n                int256 balanceChange = strategy[token].exit(data.balance);\\n                // Effects\\n                if (balanceChange > 0) {\\n                    uint256 add = uint256(balanceChange);\\n                    totals[token].addElastic(add);\\n                    emit LogStrategyProfit(token, add);\\n                } else if (balanceChange < 0) {\\n                    uint256 sub = uint256(-balanceChange);\\n                    totals[token].subElastic(sub);\\n                    emit LogStrategyLoss(token, sub);\\n                }\\n\\n                emit LogStrategyDivest(token, data.balance);\\n            }\\n            strategy[token] = pending;\\n            data.strategyStartDate = 0;\\n            data.balance = 0;\\n            pendingStrategy[token] = IStrategy(0);\\n            emit LogStrategySet(token, newStrategy);\\n        }\\n        strategyData[token] = data;\\n    }\\n\\n    /// @notice The actual process of yield farming. Executes the strategy of `token`.\\n    /// Optionally does housekeeping if `balance` is true.\\n    /// `maxChangeAmount` is relevant for skimming or withdrawing if `balance` is true.\\n    /// @param token The address of the token for which a strategy is deployed.\\n    /// @param balance True if housekeeping should be done.\\n    /// @param maxChangeAmount The maximum amount for either pulling or pushing from/to the `IStrategy` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Total amount is updated AFTER interaction. But strategy is under our control.\\n    // F5: Not followed to prevent reentrancy issues with flashloans and BentoBox skims?\\n    function harvest(\\n        IERC20 token,\\n        bool balance,\\n        uint256 maxChangeAmount\\n    ) public {\\n        StrategyData memory data = strategyData[token];\\n        IStrategy _strategy = strategy[token];\\n        int256 balanceChange = _strategy.harvest(data.balance, msg.sender);\\n        if (balanceChange == 0 && !balance) {\\n            return;\\n        }\\n\\n        uint256 totalElastic = totals[token].elastic;\\n\\n        if (balanceChange > 0) {\\n            uint256 add = uint256(balanceChange);\\n            totalElastic = totalElastic.add(add);\\n            totals[token].elastic = totalElastic.to128();\\n            emit LogStrategyProfit(token, add);\\n        } else if (balanceChange < 0) {\\n            // C1 - All math done through BoringMath (SWC-101)\\n            // C1: balanceChange could overflow if it's max negative int128.\\n            // But tokens with balances that large are not supported by the BentoBox.\\n            uint256 sub = uint256(-balanceChange);\\n            totalElastic = totalElastic.sub(sub);\\n            totals[token].elastic = totalElastic.to128();\\n            data.balance = data.balance.sub(sub.to128());\\n            emit LogStrategyLoss(token, sub);\\n        }\\n\\n        if (balance) {\\n            uint256 targetBalance = totalElastic.mul(data.targetPercentage) / 100;\\n            // if data.balance == targetBalance there is nothing to update\\n            if (data.balance < targetBalance) {\\n                uint256 amountOut = targetBalance.sub(data.balance);\\n                if (maxChangeAmount != 0 && amountOut > maxChangeAmount) {\\n                    amountOut = maxChangeAmount;\\n                }\\n                token.safeTransfer(address(_strategy), amountOut);\\n                data.balance = data.balance.add(amountOut.to128());\\n                _strategy.skim(amountOut);\\n                emit LogStrategyInvest(token, amountOut);\\n            } else if (data.balance > targetBalance) {\\n                uint256 amountIn = data.balance.sub(targetBalance.to128());\\n                if (maxChangeAmount != 0 && amountIn > maxChangeAmount) {\\n                    amountIn = maxChangeAmount;\\n                }\\n\\n                uint256 actualAmountIn = _strategy.withdraw(amountIn);\\n\\n                data.balance = data.balance.sub(actualAmountIn.to128());\\n                emit LogStrategyDivest(token, actualAmountIn);\\n            }\\n        }\\n\\n        strategyData[token] = data;\\n    }\\n\\n    // Contract should be able to receive ETH deposits to support deposit & skim\\n    // solhint-disable-next-line no-empty-blocks\\n    receive() external payable {}\\n}\\n\",\"keccak256\":\"0xf5251397b9aaa5c66ddc18b0cb96350ffac09f5776a1255fedc0072641f916fe\",\"license\":\"UNLICENSED\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {
              "init(bytes)": {
                "notice": "Init function that gets called from `BoringFactory.deploy`. Also kown as the constructor for cloned contracts. Any ETH send to `BoringFactory.deploy` ends up here."
              }
            },
            "version": 1
          }
        },
        "IStrategy": {
          "abi": [
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "balance",
                  "type": "uint256"
                }
              ],
              "name": "exit",
              "outputs": [
                {
                  "internalType": "int256",
                  "name": "amountAdded",
                  "type": "int256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "balance",
                  "type": "uint256"
                },
                {
                  "internalType": "address",
                  "name": "sender",
                  "type": "address"
                }
              ],
              "name": "harvest",
              "outputs": [
                {
                  "internalType": "int256",
                  "name": "amountAdded",
                  "type": "int256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "skim",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "withdraw",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "actualAmount",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {
              "exit(uint256)": {
                "params": {
                  "balance": "The amount of tokens the caller thinks it has invested."
                },
                "returns": {
                  "amountAdded": "The delta (+profit or -loss) that occured in contrast to `balance`."
                }
              },
              "harvest(uint256,address)": {
                "params": {
                  "balance": "The amount of tokens the caller thinks it has invested.",
                  "sender": "The address of the initiator of this transaction. Can be used for reimbursements, etc."
                },
                "returns": {
                  "amountAdded": "The delta (+profit or -loss) that occured in contrast to `balance`."
                }
              },
              "skim(uint256)": {
                "params": {
                  "amount": "The amount of tokens to invest."
                }
              },
              "withdraw(uint256)": {
                "details": "The `actualAmount` should be very close to the amount. The difference should NOT be used to report a loss. That's what harvest is for.",
                "params": {
                  "amount": "The requested amount the caller wants to withdraw."
                },
                "returns": {
                  "actualAmount": "The real amount that is withdrawn."
                }
              }
            },
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "gasEstimates": null,
            "methodIdentifiers": {
              "exit(uint256)": "7f8661a1",
              "harvest(uint256,address)": "18fccc76",
              "skim(uint256)": "6939aaf5",
              "withdraw(uint256)": "2e1a7d4d"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"}],\"name\":\"exit\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"amountAdded\",\"type\":\"int256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"harvest\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"amountAdded\",\"type\":\"int256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"skim\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdraw\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"actualAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"exit(uint256)\":{\"params\":{\"balance\":\"The amount of tokens the caller thinks it has invested.\"},\"returns\":{\"amountAdded\":\"The delta (+profit or -loss) that occured in contrast to `balance`.\"}},\"harvest(uint256,address)\":{\"params\":{\"balance\":\"The amount of tokens the caller thinks it has invested.\",\"sender\":\"The address of the initiator of this transaction. Can be used for reimbursements, etc.\"},\"returns\":{\"amountAdded\":\"The delta (+profit or -loss) that occured in contrast to `balance`.\"}},\"skim(uint256)\":{\"params\":{\"amount\":\"The amount of tokens to invest.\"}},\"withdraw(uint256)\":{\"details\":\"The `actualAmount` should be very close to the amount. The difference should NOT be used to report a loss. That's what harvest is for.\",\"params\":{\"amount\":\"The requested amount the caller wants to withdraw.\"},\"returns\":{\"actualAmount\":\"The real amount that is withdrawn.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"exit(uint256)\":{\"notice\":\"Withdraw all assets in the safest way possible. This shouldn't fail.\"},\"harvest(uint256,address)\":{\"notice\":\"Harvest any profits made converted to the asset and pass them to the caller.\"},\"skim(uint256)\":{\"notice\":\"Send the assets to the Strategy and call skim to invest them.\"},\"withdraw(uint256)\":{\"notice\":\"Withdraw assets. The returned amount can differ from the requested amount due to rounding.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/bentobox/BentoBoxV1.sol\":\"IStrategy\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/bentobox/BentoBoxV1.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\n// The BentoBox\\n\\n//  \\u2584\\u2584\\u2584\\u2584\\u00b7 \\u2584\\u2584\\u2584 . \\u2590 \\u2584 \\u2584\\u2584\\u2584\\u2584\\u2584      \\u2584\\u2584\\u2584\\u2584\\u00b7       \\u2590\\u2584\\u2022 \\u2584\\n//  \\u2590\\u2588 \\u2580\\u2588\\u25aa\\u2580\\u2584.\\u2580\\u00b7\\u2588\\u258c\\u2590\\u2588\\u2022\\u2588\\u2588  \\u25aa     \\u2590\\u2588 \\u2580\\u2588\\u25aa\\u25aa      \\u2588\\u258c\\u2588\\u258c\\u25aa\\n//  \\u2590\\u2588\\u2580\\u2580\\u2588\\u2584\\u2590\\u2580\\u2580\\u25aa\\u2584\\u2590\\u2588\\u2590\\u2590\\u258c \\u2590\\u2588.\\u25aa \\u2584\\u2588\\u2580\\u2584 \\u2590\\u2588\\u2580\\u2580\\u2588\\u2584 \\u2584\\u2588\\u2580\\u2584  \\u00b7\\u2588\\u2588\\u00b7\\n//  \\u2588\\u2588\\u2584\\u25aa\\u2590\\u2588\\u2590\\u2588\\u2584\\u2584\\u258c\\u2588\\u2588\\u2590\\u2588\\u258c \\u2590\\u2588\\u258c\\u00b7\\u2590\\u2588\\u258c.\\u2590\\u258c\\u2588\\u2588\\u2584\\u25aa\\u2590\\u2588\\u2590\\u2588\\u258c.\\u2590\\u258c\\u25aa\\u2590\\u2588\\u00b7\\u2588\\u258c\\n//  \\u00b7\\u2580\\u2580\\u2580\\u2580  \\u2580\\u2580\\u2580 \\u2580\\u2580 \\u2588\\u25aa \\u2580\\u2580\\u2580  \\u2580\\u2588\\u2584\\u2580\\u25aa\\u00b7\\u2580\\u2580\\u2580\\u2580  \\u2580\\u2588\\u2584\\u2580\\u25aa\\u2022\\u2580\\u2580 \\u2580\\u2580\\n\\n// This contract stores funds, handles their transfers, supports flash loans and strategies.\\n\\n// Copyright (c) 2021 BoringCrypto - All rights reserved\\n// Twitter: @Boring_Crypto\\n\\n// Special thanks to Keno for all his hard work and support\\n\\n// Version 22-Mar-2021\\n\\npragma solidity 0.6.12;\\npragma experimental ABIEncoderV2;\\n\\n// solhint-disable avoid-low-level-calls\\n// solhint-disable not-rely-on-time\\n// solhint-disable no-inline-assembly\\n\\n// File @boringcrypto/boring-solidity/contracts/interfaces/IERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ninterface IERC20 {\\n    function totalSupply() external view returns (uint256);\\n\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /// @notice EIP 2612\\n    function permit(\\n        address owner,\\n        address spender,\\n        uint256 value,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) external;\\n}\\n\\n// File contracts/interfaces/IFlashLoan.sol\\n// License-Identifier: MIT\\n\\ninterface IFlashBorrower {\\n    /// @notice The flashloan callback. `amount` + `fee` needs to repayed to msg.sender before this call returns.\\n    /// @param sender The address of the invoker of this flashloan.\\n    /// @param token The address of the token that is loaned.\\n    /// @param amount of the `token` that is loaned.\\n    /// @param fee The fee that needs to be paid on top for this loan. Needs to be the same as `token`.\\n    /// @param data Additional data that was passed to the flashloan function.\\n    function onFlashLoan(\\n        address sender,\\n        IERC20 token,\\n        uint256 amount,\\n        uint256 fee,\\n        bytes calldata data\\n    ) external;\\n}\\n\\ninterface IBatchFlashBorrower {\\n    /// @notice The callback for batched flashloans. Every amount + fee needs to repayed to msg.sender before this call returns.\\n    /// @param sender The address of the invoker of this flashloan.\\n    /// @param tokens Array of addresses for ERC-20 tokens that is loaned.\\n    /// @param amounts A one-to-one map to `tokens` that is loaned.\\n    /// @param fees A one-to-one map to `tokens` that needs to be paid on top for each loan. Needs to be the same token.\\n    /// @param data Additional data that was passed to the flashloan function.\\n    function onBatchFlashLoan(\\n        address sender,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        uint256[] calldata fees,\\n        bytes calldata data\\n    ) external;\\n}\\n\\n// File contracts/interfaces/IWETH.sol\\n// License-Identifier: MIT\\n\\ninterface IWETH {\\n    function deposit() external payable;\\n\\n    function withdraw(uint256) external;\\n}\\n\\n// File contracts/interfaces/IStrategy.sol\\n// License-Identifier: MIT\\n\\ninterface IStrategy {\\n    /// @notice Send the assets to the Strategy and call skim to invest them.\\n    /// @param amount The amount of tokens to invest.\\n    function skim(uint256 amount) external;\\n\\n    /// @notice Harvest any profits made converted to the asset and pass them to the caller.\\n    /// @param balance The amount of tokens the caller thinks it has invested.\\n    /// @param sender The address of the initiator of this transaction. Can be used for reimbursements, etc.\\n    /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.\\n    function harvest(uint256 balance, address sender) external returns (int256 amountAdded);\\n\\n    /// @notice Withdraw assets. The returned amount can differ from the requested amount due to rounding.\\n    /// @dev The `actualAmount` should be very close to the amount.\\n    /// The difference should NOT be used to report a loss. That's what harvest is for.\\n    /// @param amount The requested amount the caller wants to withdraw.\\n    /// @return actualAmount The real amount that is withdrawn.\\n    function withdraw(uint256 amount) external returns (uint256 actualAmount);\\n\\n    /// @notice Withdraw all assets in the safest way possible. This shouldn't fail.\\n    /// @param balance The amount of tokens the caller thinks it has invested.\\n    /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.\\n    function exit(uint256 balance) external returns (int256 amountAdded);\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\nlibrary BoringERC20 {\\n    bytes4 private constant SIG_SYMBOL = 0x95d89b41; // symbol()\\n    bytes4 private constant SIG_NAME = 0x06fdde03; // name()\\n    bytes4 private constant SIG_DECIMALS = 0x313ce567; // decimals()\\n    bytes4 private constant SIG_TRANSFER = 0xa9059cbb; // transfer(address,uint256)\\n    bytes4 private constant SIG_TRANSFER_FROM = 0x23b872dd; // transferFrom(address,address,uint256)\\n\\n    /// @notice Provides a safe ERC20.transfer version for different ERC-20 implementations.\\n    /// Reverts on a failed transfer.\\n    /// @param token The address of the ERC-20 token.\\n    /// @param to Transfer tokens to.\\n    /// @param amount The token amount.\\n    function safeTransfer(\\n        IERC20 token,\\n        address to,\\n        uint256 amount\\n    ) internal {\\n        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER, to, amount));\\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: Transfer failed\\\");\\n    }\\n\\n    /// @notice Provides a safe ERC20.transferFrom version for different ERC-20 implementations.\\n    /// Reverts on a failed transfer.\\n    /// @param token The address of the ERC-20 token.\\n    /// @param from Transfer tokens from.\\n    /// @param to Transfer tokens to.\\n    /// @param amount The token amount.\\n    function safeTransferFrom(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 amount\\n    ) internal {\\n        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER_FROM, from, to, amount));\\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: TransferFrom failed\\\");\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringMath.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n/// @notice A library for performing overflow-/underflow-safe math,\\n/// updated with awesomeness from of DappHub (https://github.com/dapphub/ds-math).\\nlibrary BoringMath {\\n    function add(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require(b == 0 || (c = a * b) / b == a, \\\"BoringMath: Mul Overflow\\\");\\n    }\\n\\n    function to128(uint256 a) internal pure returns (uint128 c) {\\n        require(a <= uint128(-1), \\\"BoringMath: uint128 Overflow\\\");\\n        c = uint128(a);\\n    }\\n\\n    function to64(uint256 a) internal pure returns (uint64 c) {\\n        require(a <= uint64(-1), \\\"BoringMath: uint64 Overflow\\\");\\n        c = uint64(a);\\n    }\\n\\n    function to32(uint256 a) internal pure returns (uint32 c) {\\n        require(a <= uint32(-1), \\\"BoringMath: uint32 Overflow\\\");\\n        c = uint32(a);\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint128.\\nlibrary BoringMath128 {\\n    function add(uint128 a, uint128 b) internal pure returns (uint128 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint128 a, uint128 b) internal pure returns (uint128 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint64.\\nlibrary BoringMath64 {\\n    function add(uint64 a, uint64 b) internal pure returns (uint64 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint64 a, uint64 b) internal pure returns (uint64 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint32.\\nlibrary BoringMath32 {\\n    function add(uint32 a, uint32 b) internal pure returns (uint32 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint32 a, uint32 b) internal pure returns (uint32 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringRebase.sol@v1.2.0\\n// License-Identifier: MIT\\n\\nstruct Rebase {\\n    uint128 elastic;\\n    uint128 base;\\n}\\n\\n/// @notice A rebasing library using overflow-/underflow-safe math.\\nlibrary RebaseLibrary {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n\\n    /// @notice Calculates the base value in relationship to `elastic` and `total`.\\n    function toBase(\\n        Rebase memory total,\\n        uint256 elastic,\\n        bool roundUp\\n    ) internal pure returns (uint256 base) {\\n        if (total.elastic == 0) {\\n            base = elastic;\\n        } else {\\n            base = elastic.mul(total.base) / total.elastic;\\n            if (roundUp && base.mul(total.elastic) / total.base < elastic) {\\n                base = base.add(1);\\n            }\\n        }\\n    }\\n\\n    /// @notice Calculates the elastic value in relationship to `base` and `total`.\\n    function toElastic(\\n        Rebase memory total,\\n        uint256 base,\\n        bool roundUp\\n    ) internal pure returns (uint256 elastic) {\\n        if (total.base == 0) {\\n            elastic = base;\\n        } else {\\n            elastic = base.mul(total.elastic) / total.base;\\n            if (roundUp && elastic.mul(total.base) / total.elastic < base) {\\n                elastic = elastic.add(1);\\n            }\\n        }\\n    }\\n\\n    /// @notice Add `elastic` to `total` and doubles `total.base`.\\n    /// @return (Rebase) The new total.\\n    /// @return base in relationship to `elastic`.\\n    function add(\\n        Rebase memory total,\\n        uint256 elastic,\\n        bool roundUp\\n    ) internal pure returns (Rebase memory, uint256 base) {\\n        base = toBase(total, elastic, roundUp);\\n        total.elastic = total.elastic.add(elastic.to128());\\n        total.base = total.base.add(base.to128());\\n        return (total, base);\\n    }\\n\\n    /// @notice Sub `base` from `total` and update `total.elastic`.\\n    /// @return (Rebase) The new total.\\n    /// @return elastic in relationship to `base`.\\n    function sub(\\n        Rebase memory total,\\n        uint256 base,\\n        bool roundUp\\n    ) internal pure returns (Rebase memory, uint256 elastic) {\\n        elastic = toElastic(total, base, roundUp);\\n        total.elastic = total.elastic.sub(elastic.to128());\\n        total.base = total.base.sub(base.to128());\\n        return (total, elastic);\\n    }\\n\\n    /// @notice Add `elastic` and `base` to `total`.\\n    function add(\\n        Rebase memory total,\\n        uint256 elastic,\\n        uint256 base\\n    ) internal pure returns (Rebase memory) {\\n        total.elastic = total.elastic.add(elastic.to128());\\n        total.base = total.base.add(base.to128());\\n        return total;\\n    }\\n\\n    /// @notice Subtract `elastic` and `base` to `total`.\\n    function sub(\\n        Rebase memory total,\\n        uint256 elastic,\\n        uint256 base\\n    ) internal pure returns (Rebase memory) {\\n        total.elastic = total.elastic.sub(elastic.to128());\\n        total.base = total.base.sub(base.to128());\\n        return total;\\n    }\\n\\n    /// @notice Add `elastic` to `total` and update storage.\\n    /// @return newElastic Returns updated `elastic`.\\n    function addElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {\\n        newElastic = total.elastic = total.elastic.add(elastic.to128());\\n    }\\n\\n    /// @notice Subtract `elastic` from `total` and update storage.\\n    /// @return newElastic Returns updated `elastic`.\\n    function subElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {\\n        newElastic = total.elastic = total.elastic.sub(elastic.to128());\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringOwnable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n// Source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol + Claimable.sol\\n// Edited by BoringCrypto\\n\\ncontract BoringOwnableData {\\n    address public owner;\\n    address public pendingOwner;\\n}\\n\\ncontract BoringOwnable is BoringOwnableData {\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /// @notice `owner` defaults to msg.sender on construction.\\n    constructor() public {\\n        owner = msg.sender;\\n        emit OwnershipTransferred(address(0), msg.sender);\\n    }\\n\\n    /// @notice Transfers ownership to `newOwner`. Either directly or claimable by the new pending owner.\\n    /// Can only be invoked by the current `owner`.\\n    /// @param newOwner Address of the new owner.\\n    /// @param direct True if `newOwner` should be set immediately. False if `newOwner` needs to use `claimOwnership`.\\n    /// @param renounce Allows the `newOwner` to be `address(0)` if `direct` and `renounce` is True. Has no effect otherwise.\\n    function transferOwnership(\\n        address newOwner,\\n        bool direct,\\n        bool renounce\\n    ) public onlyOwner {\\n        if (direct) {\\n            // Checks\\n            require(newOwner != address(0) || renounce, \\\"Ownable: zero address\\\");\\n\\n            // Effects\\n            emit OwnershipTransferred(owner, newOwner);\\n            owner = newOwner;\\n            pendingOwner = address(0);\\n        } else {\\n            // Effects\\n            pendingOwner = newOwner;\\n        }\\n    }\\n\\n    /// @notice Needs to be called by `pendingOwner` to claim ownership.\\n    function claimOwnership() public {\\n        address _pendingOwner = pendingOwner;\\n\\n        // Checks\\n        require(msg.sender == _pendingOwner, \\\"Ownable: caller != pending owner\\\");\\n\\n        // Effects\\n        emit OwnershipTransferred(owner, _pendingOwner);\\n        owner = _pendingOwner;\\n        pendingOwner = address(0);\\n    }\\n\\n    /// @notice Only allows the `owner` to execute the function.\\n    modifier onlyOwner() {\\n        require(msg.sender == owner, \\\"Ownable: caller is not the owner\\\");\\n        _;\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/interfaces/IMasterContract.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ninterface IMasterContract {\\n    /// @notice Init function that gets called from `BoringFactory.deploy`.\\n    /// Also kown as the constructor for cloned contracts.\\n    /// Any ETH send to `BoringFactory.deploy` ends up here.\\n    /// @param data Can be abi encoded arguments or anything else.\\n    function init(bytes calldata data) external payable;\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringFactory.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ncontract BoringFactory {\\n    event LogDeploy(address indexed masterContract, bytes data, address indexed cloneAddress);\\n\\n    /// @notice Mapping from clone contracts to their masterContract.\\n    mapping(address => address) public masterContractOf;\\n\\n    /// @notice Deploys a given master Contract as a clone.\\n    /// Any ETH transferred with this call is forwarded to the new clone.\\n    /// Emits `LogDeploy`.\\n    /// @param masterContract The address of the contract to clone.\\n    /// @param data Additional abi encoded calldata that is passed to the new clone via `IMasterContract.init`.\\n    /// @param useCreate2 Creates the clone by using the CREATE2 opcode, in this case `data` will be used as salt.\\n    /// @return cloneAddress Address of the created clone contract.\\n    function deploy(\\n        address masterContract,\\n        bytes calldata data,\\n        bool useCreate2\\n    ) public payable returns (address cloneAddress) {\\n        require(masterContract != address(0), \\\"BoringFactory: No masterContract\\\");\\n        bytes20 targetBytes = bytes20(masterContract); // Takes the first 20 bytes of the masterContract's address\\n\\n        if (useCreate2) {\\n            // each masterContract has different code already. So clones are distinguished by their data only.\\n            bytes32 salt = keccak256(data);\\n\\n            // Creates clone, more info here: https://blog.openzeppelin.com/deep-dive-into-the-minimal-proxy-contract/\\n            assembly {\\n                let clone := mload(0x40)\\n                mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n                mstore(add(clone, 0x14), targetBytes)\\n                mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n                cloneAddress := create2(0, clone, 0x37, salt)\\n            }\\n        } else {\\n            assembly {\\n                let clone := mload(0x40)\\n                mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n                mstore(add(clone, 0x14), targetBytes)\\n                mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n                cloneAddress := create(0, clone, 0x37)\\n            }\\n        }\\n        masterContractOf[cloneAddress] = masterContract;\\n\\n        IMasterContract(cloneAddress).init{value: msg.value}(data);\\n\\n        emit LogDeploy(masterContract, data, cloneAddress);\\n    }\\n}\\n\\n// File contracts/MasterContractManager.sol\\n// License-Identifier: UNLICENSED\\n\\ncontract MasterContractManager is BoringOwnable, BoringFactory {\\n    event LogWhiteListMasterContract(address indexed masterContract, bool approved);\\n    event LogSetMasterContractApproval(address indexed masterContract, address indexed user, bool approved);\\n    event LogRegisterProtocol(address indexed protocol);\\n\\n    /// @notice masterContract to user to approval state\\n    mapping(address => mapping(address => bool)) public masterContractApproved;\\n    /// @notice masterContract to whitelisted state for approval without signed message\\n    mapping(address => bool) public whitelistedMasterContracts;\\n    /// @notice user nonces for masterContract approvals\\n    mapping(address => uint256) public nonces;\\n\\n    bytes32 private constant DOMAIN_SEPARATOR_SIGNATURE_HASH = keccak256(\\\"EIP712Domain(string name,uint256 chainId,address verifyingContract)\\\");\\n    // See https://eips.ethereum.org/EIPS/eip-191\\n    string private constant EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA = \\\"\\\\x19\\\\x01\\\";\\n    bytes32 private constant APPROVAL_SIGNATURE_HASH =\\n        keccak256(\\\"SetMasterContractApproval(string warning,address user,address masterContract,bool approved,uint256 nonce)\\\");\\n\\n    // solhint-disable-next-line var-name-mixedcase\\n    bytes32 private immutable _DOMAIN_SEPARATOR;\\n    // solhint-disable-next-line var-name-mixedcase\\n    uint256 private immutable DOMAIN_SEPARATOR_CHAIN_ID;\\n\\n    constructor() public {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        _DOMAIN_SEPARATOR = _calculateDomainSeparator(DOMAIN_SEPARATOR_CHAIN_ID = chainId);\\n    }\\n\\n    function _calculateDomainSeparator(uint256 chainId) private view returns (bytes32) {\\n        return keccak256(abi.encode(DOMAIN_SEPARATOR_SIGNATURE_HASH, keccak256(\\\"BentoBox V1\\\"), chainId, address(this)));\\n    }\\n\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() public view returns (bytes32) {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        return chainId == DOMAIN_SEPARATOR_CHAIN_ID ? _DOMAIN_SEPARATOR : _calculateDomainSeparator(chainId);\\n    }\\n\\n    /// @notice Other contracts need to register with this master contract so that users can approve them for the BentoBox.\\n    function registerProtocol() public {\\n        masterContractOf[msg.sender] = msg.sender;\\n        emit LogRegisterProtocol(msg.sender);\\n    }\\n\\n    /// @notice Enables or disables a contract for approval without signed message.\\n    function whitelistMasterContract(address masterContract, bool approved) public onlyOwner {\\n        // Checks\\n        require(masterContract != address(0), \\\"MasterCMgr: Cannot approve 0\\\");\\n\\n        // Effects\\n        whitelistedMasterContracts[masterContract] = approved;\\n        emit LogWhiteListMasterContract(masterContract, approved);\\n    }\\n\\n    /// @notice Approves or revokes a `masterContract` access to `user` funds.\\n    /// @param user The address of the user that approves or revokes access.\\n    /// @param masterContract The address who gains or loses access.\\n    /// @param approved If True approves access. If False revokes access.\\n    /// @param v Part of the signature. (See EIP-191)\\n    /// @param r Part of the signature. (See EIP-191)\\n    /// @param s Part of the signature. (See EIP-191)\\n    // F4 - Check behaviour for all function arguments when wrong or extreme\\n    // F4: Don't allow masterContract 0 to be approved. Unknown contracts will have a masterContract of 0.\\n    // F4: User can't be 0 for signed approvals because the recoveredAddress will be 0 if ecrecover fails\\n    function setMasterContractApproval(\\n        address user,\\n        address masterContract,\\n        bool approved,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) public {\\n        // Checks\\n        require(masterContract != address(0), \\\"MasterCMgr: masterC not set\\\"); // Important for security\\n\\n        // If no signature is provided, the fallback is executed\\n        if (r == 0 && s == 0 && v == 0) {\\n            require(user == msg.sender, \\\"MasterCMgr: user not sender\\\");\\n            require(masterContractOf[user] == address(0), \\\"MasterCMgr: user is clone\\\");\\n            require(whitelistedMasterContracts[masterContract], \\\"MasterCMgr: not whitelisted\\\");\\n        } else {\\n            // Important for security - any address without masterContract has address(0) as masterContract\\n            // So approving address(0) would approve every address, leading to full loss of funds\\n            // Also, ecrecover returns address(0) on failure. So we check this:\\n            require(user != address(0), \\\"MasterCMgr: User cannot be 0\\\");\\n\\n            // C10 - Protect signatures against replay, use nonce and chainId (SWC-121)\\n            // C10: nonce + chainId are used to prevent replays\\n            // C11 - All signatures strictly EIP-712 (SWC-117 SWC-122)\\n            // C11: signature is EIP-712 compliant\\n            // C12 - abi.encodePacked can't contain variable length user input (SWC-133)\\n            // C12: abi.encodePacked has fixed length parameters\\n            bytes32 digest =\\n                keccak256(\\n                    abi.encodePacked(\\n                        EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA,\\n                        DOMAIN_SEPARATOR(),\\n                        keccak256(\\n                            abi.encode(\\n                                APPROVAL_SIGNATURE_HASH,\\n                                approved\\n                                    ? keccak256(\\\"Give FULL access to funds in (and approved to) BentoBox?\\\")\\n                                    : keccak256(\\\"Revoke access to BentoBox?\\\"),\\n                                user,\\n                                masterContract,\\n                                approved,\\n                                nonces[user]++\\n                            )\\n                        )\\n                    )\\n                );\\n            address recoveredAddress = ecrecover(digest, v, r, s);\\n            require(recoveredAddress == user, \\\"MasterCMgr: Invalid Signature\\\");\\n        }\\n\\n        // Effects\\n        masterContractApproved[masterContract][user] = approved;\\n        emit LogSetMasterContractApproval(masterContract, user, approved);\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringBatchable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ncontract BaseBoringBatchable {\\n    /// @dev Helper function to extract a useful revert message from a failed call.\\n    /// If the returned data is malformed or not correctly abi encoded then this call can fail itself.\\n    function _getRevertMsg(bytes memory _returnData) internal pure returns (string memory) {\\n        // If the _res length is less than 68, then the transaction failed silently (without a revert message)\\n        if (_returnData.length < 68) return \\\"Transaction reverted silently\\\";\\n\\n        assembly {\\n            // Slice the sighash.\\n            _returnData := add(_returnData, 0x04)\\n        }\\n        return abi.decode(_returnData, (string)); // All that remains is the revert string\\n    }\\n\\n    /// @notice Allows batched call to self (this contract).\\n    /// @param calls An array of inputs for each call.\\n    /// @param revertOnFail If True then reverts after a failed call and stops doing further calls.\\n    /// @return successes An array indicating the success of a call, mapped one-to-one to `calls`.\\n    /// @return results An array with the returned data of each function call, mapped one-to-one to `calls`.\\n    // F1: External is ok here because this is the batch function, adding it to a batch makes no sense\\n    // F2: Calls in the batch may be payable, delegatecall operates in the same context, so each call in the batch has access to msg.value\\n    // C3: The length of the loop is fully under user control, so can't be exploited\\n    // C7: Delegatecall is only used on the same contract, so it's safe\\n    function batch(bytes[] calldata calls, bool revertOnFail) external payable returns (bool[] memory successes, bytes[] memory results) {\\n        successes = new bool[](calls.length);\\n        results = new bytes[](calls.length);\\n        for (uint256 i = 0; i < calls.length; i++) {\\n            (bool success, bytes memory result) = address(this).delegatecall(calls[i]);\\n            require(success || !revertOnFail, _getRevertMsg(result));\\n            successes[i] = success;\\n            results[i] = result;\\n        }\\n    }\\n}\\n\\ncontract BoringBatchable is BaseBoringBatchable {\\n    /// @notice Call wrapper that performs `ERC20.permit` on `token`.\\n    /// Lookup `IERC20.permit`.\\n    // F6: Parameters can be used front-run the permit and the user's permit will fail (due to nonce or other revert)\\n    //     if part of a batch this could be used to grief once as the second call would not need the permit\\n    function permitToken(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) public {\\n        token.permit(from, to, amount, deadline, v, r, s);\\n    }\\n}\\n\\n// File contracts/BentoBox.sol\\n// License-Identifier: UNLICENSED\\n\\n/// @title BentoBox\\n/// @author BoringCrypto, Keno\\n/// @notice The BentoBox is a vault for tokens. The stored tokens can be flash loaned and used in strategies.\\n/// Yield from this will go to the token depositors.\\n/// Rebasing tokens ARE NOT supported and WILL cause loss of funds.\\n/// Any funds transfered directly onto the BentoBox will be lost, use the deposit function instead.\\ncontract BentoBoxV1 is MasterContractManager, BoringBatchable {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n    using BoringERC20 for IERC20;\\n    using RebaseLibrary for Rebase;\\n\\n    // ************** //\\n    // *** EVENTS *** //\\n    // ************** //\\n\\n    event LogDeposit(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogWithdraw(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogTransfer(IERC20 indexed token, address indexed from, address indexed to, uint256 share);\\n\\n    event LogFlashLoan(address indexed borrower, IERC20 indexed token, uint256 amount, uint256 feeAmount, address indexed receiver);\\n\\n    event LogStrategyTargetPercentage(IERC20 indexed token, uint256 targetPercentage);\\n    event LogStrategyQueued(IERC20 indexed token, IStrategy indexed strategy);\\n    event LogStrategySet(IERC20 indexed token, IStrategy indexed strategy);\\n    event LogStrategyInvest(IERC20 indexed token, uint256 amount);\\n    event LogStrategyDivest(IERC20 indexed token, uint256 amount);\\n    event LogStrategyProfit(IERC20 indexed token, uint256 amount);\\n    event LogStrategyLoss(IERC20 indexed token, uint256 amount);\\n\\n    // *************** //\\n    // *** STRUCTS *** //\\n    // *************** //\\n\\n    struct StrategyData {\\n        uint64 strategyStartDate;\\n        uint64 targetPercentage;\\n        uint128 balance; // the balance of the strategy that BentoBox thinks is in there\\n    }\\n\\n    // ******************************** //\\n    // *** CONSTANTS AND IMMUTABLES *** //\\n    // ******************************** //\\n\\n    // V2 - Can they be private?\\n    // V2: Private to save gas, to verify it's correct, check the constructor arguments\\n    IERC20 private immutable wethToken;\\n\\n    IERC20 private constant USE_ETHEREUM = IERC20(0);\\n    uint256 private constant FLASH_LOAN_FEE = 50; // 0.05%\\n    uint256 private constant FLASH_LOAN_FEE_PRECISION = 1e5;\\n    uint256 private constant STRATEGY_DELAY = 2 weeks;\\n    uint256 private constant MAX_TARGET_PERCENTAGE = 95; // 95%\\n    uint256 private constant MINIMUM_SHARE_BALANCE = 1000; // To prevent the ratio going off\\n\\n    // ***************** //\\n    // *** VARIABLES *** //\\n    // ***************** //\\n\\n    // Balance per token per address/contract in shares\\n    mapping(IERC20 => mapping(address => uint256)) public balanceOf;\\n\\n    // Rebase from amount to share\\n    mapping(IERC20 => Rebase) public totals;\\n\\n    mapping(IERC20 => IStrategy) public strategy;\\n    mapping(IERC20 => IStrategy) public pendingStrategy;\\n    mapping(IERC20 => StrategyData) public strategyData;\\n\\n    // ******************* //\\n    // *** CONSTRUCTOR *** //\\n    // ******************* //\\n\\n    constructor(IERC20 wethToken_) public {\\n        wethToken = wethToken_;\\n    }\\n\\n    // ***************** //\\n    // *** MODIFIERS *** //\\n    // ***************** //\\n\\n    /// Modifier to check if the msg.sender is allowed to use funds belonging to the 'from' address.\\n    /// If 'from' is msg.sender, it's allowed.\\n    /// If 'from' is the BentoBox itself, it's allowed. Any ETH, token balances (above the known balances) or BentoBox balances\\n    /// can be taken by anyone.\\n    /// This is to enable skimming, not just for deposits, but also for withdrawals or transfers, enabling better composability.\\n    /// If 'from' is a clone of a masterContract AND the 'from' address has approved that masterContract, it's allowed.\\n    modifier allowed(address from) {\\n        if (from != msg.sender && from != address(this)) {\\n            // From is sender or you are skimming\\n            address masterContract = masterContractOf[msg.sender];\\n            require(masterContract != address(0), \\\"BentoBox: no masterContract\\\");\\n            require(masterContractApproved[masterContract][from], \\\"BentoBox: Transfer not approved\\\");\\n        }\\n        _;\\n    }\\n\\n    // ************************** //\\n    // *** INTERNAL FUNCTIONS *** //\\n    // ************************** //\\n\\n    /// @dev Returns the total balance of `token` this contracts holds,\\n    /// plus the total amount this contract thinks the strategy holds.\\n    function _tokenBalanceOf(IERC20 token) internal view returns (uint256 amount) {\\n        amount = token.balanceOf(address(this)).add(strategyData[token].balance);\\n    }\\n\\n    // ************************ //\\n    // *** PUBLIC FUNCTIONS *** //\\n    // ************************ //\\n\\n    /// @dev Helper function to represent an `amount` of `token` in shares.\\n    /// @param token The ERC-20 token.\\n    /// @param amount The `token` amount.\\n    /// @param roundUp If the result `share` should be rounded up.\\n    /// @return share The token amount represented in shares.\\n    function toShare(\\n        IERC20 token,\\n        uint256 amount,\\n        bool roundUp\\n    ) external view returns (uint256 share) {\\n        share = totals[token].toBase(amount, roundUp);\\n    }\\n\\n    /// @dev Helper function represent shares back into the `token` amount.\\n    /// @param token The ERC-20 token.\\n    /// @param share The amount of shares.\\n    /// @param roundUp If the result should be rounded up.\\n    /// @return amount The share amount back into native representation.\\n    function toAmount(\\n        IERC20 token,\\n        uint256 share,\\n        bool roundUp\\n    ) external view returns (uint256 amount) {\\n        amount = totals[token].toElastic(share, roundUp);\\n    }\\n\\n    /// @notice Deposit an amount of `token` represented in either `amount` or `share`.\\n    /// @param token_ The ERC-20 token to deposit.\\n    /// @param from which account to pull the tokens.\\n    /// @param to which account to push the tokens.\\n    /// @param amount Token amount in native representation to deposit.\\n    /// @param share Token amount represented in shares to deposit. Takes precedence over `amount`.\\n    /// @return amountOut The amount deposited.\\n    /// @return shareOut The deposited amount repesented in shares.\\n    function deposit(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) public payable allowed(from) returns (uint256 amountOut, uint256 shareOut) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;\\n        Rebase memory total = totals[token];\\n\\n        // If a new token gets added, the tokenSupply call checks that this is a deployed contract. Needed for security.\\n        require(total.elastic != 0 || token.totalSupply() > 0, \\\"BentoBox: No tokens\\\");\\n        if (share == 0) {\\n            // value of the share may be lower than the amount due to rounding, that's ok\\n            share = total.toBase(amount, false);\\n            // Any deposit should lead to at least the minimum share balance, otherwise it's ignored (no amount taken)\\n            if (total.base.add(share.to128()) < MINIMUM_SHARE_BALANCE) {\\n                return (0, 0);\\n            }\\n        } else {\\n            // amount may be lower than the value of share due to rounding, in that case, add 1 to amount (Always round up)\\n            amount = total.toElastic(share, true);\\n        }\\n\\n        // In case of skimming, check that only the skimmable amount is taken.\\n        // For ETH, the full balance is available, so no need to check.\\n        // During flashloans the _tokenBalanceOf is lower than 'reality', so skimming deposits will mostly fail during a flashloan.\\n        require(\\n            from != address(this) || token_ == USE_ETHEREUM || amount <= _tokenBalanceOf(token).sub(total.elastic),\\n            \\\"BentoBox: Skim too much\\\"\\n        );\\n\\n        balanceOf[token][to] = balanceOf[token][to].add(share);\\n        total.base = total.base.add(share.to128());\\n        total.elastic = total.elastic.add(amount.to128());\\n        totals[token] = total;\\n\\n        // Interactions\\n        // During the first deposit, we check that this token is 'real'\\n        if (token_ == USE_ETHEREUM) {\\n            // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)\\n            // X2: If the WETH implementation is faulty or malicious, it will block adding ETH (but we know the WETH implementation)\\n            IWETH(address(wethToken)).deposit{value: amount}();\\n        } else if (from != address(this)) {\\n            // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)\\n            // X2: If the token implementation is faulty or malicious, it may block adding tokens. Good.\\n            token.safeTransferFrom(from, address(this), amount);\\n        }\\n        emit LogDeposit(token, from, to, amount, share);\\n        amountOut = amount;\\n        shareOut = share;\\n    }\\n\\n    /// @notice Withdraws an amount of `token` from a user account.\\n    /// @param token_ The ERC-20 token to withdraw.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param amount of tokens. Either one of `amount` or `share` needs to be supplied.\\n    /// @param share Like above, but `share` takes precedence over `amount`.\\n    function withdraw(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) public allowed(from) returns (uint256 amountOut, uint256 shareOut) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;\\n        Rebase memory total = totals[token];\\n        if (share == 0) {\\n            // value of the share paid could be lower than the amount paid due to rounding, in that case, add a share (Always round up)\\n            share = total.toBase(amount, true);\\n        } else {\\n            // amount may be lower than the value of share due to rounding, that's ok\\n            amount = total.toElastic(share, false);\\n        }\\n\\n        balanceOf[token][from] = balanceOf[token][from].sub(share);\\n        total.elastic = total.elastic.sub(amount.to128());\\n        total.base = total.base.sub(share.to128());\\n        // There have to be at least 1000 shares left to prevent reseting the share/amount ratio (unless it's fully emptied)\\n        require(total.base >= MINIMUM_SHARE_BALANCE || total.base == 0, \\\"BentoBox: cannot empty\\\");\\n        totals[token] = total;\\n\\n        // Interactions\\n        if (token_ == USE_ETHEREUM) {\\n            // X2, X3: A revert or big gas usage in the WETH contract could block withdrawals, but WETH9 is fine.\\n            IWETH(address(wethToken)).withdraw(amount);\\n            // X2, X3: A revert or big gas usage could block, however, the to address is under control of the caller.\\n            (bool success, ) = to.call{value: amount}(\\\"\\\");\\n            require(success, \\\"BentoBox: ETH transfer failed\\\");\\n        } else {\\n            // X2, X3: A malicious token could block withdrawal of just THAT token.\\n            //         masterContracts may want to take care not to rely on withdraw always succeeding.\\n            token.safeTransfer(to, amount);\\n        }\\n        emit LogWithdraw(token, from, to, amount, share);\\n        amountOut = amount;\\n        shareOut = share;\\n    }\\n\\n    /// @notice Transfer shares from a user account to another one.\\n    /// @param token The ERC-20 token to transfer.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param share The amount of `token` in shares.\\n    // Clones of master contracts can transfer from any account that has approved them\\n    // F3 - Can it be combined with another similar function?\\n    // F3: This isn't combined with transferMultiple for gas optimization\\n    function transfer(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 share\\n    ) public allowed(from) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        balanceOf[token][from] = balanceOf[token][from].sub(share);\\n        balanceOf[token][to] = balanceOf[token][to].add(share);\\n\\n        emit LogTransfer(token, from, to, share);\\n    }\\n\\n    /// @notice Transfer shares from a user account to multiple other ones.\\n    /// @param token The ERC-20 token to transfer.\\n    /// @param from which user to pull the tokens.\\n    /// @param tos The receivers of the tokens.\\n    /// @param shares The amount of `token` in shares for each receiver in `tos`.\\n    // F3 - Can it be combined with another similar function?\\n    // F3: This isn't combined with transfer for gas optimization\\n    function transferMultiple(\\n        IERC20 token,\\n        address from,\\n        address[] calldata tos,\\n        uint256[] calldata shares\\n    ) public allowed(from) {\\n        // Checks\\n        require(tos[0] != address(0), \\\"BentoBox: to[0] not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        uint256 totalAmount;\\n        uint256 len = tos.length;\\n        for (uint256 i = 0; i < len; i++) {\\n            address to = tos[i];\\n            balanceOf[token][to] = balanceOf[token][to].add(shares[i]);\\n            totalAmount = totalAmount.add(shares[i]);\\n            emit LogTransfer(token, from, to, shares[i]);\\n        }\\n        balanceOf[token][from] = balanceOf[token][from].sub(totalAmount);\\n    }\\n\\n    /// @notice Flashloan ability.\\n    /// @param borrower The address of the contract that implements and conforms to `IFlashBorrower` and handles the flashloan.\\n    /// @param receiver Address of the token receiver.\\n    /// @param token The address of the token to receive.\\n    /// @param amount of the tokens to receive.\\n    /// @param data The calldata to pass to the `borrower` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Not possible to follow this here, reentrancy has been reviewed\\n    // F6 - Check for front-running possibilities, such as the approve function (SWC-114)\\n    // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.\\n    function flashLoan(\\n        IFlashBorrower borrower,\\n        address receiver,\\n        IERC20 token,\\n        uint256 amount,\\n        bytes calldata data\\n    ) public {\\n        uint256 fee = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;\\n        token.safeTransfer(receiver, amount);\\n\\n        borrower.onFlashLoan(msg.sender, token, amount, fee, data);\\n\\n        require(_tokenBalanceOf(token) >= totals[token].addElastic(fee.to128()), \\\"BentoBox: Wrong amount\\\");\\n        emit LogFlashLoan(address(borrower), token, amount, fee, receiver);\\n    }\\n\\n    /// @notice Support for batched flashloans. Useful to request multiple different `tokens` in a single transaction.\\n    /// @param borrower The address of the contract that implements and conforms to `IBatchFlashBorrower` and handles the flashloan.\\n    /// @param receivers An array of the token receivers. A one-to-one mapping with `tokens` and `amounts`.\\n    /// @param tokens The addresses of the tokens.\\n    /// @param amounts of the tokens for each receiver.\\n    /// @param data The calldata to pass to the `borrower` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Not possible to follow this here, reentrancy has been reviewed\\n    // F6 - Check for front-running possibilities, such as the approve function (SWC-114)\\n    // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.\\n    function batchFlashLoan(\\n        IBatchFlashBorrower borrower,\\n        address[] calldata receivers,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        bytes calldata data\\n    ) public {\\n        uint256[] memory fees = new uint256[](tokens.length);\\n\\n        uint256 len = tokens.length;\\n        for (uint256 i = 0; i < len; i++) {\\n            uint256 amount = amounts[i];\\n            fees[i] = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;\\n\\n            tokens[i].safeTransfer(receivers[i], amounts[i]);\\n        }\\n\\n        borrower.onBatchFlashLoan(msg.sender, tokens, amounts, fees, data);\\n\\n        for (uint256 i = 0; i < len; i++) {\\n            IERC20 token = tokens[i];\\n            require(_tokenBalanceOf(token) >= totals[token].addElastic(fees[i].to128()), \\\"BentoBox: Wrong amount\\\");\\n            emit LogFlashLoan(address(borrower), token, amounts[i], fees[i], receivers[i]);\\n        }\\n    }\\n\\n    /// @notice Sets the target percentage of the strategy for `token`.\\n    /// @dev Only the owner of this contract is allowed to change this.\\n    /// @param token The address of the token that maps to a strategy to change.\\n    /// @param targetPercentage_ The new target in percent. Must be lesser or equal to `MAX_TARGET_PERCENTAGE`.\\n    function setStrategyTargetPercentage(IERC20 token, uint64 targetPercentage_) public onlyOwner {\\n        // Checks\\n        require(targetPercentage_ <= MAX_TARGET_PERCENTAGE, \\\"StrategyManager: Target too high\\\");\\n\\n        // Effects\\n        strategyData[token].targetPercentage = targetPercentage_;\\n        emit LogStrategyTargetPercentage(token, targetPercentage_);\\n    }\\n\\n    /// @notice Sets the contract address of a new strategy that conforms to `IStrategy` for `token`.\\n    /// Must be called twice with the same arguments.\\n    /// A new strategy becomes pending first and can be activated once `STRATEGY_DELAY` is over.\\n    /// @dev Only the owner of this contract is allowed to change this.\\n    /// @param token The address of the token that maps to a strategy to change.\\n    /// @param newStrategy The address of the contract that conforms to `IStrategy`.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Total amount is updated AFTER interaction. But strategy is under our control.\\n    // C4 - Use block.timestamp only for long intervals (SWC-116)\\n    // C4: block.timestamp is used for a period of 2 weeks, which is long enough\\n    function setStrategy(IERC20 token, IStrategy newStrategy) public onlyOwner {\\n        StrategyData memory data = strategyData[token];\\n        IStrategy pending = pendingStrategy[token];\\n        if (data.strategyStartDate == 0 || pending != newStrategy) {\\n            pendingStrategy[token] = newStrategy;\\n            // C1 - All math done through BoringMath (SWC-101)\\n            // C1: Our sun will swallow the earth well before this overflows\\n            data.strategyStartDate = (block.timestamp + STRATEGY_DELAY).to64();\\n            emit LogStrategyQueued(token, newStrategy);\\n        } else {\\n            require(data.strategyStartDate != 0 && block.timestamp >= data.strategyStartDate, \\\"StrategyManager: Too early\\\");\\n            if (address(strategy[token]) != address(0)) {\\n                int256 balanceChange = strategy[token].exit(data.balance);\\n                // Effects\\n                if (balanceChange > 0) {\\n                    uint256 add = uint256(balanceChange);\\n                    totals[token].addElastic(add);\\n                    emit LogStrategyProfit(token, add);\\n                } else if (balanceChange < 0) {\\n                    uint256 sub = uint256(-balanceChange);\\n                    totals[token].subElastic(sub);\\n                    emit LogStrategyLoss(token, sub);\\n                }\\n\\n                emit LogStrategyDivest(token, data.balance);\\n            }\\n            strategy[token] = pending;\\n            data.strategyStartDate = 0;\\n            data.balance = 0;\\n            pendingStrategy[token] = IStrategy(0);\\n            emit LogStrategySet(token, newStrategy);\\n        }\\n        strategyData[token] = data;\\n    }\\n\\n    /// @notice The actual process of yield farming. Executes the strategy of `token`.\\n    /// Optionally does housekeeping if `balance` is true.\\n    /// `maxChangeAmount` is relevant for skimming or withdrawing if `balance` is true.\\n    /// @param token The address of the token for which a strategy is deployed.\\n    /// @param balance True if housekeeping should be done.\\n    /// @param maxChangeAmount The maximum amount for either pulling or pushing from/to the `IStrategy` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Total amount is updated AFTER interaction. But strategy is under our control.\\n    // F5: Not followed to prevent reentrancy issues with flashloans and BentoBox skims?\\n    function harvest(\\n        IERC20 token,\\n        bool balance,\\n        uint256 maxChangeAmount\\n    ) public {\\n        StrategyData memory data = strategyData[token];\\n        IStrategy _strategy = strategy[token];\\n        int256 balanceChange = _strategy.harvest(data.balance, msg.sender);\\n        if (balanceChange == 0 && !balance) {\\n            return;\\n        }\\n\\n        uint256 totalElastic = totals[token].elastic;\\n\\n        if (balanceChange > 0) {\\n            uint256 add = uint256(balanceChange);\\n            totalElastic = totalElastic.add(add);\\n            totals[token].elastic = totalElastic.to128();\\n            emit LogStrategyProfit(token, add);\\n        } else if (balanceChange < 0) {\\n            // C1 - All math done through BoringMath (SWC-101)\\n            // C1: balanceChange could overflow if it's max negative int128.\\n            // But tokens with balances that large are not supported by the BentoBox.\\n            uint256 sub = uint256(-balanceChange);\\n            totalElastic = totalElastic.sub(sub);\\n            totals[token].elastic = totalElastic.to128();\\n            data.balance = data.balance.sub(sub.to128());\\n            emit LogStrategyLoss(token, sub);\\n        }\\n\\n        if (balance) {\\n            uint256 targetBalance = totalElastic.mul(data.targetPercentage) / 100;\\n            // if data.balance == targetBalance there is nothing to update\\n            if (data.balance < targetBalance) {\\n                uint256 amountOut = targetBalance.sub(data.balance);\\n                if (maxChangeAmount != 0 && amountOut > maxChangeAmount) {\\n                    amountOut = maxChangeAmount;\\n                }\\n                token.safeTransfer(address(_strategy), amountOut);\\n                data.balance = data.balance.add(amountOut.to128());\\n                _strategy.skim(amountOut);\\n                emit LogStrategyInvest(token, amountOut);\\n            } else if (data.balance > targetBalance) {\\n                uint256 amountIn = data.balance.sub(targetBalance.to128());\\n                if (maxChangeAmount != 0 && amountIn > maxChangeAmount) {\\n                    amountIn = maxChangeAmount;\\n                }\\n\\n                uint256 actualAmountIn = _strategy.withdraw(amountIn);\\n\\n                data.balance = data.balance.sub(actualAmountIn.to128());\\n                emit LogStrategyDivest(token, actualAmountIn);\\n            }\\n        }\\n\\n        strategyData[token] = data;\\n    }\\n\\n    // Contract should be able to receive ETH deposits to support deposit & skim\\n    // solhint-disable-next-line no-empty-blocks\\n    receive() external payable {}\\n}\\n\",\"keccak256\":\"0xf5251397b9aaa5c66ddc18b0cb96350ffac09f5776a1255fedc0072641f916fe\",\"license\":\"UNLICENSED\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {
              "exit(uint256)": {
                "notice": "Withdraw all assets in the safest way possible. This shouldn't fail."
              },
              "harvest(uint256,address)": {
                "notice": "Harvest any profits made converted to the asset and pass them to the caller."
              },
              "skim(uint256)": {
                "notice": "Send the assets to the Strategy and call skim to invest them."
              },
              "withdraw(uint256)": {
                "notice": "Withdraw assets. The returned amount can differ from the requested amount due to rounding."
              }
            },
            "version": 1
          }
        },
        "IWETH": {
          "abi": [
            {
              "inputs": [],
              "name": "deposit",
              "outputs": [],
              "stateMutability": "payable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "name": "withdraw",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {},
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "gasEstimates": null,
            "methodIdentifiers": {
              "deposit()": "d0e30db0",
              "withdraw(uint256)": "2e1a7d4d"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"deposit\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/bentobox/BentoBoxV1.sol\":\"IWETH\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/bentobox/BentoBoxV1.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\n// The BentoBox\\n\\n//  \\u2584\\u2584\\u2584\\u2584\\u00b7 \\u2584\\u2584\\u2584 . \\u2590 \\u2584 \\u2584\\u2584\\u2584\\u2584\\u2584      \\u2584\\u2584\\u2584\\u2584\\u00b7       \\u2590\\u2584\\u2022 \\u2584\\n//  \\u2590\\u2588 \\u2580\\u2588\\u25aa\\u2580\\u2584.\\u2580\\u00b7\\u2588\\u258c\\u2590\\u2588\\u2022\\u2588\\u2588  \\u25aa     \\u2590\\u2588 \\u2580\\u2588\\u25aa\\u25aa      \\u2588\\u258c\\u2588\\u258c\\u25aa\\n//  \\u2590\\u2588\\u2580\\u2580\\u2588\\u2584\\u2590\\u2580\\u2580\\u25aa\\u2584\\u2590\\u2588\\u2590\\u2590\\u258c \\u2590\\u2588.\\u25aa \\u2584\\u2588\\u2580\\u2584 \\u2590\\u2588\\u2580\\u2580\\u2588\\u2584 \\u2584\\u2588\\u2580\\u2584  \\u00b7\\u2588\\u2588\\u00b7\\n//  \\u2588\\u2588\\u2584\\u25aa\\u2590\\u2588\\u2590\\u2588\\u2584\\u2584\\u258c\\u2588\\u2588\\u2590\\u2588\\u258c \\u2590\\u2588\\u258c\\u00b7\\u2590\\u2588\\u258c.\\u2590\\u258c\\u2588\\u2588\\u2584\\u25aa\\u2590\\u2588\\u2590\\u2588\\u258c.\\u2590\\u258c\\u25aa\\u2590\\u2588\\u00b7\\u2588\\u258c\\n//  \\u00b7\\u2580\\u2580\\u2580\\u2580  \\u2580\\u2580\\u2580 \\u2580\\u2580 \\u2588\\u25aa \\u2580\\u2580\\u2580  \\u2580\\u2588\\u2584\\u2580\\u25aa\\u00b7\\u2580\\u2580\\u2580\\u2580  \\u2580\\u2588\\u2584\\u2580\\u25aa\\u2022\\u2580\\u2580 \\u2580\\u2580\\n\\n// This contract stores funds, handles their transfers, supports flash loans and strategies.\\n\\n// Copyright (c) 2021 BoringCrypto - All rights reserved\\n// Twitter: @Boring_Crypto\\n\\n// Special thanks to Keno for all his hard work and support\\n\\n// Version 22-Mar-2021\\n\\npragma solidity 0.6.12;\\npragma experimental ABIEncoderV2;\\n\\n// solhint-disable avoid-low-level-calls\\n// solhint-disable not-rely-on-time\\n// solhint-disable no-inline-assembly\\n\\n// File @boringcrypto/boring-solidity/contracts/interfaces/IERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ninterface IERC20 {\\n    function totalSupply() external view returns (uint256);\\n\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /// @notice EIP 2612\\n    function permit(\\n        address owner,\\n        address spender,\\n        uint256 value,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) external;\\n}\\n\\n// File contracts/interfaces/IFlashLoan.sol\\n// License-Identifier: MIT\\n\\ninterface IFlashBorrower {\\n    /// @notice The flashloan callback. `amount` + `fee` needs to repayed to msg.sender before this call returns.\\n    /// @param sender The address of the invoker of this flashloan.\\n    /// @param token The address of the token that is loaned.\\n    /// @param amount of the `token` that is loaned.\\n    /// @param fee The fee that needs to be paid on top for this loan. Needs to be the same as `token`.\\n    /// @param data Additional data that was passed to the flashloan function.\\n    function onFlashLoan(\\n        address sender,\\n        IERC20 token,\\n        uint256 amount,\\n        uint256 fee,\\n        bytes calldata data\\n    ) external;\\n}\\n\\ninterface IBatchFlashBorrower {\\n    /// @notice The callback for batched flashloans. Every amount + fee needs to repayed to msg.sender before this call returns.\\n    /// @param sender The address of the invoker of this flashloan.\\n    /// @param tokens Array of addresses for ERC-20 tokens that is loaned.\\n    /// @param amounts A one-to-one map to `tokens` that is loaned.\\n    /// @param fees A one-to-one map to `tokens` that needs to be paid on top for each loan. Needs to be the same token.\\n    /// @param data Additional data that was passed to the flashloan function.\\n    function onBatchFlashLoan(\\n        address sender,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        uint256[] calldata fees,\\n        bytes calldata data\\n    ) external;\\n}\\n\\n// File contracts/interfaces/IWETH.sol\\n// License-Identifier: MIT\\n\\ninterface IWETH {\\n    function deposit() external payable;\\n\\n    function withdraw(uint256) external;\\n}\\n\\n// File contracts/interfaces/IStrategy.sol\\n// License-Identifier: MIT\\n\\ninterface IStrategy {\\n    /// @notice Send the assets to the Strategy and call skim to invest them.\\n    /// @param amount The amount of tokens to invest.\\n    function skim(uint256 amount) external;\\n\\n    /// @notice Harvest any profits made converted to the asset and pass them to the caller.\\n    /// @param balance The amount of tokens the caller thinks it has invested.\\n    /// @param sender The address of the initiator of this transaction. Can be used for reimbursements, etc.\\n    /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.\\n    function harvest(uint256 balance, address sender) external returns (int256 amountAdded);\\n\\n    /// @notice Withdraw assets. The returned amount can differ from the requested amount due to rounding.\\n    /// @dev The `actualAmount` should be very close to the amount.\\n    /// The difference should NOT be used to report a loss. That's what harvest is for.\\n    /// @param amount The requested amount the caller wants to withdraw.\\n    /// @return actualAmount The real amount that is withdrawn.\\n    function withdraw(uint256 amount) external returns (uint256 actualAmount);\\n\\n    /// @notice Withdraw all assets in the safest way possible. This shouldn't fail.\\n    /// @param balance The amount of tokens the caller thinks it has invested.\\n    /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.\\n    function exit(uint256 balance) external returns (int256 amountAdded);\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\nlibrary BoringERC20 {\\n    bytes4 private constant SIG_SYMBOL = 0x95d89b41; // symbol()\\n    bytes4 private constant SIG_NAME = 0x06fdde03; // name()\\n    bytes4 private constant SIG_DECIMALS = 0x313ce567; // decimals()\\n    bytes4 private constant SIG_TRANSFER = 0xa9059cbb; // transfer(address,uint256)\\n    bytes4 private constant SIG_TRANSFER_FROM = 0x23b872dd; // transferFrom(address,address,uint256)\\n\\n    /// @notice Provides a safe ERC20.transfer version for different ERC-20 implementations.\\n    /// Reverts on a failed transfer.\\n    /// @param token The address of the ERC-20 token.\\n    /// @param to Transfer tokens to.\\n    /// @param amount The token amount.\\n    function safeTransfer(\\n        IERC20 token,\\n        address to,\\n        uint256 amount\\n    ) internal {\\n        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER, to, amount));\\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: Transfer failed\\\");\\n    }\\n\\n    /// @notice Provides a safe ERC20.transferFrom version for different ERC-20 implementations.\\n    /// Reverts on a failed transfer.\\n    /// @param token The address of the ERC-20 token.\\n    /// @param from Transfer tokens from.\\n    /// @param to Transfer tokens to.\\n    /// @param amount The token amount.\\n    function safeTransferFrom(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 amount\\n    ) internal {\\n        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER_FROM, from, to, amount));\\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: TransferFrom failed\\\");\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringMath.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n/// @notice A library for performing overflow-/underflow-safe math,\\n/// updated with awesomeness from of DappHub (https://github.com/dapphub/ds-math).\\nlibrary BoringMath {\\n    function add(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require(b == 0 || (c = a * b) / b == a, \\\"BoringMath: Mul Overflow\\\");\\n    }\\n\\n    function to128(uint256 a) internal pure returns (uint128 c) {\\n        require(a <= uint128(-1), \\\"BoringMath: uint128 Overflow\\\");\\n        c = uint128(a);\\n    }\\n\\n    function to64(uint256 a) internal pure returns (uint64 c) {\\n        require(a <= uint64(-1), \\\"BoringMath: uint64 Overflow\\\");\\n        c = uint64(a);\\n    }\\n\\n    function to32(uint256 a) internal pure returns (uint32 c) {\\n        require(a <= uint32(-1), \\\"BoringMath: uint32 Overflow\\\");\\n        c = uint32(a);\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint128.\\nlibrary BoringMath128 {\\n    function add(uint128 a, uint128 b) internal pure returns (uint128 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint128 a, uint128 b) internal pure returns (uint128 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint64.\\nlibrary BoringMath64 {\\n    function add(uint64 a, uint64 b) internal pure returns (uint64 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint64 a, uint64 b) internal pure returns (uint64 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint32.\\nlibrary BoringMath32 {\\n    function add(uint32 a, uint32 b) internal pure returns (uint32 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint32 a, uint32 b) internal pure returns (uint32 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringRebase.sol@v1.2.0\\n// License-Identifier: MIT\\n\\nstruct Rebase {\\n    uint128 elastic;\\n    uint128 base;\\n}\\n\\n/// @notice A rebasing library using overflow-/underflow-safe math.\\nlibrary RebaseLibrary {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n\\n    /// @notice Calculates the base value in relationship to `elastic` and `total`.\\n    function toBase(\\n        Rebase memory total,\\n        uint256 elastic,\\n        bool roundUp\\n    ) internal pure returns (uint256 base) {\\n        if (total.elastic == 0) {\\n            base = elastic;\\n        } else {\\n            base = elastic.mul(total.base) / total.elastic;\\n            if (roundUp && base.mul(total.elastic) / total.base < elastic) {\\n                base = base.add(1);\\n            }\\n        }\\n    }\\n\\n    /// @notice Calculates the elastic value in relationship to `base` and `total`.\\n    function toElastic(\\n        Rebase memory total,\\n        uint256 base,\\n        bool roundUp\\n    ) internal pure returns (uint256 elastic) {\\n        if (total.base == 0) {\\n            elastic = base;\\n        } else {\\n            elastic = base.mul(total.elastic) / total.base;\\n            if (roundUp && elastic.mul(total.base) / total.elastic < base) {\\n                elastic = elastic.add(1);\\n            }\\n        }\\n    }\\n\\n    /// @notice Add `elastic` to `total` and doubles `total.base`.\\n    /// @return (Rebase) The new total.\\n    /// @return base in relationship to `elastic`.\\n    function add(\\n        Rebase memory total,\\n        uint256 elastic,\\n        bool roundUp\\n    ) internal pure returns (Rebase memory, uint256 base) {\\n        base = toBase(total, elastic, roundUp);\\n        total.elastic = total.elastic.add(elastic.to128());\\n        total.base = total.base.add(base.to128());\\n        return (total, base);\\n    }\\n\\n    /// @notice Sub `base` from `total` and update `total.elastic`.\\n    /// @return (Rebase) The new total.\\n    /// @return elastic in relationship to `base`.\\n    function sub(\\n        Rebase memory total,\\n        uint256 base,\\n        bool roundUp\\n    ) internal pure returns (Rebase memory, uint256 elastic) {\\n        elastic = toElastic(total, base, roundUp);\\n        total.elastic = total.elastic.sub(elastic.to128());\\n        total.base = total.base.sub(base.to128());\\n        return (total, elastic);\\n    }\\n\\n    /// @notice Add `elastic` and `base` to `total`.\\n    function add(\\n        Rebase memory total,\\n        uint256 elastic,\\n        uint256 base\\n    ) internal pure returns (Rebase memory) {\\n        total.elastic = total.elastic.add(elastic.to128());\\n        total.base = total.base.add(base.to128());\\n        return total;\\n    }\\n\\n    /// @notice Subtract `elastic` and `base` to `total`.\\n    function sub(\\n        Rebase memory total,\\n        uint256 elastic,\\n        uint256 base\\n    ) internal pure returns (Rebase memory) {\\n        total.elastic = total.elastic.sub(elastic.to128());\\n        total.base = total.base.sub(base.to128());\\n        return total;\\n    }\\n\\n    /// @notice Add `elastic` to `total` and update storage.\\n    /// @return newElastic Returns updated `elastic`.\\n    function addElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {\\n        newElastic = total.elastic = total.elastic.add(elastic.to128());\\n    }\\n\\n    /// @notice Subtract `elastic` from `total` and update storage.\\n    /// @return newElastic Returns updated `elastic`.\\n    function subElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {\\n        newElastic = total.elastic = total.elastic.sub(elastic.to128());\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringOwnable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n// Source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol + Claimable.sol\\n// Edited by BoringCrypto\\n\\ncontract BoringOwnableData {\\n    address public owner;\\n    address public pendingOwner;\\n}\\n\\ncontract BoringOwnable is BoringOwnableData {\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /// @notice `owner` defaults to msg.sender on construction.\\n    constructor() public {\\n        owner = msg.sender;\\n        emit OwnershipTransferred(address(0), msg.sender);\\n    }\\n\\n    /// @notice Transfers ownership to `newOwner`. Either directly or claimable by the new pending owner.\\n    /// Can only be invoked by the current `owner`.\\n    /// @param newOwner Address of the new owner.\\n    /// @param direct True if `newOwner` should be set immediately. False if `newOwner` needs to use `claimOwnership`.\\n    /// @param renounce Allows the `newOwner` to be `address(0)` if `direct` and `renounce` is True. Has no effect otherwise.\\n    function transferOwnership(\\n        address newOwner,\\n        bool direct,\\n        bool renounce\\n    ) public onlyOwner {\\n        if (direct) {\\n            // Checks\\n            require(newOwner != address(0) || renounce, \\\"Ownable: zero address\\\");\\n\\n            // Effects\\n            emit OwnershipTransferred(owner, newOwner);\\n            owner = newOwner;\\n            pendingOwner = address(0);\\n        } else {\\n            // Effects\\n            pendingOwner = newOwner;\\n        }\\n    }\\n\\n    /// @notice Needs to be called by `pendingOwner` to claim ownership.\\n    function claimOwnership() public {\\n        address _pendingOwner = pendingOwner;\\n\\n        // Checks\\n        require(msg.sender == _pendingOwner, \\\"Ownable: caller != pending owner\\\");\\n\\n        // Effects\\n        emit OwnershipTransferred(owner, _pendingOwner);\\n        owner = _pendingOwner;\\n        pendingOwner = address(0);\\n    }\\n\\n    /// @notice Only allows the `owner` to execute the function.\\n    modifier onlyOwner() {\\n        require(msg.sender == owner, \\\"Ownable: caller is not the owner\\\");\\n        _;\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/interfaces/IMasterContract.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ninterface IMasterContract {\\n    /// @notice Init function that gets called from `BoringFactory.deploy`.\\n    /// Also kown as the constructor for cloned contracts.\\n    /// Any ETH send to `BoringFactory.deploy` ends up here.\\n    /// @param data Can be abi encoded arguments or anything else.\\n    function init(bytes calldata data) external payable;\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringFactory.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ncontract BoringFactory {\\n    event LogDeploy(address indexed masterContract, bytes data, address indexed cloneAddress);\\n\\n    /// @notice Mapping from clone contracts to their masterContract.\\n    mapping(address => address) public masterContractOf;\\n\\n    /// @notice Deploys a given master Contract as a clone.\\n    /// Any ETH transferred with this call is forwarded to the new clone.\\n    /// Emits `LogDeploy`.\\n    /// @param masterContract The address of the contract to clone.\\n    /// @param data Additional abi encoded calldata that is passed to the new clone via `IMasterContract.init`.\\n    /// @param useCreate2 Creates the clone by using the CREATE2 opcode, in this case `data` will be used as salt.\\n    /// @return cloneAddress Address of the created clone contract.\\n    function deploy(\\n        address masterContract,\\n        bytes calldata data,\\n        bool useCreate2\\n    ) public payable returns (address cloneAddress) {\\n        require(masterContract != address(0), \\\"BoringFactory: No masterContract\\\");\\n        bytes20 targetBytes = bytes20(masterContract); // Takes the first 20 bytes of the masterContract's address\\n\\n        if (useCreate2) {\\n            // each masterContract has different code already. So clones are distinguished by their data only.\\n            bytes32 salt = keccak256(data);\\n\\n            // Creates clone, more info here: https://blog.openzeppelin.com/deep-dive-into-the-minimal-proxy-contract/\\n            assembly {\\n                let clone := mload(0x40)\\n                mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n                mstore(add(clone, 0x14), targetBytes)\\n                mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n                cloneAddress := create2(0, clone, 0x37, salt)\\n            }\\n        } else {\\n            assembly {\\n                let clone := mload(0x40)\\n                mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n                mstore(add(clone, 0x14), targetBytes)\\n                mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n                cloneAddress := create(0, clone, 0x37)\\n            }\\n        }\\n        masterContractOf[cloneAddress] = masterContract;\\n\\n        IMasterContract(cloneAddress).init{value: msg.value}(data);\\n\\n        emit LogDeploy(masterContract, data, cloneAddress);\\n    }\\n}\\n\\n// File contracts/MasterContractManager.sol\\n// License-Identifier: UNLICENSED\\n\\ncontract MasterContractManager is BoringOwnable, BoringFactory {\\n    event LogWhiteListMasterContract(address indexed masterContract, bool approved);\\n    event LogSetMasterContractApproval(address indexed masterContract, address indexed user, bool approved);\\n    event LogRegisterProtocol(address indexed protocol);\\n\\n    /// @notice masterContract to user to approval state\\n    mapping(address => mapping(address => bool)) public masterContractApproved;\\n    /// @notice masterContract to whitelisted state for approval without signed message\\n    mapping(address => bool) public whitelistedMasterContracts;\\n    /// @notice user nonces for masterContract approvals\\n    mapping(address => uint256) public nonces;\\n\\n    bytes32 private constant DOMAIN_SEPARATOR_SIGNATURE_HASH = keccak256(\\\"EIP712Domain(string name,uint256 chainId,address verifyingContract)\\\");\\n    // See https://eips.ethereum.org/EIPS/eip-191\\n    string private constant EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA = \\\"\\\\x19\\\\x01\\\";\\n    bytes32 private constant APPROVAL_SIGNATURE_HASH =\\n        keccak256(\\\"SetMasterContractApproval(string warning,address user,address masterContract,bool approved,uint256 nonce)\\\");\\n\\n    // solhint-disable-next-line var-name-mixedcase\\n    bytes32 private immutable _DOMAIN_SEPARATOR;\\n    // solhint-disable-next-line var-name-mixedcase\\n    uint256 private immutable DOMAIN_SEPARATOR_CHAIN_ID;\\n\\n    constructor() public {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        _DOMAIN_SEPARATOR = _calculateDomainSeparator(DOMAIN_SEPARATOR_CHAIN_ID = chainId);\\n    }\\n\\n    function _calculateDomainSeparator(uint256 chainId) private view returns (bytes32) {\\n        return keccak256(abi.encode(DOMAIN_SEPARATOR_SIGNATURE_HASH, keccak256(\\\"BentoBox V1\\\"), chainId, address(this)));\\n    }\\n\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() public view returns (bytes32) {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        return chainId == DOMAIN_SEPARATOR_CHAIN_ID ? _DOMAIN_SEPARATOR : _calculateDomainSeparator(chainId);\\n    }\\n\\n    /// @notice Other contracts need to register with this master contract so that users can approve them for the BentoBox.\\n    function registerProtocol() public {\\n        masterContractOf[msg.sender] = msg.sender;\\n        emit LogRegisterProtocol(msg.sender);\\n    }\\n\\n    /// @notice Enables or disables a contract for approval without signed message.\\n    function whitelistMasterContract(address masterContract, bool approved) public onlyOwner {\\n        // Checks\\n        require(masterContract != address(0), \\\"MasterCMgr: Cannot approve 0\\\");\\n\\n        // Effects\\n        whitelistedMasterContracts[masterContract] = approved;\\n        emit LogWhiteListMasterContract(masterContract, approved);\\n    }\\n\\n    /// @notice Approves or revokes a `masterContract` access to `user` funds.\\n    /// @param user The address of the user that approves or revokes access.\\n    /// @param masterContract The address who gains or loses access.\\n    /// @param approved If True approves access. If False revokes access.\\n    /// @param v Part of the signature. (See EIP-191)\\n    /// @param r Part of the signature. (See EIP-191)\\n    /// @param s Part of the signature. (See EIP-191)\\n    // F4 - Check behaviour for all function arguments when wrong or extreme\\n    // F4: Don't allow masterContract 0 to be approved. Unknown contracts will have a masterContract of 0.\\n    // F4: User can't be 0 for signed approvals because the recoveredAddress will be 0 if ecrecover fails\\n    function setMasterContractApproval(\\n        address user,\\n        address masterContract,\\n        bool approved,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) public {\\n        // Checks\\n        require(masterContract != address(0), \\\"MasterCMgr: masterC not set\\\"); // Important for security\\n\\n        // If no signature is provided, the fallback is executed\\n        if (r == 0 && s == 0 && v == 0) {\\n            require(user == msg.sender, \\\"MasterCMgr: user not sender\\\");\\n            require(masterContractOf[user] == address(0), \\\"MasterCMgr: user is clone\\\");\\n            require(whitelistedMasterContracts[masterContract], \\\"MasterCMgr: not whitelisted\\\");\\n        } else {\\n            // Important for security - any address without masterContract has address(0) as masterContract\\n            // So approving address(0) would approve every address, leading to full loss of funds\\n            // Also, ecrecover returns address(0) on failure. So we check this:\\n            require(user != address(0), \\\"MasterCMgr: User cannot be 0\\\");\\n\\n            // C10 - Protect signatures against replay, use nonce and chainId (SWC-121)\\n            // C10: nonce + chainId are used to prevent replays\\n            // C11 - All signatures strictly EIP-712 (SWC-117 SWC-122)\\n            // C11: signature is EIP-712 compliant\\n            // C12 - abi.encodePacked can't contain variable length user input (SWC-133)\\n            // C12: abi.encodePacked has fixed length parameters\\n            bytes32 digest =\\n                keccak256(\\n                    abi.encodePacked(\\n                        EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA,\\n                        DOMAIN_SEPARATOR(),\\n                        keccak256(\\n                            abi.encode(\\n                                APPROVAL_SIGNATURE_HASH,\\n                                approved\\n                                    ? keccak256(\\\"Give FULL access to funds in (and approved to) BentoBox?\\\")\\n                                    : keccak256(\\\"Revoke access to BentoBox?\\\"),\\n                                user,\\n                                masterContract,\\n                                approved,\\n                                nonces[user]++\\n                            )\\n                        )\\n                    )\\n                );\\n            address recoveredAddress = ecrecover(digest, v, r, s);\\n            require(recoveredAddress == user, \\\"MasterCMgr: Invalid Signature\\\");\\n        }\\n\\n        // Effects\\n        masterContractApproved[masterContract][user] = approved;\\n        emit LogSetMasterContractApproval(masterContract, user, approved);\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringBatchable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ncontract BaseBoringBatchable {\\n    /// @dev Helper function to extract a useful revert message from a failed call.\\n    /// If the returned data is malformed or not correctly abi encoded then this call can fail itself.\\n    function _getRevertMsg(bytes memory _returnData) internal pure returns (string memory) {\\n        // If the _res length is less than 68, then the transaction failed silently (without a revert message)\\n        if (_returnData.length < 68) return \\\"Transaction reverted silently\\\";\\n\\n        assembly {\\n            // Slice the sighash.\\n            _returnData := add(_returnData, 0x04)\\n        }\\n        return abi.decode(_returnData, (string)); // All that remains is the revert string\\n    }\\n\\n    /// @notice Allows batched call to self (this contract).\\n    /// @param calls An array of inputs for each call.\\n    /// @param revertOnFail If True then reverts after a failed call and stops doing further calls.\\n    /// @return successes An array indicating the success of a call, mapped one-to-one to `calls`.\\n    /// @return results An array with the returned data of each function call, mapped one-to-one to `calls`.\\n    // F1: External is ok here because this is the batch function, adding it to a batch makes no sense\\n    // F2: Calls in the batch may be payable, delegatecall operates in the same context, so each call in the batch has access to msg.value\\n    // C3: The length of the loop is fully under user control, so can't be exploited\\n    // C7: Delegatecall is only used on the same contract, so it's safe\\n    function batch(bytes[] calldata calls, bool revertOnFail) external payable returns (bool[] memory successes, bytes[] memory results) {\\n        successes = new bool[](calls.length);\\n        results = new bytes[](calls.length);\\n        for (uint256 i = 0; i < calls.length; i++) {\\n            (bool success, bytes memory result) = address(this).delegatecall(calls[i]);\\n            require(success || !revertOnFail, _getRevertMsg(result));\\n            successes[i] = success;\\n            results[i] = result;\\n        }\\n    }\\n}\\n\\ncontract BoringBatchable is BaseBoringBatchable {\\n    /// @notice Call wrapper that performs `ERC20.permit` on `token`.\\n    /// Lookup `IERC20.permit`.\\n    // F6: Parameters can be used front-run the permit and the user's permit will fail (due to nonce or other revert)\\n    //     if part of a batch this could be used to grief once as the second call would not need the permit\\n    function permitToken(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) public {\\n        token.permit(from, to, amount, deadline, v, r, s);\\n    }\\n}\\n\\n// File contracts/BentoBox.sol\\n// License-Identifier: UNLICENSED\\n\\n/// @title BentoBox\\n/// @author BoringCrypto, Keno\\n/// @notice The BentoBox is a vault for tokens. The stored tokens can be flash loaned and used in strategies.\\n/// Yield from this will go to the token depositors.\\n/// Rebasing tokens ARE NOT supported and WILL cause loss of funds.\\n/// Any funds transfered directly onto the BentoBox will be lost, use the deposit function instead.\\ncontract BentoBoxV1 is MasterContractManager, BoringBatchable {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n    using BoringERC20 for IERC20;\\n    using RebaseLibrary for Rebase;\\n\\n    // ************** //\\n    // *** EVENTS *** //\\n    // ************** //\\n\\n    event LogDeposit(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogWithdraw(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogTransfer(IERC20 indexed token, address indexed from, address indexed to, uint256 share);\\n\\n    event LogFlashLoan(address indexed borrower, IERC20 indexed token, uint256 amount, uint256 feeAmount, address indexed receiver);\\n\\n    event LogStrategyTargetPercentage(IERC20 indexed token, uint256 targetPercentage);\\n    event LogStrategyQueued(IERC20 indexed token, IStrategy indexed strategy);\\n    event LogStrategySet(IERC20 indexed token, IStrategy indexed strategy);\\n    event LogStrategyInvest(IERC20 indexed token, uint256 amount);\\n    event LogStrategyDivest(IERC20 indexed token, uint256 amount);\\n    event LogStrategyProfit(IERC20 indexed token, uint256 amount);\\n    event LogStrategyLoss(IERC20 indexed token, uint256 amount);\\n\\n    // *************** //\\n    // *** STRUCTS *** //\\n    // *************** //\\n\\n    struct StrategyData {\\n        uint64 strategyStartDate;\\n        uint64 targetPercentage;\\n        uint128 balance; // the balance of the strategy that BentoBox thinks is in there\\n    }\\n\\n    // ******************************** //\\n    // *** CONSTANTS AND IMMUTABLES *** //\\n    // ******************************** //\\n\\n    // V2 - Can they be private?\\n    // V2: Private to save gas, to verify it's correct, check the constructor arguments\\n    IERC20 private immutable wethToken;\\n\\n    IERC20 private constant USE_ETHEREUM = IERC20(0);\\n    uint256 private constant FLASH_LOAN_FEE = 50; // 0.05%\\n    uint256 private constant FLASH_LOAN_FEE_PRECISION = 1e5;\\n    uint256 private constant STRATEGY_DELAY = 2 weeks;\\n    uint256 private constant MAX_TARGET_PERCENTAGE = 95; // 95%\\n    uint256 private constant MINIMUM_SHARE_BALANCE = 1000; // To prevent the ratio going off\\n\\n    // ***************** //\\n    // *** VARIABLES *** //\\n    // ***************** //\\n\\n    // Balance per token per address/contract in shares\\n    mapping(IERC20 => mapping(address => uint256)) public balanceOf;\\n\\n    // Rebase from amount to share\\n    mapping(IERC20 => Rebase) public totals;\\n\\n    mapping(IERC20 => IStrategy) public strategy;\\n    mapping(IERC20 => IStrategy) public pendingStrategy;\\n    mapping(IERC20 => StrategyData) public strategyData;\\n\\n    // ******************* //\\n    // *** CONSTRUCTOR *** //\\n    // ******************* //\\n\\n    constructor(IERC20 wethToken_) public {\\n        wethToken = wethToken_;\\n    }\\n\\n    // ***************** //\\n    // *** MODIFIERS *** //\\n    // ***************** //\\n\\n    /// Modifier to check if the msg.sender is allowed to use funds belonging to the 'from' address.\\n    /// If 'from' is msg.sender, it's allowed.\\n    /// If 'from' is the BentoBox itself, it's allowed. Any ETH, token balances (above the known balances) or BentoBox balances\\n    /// can be taken by anyone.\\n    /// This is to enable skimming, not just for deposits, but also for withdrawals or transfers, enabling better composability.\\n    /// If 'from' is a clone of a masterContract AND the 'from' address has approved that masterContract, it's allowed.\\n    modifier allowed(address from) {\\n        if (from != msg.sender && from != address(this)) {\\n            // From is sender or you are skimming\\n            address masterContract = masterContractOf[msg.sender];\\n            require(masterContract != address(0), \\\"BentoBox: no masterContract\\\");\\n            require(masterContractApproved[masterContract][from], \\\"BentoBox: Transfer not approved\\\");\\n        }\\n        _;\\n    }\\n\\n    // ************************** //\\n    // *** INTERNAL FUNCTIONS *** //\\n    // ************************** //\\n\\n    /// @dev Returns the total balance of `token` this contracts holds,\\n    /// plus the total amount this contract thinks the strategy holds.\\n    function _tokenBalanceOf(IERC20 token) internal view returns (uint256 amount) {\\n        amount = token.balanceOf(address(this)).add(strategyData[token].balance);\\n    }\\n\\n    // ************************ //\\n    // *** PUBLIC FUNCTIONS *** //\\n    // ************************ //\\n\\n    /// @dev Helper function to represent an `amount` of `token` in shares.\\n    /// @param token The ERC-20 token.\\n    /// @param amount The `token` amount.\\n    /// @param roundUp If the result `share` should be rounded up.\\n    /// @return share The token amount represented in shares.\\n    function toShare(\\n        IERC20 token,\\n        uint256 amount,\\n        bool roundUp\\n    ) external view returns (uint256 share) {\\n        share = totals[token].toBase(amount, roundUp);\\n    }\\n\\n    /// @dev Helper function represent shares back into the `token` amount.\\n    /// @param token The ERC-20 token.\\n    /// @param share The amount of shares.\\n    /// @param roundUp If the result should be rounded up.\\n    /// @return amount The share amount back into native representation.\\n    function toAmount(\\n        IERC20 token,\\n        uint256 share,\\n        bool roundUp\\n    ) external view returns (uint256 amount) {\\n        amount = totals[token].toElastic(share, roundUp);\\n    }\\n\\n    /// @notice Deposit an amount of `token` represented in either `amount` or `share`.\\n    /// @param token_ The ERC-20 token to deposit.\\n    /// @param from which account to pull the tokens.\\n    /// @param to which account to push the tokens.\\n    /// @param amount Token amount in native representation to deposit.\\n    /// @param share Token amount represented in shares to deposit. Takes precedence over `amount`.\\n    /// @return amountOut The amount deposited.\\n    /// @return shareOut The deposited amount repesented in shares.\\n    function deposit(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) public payable allowed(from) returns (uint256 amountOut, uint256 shareOut) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;\\n        Rebase memory total = totals[token];\\n\\n        // If a new token gets added, the tokenSupply call checks that this is a deployed contract. Needed for security.\\n        require(total.elastic != 0 || token.totalSupply() > 0, \\\"BentoBox: No tokens\\\");\\n        if (share == 0) {\\n            // value of the share may be lower than the amount due to rounding, that's ok\\n            share = total.toBase(amount, false);\\n            // Any deposit should lead to at least the minimum share balance, otherwise it's ignored (no amount taken)\\n            if (total.base.add(share.to128()) < MINIMUM_SHARE_BALANCE) {\\n                return (0, 0);\\n            }\\n        } else {\\n            // amount may be lower than the value of share due to rounding, in that case, add 1 to amount (Always round up)\\n            amount = total.toElastic(share, true);\\n        }\\n\\n        // In case of skimming, check that only the skimmable amount is taken.\\n        // For ETH, the full balance is available, so no need to check.\\n        // During flashloans the _tokenBalanceOf is lower than 'reality', so skimming deposits will mostly fail during a flashloan.\\n        require(\\n            from != address(this) || token_ == USE_ETHEREUM || amount <= _tokenBalanceOf(token).sub(total.elastic),\\n            \\\"BentoBox: Skim too much\\\"\\n        );\\n\\n        balanceOf[token][to] = balanceOf[token][to].add(share);\\n        total.base = total.base.add(share.to128());\\n        total.elastic = total.elastic.add(amount.to128());\\n        totals[token] = total;\\n\\n        // Interactions\\n        // During the first deposit, we check that this token is 'real'\\n        if (token_ == USE_ETHEREUM) {\\n            // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)\\n            // X2: If the WETH implementation is faulty or malicious, it will block adding ETH (but we know the WETH implementation)\\n            IWETH(address(wethToken)).deposit{value: amount}();\\n        } else if (from != address(this)) {\\n            // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)\\n            // X2: If the token implementation is faulty or malicious, it may block adding tokens. Good.\\n            token.safeTransferFrom(from, address(this), amount);\\n        }\\n        emit LogDeposit(token, from, to, amount, share);\\n        amountOut = amount;\\n        shareOut = share;\\n    }\\n\\n    /// @notice Withdraws an amount of `token` from a user account.\\n    /// @param token_ The ERC-20 token to withdraw.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param amount of tokens. Either one of `amount` or `share` needs to be supplied.\\n    /// @param share Like above, but `share` takes precedence over `amount`.\\n    function withdraw(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) public allowed(from) returns (uint256 amountOut, uint256 shareOut) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;\\n        Rebase memory total = totals[token];\\n        if (share == 0) {\\n            // value of the share paid could be lower than the amount paid due to rounding, in that case, add a share (Always round up)\\n            share = total.toBase(amount, true);\\n        } else {\\n            // amount may be lower than the value of share due to rounding, that's ok\\n            amount = total.toElastic(share, false);\\n        }\\n\\n        balanceOf[token][from] = balanceOf[token][from].sub(share);\\n        total.elastic = total.elastic.sub(amount.to128());\\n        total.base = total.base.sub(share.to128());\\n        // There have to be at least 1000 shares left to prevent reseting the share/amount ratio (unless it's fully emptied)\\n        require(total.base >= MINIMUM_SHARE_BALANCE || total.base == 0, \\\"BentoBox: cannot empty\\\");\\n        totals[token] = total;\\n\\n        // Interactions\\n        if (token_ == USE_ETHEREUM) {\\n            // X2, X3: A revert or big gas usage in the WETH contract could block withdrawals, but WETH9 is fine.\\n            IWETH(address(wethToken)).withdraw(amount);\\n            // X2, X3: A revert or big gas usage could block, however, the to address is under control of the caller.\\n            (bool success, ) = to.call{value: amount}(\\\"\\\");\\n            require(success, \\\"BentoBox: ETH transfer failed\\\");\\n        } else {\\n            // X2, X3: A malicious token could block withdrawal of just THAT token.\\n            //         masterContracts may want to take care not to rely on withdraw always succeeding.\\n            token.safeTransfer(to, amount);\\n        }\\n        emit LogWithdraw(token, from, to, amount, share);\\n        amountOut = amount;\\n        shareOut = share;\\n    }\\n\\n    /// @notice Transfer shares from a user account to another one.\\n    /// @param token The ERC-20 token to transfer.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param share The amount of `token` in shares.\\n    // Clones of master contracts can transfer from any account that has approved them\\n    // F3 - Can it be combined with another similar function?\\n    // F3: This isn't combined with transferMultiple for gas optimization\\n    function transfer(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 share\\n    ) public allowed(from) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        balanceOf[token][from] = balanceOf[token][from].sub(share);\\n        balanceOf[token][to] = balanceOf[token][to].add(share);\\n\\n        emit LogTransfer(token, from, to, share);\\n    }\\n\\n    /// @notice Transfer shares from a user account to multiple other ones.\\n    /// @param token The ERC-20 token to transfer.\\n    /// @param from which user to pull the tokens.\\n    /// @param tos The receivers of the tokens.\\n    /// @param shares The amount of `token` in shares for each receiver in `tos`.\\n    // F3 - Can it be combined with another similar function?\\n    // F3: This isn't combined with transfer for gas optimization\\n    function transferMultiple(\\n        IERC20 token,\\n        address from,\\n        address[] calldata tos,\\n        uint256[] calldata shares\\n    ) public allowed(from) {\\n        // Checks\\n        require(tos[0] != address(0), \\\"BentoBox: to[0] not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        uint256 totalAmount;\\n        uint256 len = tos.length;\\n        for (uint256 i = 0; i < len; i++) {\\n            address to = tos[i];\\n            balanceOf[token][to] = balanceOf[token][to].add(shares[i]);\\n            totalAmount = totalAmount.add(shares[i]);\\n            emit LogTransfer(token, from, to, shares[i]);\\n        }\\n        balanceOf[token][from] = balanceOf[token][from].sub(totalAmount);\\n    }\\n\\n    /// @notice Flashloan ability.\\n    /// @param borrower The address of the contract that implements and conforms to `IFlashBorrower` and handles the flashloan.\\n    /// @param receiver Address of the token receiver.\\n    /// @param token The address of the token to receive.\\n    /// @param amount of the tokens to receive.\\n    /// @param data The calldata to pass to the `borrower` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Not possible to follow this here, reentrancy has been reviewed\\n    // F6 - Check for front-running possibilities, such as the approve function (SWC-114)\\n    // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.\\n    function flashLoan(\\n        IFlashBorrower borrower,\\n        address receiver,\\n        IERC20 token,\\n        uint256 amount,\\n        bytes calldata data\\n    ) public {\\n        uint256 fee = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;\\n        token.safeTransfer(receiver, amount);\\n\\n        borrower.onFlashLoan(msg.sender, token, amount, fee, data);\\n\\n        require(_tokenBalanceOf(token) >= totals[token].addElastic(fee.to128()), \\\"BentoBox: Wrong amount\\\");\\n        emit LogFlashLoan(address(borrower), token, amount, fee, receiver);\\n    }\\n\\n    /// @notice Support for batched flashloans. Useful to request multiple different `tokens` in a single transaction.\\n    /// @param borrower The address of the contract that implements and conforms to `IBatchFlashBorrower` and handles the flashloan.\\n    /// @param receivers An array of the token receivers. A one-to-one mapping with `tokens` and `amounts`.\\n    /// @param tokens The addresses of the tokens.\\n    /// @param amounts of the tokens for each receiver.\\n    /// @param data The calldata to pass to the `borrower` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Not possible to follow this here, reentrancy has been reviewed\\n    // F6 - Check for front-running possibilities, such as the approve function (SWC-114)\\n    // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.\\n    function batchFlashLoan(\\n        IBatchFlashBorrower borrower,\\n        address[] calldata receivers,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        bytes calldata data\\n    ) public {\\n        uint256[] memory fees = new uint256[](tokens.length);\\n\\n        uint256 len = tokens.length;\\n        for (uint256 i = 0; i < len; i++) {\\n            uint256 amount = amounts[i];\\n            fees[i] = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;\\n\\n            tokens[i].safeTransfer(receivers[i], amounts[i]);\\n        }\\n\\n        borrower.onBatchFlashLoan(msg.sender, tokens, amounts, fees, data);\\n\\n        for (uint256 i = 0; i < len; i++) {\\n            IERC20 token = tokens[i];\\n            require(_tokenBalanceOf(token) >= totals[token].addElastic(fees[i].to128()), \\\"BentoBox: Wrong amount\\\");\\n            emit LogFlashLoan(address(borrower), token, amounts[i], fees[i], receivers[i]);\\n        }\\n    }\\n\\n    /// @notice Sets the target percentage of the strategy for `token`.\\n    /// @dev Only the owner of this contract is allowed to change this.\\n    /// @param token The address of the token that maps to a strategy to change.\\n    /// @param targetPercentage_ The new target in percent. Must be lesser or equal to `MAX_TARGET_PERCENTAGE`.\\n    function setStrategyTargetPercentage(IERC20 token, uint64 targetPercentage_) public onlyOwner {\\n        // Checks\\n        require(targetPercentage_ <= MAX_TARGET_PERCENTAGE, \\\"StrategyManager: Target too high\\\");\\n\\n        // Effects\\n        strategyData[token].targetPercentage = targetPercentage_;\\n        emit LogStrategyTargetPercentage(token, targetPercentage_);\\n    }\\n\\n    /// @notice Sets the contract address of a new strategy that conforms to `IStrategy` for `token`.\\n    /// Must be called twice with the same arguments.\\n    /// A new strategy becomes pending first and can be activated once `STRATEGY_DELAY` is over.\\n    /// @dev Only the owner of this contract is allowed to change this.\\n    /// @param token The address of the token that maps to a strategy to change.\\n    /// @param newStrategy The address of the contract that conforms to `IStrategy`.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Total amount is updated AFTER interaction. But strategy is under our control.\\n    // C4 - Use block.timestamp only for long intervals (SWC-116)\\n    // C4: block.timestamp is used for a period of 2 weeks, which is long enough\\n    function setStrategy(IERC20 token, IStrategy newStrategy) public onlyOwner {\\n        StrategyData memory data = strategyData[token];\\n        IStrategy pending = pendingStrategy[token];\\n        if (data.strategyStartDate == 0 || pending != newStrategy) {\\n            pendingStrategy[token] = newStrategy;\\n            // C1 - All math done through BoringMath (SWC-101)\\n            // C1: Our sun will swallow the earth well before this overflows\\n            data.strategyStartDate = (block.timestamp + STRATEGY_DELAY).to64();\\n            emit LogStrategyQueued(token, newStrategy);\\n        } else {\\n            require(data.strategyStartDate != 0 && block.timestamp >= data.strategyStartDate, \\\"StrategyManager: Too early\\\");\\n            if (address(strategy[token]) != address(0)) {\\n                int256 balanceChange = strategy[token].exit(data.balance);\\n                // Effects\\n                if (balanceChange > 0) {\\n                    uint256 add = uint256(balanceChange);\\n                    totals[token].addElastic(add);\\n                    emit LogStrategyProfit(token, add);\\n                } else if (balanceChange < 0) {\\n                    uint256 sub = uint256(-balanceChange);\\n                    totals[token].subElastic(sub);\\n                    emit LogStrategyLoss(token, sub);\\n                }\\n\\n                emit LogStrategyDivest(token, data.balance);\\n            }\\n            strategy[token] = pending;\\n            data.strategyStartDate = 0;\\n            data.balance = 0;\\n            pendingStrategy[token] = IStrategy(0);\\n            emit LogStrategySet(token, newStrategy);\\n        }\\n        strategyData[token] = data;\\n    }\\n\\n    /// @notice The actual process of yield farming. Executes the strategy of `token`.\\n    /// Optionally does housekeeping if `balance` is true.\\n    /// `maxChangeAmount` is relevant for skimming or withdrawing if `balance` is true.\\n    /// @param token The address of the token for which a strategy is deployed.\\n    /// @param balance True if housekeeping should be done.\\n    /// @param maxChangeAmount The maximum amount for either pulling or pushing from/to the `IStrategy` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Total amount is updated AFTER interaction. But strategy is under our control.\\n    // F5: Not followed to prevent reentrancy issues with flashloans and BentoBox skims?\\n    function harvest(\\n        IERC20 token,\\n        bool balance,\\n        uint256 maxChangeAmount\\n    ) public {\\n        StrategyData memory data = strategyData[token];\\n        IStrategy _strategy = strategy[token];\\n        int256 balanceChange = _strategy.harvest(data.balance, msg.sender);\\n        if (balanceChange == 0 && !balance) {\\n            return;\\n        }\\n\\n        uint256 totalElastic = totals[token].elastic;\\n\\n        if (balanceChange > 0) {\\n            uint256 add = uint256(balanceChange);\\n            totalElastic = totalElastic.add(add);\\n            totals[token].elastic = totalElastic.to128();\\n            emit LogStrategyProfit(token, add);\\n        } else if (balanceChange < 0) {\\n            // C1 - All math done through BoringMath (SWC-101)\\n            // C1: balanceChange could overflow if it's max negative int128.\\n            // But tokens with balances that large are not supported by the BentoBox.\\n            uint256 sub = uint256(-balanceChange);\\n            totalElastic = totalElastic.sub(sub);\\n            totals[token].elastic = totalElastic.to128();\\n            data.balance = data.balance.sub(sub.to128());\\n            emit LogStrategyLoss(token, sub);\\n        }\\n\\n        if (balance) {\\n            uint256 targetBalance = totalElastic.mul(data.targetPercentage) / 100;\\n            // if data.balance == targetBalance there is nothing to update\\n            if (data.balance < targetBalance) {\\n                uint256 amountOut = targetBalance.sub(data.balance);\\n                if (maxChangeAmount != 0 && amountOut > maxChangeAmount) {\\n                    amountOut = maxChangeAmount;\\n                }\\n                token.safeTransfer(address(_strategy), amountOut);\\n                data.balance = data.balance.add(amountOut.to128());\\n                _strategy.skim(amountOut);\\n                emit LogStrategyInvest(token, amountOut);\\n            } else if (data.balance > targetBalance) {\\n                uint256 amountIn = data.balance.sub(targetBalance.to128());\\n                if (maxChangeAmount != 0 && amountIn > maxChangeAmount) {\\n                    amountIn = maxChangeAmount;\\n                }\\n\\n                uint256 actualAmountIn = _strategy.withdraw(amountIn);\\n\\n                data.balance = data.balance.sub(actualAmountIn.to128());\\n                emit LogStrategyDivest(token, actualAmountIn);\\n            }\\n        }\\n\\n        strategyData[token] = data;\\n    }\\n\\n    // Contract should be able to receive ETH deposits to support deposit & skim\\n    // solhint-disable-next-line no-empty-blocks\\n    receive() external payable {}\\n}\\n\",\"keccak256\":\"0xf5251397b9aaa5c66ddc18b0cb96350ffac09f5776a1255fedc0072641f916fe\",\"license\":\"UNLICENSED\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        },
        "MasterContractManager": {
          "abi": [
            {
              "inputs": [],
              "stateMutability": "nonpayable",
              "type": "constructor"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "masterContract",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "bytes",
                  "name": "data",
                  "type": "bytes"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "cloneAddress",
                  "type": "address"
                }
              ],
              "name": "LogDeploy",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "protocol",
                  "type": "address"
                }
              ],
              "name": "LogRegisterProtocol",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "masterContract",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "user",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "bool",
                  "name": "approved",
                  "type": "bool"
                }
              ],
              "name": "LogSetMasterContractApproval",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "masterContract",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "bool",
                  "name": "approved",
                  "type": "bool"
                }
              ],
              "name": "LogWhiteListMasterContract",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "previousOwner",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "newOwner",
                  "type": "address"
                }
              ],
              "name": "OwnershipTransferred",
              "type": "event"
            },
            {
              "inputs": [],
              "name": "DOMAIN_SEPARATOR",
              "outputs": [
                {
                  "internalType": "bytes32",
                  "name": "",
                  "type": "bytes32"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "claimOwnership",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "masterContract",
                  "type": "address"
                },
                {
                  "internalType": "bytes",
                  "name": "data",
                  "type": "bytes"
                },
                {
                  "internalType": "bool",
                  "name": "useCreate2",
                  "type": "bool"
                }
              ],
              "name": "deploy",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "cloneAddress",
                  "type": "address"
                }
              ],
              "stateMutability": "payable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "name": "masterContractApproved",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "name": "masterContractOf",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "name": "nonces",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "owner",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "pendingOwner",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "registerProtocol",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "user",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "masterContract",
                  "type": "address"
                },
                {
                  "internalType": "bool",
                  "name": "approved",
                  "type": "bool"
                },
                {
                  "internalType": "uint8",
                  "name": "v",
                  "type": "uint8"
                },
                {
                  "internalType": "bytes32",
                  "name": "r",
                  "type": "bytes32"
                },
                {
                  "internalType": "bytes32",
                  "name": "s",
                  "type": "bytes32"
                }
              ],
              "name": "setMasterContractApproval",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "newOwner",
                  "type": "address"
                },
                {
                  "internalType": "bool",
                  "name": "direct",
                  "type": "bool"
                },
                {
                  "internalType": "bool",
                  "name": "renounce",
                  "type": "bool"
                }
              ],
              "name": "transferOwnership",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "masterContract",
                  "type": "address"
                },
                {
                  "internalType": "bool",
                  "name": "approved",
                  "type": "bool"
                }
              ],
              "name": "whitelistMasterContract",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "name": "whitelistedMasterContracts",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {
              "deploy(address,bytes,bool)": {
                "params": {
                  "data": "Additional abi encoded calldata that is passed to the new clone via `IMasterContract.init`.",
                  "masterContract": "The address of the contract to clone.",
                  "useCreate2": "Creates the clone by using the CREATE2 opcode, in this case `data` will be used as salt."
                },
                "returns": {
                  "cloneAddress": "Address of the created clone contract."
                }
              },
              "setMasterContractApproval(address,address,bool,uint8,bytes32,bytes32)": {
                "params": {
                  "approved": "If True approves access. If False revokes access.",
                  "masterContract": "The address who gains or loses access.",
                  "r": "Part of the signature. (See EIP-191)",
                  "s": "Part of the signature. (See EIP-191)",
                  "user": "The address of the user that approves or revokes access.",
                  "v": "Part of the signature. (See EIP-191)"
                }
              },
              "transferOwnership(address,bool,bool)": {
                "params": {
                  "direct": "True if `newOwner` should be set immediately. False if `newOwner` needs to use `claimOwnership`.",
                  "newOwner": "Address of the new owner.",
                  "renounce": "Allows the `newOwner` to be `address(0)` if `direct` and `renounce` is True. Has no effect otherwise."
                }
              }
            },
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "60c060405234801561001057600080fd5b50600080546001600160a01b0319163390811782556040519091907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a34660a081905261005f81610068565b60805250610102565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8667fd7df266aff736d415a9dc14b4158201d612e70d75b9c7f4e375ccfd20aa5166f83306040516020016100c194939291906100de565b604051602081830303815290604052805190602001209050919050565b938452602084019290925260408301526001600160a01b0316606082015260800190565b60805160a0516110986101256000398061051a52508061054f52506110986000f3fe6080604052600436106100c25760003560e01c80637ecebe001161007f578063aee4d1b211610059578063aee4d1b2146101eb578063bafe4f1414610200578063c0a47c9314610220578063e30c397814610240576100c2565b80637ecebe00146101965780638da5cb5b146101b657806391e0eab5146101cb576100c2565b8063078dfbe7146100c757806312a90c8a146100e95780631f54245b1461011f5780633644e5151461013f5780634e71e0c814610161578063733a9d7c14610176575b600080fd5b3480156100d357600080fd5b506100e76100e2366004610c06565b610255565b005b3480156100f557600080fd5b50610109610104366004610b16565b610344565b6040516101169190610d49565b60405180910390f35b61013261012d366004610c4f565b610359565b6040516101169190610d35565b34801561014b57600080fd5b50610154610515565b6040516101169190610d54565b34801561016d57600080fd5b506100e7610575565b34801561018257600080fd5b506100e7610191366004610bdb565b610602565b3480156101a257600080fd5b506101546101b1366004610b16565b6106b2565b3480156101c257600080fd5b506101326106c4565b3480156101d757600080fd5b506101096101e6366004610b38565b6106d3565b3480156101f757600080fd5b506100e76106f3565b34801561020c57600080fd5b5061013261021b366004610b16565b61073a565b34801561022c57600080fd5b506100e761023b366004610b6c565b610755565b34801561024c57600080fd5b50610132610a64565b6000546001600160a01b031633146102885760405162461bcd60e51b815260040161027f90610e9f565b60405180910390fd5b8115610323576001600160a01b0383161515806102a25750805b6102be5760405162461bcd60e51b815260040161027f90610e70565b600080546040516001600160a01b03808716939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0385166001600160a01b03199182161790915560018054909116905561033f565b600180546001600160a01b0319166001600160a01b0385161790555b505050565b60046020526000908152604090205460ff1681565b60006001600160a01b0385166103815760405162461bcd60e51b815260040161027f90610f77565b606085901b82156103f3576000858560405161039e929190610ce1565b60405180910390209050604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81528260148201526e5af43d82803e903d91602b57fd5bf360881b6028820152816037826000f593505050610438565b604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81528160148201526e5af43d82803e903d91602b57fd5bf360881b60288201526037816000f09250505b6001600160a01b038281166000818152600260205260409081902080546001600160a01b031916938a16939093179092559051631377d1f560e21b8152634ddf47d490349061048d9089908990600401610dd3565b6000604051808303818588803b1580156104a657600080fd5b505af11580156104ba573d6000803e3d6000fd5b5050505050816001600160a01b0316866001600160a01b03167fd62166f3c2149208e51788b1401cc356bf5da1fc6c7886a32e18570f57d88b3b8787604051610504929190610dd3565b60405180910390a350949350505050565b6000467f0000000000000000000000000000000000000000000000000000000000000000811461054d5761054881610a73565b61056f565b7f00000000000000000000000000000000000000000000000000000000000000005b91505090565b6001546001600160a01b03163381146105a05760405162461bcd60e51b815260040161027f90610ed4565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b039092166001600160a01b0319928316179055600180549091169055565b6000546001600160a01b0316331461062c5760405162461bcd60e51b815260040161027f90610e9f565b6001600160a01b0382166106525760405162461bcd60e51b815260040161027f90610e02565b6001600160a01b03821660008181526004602052604090819020805460ff1916841515179055517f31a1e0eac44b54ac6c2a2efa87e92c83405ffcf33fceef02a7bca695130e2600906106a6908490610d49565b60405180910390a25050565b60056020526000908152604090205481565b6000546001600160a01b031681565b600360209081526000928352604080842090915290825290205460ff1681565b3360008181526002602052604080822080546001600160a01b03191684179055517fdfb44ffabf0d3a8f650d3ce43eff98f6d050e7ea1a396d5794f014e7dadabacb9190a2565b6002602052600090815260409020546001600160a01b031681565b6001600160a01b03851661077b5760405162461bcd60e51b815260040161027f90610fac565b81158015610787575080155b8015610794575060ff8316155b15610836576001600160a01b03861633146107c15760405162461bcd60e51b815260040161027f90610e39565b6001600160a01b0386811660009081526002602052604090205416156107f95760405162461bcd60e51b815260040161027f90610f09565b6001600160a01b03851660009081526004602052604090205460ff166108315760405162461bcd60e51b815260040161027f9061101a565b6109f0565b6001600160a01b03861661085c5760405162461bcd60e51b815260040161027f90610fe3565b600060405180604001604052806002815260200161190160f01b815250610881610515565b7f1962bc9f5484cb7a998701b81090e966ee1fce5771af884cceee7c081b14ade2876108cd577fb426802f1f7dc850a7b6b38805edea2442f3992878a9ab985abfe8091d95d0b16108ef565b7f422ac5323fe049241dee67716229a1cc1bc7b313b23dfe3ef6d42ab177a3b2845b6001600160a01b038b1660009081526005602090815260409182902080546001810190915591516109299493928e928e928e929101610d5d565b6040516020818303038152906040528051906020012060405160200161095193929190610cf1565b60405160208183030381529060405280519060200120905060006001828686866040516000815260200160405260405161098e9493929190610db5565b6020604051602081039080840390855afa1580156109b0573d6000803e3d6000fd5b505050602060405103519050876001600160a01b0316816001600160a01b0316146109ed5760405162461bcd60e51b815260040161027f90610f40565b50505b6001600160a01b038581166000818152600360209081526040808320948b168084529490915290819020805460ff1916881515179055517f5f6ebb64ba012a851c6f014e6cad458ddf213d1512049b31cd06365c2b05925790610a54908890610d49565b60405180910390a3505050505050565b6001546001600160a01b031681565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8667fd7df266aff736d415a9dc14b4158201d612e70d75b9c7f4e375ccfd20aa5166f8330604051602001610acc9493929190610d91565b604051602081830303815290604052805190602001209050919050565b80356001600160a01b0381168114610b0057600080fd5b92915050565b80358015158114610b0057600080fd5b600060208284031215610b27578081fd5b610b318383610ae9565b9392505050565b60008060408385031215610b4a578081fd5b610b548484610ae9565b9150610b638460208501610ae9565b90509250929050565b60008060008060008060c08789031215610b84578182fd5b610b8e8888610ae9565b9550610b9d8860208901610ae9565b9450610bac8860408901610b06565b9350606087013560ff81168114610bc1578283fd5b9598949750929560808101359460a0909101359350915050565b60008060408385031215610bed578182fd5b610bf78484610ae9565b9150610b638460208501610b06565b600080600060608486031215610c1a578283fd5b610c248585610ae9565b92506020840135610c3481611051565b91506040840135610c4481611051565b809150509250925092565b60008060008060608587031215610c64578384fd5b610c6e8686610ae9565b9350602085013567ffffffffffffffff80821115610c8a578485fd5b818701915087601f830112610c9d578485fd5b813581811115610cab578586fd5b886020828501011115610cbc578586fd5b6020830195508094505050506040850135610cd681611051565b939692955090935050565b6000828483379101908152919050565b60008451815b81811015610d115760208188018101518583015201610cf7565b81811115610d1f5782828501525b5091909101928352506020820152604001919050565b6001600160a01b0391909116815260200190565b901515815260200190565b90815260200190565b95865260208601949094526001600160a01b039283166040860152911660608401521515608083015260a082015260c00190565b938452602084019290925260408301526001600160a01b0316606082015260800190565b93845260ff9290921660208401526040830152606082015260800190565b60006020825282602083015282846040840137818301604090810191909152601f909201601f19160101919050565b6020808252601c908201527f4d6173746572434d67723a2043616e6e6f7420617070726f7665203000000000604082015260600190565b6020808252601b908201527f4d6173746572434d67723a2075736572206e6f742073656e6465720000000000604082015260600190565b6020808252601590820152744f776e61626c653a207a65726f206164647265737360581b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c657220213d2070656e64696e67206f776e6572604082015260600190565b60208082526019908201527f4d6173746572434d67723a207573657220697320636c6f6e6500000000000000604082015260600190565b6020808252601d908201527f4d6173746572434d67723a20496e76616c6964205369676e6174757265000000604082015260600190565b6020808252818101527f426f72696e67466163746f72793a204e6f206d6173746572436f6e7472616374604082015260600190565b6020808252601b908201527f4d6173746572434d67723a206d617374657243206e6f74207365740000000000604082015260600190565b6020808252601c908201527f4d6173746572434d67723a20557365722063616e6e6f74206265203000000000604082015260600190565b6020808252601b908201527f4d6173746572434d67723a206e6f742077686974656c69737465640000000000604082015260600190565b801515811461105f57600080fd5b5056fea2646970667358221220c51028466b6fc0910cd7e359a95741724bc5d02b6ffcbb60e27b44a80dafd2e264736f6c634300060c0033",
              "opcodes": "PUSH1 0xC0 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND CALLER SWAP1 DUP2 OR DUP3 SSTORE PUSH1 0x40 MLOAD SWAP1 SWAP2 SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP3 SWAP1 LOG3 CHAINID PUSH1 0xA0 DUP2 SWAP1 MSTORE PUSH2 0x5F DUP2 PUSH2 0x68 JUMP JUMPDEST PUSH1 0x80 MSTORE POP PUSH2 0x102 JUMP JUMPDEST PUSH1 0x0 PUSH32 0x8CAD95687BA82C2CE50E74F7B754645E5117C3A5BEC8151C0726D5857980A866 PUSH32 0xD7DF266AFF736D415A9DC14B4158201D612E70D75B9C7F4E375CCFD20AA5166F DUP4 ADDRESS PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0xC1 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0xDE JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST SWAP4 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x80 MLOAD PUSH1 0xA0 MLOAD PUSH2 0x1098 PUSH2 0x125 PUSH1 0x0 CODECOPY DUP1 PUSH2 0x51A MSTORE POP DUP1 PUSH2 0x54F MSTORE POP PUSH2 0x1098 PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xC2 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x7ECEBE00 GT PUSH2 0x7F JUMPI DUP1 PUSH4 0xAEE4D1B2 GT PUSH2 0x59 JUMPI DUP1 PUSH4 0xAEE4D1B2 EQ PUSH2 0x1EB JUMPI DUP1 PUSH4 0xBAFE4F14 EQ PUSH2 0x200 JUMPI DUP1 PUSH4 0xC0A47C93 EQ PUSH2 0x220 JUMPI DUP1 PUSH4 0xE30C3978 EQ PUSH2 0x240 JUMPI PUSH2 0xC2 JUMP JUMPDEST DUP1 PUSH4 0x7ECEBE00 EQ PUSH2 0x196 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x1B6 JUMPI DUP1 PUSH4 0x91E0EAB5 EQ PUSH2 0x1CB JUMPI PUSH2 0xC2 JUMP JUMPDEST DUP1 PUSH4 0x78DFBE7 EQ PUSH2 0xC7 JUMPI DUP1 PUSH4 0x12A90C8A EQ PUSH2 0xE9 JUMPI DUP1 PUSH4 0x1F54245B EQ PUSH2 0x11F JUMPI DUP1 PUSH4 0x3644E515 EQ PUSH2 0x13F JUMPI DUP1 PUSH4 0x4E71E0C8 EQ PUSH2 0x161 JUMPI DUP1 PUSH4 0x733A9D7C EQ PUSH2 0x176 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xD3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xE7 PUSH2 0xE2 CALLDATASIZE PUSH1 0x4 PUSH2 0xC06 JUMP JUMPDEST PUSH2 0x255 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xF5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x109 PUSH2 0x104 CALLDATASIZE PUSH1 0x4 PUSH2 0xB16 JUMP JUMPDEST PUSH2 0x344 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x116 SWAP2 SWAP1 PUSH2 0xD49 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x132 PUSH2 0x12D CALLDATASIZE PUSH1 0x4 PUSH2 0xC4F JUMP JUMPDEST PUSH2 0x359 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x116 SWAP2 SWAP1 PUSH2 0xD35 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x14B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x154 PUSH2 0x515 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x116 SWAP2 SWAP1 PUSH2 0xD54 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x16D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xE7 PUSH2 0x575 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x182 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xE7 PUSH2 0x191 CALLDATASIZE PUSH1 0x4 PUSH2 0xBDB JUMP JUMPDEST PUSH2 0x602 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1A2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x154 PUSH2 0x1B1 CALLDATASIZE PUSH1 0x4 PUSH2 0xB16 JUMP JUMPDEST PUSH2 0x6B2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1C2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x132 PUSH2 0x6C4 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1D7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x109 PUSH2 0x1E6 CALLDATASIZE PUSH1 0x4 PUSH2 0xB38 JUMP JUMPDEST PUSH2 0x6D3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1F7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xE7 PUSH2 0x6F3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x20C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x132 PUSH2 0x21B CALLDATASIZE PUSH1 0x4 PUSH2 0xB16 JUMP JUMPDEST PUSH2 0x73A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x22C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xE7 PUSH2 0x23B CALLDATASIZE PUSH1 0x4 PUSH2 0xB6C JUMP JUMPDEST PUSH2 0x755 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x24C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x132 PUSH2 0xA64 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0x288 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x27F SWAP1 PUSH2 0xE9F JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP2 ISZERO PUSH2 0x323 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND ISZERO ISZERO DUP1 PUSH2 0x2A2 JUMPI POP DUP1 JUMPDEST PUSH2 0x2BE JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x27F SWAP1 PUSH2 0xE70 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP8 AND SWAP4 SWAP3 AND SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 LOG3 PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP2 DUP3 AND OR SWAP1 SWAP2 SSTORE PUSH1 0x1 DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SSTORE PUSH2 0x33F JUMP JUMPDEST PUSH1 0x1 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND OR SWAP1 SSTORE JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x4 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH2 0x381 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x27F SWAP1 PUSH2 0xF77 JUMP JUMPDEST PUSH1 0x60 DUP6 SWAP1 SHL DUP3 ISZERO PUSH2 0x3F3 JUMPI PUSH1 0x0 DUP6 DUP6 PUSH1 0x40 MLOAD PUSH2 0x39E SWAP3 SWAP2 SWAP1 PUSH2 0xCE1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 SWAP1 POP PUSH1 0x40 MLOAD PUSH20 0x3D602D80600A3D3981F3363D3D373D3D3D363D73 PUSH1 0x60 SHL DUP2 MSTORE DUP3 PUSH1 0x14 DUP3 ADD MSTORE PUSH15 0x5AF43D82803E903D91602B57FD5BF3 PUSH1 0x88 SHL PUSH1 0x28 DUP3 ADD MSTORE DUP2 PUSH1 0x37 DUP3 PUSH1 0x0 CREATE2 SWAP4 POP POP POP PUSH2 0x438 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0x3D602D80600A3D3981F3363D3D373D3D3D363D73 PUSH1 0x60 SHL DUP2 MSTORE DUP2 PUSH1 0x14 DUP3 ADD MSTORE PUSH15 0x5AF43D82803E903D91602B57FD5BF3 PUSH1 0x88 SHL PUSH1 0x28 DUP3 ADD MSTORE PUSH1 0x37 DUP2 PUSH1 0x0 CREATE SWAP3 POP POP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP4 DUP11 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 SSTORE SWAP1 MLOAD PUSH4 0x1377D1F5 PUSH1 0xE2 SHL DUP2 MSTORE PUSH4 0x4DDF47D4 SWAP1 CALLVALUE SWAP1 PUSH2 0x48D SWAP1 DUP10 SWAP1 DUP10 SWAP1 PUSH1 0x4 ADD PUSH2 0xDD3 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x4A6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x4BA JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xD62166F3C2149208E51788B1401CC356BF5DA1FC6C7886A32E18570F57D88B3B DUP8 DUP8 PUSH1 0x40 MLOAD PUSH2 0x504 SWAP3 SWAP2 SWAP1 PUSH2 0xDD3 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 CHAINID PUSH32 0x0 DUP2 EQ PUSH2 0x54D JUMPI PUSH2 0x548 DUP2 PUSH2 0xA73 JUMP JUMPDEST PUSH2 0x56F JUMP JUMPDEST PUSH32 0x0 JUMPDEST SWAP2 POP POP SWAP1 JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER DUP2 EQ PUSH2 0x5A0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x27F SWAP1 PUSH2 0xED4 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND SWAP4 SWAP3 AND SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 LOG3 PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP3 DUP4 AND OR SWAP1 SSTORE PUSH1 0x1 DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0x62C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x27F SWAP1 PUSH2 0xE9F JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0x652 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x27F SWAP1 PUSH2 0xE02 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND DUP5 ISZERO ISZERO OR SWAP1 SSTORE MLOAD PUSH32 0x31A1E0EAC44B54AC6C2A2EFA87E92C83405FFCF33FCEEF02A7BCA695130E2600 SWAP1 PUSH2 0x6A6 SWAP1 DUP5 SWAP1 PUSH2 0xD49 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP JUMP JUMPDEST PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x3 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND DUP5 OR SWAP1 SSTORE MLOAD PUSH32 0xDFB44FFABF0D3A8F650D3CE43EFF98F6D050E7EA1A396D5794F014E7DADABACB SWAP2 SWAP1 LOG2 JUMP JUMPDEST PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH2 0x77B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x27F SWAP1 PUSH2 0xFAC JUMP JUMPDEST DUP2 ISZERO DUP1 ISZERO PUSH2 0x787 JUMPI POP DUP1 ISZERO JUMPDEST DUP1 ISZERO PUSH2 0x794 JUMPI POP PUSH1 0xFF DUP4 AND ISZERO JUMPDEST ISZERO PUSH2 0x836 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND CALLER EQ PUSH2 0x7C1 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x27F SWAP1 PUSH2 0xE39 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND ISZERO PUSH2 0x7F9 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x27F SWAP1 PUSH2 0xF09 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND PUSH2 0x831 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x27F SWAP1 PUSH2 0x101A JUMP JUMPDEST PUSH2 0x9F0 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND PUSH2 0x85C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x27F SWAP1 PUSH2 0xFE3 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x2 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1901 PUSH1 0xF0 SHL DUP2 MSTORE POP PUSH2 0x881 PUSH2 0x515 JUMP JUMPDEST PUSH32 0x1962BC9F5484CB7A998701B81090E966EE1FCE5771AF884CCEEE7C081B14ADE2 DUP8 PUSH2 0x8CD JUMPI PUSH32 0xB426802F1F7DC850A7B6B38805EDEA2442F3992878A9AB985ABFE8091D95D0B1 PUSH2 0x8EF JUMP JUMPDEST PUSH32 0x422AC5323FE049241DEE67716229A1CC1BC7B313B23DFE3EF6D42AB177A3B284 JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP12 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 DUP2 ADD SWAP1 SWAP2 SSTORE SWAP2 MLOAD PUSH2 0x929 SWAP5 SWAP4 SWAP3 DUP15 SWAP3 DUP15 SWAP3 DUP15 SWAP3 SWAP2 ADD PUSH2 0xD5D JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x951 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0xCF1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP PUSH1 0x0 PUSH1 0x1 DUP3 DUP7 DUP7 DUP7 PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD PUSH2 0x98E SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0xDB5 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x9B0 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD SUB MLOAD SWAP1 POP DUP8 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x9ED JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x27F SWAP1 PUSH2 0xF40 JUMP JUMPDEST POP POP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP12 AND DUP1 DUP5 MSTORE SWAP5 SWAP1 SWAP2 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND DUP9 ISZERO ISZERO OR SWAP1 SSTORE MLOAD PUSH32 0x5F6EBB64BA012A851C6F014E6CAD458DDF213D1512049B31CD06365C2B059257 SWAP1 PUSH2 0xA54 SWAP1 DUP9 SWAP1 PUSH2 0xD49 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH32 0x8CAD95687BA82C2CE50E74F7B754645E5117C3A5BEC8151C0726D5857980A866 PUSH32 0xD7DF266AFF736D415A9DC14B4158201D612E70D75B9C7F4E375CCFD20AA5166F DUP4 ADDRESS PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0xACC SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0xD91 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST DUP1 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0xB00 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP1 CALLDATALOAD DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0xB00 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xB27 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0xB31 DUP4 DUP4 PUSH2 0xAE9 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0xB4A JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0xB54 DUP5 DUP5 PUSH2 0xAE9 JUMP JUMPDEST SWAP2 POP PUSH2 0xB63 DUP5 PUSH1 0x20 DUP6 ADD PUSH2 0xAE9 JUMP JUMPDEST SWAP1 POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xC0 DUP8 DUP10 SUB SLT ISZERO PUSH2 0xB84 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0xB8E DUP9 DUP9 PUSH2 0xAE9 JUMP JUMPDEST SWAP6 POP PUSH2 0xB9D DUP9 PUSH1 0x20 DUP10 ADD PUSH2 0xAE9 JUMP JUMPDEST SWAP5 POP PUSH2 0xBAC DUP9 PUSH1 0x40 DUP10 ADD PUSH2 0xB06 JUMP JUMPDEST SWAP4 POP PUSH1 0x60 DUP8 ADD CALLDATALOAD PUSH1 0xFF DUP2 AND DUP2 EQ PUSH2 0xBC1 JUMPI DUP3 DUP4 REVERT JUMPDEST SWAP6 SWAP9 SWAP5 SWAP8 POP SWAP3 SWAP6 PUSH1 0x80 DUP2 ADD CALLDATALOAD SWAP5 PUSH1 0xA0 SWAP1 SWAP2 ADD CALLDATALOAD SWAP4 POP SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0xBED JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0xBF7 DUP5 DUP5 PUSH2 0xAE9 JUMP JUMPDEST SWAP2 POP PUSH2 0xB63 DUP5 PUSH1 0x20 DUP6 ADD PUSH2 0xB06 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0xC1A JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0xC24 DUP6 DUP6 PUSH2 0xAE9 JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0xC34 DUP2 PUSH2 0x1051 JUMP JUMPDEST SWAP2 POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH2 0xC44 DUP2 PUSH2 0x1051 JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0xC64 JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0xC6E DUP7 DUP7 PUSH2 0xAE9 JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0xC8A JUMPI DUP5 DUP6 REVERT JUMPDEST DUP2 DUP8 ADD SWAP2 POP DUP8 PUSH1 0x1F DUP4 ADD SLT PUSH2 0xC9D JUMPI DUP5 DUP6 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0xCAB JUMPI DUP6 DUP7 REVERT JUMPDEST DUP9 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0xCBC JUMPI DUP6 DUP7 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP6 POP DUP1 SWAP5 POP POP POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH2 0xCD6 DUP2 PUSH2 0x1051 JUMP JUMPDEST SWAP4 SWAP7 SWAP3 SWAP6 POP SWAP1 SWAP4 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP5 DUP4 CALLDATACOPY SWAP2 ADD SWAP1 DUP2 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP5 MLOAD DUP2 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xD11 JUMPI PUSH1 0x20 DUP2 DUP9 ADD DUP2 ADD MLOAD DUP6 DUP4 ADD MSTORE ADD PUSH2 0xCF7 JUMP JUMPDEST DUP2 DUP2 GT ISZERO PUSH2 0xD1F JUMPI DUP3 DUP3 DUP6 ADD MSTORE JUMPDEST POP SWAP2 SWAP1 SWAP2 ADD SWAP3 DUP4 MSTORE POP PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP6 DUP7 MSTORE PUSH1 0x20 DUP7 ADD SWAP5 SWAP1 SWAP5 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND PUSH1 0x40 DUP7 ADD MSTORE SWAP2 AND PUSH1 0x60 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x80 DUP4 ADD MSTORE PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xC0 ADD SWAP1 JUMP JUMPDEST SWAP4 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST SWAP4 DUP5 MSTORE PUSH1 0xFF SWAP3 SWAP1 SWAP3 AND PUSH1 0x20 DUP5 ADD MSTORE PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD 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 PUSH1 0x1F NOT AND ADD ADD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1C SWAP1 DUP3 ADD MSTORE PUSH32 0x4D6173746572434D67723A2043616E6E6F7420617070726F7665203000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1B SWAP1 DUP3 ADD MSTORE PUSH32 0x4D6173746572434D67723A2075736572206E6F742073656E6465720000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x15 SWAP1 DUP3 ADD MSTORE PUSH21 0x4F776E61626C653A207A65726F2061646472657373 PUSH1 0x58 SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 DUP2 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 DUP2 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C657220213D2070656E64696E67206F776E6572 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x19 SWAP1 DUP3 ADD MSTORE PUSH32 0x4D6173746572434D67723A207573657220697320636C6F6E6500000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1D SWAP1 DUP3 ADD MSTORE PUSH32 0x4D6173746572434D67723A20496E76616C6964205369676E6174757265000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 DUP2 ADD MSTORE PUSH32 0x426F72696E67466163746F72793A204E6F206D6173746572436F6E7472616374 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1B SWAP1 DUP3 ADD MSTORE PUSH32 0x4D6173746572434D67723A206D617374657243206E6F74207365740000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1C SWAP1 DUP3 ADD MSTORE PUSH32 0x4D6173746572434D67723A20557365722063616E6E6F74206265203000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1B SWAP1 DUP3 ADD MSTORE PUSH32 0x4D6173746572434D67723A206E6F742077686974656C69737465640000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x105F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xC5 LT 0x28 CHAINID PUSH12 0x6FC0910CD7E359A95741724B 0xC5 0xD0 0x2B PUSH16 0xFCBB60E27B44A80DAFD2E264736F6C63 NUMBER STOP MOD 0xC STOP CALLER ",
              "sourceMap": "18306:6225:0:-:0;;;19694:207;;;;;;;;;-1:-1:-1;13581:5:0;:18;;-1:-1:-1;;;;;;13581:18:0;13589:10;13581:18;;;;;13614:44;;13589:10;;13581:5;13614:44;;13581:5;;13614:44;19784:9;19858:35;;;;19832:62;19784:9;19832:25;:62::i;:::-;19812:82;;-1:-1:-1;18306:6225:0;;19907:211;19981:7;19080:80;20061:24;20087:7;20104:4;20017:93;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;20007:104;;;;;;20000:111;;19907:211;;;:::o;365:556:-1:-;196:37;;;741:2;726:18;;196:37;;;;824:2;809:18;;196:37;-1:-1;;;;;1167:54;907:2;892:18;;76:37;576:3;561:19;;547:374::o;:::-;18306:6225:0;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {
                "1165": [
                  {
                    "length": 32,
                    "start": 1359
                  }
                ],
                "1167": [
                  {
                    "length": 32,
                    "start": 1306
                  }
                ]
              },
              "linkReferences": {},
              "object": "6080604052600436106100c25760003560e01c80637ecebe001161007f578063aee4d1b211610059578063aee4d1b2146101eb578063bafe4f1414610200578063c0a47c9314610220578063e30c397814610240576100c2565b80637ecebe00146101965780638da5cb5b146101b657806391e0eab5146101cb576100c2565b8063078dfbe7146100c757806312a90c8a146100e95780631f54245b1461011f5780633644e5151461013f5780634e71e0c814610161578063733a9d7c14610176575b600080fd5b3480156100d357600080fd5b506100e76100e2366004610c06565b610255565b005b3480156100f557600080fd5b50610109610104366004610b16565b610344565b6040516101169190610d49565b60405180910390f35b61013261012d366004610c4f565b610359565b6040516101169190610d35565b34801561014b57600080fd5b50610154610515565b6040516101169190610d54565b34801561016d57600080fd5b506100e7610575565b34801561018257600080fd5b506100e7610191366004610bdb565b610602565b3480156101a257600080fd5b506101546101b1366004610b16565b6106b2565b3480156101c257600080fd5b506101326106c4565b3480156101d757600080fd5b506101096101e6366004610b38565b6106d3565b3480156101f757600080fd5b506100e76106f3565b34801561020c57600080fd5b5061013261021b366004610b16565b61073a565b34801561022c57600080fd5b506100e761023b366004610b6c565b610755565b34801561024c57600080fd5b50610132610a64565b6000546001600160a01b031633146102885760405162461bcd60e51b815260040161027f90610e9f565b60405180910390fd5b8115610323576001600160a01b0383161515806102a25750805b6102be5760405162461bcd60e51b815260040161027f90610e70565b600080546040516001600160a01b03808716939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0385166001600160a01b03199182161790915560018054909116905561033f565b600180546001600160a01b0319166001600160a01b0385161790555b505050565b60046020526000908152604090205460ff1681565b60006001600160a01b0385166103815760405162461bcd60e51b815260040161027f90610f77565b606085901b82156103f3576000858560405161039e929190610ce1565b60405180910390209050604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81528260148201526e5af43d82803e903d91602b57fd5bf360881b6028820152816037826000f593505050610438565b604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81528160148201526e5af43d82803e903d91602b57fd5bf360881b60288201526037816000f09250505b6001600160a01b038281166000818152600260205260409081902080546001600160a01b031916938a16939093179092559051631377d1f560e21b8152634ddf47d490349061048d9089908990600401610dd3565b6000604051808303818588803b1580156104a657600080fd5b505af11580156104ba573d6000803e3d6000fd5b5050505050816001600160a01b0316866001600160a01b03167fd62166f3c2149208e51788b1401cc356bf5da1fc6c7886a32e18570f57d88b3b8787604051610504929190610dd3565b60405180910390a350949350505050565b6000467f0000000000000000000000000000000000000000000000000000000000000000811461054d5761054881610a73565b61056f565b7f00000000000000000000000000000000000000000000000000000000000000005b91505090565b6001546001600160a01b03163381146105a05760405162461bcd60e51b815260040161027f90610ed4565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b039092166001600160a01b0319928316179055600180549091169055565b6000546001600160a01b0316331461062c5760405162461bcd60e51b815260040161027f90610e9f565b6001600160a01b0382166106525760405162461bcd60e51b815260040161027f90610e02565b6001600160a01b03821660008181526004602052604090819020805460ff1916841515179055517f31a1e0eac44b54ac6c2a2efa87e92c83405ffcf33fceef02a7bca695130e2600906106a6908490610d49565b60405180910390a25050565b60056020526000908152604090205481565b6000546001600160a01b031681565b600360209081526000928352604080842090915290825290205460ff1681565b3360008181526002602052604080822080546001600160a01b03191684179055517fdfb44ffabf0d3a8f650d3ce43eff98f6d050e7ea1a396d5794f014e7dadabacb9190a2565b6002602052600090815260409020546001600160a01b031681565b6001600160a01b03851661077b5760405162461bcd60e51b815260040161027f90610fac565b81158015610787575080155b8015610794575060ff8316155b15610836576001600160a01b03861633146107c15760405162461bcd60e51b815260040161027f90610e39565b6001600160a01b0386811660009081526002602052604090205416156107f95760405162461bcd60e51b815260040161027f90610f09565b6001600160a01b03851660009081526004602052604090205460ff166108315760405162461bcd60e51b815260040161027f9061101a565b6109f0565b6001600160a01b03861661085c5760405162461bcd60e51b815260040161027f90610fe3565b600060405180604001604052806002815260200161190160f01b815250610881610515565b7f1962bc9f5484cb7a998701b81090e966ee1fce5771af884cceee7c081b14ade2876108cd577fb426802f1f7dc850a7b6b38805edea2442f3992878a9ab985abfe8091d95d0b16108ef565b7f422ac5323fe049241dee67716229a1cc1bc7b313b23dfe3ef6d42ab177a3b2845b6001600160a01b038b1660009081526005602090815260409182902080546001810190915591516109299493928e928e928e929101610d5d565b6040516020818303038152906040528051906020012060405160200161095193929190610cf1565b60405160208183030381529060405280519060200120905060006001828686866040516000815260200160405260405161098e9493929190610db5565b6020604051602081039080840390855afa1580156109b0573d6000803e3d6000fd5b505050602060405103519050876001600160a01b0316816001600160a01b0316146109ed5760405162461bcd60e51b815260040161027f90610f40565b50505b6001600160a01b038581166000818152600360209081526040808320948b168084529490915290819020805460ff1916881515179055517f5f6ebb64ba012a851c6f014e6cad458ddf213d1512049b31cd06365c2b05925790610a54908890610d49565b60405180910390a3505050505050565b6001546001600160a01b031681565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8667fd7df266aff736d415a9dc14b4158201d612e70d75b9c7f4e375ccfd20aa5166f8330604051602001610acc9493929190610d91565b604051602081830303815290604052805190602001209050919050565b80356001600160a01b0381168114610b0057600080fd5b92915050565b80358015158114610b0057600080fd5b600060208284031215610b27578081fd5b610b318383610ae9565b9392505050565b60008060408385031215610b4a578081fd5b610b548484610ae9565b9150610b638460208501610ae9565b90509250929050565b60008060008060008060c08789031215610b84578182fd5b610b8e8888610ae9565b9550610b9d8860208901610ae9565b9450610bac8860408901610b06565b9350606087013560ff81168114610bc1578283fd5b9598949750929560808101359460a0909101359350915050565b60008060408385031215610bed578182fd5b610bf78484610ae9565b9150610b638460208501610b06565b600080600060608486031215610c1a578283fd5b610c248585610ae9565b92506020840135610c3481611051565b91506040840135610c4481611051565b809150509250925092565b60008060008060608587031215610c64578384fd5b610c6e8686610ae9565b9350602085013567ffffffffffffffff80821115610c8a578485fd5b818701915087601f830112610c9d578485fd5b813581811115610cab578586fd5b886020828501011115610cbc578586fd5b6020830195508094505050506040850135610cd681611051565b939692955090935050565b6000828483379101908152919050565b60008451815b81811015610d115760208188018101518583015201610cf7565b81811115610d1f5782828501525b5091909101928352506020820152604001919050565b6001600160a01b0391909116815260200190565b901515815260200190565b90815260200190565b95865260208601949094526001600160a01b039283166040860152911660608401521515608083015260a082015260c00190565b938452602084019290925260408301526001600160a01b0316606082015260800190565b93845260ff9290921660208401526040830152606082015260800190565b60006020825282602083015282846040840137818301604090810191909152601f909201601f19160101919050565b6020808252601c908201527f4d6173746572434d67723a2043616e6e6f7420617070726f7665203000000000604082015260600190565b6020808252601b908201527f4d6173746572434d67723a2075736572206e6f742073656e6465720000000000604082015260600190565b6020808252601590820152744f776e61626c653a207a65726f206164647265737360581b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c657220213d2070656e64696e67206f776e6572604082015260600190565b60208082526019908201527f4d6173746572434d67723a207573657220697320636c6f6e6500000000000000604082015260600190565b6020808252601d908201527f4d6173746572434d67723a20496e76616c6964205369676e6174757265000000604082015260600190565b6020808252818101527f426f72696e67466163746f72793a204e6f206d6173746572436f6e7472616374604082015260600190565b6020808252601b908201527f4d6173746572434d67723a206d617374657243206e6f74207365740000000000604082015260600190565b6020808252601c908201527f4d6173746572434d67723a20557365722063616e6e6f74206265203000000000604082015260600190565b6020808252601b908201527f4d6173746572434d67723a206e6f742077686974656c69737465640000000000604082015260600190565b801515811461105f57600080fd5b5056fea2646970667358221220c51028466b6fc0910cd7e359a95741724bc5d02b6ffcbb60e27b44a80dafd2e264736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xC2 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x7ECEBE00 GT PUSH2 0x7F JUMPI DUP1 PUSH4 0xAEE4D1B2 GT PUSH2 0x59 JUMPI DUP1 PUSH4 0xAEE4D1B2 EQ PUSH2 0x1EB JUMPI DUP1 PUSH4 0xBAFE4F14 EQ PUSH2 0x200 JUMPI DUP1 PUSH4 0xC0A47C93 EQ PUSH2 0x220 JUMPI DUP1 PUSH4 0xE30C3978 EQ PUSH2 0x240 JUMPI PUSH2 0xC2 JUMP JUMPDEST DUP1 PUSH4 0x7ECEBE00 EQ PUSH2 0x196 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x1B6 JUMPI DUP1 PUSH4 0x91E0EAB5 EQ PUSH2 0x1CB JUMPI PUSH2 0xC2 JUMP JUMPDEST DUP1 PUSH4 0x78DFBE7 EQ PUSH2 0xC7 JUMPI DUP1 PUSH4 0x12A90C8A EQ PUSH2 0xE9 JUMPI DUP1 PUSH4 0x1F54245B EQ PUSH2 0x11F JUMPI DUP1 PUSH4 0x3644E515 EQ PUSH2 0x13F JUMPI DUP1 PUSH4 0x4E71E0C8 EQ PUSH2 0x161 JUMPI DUP1 PUSH4 0x733A9D7C EQ PUSH2 0x176 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xD3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xE7 PUSH2 0xE2 CALLDATASIZE PUSH1 0x4 PUSH2 0xC06 JUMP JUMPDEST PUSH2 0x255 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xF5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x109 PUSH2 0x104 CALLDATASIZE PUSH1 0x4 PUSH2 0xB16 JUMP JUMPDEST PUSH2 0x344 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x116 SWAP2 SWAP1 PUSH2 0xD49 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x132 PUSH2 0x12D CALLDATASIZE PUSH1 0x4 PUSH2 0xC4F JUMP JUMPDEST PUSH2 0x359 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x116 SWAP2 SWAP1 PUSH2 0xD35 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x14B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x154 PUSH2 0x515 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x116 SWAP2 SWAP1 PUSH2 0xD54 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x16D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xE7 PUSH2 0x575 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x182 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xE7 PUSH2 0x191 CALLDATASIZE PUSH1 0x4 PUSH2 0xBDB JUMP JUMPDEST PUSH2 0x602 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1A2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x154 PUSH2 0x1B1 CALLDATASIZE PUSH1 0x4 PUSH2 0xB16 JUMP JUMPDEST PUSH2 0x6B2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1C2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x132 PUSH2 0x6C4 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1D7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x109 PUSH2 0x1E6 CALLDATASIZE PUSH1 0x4 PUSH2 0xB38 JUMP JUMPDEST PUSH2 0x6D3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1F7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xE7 PUSH2 0x6F3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x20C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x132 PUSH2 0x21B CALLDATASIZE PUSH1 0x4 PUSH2 0xB16 JUMP JUMPDEST PUSH2 0x73A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x22C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xE7 PUSH2 0x23B CALLDATASIZE PUSH1 0x4 PUSH2 0xB6C JUMP JUMPDEST PUSH2 0x755 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x24C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x132 PUSH2 0xA64 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0x288 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x27F SWAP1 PUSH2 0xE9F JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP2 ISZERO PUSH2 0x323 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND ISZERO ISZERO DUP1 PUSH2 0x2A2 JUMPI POP DUP1 JUMPDEST PUSH2 0x2BE JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x27F SWAP1 PUSH2 0xE70 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP8 AND SWAP4 SWAP3 AND SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 LOG3 PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP2 DUP3 AND OR SWAP1 SWAP2 SSTORE PUSH1 0x1 DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SSTORE PUSH2 0x33F JUMP JUMPDEST PUSH1 0x1 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND OR SWAP1 SSTORE JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x4 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH2 0x381 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x27F SWAP1 PUSH2 0xF77 JUMP JUMPDEST PUSH1 0x60 DUP6 SWAP1 SHL DUP3 ISZERO PUSH2 0x3F3 JUMPI PUSH1 0x0 DUP6 DUP6 PUSH1 0x40 MLOAD PUSH2 0x39E SWAP3 SWAP2 SWAP1 PUSH2 0xCE1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 SWAP1 POP PUSH1 0x40 MLOAD PUSH20 0x3D602D80600A3D3981F3363D3D373D3D3D363D73 PUSH1 0x60 SHL DUP2 MSTORE DUP3 PUSH1 0x14 DUP3 ADD MSTORE PUSH15 0x5AF43D82803E903D91602B57FD5BF3 PUSH1 0x88 SHL PUSH1 0x28 DUP3 ADD MSTORE DUP2 PUSH1 0x37 DUP3 PUSH1 0x0 CREATE2 SWAP4 POP POP POP PUSH2 0x438 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0x3D602D80600A3D3981F3363D3D373D3D3D363D73 PUSH1 0x60 SHL DUP2 MSTORE DUP2 PUSH1 0x14 DUP3 ADD MSTORE PUSH15 0x5AF43D82803E903D91602B57FD5BF3 PUSH1 0x88 SHL PUSH1 0x28 DUP3 ADD MSTORE PUSH1 0x37 DUP2 PUSH1 0x0 CREATE SWAP3 POP POP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP4 DUP11 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 SSTORE SWAP1 MLOAD PUSH4 0x1377D1F5 PUSH1 0xE2 SHL DUP2 MSTORE PUSH4 0x4DDF47D4 SWAP1 CALLVALUE SWAP1 PUSH2 0x48D SWAP1 DUP10 SWAP1 DUP10 SWAP1 PUSH1 0x4 ADD PUSH2 0xDD3 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x4A6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x4BA JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xD62166F3C2149208E51788B1401CC356BF5DA1FC6C7886A32E18570F57D88B3B DUP8 DUP8 PUSH1 0x40 MLOAD PUSH2 0x504 SWAP3 SWAP2 SWAP1 PUSH2 0xDD3 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 CHAINID PUSH32 0x0 DUP2 EQ PUSH2 0x54D JUMPI PUSH2 0x548 DUP2 PUSH2 0xA73 JUMP JUMPDEST PUSH2 0x56F JUMP JUMPDEST PUSH32 0x0 JUMPDEST SWAP2 POP POP SWAP1 JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER DUP2 EQ PUSH2 0x5A0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x27F SWAP1 PUSH2 0xED4 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND SWAP4 SWAP3 AND SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 LOG3 PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP3 DUP4 AND OR SWAP1 SSTORE PUSH1 0x1 DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0x62C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x27F SWAP1 PUSH2 0xE9F JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0x652 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x27F SWAP1 PUSH2 0xE02 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND DUP5 ISZERO ISZERO OR SWAP1 SSTORE MLOAD PUSH32 0x31A1E0EAC44B54AC6C2A2EFA87E92C83405FFCF33FCEEF02A7BCA695130E2600 SWAP1 PUSH2 0x6A6 SWAP1 DUP5 SWAP1 PUSH2 0xD49 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP JUMP JUMPDEST PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x3 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND DUP5 OR SWAP1 SSTORE MLOAD PUSH32 0xDFB44FFABF0D3A8F650D3CE43EFF98F6D050E7EA1A396D5794F014E7DADABACB SWAP2 SWAP1 LOG2 JUMP JUMPDEST PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH2 0x77B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x27F SWAP1 PUSH2 0xFAC JUMP JUMPDEST DUP2 ISZERO DUP1 ISZERO PUSH2 0x787 JUMPI POP DUP1 ISZERO JUMPDEST DUP1 ISZERO PUSH2 0x794 JUMPI POP PUSH1 0xFF DUP4 AND ISZERO JUMPDEST ISZERO PUSH2 0x836 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND CALLER EQ PUSH2 0x7C1 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x27F SWAP1 PUSH2 0xE39 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND ISZERO PUSH2 0x7F9 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x27F SWAP1 PUSH2 0xF09 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND PUSH2 0x831 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x27F SWAP1 PUSH2 0x101A JUMP JUMPDEST PUSH2 0x9F0 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND PUSH2 0x85C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x27F SWAP1 PUSH2 0xFE3 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x2 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1901 PUSH1 0xF0 SHL DUP2 MSTORE POP PUSH2 0x881 PUSH2 0x515 JUMP JUMPDEST PUSH32 0x1962BC9F5484CB7A998701B81090E966EE1FCE5771AF884CCEEE7C081B14ADE2 DUP8 PUSH2 0x8CD JUMPI PUSH32 0xB426802F1F7DC850A7B6B38805EDEA2442F3992878A9AB985ABFE8091D95D0B1 PUSH2 0x8EF JUMP JUMPDEST PUSH32 0x422AC5323FE049241DEE67716229A1CC1BC7B313B23DFE3EF6D42AB177A3B284 JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP12 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 DUP2 ADD SWAP1 SWAP2 SSTORE SWAP2 MLOAD PUSH2 0x929 SWAP5 SWAP4 SWAP3 DUP15 SWAP3 DUP15 SWAP3 DUP15 SWAP3 SWAP2 ADD PUSH2 0xD5D JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x951 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0xCF1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP PUSH1 0x0 PUSH1 0x1 DUP3 DUP7 DUP7 DUP7 PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD PUSH2 0x98E SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0xDB5 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x9B0 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD SUB MLOAD SWAP1 POP DUP8 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x9ED JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x27F SWAP1 PUSH2 0xF40 JUMP JUMPDEST POP POP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP12 AND DUP1 DUP5 MSTORE SWAP5 SWAP1 SWAP2 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND DUP9 ISZERO ISZERO OR SWAP1 SSTORE MLOAD PUSH32 0x5F6EBB64BA012A851C6F014E6CAD458DDF213D1512049B31CD06365C2B059257 SWAP1 PUSH2 0xA54 SWAP1 DUP9 SWAP1 PUSH2 0xD49 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH32 0x8CAD95687BA82C2CE50E74F7B754645E5117C3A5BEC8151C0726D5857980A866 PUSH32 0xD7DF266AFF736D415A9DC14B4158201D612E70D75B9C7F4E375CCFD20AA5166F DUP4 ADDRESS PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0xACC SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0xD91 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST DUP1 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0xB00 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP1 CALLDATALOAD DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0xB00 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xB27 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0xB31 DUP4 DUP4 PUSH2 0xAE9 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0xB4A JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0xB54 DUP5 DUP5 PUSH2 0xAE9 JUMP JUMPDEST SWAP2 POP PUSH2 0xB63 DUP5 PUSH1 0x20 DUP6 ADD PUSH2 0xAE9 JUMP JUMPDEST SWAP1 POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xC0 DUP8 DUP10 SUB SLT ISZERO PUSH2 0xB84 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0xB8E DUP9 DUP9 PUSH2 0xAE9 JUMP JUMPDEST SWAP6 POP PUSH2 0xB9D DUP9 PUSH1 0x20 DUP10 ADD PUSH2 0xAE9 JUMP JUMPDEST SWAP5 POP PUSH2 0xBAC DUP9 PUSH1 0x40 DUP10 ADD PUSH2 0xB06 JUMP JUMPDEST SWAP4 POP PUSH1 0x60 DUP8 ADD CALLDATALOAD PUSH1 0xFF DUP2 AND DUP2 EQ PUSH2 0xBC1 JUMPI DUP3 DUP4 REVERT JUMPDEST SWAP6 SWAP9 SWAP5 SWAP8 POP SWAP3 SWAP6 PUSH1 0x80 DUP2 ADD CALLDATALOAD SWAP5 PUSH1 0xA0 SWAP1 SWAP2 ADD CALLDATALOAD SWAP4 POP SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0xBED JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0xBF7 DUP5 DUP5 PUSH2 0xAE9 JUMP JUMPDEST SWAP2 POP PUSH2 0xB63 DUP5 PUSH1 0x20 DUP6 ADD PUSH2 0xB06 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0xC1A JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0xC24 DUP6 DUP6 PUSH2 0xAE9 JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0xC34 DUP2 PUSH2 0x1051 JUMP JUMPDEST SWAP2 POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH2 0xC44 DUP2 PUSH2 0x1051 JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0xC64 JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0xC6E DUP7 DUP7 PUSH2 0xAE9 JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0xC8A JUMPI DUP5 DUP6 REVERT JUMPDEST DUP2 DUP8 ADD SWAP2 POP DUP8 PUSH1 0x1F DUP4 ADD SLT PUSH2 0xC9D JUMPI DUP5 DUP6 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0xCAB JUMPI DUP6 DUP7 REVERT JUMPDEST DUP9 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0xCBC JUMPI DUP6 DUP7 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP6 POP DUP1 SWAP5 POP POP POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH2 0xCD6 DUP2 PUSH2 0x1051 JUMP JUMPDEST SWAP4 SWAP7 SWAP3 SWAP6 POP SWAP1 SWAP4 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP5 DUP4 CALLDATACOPY SWAP2 ADD SWAP1 DUP2 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP5 MLOAD DUP2 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xD11 JUMPI PUSH1 0x20 DUP2 DUP9 ADD DUP2 ADD MLOAD DUP6 DUP4 ADD MSTORE ADD PUSH2 0xCF7 JUMP JUMPDEST DUP2 DUP2 GT ISZERO PUSH2 0xD1F JUMPI DUP3 DUP3 DUP6 ADD MSTORE JUMPDEST POP SWAP2 SWAP1 SWAP2 ADD SWAP3 DUP4 MSTORE POP PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP6 DUP7 MSTORE PUSH1 0x20 DUP7 ADD SWAP5 SWAP1 SWAP5 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND PUSH1 0x40 DUP7 ADD MSTORE SWAP2 AND PUSH1 0x60 DUP5 ADD MSTORE ISZERO ISZERO PUSH1 0x80 DUP4 ADD MSTORE PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xC0 ADD SWAP1 JUMP JUMPDEST SWAP4 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST SWAP4 DUP5 MSTORE PUSH1 0xFF SWAP3 SWAP1 SWAP3 AND PUSH1 0x20 DUP5 ADD MSTORE PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD 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 PUSH1 0x1F NOT AND ADD ADD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1C SWAP1 DUP3 ADD MSTORE PUSH32 0x4D6173746572434D67723A2043616E6E6F7420617070726F7665203000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1B SWAP1 DUP3 ADD MSTORE PUSH32 0x4D6173746572434D67723A2075736572206E6F742073656E6465720000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x15 SWAP1 DUP3 ADD MSTORE PUSH21 0x4F776E61626C653A207A65726F2061646472657373 PUSH1 0x58 SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 DUP2 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 DUP2 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C657220213D2070656E64696E67206F776E6572 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x19 SWAP1 DUP3 ADD MSTORE PUSH32 0x4D6173746572434D67723A207573657220697320636C6F6E6500000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1D SWAP1 DUP3 ADD MSTORE PUSH32 0x4D6173746572434D67723A20496E76616C6964205369676E6174757265000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 DUP2 ADD MSTORE PUSH32 0x426F72696E67466163746F72793A204E6F206D6173746572436F6E7472616374 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1B SWAP1 DUP3 ADD MSTORE PUSH32 0x4D6173746572434D67723A206D617374657243206E6F74207365740000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1C SWAP1 DUP3 ADD MSTORE PUSH32 0x4D6173746572434D67723A20557365722063616E6E6F74206265203000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1B SWAP1 DUP3 ADD MSTORE PUSH32 0x4D6173746572434D67723A206E6F742077686974656C69737465640000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x105F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xC5 LT 0x28 CHAINID PUSH12 0x6FC0910CD7E359A95741724B 0xC5 0xD0 0x2B PUSH16 0xFCBB60E27B44A80DAFD2E264736F6C63 NUMBER STOP MOD 0xC STOP CALLER ",
              "sourceMap": "18306:6225:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14124:489;;;;;;;;;;-1:-1:-1;14124:489:0;;;;;:::i;:::-;;:::i;:::-;;18852:58;;;;;;;;;;-1:-1:-1;18852:58:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16553:1670;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;20177:262::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;14692:330::-;;;;;;;;;;;;;:::i;20798:343::-;;;;;;;;;;-1:-1:-1;20798:343:0;;;;;:::i;:::-;;:::i;18973:41::-;;;;;;;;;;-1:-1:-1;18973:41:0;;;;;:::i;:::-;;:::i;13288:20::-;;;;;;;;;;;;;:::i;18684:74::-;;;;;;;;;;-1:-1:-1;18684:74:0;;;;;:::i;:::-;;:::i;20569:139::-;;;;;;;;;;;;;:::i;15971:51::-;;;;;;;;;;-1:-1:-1;15971:51:0;;;;;:::i;:::-;;:::i;21898:2631::-;;;;;;;;;;-1:-1:-1;21898:2631:0;;;;;:::i;:::-;;:::i;13314:27::-;;;;;;;;;;;;;:::i;14124:489::-;15146:5;;-1:-1:-1;;;;;15146:5:0;15132:10;:19;15124:64;;;;-1:-1:-1;;;15124:64:0;;;;;;;:::i;:::-;;;;;;;;;14258:6:::1;14254:353;;;-1:-1:-1::0;;;;;14310:22:0;::::1;::::0;::::1;::::0;:34:::1;;;14336:8;14310:34;14302:68;;;;-1:-1:-1::0;;;14302:68:0::1;;;;;;;:::i;:::-;14434:5;::::0;;14413:37:::1;::::0;-1:-1:-1;;;;;14413:37:0;;::::1;::::0;14434:5;::::1;::::0;14413:37:::1;::::0;::::1;14464:5;:16:::0;;-1:-1:-1;;;;;14464:16:0;::::1;-1:-1:-1::0;;;;;;14464:16:0;;::::1;;::::0;;;;14494:25;;;;::::1;::::0;;14254:353:::1;;;14573:12;:23:::0;;-1:-1:-1;;;;;;14573:23:0::1;-1:-1:-1::0;;;;;14573:23:0;::::1;;::::0;;14254:353:::1;14124:489:::0;;;:::o;18852:58::-;;;;;;;;;;;;;;;:::o;16553:1670::-;16685:20;-1:-1:-1;;;;;16725:28:0;;16717:73;;;;-1:-1:-1;;;16717:73:0;;;;;;;:::i;:::-;16822:23;;;;16916:1114;;;;17057:12;17082:4;;17072:15;;;;;;;:::i;:::-;;;;;;;;17057:30;;17267:4;17261:11;-1:-1:-1;;;17296:5:0;17289:81;17412:11;17405:4;17398:5;17394:16;17387:37;-1:-1:-1;;;17459:4:0;17452:5;17448:16;17441:92;17590:4;17584;17577:5;17574:1;17566:29;17550:45;;;17230:379;;;;17685:4;17679:11;-1:-1:-1;;;17714:5:0;17707:81;17830:11;17823:4;17816:5;17812:16;17805:37;-1:-1:-1;;;17877:4:0;17870:5;17866:16;17859:92;18001:4;17994:5;17991:1;17984:22;17968:38;;;17648:372;-1:-1:-1;;;;;18039:30:0;;;;;;;:16;:30;;;;;;;:47;;-1:-1:-1;;;;;;18039:47:0;;;;;;;;;;;18097:58;;-1:-1:-1;;;18097:58:0;;:34;;18139:9;;18097:58;;18150:4;;;;18097:58;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18203:12;-1:-1:-1;;;;;18171:45:0;18181:14;-1:-1:-1;;;;;18171:45:0;;18197:4;;18171:45;;;;;;;:::i;:::-;;;;;;;;16553:1670;;;;;;;:::o;20177:262::-;20226:7;20304:9;20350:25;20339:36;;:93;;20398:34;20424:7;20398:25;:34::i;:::-;20339:93;;;20378:17;20339:93;20332:100;;;20177:262;:::o;14692:330::-;14759:12;;-1:-1:-1;;;;;14759:12:0;14808:10;:27;;14800:72;;;;-1:-1:-1;;;14800:72:0;;;;;;;:::i;:::-;14928:5;;;14907:42;;-1:-1:-1;;;;;14907:42:0;;;;14928:5;;;14907:42;;;14959:5;:21;;-1:-1:-1;;;;;14959:21:0;;;-1:-1:-1;;;;;;14959:21:0;;;;;;;14990:25;;;;;;;14692:330::o;20798:343::-;15146:5;;-1:-1:-1;;;;;15146:5:0;15132:10;:19;15124:64;;;;-1:-1:-1;;;15124:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;20923:28:0;::::1;20915:69;;;;-1:-1:-1::0;;;20915:69:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;21014:42:0;::::1;;::::0;;;:26:::1;:42;::::0;;;;;;:53;;-1:-1:-1;;21014:53:0::1;::::0;::::1;;;::::0;;21082:52;::::1;::::0;::::1;::::0;21014:53;;21082:52:::1;:::i;:::-;;;;;;;;20798:343:::0;;:::o;18973:41::-;;;;;;;;;;;;;:::o;13288:20::-;;;-1:-1:-1;;;;;13288:20:0;;:::o;18684:74::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;20569:139::-;20645:10;20614:28;;;;:16;:28;;;;;;:41;;-1:-1:-1;;;;;;20614:41:0;;;;;20670:31;;;20614:28;20670:31;20569:139::o;15971:51::-;;;;;;;;;;;;-1:-1:-1;;;;;15971:51:0;;:::o;21898:2631::-;-1:-1:-1;;;;;22114:28:0;;22106:68;;;;-1:-1:-1;;;22106:68:0;;;;;;;:::i;:::-;22280:6;;:16;;;;-1:-1:-1;22290:6:0;;22280:16;:26;;;;-1:-1:-1;22300:6:0;;;;22280:26;22276:2087;;;-1:-1:-1;;;;;22330:18:0;;22338:10;22330:18;22322:58;;;;-1:-1:-1;;;22322:58:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22402:22:0;;;22436:1;22402:22;;;:16;:22;;;;;;;:36;22394:74;;;;-1:-1:-1;;;22394:74:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22490:42:0;;;;;;:26;:42;;;;;;;;22482:82;;;;-1:-1:-1;;;22482:82:0;;;;;;;:::i;:::-;22276:2087;;;-1:-1:-1;;;;;22889:18:0;;22881:59;;;;-1:-1:-1;;;22881:59:0;;;;;;;:::i;:::-;23383:14;23489:40;;;;;;;;;;;;;-1:-1:-1;;;23489:40:0;;;23555:18;:16;:18::i;:::-;19358:118;23739:8;:194;;23894:39;23739:194;;;23786:69;23739:194;-1:-1:-1;;;;;24095:12:0;;;;;;:6;:12;;;;;;;;;:14;;;;;;;;23638:501;;;;;;23967:4;;24005:14;;24053:8;;24095:14;23638:501;;:::i;:::-;;;;;;;;;;;;;23599:566;;;;;;23447:740;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;23416:789;;;;;;23383:822;;24219:24;24246:26;24256:6;24264:1;24267;24270;24246:26;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24219:53;;24314:4;-1:-1:-1;;;;;24294:24:0;:16;-1:-1:-1;;;;;24294:24:0;;24286:66;;;;-1:-1:-1;;;24286:66:0;;;;;;;:::i;:::-;22276:2087;;;-1:-1:-1;;;;;24392:38:0;;;;;;;:22;:38;;;;;;;;:44;;;;;;;;;;;;;;:55;;-1:-1:-1;;24392:55:0;;;;;;;24462:60;;;;;24392:55;;24462:60;:::i;:::-;;;;;;;;21898:2631;;;;;;:::o;13314:27::-;;;-1:-1:-1;;;;;13314:27:0;;:::o;19907:211::-;19981:7;19080:80;20061:24;20087:7;20104:4;20017:93;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;20007:104;;;;;;20000:111;;19907:211;;;:::o;5:130:-1:-;72:20;;-1:-1;;;;;19095:54;;20004:35;;19994:2;;20053:1;;20043:12;19994:2;57:78;;;;:::o;142:124::-;206:20;;18928:13;;18921:21;20125:32;;20115:2;;20171:1;;20161:12;901:241;;1005:2;993:9;984:7;980:23;976:32;973:2;;;-1:-1;;1011:12;973:2;1073:53;1118:7;1094:22;1073:53;:::i;:::-;1063:63;967:175;-1:-1;;;967:175::o;1149:366::-;;;1270:2;1258:9;1249:7;1245:23;1241:32;1238:2;;;-1:-1;;1276:12;1238:2;1338:53;1383:7;1359:22;1338:53;:::i;:::-;1328:63;;1446:53;1491:7;1428:2;1471:9;1467:22;1446:53;:::i;:::-;1436:63;;1232:283;;;;;:::o;1522:859::-;;;;;;;1706:3;1694:9;1685:7;1681:23;1677:33;1674:2;;;-1:-1;;1713:12;1674:2;1775:53;1820:7;1796:22;1775:53;:::i;:::-;1765:63;;1883:53;1928:7;1865:2;1908:9;1904:22;1883:53;:::i;:::-;1873:63;;1991:50;2033:7;1973:2;2013:9;2009:22;1991:50;:::i;:::-;1981:60;;2078:2;2119:9;2115:22;833:20;19311:4;20394:5;19300:16;20371:5;20368:33;20358:2;;-1:-1;;20405:12;20358:2;1668:713;;;;-1:-1;1668:713;;2184:3;2224:22;;340:20;;2293:3;2333:22;;;340:20;;-1:-1;1668:713;-1:-1;;1668:713::o;2388:360::-;;;2506:2;2494:9;2485:7;2481:23;2477:32;2474:2;;;-1:-1;;2512:12;2474:2;2574:53;2619:7;2595:22;2574:53;:::i;:::-;2564:63;;2682:50;2724:7;2664:2;2704:9;2700:22;2682:50;:::i;2755:479::-;;;;2887:2;2875:9;2866:7;2862:23;2858:32;2855:2;;;-1:-1;;2893:12;2855:2;2955:53;3000:7;2976:22;2955:53;:::i;:::-;2945:63;;3045:2;3085:9;3081:22;206:20;231:30;255:5;231:30;:::i;:::-;3053:60;-1:-1;3150:2;3186:22;;206:20;231:30;206:20;231:30;:::i;:::-;3158:60;;;;2849:385;;;;;:::o;3241:609::-;;;;;3395:2;3383:9;3374:7;3370:23;3366:32;3363:2;;;-1:-1;;3401:12;3363:2;3463:53;3508:7;3484:22;3463:53;:::i;:::-;3453:63;;3581:2;3570:9;3566:18;3553:32;3605:18;;3597:6;3594:30;3591:2;;;-1:-1;;3627:12;3591:2;3712:6;3701:9;3697:22;;;538:3;531:4;523:6;519:17;515:27;505:2;;-1:-1;;546:12;505:2;589:6;576:20;3605:18;608:6;605:30;602:2;;;-1:-1;;638:12;602:2;733:3;3581:2;713:17;674:6;699:32;;696:41;693:2;;;-1:-1;;740:12;693:2;3581;674:6;670:17;3647:82;;;;;;;;3766:2;3806:9;3802:22;206:20;231:30;255:5;231:30;:::i;:::-;3357:493;;;;-1:-1;3357:493;;-1:-1;;3357:493::o;9344:291::-;;19410:6;19405:3;19400;19387:30;19448:16;;19441:27;;;19448:16;9488:147;-1:-1;9488:147::o;9642:553::-;;5199:5;18073:12;-1:-1;19555:101;19569:6;19566:1;19563:13;19555:101;;;5344:4;19636:11;;;;;19630:18;19617:11;;;19610:39;19584:10;19555:101;;;19671:6;19668:1;19665:13;19662:2;;;-1:-1;19727:6;19722:3;19718:16;19711:27;19662:2;-1:-1;5375:16;;;;4159:37;;;-1:-1;5344:4;10047:12;;4159:37;10158:12;;;9834:361;-1:-1;9834:361::o;10202:222::-;-1:-1;;;;;19095:54;;;;3928:37;;10329:2;10314:18;;10300:124::o;10431:210::-;18928:13;;18921:21;4042:34;;10552:2;10537:18;;10523:118::o;10648:222::-;4159:37;;;10775:2;10760:18;;10746:124::o;10877:768::-;4159:37;;;11303:2;11288:18;;4159:37;;;;-1:-1;;;;;19095:54;;;11386:2;11371:18;;3928:37;19095:54;;11469:2;11454:18;;3928:37;18928:13;18921:21;11546:3;11531:19;;4042:34;19106:42;11615:19;;4159:37;11138:3;11123:19;;11109:536::o;11652:556::-;4159:37;;;12028:2;12013:18;;4159:37;;;;12111:2;12096:18;;4159:37;-1:-1;;;;;19095:54;12194:2;12179:18;;3928:37;11863:3;11848:19;;11834:374::o;12215:548::-;4159:37;;;19311:4;19300:16;;;;12583:2;12568:18;;9297:35;12666:2;12651:18;;4159:37;12749:2;12734:18;;4159:37;12422:3;12407:19;;12393:370::o;12770:326::-;;12925:2;12946:17;12939:47;18229:6;12925:2;12914:9;12910:18;18217:19;19410:6;19405:3;18257:14;12914:9;18257:14;19387:30;19448:16;;;18257:14;19448:16;;;19441:27;;;;19924:7;19908:14;;;-1:-1;;19904:28;4642:39;;;12896:200;-1:-1;12896:200::o;13103:416::-;13303:2;13317:47;;;5628:2;13288:18;;;18217:19;5664:30;18257:14;;;5644:51;5714:12;;;13274:245::o;13526:416::-;13726:2;13740:47;;;5965:2;13711:18;;;18217:19;6001:29;18257:14;;;5981:50;6050:12;;;13697:245::o;13949:416::-;14149:2;14163:47;;;6301:2;14134:18;;;18217:19;-1:-1;;;18257:14;;;6317:44;6380:12;;;14120:245::o;14372:416::-;14572:2;14586:47;;;14557:18;;;18217:19;6667:34;18257:14;;;6647:55;6721:12;;;14543:245::o;14795:416::-;14995:2;15009:47;;;14980:18;;;18217:19;7008:34;18257:14;;;6988:55;7062:12;;;14966:245::o;15218:416::-;15418:2;15432:47;;;7313:2;15403:18;;;18217:19;7349:27;18257:14;;;7329:48;7396:12;;;15389:245::o;15641:416::-;15841:2;15855:47;;;7647:2;15826:18;;;18217:19;7683:31;18257:14;;;7663:52;7734:12;;;15812:245::o;16064:416::-;16264:2;16278:47;;;16249:18;;;18217:19;8021:34;18257:14;;;8001:55;8075:12;;;16235:245::o;16487:416::-;16687:2;16701:47;;;8326:2;16672:18;;;18217:19;8362:29;18257:14;;;8342:50;8411:12;;;16658:245::o;16910:416::-;17110:2;17124:47;;;8662:2;17095:18;;;18217:19;8698:30;18257:14;;;8678:51;8748:12;;;17081:245::o;17333:416::-;17533:2;17547:47;;;8999:2;17518:18;;;18217:19;9035:29;18257:14;;;9015:50;9084:12;;;17504:245::o;20069:111::-;20150:5;18928:13;18921:21;20128:5;20125:32;20115:2;;20171:1;;20161:12;20115:2;20109:71;:::o"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "849600",
                "executionCost": "infinite",
                "totalCost": "infinite"
              },
              "external": {
                "DOMAIN_SEPARATOR()": "infinite",
                "claimOwnership()": "45111",
                "deploy(address,bytes,bool)": "infinite",
                "masterContractApproved(address,address)": "infinite",
                "masterContractOf(address)": "1343",
                "nonces(address)": "1280",
                "owner()": "1115",
                "pendingOwner()": "1158",
                "registerProtocol()": "22210",
                "setMasterContractApproval(address,address,bool,uint8,bytes32,bytes32)": "infinite",
                "transferOwnership(address,bool,bool)": "infinite",
                "whitelistMasterContract(address,bool)": "infinite",
                "whitelistedMasterContracts(address)": "1292"
              },
              "internal": {
                "_calculateDomainSeparator(uint256)": "infinite"
              }
            },
            "methodIdentifiers": {
              "DOMAIN_SEPARATOR()": "3644e515",
              "claimOwnership()": "4e71e0c8",
              "deploy(address,bytes,bool)": "1f54245b",
              "masterContractApproved(address,address)": "91e0eab5",
              "masterContractOf(address)": "bafe4f14",
              "nonces(address)": "7ecebe00",
              "owner()": "8da5cb5b",
              "pendingOwner()": "e30c3978",
              "registerProtocol()": "aee4d1b2",
              "setMasterContractApproval(address,address,bool,uint8,bytes32,bytes32)": "c0a47c93",
              "transferOwnership(address,bool,bool)": "078dfbe7",
              "whitelistMasterContract(address,bool)": "733a9d7c",
              "whitelistedMasterContracts(address)": "12a90c8a"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"masterContract\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"cloneAddress\",\"type\":\"address\"}],\"name\":\"LogDeploy\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"protocol\",\"type\":\"address\"}],\"name\":\"LogRegisterProtocol\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"masterContract\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"LogSetMasterContractApproval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"masterContract\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"LogWhiteListMasterContract\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"claimOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"masterContract\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"bool\",\"name\":\"useCreate2\",\"type\":\"bool\"}],\"name\":\"deploy\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"cloneAddress\",\"type\":\"address\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"masterContractApproved\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"masterContractOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pendingOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"registerProtocol\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"masterContract\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"setMasterContractApproval\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"direct\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"renounce\",\"type\":\"bool\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"masterContract\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"whitelistMasterContract\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"whitelistedMasterContracts\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"deploy(address,bytes,bool)\":{\"params\":{\"data\":\"Additional abi encoded calldata that is passed to the new clone via `IMasterContract.init`.\",\"masterContract\":\"The address of the contract to clone.\",\"useCreate2\":\"Creates the clone by using the CREATE2 opcode, in this case `data` will be used as salt.\"},\"returns\":{\"cloneAddress\":\"Address of the created clone contract.\"}},\"setMasterContractApproval(address,address,bool,uint8,bytes32,bytes32)\":{\"params\":{\"approved\":\"If True approves access. If False revokes access.\",\"masterContract\":\"The address who gains or loses access.\",\"r\":\"Part of the signature. (See EIP-191)\",\"s\":\"Part of the signature. (See EIP-191)\",\"user\":\"The address of the user that approves or revokes access.\",\"v\":\"Part of the signature. (See EIP-191)\"}},\"transferOwnership(address,bool,bool)\":{\"params\":{\"direct\":\"True if `newOwner` should be set immediately. False if `newOwner` needs to use `claimOwnership`.\",\"newOwner\":\"Address of the new owner.\",\"renounce\":\"Allows the `newOwner` to be `address(0)` if `direct` and `renounce` is True. Has no effect otherwise.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"claimOwnership()\":{\"notice\":\"Needs to be called by `pendingOwner` to claim ownership.\"},\"deploy(address,bytes,bool)\":{\"notice\":\"Deploys a given master Contract as a clone. Any ETH transferred with this call is forwarded to the new clone. Emits `LogDeploy`.\"},\"masterContractApproved(address,address)\":{\"notice\":\"masterContract to user to approval state\"},\"masterContractOf(address)\":{\"notice\":\"Mapping from clone contracts to their masterContract.\"},\"nonces(address)\":{\"notice\":\"user nonces for masterContract approvals\"},\"registerProtocol()\":{\"notice\":\"Other contracts need to register with this master contract so that users can approve them for the BentoBox.\"},\"setMasterContractApproval(address,address,bool,uint8,bytes32,bytes32)\":{\"notice\":\"Approves or revokes a `masterContract` access to `user` funds.\"},\"transferOwnership(address,bool,bool)\":{\"notice\":\"Transfers ownership to `newOwner`. Either directly or claimable by the new pending owner. Can only be invoked by the current `owner`.\"},\"whitelistMasterContract(address,bool)\":{\"notice\":\"Enables or disables a contract for approval without signed message.\"},\"whitelistedMasterContracts(address)\":{\"notice\":\"masterContract to whitelisted state for approval without signed message\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/bentobox/BentoBoxV1.sol\":\"MasterContractManager\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/bentobox/BentoBoxV1.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\n// The BentoBox\\n\\n//  \\u2584\\u2584\\u2584\\u2584\\u00b7 \\u2584\\u2584\\u2584 . \\u2590 \\u2584 \\u2584\\u2584\\u2584\\u2584\\u2584      \\u2584\\u2584\\u2584\\u2584\\u00b7       \\u2590\\u2584\\u2022 \\u2584\\n//  \\u2590\\u2588 \\u2580\\u2588\\u25aa\\u2580\\u2584.\\u2580\\u00b7\\u2588\\u258c\\u2590\\u2588\\u2022\\u2588\\u2588  \\u25aa     \\u2590\\u2588 \\u2580\\u2588\\u25aa\\u25aa      \\u2588\\u258c\\u2588\\u258c\\u25aa\\n//  \\u2590\\u2588\\u2580\\u2580\\u2588\\u2584\\u2590\\u2580\\u2580\\u25aa\\u2584\\u2590\\u2588\\u2590\\u2590\\u258c \\u2590\\u2588.\\u25aa \\u2584\\u2588\\u2580\\u2584 \\u2590\\u2588\\u2580\\u2580\\u2588\\u2584 \\u2584\\u2588\\u2580\\u2584  \\u00b7\\u2588\\u2588\\u00b7\\n//  \\u2588\\u2588\\u2584\\u25aa\\u2590\\u2588\\u2590\\u2588\\u2584\\u2584\\u258c\\u2588\\u2588\\u2590\\u2588\\u258c \\u2590\\u2588\\u258c\\u00b7\\u2590\\u2588\\u258c.\\u2590\\u258c\\u2588\\u2588\\u2584\\u25aa\\u2590\\u2588\\u2590\\u2588\\u258c.\\u2590\\u258c\\u25aa\\u2590\\u2588\\u00b7\\u2588\\u258c\\n//  \\u00b7\\u2580\\u2580\\u2580\\u2580  \\u2580\\u2580\\u2580 \\u2580\\u2580 \\u2588\\u25aa \\u2580\\u2580\\u2580  \\u2580\\u2588\\u2584\\u2580\\u25aa\\u00b7\\u2580\\u2580\\u2580\\u2580  \\u2580\\u2588\\u2584\\u2580\\u25aa\\u2022\\u2580\\u2580 \\u2580\\u2580\\n\\n// This contract stores funds, handles their transfers, supports flash loans and strategies.\\n\\n// Copyright (c) 2021 BoringCrypto - All rights reserved\\n// Twitter: @Boring_Crypto\\n\\n// Special thanks to Keno for all his hard work and support\\n\\n// Version 22-Mar-2021\\n\\npragma solidity 0.6.12;\\npragma experimental ABIEncoderV2;\\n\\n// solhint-disable avoid-low-level-calls\\n// solhint-disable not-rely-on-time\\n// solhint-disable no-inline-assembly\\n\\n// File @boringcrypto/boring-solidity/contracts/interfaces/IERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ninterface IERC20 {\\n    function totalSupply() external view returns (uint256);\\n\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /// @notice EIP 2612\\n    function permit(\\n        address owner,\\n        address spender,\\n        uint256 value,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) external;\\n}\\n\\n// File contracts/interfaces/IFlashLoan.sol\\n// License-Identifier: MIT\\n\\ninterface IFlashBorrower {\\n    /// @notice The flashloan callback. `amount` + `fee` needs to repayed to msg.sender before this call returns.\\n    /// @param sender The address of the invoker of this flashloan.\\n    /// @param token The address of the token that is loaned.\\n    /// @param amount of the `token` that is loaned.\\n    /// @param fee The fee that needs to be paid on top for this loan. Needs to be the same as `token`.\\n    /// @param data Additional data that was passed to the flashloan function.\\n    function onFlashLoan(\\n        address sender,\\n        IERC20 token,\\n        uint256 amount,\\n        uint256 fee,\\n        bytes calldata data\\n    ) external;\\n}\\n\\ninterface IBatchFlashBorrower {\\n    /// @notice The callback for batched flashloans. Every amount + fee needs to repayed to msg.sender before this call returns.\\n    /// @param sender The address of the invoker of this flashloan.\\n    /// @param tokens Array of addresses for ERC-20 tokens that is loaned.\\n    /// @param amounts A one-to-one map to `tokens` that is loaned.\\n    /// @param fees A one-to-one map to `tokens` that needs to be paid on top for each loan. Needs to be the same token.\\n    /// @param data Additional data that was passed to the flashloan function.\\n    function onBatchFlashLoan(\\n        address sender,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        uint256[] calldata fees,\\n        bytes calldata data\\n    ) external;\\n}\\n\\n// File contracts/interfaces/IWETH.sol\\n// License-Identifier: MIT\\n\\ninterface IWETH {\\n    function deposit() external payable;\\n\\n    function withdraw(uint256) external;\\n}\\n\\n// File contracts/interfaces/IStrategy.sol\\n// License-Identifier: MIT\\n\\ninterface IStrategy {\\n    /// @notice Send the assets to the Strategy and call skim to invest them.\\n    /// @param amount The amount of tokens to invest.\\n    function skim(uint256 amount) external;\\n\\n    /// @notice Harvest any profits made converted to the asset and pass them to the caller.\\n    /// @param balance The amount of tokens the caller thinks it has invested.\\n    /// @param sender The address of the initiator of this transaction. Can be used for reimbursements, etc.\\n    /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.\\n    function harvest(uint256 balance, address sender) external returns (int256 amountAdded);\\n\\n    /// @notice Withdraw assets. The returned amount can differ from the requested amount due to rounding.\\n    /// @dev The `actualAmount` should be very close to the amount.\\n    /// The difference should NOT be used to report a loss. That's what harvest is for.\\n    /// @param amount The requested amount the caller wants to withdraw.\\n    /// @return actualAmount The real amount that is withdrawn.\\n    function withdraw(uint256 amount) external returns (uint256 actualAmount);\\n\\n    /// @notice Withdraw all assets in the safest way possible. This shouldn't fail.\\n    /// @param balance The amount of tokens the caller thinks it has invested.\\n    /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.\\n    function exit(uint256 balance) external returns (int256 amountAdded);\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\nlibrary BoringERC20 {\\n    bytes4 private constant SIG_SYMBOL = 0x95d89b41; // symbol()\\n    bytes4 private constant SIG_NAME = 0x06fdde03; // name()\\n    bytes4 private constant SIG_DECIMALS = 0x313ce567; // decimals()\\n    bytes4 private constant SIG_TRANSFER = 0xa9059cbb; // transfer(address,uint256)\\n    bytes4 private constant SIG_TRANSFER_FROM = 0x23b872dd; // transferFrom(address,address,uint256)\\n\\n    /// @notice Provides a safe ERC20.transfer version for different ERC-20 implementations.\\n    /// Reverts on a failed transfer.\\n    /// @param token The address of the ERC-20 token.\\n    /// @param to Transfer tokens to.\\n    /// @param amount The token amount.\\n    function safeTransfer(\\n        IERC20 token,\\n        address to,\\n        uint256 amount\\n    ) internal {\\n        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER, to, amount));\\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: Transfer failed\\\");\\n    }\\n\\n    /// @notice Provides a safe ERC20.transferFrom version for different ERC-20 implementations.\\n    /// Reverts on a failed transfer.\\n    /// @param token The address of the ERC-20 token.\\n    /// @param from Transfer tokens from.\\n    /// @param to Transfer tokens to.\\n    /// @param amount The token amount.\\n    function safeTransferFrom(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 amount\\n    ) internal {\\n        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER_FROM, from, to, amount));\\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: TransferFrom failed\\\");\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringMath.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n/// @notice A library for performing overflow-/underflow-safe math,\\n/// updated with awesomeness from of DappHub (https://github.com/dapphub/ds-math).\\nlibrary BoringMath {\\n    function add(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require(b == 0 || (c = a * b) / b == a, \\\"BoringMath: Mul Overflow\\\");\\n    }\\n\\n    function to128(uint256 a) internal pure returns (uint128 c) {\\n        require(a <= uint128(-1), \\\"BoringMath: uint128 Overflow\\\");\\n        c = uint128(a);\\n    }\\n\\n    function to64(uint256 a) internal pure returns (uint64 c) {\\n        require(a <= uint64(-1), \\\"BoringMath: uint64 Overflow\\\");\\n        c = uint64(a);\\n    }\\n\\n    function to32(uint256 a) internal pure returns (uint32 c) {\\n        require(a <= uint32(-1), \\\"BoringMath: uint32 Overflow\\\");\\n        c = uint32(a);\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint128.\\nlibrary BoringMath128 {\\n    function add(uint128 a, uint128 b) internal pure returns (uint128 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint128 a, uint128 b) internal pure returns (uint128 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint64.\\nlibrary BoringMath64 {\\n    function add(uint64 a, uint64 b) internal pure returns (uint64 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint64 a, uint64 b) internal pure returns (uint64 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint32.\\nlibrary BoringMath32 {\\n    function add(uint32 a, uint32 b) internal pure returns (uint32 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint32 a, uint32 b) internal pure returns (uint32 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringRebase.sol@v1.2.0\\n// License-Identifier: MIT\\n\\nstruct Rebase {\\n    uint128 elastic;\\n    uint128 base;\\n}\\n\\n/// @notice A rebasing library using overflow-/underflow-safe math.\\nlibrary RebaseLibrary {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n\\n    /// @notice Calculates the base value in relationship to `elastic` and `total`.\\n    function toBase(\\n        Rebase memory total,\\n        uint256 elastic,\\n        bool roundUp\\n    ) internal pure returns (uint256 base) {\\n        if (total.elastic == 0) {\\n            base = elastic;\\n        } else {\\n            base = elastic.mul(total.base) / total.elastic;\\n            if (roundUp && base.mul(total.elastic) / total.base < elastic) {\\n                base = base.add(1);\\n            }\\n        }\\n    }\\n\\n    /// @notice Calculates the elastic value in relationship to `base` and `total`.\\n    function toElastic(\\n        Rebase memory total,\\n        uint256 base,\\n        bool roundUp\\n    ) internal pure returns (uint256 elastic) {\\n        if (total.base == 0) {\\n            elastic = base;\\n        } else {\\n            elastic = base.mul(total.elastic) / total.base;\\n            if (roundUp && elastic.mul(total.base) / total.elastic < base) {\\n                elastic = elastic.add(1);\\n            }\\n        }\\n    }\\n\\n    /// @notice Add `elastic` to `total` and doubles `total.base`.\\n    /// @return (Rebase) The new total.\\n    /// @return base in relationship to `elastic`.\\n    function add(\\n        Rebase memory total,\\n        uint256 elastic,\\n        bool roundUp\\n    ) internal pure returns (Rebase memory, uint256 base) {\\n        base = toBase(total, elastic, roundUp);\\n        total.elastic = total.elastic.add(elastic.to128());\\n        total.base = total.base.add(base.to128());\\n        return (total, base);\\n    }\\n\\n    /// @notice Sub `base` from `total` and update `total.elastic`.\\n    /// @return (Rebase) The new total.\\n    /// @return elastic in relationship to `base`.\\n    function sub(\\n        Rebase memory total,\\n        uint256 base,\\n        bool roundUp\\n    ) internal pure returns (Rebase memory, uint256 elastic) {\\n        elastic = toElastic(total, base, roundUp);\\n        total.elastic = total.elastic.sub(elastic.to128());\\n        total.base = total.base.sub(base.to128());\\n        return (total, elastic);\\n    }\\n\\n    /// @notice Add `elastic` and `base` to `total`.\\n    function add(\\n        Rebase memory total,\\n        uint256 elastic,\\n        uint256 base\\n    ) internal pure returns (Rebase memory) {\\n        total.elastic = total.elastic.add(elastic.to128());\\n        total.base = total.base.add(base.to128());\\n        return total;\\n    }\\n\\n    /// @notice Subtract `elastic` and `base` to `total`.\\n    function sub(\\n        Rebase memory total,\\n        uint256 elastic,\\n        uint256 base\\n    ) internal pure returns (Rebase memory) {\\n        total.elastic = total.elastic.sub(elastic.to128());\\n        total.base = total.base.sub(base.to128());\\n        return total;\\n    }\\n\\n    /// @notice Add `elastic` to `total` and update storage.\\n    /// @return newElastic Returns updated `elastic`.\\n    function addElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {\\n        newElastic = total.elastic = total.elastic.add(elastic.to128());\\n    }\\n\\n    /// @notice Subtract `elastic` from `total` and update storage.\\n    /// @return newElastic Returns updated `elastic`.\\n    function subElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {\\n        newElastic = total.elastic = total.elastic.sub(elastic.to128());\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringOwnable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n// Source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol + Claimable.sol\\n// Edited by BoringCrypto\\n\\ncontract BoringOwnableData {\\n    address public owner;\\n    address public pendingOwner;\\n}\\n\\ncontract BoringOwnable is BoringOwnableData {\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /// @notice `owner` defaults to msg.sender on construction.\\n    constructor() public {\\n        owner = msg.sender;\\n        emit OwnershipTransferred(address(0), msg.sender);\\n    }\\n\\n    /// @notice Transfers ownership to `newOwner`. Either directly or claimable by the new pending owner.\\n    /// Can only be invoked by the current `owner`.\\n    /// @param newOwner Address of the new owner.\\n    /// @param direct True if `newOwner` should be set immediately. False if `newOwner` needs to use `claimOwnership`.\\n    /// @param renounce Allows the `newOwner` to be `address(0)` if `direct` and `renounce` is True. Has no effect otherwise.\\n    function transferOwnership(\\n        address newOwner,\\n        bool direct,\\n        bool renounce\\n    ) public onlyOwner {\\n        if (direct) {\\n            // Checks\\n            require(newOwner != address(0) || renounce, \\\"Ownable: zero address\\\");\\n\\n            // Effects\\n            emit OwnershipTransferred(owner, newOwner);\\n            owner = newOwner;\\n            pendingOwner = address(0);\\n        } else {\\n            // Effects\\n            pendingOwner = newOwner;\\n        }\\n    }\\n\\n    /// @notice Needs to be called by `pendingOwner` to claim ownership.\\n    function claimOwnership() public {\\n        address _pendingOwner = pendingOwner;\\n\\n        // Checks\\n        require(msg.sender == _pendingOwner, \\\"Ownable: caller != pending owner\\\");\\n\\n        // Effects\\n        emit OwnershipTransferred(owner, _pendingOwner);\\n        owner = _pendingOwner;\\n        pendingOwner = address(0);\\n    }\\n\\n    /// @notice Only allows the `owner` to execute the function.\\n    modifier onlyOwner() {\\n        require(msg.sender == owner, \\\"Ownable: caller is not the owner\\\");\\n        _;\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/interfaces/IMasterContract.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ninterface IMasterContract {\\n    /// @notice Init function that gets called from `BoringFactory.deploy`.\\n    /// Also kown as the constructor for cloned contracts.\\n    /// Any ETH send to `BoringFactory.deploy` ends up here.\\n    /// @param data Can be abi encoded arguments or anything else.\\n    function init(bytes calldata data) external payable;\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringFactory.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ncontract BoringFactory {\\n    event LogDeploy(address indexed masterContract, bytes data, address indexed cloneAddress);\\n\\n    /// @notice Mapping from clone contracts to their masterContract.\\n    mapping(address => address) public masterContractOf;\\n\\n    /// @notice Deploys a given master Contract as a clone.\\n    /// Any ETH transferred with this call is forwarded to the new clone.\\n    /// Emits `LogDeploy`.\\n    /// @param masterContract The address of the contract to clone.\\n    /// @param data Additional abi encoded calldata that is passed to the new clone via `IMasterContract.init`.\\n    /// @param useCreate2 Creates the clone by using the CREATE2 opcode, in this case `data` will be used as salt.\\n    /// @return cloneAddress Address of the created clone contract.\\n    function deploy(\\n        address masterContract,\\n        bytes calldata data,\\n        bool useCreate2\\n    ) public payable returns (address cloneAddress) {\\n        require(masterContract != address(0), \\\"BoringFactory: No masterContract\\\");\\n        bytes20 targetBytes = bytes20(masterContract); // Takes the first 20 bytes of the masterContract's address\\n\\n        if (useCreate2) {\\n            // each masterContract has different code already. So clones are distinguished by their data only.\\n            bytes32 salt = keccak256(data);\\n\\n            // Creates clone, more info here: https://blog.openzeppelin.com/deep-dive-into-the-minimal-proxy-contract/\\n            assembly {\\n                let clone := mload(0x40)\\n                mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n                mstore(add(clone, 0x14), targetBytes)\\n                mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n                cloneAddress := create2(0, clone, 0x37, salt)\\n            }\\n        } else {\\n            assembly {\\n                let clone := mload(0x40)\\n                mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n                mstore(add(clone, 0x14), targetBytes)\\n                mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n                cloneAddress := create(0, clone, 0x37)\\n            }\\n        }\\n        masterContractOf[cloneAddress] = masterContract;\\n\\n        IMasterContract(cloneAddress).init{value: msg.value}(data);\\n\\n        emit LogDeploy(masterContract, data, cloneAddress);\\n    }\\n}\\n\\n// File contracts/MasterContractManager.sol\\n// License-Identifier: UNLICENSED\\n\\ncontract MasterContractManager is BoringOwnable, BoringFactory {\\n    event LogWhiteListMasterContract(address indexed masterContract, bool approved);\\n    event LogSetMasterContractApproval(address indexed masterContract, address indexed user, bool approved);\\n    event LogRegisterProtocol(address indexed protocol);\\n\\n    /// @notice masterContract to user to approval state\\n    mapping(address => mapping(address => bool)) public masterContractApproved;\\n    /// @notice masterContract to whitelisted state for approval without signed message\\n    mapping(address => bool) public whitelistedMasterContracts;\\n    /// @notice user nonces for masterContract approvals\\n    mapping(address => uint256) public nonces;\\n\\n    bytes32 private constant DOMAIN_SEPARATOR_SIGNATURE_HASH = keccak256(\\\"EIP712Domain(string name,uint256 chainId,address verifyingContract)\\\");\\n    // See https://eips.ethereum.org/EIPS/eip-191\\n    string private constant EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA = \\\"\\\\x19\\\\x01\\\";\\n    bytes32 private constant APPROVAL_SIGNATURE_HASH =\\n        keccak256(\\\"SetMasterContractApproval(string warning,address user,address masterContract,bool approved,uint256 nonce)\\\");\\n\\n    // solhint-disable-next-line var-name-mixedcase\\n    bytes32 private immutable _DOMAIN_SEPARATOR;\\n    // solhint-disable-next-line var-name-mixedcase\\n    uint256 private immutable DOMAIN_SEPARATOR_CHAIN_ID;\\n\\n    constructor() public {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        _DOMAIN_SEPARATOR = _calculateDomainSeparator(DOMAIN_SEPARATOR_CHAIN_ID = chainId);\\n    }\\n\\n    function _calculateDomainSeparator(uint256 chainId) private view returns (bytes32) {\\n        return keccak256(abi.encode(DOMAIN_SEPARATOR_SIGNATURE_HASH, keccak256(\\\"BentoBox V1\\\"), chainId, address(this)));\\n    }\\n\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() public view returns (bytes32) {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        return chainId == DOMAIN_SEPARATOR_CHAIN_ID ? _DOMAIN_SEPARATOR : _calculateDomainSeparator(chainId);\\n    }\\n\\n    /// @notice Other contracts need to register with this master contract so that users can approve them for the BentoBox.\\n    function registerProtocol() public {\\n        masterContractOf[msg.sender] = msg.sender;\\n        emit LogRegisterProtocol(msg.sender);\\n    }\\n\\n    /// @notice Enables or disables a contract for approval without signed message.\\n    function whitelistMasterContract(address masterContract, bool approved) public onlyOwner {\\n        // Checks\\n        require(masterContract != address(0), \\\"MasterCMgr: Cannot approve 0\\\");\\n\\n        // Effects\\n        whitelistedMasterContracts[masterContract] = approved;\\n        emit LogWhiteListMasterContract(masterContract, approved);\\n    }\\n\\n    /// @notice Approves or revokes a `masterContract` access to `user` funds.\\n    /// @param user The address of the user that approves or revokes access.\\n    /// @param masterContract The address who gains or loses access.\\n    /// @param approved If True approves access. If False revokes access.\\n    /// @param v Part of the signature. (See EIP-191)\\n    /// @param r Part of the signature. (See EIP-191)\\n    /// @param s Part of the signature. (See EIP-191)\\n    // F4 - Check behaviour for all function arguments when wrong or extreme\\n    // F4: Don't allow masterContract 0 to be approved. Unknown contracts will have a masterContract of 0.\\n    // F4: User can't be 0 for signed approvals because the recoveredAddress will be 0 if ecrecover fails\\n    function setMasterContractApproval(\\n        address user,\\n        address masterContract,\\n        bool approved,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) public {\\n        // Checks\\n        require(masterContract != address(0), \\\"MasterCMgr: masterC not set\\\"); // Important for security\\n\\n        // If no signature is provided, the fallback is executed\\n        if (r == 0 && s == 0 && v == 0) {\\n            require(user == msg.sender, \\\"MasterCMgr: user not sender\\\");\\n            require(masterContractOf[user] == address(0), \\\"MasterCMgr: user is clone\\\");\\n            require(whitelistedMasterContracts[masterContract], \\\"MasterCMgr: not whitelisted\\\");\\n        } else {\\n            // Important for security - any address without masterContract has address(0) as masterContract\\n            // So approving address(0) would approve every address, leading to full loss of funds\\n            // Also, ecrecover returns address(0) on failure. So we check this:\\n            require(user != address(0), \\\"MasterCMgr: User cannot be 0\\\");\\n\\n            // C10 - Protect signatures against replay, use nonce and chainId (SWC-121)\\n            // C10: nonce + chainId are used to prevent replays\\n            // C11 - All signatures strictly EIP-712 (SWC-117 SWC-122)\\n            // C11: signature is EIP-712 compliant\\n            // C12 - abi.encodePacked can't contain variable length user input (SWC-133)\\n            // C12: abi.encodePacked has fixed length parameters\\n            bytes32 digest =\\n                keccak256(\\n                    abi.encodePacked(\\n                        EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA,\\n                        DOMAIN_SEPARATOR(),\\n                        keccak256(\\n                            abi.encode(\\n                                APPROVAL_SIGNATURE_HASH,\\n                                approved\\n                                    ? keccak256(\\\"Give FULL access to funds in (and approved to) BentoBox?\\\")\\n                                    : keccak256(\\\"Revoke access to BentoBox?\\\"),\\n                                user,\\n                                masterContract,\\n                                approved,\\n                                nonces[user]++\\n                            )\\n                        )\\n                    )\\n                );\\n            address recoveredAddress = ecrecover(digest, v, r, s);\\n            require(recoveredAddress == user, \\\"MasterCMgr: Invalid Signature\\\");\\n        }\\n\\n        // Effects\\n        masterContractApproved[masterContract][user] = approved;\\n        emit LogSetMasterContractApproval(masterContract, user, approved);\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringBatchable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ncontract BaseBoringBatchable {\\n    /// @dev Helper function to extract a useful revert message from a failed call.\\n    /// If the returned data is malformed or not correctly abi encoded then this call can fail itself.\\n    function _getRevertMsg(bytes memory _returnData) internal pure returns (string memory) {\\n        // If the _res length is less than 68, then the transaction failed silently (without a revert message)\\n        if (_returnData.length < 68) return \\\"Transaction reverted silently\\\";\\n\\n        assembly {\\n            // Slice the sighash.\\n            _returnData := add(_returnData, 0x04)\\n        }\\n        return abi.decode(_returnData, (string)); // All that remains is the revert string\\n    }\\n\\n    /// @notice Allows batched call to self (this contract).\\n    /// @param calls An array of inputs for each call.\\n    /// @param revertOnFail If True then reverts after a failed call and stops doing further calls.\\n    /// @return successes An array indicating the success of a call, mapped one-to-one to `calls`.\\n    /// @return results An array with the returned data of each function call, mapped one-to-one to `calls`.\\n    // F1: External is ok here because this is the batch function, adding it to a batch makes no sense\\n    // F2: Calls in the batch may be payable, delegatecall operates in the same context, so each call in the batch has access to msg.value\\n    // C3: The length of the loop is fully under user control, so can't be exploited\\n    // C7: Delegatecall is only used on the same contract, so it's safe\\n    function batch(bytes[] calldata calls, bool revertOnFail) external payable returns (bool[] memory successes, bytes[] memory results) {\\n        successes = new bool[](calls.length);\\n        results = new bytes[](calls.length);\\n        for (uint256 i = 0; i < calls.length; i++) {\\n            (bool success, bytes memory result) = address(this).delegatecall(calls[i]);\\n            require(success || !revertOnFail, _getRevertMsg(result));\\n            successes[i] = success;\\n            results[i] = result;\\n        }\\n    }\\n}\\n\\ncontract BoringBatchable is BaseBoringBatchable {\\n    /// @notice Call wrapper that performs `ERC20.permit` on `token`.\\n    /// Lookup `IERC20.permit`.\\n    // F6: Parameters can be used front-run the permit and the user's permit will fail (due to nonce or other revert)\\n    //     if part of a batch this could be used to grief once as the second call would not need the permit\\n    function permitToken(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) public {\\n        token.permit(from, to, amount, deadline, v, r, s);\\n    }\\n}\\n\\n// File contracts/BentoBox.sol\\n// License-Identifier: UNLICENSED\\n\\n/// @title BentoBox\\n/// @author BoringCrypto, Keno\\n/// @notice The BentoBox is a vault for tokens. The stored tokens can be flash loaned and used in strategies.\\n/// Yield from this will go to the token depositors.\\n/// Rebasing tokens ARE NOT supported and WILL cause loss of funds.\\n/// Any funds transfered directly onto the BentoBox will be lost, use the deposit function instead.\\ncontract BentoBoxV1 is MasterContractManager, BoringBatchable {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n    using BoringERC20 for IERC20;\\n    using RebaseLibrary for Rebase;\\n\\n    // ************** //\\n    // *** EVENTS *** //\\n    // ************** //\\n\\n    event LogDeposit(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogWithdraw(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogTransfer(IERC20 indexed token, address indexed from, address indexed to, uint256 share);\\n\\n    event LogFlashLoan(address indexed borrower, IERC20 indexed token, uint256 amount, uint256 feeAmount, address indexed receiver);\\n\\n    event LogStrategyTargetPercentage(IERC20 indexed token, uint256 targetPercentage);\\n    event LogStrategyQueued(IERC20 indexed token, IStrategy indexed strategy);\\n    event LogStrategySet(IERC20 indexed token, IStrategy indexed strategy);\\n    event LogStrategyInvest(IERC20 indexed token, uint256 amount);\\n    event LogStrategyDivest(IERC20 indexed token, uint256 amount);\\n    event LogStrategyProfit(IERC20 indexed token, uint256 amount);\\n    event LogStrategyLoss(IERC20 indexed token, uint256 amount);\\n\\n    // *************** //\\n    // *** STRUCTS *** //\\n    // *************** //\\n\\n    struct StrategyData {\\n        uint64 strategyStartDate;\\n        uint64 targetPercentage;\\n        uint128 balance; // the balance of the strategy that BentoBox thinks is in there\\n    }\\n\\n    // ******************************** //\\n    // *** CONSTANTS AND IMMUTABLES *** //\\n    // ******************************** //\\n\\n    // V2 - Can they be private?\\n    // V2: Private to save gas, to verify it's correct, check the constructor arguments\\n    IERC20 private immutable wethToken;\\n\\n    IERC20 private constant USE_ETHEREUM = IERC20(0);\\n    uint256 private constant FLASH_LOAN_FEE = 50; // 0.05%\\n    uint256 private constant FLASH_LOAN_FEE_PRECISION = 1e5;\\n    uint256 private constant STRATEGY_DELAY = 2 weeks;\\n    uint256 private constant MAX_TARGET_PERCENTAGE = 95; // 95%\\n    uint256 private constant MINIMUM_SHARE_BALANCE = 1000; // To prevent the ratio going off\\n\\n    // ***************** //\\n    // *** VARIABLES *** //\\n    // ***************** //\\n\\n    // Balance per token per address/contract in shares\\n    mapping(IERC20 => mapping(address => uint256)) public balanceOf;\\n\\n    // Rebase from amount to share\\n    mapping(IERC20 => Rebase) public totals;\\n\\n    mapping(IERC20 => IStrategy) public strategy;\\n    mapping(IERC20 => IStrategy) public pendingStrategy;\\n    mapping(IERC20 => StrategyData) public strategyData;\\n\\n    // ******************* //\\n    // *** CONSTRUCTOR *** //\\n    // ******************* //\\n\\n    constructor(IERC20 wethToken_) public {\\n        wethToken = wethToken_;\\n    }\\n\\n    // ***************** //\\n    // *** MODIFIERS *** //\\n    // ***************** //\\n\\n    /// Modifier to check if the msg.sender is allowed to use funds belonging to the 'from' address.\\n    /// If 'from' is msg.sender, it's allowed.\\n    /// If 'from' is the BentoBox itself, it's allowed. Any ETH, token balances (above the known balances) or BentoBox balances\\n    /// can be taken by anyone.\\n    /// This is to enable skimming, not just for deposits, but also for withdrawals or transfers, enabling better composability.\\n    /// If 'from' is a clone of a masterContract AND the 'from' address has approved that masterContract, it's allowed.\\n    modifier allowed(address from) {\\n        if (from != msg.sender && from != address(this)) {\\n            // From is sender or you are skimming\\n            address masterContract = masterContractOf[msg.sender];\\n            require(masterContract != address(0), \\\"BentoBox: no masterContract\\\");\\n            require(masterContractApproved[masterContract][from], \\\"BentoBox: Transfer not approved\\\");\\n        }\\n        _;\\n    }\\n\\n    // ************************** //\\n    // *** INTERNAL FUNCTIONS *** //\\n    // ************************** //\\n\\n    /// @dev Returns the total balance of `token` this contracts holds,\\n    /// plus the total amount this contract thinks the strategy holds.\\n    function _tokenBalanceOf(IERC20 token) internal view returns (uint256 amount) {\\n        amount = token.balanceOf(address(this)).add(strategyData[token].balance);\\n    }\\n\\n    // ************************ //\\n    // *** PUBLIC FUNCTIONS *** //\\n    // ************************ //\\n\\n    /// @dev Helper function to represent an `amount` of `token` in shares.\\n    /// @param token The ERC-20 token.\\n    /// @param amount The `token` amount.\\n    /// @param roundUp If the result `share` should be rounded up.\\n    /// @return share The token amount represented in shares.\\n    function toShare(\\n        IERC20 token,\\n        uint256 amount,\\n        bool roundUp\\n    ) external view returns (uint256 share) {\\n        share = totals[token].toBase(amount, roundUp);\\n    }\\n\\n    /// @dev Helper function represent shares back into the `token` amount.\\n    /// @param token The ERC-20 token.\\n    /// @param share The amount of shares.\\n    /// @param roundUp If the result should be rounded up.\\n    /// @return amount The share amount back into native representation.\\n    function toAmount(\\n        IERC20 token,\\n        uint256 share,\\n        bool roundUp\\n    ) external view returns (uint256 amount) {\\n        amount = totals[token].toElastic(share, roundUp);\\n    }\\n\\n    /// @notice Deposit an amount of `token` represented in either `amount` or `share`.\\n    /// @param token_ The ERC-20 token to deposit.\\n    /// @param from which account to pull the tokens.\\n    /// @param to which account to push the tokens.\\n    /// @param amount Token amount in native representation to deposit.\\n    /// @param share Token amount represented in shares to deposit. Takes precedence over `amount`.\\n    /// @return amountOut The amount deposited.\\n    /// @return shareOut The deposited amount repesented in shares.\\n    function deposit(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) public payable allowed(from) returns (uint256 amountOut, uint256 shareOut) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;\\n        Rebase memory total = totals[token];\\n\\n        // If a new token gets added, the tokenSupply call checks that this is a deployed contract. Needed for security.\\n        require(total.elastic != 0 || token.totalSupply() > 0, \\\"BentoBox: No tokens\\\");\\n        if (share == 0) {\\n            // value of the share may be lower than the amount due to rounding, that's ok\\n            share = total.toBase(amount, false);\\n            // Any deposit should lead to at least the minimum share balance, otherwise it's ignored (no amount taken)\\n            if (total.base.add(share.to128()) < MINIMUM_SHARE_BALANCE) {\\n                return (0, 0);\\n            }\\n        } else {\\n            // amount may be lower than the value of share due to rounding, in that case, add 1 to amount (Always round up)\\n            amount = total.toElastic(share, true);\\n        }\\n\\n        // In case of skimming, check that only the skimmable amount is taken.\\n        // For ETH, the full balance is available, so no need to check.\\n        // During flashloans the _tokenBalanceOf is lower than 'reality', so skimming deposits will mostly fail during a flashloan.\\n        require(\\n            from != address(this) || token_ == USE_ETHEREUM || amount <= _tokenBalanceOf(token).sub(total.elastic),\\n            \\\"BentoBox: Skim too much\\\"\\n        );\\n\\n        balanceOf[token][to] = balanceOf[token][to].add(share);\\n        total.base = total.base.add(share.to128());\\n        total.elastic = total.elastic.add(amount.to128());\\n        totals[token] = total;\\n\\n        // Interactions\\n        // During the first deposit, we check that this token is 'real'\\n        if (token_ == USE_ETHEREUM) {\\n            // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)\\n            // X2: If the WETH implementation is faulty or malicious, it will block adding ETH (but we know the WETH implementation)\\n            IWETH(address(wethToken)).deposit{value: amount}();\\n        } else if (from != address(this)) {\\n            // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)\\n            // X2: If the token implementation is faulty or malicious, it may block adding tokens. Good.\\n            token.safeTransferFrom(from, address(this), amount);\\n        }\\n        emit LogDeposit(token, from, to, amount, share);\\n        amountOut = amount;\\n        shareOut = share;\\n    }\\n\\n    /// @notice Withdraws an amount of `token` from a user account.\\n    /// @param token_ The ERC-20 token to withdraw.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param amount of tokens. Either one of `amount` or `share` needs to be supplied.\\n    /// @param share Like above, but `share` takes precedence over `amount`.\\n    function withdraw(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) public allowed(from) returns (uint256 amountOut, uint256 shareOut) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;\\n        Rebase memory total = totals[token];\\n        if (share == 0) {\\n            // value of the share paid could be lower than the amount paid due to rounding, in that case, add a share (Always round up)\\n            share = total.toBase(amount, true);\\n        } else {\\n            // amount may be lower than the value of share due to rounding, that's ok\\n            amount = total.toElastic(share, false);\\n        }\\n\\n        balanceOf[token][from] = balanceOf[token][from].sub(share);\\n        total.elastic = total.elastic.sub(amount.to128());\\n        total.base = total.base.sub(share.to128());\\n        // There have to be at least 1000 shares left to prevent reseting the share/amount ratio (unless it's fully emptied)\\n        require(total.base >= MINIMUM_SHARE_BALANCE || total.base == 0, \\\"BentoBox: cannot empty\\\");\\n        totals[token] = total;\\n\\n        // Interactions\\n        if (token_ == USE_ETHEREUM) {\\n            // X2, X3: A revert or big gas usage in the WETH contract could block withdrawals, but WETH9 is fine.\\n            IWETH(address(wethToken)).withdraw(amount);\\n            // X2, X3: A revert or big gas usage could block, however, the to address is under control of the caller.\\n            (bool success, ) = to.call{value: amount}(\\\"\\\");\\n            require(success, \\\"BentoBox: ETH transfer failed\\\");\\n        } else {\\n            // X2, X3: A malicious token could block withdrawal of just THAT token.\\n            //         masterContracts may want to take care not to rely on withdraw always succeeding.\\n            token.safeTransfer(to, amount);\\n        }\\n        emit LogWithdraw(token, from, to, amount, share);\\n        amountOut = amount;\\n        shareOut = share;\\n    }\\n\\n    /// @notice Transfer shares from a user account to another one.\\n    /// @param token The ERC-20 token to transfer.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param share The amount of `token` in shares.\\n    // Clones of master contracts can transfer from any account that has approved them\\n    // F3 - Can it be combined with another similar function?\\n    // F3: This isn't combined with transferMultiple for gas optimization\\n    function transfer(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 share\\n    ) public allowed(from) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        balanceOf[token][from] = balanceOf[token][from].sub(share);\\n        balanceOf[token][to] = balanceOf[token][to].add(share);\\n\\n        emit LogTransfer(token, from, to, share);\\n    }\\n\\n    /// @notice Transfer shares from a user account to multiple other ones.\\n    /// @param token The ERC-20 token to transfer.\\n    /// @param from which user to pull the tokens.\\n    /// @param tos The receivers of the tokens.\\n    /// @param shares The amount of `token` in shares for each receiver in `tos`.\\n    // F3 - Can it be combined with another similar function?\\n    // F3: This isn't combined with transfer for gas optimization\\n    function transferMultiple(\\n        IERC20 token,\\n        address from,\\n        address[] calldata tos,\\n        uint256[] calldata shares\\n    ) public allowed(from) {\\n        // Checks\\n        require(tos[0] != address(0), \\\"BentoBox: to[0] not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        uint256 totalAmount;\\n        uint256 len = tos.length;\\n        for (uint256 i = 0; i < len; i++) {\\n            address to = tos[i];\\n            balanceOf[token][to] = balanceOf[token][to].add(shares[i]);\\n            totalAmount = totalAmount.add(shares[i]);\\n            emit LogTransfer(token, from, to, shares[i]);\\n        }\\n        balanceOf[token][from] = balanceOf[token][from].sub(totalAmount);\\n    }\\n\\n    /// @notice Flashloan ability.\\n    /// @param borrower The address of the contract that implements and conforms to `IFlashBorrower` and handles the flashloan.\\n    /// @param receiver Address of the token receiver.\\n    /// @param token The address of the token to receive.\\n    /// @param amount of the tokens to receive.\\n    /// @param data The calldata to pass to the `borrower` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Not possible to follow this here, reentrancy has been reviewed\\n    // F6 - Check for front-running possibilities, such as the approve function (SWC-114)\\n    // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.\\n    function flashLoan(\\n        IFlashBorrower borrower,\\n        address receiver,\\n        IERC20 token,\\n        uint256 amount,\\n        bytes calldata data\\n    ) public {\\n        uint256 fee = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;\\n        token.safeTransfer(receiver, amount);\\n\\n        borrower.onFlashLoan(msg.sender, token, amount, fee, data);\\n\\n        require(_tokenBalanceOf(token) >= totals[token].addElastic(fee.to128()), \\\"BentoBox: Wrong amount\\\");\\n        emit LogFlashLoan(address(borrower), token, amount, fee, receiver);\\n    }\\n\\n    /// @notice Support for batched flashloans. Useful to request multiple different `tokens` in a single transaction.\\n    /// @param borrower The address of the contract that implements and conforms to `IBatchFlashBorrower` and handles the flashloan.\\n    /// @param receivers An array of the token receivers. A one-to-one mapping with `tokens` and `amounts`.\\n    /// @param tokens The addresses of the tokens.\\n    /// @param amounts of the tokens for each receiver.\\n    /// @param data The calldata to pass to the `borrower` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Not possible to follow this here, reentrancy has been reviewed\\n    // F6 - Check for front-running possibilities, such as the approve function (SWC-114)\\n    // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.\\n    function batchFlashLoan(\\n        IBatchFlashBorrower borrower,\\n        address[] calldata receivers,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        bytes calldata data\\n    ) public {\\n        uint256[] memory fees = new uint256[](tokens.length);\\n\\n        uint256 len = tokens.length;\\n        for (uint256 i = 0; i < len; i++) {\\n            uint256 amount = amounts[i];\\n            fees[i] = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;\\n\\n            tokens[i].safeTransfer(receivers[i], amounts[i]);\\n        }\\n\\n        borrower.onBatchFlashLoan(msg.sender, tokens, amounts, fees, data);\\n\\n        for (uint256 i = 0; i < len; i++) {\\n            IERC20 token = tokens[i];\\n            require(_tokenBalanceOf(token) >= totals[token].addElastic(fees[i].to128()), \\\"BentoBox: Wrong amount\\\");\\n            emit LogFlashLoan(address(borrower), token, amounts[i], fees[i], receivers[i]);\\n        }\\n    }\\n\\n    /// @notice Sets the target percentage of the strategy for `token`.\\n    /// @dev Only the owner of this contract is allowed to change this.\\n    /// @param token The address of the token that maps to a strategy to change.\\n    /// @param targetPercentage_ The new target in percent. Must be lesser or equal to `MAX_TARGET_PERCENTAGE`.\\n    function setStrategyTargetPercentage(IERC20 token, uint64 targetPercentage_) public onlyOwner {\\n        // Checks\\n        require(targetPercentage_ <= MAX_TARGET_PERCENTAGE, \\\"StrategyManager: Target too high\\\");\\n\\n        // Effects\\n        strategyData[token].targetPercentage = targetPercentage_;\\n        emit LogStrategyTargetPercentage(token, targetPercentage_);\\n    }\\n\\n    /// @notice Sets the contract address of a new strategy that conforms to `IStrategy` for `token`.\\n    /// Must be called twice with the same arguments.\\n    /// A new strategy becomes pending first and can be activated once `STRATEGY_DELAY` is over.\\n    /// @dev Only the owner of this contract is allowed to change this.\\n    /// @param token The address of the token that maps to a strategy to change.\\n    /// @param newStrategy The address of the contract that conforms to `IStrategy`.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Total amount is updated AFTER interaction. But strategy is under our control.\\n    // C4 - Use block.timestamp only for long intervals (SWC-116)\\n    // C4: block.timestamp is used for a period of 2 weeks, which is long enough\\n    function setStrategy(IERC20 token, IStrategy newStrategy) public onlyOwner {\\n        StrategyData memory data = strategyData[token];\\n        IStrategy pending = pendingStrategy[token];\\n        if (data.strategyStartDate == 0 || pending != newStrategy) {\\n            pendingStrategy[token] = newStrategy;\\n            // C1 - All math done through BoringMath (SWC-101)\\n            // C1: Our sun will swallow the earth well before this overflows\\n            data.strategyStartDate = (block.timestamp + STRATEGY_DELAY).to64();\\n            emit LogStrategyQueued(token, newStrategy);\\n        } else {\\n            require(data.strategyStartDate != 0 && block.timestamp >= data.strategyStartDate, \\\"StrategyManager: Too early\\\");\\n            if (address(strategy[token]) != address(0)) {\\n                int256 balanceChange = strategy[token].exit(data.balance);\\n                // Effects\\n                if (balanceChange > 0) {\\n                    uint256 add = uint256(balanceChange);\\n                    totals[token].addElastic(add);\\n                    emit LogStrategyProfit(token, add);\\n                } else if (balanceChange < 0) {\\n                    uint256 sub = uint256(-balanceChange);\\n                    totals[token].subElastic(sub);\\n                    emit LogStrategyLoss(token, sub);\\n                }\\n\\n                emit LogStrategyDivest(token, data.balance);\\n            }\\n            strategy[token] = pending;\\n            data.strategyStartDate = 0;\\n            data.balance = 0;\\n            pendingStrategy[token] = IStrategy(0);\\n            emit LogStrategySet(token, newStrategy);\\n        }\\n        strategyData[token] = data;\\n    }\\n\\n    /// @notice The actual process of yield farming. Executes the strategy of `token`.\\n    /// Optionally does housekeeping if `balance` is true.\\n    /// `maxChangeAmount` is relevant for skimming or withdrawing if `balance` is true.\\n    /// @param token The address of the token for which a strategy is deployed.\\n    /// @param balance True if housekeeping should be done.\\n    /// @param maxChangeAmount The maximum amount for either pulling or pushing from/to the `IStrategy` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Total amount is updated AFTER interaction. But strategy is under our control.\\n    // F5: Not followed to prevent reentrancy issues with flashloans and BentoBox skims?\\n    function harvest(\\n        IERC20 token,\\n        bool balance,\\n        uint256 maxChangeAmount\\n    ) public {\\n        StrategyData memory data = strategyData[token];\\n        IStrategy _strategy = strategy[token];\\n        int256 balanceChange = _strategy.harvest(data.balance, msg.sender);\\n        if (balanceChange == 0 && !balance) {\\n            return;\\n        }\\n\\n        uint256 totalElastic = totals[token].elastic;\\n\\n        if (balanceChange > 0) {\\n            uint256 add = uint256(balanceChange);\\n            totalElastic = totalElastic.add(add);\\n            totals[token].elastic = totalElastic.to128();\\n            emit LogStrategyProfit(token, add);\\n        } else if (balanceChange < 0) {\\n            // C1 - All math done through BoringMath (SWC-101)\\n            // C1: balanceChange could overflow if it's max negative int128.\\n            // But tokens with balances that large are not supported by the BentoBox.\\n            uint256 sub = uint256(-balanceChange);\\n            totalElastic = totalElastic.sub(sub);\\n            totals[token].elastic = totalElastic.to128();\\n            data.balance = data.balance.sub(sub.to128());\\n            emit LogStrategyLoss(token, sub);\\n        }\\n\\n        if (balance) {\\n            uint256 targetBalance = totalElastic.mul(data.targetPercentage) / 100;\\n            // if data.balance == targetBalance there is nothing to update\\n            if (data.balance < targetBalance) {\\n                uint256 amountOut = targetBalance.sub(data.balance);\\n                if (maxChangeAmount != 0 && amountOut > maxChangeAmount) {\\n                    amountOut = maxChangeAmount;\\n                }\\n                token.safeTransfer(address(_strategy), amountOut);\\n                data.balance = data.balance.add(amountOut.to128());\\n                _strategy.skim(amountOut);\\n                emit LogStrategyInvest(token, amountOut);\\n            } else if (data.balance > targetBalance) {\\n                uint256 amountIn = data.balance.sub(targetBalance.to128());\\n                if (maxChangeAmount != 0 && amountIn > maxChangeAmount) {\\n                    amountIn = maxChangeAmount;\\n                }\\n\\n                uint256 actualAmountIn = _strategy.withdraw(amountIn);\\n\\n                data.balance = data.balance.sub(actualAmountIn.to128());\\n                emit LogStrategyDivest(token, actualAmountIn);\\n            }\\n        }\\n\\n        strategyData[token] = data;\\n    }\\n\\n    // Contract should be able to receive ETH deposits to support deposit & skim\\n    // solhint-disable-next-line no-empty-blocks\\n    receive() external payable {}\\n}\\n\",\"keccak256\":\"0xf5251397b9aaa5c66ddc18b0cb96350ffac09f5776a1255fedc0072641f916fe\",\"license\":\"UNLICENSED\"}},\"version\":1}",
          "storageLayout": {
            "storage": [
              {
                "astId": 900,
                "contract": "contracts/bentobox/BentoBoxV1.sol:MasterContractManager",
                "label": "owner",
                "offset": 0,
                "slot": "0",
                "type": "t_address"
              },
              {
                "astId": 902,
                "contract": "contracts/bentobox/BentoBoxV1.sol:MasterContractManager",
                "label": "pendingOwner",
                "offset": 0,
                "slot": "1",
                "type": "t_address"
              },
              {
                "astId": 1046,
                "contract": "contracts/bentobox/BentoBoxV1.sol:MasterContractManager",
                "label": "masterContractOf",
                "offset": 0,
                "slot": "2",
                "type": "t_mapping(t_address,t_address)"
              },
              {
                "astId": 1140,
                "contract": "contracts/bentobox/BentoBoxV1.sol:MasterContractManager",
                "label": "masterContractApproved",
                "offset": 0,
                "slot": "3",
                "type": "t_mapping(t_address,t_mapping(t_address,t_bool))"
              },
              {
                "astId": 1145,
                "contract": "contracts/bentobox/BentoBoxV1.sol:MasterContractManager",
                "label": "whitelistedMasterContracts",
                "offset": 0,
                "slot": "4",
                "type": "t_mapping(t_address,t_bool)"
              },
              {
                "astId": 1150,
                "contract": "contracts/bentobox/BentoBoxV1.sol:MasterContractManager",
                "label": "nonces",
                "offset": 0,
                "slot": "5",
                "type": "t_mapping(t_address,t_uint256)"
              }
            ],
            "types": {
              "t_address": {
                "encoding": "inplace",
                "label": "address",
                "numberOfBytes": "20"
              },
              "t_bool": {
                "encoding": "inplace",
                "label": "bool",
                "numberOfBytes": "1"
              },
              "t_mapping(t_address,t_address)": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => address)",
                "numberOfBytes": "32",
                "value": "t_address"
              },
              "t_mapping(t_address,t_bool)": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => bool)",
                "numberOfBytes": "32",
                "value": "t_bool"
              },
              "t_mapping(t_address,t_mapping(t_address,t_bool))": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => mapping(address => bool))",
                "numberOfBytes": "32",
                "value": "t_mapping(t_address,t_bool)"
              },
              "t_mapping(t_address,t_uint256)": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => uint256)",
                "numberOfBytes": "32",
                "value": "t_uint256"
              },
              "t_uint256": {
                "encoding": "inplace",
                "label": "uint256",
                "numberOfBytes": "32"
              }
            }
          },
          "userdoc": {
            "kind": "user",
            "methods": {
              "claimOwnership()": {
                "notice": "Needs to be called by `pendingOwner` to claim ownership."
              },
              "deploy(address,bytes,bool)": {
                "notice": "Deploys a given master Contract as a clone. Any ETH transferred with this call is forwarded to the new clone. Emits `LogDeploy`."
              },
              "masterContractApproved(address,address)": {
                "notice": "masterContract to user to approval state"
              },
              "masterContractOf(address)": {
                "notice": "Mapping from clone contracts to their masterContract."
              },
              "nonces(address)": {
                "notice": "user nonces for masterContract approvals"
              },
              "registerProtocol()": {
                "notice": "Other contracts need to register with this master contract so that users can approve them for the BentoBox."
              },
              "setMasterContractApproval(address,address,bool,uint8,bytes32,bytes32)": {
                "notice": "Approves or revokes a `masterContract` access to `user` funds."
              },
              "transferOwnership(address,bool,bool)": {
                "notice": "Transfers ownership to `newOwner`. Either directly or claimable by the new pending owner. Can only be invoked by the current `owner`."
              },
              "whitelistMasterContract(address,bool)": {
                "notice": "Enables or disables a contract for approval without signed message."
              },
              "whitelistedMasterContracts(address)": {
                "notice": "masterContract to whitelisted state for approval without signed message"
              }
            },
            "version": 1
          }
        },
        "RebaseLibrary": {
          "abi": [],
          "devdoc": {
            "kind": "dev",
            "methods": {},
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "60566023600b82828239805160001a607314601657fe5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220e973b6a0c92ea2543d03dc65da85f77eff3020b62283eba5f38065753ced949864736f6c634300060c0033",
              "opcodes": "PUSH1 0x56 PUSH1 0x23 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x16 JUMPI INVALID JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xE9 PUSH20 0xB6A0C92EA2543D03DC65DA85F77EFF3020B62283 0xEB 0xA5 RETURN DUP1 PUSH6 0x753CED949864 PUSH20 0x6F6C634300060C00330000000000000000000000 ",
              "sourceMap": "9591:3411:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220e973b6a0c92ea2543d03dc65da85f77eff3020b62283eba5f38065753ced949864736f6c634300060c0033",
              "opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xE9 PUSH20 0xB6A0C92EA2543D03DC65DA85F77EFF3020B62283 0xEB 0xA5 RETURN DUP1 PUSH6 0x753CED949864 PUSH20 0x6F6C634300060C00330000000000000000000000 ",
              "sourceMap": "9591:3411:0:-:0;;;;;;;;"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "17200",
                "executionCost": "97",
                "totalCost": "17297"
              },
              "internal": {
                "add(struct Rebase memory,uint256,bool)": "infinite",
                "add(struct Rebase memory,uint256,uint256)": "infinite",
                "addElastic(struct Rebase storage pointer,uint256)": "infinite",
                "sub(struct Rebase memory,uint256,bool)": "infinite",
                "sub(struct Rebase memory,uint256,uint256)": "infinite",
                "subElastic(struct Rebase storage pointer,uint256)": "infinite",
                "toBase(struct Rebase memory,uint256,bool)": "infinite",
                "toElastic(struct Rebase memory,uint256,bool)": "infinite"
              }
            },
            "methodIdentifiers": {}
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"A rebasing library using overflow-/underflow-safe math.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/bentobox/BentoBoxV1.sol\":\"RebaseLibrary\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/bentobox/BentoBoxV1.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\n// The BentoBox\\n\\n//  \\u2584\\u2584\\u2584\\u2584\\u00b7 \\u2584\\u2584\\u2584 . \\u2590 \\u2584 \\u2584\\u2584\\u2584\\u2584\\u2584      \\u2584\\u2584\\u2584\\u2584\\u00b7       \\u2590\\u2584\\u2022 \\u2584\\n//  \\u2590\\u2588 \\u2580\\u2588\\u25aa\\u2580\\u2584.\\u2580\\u00b7\\u2588\\u258c\\u2590\\u2588\\u2022\\u2588\\u2588  \\u25aa     \\u2590\\u2588 \\u2580\\u2588\\u25aa\\u25aa      \\u2588\\u258c\\u2588\\u258c\\u25aa\\n//  \\u2590\\u2588\\u2580\\u2580\\u2588\\u2584\\u2590\\u2580\\u2580\\u25aa\\u2584\\u2590\\u2588\\u2590\\u2590\\u258c \\u2590\\u2588.\\u25aa \\u2584\\u2588\\u2580\\u2584 \\u2590\\u2588\\u2580\\u2580\\u2588\\u2584 \\u2584\\u2588\\u2580\\u2584  \\u00b7\\u2588\\u2588\\u00b7\\n//  \\u2588\\u2588\\u2584\\u25aa\\u2590\\u2588\\u2590\\u2588\\u2584\\u2584\\u258c\\u2588\\u2588\\u2590\\u2588\\u258c \\u2590\\u2588\\u258c\\u00b7\\u2590\\u2588\\u258c.\\u2590\\u258c\\u2588\\u2588\\u2584\\u25aa\\u2590\\u2588\\u2590\\u2588\\u258c.\\u2590\\u258c\\u25aa\\u2590\\u2588\\u00b7\\u2588\\u258c\\n//  \\u00b7\\u2580\\u2580\\u2580\\u2580  \\u2580\\u2580\\u2580 \\u2580\\u2580 \\u2588\\u25aa \\u2580\\u2580\\u2580  \\u2580\\u2588\\u2584\\u2580\\u25aa\\u00b7\\u2580\\u2580\\u2580\\u2580  \\u2580\\u2588\\u2584\\u2580\\u25aa\\u2022\\u2580\\u2580 \\u2580\\u2580\\n\\n// This contract stores funds, handles their transfers, supports flash loans and strategies.\\n\\n// Copyright (c) 2021 BoringCrypto - All rights reserved\\n// Twitter: @Boring_Crypto\\n\\n// Special thanks to Keno for all his hard work and support\\n\\n// Version 22-Mar-2021\\n\\npragma solidity 0.6.12;\\npragma experimental ABIEncoderV2;\\n\\n// solhint-disable avoid-low-level-calls\\n// solhint-disable not-rely-on-time\\n// solhint-disable no-inline-assembly\\n\\n// File @boringcrypto/boring-solidity/contracts/interfaces/IERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ninterface IERC20 {\\n    function totalSupply() external view returns (uint256);\\n\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /// @notice EIP 2612\\n    function permit(\\n        address owner,\\n        address spender,\\n        uint256 value,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) external;\\n}\\n\\n// File contracts/interfaces/IFlashLoan.sol\\n// License-Identifier: MIT\\n\\ninterface IFlashBorrower {\\n    /// @notice The flashloan callback. `amount` + `fee` needs to repayed to msg.sender before this call returns.\\n    /// @param sender The address of the invoker of this flashloan.\\n    /// @param token The address of the token that is loaned.\\n    /// @param amount of the `token` that is loaned.\\n    /// @param fee The fee that needs to be paid on top for this loan. Needs to be the same as `token`.\\n    /// @param data Additional data that was passed to the flashloan function.\\n    function onFlashLoan(\\n        address sender,\\n        IERC20 token,\\n        uint256 amount,\\n        uint256 fee,\\n        bytes calldata data\\n    ) external;\\n}\\n\\ninterface IBatchFlashBorrower {\\n    /// @notice The callback for batched flashloans. Every amount + fee needs to repayed to msg.sender before this call returns.\\n    /// @param sender The address of the invoker of this flashloan.\\n    /// @param tokens Array of addresses for ERC-20 tokens that is loaned.\\n    /// @param amounts A one-to-one map to `tokens` that is loaned.\\n    /// @param fees A one-to-one map to `tokens` that needs to be paid on top for each loan. Needs to be the same token.\\n    /// @param data Additional data that was passed to the flashloan function.\\n    function onBatchFlashLoan(\\n        address sender,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        uint256[] calldata fees,\\n        bytes calldata data\\n    ) external;\\n}\\n\\n// File contracts/interfaces/IWETH.sol\\n// License-Identifier: MIT\\n\\ninterface IWETH {\\n    function deposit() external payable;\\n\\n    function withdraw(uint256) external;\\n}\\n\\n// File contracts/interfaces/IStrategy.sol\\n// License-Identifier: MIT\\n\\ninterface IStrategy {\\n    /// @notice Send the assets to the Strategy and call skim to invest them.\\n    /// @param amount The amount of tokens to invest.\\n    function skim(uint256 amount) external;\\n\\n    /// @notice Harvest any profits made converted to the asset and pass them to the caller.\\n    /// @param balance The amount of tokens the caller thinks it has invested.\\n    /// @param sender The address of the initiator of this transaction. Can be used for reimbursements, etc.\\n    /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.\\n    function harvest(uint256 balance, address sender) external returns (int256 amountAdded);\\n\\n    /// @notice Withdraw assets. The returned amount can differ from the requested amount due to rounding.\\n    /// @dev The `actualAmount` should be very close to the amount.\\n    /// The difference should NOT be used to report a loss. That's what harvest is for.\\n    /// @param amount The requested amount the caller wants to withdraw.\\n    /// @return actualAmount The real amount that is withdrawn.\\n    function withdraw(uint256 amount) external returns (uint256 actualAmount);\\n\\n    /// @notice Withdraw all assets in the safest way possible. This shouldn't fail.\\n    /// @param balance The amount of tokens the caller thinks it has invested.\\n    /// @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`.\\n    function exit(uint256 balance) external returns (int256 amountAdded);\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\nlibrary BoringERC20 {\\n    bytes4 private constant SIG_SYMBOL = 0x95d89b41; // symbol()\\n    bytes4 private constant SIG_NAME = 0x06fdde03; // name()\\n    bytes4 private constant SIG_DECIMALS = 0x313ce567; // decimals()\\n    bytes4 private constant SIG_TRANSFER = 0xa9059cbb; // transfer(address,uint256)\\n    bytes4 private constant SIG_TRANSFER_FROM = 0x23b872dd; // transferFrom(address,address,uint256)\\n\\n    /// @notice Provides a safe ERC20.transfer version for different ERC-20 implementations.\\n    /// Reverts on a failed transfer.\\n    /// @param token The address of the ERC-20 token.\\n    /// @param to Transfer tokens to.\\n    /// @param amount The token amount.\\n    function safeTransfer(\\n        IERC20 token,\\n        address to,\\n        uint256 amount\\n    ) internal {\\n        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER, to, amount));\\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: Transfer failed\\\");\\n    }\\n\\n    /// @notice Provides a safe ERC20.transferFrom version for different ERC-20 implementations.\\n    /// Reverts on a failed transfer.\\n    /// @param token The address of the ERC-20 token.\\n    /// @param from Transfer tokens from.\\n    /// @param to Transfer tokens to.\\n    /// @param amount The token amount.\\n    function safeTransferFrom(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 amount\\n    ) internal {\\n        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER_FROM, from, to, amount));\\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: TransferFrom failed\\\");\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringMath.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n/// @notice A library for performing overflow-/underflow-safe math,\\n/// updated with awesomeness from of DappHub (https://github.com/dapphub/ds-math).\\nlibrary BoringMath {\\n    function add(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {\\n        require(b == 0 || (c = a * b) / b == a, \\\"BoringMath: Mul Overflow\\\");\\n    }\\n\\n    function to128(uint256 a) internal pure returns (uint128 c) {\\n        require(a <= uint128(-1), \\\"BoringMath: uint128 Overflow\\\");\\n        c = uint128(a);\\n    }\\n\\n    function to64(uint256 a) internal pure returns (uint64 c) {\\n        require(a <= uint64(-1), \\\"BoringMath: uint64 Overflow\\\");\\n        c = uint64(a);\\n    }\\n\\n    function to32(uint256 a) internal pure returns (uint32 c) {\\n        require(a <= uint32(-1), \\\"BoringMath: uint32 Overflow\\\");\\n        c = uint32(a);\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint128.\\nlibrary BoringMath128 {\\n    function add(uint128 a, uint128 b) internal pure returns (uint128 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint128 a, uint128 b) internal pure returns (uint128 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint64.\\nlibrary BoringMath64 {\\n    function add(uint64 a, uint64 b) internal pure returns (uint64 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint64 a, uint64 b) internal pure returns (uint64 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint32.\\nlibrary BoringMath32 {\\n    function add(uint32 a, uint32 b) internal pure returns (uint32 c) {\\n        require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");\\n    }\\n\\n    function sub(uint32 a, uint32 b) internal pure returns (uint32 c) {\\n        require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/libraries/BoringRebase.sol@v1.2.0\\n// License-Identifier: MIT\\n\\nstruct Rebase {\\n    uint128 elastic;\\n    uint128 base;\\n}\\n\\n/// @notice A rebasing library using overflow-/underflow-safe math.\\nlibrary RebaseLibrary {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n\\n    /// @notice Calculates the base value in relationship to `elastic` and `total`.\\n    function toBase(\\n        Rebase memory total,\\n        uint256 elastic,\\n        bool roundUp\\n    ) internal pure returns (uint256 base) {\\n        if (total.elastic == 0) {\\n            base = elastic;\\n        } else {\\n            base = elastic.mul(total.base) / total.elastic;\\n            if (roundUp && base.mul(total.elastic) / total.base < elastic) {\\n                base = base.add(1);\\n            }\\n        }\\n    }\\n\\n    /// @notice Calculates the elastic value in relationship to `base` and `total`.\\n    function toElastic(\\n        Rebase memory total,\\n        uint256 base,\\n        bool roundUp\\n    ) internal pure returns (uint256 elastic) {\\n        if (total.base == 0) {\\n            elastic = base;\\n        } else {\\n            elastic = base.mul(total.elastic) / total.base;\\n            if (roundUp && elastic.mul(total.base) / total.elastic < base) {\\n                elastic = elastic.add(1);\\n            }\\n        }\\n    }\\n\\n    /// @notice Add `elastic` to `total` and doubles `total.base`.\\n    /// @return (Rebase) The new total.\\n    /// @return base in relationship to `elastic`.\\n    function add(\\n        Rebase memory total,\\n        uint256 elastic,\\n        bool roundUp\\n    ) internal pure returns (Rebase memory, uint256 base) {\\n        base = toBase(total, elastic, roundUp);\\n        total.elastic = total.elastic.add(elastic.to128());\\n        total.base = total.base.add(base.to128());\\n        return (total, base);\\n    }\\n\\n    /// @notice Sub `base` from `total` and update `total.elastic`.\\n    /// @return (Rebase) The new total.\\n    /// @return elastic in relationship to `base`.\\n    function sub(\\n        Rebase memory total,\\n        uint256 base,\\n        bool roundUp\\n    ) internal pure returns (Rebase memory, uint256 elastic) {\\n        elastic = toElastic(total, base, roundUp);\\n        total.elastic = total.elastic.sub(elastic.to128());\\n        total.base = total.base.sub(base.to128());\\n        return (total, elastic);\\n    }\\n\\n    /// @notice Add `elastic` and `base` to `total`.\\n    function add(\\n        Rebase memory total,\\n        uint256 elastic,\\n        uint256 base\\n    ) internal pure returns (Rebase memory) {\\n        total.elastic = total.elastic.add(elastic.to128());\\n        total.base = total.base.add(base.to128());\\n        return total;\\n    }\\n\\n    /// @notice Subtract `elastic` and `base` to `total`.\\n    function sub(\\n        Rebase memory total,\\n        uint256 elastic,\\n        uint256 base\\n    ) internal pure returns (Rebase memory) {\\n        total.elastic = total.elastic.sub(elastic.to128());\\n        total.base = total.base.sub(base.to128());\\n        return total;\\n    }\\n\\n    /// @notice Add `elastic` to `total` and update storage.\\n    /// @return newElastic Returns updated `elastic`.\\n    function addElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {\\n        newElastic = total.elastic = total.elastic.add(elastic.to128());\\n    }\\n\\n    /// @notice Subtract `elastic` from `total` and update storage.\\n    /// @return newElastic Returns updated `elastic`.\\n    function subElastic(Rebase storage total, uint256 elastic) internal returns (uint256 newElastic) {\\n        newElastic = total.elastic = total.elastic.sub(elastic.to128());\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringOwnable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n// Source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol + Claimable.sol\\n// Edited by BoringCrypto\\n\\ncontract BoringOwnableData {\\n    address public owner;\\n    address public pendingOwner;\\n}\\n\\ncontract BoringOwnable is BoringOwnableData {\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /// @notice `owner` defaults to msg.sender on construction.\\n    constructor() public {\\n        owner = msg.sender;\\n        emit OwnershipTransferred(address(0), msg.sender);\\n    }\\n\\n    /// @notice Transfers ownership to `newOwner`. Either directly or claimable by the new pending owner.\\n    /// Can only be invoked by the current `owner`.\\n    /// @param newOwner Address of the new owner.\\n    /// @param direct True if `newOwner` should be set immediately. False if `newOwner` needs to use `claimOwnership`.\\n    /// @param renounce Allows the `newOwner` to be `address(0)` if `direct` and `renounce` is True. Has no effect otherwise.\\n    function transferOwnership(\\n        address newOwner,\\n        bool direct,\\n        bool renounce\\n    ) public onlyOwner {\\n        if (direct) {\\n            // Checks\\n            require(newOwner != address(0) || renounce, \\\"Ownable: zero address\\\");\\n\\n            // Effects\\n            emit OwnershipTransferred(owner, newOwner);\\n            owner = newOwner;\\n            pendingOwner = address(0);\\n        } else {\\n            // Effects\\n            pendingOwner = newOwner;\\n        }\\n    }\\n\\n    /// @notice Needs to be called by `pendingOwner` to claim ownership.\\n    function claimOwnership() public {\\n        address _pendingOwner = pendingOwner;\\n\\n        // Checks\\n        require(msg.sender == _pendingOwner, \\\"Ownable: caller != pending owner\\\");\\n\\n        // Effects\\n        emit OwnershipTransferred(owner, _pendingOwner);\\n        owner = _pendingOwner;\\n        pendingOwner = address(0);\\n    }\\n\\n    /// @notice Only allows the `owner` to execute the function.\\n    modifier onlyOwner() {\\n        require(msg.sender == owner, \\\"Ownable: caller is not the owner\\\");\\n        _;\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/interfaces/IMasterContract.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ninterface IMasterContract {\\n    /// @notice Init function that gets called from `BoringFactory.deploy`.\\n    /// Also kown as the constructor for cloned contracts.\\n    /// Any ETH send to `BoringFactory.deploy` ends up here.\\n    /// @param data Can be abi encoded arguments or anything else.\\n    function init(bytes calldata data) external payable;\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringFactory.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ncontract BoringFactory {\\n    event LogDeploy(address indexed masterContract, bytes data, address indexed cloneAddress);\\n\\n    /// @notice Mapping from clone contracts to their masterContract.\\n    mapping(address => address) public masterContractOf;\\n\\n    /// @notice Deploys a given master Contract as a clone.\\n    /// Any ETH transferred with this call is forwarded to the new clone.\\n    /// Emits `LogDeploy`.\\n    /// @param masterContract The address of the contract to clone.\\n    /// @param data Additional abi encoded calldata that is passed to the new clone via `IMasterContract.init`.\\n    /// @param useCreate2 Creates the clone by using the CREATE2 opcode, in this case `data` will be used as salt.\\n    /// @return cloneAddress Address of the created clone contract.\\n    function deploy(\\n        address masterContract,\\n        bytes calldata data,\\n        bool useCreate2\\n    ) public payable returns (address cloneAddress) {\\n        require(masterContract != address(0), \\\"BoringFactory: No masterContract\\\");\\n        bytes20 targetBytes = bytes20(masterContract); // Takes the first 20 bytes of the masterContract's address\\n\\n        if (useCreate2) {\\n            // each masterContract has different code already. So clones are distinguished by their data only.\\n            bytes32 salt = keccak256(data);\\n\\n            // Creates clone, more info here: https://blog.openzeppelin.com/deep-dive-into-the-minimal-proxy-contract/\\n            assembly {\\n                let clone := mload(0x40)\\n                mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n                mstore(add(clone, 0x14), targetBytes)\\n                mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n                cloneAddress := create2(0, clone, 0x37, salt)\\n            }\\n        } else {\\n            assembly {\\n                let clone := mload(0x40)\\n                mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n                mstore(add(clone, 0x14), targetBytes)\\n                mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n                cloneAddress := create(0, clone, 0x37)\\n            }\\n        }\\n        masterContractOf[cloneAddress] = masterContract;\\n\\n        IMasterContract(cloneAddress).init{value: msg.value}(data);\\n\\n        emit LogDeploy(masterContract, data, cloneAddress);\\n    }\\n}\\n\\n// File contracts/MasterContractManager.sol\\n// License-Identifier: UNLICENSED\\n\\ncontract MasterContractManager is BoringOwnable, BoringFactory {\\n    event LogWhiteListMasterContract(address indexed masterContract, bool approved);\\n    event LogSetMasterContractApproval(address indexed masterContract, address indexed user, bool approved);\\n    event LogRegisterProtocol(address indexed protocol);\\n\\n    /// @notice masterContract to user to approval state\\n    mapping(address => mapping(address => bool)) public masterContractApproved;\\n    /// @notice masterContract to whitelisted state for approval without signed message\\n    mapping(address => bool) public whitelistedMasterContracts;\\n    /// @notice user nonces for masterContract approvals\\n    mapping(address => uint256) public nonces;\\n\\n    bytes32 private constant DOMAIN_SEPARATOR_SIGNATURE_HASH = keccak256(\\\"EIP712Domain(string name,uint256 chainId,address verifyingContract)\\\");\\n    // See https://eips.ethereum.org/EIPS/eip-191\\n    string private constant EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA = \\\"\\\\x19\\\\x01\\\";\\n    bytes32 private constant APPROVAL_SIGNATURE_HASH =\\n        keccak256(\\\"SetMasterContractApproval(string warning,address user,address masterContract,bool approved,uint256 nonce)\\\");\\n\\n    // solhint-disable-next-line var-name-mixedcase\\n    bytes32 private immutable _DOMAIN_SEPARATOR;\\n    // solhint-disable-next-line var-name-mixedcase\\n    uint256 private immutable DOMAIN_SEPARATOR_CHAIN_ID;\\n\\n    constructor() public {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        _DOMAIN_SEPARATOR = _calculateDomainSeparator(DOMAIN_SEPARATOR_CHAIN_ID = chainId);\\n    }\\n\\n    function _calculateDomainSeparator(uint256 chainId) private view returns (bytes32) {\\n        return keccak256(abi.encode(DOMAIN_SEPARATOR_SIGNATURE_HASH, keccak256(\\\"BentoBox V1\\\"), chainId, address(this)));\\n    }\\n\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() public view returns (bytes32) {\\n        uint256 chainId;\\n        assembly {\\n            chainId := chainid()\\n        }\\n        return chainId == DOMAIN_SEPARATOR_CHAIN_ID ? _DOMAIN_SEPARATOR : _calculateDomainSeparator(chainId);\\n    }\\n\\n    /// @notice Other contracts need to register with this master contract so that users can approve them for the BentoBox.\\n    function registerProtocol() public {\\n        masterContractOf[msg.sender] = msg.sender;\\n        emit LogRegisterProtocol(msg.sender);\\n    }\\n\\n    /// @notice Enables or disables a contract for approval without signed message.\\n    function whitelistMasterContract(address masterContract, bool approved) public onlyOwner {\\n        // Checks\\n        require(masterContract != address(0), \\\"MasterCMgr: Cannot approve 0\\\");\\n\\n        // Effects\\n        whitelistedMasterContracts[masterContract] = approved;\\n        emit LogWhiteListMasterContract(masterContract, approved);\\n    }\\n\\n    /// @notice Approves or revokes a `masterContract` access to `user` funds.\\n    /// @param user The address of the user that approves or revokes access.\\n    /// @param masterContract The address who gains or loses access.\\n    /// @param approved If True approves access. If False revokes access.\\n    /// @param v Part of the signature. (See EIP-191)\\n    /// @param r Part of the signature. (See EIP-191)\\n    /// @param s Part of the signature. (See EIP-191)\\n    // F4 - Check behaviour for all function arguments when wrong or extreme\\n    // F4: Don't allow masterContract 0 to be approved. Unknown contracts will have a masterContract of 0.\\n    // F4: User can't be 0 for signed approvals because the recoveredAddress will be 0 if ecrecover fails\\n    function setMasterContractApproval(\\n        address user,\\n        address masterContract,\\n        bool approved,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) public {\\n        // Checks\\n        require(masterContract != address(0), \\\"MasterCMgr: masterC not set\\\"); // Important for security\\n\\n        // If no signature is provided, the fallback is executed\\n        if (r == 0 && s == 0 && v == 0) {\\n            require(user == msg.sender, \\\"MasterCMgr: user not sender\\\");\\n            require(masterContractOf[user] == address(0), \\\"MasterCMgr: user is clone\\\");\\n            require(whitelistedMasterContracts[masterContract], \\\"MasterCMgr: not whitelisted\\\");\\n        } else {\\n            // Important for security - any address without masterContract has address(0) as masterContract\\n            // So approving address(0) would approve every address, leading to full loss of funds\\n            // Also, ecrecover returns address(0) on failure. So we check this:\\n            require(user != address(0), \\\"MasterCMgr: User cannot be 0\\\");\\n\\n            // C10 - Protect signatures against replay, use nonce and chainId (SWC-121)\\n            // C10: nonce + chainId are used to prevent replays\\n            // C11 - All signatures strictly EIP-712 (SWC-117 SWC-122)\\n            // C11: signature is EIP-712 compliant\\n            // C12 - abi.encodePacked can't contain variable length user input (SWC-133)\\n            // C12: abi.encodePacked has fixed length parameters\\n            bytes32 digest =\\n                keccak256(\\n                    abi.encodePacked(\\n                        EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA,\\n                        DOMAIN_SEPARATOR(),\\n                        keccak256(\\n                            abi.encode(\\n                                APPROVAL_SIGNATURE_HASH,\\n                                approved\\n                                    ? keccak256(\\\"Give FULL access to funds in (and approved to) BentoBox?\\\")\\n                                    : keccak256(\\\"Revoke access to BentoBox?\\\"),\\n                                user,\\n                                masterContract,\\n                                approved,\\n                                nonces[user]++\\n                            )\\n                        )\\n                    )\\n                );\\n            address recoveredAddress = ecrecover(digest, v, r, s);\\n            require(recoveredAddress == user, \\\"MasterCMgr: Invalid Signature\\\");\\n        }\\n\\n        // Effects\\n        masterContractApproved[masterContract][user] = approved;\\n        emit LogSetMasterContractApproval(masterContract, user, approved);\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/BoringBatchable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\ncontract BaseBoringBatchable {\\n    /// @dev Helper function to extract a useful revert message from a failed call.\\n    /// If the returned data is malformed or not correctly abi encoded then this call can fail itself.\\n    function _getRevertMsg(bytes memory _returnData) internal pure returns (string memory) {\\n        // If the _res length is less than 68, then the transaction failed silently (without a revert message)\\n        if (_returnData.length < 68) return \\\"Transaction reverted silently\\\";\\n\\n        assembly {\\n            // Slice the sighash.\\n            _returnData := add(_returnData, 0x04)\\n        }\\n        return abi.decode(_returnData, (string)); // All that remains is the revert string\\n    }\\n\\n    /// @notice Allows batched call to self (this contract).\\n    /// @param calls An array of inputs for each call.\\n    /// @param revertOnFail If True then reverts after a failed call and stops doing further calls.\\n    /// @return successes An array indicating the success of a call, mapped one-to-one to `calls`.\\n    /// @return results An array with the returned data of each function call, mapped one-to-one to `calls`.\\n    // F1: External is ok here because this is the batch function, adding it to a batch makes no sense\\n    // F2: Calls in the batch may be payable, delegatecall operates in the same context, so each call in the batch has access to msg.value\\n    // C3: The length of the loop is fully under user control, so can't be exploited\\n    // C7: Delegatecall is only used on the same contract, so it's safe\\n    function batch(bytes[] calldata calls, bool revertOnFail) external payable returns (bool[] memory successes, bytes[] memory results) {\\n        successes = new bool[](calls.length);\\n        results = new bytes[](calls.length);\\n        for (uint256 i = 0; i < calls.length; i++) {\\n            (bool success, bytes memory result) = address(this).delegatecall(calls[i]);\\n            require(success || !revertOnFail, _getRevertMsg(result));\\n            successes[i] = success;\\n            results[i] = result;\\n        }\\n    }\\n}\\n\\ncontract BoringBatchable is BaseBoringBatchable {\\n    /// @notice Call wrapper that performs `ERC20.permit` on `token`.\\n    /// Lookup `IERC20.permit`.\\n    // F6: Parameters can be used front-run the permit and the user's permit will fail (due to nonce or other revert)\\n    //     if part of a batch this could be used to grief once as the second call would not need the permit\\n    function permitToken(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) public {\\n        token.permit(from, to, amount, deadline, v, r, s);\\n    }\\n}\\n\\n// File contracts/BentoBox.sol\\n// License-Identifier: UNLICENSED\\n\\n/// @title BentoBox\\n/// @author BoringCrypto, Keno\\n/// @notice The BentoBox is a vault for tokens. The stored tokens can be flash loaned and used in strategies.\\n/// Yield from this will go to the token depositors.\\n/// Rebasing tokens ARE NOT supported and WILL cause loss of funds.\\n/// Any funds transfered directly onto the BentoBox will be lost, use the deposit function instead.\\ncontract BentoBoxV1 is MasterContractManager, BoringBatchable {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n    using BoringERC20 for IERC20;\\n    using RebaseLibrary for Rebase;\\n\\n    // ************** //\\n    // *** EVENTS *** //\\n    // ************** //\\n\\n    event LogDeposit(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogWithdraw(IERC20 indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogTransfer(IERC20 indexed token, address indexed from, address indexed to, uint256 share);\\n\\n    event LogFlashLoan(address indexed borrower, IERC20 indexed token, uint256 amount, uint256 feeAmount, address indexed receiver);\\n\\n    event LogStrategyTargetPercentage(IERC20 indexed token, uint256 targetPercentage);\\n    event LogStrategyQueued(IERC20 indexed token, IStrategy indexed strategy);\\n    event LogStrategySet(IERC20 indexed token, IStrategy indexed strategy);\\n    event LogStrategyInvest(IERC20 indexed token, uint256 amount);\\n    event LogStrategyDivest(IERC20 indexed token, uint256 amount);\\n    event LogStrategyProfit(IERC20 indexed token, uint256 amount);\\n    event LogStrategyLoss(IERC20 indexed token, uint256 amount);\\n\\n    // *************** //\\n    // *** STRUCTS *** //\\n    // *************** //\\n\\n    struct StrategyData {\\n        uint64 strategyStartDate;\\n        uint64 targetPercentage;\\n        uint128 balance; // the balance of the strategy that BentoBox thinks is in there\\n    }\\n\\n    // ******************************** //\\n    // *** CONSTANTS AND IMMUTABLES *** //\\n    // ******************************** //\\n\\n    // V2 - Can they be private?\\n    // V2: Private to save gas, to verify it's correct, check the constructor arguments\\n    IERC20 private immutable wethToken;\\n\\n    IERC20 private constant USE_ETHEREUM = IERC20(0);\\n    uint256 private constant FLASH_LOAN_FEE = 50; // 0.05%\\n    uint256 private constant FLASH_LOAN_FEE_PRECISION = 1e5;\\n    uint256 private constant STRATEGY_DELAY = 2 weeks;\\n    uint256 private constant MAX_TARGET_PERCENTAGE = 95; // 95%\\n    uint256 private constant MINIMUM_SHARE_BALANCE = 1000; // To prevent the ratio going off\\n\\n    // ***************** //\\n    // *** VARIABLES *** //\\n    // ***************** //\\n\\n    // Balance per token per address/contract in shares\\n    mapping(IERC20 => mapping(address => uint256)) public balanceOf;\\n\\n    // Rebase from amount to share\\n    mapping(IERC20 => Rebase) public totals;\\n\\n    mapping(IERC20 => IStrategy) public strategy;\\n    mapping(IERC20 => IStrategy) public pendingStrategy;\\n    mapping(IERC20 => StrategyData) public strategyData;\\n\\n    // ******************* //\\n    // *** CONSTRUCTOR *** //\\n    // ******************* //\\n\\n    constructor(IERC20 wethToken_) public {\\n        wethToken = wethToken_;\\n    }\\n\\n    // ***************** //\\n    // *** MODIFIERS *** //\\n    // ***************** //\\n\\n    /// Modifier to check if the msg.sender is allowed to use funds belonging to the 'from' address.\\n    /// If 'from' is msg.sender, it's allowed.\\n    /// If 'from' is the BentoBox itself, it's allowed. Any ETH, token balances (above the known balances) or BentoBox balances\\n    /// can be taken by anyone.\\n    /// This is to enable skimming, not just for deposits, but also for withdrawals or transfers, enabling better composability.\\n    /// If 'from' is a clone of a masterContract AND the 'from' address has approved that masterContract, it's allowed.\\n    modifier allowed(address from) {\\n        if (from != msg.sender && from != address(this)) {\\n            // From is sender or you are skimming\\n            address masterContract = masterContractOf[msg.sender];\\n            require(masterContract != address(0), \\\"BentoBox: no masterContract\\\");\\n            require(masterContractApproved[masterContract][from], \\\"BentoBox: Transfer not approved\\\");\\n        }\\n        _;\\n    }\\n\\n    // ************************** //\\n    // *** INTERNAL FUNCTIONS *** //\\n    // ************************** //\\n\\n    /// @dev Returns the total balance of `token` this contracts holds,\\n    /// plus the total amount this contract thinks the strategy holds.\\n    function _tokenBalanceOf(IERC20 token) internal view returns (uint256 amount) {\\n        amount = token.balanceOf(address(this)).add(strategyData[token].balance);\\n    }\\n\\n    // ************************ //\\n    // *** PUBLIC FUNCTIONS *** //\\n    // ************************ //\\n\\n    /// @dev Helper function to represent an `amount` of `token` in shares.\\n    /// @param token The ERC-20 token.\\n    /// @param amount The `token` amount.\\n    /// @param roundUp If the result `share` should be rounded up.\\n    /// @return share The token amount represented in shares.\\n    function toShare(\\n        IERC20 token,\\n        uint256 amount,\\n        bool roundUp\\n    ) external view returns (uint256 share) {\\n        share = totals[token].toBase(amount, roundUp);\\n    }\\n\\n    /// @dev Helper function represent shares back into the `token` amount.\\n    /// @param token The ERC-20 token.\\n    /// @param share The amount of shares.\\n    /// @param roundUp If the result should be rounded up.\\n    /// @return amount The share amount back into native representation.\\n    function toAmount(\\n        IERC20 token,\\n        uint256 share,\\n        bool roundUp\\n    ) external view returns (uint256 amount) {\\n        amount = totals[token].toElastic(share, roundUp);\\n    }\\n\\n    /// @notice Deposit an amount of `token` represented in either `amount` or `share`.\\n    /// @param token_ The ERC-20 token to deposit.\\n    /// @param from which account to pull the tokens.\\n    /// @param to which account to push the tokens.\\n    /// @param amount Token amount in native representation to deposit.\\n    /// @param share Token amount represented in shares to deposit. Takes precedence over `amount`.\\n    /// @return amountOut The amount deposited.\\n    /// @return shareOut The deposited amount repesented in shares.\\n    function deposit(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) public payable allowed(from) returns (uint256 amountOut, uint256 shareOut) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;\\n        Rebase memory total = totals[token];\\n\\n        // If a new token gets added, the tokenSupply call checks that this is a deployed contract. Needed for security.\\n        require(total.elastic != 0 || token.totalSupply() > 0, \\\"BentoBox: No tokens\\\");\\n        if (share == 0) {\\n            // value of the share may be lower than the amount due to rounding, that's ok\\n            share = total.toBase(amount, false);\\n            // Any deposit should lead to at least the minimum share balance, otherwise it's ignored (no amount taken)\\n            if (total.base.add(share.to128()) < MINIMUM_SHARE_BALANCE) {\\n                return (0, 0);\\n            }\\n        } else {\\n            // amount may be lower than the value of share due to rounding, in that case, add 1 to amount (Always round up)\\n            amount = total.toElastic(share, true);\\n        }\\n\\n        // In case of skimming, check that only the skimmable amount is taken.\\n        // For ETH, the full balance is available, so no need to check.\\n        // During flashloans the _tokenBalanceOf is lower than 'reality', so skimming deposits will mostly fail during a flashloan.\\n        require(\\n            from != address(this) || token_ == USE_ETHEREUM || amount <= _tokenBalanceOf(token).sub(total.elastic),\\n            \\\"BentoBox: Skim too much\\\"\\n        );\\n\\n        balanceOf[token][to] = balanceOf[token][to].add(share);\\n        total.base = total.base.add(share.to128());\\n        total.elastic = total.elastic.add(amount.to128());\\n        totals[token] = total;\\n\\n        // Interactions\\n        // During the first deposit, we check that this token is 'real'\\n        if (token_ == USE_ETHEREUM) {\\n            // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)\\n            // X2: If the WETH implementation is faulty or malicious, it will block adding ETH (but we know the WETH implementation)\\n            IWETH(address(wethToken)).deposit{value: amount}();\\n        } else if (from != address(this)) {\\n            // X2 - If there is an error, could it cause a DoS. Like balanceOf causing revert. (SWC-113)\\n            // X2: If the token implementation is faulty or malicious, it may block adding tokens. Good.\\n            token.safeTransferFrom(from, address(this), amount);\\n        }\\n        emit LogDeposit(token, from, to, amount, share);\\n        amountOut = amount;\\n        shareOut = share;\\n    }\\n\\n    /// @notice Withdraws an amount of `token` from a user account.\\n    /// @param token_ The ERC-20 token to withdraw.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param amount of tokens. Either one of `amount` or `share` needs to be supplied.\\n    /// @param share Like above, but `share` takes precedence over `amount`.\\n    function withdraw(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) public allowed(from) returns (uint256 amountOut, uint256 shareOut) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        IERC20 token = token_ == USE_ETHEREUM ? wethToken : token_;\\n        Rebase memory total = totals[token];\\n        if (share == 0) {\\n            // value of the share paid could be lower than the amount paid due to rounding, in that case, add a share (Always round up)\\n            share = total.toBase(amount, true);\\n        } else {\\n            // amount may be lower than the value of share due to rounding, that's ok\\n            amount = total.toElastic(share, false);\\n        }\\n\\n        balanceOf[token][from] = balanceOf[token][from].sub(share);\\n        total.elastic = total.elastic.sub(amount.to128());\\n        total.base = total.base.sub(share.to128());\\n        // There have to be at least 1000 shares left to prevent reseting the share/amount ratio (unless it's fully emptied)\\n        require(total.base >= MINIMUM_SHARE_BALANCE || total.base == 0, \\\"BentoBox: cannot empty\\\");\\n        totals[token] = total;\\n\\n        // Interactions\\n        if (token_ == USE_ETHEREUM) {\\n            // X2, X3: A revert or big gas usage in the WETH contract could block withdrawals, but WETH9 is fine.\\n            IWETH(address(wethToken)).withdraw(amount);\\n            // X2, X3: A revert or big gas usage could block, however, the to address is under control of the caller.\\n            (bool success, ) = to.call{value: amount}(\\\"\\\");\\n            require(success, \\\"BentoBox: ETH transfer failed\\\");\\n        } else {\\n            // X2, X3: A malicious token could block withdrawal of just THAT token.\\n            //         masterContracts may want to take care not to rely on withdraw always succeeding.\\n            token.safeTransfer(to, amount);\\n        }\\n        emit LogWithdraw(token, from, to, amount, share);\\n        amountOut = amount;\\n        shareOut = share;\\n    }\\n\\n    /// @notice Transfer shares from a user account to another one.\\n    /// @param token The ERC-20 token to transfer.\\n    /// @param from which user to pull the tokens.\\n    /// @param to which user to push the tokens.\\n    /// @param share The amount of `token` in shares.\\n    // Clones of master contracts can transfer from any account that has approved them\\n    // F3 - Can it be combined with another similar function?\\n    // F3: This isn't combined with transferMultiple for gas optimization\\n    function transfer(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 share\\n    ) public allowed(from) {\\n        // Checks\\n        require(to != address(0), \\\"BentoBox: to not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        balanceOf[token][from] = balanceOf[token][from].sub(share);\\n        balanceOf[token][to] = balanceOf[token][to].add(share);\\n\\n        emit LogTransfer(token, from, to, share);\\n    }\\n\\n    /// @notice Transfer shares from a user account to multiple other ones.\\n    /// @param token The ERC-20 token to transfer.\\n    /// @param from which user to pull the tokens.\\n    /// @param tos The receivers of the tokens.\\n    /// @param shares The amount of `token` in shares for each receiver in `tos`.\\n    // F3 - Can it be combined with another similar function?\\n    // F3: This isn't combined with transfer for gas optimization\\n    function transferMultiple(\\n        IERC20 token,\\n        address from,\\n        address[] calldata tos,\\n        uint256[] calldata shares\\n    ) public allowed(from) {\\n        // Checks\\n        require(tos[0] != address(0), \\\"BentoBox: to[0] not set\\\"); // To avoid a bad UI from burning funds\\n\\n        // Effects\\n        uint256 totalAmount;\\n        uint256 len = tos.length;\\n        for (uint256 i = 0; i < len; i++) {\\n            address to = tos[i];\\n            balanceOf[token][to] = balanceOf[token][to].add(shares[i]);\\n            totalAmount = totalAmount.add(shares[i]);\\n            emit LogTransfer(token, from, to, shares[i]);\\n        }\\n        balanceOf[token][from] = balanceOf[token][from].sub(totalAmount);\\n    }\\n\\n    /// @notice Flashloan ability.\\n    /// @param borrower The address of the contract that implements and conforms to `IFlashBorrower` and handles the flashloan.\\n    /// @param receiver Address of the token receiver.\\n    /// @param token The address of the token to receive.\\n    /// @param amount of the tokens to receive.\\n    /// @param data The calldata to pass to the `borrower` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Not possible to follow this here, reentrancy has been reviewed\\n    // F6 - Check for front-running possibilities, such as the approve function (SWC-114)\\n    // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.\\n    function flashLoan(\\n        IFlashBorrower borrower,\\n        address receiver,\\n        IERC20 token,\\n        uint256 amount,\\n        bytes calldata data\\n    ) public {\\n        uint256 fee = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;\\n        token.safeTransfer(receiver, amount);\\n\\n        borrower.onFlashLoan(msg.sender, token, amount, fee, data);\\n\\n        require(_tokenBalanceOf(token) >= totals[token].addElastic(fee.to128()), \\\"BentoBox: Wrong amount\\\");\\n        emit LogFlashLoan(address(borrower), token, amount, fee, receiver);\\n    }\\n\\n    /// @notice Support for batched flashloans. Useful to request multiple different `tokens` in a single transaction.\\n    /// @param borrower The address of the contract that implements and conforms to `IBatchFlashBorrower` and handles the flashloan.\\n    /// @param receivers An array of the token receivers. A one-to-one mapping with `tokens` and `amounts`.\\n    /// @param tokens The addresses of the tokens.\\n    /// @param amounts of the tokens for each receiver.\\n    /// @param data The calldata to pass to the `borrower` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Not possible to follow this here, reentrancy has been reviewed\\n    // F6 - Check for front-running possibilities, such as the approve function (SWC-114)\\n    // F6: Slight grieving possible by withdrawing an amount before someone tries to flashloan close to the full amount.\\n    function batchFlashLoan(\\n        IBatchFlashBorrower borrower,\\n        address[] calldata receivers,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        bytes calldata data\\n    ) public {\\n        uint256[] memory fees = new uint256[](tokens.length);\\n\\n        uint256 len = tokens.length;\\n        for (uint256 i = 0; i < len; i++) {\\n            uint256 amount = amounts[i];\\n            fees[i] = amount.mul(FLASH_LOAN_FEE) / FLASH_LOAN_FEE_PRECISION;\\n\\n            tokens[i].safeTransfer(receivers[i], amounts[i]);\\n        }\\n\\n        borrower.onBatchFlashLoan(msg.sender, tokens, amounts, fees, data);\\n\\n        for (uint256 i = 0; i < len; i++) {\\n            IERC20 token = tokens[i];\\n            require(_tokenBalanceOf(token) >= totals[token].addElastic(fees[i].to128()), \\\"BentoBox: Wrong amount\\\");\\n            emit LogFlashLoan(address(borrower), token, amounts[i], fees[i], receivers[i]);\\n        }\\n    }\\n\\n    /// @notice Sets the target percentage of the strategy for `token`.\\n    /// @dev Only the owner of this contract is allowed to change this.\\n    /// @param token The address of the token that maps to a strategy to change.\\n    /// @param targetPercentage_ The new target in percent. Must be lesser or equal to `MAX_TARGET_PERCENTAGE`.\\n    function setStrategyTargetPercentage(IERC20 token, uint64 targetPercentage_) public onlyOwner {\\n        // Checks\\n        require(targetPercentage_ <= MAX_TARGET_PERCENTAGE, \\\"StrategyManager: Target too high\\\");\\n\\n        // Effects\\n        strategyData[token].targetPercentage = targetPercentage_;\\n        emit LogStrategyTargetPercentage(token, targetPercentage_);\\n    }\\n\\n    /// @notice Sets the contract address of a new strategy that conforms to `IStrategy` for `token`.\\n    /// Must be called twice with the same arguments.\\n    /// A new strategy becomes pending first and can be activated once `STRATEGY_DELAY` is over.\\n    /// @dev Only the owner of this contract is allowed to change this.\\n    /// @param token The address of the token that maps to a strategy to change.\\n    /// @param newStrategy The address of the contract that conforms to `IStrategy`.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Total amount is updated AFTER interaction. But strategy is under our control.\\n    // C4 - Use block.timestamp only for long intervals (SWC-116)\\n    // C4: block.timestamp is used for a period of 2 weeks, which is long enough\\n    function setStrategy(IERC20 token, IStrategy newStrategy) public onlyOwner {\\n        StrategyData memory data = strategyData[token];\\n        IStrategy pending = pendingStrategy[token];\\n        if (data.strategyStartDate == 0 || pending != newStrategy) {\\n            pendingStrategy[token] = newStrategy;\\n            // C1 - All math done through BoringMath (SWC-101)\\n            // C1: Our sun will swallow the earth well before this overflows\\n            data.strategyStartDate = (block.timestamp + STRATEGY_DELAY).to64();\\n            emit LogStrategyQueued(token, newStrategy);\\n        } else {\\n            require(data.strategyStartDate != 0 && block.timestamp >= data.strategyStartDate, \\\"StrategyManager: Too early\\\");\\n            if (address(strategy[token]) != address(0)) {\\n                int256 balanceChange = strategy[token].exit(data.balance);\\n                // Effects\\n                if (balanceChange > 0) {\\n                    uint256 add = uint256(balanceChange);\\n                    totals[token].addElastic(add);\\n                    emit LogStrategyProfit(token, add);\\n                } else if (balanceChange < 0) {\\n                    uint256 sub = uint256(-balanceChange);\\n                    totals[token].subElastic(sub);\\n                    emit LogStrategyLoss(token, sub);\\n                }\\n\\n                emit LogStrategyDivest(token, data.balance);\\n            }\\n            strategy[token] = pending;\\n            data.strategyStartDate = 0;\\n            data.balance = 0;\\n            pendingStrategy[token] = IStrategy(0);\\n            emit LogStrategySet(token, newStrategy);\\n        }\\n        strategyData[token] = data;\\n    }\\n\\n    /// @notice The actual process of yield farming. Executes the strategy of `token`.\\n    /// Optionally does housekeeping if `balance` is true.\\n    /// `maxChangeAmount` is relevant for skimming or withdrawing if `balance` is true.\\n    /// @param token The address of the token for which a strategy is deployed.\\n    /// @param balance True if housekeeping should be done.\\n    /// @param maxChangeAmount The maximum amount for either pulling or pushing from/to the `IStrategy` contract.\\n    // F5 - Checks-Effects-Interactions pattern followed? (SWC-107)\\n    // F5: Total amount is updated AFTER interaction. But strategy is under our control.\\n    // F5: Not followed to prevent reentrancy issues with flashloans and BentoBox skims?\\n    function harvest(\\n        IERC20 token,\\n        bool balance,\\n        uint256 maxChangeAmount\\n    ) public {\\n        StrategyData memory data = strategyData[token];\\n        IStrategy _strategy = strategy[token];\\n        int256 balanceChange = _strategy.harvest(data.balance, msg.sender);\\n        if (balanceChange == 0 && !balance) {\\n            return;\\n        }\\n\\n        uint256 totalElastic = totals[token].elastic;\\n\\n        if (balanceChange > 0) {\\n            uint256 add = uint256(balanceChange);\\n            totalElastic = totalElastic.add(add);\\n            totals[token].elastic = totalElastic.to128();\\n            emit LogStrategyProfit(token, add);\\n        } else if (balanceChange < 0) {\\n            // C1 - All math done through BoringMath (SWC-101)\\n            // C1: balanceChange could overflow if it's max negative int128.\\n            // But tokens with balances that large are not supported by the BentoBox.\\n            uint256 sub = uint256(-balanceChange);\\n            totalElastic = totalElastic.sub(sub);\\n            totals[token].elastic = totalElastic.to128();\\n            data.balance = data.balance.sub(sub.to128());\\n            emit LogStrategyLoss(token, sub);\\n        }\\n\\n        if (balance) {\\n            uint256 targetBalance = totalElastic.mul(data.targetPercentage) / 100;\\n            // if data.balance == targetBalance there is nothing to update\\n            if (data.balance < targetBalance) {\\n                uint256 amountOut = targetBalance.sub(data.balance);\\n                if (maxChangeAmount != 0 && amountOut > maxChangeAmount) {\\n                    amountOut = maxChangeAmount;\\n                }\\n                token.safeTransfer(address(_strategy), amountOut);\\n                data.balance = data.balance.add(amountOut.to128());\\n                _strategy.skim(amountOut);\\n                emit LogStrategyInvest(token, amountOut);\\n            } else if (data.balance > targetBalance) {\\n                uint256 amountIn = data.balance.sub(targetBalance.to128());\\n                if (maxChangeAmount != 0 && amountIn > maxChangeAmount) {\\n                    amountIn = maxChangeAmount;\\n                }\\n\\n                uint256 actualAmountIn = _strategy.withdraw(amountIn);\\n\\n                data.balance = data.balance.sub(actualAmountIn.to128());\\n                emit LogStrategyDivest(token, actualAmountIn);\\n            }\\n        }\\n\\n        strategyData[token] = data;\\n    }\\n\\n    // Contract should be able to receive ETH deposits to support deposit & skim\\n    // solhint-disable-next-line no-empty-blocks\\n    receive() external payable {}\\n}\\n\",\"keccak256\":\"0xf5251397b9aaa5c66ddc18b0cb96350ffac09f5776a1255fedc0072641f916fe\",\"license\":\"UNLICENSED\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "notice": "A rebasing library using overflow-/underflow-safe math.",
            "version": 1
          }
        }
      }
    },
    "sources": {
      "contracts/bentobox/BentoBoxV1.sol": {
        "ast": {
          "absolutePath": "contracts/bentobox/BentoBoxV1.sol",
          "exportedSymbols": {
            "BaseBoringBatchable": [
              1525
            ],
            "BentoBoxV1": [
              3101
            ],
            "BoringBatchable": [
              1561
            ],
            "BoringERC20": [
              255
            ],
            "BoringFactory": [
              1111
            ],
            "BoringMath": [
              407
            ],
            "BoringMath128": [
              453
            ],
            "BoringMath32": [
              545
            ],
            "BoringMath64": [
              499
            ],
            "BoringOwnable": [
              1026
            ],
            "BoringOwnableData": [
              903
            ],
            "IBatchFlashBorrower": [
              100
            ],
            "IERC20": [
              67
            ],
            "IFlashBorrower": [
              82
            ],
            "IMasterContract": [
              1033
            ],
            "IStrategy": [
              142
            ],
            "IWETH": [
              109
            ],
            "MasterContractManager": [
              1416
            ],
            "Rebase": [
              550
            ],
            "RebaseLibrary": [
              898
            ]
          },
          "id": 3102,
          "license": "UNLICENSED",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 1,
              "literals": [
                "solidity",
                "0.6",
                ".12"
              ],
              "nodeType": "PragmaDirective",
              "src": "891:23:0"
            },
            {
              "id": 2,
              "literals": [
                "experimental",
                "ABIEncoderV2"
              ],
              "nodeType": "PragmaDirective",
              "src": "915:33:0"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "interface",
              "documentation": null,
              "fullyImplemented": false,
              "id": 67,
              "linearizedBaseContracts": [
                67
              ],
              "name": "IERC20",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "18160ddd",
                  "id": 7,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "totalSupply",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 3,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1214:2:0"
                  },
                  "returnParameters": {
                    "id": 6,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 5,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 7,
                        "src": "1240:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 4,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1240:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1239:9:0"
                  },
                  "scope": 67,
                  "src": "1194:55:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "70a08231",
                  "id": 14,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "balanceOf",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 10,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 9,
                        "mutability": "mutable",
                        "name": "account",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14,
                        "src": "1274:15:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 8,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "1274:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1273:17:0"
                  },
                  "returnParameters": {
                    "id": 13,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 12,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14,
                        "src": "1314:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 11,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1314:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1313:9:0"
                  },
                  "scope": 67,
                  "src": "1255:68:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "dd62ed3e",
                  "id": 23,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "allowance",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 19,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 16,
                        "mutability": "mutable",
                        "name": "owner",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23,
                        "src": "1348:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 15,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "1348:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18,
                        "mutability": "mutable",
                        "name": "spender",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23,
                        "src": "1363:15:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 17,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "1363:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1347:32:0"
                  },
                  "returnParameters": {
                    "id": 22,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 21,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23,
                        "src": "1403:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 20,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1403:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1402:9:0"
                  },
                  "scope": 67,
                  "src": "1329:83:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "095ea7b3",
                  "id": 32,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "approve",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 28,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 25,
                        "mutability": "mutable",
                        "name": "spender",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 32,
                        "src": "1435:15:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "1435:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 27,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 32,
                        "src": "1452:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 26,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1452:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1434:33:0"
                  },
                  "returnParameters": {
                    "id": 31,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 30,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 32,
                        "src": "1486:4:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 29,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "1486:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1485:6:0"
                  },
                  "scope": 67,
                  "src": "1418:74:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 40,
                  "name": "Transfer",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 39,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 34,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "from",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 40,
                        "src": "1513:20:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 33,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "1513:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 36,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 40,
                        "src": "1535:18:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 35,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "1535:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 38,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "value",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 40,
                        "src": "1555:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 37,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1555:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1512:57:0"
                  },
                  "src": "1498:72:0"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 48,
                  "name": "Approval",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 47,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 42,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "owner",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 48,
                        "src": "1590:21:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 41,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "1590:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 44,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "spender",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 48,
                        "src": "1613:23:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 43,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "1613:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 46,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "value",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 48,
                        "src": "1638:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 45,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1638:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1589:63:0"
                  },
                  "src": "1575:78:0"
                },
                {
                  "body": null,
                  "documentation": {
                    "id": 49,
                    "nodeType": "StructuredDocumentation",
                    "src": "1659:20:0",
                    "text": "@notice EIP 2612"
                  },
                  "functionSelector": "d505accf",
                  "id": 66,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "permit",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 64,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 51,
                        "mutability": "mutable",
                        "name": "owner",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 66,
                        "src": "1709:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 50,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "1709:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 53,
                        "mutability": "mutable",
                        "name": "spender",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 66,
                        "src": "1732:15:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 52,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "1732:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 55,
                        "mutability": "mutable",
                        "name": "value",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 66,
                        "src": "1757:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 54,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1757:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 57,
                        "mutability": "mutable",
                        "name": "deadline",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 66,
                        "src": "1780:16:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 56,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1780:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 59,
                        "mutability": "mutable",
                        "name": "v",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 66,
                        "src": "1806:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        "typeName": {
                          "id": 58,
                          "name": "uint8",
                          "nodeType": "ElementaryTypeName",
                          "src": "1806:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 61,
                        "mutability": "mutable",
                        "name": "r",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 66,
                        "src": "1823:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 60,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "1823:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 63,
                        "mutability": "mutable",
                        "name": "s",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 66,
                        "src": "1842:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 62,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "1842:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1699:158:0"
                  },
                  "returnParameters": {
                    "id": 65,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1866:0:0"
                  },
                  "scope": 67,
                  "src": "1684:183:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 3102,
              "src": "1171:698:0"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "interface",
              "documentation": null,
              "fullyImplemented": false,
              "id": 82,
              "linearizedBaseContracts": [
                82
              ],
              "name": "IFlashBorrower",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": null,
                  "documentation": {
                    "id": 68,
                    "nodeType": "StructuredDocumentation",
                    "src": "1974:475:0",
                    "text": "@notice The flashloan callback. `amount` + `fee` needs to repayed to msg.sender before this call returns.\n @param sender The address of the invoker of this flashloan.\n @param token The address of the token that is loaned.\n @param amount of the `token` that is loaned.\n @param fee The fee that needs to be paid on top for this loan. Needs to be the same as `token`.\n @param data Additional data that was passed to the flashloan function."
                  },
                  "functionSelector": "23e30c8b",
                  "id": 81,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "onFlashLoan",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 79,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 70,
                        "mutability": "mutable",
                        "name": "sender",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 81,
                        "src": "2484:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 69,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "2484:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 72,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 81,
                        "src": "2508:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$67",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 71,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 67,
                          "src": "2508:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$67",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 74,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 81,
                        "src": "2530:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 73,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "2530:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 76,
                        "mutability": "mutable",
                        "name": "fee",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 81,
                        "src": "2554:11:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 75,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "2554:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 78,
                        "mutability": "mutable",
                        "name": "data",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 81,
                        "src": "2575:19:0",
                        "stateVariable": false,
                        "storageLocation": "calldata",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_calldata_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 77,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "2575:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2474:126:0"
                  },
                  "returnParameters": {
                    "id": 80,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "2609:0:0"
                  },
                  "scope": 82,
                  "src": "2454:156:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 3102,
              "src": "1943:669:0"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "interface",
              "documentation": null,
              "fullyImplemented": false,
              "id": 100,
              "linearizedBaseContracts": [
                100
              ],
              "name": "IBatchFlashBorrower",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": null,
                  "documentation": {
                    "id": 83,
                    "nodeType": "StructuredDocumentation",
                    "src": "2650:535:0",
                    "text": "@notice The callback for batched flashloans. Every amount + fee needs to repayed to msg.sender before this call returns.\n @param sender The address of the invoker of this flashloan.\n @param tokens Array of addresses for ERC-20 tokens that is loaned.\n @param amounts A one-to-one map to `tokens` that is loaned.\n @param fees A one-to-one map to `tokens` that needs to be paid on top for each loan. Needs to be the same token.\n @param data Additional data that was passed to the flashloan function."
                  },
                  "functionSelector": "d9d17623",
                  "id": 99,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "onBatchFlashLoan",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 97,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 85,
                        "mutability": "mutable",
                        "name": "sender",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 99,
                        "src": "3225:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 84,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "3225:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 88,
                        "mutability": "mutable",
                        "name": "tokens",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 99,
                        "src": "3249:24:0",
                        "stateVariable": false,
                        "storageLocation": "calldata",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_contract$_IERC20_$67_$dyn_calldata_ptr",
                          "typeString": "contract IERC20[]"
                        },
                        "typeName": {
                          "baseType": {
                            "contractScope": null,
                            "id": 86,
                            "name": "IERC20",
                            "nodeType": "UserDefinedTypeName",
                            "referencedDeclaration": 67,
                            "src": "3249:6:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC20_$67",
                              "typeString": "contract IERC20"
                            }
                          },
                          "id": 87,
                          "length": null,
                          "nodeType": "ArrayTypeName",
                          "src": "3249:8:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_contract$_IERC20_$67_$dyn_storage_ptr",
                            "typeString": "contract IERC20[]"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 91,
                        "mutability": "mutable",
                        "name": "amounts",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 99,
                        "src": "3283:26:0",
                        "stateVariable": false,
                        "storageLocation": "calldata",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_uint256_$dyn_calldata_ptr",
                          "typeString": "uint256[]"
                        },
                        "typeName": {
                          "baseType": {
                            "id": 89,
                            "name": "uint256",
                            "nodeType": "ElementaryTypeName",
                            "src": "3283:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "id": 90,
                          "length": null,
                          "nodeType": "ArrayTypeName",
                          "src": "3283:9:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                            "typeString": "uint256[]"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 94,
                        "mutability": "mutable",
                        "name": "fees",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 99,
                        "src": "3319:23:0",
                        "stateVariable": false,
                        "storageLocation": "calldata",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_uint256_$dyn_calldata_ptr",
                          "typeString": "uint256[]"
                        },
                        "typeName": {
                          "baseType": {
                            "id": 92,
                            "name": "uint256",
                            "nodeType": "ElementaryTypeName",
                            "src": "3319:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "id": 93,
                          "length": null,
                          "nodeType": "ArrayTypeName",
                          "src": "3319:9:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                            "typeString": "uint256[]"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 96,
                        "mutability": "mutable",
                        "name": "data",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 99,
                        "src": "3352:19:0",
                        "stateVariable": false,
                        "storageLocation": "calldata",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_calldata_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 95,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "3352:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3215:162:0"
                  },
                  "returnParameters": {
                    "id": 98,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "3386:0:0"
                  },
                  "scope": 100,
                  "src": "3190:197:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 3102,
              "src": "2614:775:0"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "interface",
              "documentation": null,
              "fullyImplemented": false,
              "id": 109,
              "linearizedBaseContracts": [
                109
              ],
              "name": "IWETH",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "d0e30db0",
                  "id": 103,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "deposit",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 101,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "3496:2:0"
                  },
                  "returnParameters": {
                    "id": 102,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "3515:0:0"
                  },
                  "scope": 109,
                  "src": "3480:36:0",
                  "stateMutability": "payable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "2e1a7d4d",
                  "id": 108,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "withdraw",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 106,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 105,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 108,
                        "src": "3540:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 104,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "3540:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3539:9:0"
                  },
                  "returnParameters": {
                    "id": 107,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "3557:0:0"
                  },
                  "scope": 109,
                  "src": "3522:36:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 3102,
              "src": "3458:102:0"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "interface",
              "documentation": null,
              "fullyImplemented": false,
              "id": 142,
              "linearizedBaseContracts": [
                142
              ],
              "name": "IStrategy",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": null,
                  "documentation": {
                    "id": 110,
                    "nodeType": "StructuredDocumentation",
                    "src": "3659:127:0",
                    "text": "@notice Send the assets to the Strategy and call skim to invest them.\n @param amount The amount of tokens to invest."
                  },
                  "functionSelector": "6939aaf5",
                  "id": 115,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "skim",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 113,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 112,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 115,
                        "src": "3805:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 111,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "3805:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3804:16:0"
                  },
                  "returnParameters": {
                    "id": 114,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "3829:0:0"
                  },
                  "scope": 142,
                  "src": "3791:39:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": {
                    "id": 116,
                    "nodeType": "StructuredDocumentation",
                    "src": "3836:372:0",
                    "text": "@notice Harvest any profits made converted to the asset and pass them to the caller.\n @param balance The amount of tokens the caller thinks it has invested.\n @param sender The address of the initiator of this transaction. Can be used for reimbursements, etc.\n @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`."
                  },
                  "functionSelector": "18fccc76",
                  "id": 125,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "harvest",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 121,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 118,
                        "mutability": "mutable",
                        "name": "balance",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 125,
                        "src": "4230:15:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 117,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "4230:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 120,
                        "mutability": "mutable",
                        "name": "sender",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 125,
                        "src": "4247:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 119,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "4247:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4229:33:0"
                  },
                  "returnParameters": {
                    "id": 124,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 123,
                        "mutability": "mutable",
                        "name": "amountAdded",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 125,
                        "src": "4281:18:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_int256",
                          "typeString": "int256"
                        },
                        "typeName": {
                          "id": 122,
                          "name": "int256",
                          "nodeType": "ElementaryTypeName",
                          "src": "4281:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_int256",
                            "typeString": "int256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4280:20:0"
                  },
                  "scope": 142,
                  "src": "4213:88:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": {
                    "id": 126,
                    "nodeType": "StructuredDocumentation",
                    "src": "4307:395:0",
                    "text": "@notice Withdraw assets. The returned amount can differ from the requested amount due to rounding.\n @dev The `actualAmount` should be very close to the amount.\n The difference should NOT be used to report a loss. That's what harvest is for.\n @param amount The requested amount the caller wants to withdraw.\n @return actualAmount The real amount that is withdrawn."
                  },
                  "functionSelector": "2e1a7d4d",
                  "id": 133,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "withdraw",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 129,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 128,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 133,
                        "src": "4725:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 127,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "4725:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4724:16:0"
                  },
                  "returnParameters": {
                    "id": 132,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 131,
                        "mutability": "mutable",
                        "name": "actualAmount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 133,
                        "src": "4759:20:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 130,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "4759:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4758:22:0"
                  },
                  "scope": 142,
                  "src": "4707:74:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": {
                    "id": 134,
                    "nodeType": "StructuredDocumentation",
                    "src": "4787:255:0",
                    "text": "@notice Withdraw all assets in the safest way possible. This shouldn't fail.\n @param balance The amount of tokens the caller thinks it has invested.\n @return amountAdded The delta (+profit or -loss) that occured in contrast to `balance`."
                  },
                  "functionSelector": "7f8661a1",
                  "id": 141,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "exit",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 137,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 136,
                        "mutability": "mutable",
                        "name": "balance",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 141,
                        "src": "5061:15:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 135,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "5061:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5060:17:0"
                  },
                  "returnParameters": {
                    "id": 140,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 139,
                        "mutability": "mutable",
                        "name": "amountAdded",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 141,
                        "src": "5096:18:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_int256",
                          "typeString": "int256"
                        },
                        "typeName": {
                          "id": 138,
                          "name": "int256",
                          "nodeType": "ElementaryTypeName",
                          "src": "5096:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_int256",
                            "typeString": "int256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5095:20:0"
                  },
                  "scope": 142,
                  "src": "5047:69:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 3102,
              "src": "3633:1485:0"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "library",
              "documentation": null,
              "fullyImplemented": true,
              "id": 255,
              "linearizedBaseContracts": [
                255
              ],
              "name": "BoringERC20",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "constant": true,
                  "id": 145,
                  "mutability": "constant",
                  "name": "SIG_SYMBOL",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 255,
                  "src": "5255:47:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes4",
                    "typeString": "bytes4"
                  },
                  "typeName": {
                    "id": 143,
                    "name": "bytes4",
                    "nodeType": "ElementaryTypeName",
                    "src": "5255:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes4",
                      "typeString": "bytes4"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "30783935643839623431",
                    "id": 144,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "5292:10:0",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_2514000705_by_1",
                      "typeString": "int_const 2514000705"
                    },
                    "value": "0x95d89b41"
                  },
                  "visibility": "private"
                },
                {
                  "constant": true,
                  "id": 148,
                  "mutability": "constant",
                  "name": "SIG_NAME",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 255,
                  "src": "5320:45:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes4",
                    "typeString": "bytes4"
                  },
                  "typeName": {
                    "id": 146,
                    "name": "bytes4",
                    "nodeType": "ElementaryTypeName",
                    "src": "5320:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes4",
                      "typeString": "bytes4"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "30783036666464653033",
                    "id": 147,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "5355:10:0",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_117300739_by_1",
                      "typeString": "int_const 117300739"
                    },
                    "value": "0x06fdde03"
                  },
                  "visibility": "private"
                },
                {
                  "constant": true,
                  "id": 151,
                  "mutability": "constant",
                  "name": "SIG_DECIMALS",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 255,
                  "src": "5381:49:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes4",
                    "typeString": "bytes4"
                  },
                  "typeName": {
                    "id": 149,
                    "name": "bytes4",
                    "nodeType": "ElementaryTypeName",
                    "src": "5381:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes4",
                      "typeString": "bytes4"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "30783331336365353637",
                    "id": 150,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "5420:10:0",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_826074471_by_1",
                      "typeString": "int_const 826074471"
                    },
                    "value": "0x313ce567"
                  },
                  "visibility": "private"
                },
                {
                  "constant": true,
                  "id": 154,
                  "mutability": "constant",
                  "name": "SIG_TRANSFER",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 255,
                  "src": "5450:49:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes4",
                    "typeString": "bytes4"
                  },
                  "typeName": {
                    "id": 152,
                    "name": "bytes4",
                    "nodeType": "ElementaryTypeName",
                    "src": "5450:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes4",
                      "typeString": "bytes4"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "30786139303539636262",
                    "id": 153,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "5489:10:0",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_2835717307_by_1",
                      "typeString": "int_const 2835717307"
                    },
                    "value": "0xa9059cbb"
                  },
                  "visibility": "private"
                },
                {
                  "constant": true,
                  "id": 157,
                  "mutability": "constant",
                  "name": "SIG_TRANSFER_FROM",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 255,
                  "src": "5534:54:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes4",
                    "typeString": "bytes4"
                  },
                  "typeName": {
                    "id": 155,
                    "name": "bytes4",
                    "nodeType": "ElementaryTypeName",
                    "src": "5534:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes4",
                      "typeString": "bytes4"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "30783233623837326464",
                    "id": 156,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "5578:10:0",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_599290589_by_1",
                      "typeString": "int_const 599290589"
                    },
                    "value": "0x23b872dd"
                  },
                  "visibility": "private"
                },
                {
                  "body": {
                    "id": 203,
                    "nodeType": "Block",
                    "src": "6002:230:0",
                    "statements": [
                      {
                        "assignments": [
                          168,
                          170
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 168,
                            "mutability": "mutable",
                            "name": "success",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 203,
                            "src": "6013:12:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            },
                            "typeName": {
                              "id": 167,
                              "name": "bool",
                              "nodeType": "ElementaryTypeName",
                              "src": "6013:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          },
                          {
                            "constant": false,
                            "id": 170,
                            "mutability": "mutable",
                            "name": "data",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 203,
                            "src": "6027:17:0",
                            "stateVariable": false,
                            "storageLocation": "memory",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes_memory_ptr",
                              "typeString": "bytes"
                            },
                            "typeName": {
                              "id": 169,
                              "name": "bytes",
                              "nodeType": "ElementaryTypeName",
                              "src": "6027:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_storage_ptr",
                                "typeString": "bytes"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 183,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 178,
                                  "name": "SIG_TRANSFER",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 154,
                                  "src": "6091:12:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes4",
                                    "typeString": "bytes4"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 179,
                                  "name": "to",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 162,
                                  "src": "6105:2:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 180,
                                  "name": "amount",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 164,
                                  "src": "6109:6:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_bytes4",
                                    "typeString": "bytes4"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 176,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "6068:3:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 177,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSelector",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "6068:22:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithselector_pure$_t_bytes4_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (bytes4) pure returns (bytes memory)"
                                }
                              },
                              "id": 181,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "6068:48:0",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 173,
                                  "name": "token",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 160,
                                  "src": "6056:5:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_IERC20_$67",
                                    "typeString": "contract IERC20"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_IERC20_$67",
                                    "typeString": "contract IERC20"
                                  }
                                ],
                                "id": 172,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "6048:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 171,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "6048:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 174,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "6048:14:0",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "id": 175,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "call",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "6048:19:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$",
                              "typeString": "function (bytes memory) payable returns (bool,bytes memory)"
                            }
                          },
                          "id": 182,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "6048:69:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_bool_$_t_bytes_memory_ptr_$",
                            "typeString": "tuple(bool,bytes memory)"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "6012:105:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              "id": 199,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 185,
                                "name": "success",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 168,
                                "src": "6135:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "&&",
                              "rightExpression": {
                                "argumentTypes": null,
                                "components": [
                                  {
                                    "argumentTypes": null,
                                    "commonType": {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    },
                                    "id": 197,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "leftExpression": {
                                      "argumentTypes": null,
                                      "commonType": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      },
                                      "id": 189,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftExpression": {
                                        "argumentTypes": null,
                                        "expression": {
                                          "argumentTypes": null,
                                          "id": 186,
                                          "name": "data",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 170,
                                          "src": "6147:4:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_memory_ptr",
                                            "typeString": "bytes memory"
                                          }
                                        },
                                        "id": 187,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "memberName": "length",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": null,
                                        "src": "6147:11:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "nodeType": "BinaryOperation",
                                      "operator": "==",
                                      "rightExpression": {
                                        "argumentTypes": null,
                                        "hexValue": "30",
                                        "id": 188,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": true,
                                        "kind": "number",
                                        "lValueRequested": false,
                                        "nodeType": "Literal",
                                        "src": "6162:1:0",
                                        "subdenomination": null,
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_rational_0_by_1",
                                          "typeString": "int_const 0"
                                        },
                                        "value": "0"
                                      },
                                      "src": "6147:16:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                      }
                                    },
                                    "nodeType": "BinaryOperation",
                                    "operator": "||",
                                    "rightExpression": {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "id": 192,
                                          "name": "data",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 170,
                                          "src": "6178:4:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_memory_ptr",
                                            "typeString": "bytes memory"
                                          }
                                        },
                                        {
                                          "argumentTypes": null,
                                          "components": [
                                            {
                                              "argumentTypes": null,
                                              "id": 194,
                                              "isConstant": false,
                                              "isLValue": false,
                                              "isPure": true,
                                              "lValueRequested": false,
                                              "nodeType": "ElementaryTypeNameExpression",
                                              "src": "6185:4:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_type$_t_bool_$",
                                                "typeString": "type(bool)"
                                              },
                                              "typeName": {
                                                "id": 193,
                                                "name": "bool",
                                                "nodeType": "ElementaryTypeName",
                                                "src": "6185:4:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": null,
                                                  "typeString": null
                                                }
                                              }
                                            }
                                          ],
                                          "id": 195,
                                          "isConstant": false,
                                          "isInlineArray": false,
                                          "isLValue": false,
                                          "isPure": true,
                                          "lValueRequested": false,
                                          "nodeType": "TupleExpression",
                                          "src": "6184:6:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_type$_t_bool_$",
                                            "typeString": "type(bool)"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_bytes_memory_ptr",
                                            "typeString": "bytes memory"
                                          },
                                          {
                                            "typeIdentifier": "t_type$_t_bool_$",
                                            "typeString": "type(bool)"
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": null,
                                          "id": 190,
                                          "name": "abi",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": -1,
                                          "src": "6167:3:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_magic_abi",
                                            "typeString": "abi"
                                          }
                                        },
                                        "id": 191,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": true,
                                        "lValueRequested": false,
                                        "memberName": "decode",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": null,
                                        "src": "6167:10:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_function_abidecode_pure$__$returns$__$",
                                          "typeString": "function () pure"
                                        }
                                      },
                                      "id": 196,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "6167:24:0",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                      }
                                    },
                                    "src": "6147:44:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    }
                                  }
                                ],
                                "id": 198,
                                "isConstant": false,
                                "isInlineArray": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "TupleExpression",
                                "src": "6146:46:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "src": "6135:57:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "426f72696e6745524332303a205472616e73666572206661696c6564",
                              "id": 200,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "6194:30:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_1a3f0851ddc9e157ae96e52ed9dfd71a8cb4b1cf2a73b26b9f3f9e0aa9469d27",
                                "typeString": "literal_string \"BoringERC20: Transfer failed\""
                              },
                              "value": "BoringERC20: Transfer failed"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_1a3f0851ddc9e157ae96e52ed9dfd71a8cb4b1cf2a73b26b9f3f9e0aa9469d27",
                                "typeString": "literal_string \"BoringERC20: Transfer failed\""
                              }
                            ],
                            "id": 184,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "6127:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 201,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "6127:98:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 202,
                        "nodeType": "ExpressionStatement",
                        "src": "6127:98:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 158,
                    "nodeType": "StructuredDocumentation",
                    "src": "5636:258:0",
                    "text": "@notice Provides a safe ERC20.transfer version for different ERC-20 implementations.\n Reverts on a failed transfer.\n @param token The address of the ERC-20 token.\n @param to Transfer tokens to.\n @param amount The token amount."
                  },
                  "id": 204,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "safeTransfer",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 165,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 160,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 204,
                        "src": "5930:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$67",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 159,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 67,
                          "src": "5930:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$67",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 162,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 204,
                        "src": "5952:10:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 161,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "5952:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 164,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 204,
                        "src": "5972:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 163,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "5972:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5920:72:0"
                  },
                  "returnParameters": {
                    "id": 166,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "6002:0:0"
                  },
                  "scope": 255,
                  "src": "5899:333:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 253,
                    "nodeType": "Block",
                    "src": "6676:245:0",
                    "statements": [
                      {
                        "assignments": [
                          217,
                          219
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 217,
                            "mutability": "mutable",
                            "name": "success",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 253,
                            "src": "6687:12:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            },
                            "typeName": {
                              "id": 216,
                              "name": "bool",
                              "nodeType": "ElementaryTypeName",
                              "src": "6687:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          },
                          {
                            "constant": false,
                            "id": 219,
                            "mutability": "mutable",
                            "name": "data",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 253,
                            "src": "6701:17:0",
                            "stateVariable": false,
                            "storageLocation": "memory",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes_memory_ptr",
                              "typeString": "bytes"
                            },
                            "typeName": {
                              "id": 218,
                              "name": "bytes",
                              "nodeType": "ElementaryTypeName",
                              "src": "6701:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_storage_ptr",
                                "typeString": "bytes"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 233,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 227,
                                  "name": "SIG_TRANSFER_FROM",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 157,
                                  "src": "6765:17:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes4",
                                    "typeString": "bytes4"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 228,
                                  "name": "from",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 209,
                                  "src": "6784:4:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 229,
                                  "name": "to",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 211,
                                  "src": "6790:2:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 230,
                                  "name": "amount",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 213,
                                  "src": "6794:6:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_bytes4",
                                    "typeString": "bytes4"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 225,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "6742:3:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 226,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSelector",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "6742:22:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithselector_pure$_t_bytes4_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (bytes4) pure returns (bytes memory)"
                                }
                              },
                              "id": 231,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "6742:59:0",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 222,
                                  "name": "token",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 207,
                                  "src": "6730:5:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_IERC20_$67",
                                    "typeString": "contract IERC20"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_IERC20_$67",
                                    "typeString": "contract IERC20"
                                  }
                                ],
                                "id": 221,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "6722:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 220,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "6722:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 223,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "6722:14:0",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "id": 224,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "call",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "6722:19:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$",
                              "typeString": "function (bytes memory) payable returns (bool,bytes memory)"
                            }
                          },
                          "id": 232,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "6722:80:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_bool_$_t_bytes_memory_ptr_$",
                            "typeString": "tuple(bool,bytes memory)"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "6686:116:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              "id": 249,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 235,
                                "name": "success",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 217,
                                "src": "6820:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "&&",
                              "rightExpression": {
                                "argumentTypes": null,
                                "components": [
                                  {
                                    "argumentTypes": null,
                                    "commonType": {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    },
                                    "id": 247,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "leftExpression": {
                                      "argumentTypes": null,
                                      "commonType": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      },
                                      "id": 239,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftExpression": {
                                        "argumentTypes": null,
                                        "expression": {
                                          "argumentTypes": null,
                                          "id": 236,
                                          "name": "data",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 219,
                                          "src": "6832:4:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_memory_ptr",
                                            "typeString": "bytes memory"
                                          }
                                        },
                                        "id": 237,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "memberName": "length",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": null,
                                        "src": "6832:11:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "nodeType": "BinaryOperation",
                                      "operator": "==",
                                      "rightExpression": {
                                        "argumentTypes": null,
                                        "hexValue": "30",
                                        "id": 238,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": true,
                                        "kind": "number",
                                        "lValueRequested": false,
                                        "nodeType": "Literal",
                                        "src": "6847:1:0",
                                        "subdenomination": null,
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_rational_0_by_1",
                                          "typeString": "int_const 0"
                                        },
                                        "value": "0"
                                      },
                                      "src": "6832:16:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                      }
                                    },
                                    "nodeType": "BinaryOperation",
                                    "operator": "||",
                                    "rightExpression": {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "id": 242,
                                          "name": "data",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 219,
                                          "src": "6863:4:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_memory_ptr",
                                            "typeString": "bytes memory"
                                          }
                                        },
                                        {
                                          "argumentTypes": null,
                                          "components": [
                                            {
                                              "argumentTypes": null,
                                              "id": 244,
                                              "isConstant": false,
                                              "isLValue": false,
                                              "isPure": true,
                                              "lValueRequested": false,
                                              "nodeType": "ElementaryTypeNameExpression",
                                              "src": "6870:4:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_type$_t_bool_$",
                                                "typeString": "type(bool)"
                                              },
                                              "typeName": {
                                                "id": 243,
                                                "name": "bool",
                                                "nodeType": "ElementaryTypeName",
                                                "src": "6870:4:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": null,
                                                  "typeString": null
                                                }
                                              }
                                            }
                                          ],
                                          "id": 245,
                                          "isConstant": false,
                                          "isInlineArray": false,
                                          "isLValue": false,
                                          "isPure": true,
                                          "lValueRequested": false,
                                          "nodeType": "TupleExpression",
                                          "src": "6869:6:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_type$_t_bool_$",
                                            "typeString": "type(bool)"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_bytes_memory_ptr",
                                            "typeString": "bytes memory"
                                          },
                                          {
                                            "typeIdentifier": "t_type$_t_bool_$",
                                            "typeString": "type(bool)"
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": null,
                                          "id": 240,
                                          "name": "abi",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": -1,
                                          "src": "6852:3:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_magic_abi",
                                            "typeString": "abi"
                                          }
                                        },
                                        "id": 241,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": true,
                                        "lValueRequested": false,
                                        "memberName": "decode",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": null,
                                        "src": "6852:10:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_function_abidecode_pure$__$returns$__$",
                                          "typeString": "function () pure"
                                        }
                                      },
                                      "id": 246,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "6852:24:0",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                      }
                                    },
                                    "src": "6832:44:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    }
                                  }
                                ],
                                "id": 248,
                                "isConstant": false,
                                "isInlineArray": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "TupleExpression",
                                "src": "6831:46:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "src": "6820:57:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "426f72696e6745524332303a205472616e7366657246726f6d206661696c6564",
                              "id": 250,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "6879:34:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_dffd2f381f9235cb5927387124071d63a91c90f587c3edae76629d7dc4794f26",
                                "typeString": "literal_string \"BoringERC20: TransferFrom failed\""
                              },
                              "value": "BoringERC20: TransferFrom failed"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_dffd2f381f9235cb5927387124071d63a91c90f587c3edae76629d7dc4794f26",
                                "typeString": "literal_string \"BoringERC20: TransferFrom failed\""
                              }
                            ],
                            "id": 234,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "6812:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 251,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "6812:102:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 252,
                        "nodeType": "ExpressionStatement",
                        "src": "6812:102:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 205,
                    "nodeType": "StructuredDocumentation",
                    "src": "6238:304:0",
                    "text": "@notice Provides a safe ERC20.transferFrom version for different ERC-20 implementations.\n Reverts on a failed transfer.\n @param token The address of the ERC-20 token.\n @param from Transfer tokens from.\n @param to Transfer tokens to.\n @param amount The token amount."
                  },
                  "id": 254,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "safeTransferFrom",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 214,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 207,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 254,
                        "src": "6582:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$67",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 206,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 67,
                          "src": "6582:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$67",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 209,
                        "mutability": "mutable",
                        "name": "from",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 254,
                        "src": "6604:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 208,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "6604:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 211,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 254,
                        "src": "6626:10:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 210,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "6626:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 213,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 254,
                        "src": "6646:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 212,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "6646:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "6572:94:0"
                  },
                  "returnParameters": {
                    "id": 215,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "6676:0:0"
                  },
                  "scope": 255,
                  "src": "6547:374:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                }
              ],
              "scope": 3102,
              "src": "5229:1694:0"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "library",
              "documentation": {
                "id": 256,
                "nodeType": "StructuredDocumentation",
                "src": "7033:151:0",
                "text": "@notice A library for performing overflow-/underflow-safe math,\n updated with awesomeness from of DappHub (https://github.com/dapphub/ds-math)."
              },
              "fullyImplemented": true,
              "id": 407,
              "linearizedBaseContracts": [
                407
              ],
              "name": "BoringMath",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": {
                    "id": 277,
                    "nodeType": "Block",
                    "src": "7278:70:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 273,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "components": [
                                  {
                                    "argumentTypes": null,
                                    "id": 270,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "leftHandSide": {
                                      "argumentTypes": null,
                                      "id": 266,
                                      "name": "c",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 263,
                                      "src": "7297:1:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "nodeType": "Assignment",
                                    "operator": "=",
                                    "rightHandSide": {
                                      "argumentTypes": null,
                                      "commonType": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      },
                                      "id": 269,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftExpression": {
                                        "argumentTypes": null,
                                        "id": 267,
                                        "name": "a",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 258,
                                        "src": "7301:1:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "nodeType": "BinaryOperation",
                                      "operator": "+",
                                      "rightExpression": {
                                        "argumentTypes": null,
                                        "id": 268,
                                        "name": "b",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 260,
                                        "src": "7305:1:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "src": "7301:5:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "src": "7297:9:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "id": 271,
                                "isConstant": false,
                                "isInlineArray": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "TupleExpression",
                                "src": "7296:11:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": ">=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 272,
                                "name": "b",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 260,
                                "src": "7311:1:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "src": "7296:16:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "426f72696e674d6174683a20416464204f766572666c6f77",
                              "id": 274,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "7314:26:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_77ffeda554f4c047bf45dac1a596ee270f922490aa5e98c6ba2b9599856e6fdf",
                                "typeString": "literal_string \"BoringMath: Add Overflow\""
                              },
                              "value": "BoringMath: Add Overflow"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_77ffeda554f4c047bf45dac1a596ee270f922490aa5e98c6ba2b9599856e6fdf",
                                "typeString": "literal_string \"BoringMath: Add Overflow\""
                              }
                            ],
                            "id": 265,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "7288:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 275,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "7288:53:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 276,
                        "nodeType": "ExpressionStatement",
                        "src": "7288:53:0"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 278,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "add",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 261,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 258,
                        "mutability": "mutable",
                        "name": "a",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 278,
                        "src": "7222:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 257,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "7222:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 260,
                        "mutability": "mutable",
                        "name": "b",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 278,
                        "src": "7233:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 259,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "7233:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "7221:22:0"
                  },
                  "returnParameters": {
                    "id": 264,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 263,
                        "mutability": "mutable",
                        "name": "c",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 278,
                        "src": "7267:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 262,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "7267:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "7266:11:0"
                  },
                  "scope": 407,
                  "src": "7209:139:0",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 299,
                    "nodeType": "Block",
                    "src": "7423:67:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 295,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "components": [
                                  {
                                    "argumentTypes": null,
                                    "id": 292,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "leftHandSide": {
                                      "argumentTypes": null,
                                      "id": 288,
                                      "name": "c",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 285,
                                      "src": "7442:1:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "nodeType": "Assignment",
                                    "operator": "=",
                                    "rightHandSide": {
                                      "argumentTypes": null,
                                      "commonType": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      },
                                      "id": 291,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftExpression": {
                                        "argumentTypes": null,
                                        "id": 289,
                                        "name": "a",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 280,
                                        "src": "7446:1:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "nodeType": "BinaryOperation",
                                      "operator": "-",
                                      "rightExpression": {
                                        "argumentTypes": null,
                                        "id": 290,
                                        "name": "b",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 282,
                                        "src": "7450:1:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "src": "7446:5:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "src": "7442:9:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "id": 293,
                                "isConstant": false,
                                "isInlineArray": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "TupleExpression",
                                "src": "7441:11:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "<=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 294,
                                "name": "a",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 280,
                                "src": "7456:1:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "src": "7441:16:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "426f72696e674d6174683a20556e646572666c6f77",
                              "id": 296,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "7459:23:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_00354eeca4367367797d07bf5ab6743c0cc453fe689bbb72132c3c4e2b5612aa",
                                "typeString": "literal_string \"BoringMath: Underflow\""
                              },
                              "value": "BoringMath: Underflow"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_00354eeca4367367797d07bf5ab6743c0cc453fe689bbb72132c3c4e2b5612aa",
                                "typeString": "literal_string \"BoringMath: Underflow\""
                              }
                            ],
                            "id": 287,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "7433:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 297,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "7433:50:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 298,
                        "nodeType": "ExpressionStatement",
                        "src": "7433:50:0"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 300,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "sub",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 283,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 280,
                        "mutability": "mutable",
                        "name": "a",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 300,
                        "src": "7367:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 279,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "7367:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 282,
                        "mutability": "mutable",
                        "name": "b",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 300,
                        "src": "7378:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 281,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "7378:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "7366:22:0"
                  },
                  "returnParameters": {
                    "id": 286,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 285,
                        "mutability": "mutable",
                        "name": "c",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 300,
                        "src": "7412:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 284,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "7412:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "7411:11:0"
                  },
                  "scope": 407,
                  "src": "7354:136:0",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 327,
                    "nodeType": "Block",
                    "src": "7565:84:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              "id": 323,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                "id": 312,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "id": 310,
                                  "name": "b",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 304,
                                  "src": "7583:1:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "==",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "hexValue": "30",
                                  "id": 311,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "7588:1:0",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  },
                                  "value": "0"
                                },
                                "src": "7583:6:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "||",
                              "rightExpression": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                "id": 322,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "commonType": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "id": 320,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "leftExpression": {
                                    "argumentTypes": null,
                                    "components": [
                                      {
                                        "argumentTypes": null,
                                        "id": 317,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "leftHandSide": {
                                          "argumentTypes": null,
                                          "id": 313,
                                          "name": "c",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 307,
                                          "src": "7594:1:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "nodeType": "Assignment",
                                        "operator": "=",
                                        "rightHandSide": {
                                          "argumentTypes": null,
                                          "commonType": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          },
                                          "id": 316,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "leftExpression": {
                                            "argumentTypes": null,
                                            "id": 314,
                                            "name": "a",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 302,
                                            "src": "7598:1:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          },
                                          "nodeType": "BinaryOperation",
                                          "operator": "*",
                                          "rightExpression": {
                                            "argumentTypes": null,
                                            "id": 315,
                                            "name": "b",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 304,
                                            "src": "7602:1:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          },
                                          "src": "7598:5:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "src": "7594:9:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      }
                                    ],
                                    "id": 318,
                                    "isConstant": false,
                                    "isInlineArray": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "nodeType": "TupleExpression",
                                    "src": "7593:11:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "nodeType": "BinaryOperation",
                                  "operator": "/",
                                  "rightExpression": {
                                    "argumentTypes": null,
                                    "id": 319,
                                    "name": "b",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 304,
                                    "src": "7607:1:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "src": "7593:15:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "==",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "id": 321,
                                  "name": "a",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 302,
                                  "src": "7612:1:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "7593:20:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "src": "7583:30:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "426f72696e674d6174683a204d756c204f766572666c6f77",
                              "id": 324,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "7615:26:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_efa2024ddfa13946089ac6325359d421926f574cb871587fa659a82734fa675e",
                                "typeString": "literal_string \"BoringMath: Mul Overflow\""
                              },
                              "value": "BoringMath: Mul Overflow"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_efa2024ddfa13946089ac6325359d421926f574cb871587fa659a82734fa675e",
                                "typeString": "literal_string \"BoringMath: Mul Overflow\""
                              }
                            ],
                            "id": 309,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "7575:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 325,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "7575:67:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 326,
                        "nodeType": "ExpressionStatement",
                        "src": "7575:67:0"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 328,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "mul",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 305,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 302,
                        "mutability": "mutable",
                        "name": "a",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 328,
                        "src": "7509:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 301,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "7509:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 304,
                        "mutability": "mutable",
                        "name": "b",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 328,
                        "src": "7520:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 303,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "7520:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "7508:22:0"
                  },
                  "returnParameters": {
                    "id": 308,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 307,
                        "mutability": "mutable",
                        "name": "c",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 328,
                        "src": "7554:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 306,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "7554:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "7553:11:0"
                  },
                  "scope": 407,
                  "src": "7496:153:0",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 353,
                    "nodeType": "Block",
                    "src": "7715:98:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 342,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 336,
                                "name": "a",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 330,
                                "src": "7733:1:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "<=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 340,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "UnaryOperation",
                                    "operator": "-",
                                    "prefix": true,
                                    "src": "7746:2:0",
                                    "subExpression": {
                                      "argumentTypes": null,
                                      "hexValue": "31",
                                      "id": 339,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "kind": "number",
                                      "lValueRequested": false,
                                      "nodeType": "Literal",
                                      "src": "7747:1:0",
                                      "subdenomination": null,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_rational_1_by_1",
                                        "typeString": "int_const 1"
                                      },
                                      "value": "1"
                                    },
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_minus_1_by_1",
                                      "typeString": "int_const -1"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_rational_minus_1_by_1",
                                      "typeString": "int_const -1"
                                    }
                                  ],
                                  "id": 338,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "7738:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_uint128_$",
                                    "typeString": "type(uint128)"
                                  },
                                  "typeName": {
                                    "id": 337,
                                    "name": "uint128",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "7738:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 341,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "7738:11:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              },
                              "src": "7733:16:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "426f72696e674d6174683a2075696e74313238204f766572666c6f77",
                              "id": 343,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "7751:30:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_64196137e15a5be4f7488ecfa918cfa26a6c2051ae3fb739c5de9bf8431fe9a5",
                                "typeString": "literal_string \"BoringMath: uint128 Overflow\""
                              },
                              "value": "BoringMath: uint128 Overflow"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_64196137e15a5be4f7488ecfa918cfa26a6c2051ae3fb739c5de9bf8431fe9a5",
                                "typeString": "literal_string \"BoringMath: uint128 Overflow\""
                              }
                            ],
                            "id": 335,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "7725:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 344,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "7725:57:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 345,
                        "nodeType": "ExpressionStatement",
                        "src": "7725:57:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 351,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 346,
                            "name": "c",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 333,
                            "src": "7792:1:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 349,
                                "name": "a",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 330,
                                "src": "7804:1:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "id": 348,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "ElementaryTypeNameExpression",
                              "src": "7796:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_uint128_$",
                                "typeString": "type(uint128)"
                              },
                              "typeName": {
                                "id": 347,
                                "name": "uint128",
                                "nodeType": "ElementaryTypeName",
                                "src": "7796:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": null,
                                  "typeString": null
                                }
                              }
                            },
                            "id": 350,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "7796:10:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "src": "7792:14:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "id": 352,
                        "nodeType": "ExpressionStatement",
                        "src": "7792:14:0"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 354,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "to128",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 331,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 330,
                        "mutability": "mutable",
                        "name": "a",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 354,
                        "src": "7670:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 329,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "7670:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "7669:11:0"
                  },
                  "returnParameters": {
                    "id": 334,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 333,
                        "mutability": "mutable",
                        "name": "c",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 354,
                        "src": "7704:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint128",
                          "typeString": "uint128"
                        },
                        "typeName": {
                          "id": 332,
                          "name": "uint128",
                          "nodeType": "ElementaryTypeName",
                          "src": "7704:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "7703:11:0"
                  },
                  "scope": 407,
                  "src": "7655:158:0",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 379,
                    "nodeType": "Block",
                    "src": "7877:95:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 368,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 362,
                                "name": "a",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 356,
                                "src": "7895:1:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "<=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 366,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "UnaryOperation",
                                    "operator": "-",
                                    "prefix": true,
                                    "src": "7907:2:0",
                                    "subExpression": {
                                      "argumentTypes": null,
                                      "hexValue": "31",
                                      "id": 365,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "kind": "number",
                                      "lValueRequested": false,
                                      "nodeType": "Literal",
                                      "src": "7908:1:0",
                                      "subdenomination": null,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_rational_1_by_1",
                                        "typeString": "int_const 1"
                                      },
                                      "value": "1"
                                    },
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_minus_1_by_1",
                                      "typeString": "int_const -1"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_rational_minus_1_by_1",
                                      "typeString": "int_const -1"
                                    }
                                  ],
                                  "id": 364,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "7900:6:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_uint64_$",
                                    "typeString": "type(uint64)"
                                  },
                                  "typeName": {
                                    "id": 363,
                                    "name": "uint64",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "7900:6:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 367,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "7900:10:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint64",
                                  "typeString": "uint64"
                                }
                              },
                              "src": "7895:15:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "426f72696e674d6174683a2075696e743634204f766572666c6f77",
                              "id": 369,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "7912:29:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_b3c33265b589f76cafa7df00c0a28addc9a2c2003a13a1e0e4b875f58eb08764",
                                "typeString": "literal_string \"BoringMath: uint64 Overflow\""
                              },
                              "value": "BoringMath: uint64 Overflow"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_b3c33265b589f76cafa7df00c0a28addc9a2c2003a13a1e0e4b875f58eb08764",
                                "typeString": "literal_string \"BoringMath: uint64 Overflow\""
                              }
                            ],
                            "id": 361,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "7887:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 370,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "7887:55:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 371,
                        "nodeType": "ExpressionStatement",
                        "src": "7887:55:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 377,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 372,
                            "name": "c",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 359,
                            "src": "7952:1:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint64",
                              "typeString": "uint64"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 375,
                                "name": "a",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 356,
                                "src": "7963:1:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "id": 374,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "ElementaryTypeNameExpression",
                              "src": "7956:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_uint64_$",
                                "typeString": "type(uint64)"
                              },
                              "typeName": {
                                "id": 373,
                                "name": "uint64",
                                "nodeType": "ElementaryTypeName",
                                "src": "7956:6:0",
                                "typeDescriptions": {
                                  "typeIdentifier": null,
                                  "typeString": null
                                }
                              }
                            },
                            "id": 376,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "7956:9:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint64",
                              "typeString": "uint64"
                            }
                          },
                          "src": "7952:13:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint64",
                            "typeString": "uint64"
                          }
                        },
                        "id": 378,
                        "nodeType": "ExpressionStatement",
                        "src": "7952:13:0"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 380,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "to64",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 357,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 356,
                        "mutability": "mutable",
                        "name": "a",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 380,
                        "src": "7833:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 355,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "7833:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "7832:11:0"
                  },
                  "returnParameters": {
                    "id": 360,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 359,
                        "mutability": "mutable",
                        "name": "c",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 380,
                        "src": "7867:8:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint64",
                          "typeString": "uint64"
                        },
                        "typeName": {
                          "id": 358,
                          "name": "uint64",
                          "nodeType": "ElementaryTypeName",
                          "src": "7867:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint64",
                            "typeString": "uint64"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "7866:10:0"
                  },
                  "scope": 407,
                  "src": "7819:153:0",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 405,
                    "nodeType": "Block",
                    "src": "8036:95:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 394,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 388,
                                "name": "a",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 382,
                                "src": "8054:1:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "<=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 392,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "UnaryOperation",
                                    "operator": "-",
                                    "prefix": true,
                                    "src": "8066:2:0",
                                    "subExpression": {
                                      "argumentTypes": null,
                                      "hexValue": "31",
                                      "id": 391,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "kind": "number",
                                      "lValueRequested": false,
                                      "nodeType": "Literal",
                                      "src": "8067:1:0",
                                      "subdenomination": null,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_rational_1_by_1",
                                        "typeString": "int_const 1"
                                      },
                                      "value": "1"
                                    },
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_minus_1_by_1",
                                      "typeString": "int_const -1"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_rational_minus_1_by_1",
                                      "typeString": "int_const -1"
                                    }
                                  ],
                                  "id": 390,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "8059:6:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_uint32_$",
                                    "typeString": "type(uint32)"
                                  },
                                  "typeName": {
                                    "id": 389,
                                    "name": "uint32",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "8059:6:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 393,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "8059:10:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint32",
                                  "typeString": "uint32"
                                }
                              },
                              "src": "8054:15:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "426f72696e674d6174683a2075696e743332204f766572666c6f77",
                              "id": 395,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "8071:29:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_d8918cd18a3e78dc3bd01c63d310640381efda31e2d3ce751014519bc65013fc",
                                "typeString": "literal_string \"BoringMath: uint32 Overflow\""
                              },
                              "value": "BoringMath: uint32 Overflow"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_d8918cd18a3e78dc3bd01c63d310640381efda31e2d3ce751014519bc65013fc",
                                "typeString": "literal_string \"BoringMath: uint32 Overflow\""
                              }
                            ],
                            "id": 387,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "8046:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 396,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "8046:55:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 397,
                        "nodeType": "ExpressionStatement",
                        "src": "8046:55:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 403,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 398,
                            "name": "c",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 385,
                            "src": "8111:1:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint32",
                              "typeString": "uint32"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 401,
                                "name": "a",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 382,
                                "src": "8122:1:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "id": 400,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "ElementaryTypeNameExpression",
                              "src": "8115:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_uint32_$",
                                "typeString": "type(uint32)"
                              },
                              "typeName": {
                                "id": 399,
                                "name": "uint32",
                                "nodeType": "ElementaryTypeName",
                                "src": "8115:6:0",
                                "typeDescriptions": {
                                  "typeIdentifier": null,
                                  "typeString": null
                                }
                              }
                            },
                            "id": 402,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "8115:9:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint32",
                              "typeString": "uint32"
                            }
                          },
                          "src": "8111:13:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "id": 404,
                        "nodeType": "ExpressionStatement",
                        "src": "8111:13:0"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 406,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "to32",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 383,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 382,
                        "mutability": "mutable",
                        "name": "a",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 406,
                        "src": "7992:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 381,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "7992:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "7991:11:0"
                  },
                  "returnParameters": {
                    "id": 386,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 385,
                        "mutability": "mutable",
                        "name": "c",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 406,
                        "src": "8026:8:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        },
                        "typeName": {
                          "id": 384,
                          "name": "uint32",
                          "nodeType": "ElementaryTypeName",
                          "src": "8026:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "8025:10:0"
                  },
                  "scope": 407,
                  "src": "7978:153:0",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                }
              ],
              "scope": 3102,
              "src": "7184:949:0"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "library",
              "documentation": {
                "id": 408,
                "nodeType": "StructuredDocumentation",
                "src": "8135:99:0",
                "text": "@notice A library for performing overflow-/underflow-safe addition and subtraction on uint128."
              },
              "fullyImplemented": true,
              "id": 453,
              "linearizedBaseContracts": [
                453
              ],
              "name": "BoringMath128",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": {
                    "id": 429,
                    "nodeType": "Block",
                    "src": "8331:70:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint128",
                                "typeString": "uint128"
                              },
                              "id": 425,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "components": [
                                  {
                                    "argumentTypes": null,
                                    "id": 422,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "leftHandSide": {
                                      "argumentTypes": null,
                                      "id": 418,
                                      "name": "c",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 415,
                                      "src": "8350:1:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint128",
                                        "typeString": "uint128"
                                      }
                                    },
                                    "nodeType": "Assignment",
                                    "operator": "=",
                                    "rightHandSide": {
                                      "argumentTypes": null,
                                      "commonType": {
                                        "typeIdentifier": "t_uint128",
                                        "typeString": "uint128"
                                      },
                                      "id": 421,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftExpression": {
                                        "argumentTypes": null,
                                        "id": 419,
                                        "name": "a",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 410,
                                        "src": "8354:1:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint128",
                                          "typeString": "uint128"
                                        }
                                      },
                                      "nodeType": "BinaryOperation",
                                      "operator": "+",
                                      "rightExpression": {
                                        "argumentTypes": null,
                                        "id": 420,
                                        "name": "b",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 412,
                                        "src": "8358:1:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint128",
                                          "typeString": "uint128"
                                        }
                                      },
                                      "src": "8354:5:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint128",
                                        "typeString": "uint128"
                                      }
                                    },
                                    "src": "8350:9:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint128",
                                      "typeString": "uint128"
                                    }
                                  }
                                ],
                                "id": 423,
                                "isConstant": false,
                                "isInlineArray": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "TupleExpression",
                                "src": "8349:11:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": ">=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 424,
                                "name": "b",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 412,
                                "src": "8364:1:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              },
                              "src": "8349:16:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "426f72696e674d6174683a20416464204f766572666c6f77",
                              "id": 426,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "8367:26:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_77ffeda554f4c047bf45dac1a596ee270f922490aa5e98c6ba2b9599856e6fdf",
                                "typeString": "literal_string \"BoringMath: Add Overflow\""
                              },
                              "value": "BoringMath: Add Overflow"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_77ffeda554f4c047bf45dac1a596ee270f922490aa5e98c6ba2b9599856e6fdf",
                                "typeString": "literal_string \"BoringMath: Add Overflow\""
                              }
                            ],
                            "id": 417,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "8341:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 427,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "8341:53:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 428,
                        "nodeType": "ExpressionStatement",
                        "src": "8341:53:0"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 430,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "add",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 413,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 410,
                        "mutability": "mutable",
                        "name": "a",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 430,
                        "src": "8275:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint128",
                          "typeString": "uint128"
                        },
                        "typeName": {
                          "id": 409,
                          "name": "uint128",
                          "nodeType": "ElementaryTypeName",
                          "src": "8275:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 412,
                        "mutability": "mutable",
                        "name": "b",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 430,
                        "src": "8286:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint128",
                          "typeString": "uint128"
                        },
                        "typeName": {
                          "id": 411,
                          "name": "uint128",
                          "nodeType": "ElementaryTypeName",
                          "src": "8286:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "8274:22:0"
                  },
                  "returnParameters": {
                    "id": 416,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 415,
                        "mutability": "mutable",
                        "name": "c",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 430,
                        "src": "8320:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint128",
                          "typeString": "uint128"
                        },
                        "typeName": {
                          "id": 414,
                          "name": "uint128",
                          "nodeType": "ElementaryTypeName",
                          "src": "8320:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "8319:11:0"
                  },
                  "scope": 453,
                  "src": "8262:139:0",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 451,
                    "nodeType": "Block",
                    "src": "8476:67:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint128",
                                "typeString": "uint128"
                              },
                              "id": 447,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "components": [
                                  {
                                    "argumentTypes": null,
                                    "id": 444,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "leftHandSide": {
                                      "argumentTypes": null,
                                      "id": 440,
                                      "name": "c",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 437,
                                      "src": "8495:1:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint128",
                                        "typeString": "uint128"
                                      }
                                    },
                                    "nodeType": "Assignment",
                                    "operator": "=",
                                    "rightHandSide": {
                                      "argumentTypes": null,
                                      "commonType": {
                                        "typeIdentifier": "t_uint128",
                                        "typeString": "uint128"
                                      },
                                      "id": 443,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftExpression": {
                                        "argumentTypes": null,
                                        "id": 441,
                                        "name": "a",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 432,
                                        "src": "8499:1:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint128",
                                          "typeString": "uint128"
                                        }
                                      },
                                      "nodeType": "BinaryOperation",
                                      "operator": "-",
                                      "rightExpression": {
                                        "argumentTypes": null,
                                        "id": 442,
                                        "name": "b",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 434,
                                        "src": "8503:1:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint128",
                                          "typeString": "uint128"
                                        }
                                      },
                                      "src": "8499:5:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint128",
                                        "typeString": "uint128"
                                      }
                                    },
                                    "src": "8495:9:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint128",
                                      "typeString": "uint128"
                                    }
                                  }
                                ],
                                "id": 445,
                                "isConstant": false,
                                "isInlineArray": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "TupleExpression",
                                "src": "8494:11:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "<=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 446,
                                "name": "a",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 432,
                                "src": "8509:1:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              },
                              "src": "8494:16:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "426f72696e674d6174683a20556e646572666c6f77",
                              "id": 448,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "8512:23:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_00354eeca4367367797d07bf5ab6743c0cc453fe689bbb72132c3c4e2b5612aa",
                                "typeString": "literal_string \"BoringMath: Underflow\""
                              },
                              "value": "BoringMath: Underflow"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_00354eeca4367367797d07bf5ab6743c0cc453fe689bbb72132c3c4e2b5612aa",
                                "typeString": "literal_string \"BoringMath: Underflow\""
                              }
                            ],
                            "id": 439,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "8486:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 449,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "8486:50:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 450,
                        "nodeType": "ExpressionStatement",
                        "src": "8486:50:0"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 452,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "sub",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 435,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 432,
                        "mutability": "mutable",
                        "name": "a",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 452,
                        "src": "8420:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint128",
                          "typeString": "uint128"
                        },
                        "typeName": {
                          "id": 431,
                          "name": "uint128",
                          "nodeType": "ElementaryTypeName",
                          "src": "8420:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 434,
                        "mutability": "mutable",
                        "name": "b",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 452,
                        "src": "8431:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint128",
                          "typeString": "uint128"
                        },
                        "typeName": {
                          "id": 433,
                          "name": "uint128",
                          "nodeType": "ElementaryTypeName",
                          "src": "8431:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "8419:22:0"
                  },
                  "returnParameters": {
                    "id": 438,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 437,
                        "mutability": "mutable",
                        "name": "c",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 452,
                        "src": "8465:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint128",
                          "typeString": "uint128"
                        },
                        "typeName": {
                          "id": 436,
                          "name": "uint128",
                          "nodeType": "ElementaryTypeName",
                          "src": "8465:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "8464:11:0"
                  },
                  "scope": 453,
                  "src": "8407:136:0",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                }
              ],
              "scope": 3102,
              "src": "8234:311:0"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "library",
              "documentation": {
                "id": 454,
                "nodeType": "StructuredDocumentation",
                "src": "8547:98:0",
                "text": "@notice A library for performing overflow-/underflow-safe addition and subtraction on uint64."
              },
              "fullyImplemented": true,
              "id": 499,
              "linearizedBaseContracts": [
                499
              ],
              "name": "BoringMath64",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": {
                    "id": 475,
                    "nodeType": "Block",
                    "src": "8738:70:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint64",
                                "typeString": "uint64"
                              },
                              "id": 471,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "components": [
                                  {
                                    "argumentTypes": null,
                                    "id": 468,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "leftHandSide": {
                                      "argumentTypes": null,
                                      "id": 464,
                                      "name": "c",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 461,
                                      "src": "8757:1:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint64",
                                        "typeString": "uint64"
                                      }
                                    },
                                    "nodeType": "Assignment",
                                    "operator": "=",
                                    "rightHandSide": {
                                      "argumentTypes": null,
                                      "commonType": {
                                        "typeIdentifier": "t_uint64",
                                        "typeString": "uint64"
                                      },
                                      "id": 467,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftExpression": {
                                        "argumentTypes": null,
                                        "id": 465,
                                        "name": "a",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 456,
                                        "src": "8761:1:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint64",
                                          "typeString": "uint64"
                                        }
                                      },
                                      "nodeType": "BinaryOperation",
                                      "operator": "+",
                                      "rightExpression": {
                                        "argumentTypes": null,
                                        "id": 466,
                                        "name": "b",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 458,
                                        "src": "8765:1:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint64",
                                          "typeString": "uint64"
                                        }
                                      },
                                      "src": "8761:5:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint64",
                                        "typeString": "uint64"
                                      }
                                    },
                                    "src": "8757:9:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint64",
                                      "typeString": "uint64"
                                    }
                                  }
                                ],
                                "id": 469,
                                "isConstant": false,
                                "isInlineArray": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "TupleExpression",
                                "src": "8756:11:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint64",
                                  "typeString": "uint64"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": ">=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 470,
                                "name": "b",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 458,
                                "src": "8771:1:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint64",
                                  "typeString": "uint64"
                                }
                              },
                              "src": "8756:16:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "426f72696e674d6174683a20416464204f766572666c6f77",
                              "id": 472,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "8774:26:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_77ffeda554f4c047bf45dac1a596ee270f922490aa5e98c6ba2b9599856e6fdf",
                                "typeString": "literal_string \"BoringMath: Add Overflow\""
                              },
                              "value": "BoringMath: Add Overflow"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_77ffeda554f4c047bf45dac1a596ee270f922490aa5e98c6ba2b9599856e6fdf",
                                "typeString": "literal_string \"BoringMath: Add Overflow\""
                              }
                            ],
                            "id": 463,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "8748:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 473,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "8748:53:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 474,
                        "nodeType": "ExpressionStatement",
                        "src": "8748:53:0"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 476,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "add",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 459,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 456,
                        "mutability": "mutable",
                        "name": "a",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 476,
                        "src": "8685:8:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint64",
                          "typeString": "uint64"
                        },
                        "typeName": {
                          "id": 455,
                          "name": "uint64",
                          "nodeType": "ElementaryTypeName",
                          "src": "8685:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint64",
                            "typeString": "uint64"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 458,
                        "mutability": "mutable",
                        "name": "b",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 476,
                        "src": "8695:8:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint64",
                          "typeString": "uint64"
                        },
                        "typeName": {
                          "id": 457,
                          "name": "uint64",
                          "nodeType": "ElementaryTypeName",
                          "src": "8695:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint64",
                            "typeString": "uint64"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "8684:20:0"
                  },
                  "returnParameters": {
                    "id": 462,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 461,
                        "mutability": "mutable",
                        "name": "c",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 476,
                        "src": "8728:8:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint64",
                          "typeString": "uint64"
                        },
                        "typeName": {
                          "id": 460,
                          "name": "uint64",
                          "nodeType": "ElementaryTypeName",
                          "src": "8728:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint64",
                            "typeString": "uint64"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "8727:10:0"
                  },
                  "scope": 499,
                  "src": "8672:136:0",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 497,
                    "nodeType": "Block",
                    "src": "8880:67:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint64",
                                "typeString": "uint64"
                              },
                              "id": 493,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "components": [
                                  {
                                    "argumentTypes": null,
                                    "id": 490,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "leftHandSide": {
                                      "argumentTypes": null,
                                      "id": 486,
                                      "name": "c",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 483,
                                      "src": "8899:1:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint64",
                                        "typeString": "uint64"
                                      }
                                    },
                                    "nodeType": "Assignment",
                                    "operator": "=",
                                    "rightHandSide": {
                                      "argumentTypes": null,
                                      "commonType": {
                                        "typeIdentifier": "t_uint64",
                                        "typeString": "uint64"
                                      },
                                      "id": 489,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftExpression": {
                                        "argumentTypes": null,
                                        "id": 487,
                                        "name": "a",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 478,
                                        "src": "8903:1:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint64",
                                          "typeString": "uint64"
                                        }
                                      },
                                      "nodeType": "BinaryOperation",
                                      "operator": "-",
                                      "rightExpression": {
                                        "argumentTypes": null,
                                        "id": 488,
                                        "name": "b",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 480,
                                        "src": "8907:1:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint64",
                                          "typeString": "uint64"
                                        }
                                      },
                                      "src": "8903:5:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint64",
                                        "typeString": "uint64"
                                      }
                                    },
                                    "src": "8899:9:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint64",
                                      "typeString": "uint64"
                                    }
                                  }
                                ],
                                "id": 491,
                                "isConstant": false,
                                "isInlineArray": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "TupleExpression",
                                "src": "8898:11:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint64",
                                  "typeString": "uint64"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "<=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 492,
                                "name": "a",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 478,
                                "src": "8913:1:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint64",
                                  "typeString": "uint64"
                                }
                              },
                              "src": "8898:16:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "426f72696e674d6174683a20556e646572666c6f77",
                              "id": 494,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "8916:23:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_00354eeca4367367797d07bf5ab6743c0cc453fe689bbb72132c3c4e2b5612aa",
                                "typeString": "literal_string \"BoringMath: Underflow\""
                              },
                              "value": "BoringMath: Underflow"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_00354eeca4367367797d07bf5ab6743c0cc453fe689bbb72132c3c4e2b5612aa",
                                "typeString": "literal_string \"BoringMath: Underflow\""
                              }
                            ],
                            "id": 485,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "8890:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 495,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "8890:50:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 496,
                        "nodeType": "ExpressionStatement",
                        "src": "8890:50:0"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 498,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "sub",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 481,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 478,
                        "mutability": "mutable",
                        "name": "a",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 498,
                        "src": "8827:8:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint64",
                          "typeString": "uint64"
                        },
                        "typeName": {
                          "id": 477,
                          "name": "uint64",
                          "nodeType": "ElementaryTypeName",
                          "src": "8827:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint64",
                            "typeString": "uint64"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 480,
                        "mutability": "mutable",
                        "name": "b",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 498,
                        "src": "8837:8:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint64",
                          "typeString": "uint64"
                        },
                        "typeName": {
                          "id": 479,
                          "name": "uint64",
                          "nodeType": "ElementaryTypeName",
                          "src": "8837:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint64",
                            "typeString": "uint64"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "8826:20:0"
                  },
                  "returnParameters": {
                    "id": 484,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 483,
                        "mutability": "mutable",
                        "name": "c",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 498,
                        "src": "8870:8:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint64",
                          "typeString": "uint64"
                        },
                        "typeName": {
                          "id": 482,
                          "name": "uint64",
                          "nodeType": "ElementaryTypeName",
                          "src": "8870:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint64",
                            "typeString": "uint64"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "8869:10:0"
                  },
                  "scope": 499,
                  "src": "8814:133:0",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                }
              ],
              "scope": 3102,
              "src": "8645:304:0"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "library",
              "documentation": {
                "id": 500,
                "nodeType": "StructuredDocumentation",
                "src": "8951:98:0",
                "text": "@notice A library for performing overflow-/underflow-safe addition and subtraction on uint32."
              },
              "fullyImplemented": true,
              "id": 545,
              "linearizedBaseContracts": [
                545
              ],
              "name": "BoringMath32",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": {
                    "id": 521,
                    "nodeType": "Block",
                    "src": "9142:70:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint32",
                                "typeString": "uint32"
                              },
                              "id": 517,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "components": [
                                  {
                                    "argumentTypes": null,
                                    "id": 514,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "leftHandSide": {
                                      "argumentTypes": null,
                                      "id": 510,
                                      "name": "c",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 507,
                                      "src": "9161:1:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint32",
                                        "typeString": "uint32"
                                      }
                                    },
                                    "nodeType": "Assignment",
                                    "operator": "=",
                                    "rightHandSide": {
                                      "argumentTypes": null,
                                      "commonType": {
                                        "typeIdentifier": "t_uint32",
                                        "typeString": "uint32"
                                      },
                                      "id": 513,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftExpression": {
                                        "argumentTypes": null,
                                        "id": 511,
                                        "name": "a",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 502,
                                        "src": "9165:1:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint32",
                                          "typeString": "uint32"
                                        }
                                      },
                                      "nodeType": "BinaryOperation",
                                      "operator": "+",
                                      "rightExpression": {
                                        "argumentTypes": null,
                                        "id": 512,
                                        "name": "b",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 504,
                                        "src": "9169:1:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint32",
                                          "typeString": "uint32"
                                        }
                                      },
                                      "src": "9165:5:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint32",
                                        "typeString": "uint32"
                                      }
                                    },
                                    "src": "9161:9:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint32",
                                      "typeString": "uint32"
                                    }
                                  }
                                ],
                                "id": 515,
                                "isConstant": false,
                                "isInlineArray": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "TupleExpression",
                                "src": "9160:11:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint32",
                                  "typeString": "uint32"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": ">=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 516,
                                "name": "b",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 504,
                                "src": "9175:1:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint32",
                                  "typeString": "uint32"
                                }
                              },
                              "src": "9160:16:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "426f72696e674d6174683a20416464204f766572666c6f77",
                              "id": 518,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "9178:26:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_77ffeda554f4c047bf45dac1a596ee270f922490aa5e98c6ba2b9599856e6fdf",
                                "typeString": "literal_string \"BoringMath: Add Overflow\""
                              },
                              "value": "BoringMath: Add Overflow"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_77ffeda554f4c047bf45dac1a596ee270f922490aa5e98c6ba2b9599856e6fdf",
                                "typeString": "literal_string \"BoringMath: Add Overflow\""
                              }
                            ],
                            "id": 509,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "9152:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 519,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "9152:53:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 520,
                        "nodeType": "ExpressionStatement",
                        "src": "9152:53:0"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 522,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "add",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 505,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 502,
                        "mutability": "mutable",
                        "name": "a",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 522,
                        "src": "9089:8:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        },
                        "typeName": {
                          "id": 501,
                          "name": "uint32",
                          "nodeType": "ElementaryTypeName",
                          "src": "9089:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 504,
                        "mutability": "mutable",
                        "name": "b",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 522,
                        "src": "9099:8:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        },
                        "typeName": {
                          "id": 503,
                          "name": "uint32",
                          "nodeType": "ElementaryTypeName",
                          "src": "9099:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "9088:20:0"
                  },
                  "returnParameters": {
                    "id": 508,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 507,
                        "mutability": "mutable",
                        "name": "c",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 522,
                        "src": "9132:8:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        },
                        "typeName": {
                          "id": 506,
                          "name": "uint32",
                          "nodeType": "ElementaryTypeName",
                          "src": "9132:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "9131:10:0"
                  },
                  "scope": 545,
                  "src": "9076:136:0",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 543,
                    "nodeType": "Block",
                    "src": "9284:67:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint32",
                                "typeString": "uint32"
                              },
                              "id": 539,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "components": [
                                  {
                                    "argumentTypes": null,
                                    "id": 536,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "leftHandSide": {
                                      "argumentTypes": null,
                                      "id": 532,
                                      "name": "c",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 529,
                                      "src": "9303:1:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint32",
                                        "typeString": "uint32"
                                      }
                                    },
                                    "nodeType": "Assignment",
                                    "operator": "=",
                                    "rightHandSide": {
                                      "argumentTypes": null,
                                      "commonType": {
                                        "typeIdentifier": "t_uint32",
                                        "typeString": "uint32"
                                      },
                                      "id": 535,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftExpression": {
                                        "argumentTypes": null,
                                        "id": 533,
                                        "name": "a",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 524,
                                        "src": "9307:1:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint32",
                                          "typeString": "uint32"
                                        }
                                      },
                                      "nodeType": "BinaryOperation",
                                      "operator": "-",
                                      "rightExpression": {
                                        "argumentTypes": null,
                                        "id": 534,
                                        "name": "b",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 526,
                                        "src": "9311:1:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint32",
                                          "typeString": "uint32"
                                        }
                                      },
                                      "src": "9307:5:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint32",
                                        "typeString": "uint32"
                                      }
                                    },
                                    "src": "9303:9:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint32",
                                      "typeString": "uint32"
                                    }
                                  }
                                ],
                                "id": 537,
                                "isConstant": false,
                                "isInlineArray": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "TupleExpression",
                                "src": "9302:11:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint32",
                                  "typeString": "uint32"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "<=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 538,
                                "name": "a",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 524,
                                "src": "9317:1:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint32",
                                  "typeString": "uint32"
                                }
                              },
                              "src": "9302:16:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "426f72696e674d6174683a20556e646572666c6f77",
                              "id": 540,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "9320:23:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_00354eeca4367367797d07bf5ab6743c0cc453fe689bbb72132c3c4e2b5612aa",
                                "typeString": "literal_string \"BoringMath: Underflow\""
                              },
                              "value": "BoringMath: Underflow"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_00354eeca4367367797d07bf5ab6743c0cc453fe689bbb72132c3c4e2b5612aa",
                                "typeString": "literal_string \"BoringMath: Underflow\""
                              }
                            ],
                            "id": 531,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "9294:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 541,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "9294:50:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 542,
                        "nodeType": "ExpressionStatement",
                        "src": "9294:50:0"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 544,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "sub",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 527,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 524,
                        "mutability": "mutable",
                        "name": "a",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 544,
                        "src": "9231:8:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        },
                        "typeName": {
                          "id": 523,
                          "name": "uint32",
                          "nodeType": "ElementaryTypeName",
                          "src": "9231:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 526,
                        "mutability": "mutable",
                        "name": "b",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 544,
                        "src": "9241:8:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        },
                        "typeName": {
                          "id": 525,
                          "name": "uint32",
                          "nodeType": "ElementaryTypeName",
                          "src": "9241:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "9230:20:0"
                  },
                  "returnParameters": {
                    "id": 530,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 529,
                        "mutability": "mutable",
                        "name": "c",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 544,
                        "src": "9274:8:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        },
                        "typeName": {
                          "id": 528,
                          "name": "uint32",
                          "nodeType": "ElementaryTypeName",
                          "src": "9274:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "9273:10:0"
                  },
                  "scope": 545,
                  "src": "9218:133:0",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                }
              ],
              "scope": 3102,
              "src": "9049:304:0"
            },
            {
              "canonicalName": "Rebase",
              "id": 550,
              "members": [
                {
                  "constant": false,
                  "id": 547,
                  "mutability": "mutable",
                  "name": "elastic",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 550,
                  "src": "9485:15:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint128",
                    "typeString": "uint128"
                  },
                  "typeName": {
                    "id": 546,
                    "name": "uint128",
                    "nodeType": "ElementaryTypeName",
                    "src": "9485:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint128",
                      "typeString": "uint128"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 549,
                  "mutability": "mutable",
                  "name": "base",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 550,
                  "src": "9506:12:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint128",
                    "typeString": "uint128"
                  },
                  "typeName": {
                    "id": 548,
                    "name": "uint128",
                    "nodeType": "ElementaryTypeName",
                    "src": "9506:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint128",
                      "typeString": "uint128"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "name": "Rebase",
              "nodeType": "StructDefinition",
              "scope": 3102,
              "src": "9465:56:0",
              "visibility": "public"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "library",
              "documentation": {
                "id": 551,
                "nodeType": "StructuredDocumentation",
                "src": "9523:68:0",
                "text": "@notice A rebasing library using overflow-/underflow-safe math."
              },
              "fullyImplemented": true,
              "id": 898,
              "linearizedBaseContracts": [
                898
              ],
              "name": "RebaseLibrary",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "id": 554,
                  "libraryName": {
                    "contractScope": null,
                    "id": 552,
                    "name": "BoringMath",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 407,
                    "src": "9625:10:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_BoringMath_$407",
                      "typeString": "library BoringMath"
                    }
                  },
                  "nodeType": "UsingForDirective",
                  "src": "9619:29:0",
                  "typeName": {
                    "id": 553,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "9640:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  }
                },
                {
                  "id": 557,
                  "libraryName": {
                    "contractScope": null,
                    "id": 555,
                    "name": "BoringMath128",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 453,
                    "src": "9659:13:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_BoringMath128_$453",
                      "typeString": "library BoringMath128"
                    }
                  },
                  "nodeType": "UsingForDirective",
                  "src": "9653:32:0",
                  "typeName": {
                    "id": 556,
                    "name": "uint128",
                    "nodeType": "ElementaryTypeName",
                    "src": "9677:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint128",
                      "typeString": "uint128"
                    }
                  }
                },
                {
                  "body": {
                    "id": 612,
                    "nodeType": "Block",
                    "src": "9910:283:0",
                    "statements": [
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          },
                          "id": 572,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 569,
                              "name": "total",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 560,
                              "src": "9924:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Rebase_$550_memory_ptr",
                                "typeString": "struct Rebase memory"
                              }
                            },
                            "id": 570,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "elastic",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 547,
                            "src": "9924:13:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 571,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "9941:1:0",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "9924:18:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": {
                          "id": 610,
                          "nodeType": "Block",
                          "src": "9989:198:0",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 587,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "id": 578,
                                  "name": "base",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 567,
                                  "src": "10003:4:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "commonType": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "id": 586,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "leftExpression": {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "expression": {
                                          "argumentTypes": null,
                                          "id": 581,
                                          "name": "total",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 560,
                                          "src": "10022:5:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_struct$_Rebase_$550_memory_ptr",
                                            "typeString": "struct Rebase memory"
                                          }
                                        },
                                        "id": 582,
                                        "isConstant": false,
                                        "isLValue": true,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "memberName": "base",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": 549,
                                        "src": "10022:10:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint128",
                                          "typeString": "uint128"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_uint128",
                                          "typeString": "uint128"
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": null,
                                        "id": 579,
                                        "name": "elastic",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 562,
                                        "src": "10010:7:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "id": 580,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "memberName": "mul",
                                      "nodeType": "MemberAccess",
                                      "referencedDeclaration": 328,
                                      "src": "10010:11:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                        "typeString": "function (uint256,uint256) pure returns (uint256)"
                                      }
                                    },
                                    "id": 583,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "functionCall",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "10010:23:0",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "nodeType": "BinaryOperation",
                                  "operator": "/",
                                  "rightExpression": {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 584,
                                      "name": "total",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 560,
                                      "src": "10036:5:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_Rebase_$550_memory_ptr",
                                        "typeString": "struct Rebase memory"
                                      }
                                    },
                                    "id": 585,
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "elastic",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 547,
                                    "src": "10036:13:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint128",
                                      "typeString": "uint128"
                                    }
                                  },
                                  "src": "10010:39:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "10003:46:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 588,
                              "nodeType": "ExpressionStatement",
                              "src": "10003:46:0"
                            },
                            {
                              "condition": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                },
                                "id": 600,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "id": 589,
                                  "name": "roundUp",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 564,
                                  "src": "10067:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "&&",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "commonType": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "id": 599,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "leftExpression": {
                                    "argumentTypes": null,
                                    "commonType": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    },
                                    "id": 597,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "leftExpression": {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "expression": {
                                            "argumentTypes": null,
                                            "id": 592,
                                            "name": "total",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 560,
                                            "src": "10087:5:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_struct$_Rebase_$550_memory_ptr",
                                              "typeString": "struct Rebase memory"
                                            }
                                          },
                                          "id": 593,
                                          "isConstant": false,
                                          "isLValue": true,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "memberName": "elastic",
                                          "nodeType": "MemberAccess",
                                          "referencedDeclaration": 547,
                                          "src": "10087:13:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint128",
                                            "typeString": "uint128"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_uint128",
                                            "typeString": "uint128"
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": null,
                                          "id": 590,
                                          "name": "base",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 567,
                                          "src": "10078:4:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "id": 591,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "memberName": "mul",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": 328,
                                        "src": "10078:8:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                          "typeString": "function (uint256,uint256) pure returns (uint256)"
                                        }
                                      },
                                      "id": 594,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "10078:23:0",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "nodeType": "BinaryOperation",
                                    "operator": "/",
                                    "rightExpression": {
                                      "argumentTypes": null,
                                      "expression": {
                                        "argumentTypes": null,
                                        "id": 595,
                                        "name": "total",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 560,
                                        "src": "10104:5:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_struct$_Rebase_$550_memory_ptr",
                                          "typeString": "struct Rebase memory"
                                        }
                                      },
                                      "id": 596,
                                      "isConstant": false,
                                      "isLValue": true,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "memberName": "base",
                                      "nodeType": "MemberAccess",
                                      "referencedDeclaration": 549,
                                      "src": "10104:10:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint128",
                                        "typeString": "uint128"
                                      }
                                    },
                                    "src": "10078:36:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "nodeType": "BinaryOperation",
                                  "operator": "<",
                                  "rightExpression": {
                                    "argumentTypes": null,
                                    "id": 598,
                                    "name": "elastic",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 562,
                                    "src": "10117:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "src": "10078:46:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                "src": "10067:57:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "falseBody": null,
                              "id": 609,
                              "nodeType": "IfStatement",
                              "src": "10063:114:0",
                              "trueBody": {
                                "id": 608,
                                "nodeType": "Block",
                                "src": "10126:51:0",
                                "statements": [
                                  {
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 606,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftHandSide": {
                                        "argumentTypes": null,
                                        "id": 601,
                                        "name": "base",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 567,
                                        "src": "10144:4:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "nodeType": "Assignment",
                                      "operator": "=",
                                      "rightHandSide": {
                                        "argumentTypes": null,
                                        "arguments": [
                                          {
                                            "argumentTypes": null,
                                            "hexValue": "31",
                                            "id": 604,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": true,
                                            "kind": "number",
                                            "lValueRequested": false,
                                            "nodeType": "Literal",
                                            "src": "10160:1:0",
                                            "subdenomination": null,
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_rational_1_by_1",
                                              "typeString": "int_const 1"
                                            },
                                            "value": "1"
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": [
                                            {
                                              "typeIdentifier": "t_rational_1_by_1",
                                              "typeString": "int_const 1"
                                            }
                                          ],
                                          "expression": {
                                            "argumentTypes": null,
                                            "id": 602,
                                            "name": "base",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 567,
                                            "src": "10151:4:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          },
                                          "id": 603,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "memberName": "add",
                                          "nodeType": "MemberAccess",
                                          "referencedDeclaration": 278,
                                          "src": "10151:8:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                            "typeString": "function (uint256,uint256) pure returns (uint256)"
                                          }
                                        },
                                        "id": 605,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "10151:11:0",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "src": "10144:18:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "id": 607,
                                    "nodeType": "ExpressionStatement",
                                    "src": "10144:18:0"
                                  }
                                ]
                              }
                            }
                          ]
                        },
                        "id": 611,
                        "nodeType": "IfStatement",
                        "src": "9920:267:0",
                        "trueBody": {
                          "id": 577,
                          "nodeType": "Block",
                          "src": "9944:39:0",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 575,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "id": 573,
                                  "name": "base",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 567,
                                  "src": "9958:4:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "id": 574,
                                  "name": "elastic",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 562,
                                  "src": "9965:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "9958:14:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 576,
                              "nodeType": "ExpressionStatement",
                              "src": "9958:14:0"
                            }
                          ]
                        }
                      }
                    ]
                  },
                  "documentation": {
                    "id": 558,
                    "nodeType": "StructuredDocumentation",
                    "src": "9691:79:0",
                    "text": "@notice Calculates the base value in relationship to `elastic` and `total`."
                  },
                  "id": 613,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "toBase",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 565,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 560,
                        "mutability": "mutable",
                        "name": "total",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 613,
                        "src": "9800:19:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Rebase_$550_memory_ptr",
                          "typeString": "struct Rebase"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 559,
                          "name": "Rebase",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 550,
                          "src": "9800:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Rebase_$550_storage_ptr",
                            "typeString": "struct Rebase"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 562,
                        "mutability": "mutable",
                        "name": "elastic",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 613,
                        "src": "9829:15:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 561,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "9829:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 564,
                        "mutability": "mutable",
                        "name": "roundUp",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 613,
                        "src": "9854:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 563,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "9854:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "9790:82:0"
                  },
                  "returnParameters": {
                    "id": 568,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 567,
                        "mutability": "mutable",
                        "name": "base",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 613,
                        "src": "9896:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 566,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "9896:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "9895:14:0"
                  },
                  "scope": 898,
                  "src": "9775:418:0",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 668,
                    "nodeType": "Block",
                    "src": "10421:286:0",
                    "statements": [
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          },
                          "id": 628,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 625,
                              "name": "total",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 616,
                              "src": "10435:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Rebase_$550_memory_ptr",
                                "typeString": "struct Rebase memory"
                              }
                            },
                            "id": 626,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "base",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 549,
                            "src": "10435:10:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 627,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "10449:1:0",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "10435:15:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": {
                          "id": 666,
                          "nodeType": "Block",
                          "src": "10497:204:0",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 643,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "id": 634,
                                  "name": "elastic",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 623,
                                  "src": "10511:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "commonType": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "id": 642,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "leftExpression": {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "expression": {
                                          "argumentTypes": null,
                                          "id": 637,
                                          "name": "total",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 616,
                                          "src": "10530:5:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_struct$_Rebase_$550_memory_ptr",
                                            "typeString": "struct Rebase memory"
                                          }
                                        },
                                        "id": 638,
                                        "isConstant": false,
                                        "isLValue": true,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "memberName": "elastic",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": 547,
                                        "src": "10530:13:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint128",
                                          "typeString": "uint128"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_uint128",
                                          "typeString": "uint128"
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": null,
                                        "id": 635,
                                        "name": "base",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 618,
                                        "src": "10521:4:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "id": 636,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "memberName": "mul",
                                      "nodeType": "MemberAccess",
                                      "referencedDeclaration": 328,
                                      "src": "10521:8:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                        "typeString": "function (uint256,uint256) pure returns (uint256)"
                                      }
                                    },
                                    "id": 639,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "functionCall",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "10521:23:0",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "nodeType": "BinaryOperation",
                                  "operator": "/",
                                  "rightExpression": {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 640,
                                      "name": "total",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 616,
                                      "src": "10547:5:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_Rebase_$550_memory_ptr",
                                        "typeString": "struct Rebase memory"
                                      }
                                    },
                                    "id": 641,
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "base",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 549,
                                    "src": "10547:10:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint128",
                                      "typeString": "uint128"
                                    }
                                  },
                                  "src": "10521:36:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "10511:46:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 644,
                              "nodeType": "ExpressionStatement",
                              "src": "10511:46:0"
                            },
                            {
                              "condition": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                },
                                "id": 656,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "id": 645,
                                  "name": "roundUp",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 620,
                                  "src": "10575:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "&&",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "commonType": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "id": 655,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "leftExpression": {
                                    "argumentTypes": null,
                                    "commonType": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    },
                                    "id": 653,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "leftExpression": {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "expression": {
                                            "argumentTypes": null,
                                            "id": 648,
                                            "name": "total",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 616,
                                            "src": "10598:5:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_struct$_Rebase_$550_memory_ptr",
                                              "typeString": "struct Rebase memory"
                                            }
                                          },
                                          "id": 649,
                                          "isConstant": false,
                                          "isLValue": true,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "memberName": "base",
                                          "nodeType": "MemberAccess",
                                          "referencedDeclaration": 549,
                                          "src": "10598:10:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint128",
                                            "typeString": "uint128"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_uint128",
                                            "typeString": "uint128"
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": null,
                                          "id": 646,
                                          "name": "elastic",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 623,
                                          "src": "10586:7:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "id": 647,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "memberName": "mul",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": 328,
                                        "src": "10586:11:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                          "typeString": "function (uint256,uint256) pure returns (uint256)"
                                        }
                                      },
                                      "id": 650,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "10586:23:0",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "nodeType": "BinaryOperation",
                                    "operator": "/",
                                    "rightExpression": {
                                      "argumentTypes": null,
                                      "expression": {
                                        "argumentTypes": null,
                                        "id": 651,
                                        "name": "total",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 616,
                                        "src": "10612:5:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_struct$_Rebase_$550_memory_ptr",
                                          "typeString": "struct Rebase memory"
                                        }
                                      },
                                      "id": 652,
                                      "isConstant": false,
                                      "isLValue": true,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "memberName": "elastic",
                                      "nodeType": "MemberAccess",
                                      "referencedDeclaration": 547,
                                      "src": "10612:13:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint128",
                                        "typeString": "uint128"
                                      }
                                    },
                                    "src": "10586:39:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "nodeType": "BinaryOperation",
                                  "operator": "<",
                                  "rightExpression": {
                                    "argumentTypes": null,
                                    "id": 654,
                                    "name": "base",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 618,
                                    "src": "10628:4:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "src": "10586:46:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                "src": "10575:57:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "falseBody": null,
                              "id": 665,
                              "nodeType": "IfStatement",
                              "src": "10571:120:0",
                              "trueBody": {
                                "id": 664,
                                "nodeType": "Block",
                                "src": "10634:57:0",
                                "statements": [
                                  {
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 662,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftHandSide": {
                                        "argumentTypes": null,
                                        "id": 657,
                                        "name": "elastic",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 623,
                                        "src": "10652:7:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "nodeType": "Assignment",
                                      "operator": "=",
                                      "rightHandSide": {
                                        "argumentTypes": null,
                                        "arguments": [
                                          {
                                            "argumentTypes": null,
                                            "hexValue": "31",
                                            "id": 660,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": true,
                                            "kind": "number",
                                            "lValueRequested": false,
                                            "nodeType": "Literal",
                                            "src": "10674:1:0",
                                            "subdenomination": null,
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_rational_1_by_1",
                                              "typeString": "int_const 1"
                                            },
                                            "value": "1"
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": [
                                            {
                                              "typeIdentifier": "t_rational_1_by_1",
                                              "typeString": "int_const 1"
                                            }
                                          ],
                                          "expression": {
                                            "argumentTypes": null,
                                            "id": 658,
                                            "name": "elastic",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 623,
                                            "src": "10662:7:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          },
                                          "id": 659,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "memberName": "add",
                                          "nodeType": "MemberAccess",
                                          "referencedDeclaration": 278,
                                          "src": "10662:11:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                            "typeString": "function (uint256,uint256) pure returns (uint256)"
                                          }
                                        },
                                        "id": 661,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "10662:14:0",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "src": "10652:24:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "id": 663,
                                    "nodeType": "ExpressionStatement",
                                    "src": "10652:24:0"
                                  }
                                ]
                              }
                            }
                          ]
                        },
                        "id": 667,
                        "nodeType": "IfStatement",
                        "src": "10431:270:0",
                        "trueBody": {
                          "id": 633,
                          "nodeType": "Block",
                          "src": "10452:39:0",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 631,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "id": 629,
                                  "name": "elastic",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 623,
                                  "src": "10466:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "id": 630,
                                  "name": "base",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 618,
                                  "src": "10476:4:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "10466:14:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 632,
                              "nodeType": "ExpressionStatement",
                              "src": "10466:14:0"
                            }
                          ]
                        }
                      }
                    ]
                  },
                  "documentation": {
                    "id": 614,
                    "nodeType": "StructuredDocumentation",
                    "src": "10199:79:0",
                    "text": "@notice Calculates the elastic value in relationship to `base` and `total`."
                  },
                  "id": 669,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "toElastic",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 621,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 616,
                        "mutability": "mutable",
                        "name": "total",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 669,
                        "src": "10311:19:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Rebase_$550_memory_ptr",
                          "typeString": "struct Rebase"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 615,
                          "name": "Rebase",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 550,
                          "src": "10311:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Rebase_$550_storage_ptr",
                            "typeString": "struct Rebase"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 618,
                        "mutability": "mutable",
                        "name": "base",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 669,
                        "src": "10340:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 617,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "10340:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 620,
                        "mutability": "mutable",
                        "name": "roundUp",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 669,
                        "src": "10362:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 619,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "10362:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "10301:79:0"
                  },
                  "returnParameters": {
                    "id": 624,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 623,
                        "mutability": "mutable",
                        "name": "elastic",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 669,
                        "src": "10404:15:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 622,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "10404:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "10403:17:0"
                  },
                  "scope": 898,
                  "src": "10283:424:0",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 719,
                    "nodeType": "Block",
                    "src": "11018:196:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 689,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 683,
                            "name": "base",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 681,
                            "src": "11028:4:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 685,
                                "name": "total",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 672,
                                "src": "11042:5:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_Rebase_$550_memory_ptr",
                                  "typeString": "struct Rebase memory"
                                }
                              },
                              {
                                "argumentTypes": null,
                                "id": 686,
                                "name": "elastic",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 674,
                                "src": "11049:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              {
                                "argumentTypes": null,
                                "id": 687,
                                "name": "roundUp",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 676,
                                "src": "11058:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_struct$_Rebase_$550_memory_ptr",
                                  "typeString": "struct Rebase memory"
                                },
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              ],
                              "id": 684,
                              "name": "toBase",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 613,
                              "src": "11035:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_struct$_Rebase_$550_memory_ptr_$_t_uint256_$_t_bool_$returns$_t_uint256_$",
                                "typeString": "function (struct Rebase memory,uint256,bool) pure returns (uint256)"
                              }
                            },
                            "id": 688,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "11035:31:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "11028:38:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 690,
                        "nodeType": "ExpressionStatement",
                        "src": "11028:38:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 701,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 691,
                              "name": "total",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 672,
                              "src": "11076:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Rebase_$550_memory_ptr",
                                "typeString": "struct Rebase memory"
                              }
                            },
                            "id": 693,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberName": "elastic",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 547,
                            "src": "11076:13:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "arguments": [],
                                "expression": {
                                  "argumentTypes": [],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 697,
                                    "name": "elastic",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 674,
                                    "src": "11110:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "id": 698,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "to128",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 354,
                                  "src": "11110:13:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint128_$bound_to$_t_uint256_$",
                                    "typeString": "function (uint256) pure returns (uint128)"
                                  }
                                },
                                "id": 699,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "11110:15:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 694,
                                  "name": "total",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 672,
                                  "src": "11092:5:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_struct$_Rebase_$550_memory_ptr",
                                    "typeString": "struct Rebase memory"
                                  }
                                },
                                "id": 695,
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "elastic",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 547,
                                "src": "11092:13:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              },
                              "id": 696,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "add",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 430,
                              "src": "11092:17:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint128_$_t_uint128_$returns$_t_uint128_$bound_to$_t_uint128_$",
                                "typeString": "function (uint128,uint128) pure returns (uint128)"
                              }
                            },
                            "id": 700,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "11092:34:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "src": "11076:50:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "id": 702,
                        "nodeType": "ExpressionStatement",
                        "src": "11076:50:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 713,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 703,
                              "name": "total",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 672,
                              "src": "11136:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Rebase_$550_memory_ptr",
                                "typeString": "struct Rebase memory"
                              }
                            },
                            "id": 705,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberName": "base",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 549,
                            "src": "11136:10:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "arguments": [],
                                "expression": {
                                  "argumentTypes": [],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 709,
                                    "name": "base",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 681,
                                    "src": "11164:4:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "id": 710,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "to128",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 354,
                                  "src": "11164:10:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint128_$bound_to$_t_uint256_$",
                                    "typeString": "function (uint256) pure returns (uint128)"
                                  }
                                },
                                "id": 711,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "11164:12:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 706,
                                  "name": "total",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 672,
                                  "src": "11149:5:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_struct$_Rebase_$550_memory_ptr",
                                    "typeString": "struct Rebase memory"
                                  }
                                },
                                "id": 707,
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "base",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 549,
                                "src": "11149:10:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              },
                              "id": 708,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "add",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 430,
                              "src": "11149:14:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint128_$_t_uint128_$returns$_t_uint128_$bound_to$_t_uint128_$",
                                "typeString": "function (uint128,uint128) pure returns (uint128)"
                              }
                            },
                            "id": 712,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "11149:28:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "src": "11136:41:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "id": 714,
                        "nodeType": "ExpressionStatement",
                        "src": "11136:41:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "components": [
                            {
                              "argumentTypes": null,
                              "id": 715,
                              "name": "total",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 672,
                              "src": "11195:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Rebase_$550_memory_ptr",
                                "typeString": "struct Rebase memory"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 716,
                              "name": "base",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 681,
                              "src": "11202:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "id": 717,
                          "isConstant": false,
                          "isInlineArray": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "TupleExpression",
                          "src": "11194:13:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_struct$_Rebase_$550_memory_ptr_$_t_uint256_$",
                            "typeString": "tuple(struct Rebase memory,uint256)"
                          }
                        },
                        "functionReturnParameters": 682,
                        "id": 718,
                        "nodeType": "Return",
                        "src": "11187:20:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 670,
                    "nodeType": "StructuredDocumentation",
                    "src": "10713:153:0",
                    "text": "@notice Add `elastic` to `total` and doubles `total.base`.\n @return (Rebase) The new total.\n @return base in relationship to `elastic`."
                  },
                  "id": 720,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "add",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 677,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 672,
                        "mutability": "mutable",
                        "name": "total",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 720,
                        "src": "10893:19:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Rebase_$550_memory_ptr",
                          "typeString": "struct Rebase"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 671,
                          "name": "Rebase",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 550,
                          "src": "10893:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Rebase_$550_storage_ptr",
                            "typeString": "struct Rebase"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 674,
                        "mutability": "mutable",
                        "name": "elastic",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 720,
                        "src": "10922:15:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 673,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "10922:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 676,
                        "mutability": "mutable",
                        "name": "roundUp",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 720,
                        "src": "10947:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 675,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "10947:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "10883:82:0"
                  },
                  "returnParameters": {
                    "id": 682,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 679,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 720,
                        "src": "10989:13:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Rebase_$550_memory_ptr",
                          "typeString": "struct Rebase"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 678,
                          "name": "Rebase",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 550,
                          "src": "10989:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Rebase_$550_storage_ptr",
                            "typeString": "struct Rebase"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 681,
                        "mutability": "mutable",
                        "name": "base",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 720,
                        "src": "11004:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 680,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "11004:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "10988:29:0"
                  },
                  "scope": 898,
                  "src": "10871:343:0",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 770,
                    "nodeType": "Block",
                    "src": "11526:202:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 740,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 734,
                            "name": "elastic",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 732,
                            "src": "11536:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 736,
                                "name": "total",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 723,
                                "src": "11556:5:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_Rebase_$550_memory_ptr",
                                  "typeString": "struct Rebase memory"
                                }
                              },
                              {
                                "argumentTypes": null,
                                "id": 737,
                                "name": "base",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 725,
                                "src": "11563:4:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              {
                                "argumentTypes": null,
                                "id": 738,
                                "name": "roundUp",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 727,
                                "src": "11569:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_struct$_Rebase_$550_memory_ptr",
                                  "typeString": "struct Rebase memory"
                                },
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              ],
                              "id": 735,
                              "name": "toElastic",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 669,
                              "src": "11546:9:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_struct$_Rebase_$550_memory_ptr_$_t_uint256_$_t_bool_$returns$_t_uint256_$",
                                "typeString": "function (struct Rebase memory,uint256,bool) pure returns (uint256)"
                              }
                            },
                            "id": 739,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "11546:31:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "11536:41:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 741,
                        "nodeType": "ExpressionStatement",
                        "src": "11536:41:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 752,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 742,
                              "name": "total",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 723,
                              "src": "11587:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Rebase_$550_memory_ptr",
                                "typeString": "struct Rebase memory"
                              }
                            },
                            "id": 744,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberName": "elastic",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 547,
                            "src": "11587:13:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "arguments": [],
                                "expression": {
                                  "argumentTypes": [],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 748,
                                    "name": "elastic",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 732,
                                    "src": "11621:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "id": 749,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "to128",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 354,
                                  "src": "11621:13:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint128_$bound_to$_t_uint256_$",
                                    "typeString": "function (uint256) pure returns (uint128)"
                                  }
                                },
                                "id": 750,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "11621:15:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 745,
                                  "name": "total",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 723,
                                  "src": "11603:5:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_struct$_Rebase_$550_memory_ptr",
                                    "typeString": "struct Rebase memory"
                                  }
                                },
                                "id": 746,
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "elastic",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 547,
                                "src": "11603:13:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              },
                              "id": 747,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sub",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 452,
                              "src": "11603:17:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint128_$_t_uint128_$returns$_t_uint128_$bound_to$_t_uint128_$",
                                "typeString": "function (uint128,uint128) pure returns (uint128)"
                              }
                            },
                            "id": 751,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "11603:34:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "src": "11587:50:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "id": 753,
                        "nodeType": "ExpressionStatement",
                        "src": "11587:50:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 764,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 754,
                              "name": "total",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 723,
                              "src": "11647:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Rebase_$550_memory_ptr",
                                "typeString": "struct Rebase memory"
                              }
                            },
                            "id": 756,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberName": "base",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 549,
                            "src": "11647:10:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "arguments": [],
                                "expression": {
                                  "argumentTypes": [],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 760,
                                    "name": "base",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 725,
                                    "src": "11675:4:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "id": 761,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "to128",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 354,
                                  "src": "11675:10:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint128_$bound_to$_t_uint256_$",
                                    "typeString": "function (uint256) pure returns (uint128)"
                                  }
                                },
                                "id": 762,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "11675:12:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 757,
                                  "name": "total",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 723,
                                  "src": "11660:5:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_struct$_Rebase_$550_memory_ptr",
                                    "typeString": "struct Rebase memory"
                                  }
                                },
                                "id": 758,
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "base",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 549,
                                "src": "11660:10:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              },
                              "id": 759,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sub",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 452,
                              "src": "11660:14:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint128_$_t_uint128_$returns$_t_uint128_$bound_to$_t_uint128_$",
                                "typeString": "function (uint128,uint128) pure returns (uint128)"
                              }
                            },
                            "id": 763,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "11660:28:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "src": "11647:41:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "id": 765,
                        "nodeType": "ExpressionStatement",
                        "src": "11647:41:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "components": [
                            {
                              "argumentTypes": null,
                              "id": 766,
                              "name": "total",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 723,
                              "src": "11706:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Rebase_$550_memory_ptr",
                                "typeString": "struct Rebase memory"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 767,
                              "name": "elastic",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 732,
                              "src": "11713:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "id": 768,
                          "isConstant": false,
                          "isInlineArray": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "TupleExpression",
                          "src": "11705:16:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_struct$_Rebase_$550_memory_ptr_$_t_uint256_$",
                            "typeString": "tuple(struct Rebase memory,uint256)"
                          }
                        },
                        "functionReturnParameters": 733,
                        "id": 769,
                        "nodeType": "Return",
                        "src": "11698:23:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 721,
                    "nodeType": "StructuredDocumentation",
                    "src": "11220:154:0",
                    "text": "@notice Sub `base` from `total` and update `total.elastic`.\n @return (Rebase) The new total.\n @return elastic in relationship to `base`."
                  },
                  "id": 771,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "sub",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 728,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 723,
                        "mutability": "mutable",
                        "name": "total",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 771,
                        "src": "11401:19:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Rebase_$550_memory_ptr",
                          "typeString": "struct Rebase"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 722,
                          "name": "Rebase",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 550,
                          "src": "11401:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Rebase_$550_storage_ptr",
                            "typeString": "struct Rebase"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 725,
                        "mutability": "mutable",
                        "name": "base",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 771,
                        "src": "11430:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 724,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "11430:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 727,
                        "mutability": "mutable",
                        "name": "roundUp",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 771,
                        "src": "11452:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 726,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "11452:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "11391:79:0"
                  },
                  "returnParameters": {
                    "id": 733,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 730,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 771,
                        "src": "11494:13:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Rebase_$550_memory_ptr",
                          "typeString": "struct Rebase"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 729,
                          "name": "Rebase",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 550,
                          "src": "11494:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Rebase_$550_storage_ptr",
                            "typeString": "struct Rebase"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 732,
                        "mutability": "mutable",
                        "name": "elastic",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 771,
                        "src": "11509:15:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 731,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "11509:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "11493:32:0"
                  },
                  "scope": 898,
                  "src": "11379:349:0",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 809,
                    "nodeType": "Block",
                    "src": "11920:140:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 793,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 783,
                              "name": "total",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 774,
                              "src": "11930:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Rebase_$550_memory_ptr",
                                "typeString": "struct Rebase memory"
                              }
                            },
                            "id": 785,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberName": "elastic",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 547,
                            "src": "11930:13:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "arguments": [],
                                "expression": {
                                  "argumentTypes": [],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 789,
                                    "name": "elastic",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 776,
                                    "src": "11964:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "id": 790,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "to128",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 354,
                                  "src": "11964:13:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint128_$bound_to$_t_uint256_$",
                                    "typeString": "function (uint256) pure returns (uint128)"
                                  }
                                },
                                "id": 791,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "11964:15:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 786,
                                  "name": "total",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 774,
                                  "src": "11946:5:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_struct$_Rebase_$550_memory_ptr",
                                    "typeString": "struct Rebase memory"
                                  }
                                },
                                "id": 787,
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "elastic",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 547,
                                "src": "11946:13:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              },
                              "id": 788,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "add",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 430,
                              "src": "11946:17:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint128_$_t_uint128_$returns$_t_uint128_$bound_to$_t_uint128_$",
                                "typeString": "function (uint128,uint128) pure returns (uint128)"
                              }
                            },
                            "id": 792,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "11946:34:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "src": "11930:50:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "id": 794,
                        "nodeType": "ExpressionStatement",
                        "src": "11930:50:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 805,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 795,
                              "name": "total",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 774,
                              "src": "11990:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Rebase_$550_memory_ptr",
                                "typeString": "struct Rebase memory"
                              }
                            },
                            "id": 797,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberName": "base",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 549,
                            "src": "11990:10:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "arguments": [],
                                "expression": {
                                  "argumentTypes": [],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 801,
                                    "name": "base",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 778,
                                    "src": "12018:4:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "id": 802,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "to128",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 354,
                                  "src": "12018:10:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint128_$bound_to$_t_uint256_$",
                                    "typeString": "function (uint256) pure returns (uint128)"
                                  }
                                },
                                "id": 803,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "12018:12:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 798,
                                  "name": "total",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 774,
                                  "src": "12003:5:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_struct$_Rebase_$550_memory_ptr",
                                    "typeString": "struct Rebase memory"
                                  }
                                },
                                "id": 799,
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "base",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 549,
                                "src": "12003:10:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              },
                              "id": 800,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "add",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 430,
                              "src": "12003:14:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint128_$_t_uint128_$returns$_t_uint128_$bound_to$_t_uint128_$",
                                "typeString": "function (uint128,uint128) pure returns (uint128)"
                              }
                            },
                            "id": 804,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "12003:28:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "src": "11990:41:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "id": 806,
                        "nodeType": "ExpressionStatement",
                        "src": "11990:41:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 807,
                          "name": "total",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 774,
                          "src": "12048:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Rebase_$550_memory_ptr",
                            "typeString": "struct Rebase memory"
                          }
                        },
                        "functionReturnParameters": 782,
                        "id": 808,
                        "nodeType": "Return",
                        "src": "12041:12:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 772,
                    "nodeType": "StructuredDocumentation",
                    "src": "11734:48:0",
                    "text": "@notice Add `elastic` and `base` to `total`."
                  },
                  "id": 810,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "add",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 779,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 774,
                        "mutability": "mutable",
                        "name": "total",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 810,
                        "src": "11809:19:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Rebase_$550_memory_ptr",
                          "typeString": "struct Rebase"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 773,
                          "name": "Rebase",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 550,
                          "src": "11809:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Rebase_$550_storage_ptr",
                            "typeString": "struct Rebase"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 776,
                        "mutability": "mutable",
                        "name": "elastic",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 810,
                        "src": "11838:15:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 775,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "11838:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 778,
                        "mutability": "mutable",
                        "name": "base",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 810,
                        "src": "11863:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 777,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "11863:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "11799:82:0"
                  },
                  "returnParameters": {
                    "id": 782,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 781,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 810,
                        "src": "11905:13:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Rebase_$550_memory_ptr",
                          "typeString": "struct Rebase"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 780,
                          "name": "Rebase",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 550,
                          "src": "11905:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Rebase_$550_storage_ptr",
                            "typeString": "struct Rebase"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "11904:15:0"
                  },
                  "scope": 898,
                  "src": "11787:273:0",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 848,
                    "nodeType": "Block",
                    "src": "12257:140:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 832,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 822,
                              "name": "total",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 813,
                              "src": "12267:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Rebase_$550_memory_ptr",
                                "typeString": "struct Rebase memory"
                              }
                            },
                            "id": 824,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberName": "elastic",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 547,
                            "src": "12267:13:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "arguments": [],
                                "expression": {
                                  "argumentTypes": [],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 828,
                                    "name": "elastic",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 815,
                                    "src": "12301:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "id": 829,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "to128",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 354,
                                  "src": "12301:13:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint128_$bound_to$_t_uint256_$",
                                    "typeString": "function (uint256) pure returns (uint128)"
                                  }
                                },
                                "id": 830,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "12301:15:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 825,
                                  "name": "total",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 813,
                                  "src": "12283:5:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_struct$_Rebase_$550_memory_ptr",
                                    "typeString": "struct Rebase memory"
                                  }
                                },
                                "id": 826,
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "elastic",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 547,
                                "src": "12283:13:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              },
                              "id": 827,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sub",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 452,
                              "src": "12283:17:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint128_$_t_uint128_$returns$_t_uint128_$bound_to$_t_uint128_$",
                                "typeString": "function (uint128,uint128) pure returns (uint128)"
                              }
                            },
                            "id": 831,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "12283:34:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "src": "12267:50:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "id": 833,
                        "nodeType": "ExpressionStatement",
                        "src": "12267:50:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 844,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 834,
                              "name": "total",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 813,
                              "src": "12327:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Rebase_$550_memory_ptr",
                                "typeString": "struct Rebase memory"
                              }
                            },
                            "id": 836,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberName": "base",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 549,
                            "src": "12327:10:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "arguments": [],
                                "expression": {
                                  "argumentTypes": [],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 840,
                                    "name": "base",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 817,
                                    "src": "12355:4:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "id": 841,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "to128",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 354,
                                  "src": "12355:10:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint128_$bound_to$_t_uint256_$",
                                    "typeString": "function (uint256) pure returns (uint128)"
                                  }
                                },
                                "id": 842,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "12355:12:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 837,
                                  "name": "total",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 813,
                                  "src": "12340:5:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_struct$_Rebase_$550_memory_ptr",
                                    "typeString": "struct Rebase memory"
                                  }
                                },
                                "id": 838,
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "base",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 549,
                                "src": "12340:10:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              },
                              "id": 839,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sub",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 452,
                              "src": "12340:14:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint128_$_t_uint128_$returns$_t_uint128_$bound_to$_t_uint128_$",
                                "typeString": "function (uint128,uint128) pure returns (uint128)"
                              }
                            },
                            "id": 843,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "12340:28:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "src": "12327:41:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "id": 845,
                        "nodeType": "ExpressionStatement",
                        "src": "12327:41:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 846,
                          "name": "total",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 813,
                          "src": "12385:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Rebase_$550_memory_ptr",
                            "typeString": "struct Rebase memory"
                          }
                        },
                        "functionReturnParameters": 821,
                        "id": 847,
                        "nodeType": "Return",
                        "src": "12378:12:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 811,
                    "nodeType": "StructuredDocumentation",
                    "src": "12066:53:0",
                    "text": "@notice Subtract `elastic` and `base` to `total`."
                  },
                  "id": 849,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "sub",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 818,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 813,
                        "mutability": "mutable",
                        "name": "total",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 849,
                        "src": "12146:19:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Rebase_$550_memory_ptr",
                          "typeString": "struct Rebase"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 812,
                          "name": "Rebase",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 550,
                          "src": "12146:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Rebase_$550_storage_ptr",
                            "typeString": "struct Rebase"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 815,
                        "mutability": "mutable",
                        "name": "elastic",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 849,
                        "src": "12175:15:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 814,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "12175:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 817,
                        "mutability": "mutable",
                        "name": "base",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 849,
                        "src": "12200:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 816,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "12200:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "12136:82:0"
                  },
                  "returnParameters": {
                    "id": 821,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 820,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 849,
                        "src": "12242:13:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Rebase_$550_memory_ptr",
                          "typeString": "struct Rebase"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 819,
                          "name": "Rebase",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 550,
                          "src": "12242:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Rebase_$550_storage_ptr",
                            "typeString": "struct Rebase"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "12241:15:0"
                  },
                  "scope": 898,
                  "src": "12124:273:0",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 872,
                    "nodeType": "Block",
                    "src": "12615:80:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 870,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 859,
                            "name": "newElastic",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 857,
                            "src": "12625:10:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 869,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftHandSide": {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 860,
                                "name": "total",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 852,
                                "src": "12638:5:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_Rebase_$550_storage_ptr",
                                  "typeString": "struct Rebase storage pointer"
                                }
                              },
                              "id": 861,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": true,
                              "memberName": "elastic",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 547,
                              "src": "12638:13:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint128",
                                "typeString": "uint128"
                              }
                            },
                            "nodeType": "Assignment",
                            "operator": "=",
                            "rightHandSide": {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "arguments": [],
                                  "expression": {
                                    "argumentTypes": [],
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 865,
                                      "name": "elastic",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 854,
                                      "src": "12672:7:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "id": 866,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "to128",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 354,
                                    "src": "12672:13:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint128_$bound_to$_t_uint256_$",
                                      "typeString": "function (uint256) pure returns (uint128)"
                                    }
                                  },
                                  "id": 867,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "12672:15:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint128",
                                    "typeString": "uint128"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_uint128",
                                    "typeString": "uint128"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 862,
                                    "name": "total",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 852,
                                    "src": "12654:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_struct$_Rebase_$550_storage_ptr",
                                      "typeString": "struct Rebase storage pointer"
                                    }
                                  },
                                  "id": 863,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "elastic",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 547,
                                  "src": "12654:13:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint128",
                                    "typeString": "uint128"
                                  }
                                },
                                "id": 864,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "add",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 430,
                                "src": "12654:17:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_pure$_t_uint128_$_t_uint128_$returns$_t_uint128_$bound_to$_t_uint128_$",
                                  "typeString": "function (uint128,uint128) pure returns (uint128)"
                                }
                              },
                              "id": 868,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "12654:34:0",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint128",
                                "typeString": "uint128"
                              }
                            },
                            "src": "12638:50:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "src": "12625:63:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 871,
                        "nodeType": "ExpressionStatement",
                        "src": "12625:63:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 850,
                    "nodeType": "StructuredDocumentation",
                    "src": "12403:110:0",
                    "text": "@notice Add `elastic` to `total` and update storage.\n @return newElastic Returns updated `elastic`."
                  },
                  "id": 873,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "addElastic",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 855,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 852,
                        "mutability": "mutable",
                        "name": "total",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 873,
                        "src": "12538:20:0",
                        "stateVariable": false,
                        "storageLocation": "storage",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Rebase_$550_storage_ptr",
                          "typeString": "struct Rebase"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 851,
                          "name": "Rebase",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 550,
                          "src": "12538:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Rebase_$550_storage_ptr",
                            "typeString": "struct Rebase"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 854,
                        "mutability": "mutable",
                        "name": "elastic",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 873,
                        "src": "12560:15:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 853,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "12560:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "12537:39:0"
                  },
                  "returnParameters": {
                    "id": 858,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 857,
                        "mutability": "mutable",
                        "name": "newElastic",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 873,
                        "src": "12595:18:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 856,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "12595:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "12594:20:0"
                  },
                  "scope": 898,
                  "src": "12518:177:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 896,
                    "nodeType": "Block",
                    "src": "12920:80:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 894,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 883,
                            "name": "newElastic",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 881,
                            "src": "12930:10:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 893,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftHandSide": {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 884,
                                "name": "total",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 876,
                                "src": "12943:5:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_Rebase_$550_storage_ptr",
                                  "typeString": "struct Rebase storage pointer"
                                }
                              },
                              "id": 885,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": true,
                              "memberName": "elastic",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 547,
                              "src": "12943:13:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint128",
                                "typeString": "uint128"
                              }
                            },
                            "nodeType": "Assignment",
                            "operator": "=",
                            "rightHandSide": {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "arguments": [],
                                  "expression": {
                                    "argumentTypes": [],
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 889,
                                      "name": "elastic",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 878,
                                      "src": "12977:7:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "id": 890,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "to128",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 354,
                                    "src": "12977:13:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint128_$bound_to$_t_uint256_$",
                                      "typeString": "function (uint256) pure returns (uint128)"
                                    }
                                  },
                                  "id": 891,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "12977:15:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint128",
                                    "typeString": "uint128"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_uint128",
                                    "typeString": "uint128"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 886,
                                    "name": "total",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 876,
                                    "src": "12959:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_struct$_Rebase_$550_storage_ptr",
                                      "typeString": "struct Rebase storage pointer"
                                    }
                                  },
                                  "id": 887,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "elastic",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 547,
                                  "src": "12959:13:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint128",
                                    "typeString": "uint128"
                                  }
                                },
                                "id": 888,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "sub",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 452,
                                "src": "12959:17:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_pure$_t_uint128_$_t_uint128_$returns$_t_uint128_$bound_to$_t_uint128_$",
                                  "typeString": "function (uint128,uint128) pure returns (uint128)"
                                }
                              },
                              "id": 892,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "12959:34:0",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint128",
                                "typeString": "uint128"
                              }
                            },
                            "src": "12943:50:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "src": "12930:63:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 895,
                        "nodeType": "ExpressionStatement",
                        "src": "12930:63:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 874,
                    "nodeType": "StructuredDocumentation",
                    "src": "12701:117:0",
                    "text": "@notice Subtract `elastic` from `total` and update storage.\n @return newElastic Returns updated `elastic`."
                  },
                  "id": 897,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "subElastic",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 879,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 876,
                        "mutability": "mutable",
                        "name": "total",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 897,
                        "src": "12843:20:0",
                        "stateVariable": false,
                        "storageLocation": "storage",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Rebase_$550_storage_ptr",
                          "typeString": "struct Rebase"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 875,
                          "name": "Rebase",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 550,
                          "src": "12843:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Rebase_$550_storage_ptr",
                            "typeString": "struct Rebase"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 878,
                        "mutability": "mutable",
                        "name": "elastic",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 897,
                        "src": "12865:15:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 877,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "12865:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "12842:39:0"
                  },
                  "returnParameters": {
                    "id": 882,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 881,
                        "mutability": "mutable",
                        "name": "newElastic",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 897,
                        "src": "12900:18:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 880,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "12900:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "12899:20:0"
                  },
                  "scope": 898,
                  "src": "12823:177:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                }
              ],
              "scope": 3102,
              "src": "9591:3411:0"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "contract",
              "documentation": null,
              "fullyImplemented": true,
              "id": 903,
              "linearizedBaseContracts": [
                903
              ],
              "name": "BoringOwnableData",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "constant": false,
                  "functionSelector": "8da5cb5b",
                  "id": 900,
                  "mutability": "mutable",
                  "name": "owner",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 903,
                  "src": "13288:20:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 899,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "13288:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "functionSelector": "e30c3978",
                  "id": 902,
                  "mutability": "mutable",
                  "name": "pendingOwner",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 903,
                  "src": "13314:27:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 901,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "13314:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                }
              ],
              "scope": 3102,
              "src": "13255:89:0"
            },
            {
              "abstract": false,
              "baseContracts": [
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 904,
                    "name": "BoringOwnableData",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 903,
                    "src": "13372:17:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_BoringOwnableData_$903",
                      "typeString": "contract BoringOwnableData"
                    }
                  },
                  "id": 905,
                  "nodeType": "InheritanceSpecifier",
                  "src": "13372:17:0"
                }
              ],
              "contractDependencies": [
                903
              ],
              "contractKind": "contract",
              "documentation": null,
              "fullyImplemented": true,
              "id": 1026,
              "linearizedBaseContracts": [
                1026,
                903
              ],
              "name": "BoringOwnable",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 911,
                  "name": "OwnershipTransferred",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 910,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 907,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "previousOwner",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 911,
                        "src": "13423:29:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 906,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "13423:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 909,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "newOwner",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 911,
                        "src": "13454:24:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 908,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "13454:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "13422:57:0"
                  },
                  "src": "13396:84:0"
                },
                {
                  "body": {
                    "id": 929,
                    "nodeType": "Block",
                    "src": "13571:94:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 918,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 915,
                            "name": "owner",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 900,
                            "src": "13581:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 916,
                              "name": "msg",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": -15,
                              "src": "13589:3:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_magic_message",
                                "typeString": "msg"
                              }
                            },
                            "id": 917,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "sender",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "13589:10:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address_payable",
                              "typeString": "address payable"
                            }
                          },
                          "src": "13581:18:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "id": 919,
                        "nodeType": "ExpressionStatement",
                        "src": "13581:18:0"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "30",
                                  "id": 923,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "13643:1:0",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  },
                                  "value": "0"
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  }
                                ],
                                "id": 922,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "13635:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 921,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "13635:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 924,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "13635:10:0",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 925,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "13647:3:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 926,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "13647:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              },
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            ],
                            "id": 920,
                            "name": "OwnershipTransferred",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 911,
                            "src": "13614:20:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$returns$__$",
                              "typeString": "function (address,address)"
                            }
                          },
                          "id": 927,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "13614:44:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 928,
                        "nodeType": "EmitStatement",
                        "src": "13609:49:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 912,
                    "nodeType": "StructuredDocumentation",
                    "src": "13486:59:0",
                    "text": "@notice `owner` defaults to msg.sender on construction."
                  },
                  "id": 930,
                  "implemented": true,
                  "kind": "constructor",
                  "modifiers": [],
                  "name": "",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 913,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "13561:2:0"
                  },
                  "returnParameters": {
                    "id": 914,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "13571:0:0"
                  },
                  "scope": 1026,
                  "src": "13550:115:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 978,
                    "nodeType": "Block",
                    "src": "14244:369:0",
                    "statements": [
                      {
                        "condition": {
                          "argumentTypes": null,
                          "id": 942,
                          "name": "direct",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 935,
                          "src": "14258:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": {
                          "id": 976,
                          "nodeType": "Block",
                          "src": "14536:71:0",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 974,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "id": 972,
                                  "name": "pendingOwner",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 902,
                                  "src": "14573:12:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "id": 973,
                                  "name": "newOwner",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 933,
                                  "src": "14588:8:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "src": "14573:23:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "id": 975,
                              "nodeType": "ExpressionStatement",
                              "src": "14573:23:0"
                            }
                          ]
                        },
                        "id": 977,
                        "nodeType": "IfStatement",
                        "src": "14254:353:0",
                        "trueBody": {
                          "id": 971,
                          "nodeType": "Block",
                          "src": "14266:264:0",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "commonType": {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    },
                                    "id": 951,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "leftExpression": {
                                      "argumentTypes": null,
                                      "commonType": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      },
                                      "id": 949,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftExpression": {
                                        "argumentTypes": null,
                                        "id": 944,
                                        "name": "newOwner",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 933,
                                        "src": "14310:8:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_address",
                                          "typeString": "address"
                                        }
                                      },
                                      "nodeType": "BinaryOperation",
                                      "operator": "!=",
                                      "rightExpression": {
                                        "argumentTypes": null,
                                        "arguments": [
                                          {
                                            "argumentTypes": null,
                                            "hexValue": "30",
                                            "id": 947,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": true,
                                            "kind": "number",
                                            "lValueRequested": false,
                                            "nodeType": "Literal",
                                            "src": "14330:1:0",
                                            "subdenomination": null,
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_rational_0_by_1",
                                              "typeString": "int_const 0"
                                            },
                                            "value": "0"
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": [
                                            {
                                              "typeIdentifier": "t_rational_0_by_1",
                                              "typeString": "int_const 0"
                                            }
                                          ],
                                          "id": 946,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": true,
                                          "lValueRequested": false,
                                          "nodeType": "ElementaryTypeNameExpression",
                                          "src": "14322:7:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_type$_t_address_$",
                                            "typeString": "type(address)"
                                          },
                                          "typeName": {
                                            "id": 945,
                                            "name": "address",
                                            "nodeType": "ElementaryTypeName",
                                            "src": "14322:7:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": null,
                                              "typeString": null
                                            }
                                          }
                                        },
                                        "id": 948,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": true,
                                        "kind": "typeConversion",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "14322:10:0",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_address_payable",
                                          "typeString": "address payable"
                                        }
                                      },
                                      "src": "14310:22:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                      }
                                    },
                                    "nodeType": "BinaryOperation",
                                    "operator": "||",
                                    "rightExpression": {
                                      "argumentTypes": null,
                                      "id": 950,
                                      "name": "renounce",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 937,
                                      "src": "14336:8:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                      }
                                    },
                                    "src": "14310:34:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "4f776e61626c653a207a65726f2061646472657373",
                                    "id": 952,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "string",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "14346:23:0",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_stringliteral_4bea69941b0d0257b3e89326ac37d51764d80d2e6e1a44e2d90b6a6f85f1b830",
                                      "typeString": "literal_string \"Ownable: zero address\""
                                    },
                                    "value": "Ownable: zero address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    },
                                    {
                                      "typeIdentifier": "t_stringliteral_4bea69941b0d0257b3e89326ac37d51764d80d2e6e1a44e2d90b6a6f85f1b830",
                                      "typeString": "literal_string \"Ownable: zero address\""
                                    }
                                  ],
                                  "id": 943,
                                  "name": "require",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [
                                    -18,
                                    -18
                                  ],
                                  "referencedDeclaration": -18,
                                  "src": "14302:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                                    "typeString": "function (bool,string memory) pure"
                                  }
                                },
                                "id": 953,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "14302:68:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 954,
                              "nodeType": "ExpressionStatement",
                              "src": "14302:68:0"
                            },
                            {
                              "eventCall": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 956,
                                    "name": "owner",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 900,
                                    "src": "14434:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 957,
                                    "name": "newOwner",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 933,
                                    "src": "14441:8:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  ],
                                  "id": 955,
                                  "name": "OwnershipTransferred",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 911,
                                  "src": "14413:20:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$returns$__$",
                                    "typeString": "function (address,address)"
                                  }
                                },
                                "id": 958,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "14413:37:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 959,
                              "nodeType": "EmitStatement",
                              "src": "14408:42:0"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 962,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "id": 960,
                                  "name": "owner",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 900,
                                  "src": "14464:5:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "id": 961,
                                  "name": "newOwner",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 933,
                                  "src": "14472:8:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "src": "14464:16:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "id": 963,
                              "nodeType": "ExpressionStatement",
                              "src": "14464:16:0"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 969,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "id": 964,
                                  "name": "pendingOwner",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 902,
                                  "src": "14494:12:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "hexValue": "30",
                                      "id": 967,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "kind": "number",
                                      "lValueRequested": false,
                                      "nodeType": "Literal",
                                      "src": "14517:1:0",
                                      "subdenomination": null,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_rational_0_by_1",
                                        "typeString": "int_const 0"
                                      },
                                      "value": "0"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_rational_0_by_1",
                                        "typeString": "int_const 0"
                                      }
                                    ],
                                    "id": 966,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "ElementaryTypeNameExpression",
                                    "src": "14509:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_address_$",
                                      "typeString": "type(address)"
                                    },
                                    "typeName": {
                                      "id": 965,
                                      "name": "address",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "14509:7:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": null,
                                        "typeString": null
                                      }
                                    }
                                  },
                                  "id": 968,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "14509:10:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address_payable",
                                    "typeString": "address payable"
                                  }
                                },
                                "src": "14494:25:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "id": 970,
                              "nodeType": "ExpressionStatement",
                              "src": "14494:25:0"
                            }
                          ]
                        }
                      }
                    ]
                  },
                  "documentation": {
                    "id": 931,
                    "nodeType": "StructuredDocumentation",
                    "src": "13671:448:0",
                    "text": "@notice Transfers ownership to `newOwner`. Either directly or claimable by the new pending owner.\n Can only be invoked by the current `owner`.\n @param newOwner Address of the new owner.\n @param direct True if `newOwner` should be set immediately. False if `newOwner` needs to use `claimOwnership`.\n @param renounce Allows the `newOwner` to be `address(0)` if `direct` and `renounce` is True. Has no effect otherwise."
                  },
                  "functionSelector": "078dfbe7",
                  "id": 979,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 940,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 939,
                        "name": "onlyOwner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1025,
                        "src": "14234:9:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "14234:9:0"
                    }
                  ],
                  "name": "transferOwnership",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 938,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 933,
                        "mutability": "mutable",
                        "name": "newOwner",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 979,
                        "src": "14160:16:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 932,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "14160:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 935,
                        "mutability": "mutable",
                        "name": "direct",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 979,
                        "src": "14186:11:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 934,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "14186:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 937,
                        "mutability": "mutable",
                        "name": "renounce",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 979,
                        "src": "14207:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 936,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "14207:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "14150:76:0"
                  },
                  "returnParameters": {
                    "id": 941,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "14244:0:0"
                  },
                  "scope": 1026,
                  "src": "14124:489:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 1011,
                    "nodeType": "Block",
                    "src": "14725:297:0",
                    "statements": [
                      {
                        "assignments": [
                          984
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 984,
                            "mutability": "mutable",
                            "name": "_pendingOwner",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 1011,
                            "src": "14735:21:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            },
                            "typeName": {
                              "id": 983,
                              "name": "address",
                              "nodeType": "ElementaryTypeName",
                              "src": "14735:7:0",
                              "stateMutability": "nonpayable",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 986,
                        "initialValue": {
                          "argumentTypes": null,
                          "id": 985,
                          "name": "pendingOwner",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 902,
                          "src": "14759:12:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "14735:36:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 991,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 988,
                                  "name": "msg",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -15,
                                  "src": "14808:3:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_message",
                                    "typeString": "msg"
                                  }
                                },
                                "id": 989,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "sender",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "14808:10:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "==",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 990,
                                "name": "_pendingOwner",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 984,
                                "src": "14822:13:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "src": "14808:27:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "4f776e61626c653a2063616c6c657220213d2070656e64696e67206f776e6572",
                              "id": 992,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "14837:34:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_a7ec3208bb4c778bbdbdd3fdfe92b1d315d85dd01a9131ea9f648f906ac7a6b8",
                                "typeString": "literal_string \"Ownable: caller != pending owner\""
                              },
                              "value": "Ownable: caller != pending owner"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_a7ec3208bb4c778bbdbdd3fdfe92b1d315d85dd01a9131ea9f648f906ac7a6b8",
                                "typeString": "literal_string \"Ownable: caller != pending owner\""
                              }
                            ],
                            "id": 987,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "14800:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 993,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "14800:72:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 994,
                        "nodeType": "ExpressionStatement",
                        "src": "14800:72:0"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 996,
                              "name": "owner",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 900,
                              "src": "14928:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 997,
                              "name": "_pendingOwner",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 984,
                              "src": "14935:13:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "id": 995,
                            "name": "OwnershipTransferred",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 911,
                            "src": "14907:20:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$returns$__$",
                              "typeString": "function (address,address)"
                            }
                          },
                          "id": 998,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "14907:42:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 999,
                        "nodeType": "EmitStatement",
                        "src": "14902:47:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 1002,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 1000,
                            "name": "owner",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 900,
                            "src": "14959:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 1001,
                            "name": "_pendingOwner",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 984,
                            "src": "14967:13:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "src": "14959:21:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "id": 1003,
                        "nodeType": "ExpressionStatement",
                        "src": "14959:21:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 1009,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 1004,
                            "name": "pendingOwner",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 902,
                            "src": "14990:12:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 1007,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "15013:1:0",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                }
                              ],
                              "id": 1006,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "ElementaryTypeNameExpression",
                              "src": "15005:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_address_$",
                                "typeString": "type(address)"
                              },
                              "typeName": {
                                "id": 1005,
                                "name": "address",
                                "nodeType": "ElementaryTypeName",
                                "src": "15005:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": null,
                                  "typeString": null
                                }
                              }
                            },
                            "id": 1008,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "15005:10:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_address_payable",
                              "typeString": "address payable"
                            }
                          },
                          "src": "14990:25:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "id": 1010,
                        "nodeType": "ExpressionStatement",
                        "src": "14990:25:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 980,
                    "nodeType": "StructuredDocumentation",
                    "src": "14619:68:0",
                    "text": "@notice Needs to be called by `pendingOwner` to claim ownership."
                  },
                  "functionSelector": "4e71e0c8",
                  "id": 1012,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "claimOwnership",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 981,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "14715:2:0"
                  },
                  "returnParameters": {
                    "id": 982,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "14725:0:0"
                  },
                  "scope": 1026,
                  "src": "14692:330:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 1024,
                    "nodeType": "Block",
                    "src": "15114:92:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 1019,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 1016,
                                  "name": "msg",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -15,
                                  "src": "15132:3:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_message",
                                    "typeString": "msg"
                                  }
                                },
                                "id": 1017,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "sender",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "15132:10:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "==",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 1018,
                                "name": "owner",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 900,
                                "src": "15146:5:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "src": "15132:19:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572",
                              "id": 1020,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "15153:34:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_9924ebdf1add33d25d4ef888e16131f0a5687b0580a36c21b5c301a6c462effe",
                                "typeString": "literal_string \"Ownable: caller is not the owner\""
                              },
                              "value": "Ownable: caller is not the owner"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_9924ebdf1add33d25d4ef888e16131f0a5687b0580a36c21b5c301a6c462effe",
                                "typeString": "literal_string \"Ownable: caller is not the owner\""
                              }
                            ],
                            "id": 1015,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "15124:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 1021,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "15124:64:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1022,
                        "nodeType": "ExpressionStatement",
                        "src": "15124:64:0"
                      },
                      {
                        "id": 1023,
                        "nodeType": "PlaceholderStatement",
                        "src": "15198:1:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 1013,
                    "nodeType": "StructuredDocumentation",
                    "src": "15028:60:0",
                    "text": "@notice Only allows the `owner` to execute the function."
                  },
                  "id": 1025,
                  "name": "onlyOwner",
                  "nodeType": "ModifierDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1014,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "15111:2:0"
                  },
                  "src": "15093:113:0",
                  "virtual": false,
                  "visibility": "internal"
                }
              ],
              "scope": 3102,
              "src": "13346:1862:0"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "interface",
              "documentation": null,
              "fullyImplemented": false,
              "id": 1033,
              "linearizedBaseContracts": [
                1033
              ],
              "name": "IMasterContract",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": null,
                  "documentation": {
                    "id": 1027,
                    "nodeType": "StructuredDocumentation",
                    "src": "15356:258:0",
                    "text": "@notice Init function that gets called from `BoringFactory.deploy`.\n Also kown as the constructor for cloned contracts.\n Any ETH send to `BoringFactory.deploy` ends up here.\n @param data Can be abi encoded arguments or anything else."
                  },
                  "functionSelector": "4ddf47d4",
                  "id": 1032,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "init",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1030,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1029,
                        "mutability": "mutable",
                        "name": "data",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1032,
                        "src": "15633:19:0",
                        "stateVariable": false,
                        "storageLocation": "calldata",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_calldata_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 1028,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "15633:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "15632:21:0"
                  },
                  "returnParameters": {
                    "id": 1031,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "15670:0:0"
                  },
                  "scope": 1033,
                  "src": "15619:52:0",
                  "stateMutability": "payable",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 3102,
              "src": "15324:349:0"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "contract",
              "documentation": null,
              "fullyImplemented": true,
              "id": 1111,
              "linearizedBaseContracts": [
                1111
              ],
              "name": "BoringFactory",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 1041,
                  "name": "LogDeploy",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 1040,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1035,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "masterContract",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1041,
                        "src": "15821:30:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1034,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "15821:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1037,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "data",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1041,
                        "src": "15853:10:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 1036,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "15853:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1039,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "cloneAddress",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1041,
                        "src": "15865:28:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1038,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "15865:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "15820:74:0"
                  },
                  "src": "15805:90:0"
                },
                {
                  "constant": false,
                  "documentation": {
                    "id": 1042,
                    "nodeType": "StructuredDocumentation",
                    "src": "15901:65:0",
                    "text": "@notice Mapping from clone contracts to their masterContract."
                  },
                  "functionSelector": "bafe4f14",
                  "id": 1046,
                  "mutability": "mutable",
                  "name": "masterContractOf",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 1111,
                  "src": "15971:51:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_mapping$_t_address_$_t_address_$",
                    "typeString": "mapping(address => address)"
                  },
                  "typeName": {
                    "id": 1045,
                    "keyType": {
                      "id": 1043,
                      "name": "address",
                      "nodeType": "ElementaryTypeName",
                      "src": "15979:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Mapping",
                    "src": "15971:27:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_mapping$_t_address_$_t_address_$",
                      "typeString": "mapping(address => address)"
                    },
                    "valueType": {
                      "id": 1044,
                      "name": "address",
                      "nodeType": "ElementaryTypeName",
                      "src": "15990:7:0",
                      "stateMutability": "nonpayable",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 1109,
                    "nodeType": "Block",
                    "src": "16707:1516:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 1064,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 1059,
                                "name": "masterContract",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1049,
                                "src": "16725:14:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "!=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "30",
                                    "id": 1062,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "16751:1:0",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    },
                                    "value": "0"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    }
                                  ],
                                  "id": 1061,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "16743:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 1060,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "16743:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 1063,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "16743:10:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "src": "16725:28:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "426f72696e67466163746f72793a204e6f206d6173746572436f6e7472616374",
                              "id": 1065,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "16755:34:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_ca263bb3a1d34921c755bbb7d563d78653106aed124fb087e2484c54b7a9af02",
                                "typeString": "literal_string \"BoringFactory: No masterContract\""
                              },
                              "value": "BoringFactory: No masterContract"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_ca263bb3a1d34921c755bbb7d563d78653106aed124fb087e2484c54b7a9af02",
                                "typeString": "literal_string \"BoringFactory: No masterContract\""
                              }
                            ],
                            "id": 1058,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "16717:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 1066,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "16717:73:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1067,
                        "nodeType": "ExpressionStatement",
                        "src": "16717:73:0"
                      },
                      {
                        "assignments": [
                          1069
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 1069,
                            "mutability": "mutable",
                            "name": "targetBytes",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 1109,
                            "src": "16800:19:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes20",
                              "typeString": "bytes20"
                            },
                            "typeName": {
                              "id": 1068,
                              "name": "bytes20",
                              "nodeType": "ElementaryTypeName",
                              "src": "16800:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes20",
                                "typeString": "bytes20"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 1074,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 1072,
                              "name": "masterContract",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1049,
                              "src": "16830:14:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "id": 1071,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "16822:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_bytes20_$",
                              "typeString": "type(bytes20)"
                            },
                            "typeName": {
                              "id": 1070,
                              "name": "bytes20",
                              "nodeType": "ElementaryTypeName",
                              "src": "16822:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": null,
                                "typeString": null
                              }
                            }
                          },
                          "id": 1073,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "16822:23:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes20",
                            "typeString": "bytes20"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "16800:45:0"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "id": 1075,
                          "name": "useCreate2",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 1053,
                          "src": "16920:10:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": {
                          "id": 1085,
                          "nodeType": "Block",
                          "src": "17625:405:0",
                          "statements": [
                            {
                              "AST": {
                                "nodeType": "YulBlock",
                                "src": "17648:372:0",
                                "statements": [
                                  {
                                    "nodeType": "YulVariableDeclaration",
                                    "src": "17666:24:0",
                                    "value": {
                                      "arguments": [
                                        {
                                          "kind": "number",
                                          "nodeType": "YulLiteral",
                                          "src": "17685:4:0",
                                          "type": "",
                                          "value": "0x40"
                                        }
                                      ],
                                      "functionName": {
                                        "name": "mload",
                                        "nodeType": "YulIdentifier",
                                        "src": "17679:5:0"
                                      },
                                      "nodeType": "YulFunctionCall",
                                      "src": "17679:11:0"
                                    },
                                    "variables": [
                                      {
                                        "name": "clone",
                                        "nodeType": "YulTypedName",
                                        "src": "17670:5:0",
                                        "type": ""
                                      }
                                    ]
                                  },
                                  {
                                    "expression": {
                                      "arguments": [
                                        {
                                          "name": "clone",
                                          "nodeType": "YulIdentifier",
                                          "src": "17714:5:0"
                                        },
                                        {
                                          "kind": "number",
                                          "nodeType": "YulLiteral",
                                          "src": "17721:66:0",
                                          "type": "",
                                          "value": "0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000"
                                        }
                                      ],
                                      "functionName": {
                                        "name": "mstore",
                                        "nodeType": "YulIdentifier",
                                        "src": "17707:6:0"
                                      },
                                      "nodeType": "YulFunctionCall",
                                      "src": "17707:81:0"
                                    },
                                    "nodeType": "YulExpressionStatement",
                                    "src": "17707:81:0"
                                  },
                                  {
                                    "expression": {
                                      "arguments": [
                                        {
                                          "arguments": [
                                            {
                                              "name": "clone",
                                              "nodeType": "YulIdentifier",
                                              "src": "17816:5:0"
                                            },
                                            {
                                              "kind": "number",
                                              "nodeType": "YulLiteral",
                                              "src": "17823:4:0",
                                              "type": "",
                                              "value": "0x14"
                                            }
                                          ],
                                          "functionName": {
                                            "name": "add",
                                            "nodeType": "YulIdentifier",
                                            "src": "17812:3:0"
                                          },
                                          "nodeType": "YulFunctionCall",
                                          "src": "17812:16:0"
                                        },
                                        {
                                          "name": "targetBytes",
                                          "nodeType": "YulIdentifier",
                                          "src": "17830:11:0"
                                        }
                                      ],
                                      "functionName": {
                                        "name": "mstore",
                                        "nodeType": "YulIdentifier",
                                        "src": "17805:6:0"
                                      },
                                      "nodeType": "YulFunctionCall",
                                      "src": "17805:37:0"
                                    },
                                    "nodeType": "YulExpressionStatement",
                                    "src": "17805:37:0"
                                  },
                                  {
                                    "expression": {
                                      "arguments": [
                                        {
                                          "arguments": [
                                            {
                                              "name": "clone",
                                              "nodeType": "YulIdentifier",
                                              "src": "17870:5:0"
                                            },
                                            {
                                              "kind": "number",
                                              "nodeType": "YulLiteral",
                                              "src": "17877:4:0",
                                              "type": "",
                                              "value": "0x28"
                                            }
                                          ],
                                          "functionName": {
                                            "name": "add",
                                            "nodeType": "YulIdentifier",
                                            "src": "17866:3:0"
                                          },
                                          "nodeType": "YulFunctionCall",
                                          "src": "17866:16:0"
                                        },
                                        {
                                          "kind": "number",
                                          "nodeType": "YulLiteral",
                                          "src": "17884:66:0",
                                          "type": "",
                                          "value": "0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000"
                                        }
                                      ],
                                      "functionName": {
                                        "name": "mstore",
                                        "nodeType": "YulIdentifier",
                                        "src": "17859:6:0"
                                      },
                                      "nodeType": "YulFunctionCall",
                                      "src": "17859:92:0"
                                    },
                                    "nodeType": "YulExpressionStatement",
                                    "src": "17859:92:0"
                                  },
                                  {
                                    "nodeType": "YulAssignment",
                                    "src": "17968:38:0",
                                    "value": {
                                      "arguments": [
                                        {
                                          "kind": "number",
                                          "nodeType": "YulLiteral",
                                          "src": "17991:1:0",
                                          "type": "",
                                          "value": "0"
                                        },
                                        {
                                          "name": "clone",
                                          "nodeType": "YulIdentifier",
                                          "src": "17994:5:0"
                                        },
                                        {
                                          "kind": "number",
                                          "nodeType": "YulLiteral",
                                          "src": "18001:4:0",
                                          "type": "",
                                          "value": "0x37"
                                        }
                                      ],
                                      "functionName": {
                                        "name": "create",
                                        "nodeType": "YulIdentifier",
                                        "src": "17984:6:0"
                                      },
                                      "nodeType": "YulFunctionCall",
                                      "src": "17984:22:0"
                                    },
                                    "variableNames": [
                                      {
                                        "name": "cloneAddress",
                                        "nodeType": "YulIdentifier",
                                        "src": "17968:12:0"
                                      }
                                    ]
                                  }
                                ]
                              },
                              "evmVersion": "istanbul",
                              "externalReferences": [
                                {
                                  "declaration": 1056,
                                  "isOffset": false,
                                  "isSlot": false,
                                  "src": "17968:12:0",
                                  "valueSize": 1
                                },
                                {
                                  "declaration": 1069,
                                  "isOffset": false,
                                  "isSlot": false,
                                  "src": "17830:11:0",
                                  "valueSize": 1
                                }
                              ],
                              "id": 1084,
                              "nodeType": "InlineAssembly",
                              "src": "17639:381:0"
                            }
                          ]
                        },
                        "id": 1086,
                        "nodeType": "IfStatement",
                        "src": "16916:1114:0",
                        "trueBody": {
                          "id": 1083,
                          "nodeType": "Block",
                          "src": "16932:687:0",
                          "statements": [
                            {
                              "assignments": [
                                1077
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 1077,
                                  "mutability": "mutable",
                                  "name": "salt",
                                  "nodeType": "VariableDeclaration",
                                  "overrides": null,
                                  "scope": 1083,
                                  "src": "17057:12:0",
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes32",
                                    "typeString": "bytes32"
                                  },
                                  "typeName": {
                                    "id": 1076,
                                    "name": "bytes32",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "17057:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bytes32",
                                      "typeString": "bytes32"
                                    }
                                  },
                                  "value": null,
                                  "visibility": "internal"
                                }
                              ],
                              "id": 1081,
                              "initialValue": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 1079,
                                    "name": "data",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1051,
                                    "src": "17082:4:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bytes_calldata_ptr",
                                      "typeString": "bytes calldata"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_bytes_calldata_ptr",
                                      "typeString": "bytes calldata"
                                    }
                                  ],
                                  "id": 1078,
                                  "name": "keccak256",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -8,
                                  "src": "17072:9:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$",
                                    "typeString": "function (bytes memory) pure returns (bytes32)"
                                  }
                                },
                                "id": 1080,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "17072:15:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bytes32",
                                  "typeString": "bytes32"
                                }
                              },
                              "nodeType": "VariableDeclarationStatement",
                              "src": "17057:30:0"
                            },
                            {
                              "AST": {
                                "nodeType": "YulBlock",
                                "src": "17230:379:0",
                                "statements": [
                                  {
                                    "nodeType": "YulVariableDeclaration",
                                    "src": "17248:24:0",
                                    "value": {
                                      "arguments": [
                                        {
                                          "kind": "number",
                                          "nodeType": "YulLiteral",
                                          "src": "17267:4:0",
                                          "type": "",
                                          "value": "0x40"
                                        }
                                      ],
                                      "functionName": {
                                        "name": "mload",
                                        "nodeType": "YulIdentifier",
                                        "src": "17261:5:0"
                                      },
                                      "nodeType": "YulFunctionCall",
                                      "src": "17261:11:0"
                                    },
                                    "variables": [
                                      {
                                        "name": "clone",
                                        "nodeType": "YulTypedName",
                                        "src": "17252:5:0",
                                        "type": ""
                                      }
                                    ]
                                  },
                                  {
                                    "expression": {
                                      "arguments": [
                                        {
                                          "name": "clone",
                                          "nodeType": "YulIdentifier",
                                          "src": "17296:5:0"
                                        },
                                        {
                                          "kind": "number",
                                          "nodeType": "YulLiteral",
                                          "src": "17303:66:0",
                                          "type": "",
                                          "value": "0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000"
                                        }
                                      ],
                                      "functionName": {
                                        "name": "mstore",
                                        "nodeType": "YulIdentifier",
                                        "src": "17289:6:0"
                                      },
                                      "nodeType": "YulFunctionCall",
                                      "src": "17289:81:0"
                                    },
                                    "nodeType": "YulExpressionStatement",
                                    "src": "17289:81:0"
                                  },
                                  {
                                    "expression": {
                                      "arguments": [
                                        {
                                          "arguments": [
                                            {
                                              "name": "clone",
                                              "nodeType": "YulIdentifier",
                                              "src": "17398:5:0"
                                            },
                                            {
                                              "kind": "number",
                                              "nodeType": "YulLiteral",
                                              "src": "17405:4:0",
                                              "type": "",
                                              "value": "0x14"
                                            }
                                          ],
                                          "functionName": {
                                            "name": "add",
                                            "nodeType": "YulIdentifier",
                                            "src": "17394:3:0"
                                          },
                                          "nodeType": "YulFunctionCall",
                                          "src": "17394:16:0"
                                        },
                                        {
                                          "name": "targetBytes",
                                          "nodeType": "YulIdentifier",
                                          "src": "17412:11:0"
                                        }
                                      ],
                                      "functionName": {
                                        "name": "mstore",
                                        "nodeType": "YulIdentifier",
                                        "src": "17387:6:0"
                                      },
                                      "nodeType": "YulFunctionCall",
                                      "src": "17387:37:0"
                                    },
                                    "nodeType": "YulExpressionStatement",
                                    "src": "17387:37:0"
                                  },
                                  {
                                    "expression": {
                                      "arguments": [
                                        {
                                          "arguments": [
                                            {
                                              "name": "clone",
                                              "nodeType": "YulIdentifier",
                                              "src": "17452:5:0"
                                            },
                                            {
                                              "kind": "number",
                                              "nodeType": "YulLiteral",
                                              "src": "17459:4:0",
                                              "type": "",
                                              "value": "0x28"
                                            }
                                          ],
                                          "functionName": {
                                            "name": "add",
                                            "nodeType": "YulIdentifier",
                                            "src": "17448:3:0"
                                          },
                                          "nodeType": "YulFunctionCall",
                                          "src": "17448:16:0"
                                        },
                                        {
                                          "kind": "number",
                                          "nodeType": "YulLiteral",
                                          "src": "17466:66:0",
                                          "type": "",
                                          "value": "0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000"
                                        }
                                      ],
                                      "functionName": {
                                        "name": "mstore",
                                        "nodeType": "YulIdentifier",
                                        "src": "17441:6:0"
                                      },
                                      "nodeType": "YulFunctionCall",
                                      "src": "17441:92:0"
                                    },
                                    "nodeType": "YulExpressionStatement",
                                    "src": "17441:92:0"
                                  },
                                  {
                                    "nodeType": "YulAssignment",
                                    "src": "17550:45:0",
                                    "value": {
                                      "arguments": [
                                        {
                                          "kind": "number",
                                          "nodeType": "YulLiteral",
                                          "src": "17574:1:0",
                                          "type": "",
                                          "value": "0"
                                        },
                                        {
                                          "name": "clone",
                                          "nodeType": "YulIdentifier",
                                          "src": "17577:5:0"
                                        },
                                        {
                                          "kind": "number",
                                          "nodeType": "YulLiteral",
                                          "src": "17584:4:0",
                                          "type": "",
                                          "value": "0x37"
                                        },
                                        {
                                          "name": "salt",
                                          "nodeType": "YulIdentifier",
                                          "src": "17590:4:0"
                                        }
                                      ],
                                      "functionName": {
                                        "name": "create2",
                                        "nodeType": "YulIdentifier",
                                        "src": "17566:7:0"
                                      },
                                      "nodeType": "YulFunctionCall",
                                      "src": "17566:29:0"
                                    },
                                    "variableNames": [
                                      {
                                        "name": "cloneAddress",
                                        "nodeType": "YulIdentifier",
                                        "src": "17550:12:0"
                                      }
                                    ]
                                  }
                                ]
                              },
                              "evmVersion": "istanbul",
                              "externalReferences": [
                                {
                                  "declaration": 1056,
                                  "isOffset": false,
                                  "isSlot": false,
                                  "src": "17550:12:0",
                                  "valueSize": 1
                                },
                                {
                                  "declaration": 1077,
                                  "isOffset": false,
                                  "isSlot": false,
                                  "src": "17590:4:0",
                                  "valueSize": 1
                                },
                                {
                                  "declaration": 1069,
                                  "isOffset": false,
                                  "isSlot": false,
                                  "src": "17412:11:0",
                                  "valueSize": 1
                                }
                              ],
                              "id": 1082,
                              "nodeType": "InlineAssembly",
                              "src": "17221:388:0"
                            }
                          ]
                        }
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 1091,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 1087,
                              "name": "masterContractOf",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1046,
                              "src": "18039:16:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_address_$",
                                "typeString": "mapping(address => address)"
                              }
                            },
                            "id": 1089,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 1088,
                              "name": "cloneAddress",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1056,
                              "src": "18056:12:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "18039:30:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 1090,
                            "name": "masterContract",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1049,
                            "src": "18072:14:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "src": "18039:47:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "id": 1092,
                        "nodeType": "ExpressionStatement",
                        "src": "18039:47:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 1100,
                              "name": "data",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1051,
                              "src": "18150:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_calldata_ptr",
                                "typeString": "bytes calldata"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_calldata_ptr",
                                "typeString": "bytes calldata"
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_bytes_calldata_ptr",
                                  "typeString": "bytes calldata"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 1094,
                                    "name": "cloneAddress",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1056,
                                    "src": "18113:12:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  ],
                                  "id": 1093,
                                  "name": "IMasterContract",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1033,
                                  "src": "18097:15:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_contract$_IMasterContract_$1033_$",
                                    "typeString": "type(contract IMasterContract)"
                                  }
                                },
                                "id": 1095,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "18097:29:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_IMasterContract_$1033",
                                  "typeString": "contract IMasterContract"
                                }
                              },
                              "id": 1096,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "init",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 1032,
                              "src": "18097:34:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_external_payable$_t_bytes_memory_ptr_$returns$__$",
                                "typeString": "function (bytes memory) payable external"
                              }
                            },
                            "id": 1099,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "names": [
                              "value"
                            ],
                            "nodeType": "FunctionCallOptions",
                            "options": [
                              {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 1097,
                                  "name": "msg",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -15,
                                  "src": "18139:3:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_message",
                                    "typeString": "msg"
                                  }
                                },
                                "id": 1098,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "value",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "18139:9:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "src": "18097:52:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_payable$_t_bytes_memory_ptr_$returns$__$value",
                              "typeString": "function (bytes memory) payable external"
                            }
                          },
                          "id": 1101,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "18097:58:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1102,
                        "nodeType": "ExpressionStatement",
                        "src": "18097:58:0"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 1104,
                              "name": "masterContract",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1049,
                              "src": "18181:14:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 1105,
                              "name": "data",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1051,
                              "src": "18197:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_calldata_ptr",
                                "typeString": "bytes calldata"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 1106,
                              "name": "cloneAddress",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1056,
                              "src": "18203:12:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_bytes_calldata_ptr",
                                "typeString": "bytes calldata"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "id": 1103,
                            "name": "LogDeploy",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1041,
                            "src": "18171:9:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_bytes_memory_ptr_$_t_address_$returns$__$",
                              "typeString": "function (address,bytes memory,address)"
                            }
                          },
                          "id": 1107,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "18171:45:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1108,
                        "nodeType": "EmitStatement",
                        "src": "18166:50:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 1047,
                    "nodeType": "StructuredDocumentation",
                    "src": "16029:519:0",
                    "text": "@notice Deploys a given master Contract as a clone.\n Any ETH transferred with this call is forwarded to the new clone.\n Emits `LogDeploy`.\n @param masterContract The address of the contract to clone.\n @param data Additional abi encoded calldata that is passed to the new clone via `IMasterContract.init`.\n @param useCreate2 Creates the clone by using the CREATE2 opcode, in this case `data` will be used as salt.\n @return cloneAddress Address of the created clone contract."
                  },
                  "functionSelector": "1f54245b",
                  "id": 1110,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "deploy",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1054,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1049,
                        "mutability": "mutable",
                        "name": "masterContract",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1110,
                        "src": "16578:22:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1048,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "16578:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1051,
                        "mutability": "mutable",
                        "name": "data",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1110,
                        "src": "16610:19:0",
                        "stateVariable": false,
                        "storageLocation": "calldata",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_calldata_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 1050,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "16610:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1053,
                        "mutability": "mutable",
                        "name": "useCreate2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1110,
                        "src": "16639:15:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 1052,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "16639:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "16568:92:0"
                  },
                  "returnParameters": {
                    "id": 1057,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1056,
                        "mutability": "mutable",
                        "name": "cloneAddress",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1110,
                        "src": "16685:20:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1055,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "16685:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "16684:22:0"
                  },
                  "scope": 1111,
                  "src": "16553:1670:0",
                  "stateMutability": "payable",
                  "virtual": false,
                  "visibility": "public"
                }
              ],
              "scope": 3102,
              "src": "15776:2449:0"
            },
            {
              "abstract": false,
              "baseContracts": [
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 1112,
                    "name": "BoringOwnable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1026,
                    "src": "18340:13:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_BoringOwnable_$1026",
                      "typeString": "contract BoringOwnable"
                    }
                  },
                  "id": 1113,
                  "nodeType": "InheritanceSpecifier",
                  "src": "18340:13:0"
                },
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 1114,
                    "name": "BoringFactory",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1111,
                    "src": "18355:13:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_BoringFactory_$1111",
                      "typeString": "contract BoringFactory"
                    }
                  },
                  "id": 1115,
                  "nodeType": "InheritanceSpecifier",
                  "src": "18355:13:0"
                }
              ],
              "contractDependencies": [
                903,
                1026,
                1111
              ],
              "contractKind": "contract",
              "documentation": null,
              "fullyImplemented": true,
              "id": 1416,
              "linearizedBaseContracts": [
                1416,
                1111,
                1026,
                903
              ],
              "name": "MasterContractManager",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 1121,
                  "name": "LogWhiteListMasterContract",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 1120,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1117,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "masterContract",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1121,
                        "src": "18408:30:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1116,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "18408:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1119,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "approved",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1121,
                        "src": "18440:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 1118,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "18440:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "18407:47:0"
                  },
                  "src": "18375:80:0"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 1129,
                  "name": "LogSetMasterContractApproval",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 1128,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1123,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "masterContract",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1129,
                        "src": "18495:30:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1122,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "18495:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1125,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "user",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1129,
                        "src": "18527:20:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1124,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "18527:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1127,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "approved",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1129,
                        "src": "18549:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 1126,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "18549:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "18494:69:0"
                  },
                  "src": "18460:104:0"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 1133,
                  "name": "LogRegisterProtocol",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 1132,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1131,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "protocol",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1133,
                        "src": "18595:24:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1130,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "18595:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "18594:26:0"
                  },
                  "src": "18569:52:0"
                },
                {
                  "constant": false,
                  "documentation": {
                    "id": 1134,
                    "nodeType": "StructuredDocumentation",
                    "src": "18627:52:0",
                    "text": "@notice masterContract to user to approval state"
                  },
                  "functionSelector": "91e0eab5",
                  "id": 1140,
                  "mutability": "mutable",
                  "name": "masterContractApproved",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 1416,
                  "src": "18684:74:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_bool_$_$",
                    "typeString": "mapping(address => mapping(address => bool))"
                  },
                  "typeName": {
                    "id": 1139,
                    "keyType": {
                      "id": 1135,
                      "name": "address",
                      "nodeType": "ElementaryTypeName",
                      "src": "18692:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Mapping",
                    "src": "18684:44:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_bool_$_$",
                      "typeString": "mapping(address => mapping(address => bool))"
                    },
                    "valueType": {
                      "id": 1138,
                      "keyType": {
                        "id": 1136,
                        "name": "address",
                        "nodeType": "ElementaryTypeName",
                        "src": "18711:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "nodeType": "Mapping",
                      "src": "18703:24:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                        "typeString": "mapping(address => bool)"
                      },
                      "valueType": {
                        "id": 1137,
                        "name": "bool",
                        "nodeType": "ElementaryTypeName",
                        "src": "18722:4:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      }
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "documentation": {
                    "id": 1141,
                    "nodeType": "StructuredDocumentation",
                    "src": "18764:83:0",
                    "text": "@notice masterContract to whitelisted state for approval without signed message"
                  },
                  "functionSelector": "12a90c8a",
                  "id": 1145,
                  "mutability": "mutable",
                  "name": "whitelistedMasterContracts",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 1416,
                  "src": "18852:58:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                    "typeString": "mapping(address => bool)"
                  },
                  "typeName": {
                    "id": 1144,
                    "keyType": {
                      "id": 1142,
                      "name": "address",
                      "nodeType": "ElementaryTypeName",
                      "src": "18860:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Mapping",
                    "src": "18852:24:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                      "typeString": "mapping(address => bool)"
                    },
                    "valueType": {
                      "id": 1143,
                      "name": "bool",
                      "nodeType": "ElementaryTypeName",
                      "src": "18871:4:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "documentation": {
                    "id": 1146,
                    "nodeType": "StructuredDocumentation",
                    "src": "18916:52:0",
                    "text": "@notice user nonces for masterContract approvals"
                  },
                  "functionSelector": "7ecebe00",
                  "id": 1150,
                  "mutability": "mutable",
                  "name": "nonces",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 1416,
                  "src": "18973:41:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                    "typeString": "mapping(address => uint256)"
                  },
                  "typeName": {
                    "id": 1149,
                    "keyType": {
                      "id": 1147,
                      "name": "address",
                      "nodeType": "ElementaryTypeName",
                      "src": "18981:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Mapping",
                    "src": "18973:27:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                      "typeString": "mapping(address => uint256)"
                    },
                    "valueType": {
                      "id": 1148,
                      "name": "uint256",
                      "nodeType": "ElementaryTypeName",
                      "src": "18992:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "constant": true,
                  "id": 1155,
                  "mutability": "constant",
                  "name": "DOMAIN_SEPARATOR_SIGNATURE_HASH",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 1416,
                  "src": "19021:139:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 1151,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "19021:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "hexValue": "454950373132446f6d61696e28737472696e67206e616d652c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e747261637429",
                        "id": 1153,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "19090:69:0",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866",
                          "typeString": "literal_string \"EIP712Domain(string name,uint256 chainId,address verifyingContract)\""
                        },
                        "value": "EIP712Domain(string name,uint256 chainId,address verifyingContract)"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_stringliteral_8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866",
                          "typeString": "literal_string \"EIP712Domain(string name,uint256 chainId,address verifyingContract)\""
                        }
                      ],
                      "id": 1152,
                      "name": "keccak256",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": -8,
                      "src": "19080:9:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$",
                        "typeString": "function (bytes memory) pure returns (bytes32)"
                      }
                    },
                    "id": 1154,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "19080:80:0",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "private"
                },
                {
                  "constant": true,
                  "id": 1158,
                  "mutability": "constant",
                  "name": "EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 1416,
                  "src": "19216:77:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 1156,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "19216:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "1901",
                    "id": 1157,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "string",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "19283:10:0",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_stringliteral_301a50b291d33ce1e8e9064e3f6a6c51d902ec22892b50d58abf6357c6a45541",
                      "typeString": "literal_string \"\u0019\u0001\""
                    },
                    "value": "\u0019\u0001"
                  },
                  "visibility": "private"
                },
                {
                  "constant": true,
                  "id": 1163,
                  "mutability": "constant",
                  "name": "APPROVAL_SIGNATURE_HASH",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 1416,
                  "src": "19299:177:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 1159,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "19299:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "hexValue": "5365744d6173746572436f6e7472616374417070726f76616c28737472696e67207761726e696e672c6164647265737320757365722c61646472657373206d6173746572436f6e74726163742c626f6f6c20617070726f7665642c75696e74323536206e6f6e636529",
                        "id": 1161,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "19368:107:0",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_1962bc9f5484cb7a998701b81090e966ee1fce5771af884cceee7c081b14ade2",
                          "typeString": "literal_string \"SetMasterContractApproval(string warning,address user,address masterContract,bool approved,uint256 nonce)\""
                        },
                        "value": "SetMasterContractApproval(string warning,address user,address masterContract,bool approved,uint256 nonce)"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_stringliteral_1962bc9f5484cb7a998701b81090e966ee1fce5771af884cceee7c081b14ade2",
                          "typeString": "literal_string \"SetMasterContractApproval(string warning,address user,address masterContract,bool approved,uint256 nonce)\""
                        }
                      ],
                      "id": 1160,
                      "name": "keccak256",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": -8,
                      "src": "19358:9:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$",
                        "typeString": "function (bytes memory) pure returns (bytes32)"
                      }
                    },
                    "id": 1162,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "19358:118:0",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "private"
                },
                {
                  "constant": false,
                  "id": 1165,
                  "mutability": "immutable",
                  "name": "_DOMAIN_SEPARATOR",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 1416,
                  "src": "19535:43:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 1164,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "19535:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": null,
                  "visibility": "private"
                },
                {
                  "constant": false,
                  "id": 1167,
                  "mutability": "immutable",
                  "name": "DOMAIN_SEPARATOR_CHAIN_ID",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 1416,
                  "src": "19636:51:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1166,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "19636:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "private"
                },
                {
                  "body": {
                    "id": 1182,
                    "nodeType": "Block",
                    "src": "19715:186:0",
                    "statements": [
                      {
                        "assignments": [
                          1171
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 1171,
                            "mutability": "mutable",
                            "name": "chainId",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 1182,
                            "src": "19725:15:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 1170,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "19725:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 1172,
                        "initialValue": null,
                        "nodeType": "VariableDeclarationStatement",
                        "src": "19725:15:0"
                      },
                      {
                        "AST": {
                          "nodeType": "YulBlock",
                          "src": "19759:44:0",
                          "statements": [
                            {
                              "nodeType": "YulAssignment",
                              "src": "19773:20:0",
                              "value": {
                                "arguments": [],
                                "functionName": {
                                  "name": "chainid",
                                  "nodeType": "YulIdentifier",
                                  "src": "19784:7:0"
                                },
                                "nodeType": "YulFunctionCall",
                                "src": "19784:9:0"
                              },
                              "variableNames": [
                                {
                                  "name": "chainId",
                                  "nodeType": "YulIdentifier",
                                  "src": "19773:7:0"
                                }
                              ]
                            }
                          ]
                        },
                        "evmVersion": "istanbul",
                        "externalReferences": [
                          {
                            "declaration": 1171,
                            "isOffset": false,
                            "isSlot": false,
                            "src": "19773:7:0",
                            "valueSize": 1
                          }
                        ],
                        "id": 1173,
                        "nodeType": "InlineAssembly",
                        "src": "19750:53:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 1180,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 1174,
                            "name": "_DOMAIN_SEPARATOR",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1165,
                            "src": "19812:17:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 1178,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "id": 1176,
                                  "name": "DOMAIN_SEPARATOR_CHAIN_ID",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1167,
                                  "src": "19858:25:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "id": 1177,
                                  "name": "chainId",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1171,
                                  "src": "19886:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "19858:35:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "id": 1175,
                              "name": "_calculateDomainSeparator",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1206,
                              "src": "19832:25:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_view$_t_uint256_$returns$_t_bytes32_$",
                                "typeString": "function (uint256) view returns (bytes32)"
                              }
                            },
                            "id": 1179,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "19832:62:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          },
                          "src": "19812:82:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "id": 1181,
                        "nodeType": "ExpressionStatement",
                        "src": "19812:82:0"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 1183,
                  "implemented": true,
                  "kind": "constructor",
                  "modifiers": [],
                  "name": "",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1168,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "19705:2:0"
                  },
                  "returnParameters": {
                    "id": 1169,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "19715:0:0"
                  },
                  "scope": 1416,
                  "src": "19694:207:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 1205,
                    "nodeType": "Block",
                    "src": "19990:128:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 1193,
                                  "name": "DOMAIN_SEPARATOR_SIGNATURE_HASH",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1155,
                                  "src": "20028:31:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes32",
                                    "typeString": "bytes32"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "hexValue": "42656e746f426f78205631",
                                      "id": 1195,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "kind": "string",
                                      "lValueRequested": false,
                                      "nodeType": "Literal",
                                      "src": "20071:13:0",
                                      "subdenomination": null,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_stringliteral_d7df266aff736d415a9dc14b4158201d612e70d75b9c7f4e375ccfd20aa5166f",
                                        "typeString": "literal_string \"BentoBox V1\""
                                      },
                                      "value": "BentoBox V1"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_stringliteral_d7df266aff736d415a9dc14b4158201d612e70d75b9c7f4e375ccfd20aa5166f",
                                        "typeString": "literal_string \"BentoBox V1\""
                                      }
                                    ],
                                    "id": 1194,
                                    "name": "keccak256",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": -8,
                                    "src": "20061:9:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$",
                                      "typeString": "function (bytes memory) pure returns (bytes32)"
                                    }
                                  },
                                  "id": 1196,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "20061:24:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes32",
                                    "typeString": "bytes32"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 1197,
                                  "name": "chainId",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1185,
                                  "src": "20087:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 1200,
                                      "name": "this",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": -28,
                                      "src": "20104:4:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_MasterContractManager_$1416",
                                        "typeString": "contract MasterContractManager"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_contract$_MasterContractManager_$1416",
                                        "typeString": "contract MasterContractManager"
                                      }
                                    ],
                                    "id": 1199,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "ElementaryTypeNameExpression",
                                    "src": "20096:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_address_$",
                                      "typeString": "type(address)"
                                    },
                                    "typeName": {
                                      "id": 1198,
                                      "name": "address",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "20096:7:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": null,
                                        "typeString": null
                                      }
                                    }
                                  },
                                  "id": 1201,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "20096:13:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_bytes32",
                                    "typeString": "bytes32"
                                  },
                                  {
                                    "typeIdentifier": "t_bytes32",
                                    "typeString": "bytes32"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 1191,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "20017:3:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 1192,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encode",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "20017:10:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function () pure returns (bytes memory)"
                                }
                              },
                              "id": 1202,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "20017:93:0",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 1190,
                            "name": "keccak256",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -8,
                            "src": "20007:9:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$",
                              "typeString": "function (bytes memory) pure returns (bytes32)"
                            }
                          },
                          "id": 1203,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "20007:104:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "functionReturnParameters": 1189,
                        "id": 1204,
                        "nodeType": "Return",
                        "src": "20000:111:0"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 1206,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_calculateDomainSeparator",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1186,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1185,
                        "mutability": "mutable",
                        "name": "chainId",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1206,
                        "src": "19942:15:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1184,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "19942:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "19941:17:0"
                  },
                  "returnParameters": {
                    "id": 1189,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1188,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1206,
                        "src": "19981:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 1187,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "19981:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "19980:9:0"
                  },
                  "scope": 1416,
                  "src": "19907:211:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "private"
                },
                {
                  "body": {
                    "id": 1224,
                    "nodeType": "Block",
                    "src": "20235:204:0",
                    "statements": [
                      {
                        "assignments": [
                          1212
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 1212,
                            "mutability": "mutable",
                            "name": "chainId",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 1224,
                            "src": "20245:15:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 1211,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "20245:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 1213,
                        "initialValue": null,
                        "nodeType": "VariableDeclarationStatement",
                        "src": "20245:15:0"
                      },
                      {
                        "AST": {
                          "nodeType": "YulBlock",
                          "src": "20279:44:0",
                          "statements": [
                            {
                              "nodeType": "YulAssignment",
                              "src": "20293:20:0",
                              "value": {
                                "arguments": [],
                                "functionName": {
                                  "name": "chainid",
                                  "nodeType": "YulIdentifier",
                                  "src": "20304:7:0"
                                },
                                "nodeType": "YulFunctionCall",
                                "src": "20304:9:0"
                              },
                              "variableNames": [
                                {
                                  "name": "chainId",
                                  "nodeType": "YulIdentifier",
                                  "src": "20293:7:0"
                                }
                              ]
                            }
                          ]
                        },
                        "evmVersion": "istanbul",
                        "externalReferences": [
                          {
                            "declaration": 1212,
                            "isOffset": false,
                            "isSlot": false,
                            "src": "20293:7:0",
                            "valueSize": 1
                          }
                        ],
                        "id": 1214,
                        "nodeType": "InlineAssembly",
                        "src": "20270:53:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "condition": {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "id": 1217,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "id": 1215,
                              "name": "chainId",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1212,
                              "src": "20339:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "==",
                            "rightExpression": {
                              "argumentTypes": null,
                              "id": 1216,
                              "name": "DOMAIN_SEPARATOR_CHAIN_ID",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1167,
                              "src": "20350:25:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "src": "20339:36:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "falseExpression": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 1220,
                                "name": "chainId",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1212,
                                "src": "20424:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "id": 1219,
                              "name": "_calculateDomainSeparator",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1206,
                              "src": "20398:25:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_view$_t_uint256_$returns$_t_bytes32_$",
                                "typeString": "function (uint256) view returns (bytes32)"
                              }
                            },
                            "id": 1221,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "20398:34:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          },
                          "id": 1222,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "Conditional",
                          "src": "20339:93:0",
                          "trueExpression": {
                            "argumentTypes": null,
                            "id": 1218,
                            "name": "_DOMAIN_SEPARATOR",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1165,
                            "src": "20378:17:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          },
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "functionReturnParameters": 1210,
                        "id": 1223,
                        "nodeType": "Return",
                        "src": "20332:100:0"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "3644e515",
                  "id": 1225,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "DOMAIN_SEPARATOR",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1207,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "20202:2:0"
                  },
                  "returnParameters": {
                    "id": 1210,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1209,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1225,
                        "src": "20226:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 1208,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "20226:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "20225:9:0"
                  },
                  "scope": 1416,
                  "src": "20177:262:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 1242,
                    "nodeType": "Block",
                    "src": "20604:104:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 1235,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 1229,
                              "name": "masterContractOf",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1046,
                              "src": "20614:16:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_address_$",
                                "typeString": "mapping(address => address)"
                              }
                            },
                            "id": 1232,
                            "indexExpression": {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 1230,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "20631:3:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 1231,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "20631:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "20614:28:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 1233,
                              "name": "msg",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": -15,
                              "src": "20645:3:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_magic_message",
                                "typeString": "msg"
                              }
                            },
                            "id": 1234,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "sender",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "20645:10:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address_payable",
                              "typeString": "address payable"
                            }
                          },
                          "src": "20614:41:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "id": 1236,
                        "nodeType": "ExpressionStatement",
                        "src": "20614:41:0"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 1238,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "20690:3:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 1239,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "20690:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            ],
                            "id": 1237,
                            "name": "LogRegisterProtocol",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1133,
                            "src": "20670:19:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$returns$__$",
                              "typeString": "function (address)"
                            }
                          },
                          "id": 1240,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "20670:31:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1241,
                        "nodeType": "EmitStatement",
                        "src": "20665:36:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 1226,
                    "nodeType": "StructuredDocumentation",
                    "src": "20445:119:0",
                    "text": "@notice Other contracts need to register with this master contract so that users can approve them for the BentoBox."
                  },
                  "functionSelector": "aee4d1b2",
                  "id": 1243,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "registerProtocol",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1227,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "20594:2:0"
                  },
                  "returnParameters": {
                    "id": 1228,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "20604:0:0"
                  },
                  "scope": 1416,
                  "src": "20569:139:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 1274,
                    "nodeType": "Block",
                    "src": "20887:254:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 1259,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 1254,
                                "name": "masterContract",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1246,
                                "src": "20923:14:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "!=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "30",
                                    "id": 1257,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "20949:1:0",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    },
                                    "value": "0"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    }
                                  ],
                                  "id": 1256,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "20941:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 1255,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "20941:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 1258,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "20941:10:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "src": "20923:28:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "4d6173746572434d67723a2043616e6e6f7420617070726f76652030",
                              "id": 1260,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "20953:30:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_05c987dd69d78c1ee4fa739315e61a9b7045038ace711c67e7c473d70978b7b6",
                                "typeString": "literal_string \"MasterCMgr: Cannot approve 0\""
                              },
                              "value": "MasterCMgr: Cannot approve 0"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_05c987dd69d78c1ee4fa739315e61a9b7045038ace711c67e7c473d70978b7b6",
                                "typeString": "literal_string \"MasterCMgr: Cannot approve 0\""
                              }
                            ],
                            "id": 1253,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "20915:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 1261,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "20915:69:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1262,
                        "nodeType": "ExpressionStatement",
                        "src": "20915:69:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 1267,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 1263,
                              "name": "whitelistedMasterContracts",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1145,
                              "src": "21014:26:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                                "typeString": "mapping(address => bool)"
                              }
                            },
                            "id": 1265,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 1264,
                              "name": "masterContract",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1246,
                              "src": "21041:14:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "21014:42:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 1266,
                            "name": "approved",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1248,
                            "src": "21059:8:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "src": "21014:53:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 1268,
                        "nodeType": "ExpressionStatement",
                        "src": "21014:53:0"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 1270,
                              "name": "masterContract",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1246,
                              "src": "21109:14:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 1271,
                              "name": "approved",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1248,
                              "src": "21125:8:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            ],
                            "id": 1269,
                            "name": "LogWhiteListMasterContract",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1121,
                            "src": "21082:26:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_bool_$returns$__$",
                              "typeString": "function (address,bool)"
                            }
                          },
                          "id": 1272,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "21082:52:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1273,
                        "nodeType": "EmitStatement",
                        "src": "21077:57:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 1244,
                    "nodeType": "StructuredDocumentation",
                    "src": "20714:79:0",
                    "text": "@notice Enables or disables a contract for approval without signed message."
                  },
                  "functionSelector": "733a9d7c",
                  "id": 1275,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 1251,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 1250,
                        "name": "onlyOwner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1025,
                        "src": "20877:9:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "20877:9:0"
                    }
                  ],
                  "name": "whitelistMasterContract",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1249,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1246,
                        "mutability": "mutable",
                        "name": "masterContract",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1275,
                        "src": "20831:22:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1245,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "20831:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1248,
                        "mutability": "mutable",
                        "name": "approved",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1275,
                        "src": "20855:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 1247,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "20855:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "20830:39:0"
                  },
                  "returnParameters": {
                    "id": 1252,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "20887:0:0"
                  },
                  "scope": 1416,
                  "src": "20798:343:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 1414,
                    "nodeType": "Block",
                    "src": "22078:2451:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 1297,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 1292,
                                "name": "masterContract",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1280,
                                "src": "22114:14:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "!=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "30",
                                    "id": 1295,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "22140:1:0",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    },
                                    "value": "0"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    }
                                  ],
                                  "id": 1294,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "22132:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 1293,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "22132:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 1296,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "22132:10:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "src": "22114:28:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "4d6173746572434d67723a206d617374657243206e6f7420736574",
                              "id": 1298,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "22144:29:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_d4554bcb32b147c03c1d615ec7e7aaa89c0d578be297eb1b9cec8a89c9a18519",
                                "typeString": "literal_string \"MasterCMgr: masterC not set\""
                              },
                              "value": "MasterCMgr: masterC not set"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_d4554bcb32b147c03c1d615ec7e7aaa89c0d578be297eb1b9cec8a89c9a18519",
                                "typeString": "literal_string \"MasterCMgr: masterC not set\""
                              }
                            ],
                            "id": 1291,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "22106:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 1299,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "22106:68:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1300,
                        "nodeType": "ExpressionStatement",
                        "src": "22106:68:0"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          },
                          "id": 1311,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            },
                            "id": 1307,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              },
                              "id": 1303,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 1301,
                                "name": "r",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1286,
                                "src": "22280:1:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bytes32",
                                  "typeString": "bytes32"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "==",
                              "rightExpression": {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 1302,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "22285:1:0",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              },
                              "src": "22280:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "&&",
                            "rightExpression": {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              },
                              "id": 1306,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 1304,
                                "name": "s",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1288,
                                "src": "22290:1:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bytes32",
                                  "typeString": "bytes32"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "==",
                              "rightExpression": {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 1305,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "22295:1:0",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              },
                              "src": "22290:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            "src": "22280:16:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "&&",
                          "rightExpression": {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_uint8",
                              "typeString": "uint8"
                            },
                            "id": 1310,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "id": 1308,
                              "name": "v",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1284,
                              "src": "22300:1:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint8",
                                "typeString": "uint8"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "==",
                            "rightExpression": {
                              "argumentTypes": null,
                              "hexValue": "30",
                              "id": 1309,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "22305:1:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              },
                              "value": "0"
                            },
                            "src": "22300:6:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "src": "22280:26:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": {
                          "id": 1398,
                          "nodeType": "Block",
                          "src": "22581:1782:0",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "commonType": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    "id": 1346,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "leftExpression": {
                                      "argumentTypes": null,
                                      "id": 1341,
                                      "name": "user",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1278,
                                      "src": "22889:4:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      }
                                    },
                                    "nodeType": "BinaryOperation",
                                    "operator": "!=",
                                    "rightExpression": {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "hexValue": "30",
                                          "id": 1344,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": true,
                                          "kind": "number",
                                          "lValueRequested": false,
                                          "nodeType": "Literal",
                                          "src": "22905:1:0",
                                          "subdenomination": null,
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_rational_0_by_1",
                                            "typeString": "int_const 0"
                                          },
                                          "value": "0"
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_rational_0_by_1",
                                            "typeString": "int_const 0"
                                          }
                                        ],
                                        "id": 1343,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": true,
                                        "lValueRequested": false,
                                        "nodeType": "ElementaryTypeNameExpression",
                                        "src": "22897:7:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_type$_t_address_$",
                                          "typeString": "type(address)"
                                        },
                                        "typeName": {
                                          "id": 1342,
                                          "name": "address",
                                          "nodeType": "ElementaryTypeName",
                                          "src": "22897:7:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": null,
                                            "typeString": null
                                          }
                                        }
                                      },
                                      "id": 1345,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "kind": "typeConversion",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "22897:10:0",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_address_payable",
                                        "typeString": "address payable"
                                      }
                                    },
                                    "src": "22889:18:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "4d6173746572434d67723a20557365722063616e6e6f742062652030",
                                    "id": 1347,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "string",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "22909:30:0",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_stringliteral_e11d9be4a5cd0528cd92f4bcd22421ed87d25e253facc7a8c78e74337e439653",
                                      "typeString": "literal_string \"MasterCMgr: User cannot be 0\""
                                    },
                                    "value": "MasterCMgr: User cannot be 0"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    },
                                    {
                                      "typeIdentifier": "t_stringliteral_e11d9be4a5cd0528cd92f4bcd22421ed87d25e253facc7a8c78e74337e439653",
                                      "typeString": "literal_string \"MasterCMgr: User cannot be 0\""
                                    }
                                  ],
                                  "id": 1340,
                                  "name": "require",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [
                                    -18,
                                    -18
                                  ],
                                  "referencedDeclaration": -18,
                                  "src": "22881:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                                    "typeString": "function (bool,string memory) pure"
                                  }
                                },
                                "id": 1348,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "22881:59:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 1349,
                              "nodeType": "ExpressionStatement",
                              "src": "22881:59:0"
                            },
                            {
                              "assignments": [
                                1351
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 1351,
                                  "mutability": "mutable",
                                  "name": "digest",
                                  "nodeType": "VariableDeclaration",
                                  "overrides": null,
                                  "scope": 1398,
                                  "src": "23383:14:0",
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes32",
                                    "typeString": "bytes32"
                                  },
                                  "typeName": {
                                    "id": 1350,
                                    "name": "bytes32",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "23383:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bytes32",
                                      "typeString": "bytes32"
                                    }
                                  },
                                  "value": null,
                                  "visibility": "internal"
                                }
                              ],
                              "id": 1381,
                              "initialValue": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "id": 1355,
                                        "name": "EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 1158,
                                        "src": "23489:40:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_string_memory_ptr",
                                          "typeString": "string memory"
                                        }
                                      },
                                      {
                                        "argumentTypes": null,
                                        "arguments": [],
                                        "expression": {
                                          "argumentTypes": [],
                                          "id": 1356,
                                          "name": "DOMAIN_SEPARATOR",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 1225,
                                          "src": "23555:16:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_function_internal_view$__$returns$_t_bytes32_$",
                                            "typeString": "function () view returns (bytes32)"
                                          }
                                        },
                                        "id": 1357,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "23555:18:0",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_bytes32",
                                          "typeString": "bytes32"
                                        }
                                      },
                                      {
                                        "argumentTypes": null,
                                        "arguments": [
                                          {
                                            "argumentTypes": null,
                                            "arguments": [
                                              {
                                                "argumentTypes": null,
                                                "id": 1361,
                                                "name": "APPROVAL_SIGNATURE_HASH",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 1163,
                                                "src": "23682:23:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_bytes32",
                                                  "typeString": "bytes32"
                                                }
                                              },
                                              {
                                                "argumentTypes": null,
                                                "condition": {
                                                  "argumentTypes": null,
                                                  "id": 1362,
                                                  "name": "approved",
                                                  "nodeType": "Identifier",
                                                  "overloadedDeclarations": [],
                                                  "referencedDeclaration": 1282,
                                                  "src": "23739:8:0",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_bool",
                                                    "typeString": "bool"
                                                  }
                                                },
                                                "falseExpression": {
                                                  "argumentTypes": null,
                                                  "arguments": [
                                                    {
                                                      "argumentTypes": null,
                                                      "hexValue": "5265766f6b652061636365737320746f2042656e746f426f783f",
                                                      "id": 1367,
                                                      "isConstant": false,
                                                      "isLValue": false,
                                                      "isPure": true,
                                                      "kind": "string",
                                                      "lValueRequested": false,
                                                      "nodeType": "Literal",
                                                      "src": "23904:28:0",
                                                      "subdenomination": null,
                                                      "typeDescriptions": {
                                                        "typeIdentifier": "t_stringliteral_b426802f1f7dc850a7b6b38805edea2442f3992878a9ab985abfe8091d95d0b1",
                                                        "typeString": "literal_string \"Revoke access to BentoBox?\""
                                                      },
                                                      "value": "Revoke access to BentoBox?"
                                                    }
                                                  ],
                                                  "expression": {
                                                    "argumentTypes": [
                                                      {
                                                        "typeIdentifier": "t_stringliteral_b426802f1f7dc850a7b6b38805edea2442f3992878a9ab985abfe8091d95d0b1",
                                                        "typeString": "literal_string \"Revoke access to BentoBox?\""
                                                      }
                                                    ],
                                                    "id": 1366,
                                                    "name": "keccak256",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": -8,
                                                    "src": "23894:9:0",
                                                    "typeDescriptions": {
                                                      "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$",
                                                      "typeString": "function (bytes memory) pure returns (bytes32)"
                                                    }
                                                  },
                                                  "id": 1368,
                                                  "isConstant": false,
                                                  "isLValue": false,
                                                  "isPure": true,
                                                  "kind": "functionCall",
                                                  "lValueRequested": false,
                                                  "names": [],
                                                  "nodeType": "FunctionCall",
                                                  "src": "23894:39:0",
                                                  "tryCall": false,
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_bytes32",
                                                    "typeString": "bytes32"
                                                  }
                                                },
                                                "id": 1369,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "nodeType": "Conditional",
                                                "src": "23739:194:0",
                                                "trueExpression": {
                                                  "argumentTypes": null,
                                                  "arguments": [
                                                    {
                                                      "argumentTypes": null,
                                                      "hexValue": "476976652046554c4c2061636365737320746f2066756e647320696e2028616e6420617070726f76656420746f292042656e746f426f783f",
                                                      "id": 1364,
                                                      "isConstant": false,
                                                      "isLValue": false,
                                                      "isPure": true,
                                                      "kind": "string",
                                                      "lValueRequested": false,
                                                      "nodeType": "Literal",
                                                      "src": "23796:58:0",
                                                      "subdenomination": null,
                                                      "typeDescriptions": {
                                                        "typeIdentifier": "t_stringliteral_422ac5323fe049241dee67716229a1cc1bc7b313b23dfe3ef6d42ab177a3b284",
                                                        "typeString": "literal_string \"Give FULL access to funds in (and approved to) BentoBox?\""
                                                      },
                                                      "value": "Give FULL access to funds in (and approved to) BentoBox?"
                                                    }
                                                  ],
                                                  "expression": {
                                                    "argumentTypes": [
                                                      {
                                                        "typeIdentifier": "t_stringliteral_422ac5323fe049241dee67716229a1cc1bc7b313b23dfe3ef6d42ab177a3b284",
                                                        "typeString": "literal_string \"Give FULL access to funds in (and approved to) BentoBox?\""
                                                      }
                                                    ],
                                                    "id": 1363,
                                                    "name": "keccak256",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": -8,
                                                    "src": "23786:9:0",
                                                    "typeDescriptions": {
                                                      "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$",
                                                      "typeString": "function (bytes memory) pure returns (bytes32)"
                                                    }
                                                  },
                                                  "id": 1365,
                                                  "isConstant": false,
                                                  "isLValue": false,
                                                  "isPure": true,
                                                  "kind": "functionCall",
                                                  "lValueRequested": false,
                                                  "names": [],
                                                  "nodeType": "FunctionCall",
                                                  "src": "23786:69:0",
                                                  "tryCall": false,
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_bytes32",
                                                    "typeString": "bytes32"
                                                  }
                                                },
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_bytes32",
                                                  "typeString": "bytes32"
                                                }
                                              },
                                              {
                                                "argumentTypes": null,
                                                "id": 1370,
                                                "name": "user",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 1278,
                                                "src": "23967:4:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_address",
                                                  "typeString": "address"
                                                }
                                              },
                                              {
                                                "argumentTypes": null,
                                                "id": 1371,
                                                "name": "masterContract",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 1280,
                                                "src": "24005:14:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_address",
                                                  "typeString": "address"
                                                }
                                              },
                                              {
                                                "argumentTypes": null,
                                                "id": 1372,
                                                "name": "approved",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 1282,
                                                "src": "24053:8:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_bool",
                                                  "typeString": "bool"
                                                }
                                              },
                                              {
                                                "argumentTypes": null,
                                                "id": 1376,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "nodeType": "UnaryOperation",
                                                "operator": "++",
                                                "prefix": false,
                                                "src": "24095:14:0",
                                                "subExpression": {
                                                  "argumentTypes": null,
                                                  "baseExpression": {
                                                    "argumentTypes": null,
                                                    "id": 1373,
                                                    "name": "nonces",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 1150,
                                                    "src": "24095:6:0",
                                                    "typeDescriptions": {
                                                      "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                                      "typeString": "mapping(address => uint256)"
                                                    }
                                                  },
                                                  "id": 1375,
                                                  "indexExpression": {
                                                    "argumentTypes": null,
                                                    "id": 1374,
                                                    "name": "user",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 1278,
                                                    "src": "24102:4:0",
                                                    "typeDescriptions": {
                                                      "typeIdentifier": "t_address",
                                                      "typeString": "address"
                                                    }
                                                  },
                                                  "isConstant": false,
                                                  "isLValue": true,
                                                  "isPure": false,
                                                  "lValueRequested": true,
                                                  "nodeType": "IndexAccess",
                                                  "src": "24095:12:0",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                  }
                                                },
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_uint256",
                                                  "typeString": "uint256"
                                                }
                                              }
                                            ],
                                            "expression": {
                                              "argumentTypes": [
                                                {
                                                  "typeIdentifier": "t_bytes32",
                                                  "typeString": "bytes32"
                                                },
                                                {
                                                  "typeIdentifier": "t_bytes32",
                                                  "typeString": "bytes32"
                                                },
                                                {
                                                  "typeIdentifier": "t_address",
                                                  "typeString": "address"
                                                },
                                                {
                                                  "typeIdentifier": "t_address",
                                                  "typeString": "address"
                                                },
                                                {
                                                  "typeIdentifier": "t_bool",
                                                  "typeString": "bool"
                                                },
                                                {
                                                  "typeIdentifier": "t_uint256",
                                                  "typeString": "uint256"
                                                }
                                              ],
                                              "expression": {
                                                "argumentTypes": null,
                                                "id": 1359,
                                                "name": "abi",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": -1,
                                                "src": "23638:3:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_magic_abi",
                                                  "typeString": "abi"
                                                }
                                              },
                                              "id": 1360,
                                              "isConstant": false,
                                              "isLValue": false,
                                              "isPure": true,
                                              "lValueRequested": false,
                                              "memberName": "encode",
                                              "nodeType": "MemberAccess",
                                              "referencedDeclaration": null,
                                              "src": "23638:10:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$",
                                                "typeString": "function () pure returns (bytes memory)"
                                              }
                                            },
                                            "id": 1377,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "kind": "functionCall",
                                            "lValueRequested": false,
                                            "names": [],
                                            "nodeType": "FunctionCall",
                                            "src": "23638:501:0",
                                            "tryCall": false,
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_bytes_memory_ptr",
                                              "typeString": "bytes memory"
                                            }
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": [
                                            {
                                              "typeIdentifier": "t_bytes_memory_ptr",
                                              "typeString": "bytes memory"
                                            }
                                          ],
                                          "id": 1358,
                                          "name": "keccak256",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": -8,
                                          "src": "23599:9:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$",
                                            "typeString": "function (bytes memory) pure returns (bytes32)"
                                          }
                                        },
                                        "id": 1378,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "23599:566:0",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_bytes32",
                                          "typeString": "bytes32"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_string_memory_ptr",
                                          "typeString": "string memory"
                                        },
                                        {
                                          "typeIdentifier": "t_bytes32",
                                          "typeString": "bytes32"
                                        },
                                        {
                                          "typeIdentifier": "t_bytes32",
                                          "typeString": "bytes32"
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": null,
                                        "id": 1353,
                                        "name": "abi",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": -1,
                                        "src": "23447:3:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_magic_abi",
                                          "typeString": "abi"
                                        }
                                      },
                                      "id": 1354,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "lValueRequested": false,
                                      "memberName": "encodePacked",
                                      "nodeType": "MemberAccess",
                                      "referencedDeclaration": null,
                                      "src": "23447:16:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$",
                                        "typeString": "function () pure returns (bytes memory)"
                                      }
                                    },
                                    "id": 1379,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "functionCall",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "23447:740:0",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bytes_memory_ptr",
                                      "typeString": "bytes memory"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_bytes_memory_ptr",
                                      "typeString": "bytes memory"
                                    }
                                  ],
                                  "id": 1352,
                                  "name": "keccak256",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -8,
                                  "src": "23416:9:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$",
                                    "typeString": "function (bytes memory) pure returns (bytes32)"
                                  }
                                },
                                "id": 1380,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "23416:789:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bytes32",
                                  "typeString": "bytes32"
                                }
                              },
                              "nodeType": "VariableDeclarationStatement",
                              "src": "23383:822:0"
                            },
                            {
                              "assignments": [
                                1383
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 1383,
                                  "mutability": "mutable",
                                  "name": "recoveredAddress",
                                  "nodeType": "VariableDeclaration",
                                  "overrides": null,
                                  "scope": 1398,
                                  "src": "24219:24:0",
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  "typeName": {
                                    "id": 1382,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "24219:7:0",
                                    "stateMutability": "nonpayable",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  "value": null,
                                  "visibility": "internal"
                                }
                              ],
                              "id": 1390,
                              "initialValue": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 1385,
                                    "name": "digest",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1351,
                                    "src": "24256:6:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bytes32",
                                      "typeString": "bytes32"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 1386,
                                    "name": "v",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1284,
                                    "src": "24264:1:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint8",
                                      "typeString": "uint8"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 1387,
                                    "name": "r",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1286,
                                    "src": "24267:1:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bytes32",
                                      "typeString": "bytes32"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 1388,
                                    "name": "s",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1288,
                                    "src": "24270:1:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bytes32",
                                      "typeString": "bytes32"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_bytes32",
                                      "typeString": "bytes32"
                                    },
                                    {
                                      "typeIdentifier": "t_uint8",
                                      "typeString": "uint8"
                                    },
                                    {
                                      "typeIdentifier": "t_bytes32",
                                      "typeString": "bytes32"
                                    },
                                    {
                                      "typeIdentifier": "t_bytes32",
                                      "typeString": "bytes32"
                                    }
                                  ],
                                  "id": 1384,
                                  "name": "ecrecover",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -6,
                                  "src": "24246:9:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_ecrecover_pure$_t_bytes32_$_t_uint8_$_t_bytes32_$_t_bytes32_$returns$_t_address_$",
                                    "typeString": "function (bytes32,uint8,bytes32,bytes32) pure returns (address)"
                                  }
                                },
                                "id": 1389,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "24246:26:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "nodeType": "VariableDeclarationStatement",
                              "src": "24219:53:0"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "commonType": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    "id": 1394,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "leftExpression": {
                                      "argumentTypes": null,
                                      "id": 1392,
                                      "name": "recoveredAddress",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1383,
                                      "src": "24294:16:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      }
                                    },
                                    "nodeType": "BinaryOperation",
                                    "operator": "==",
                                    "rightExpression": {
                                      "argumentTypes": null,
                                      "id": 1393,
                                      "name": "user",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1278,
                                      "src": "24314:4:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      }
                                    },
                                    "src": "24294:24:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "4d6173746572434d67723a20496e76616c6964205369676e6174757265",
                                    "id": 1395,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "string",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "24320:31:0",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_stringliteral_bf29b6546a289d23beadf6fcacd96d99c5c43e7a6d531456b5ee498c67360ed0",
                                      "typeString": "literal_string \"MasterCMgr: Invalid Signature\""
                                    },
                                    "value": "MasterCMgr: Invalid Signature"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    },
                                    {
                                      "typeIdentifier": "t_stringliteral_bf29b6546a289d23beadf6fcacd96d99c5c43e7a6d531456b5ee498c67360ed0",
                                      "typeString": "literal_string \"MasterCMgr: Invalid Signature\""
                                    }
                                  ],
                                  "id": 1391,
                                  "name": "require",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [
                                    -18,
                                    -18
                                  ],
                                  "referencedDeclaration": -18,
                                  "src": "24286:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                                    "typeString": "function (bool,string memory) pure"
                                  }
                                },
                                "id": 1396,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "24286:66:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 1397,
                              "nodeType": "ExpressionStatement",
                              "src": "24286:66:0"
                            }
                          ]
                        },
                        "id": 1399,
                        "nodeType": "IfStatement",
                        "src": "22276:2087:0",
                        "trueBody": {
                          "id": 1339,
                          "nodeType": "Block",
                          "src": "22308:267:0",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "commonType": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    "id": 1316,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "leftExpression": {
                                      "argumentTypes": null,
                                      "id": 1313,
                                      "name": "user",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1278,
                                      "src": "22330:4:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      }
                                    },
                                    "nodeType": "BinaryOperation",
                                    "operator": "==",
                                    "rightExpression": {
                                      "argumentTypes": null,
                                      "expression": {
                                        "argumentTypes": null,
                                        "id": 1314,
                                        "name": "msg",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": -15,
                                        "src": "22338:3:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_magic_message",
                                          "typeString": "msg"
                                        }
                                      },
                                      "id": 1315,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "memberName": "sender",
                                      "nodeType": "MemberAccess",
                                      "referencedDeclaration": null,
                                      "src": "22338:10:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_address_payable",
                                        "typeString": "address payable"
                                      }
                                    },
                                    "src": "22330:18:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "4d6173746572434d67723a2075736572206e6f742073656e646572",
                                    "id": 1317,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "string",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "22350:29:0",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_stringliteral_177835414c26a024f7683801887c34467408a8af9c50feec8be133c91db9fc86",
                                      "typeString": "literal_string \"MasterCMgr: user not sender\""
                                    },
                                    "value": "MasterCMgr: user not sender"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    },
                                    {
                                      "typeIdentifier": "t_stringliteral_177835414c26a024f7683801887c34467408a8af9c50feec8be133c91db9fc86",
                                      "typeString": "literal_string \"MasterCMgr: user not sender\""
                                    }
                                  ],
                                  "id": 1312,
                                  "name": "require",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [
                                    -18,
                                    -18
                                  ],
                                  "referencedDeclaration": -18,
                                  "src": "22322:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                                    "typeString": "function (bool,string memory) pure"
                                  }
                                },
                                "id": 1318,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "22322:58:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 1319,
                              "nodeType": "ExpressionStatement",
                              "src": "22322:58:0"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "commonType": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    "id": 1328,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "leftExpression": {
                                      "argumentTypes": null,
                                      "baseExpression": {
                                        "argumentTypes": null,
                                        "id": 1321,
                                        "name": "masterContractOf",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 1046,
                                        "src": "22402:16:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_mapping$_t_address_$_t_address_$",
                                          "typeString": "mapping(address => address)"
                                        }
                                      },
                                      "id": 1323,
                                      "indexExpression": {
                                        "argumentTypes": null,
                                        "id": 1322,
                                        "name": "user",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 1278,
                                        "src": "22419:4:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_address",
                                          "typeString": "address"
                                        }
                                      },
                                      "isConstant": false,
                                      "isLValue": true,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "nodeType": "IndexAccess",
                                      "src": "22402:22:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      }
                                    },
                                    "nodeType": "BinaryOperation",
                                    "operator": "==",
                                    "rightExpression": {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "hexValue": "30",
                                          "id": 1326,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": true,
                                          "kind": "number",
                                          "lValueRequested": false,
                                          "nodeType": "Literal",
                                          "src": "22436:1:0",
                                          "subdenomination": null,
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_rational_0_by_1",
                                            "typeString": "int_const 0"
                                          },
                                          "value": "0"
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_rational_0_by_1",
                                            "typeString": "int_const 0"
                                          }
                                        ],
                                        "id": 1325,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": true,
                                        "lValueRequested": false,
                                        "nodeType": "ElementaryTypeNameExpression",
                                        "src": "22428:7:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_type$_t_address_$",
                                          "typeString": "type(address)"
                                        },
                                        "typeName": {
                                          "id": 1324,
                                          "name": "address",
                                          "nodeType": "ElementaryTypeName",
                                          "src": "22428:7:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": null,
                                            "typeString": null
                                          }
                                        }
                                      },
                                      "id": 1327,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "kind": "typeConversion",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "22428:10:0",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_address_payable",
                                        "typeString": "address payable"
                                      }
                                    },
                                    "src": "22402:36:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "4d6173746572434d67723a207573657220697320636c6f6e65",
                                    "id": 1329,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "string",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "22440:27:0",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_stringliteral_b76e42eaf41acf747fdf8c8aa63b693ddacd062ef356c3e1753f737e4ed2909b",
                                      "typeString": "literal_string \"MasterCMgr: user is clone\""
                                    },
                                    "value": "MasterCMgr: user is clone"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    },
                                    {
                                      "typeIdentifier": "t_stringliteral_b76e42eaf41acf747fdf8c8aa63b693ddacd062ef356c3e1753f737e4ed2909b",
                                      "typeString": "literal_string \"MasterCMgr: user is clone\""
                                    }
                                  ],
                                  "id": 1320,
                                  "name": "require",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [
                                    -18,
                                    -18
                                  ],
                                  "referencedDeclaration": -18,
                                  "src": "22394:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                                    "typeString": "function (bool,string memory) pure"
                                  }
                                },
                                "id": 1330,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "22394:74:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 1331,
                              "nodeType": "ExpressionStatement",
                              "src": "22394:74:0"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "baseExpression": {
                                      "argumentTypes": null,
                                      "id": 1333,
                                      "name": "whitelistedMasterContracts",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1145,
                                      "src": "22490:26:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                                        "typeString": "mapping(address => bool)"
                                      }
                                    },
                                    "id": 1335,
                                    "indexExpression": {
                                      "argumentTypes": null,
                                      "id": 1334,
                                      "name": "masterContract",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1280,
                                      "src": "22517:14:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      }
                                    },
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "nodeType": "IndexAccess",
                                    "src": "22490:42:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "4d6173746572434d67723a206e6f742077686974656c6973746564",
                                    "id": 1336,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "string",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "22534:29:0",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_stringliteral_ece38d90da69b99e086237a3317fc903e256ad7789d025fcb6c7961c4f89f66b",
                                      "typeString": "literal_string \"MasterCMgr: not whitelisted\""
                                    },
                                    "value": "MasterCMgr: not whitelisted"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    },
                                    {
                                      "typeIdentifier": "t_stringliteral_ece38d90da69b99e086237a3317fc903e256ad7789d025fcb6c7961c4f89f66b",
                                      "typeString": "literal_string \"MasterCMgr: not whitelisted\""
                                    }
                                  ],
                                  "id": 1332,
                                  "name": "require",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [
                                    -18,
                                    -18
                                  ],
                                  "referencedDeclaration": -18,
                                  "src": "22482:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                                    "typeString": "function (bool,string memory) pure"
                                  }
                                },
                                "id": 1337,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "22482:82:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 1338,
                              "nodeType": "ExpressionStatement",
                              "src": "22482:82:0"
                            }
                          ]
                        }
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 1406,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "id": 1400,
                                "name": "masterContractApproved",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1140,
                                "src": "24392:22:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_bool_$_$",
                                  "typeString": "mapping(address => mapping(address => bool))"
                                }
                              },
                              "id": 1403,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 1401,
                                "name": "masterContract",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1280,
                                "src": "24415:14:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "24392:38:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                                "typeString": "mapping(address => bool)"
                              }
                            },
                            "id": 1404,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 1402,
                              "name": "user",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1278,
                              "src": "24431:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "24392:44:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 1405,
                            "name": "approved",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1282,
                            "src": "24439:8:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "src": "24392:55:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 1407,
                        "nodeType": "ExpressionStatement",
                        "src": "24392:55:0"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 1409,
                              "name": "masterContract",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1280,
                              "src": "24491:14:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 1410,
                              "name": "user",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1278,
                              "src": "24507:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 1411,
                              "name": "approved",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1282,
                              "src": "24513:8:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            ],
                            "id": 1408,
                            "name": "LogSetMasterContractApproval",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1129,
                            "src": "24462:28:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_bool_$returns$__$",
                              "typeString": "function (address,address,bool)"
                            }
                          },
                          "id": 1412,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "24462:60:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1413,
                        "nodeType": "EmitStatement",
                        "src": "24457:65:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 1276,
                    "nodeType": "StructuredDocumentation",
                    "src": "21147:456:0",
                    "text": "@notice Approves or revokes a `masterContract` access to `user` funds.\n @param user The address of the user that approves or revokes access.\n @param masterContract The address who gains or loses access.\n @param approved If True approves access. If False revokes access.\n @param v Part of the signature. (See EIP-191)\n @param r Part of the signature. (See EIP-191)\n @param s Part of the signature. (See EIP-191)"
                  },
                  "functionSelector": "c0a47c93",
                  "id": 1415,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "setMasterContractApproval",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1289,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1278,
                        "mutability": "mutable",
                        "name": "user",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1415,
                        "src": "21942:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1277,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "21942:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1280,
                        "mutability": "mutable",
                        "name": "masterContract",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1415,
                        "src": "21964:22:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1279,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "21964:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1282,
                        "mutability": "mutable",
                        "name": "approved",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1415,
                        "src": "21996:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 1281,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "21996:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1284,
                        "mutability": "mutable",
                        "name": "v",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1415,
                        "src": "22019:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        "typeName": {
                          "id": 1283,
                          "name": "uint8",
                          "nodeType": "ElementaryTypeName",
                          "src": "22019:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1286,
                        "mutability": "mutable",
                        "name": "r",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1415,
                        "src": "22036:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 1285,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "22036:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1288,
                        "mutability": "mutable",
                        "name": "s",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1415,
                        "src": "22055:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 1287,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "22055:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "21932:138:0"
                  },
                  "returnParameters": {
                    "id": 1290,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "22078:0:0"
                  },
                  "scope": 1416,
                  "src": "21898:2631:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                }
              ],
              "scope": 3102,
              "src": "18306:6225:0"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "contract",
              "documentation": null,
              "fullyImplemented": true,
              "id": 1525,
              "linearizedBaseContracts": [
                1525
              ],
              "name": "BaseBoringBatchable",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": {
                    "id": 1440,
                    "nodeType": "Block",
                    "src": "24945:400:0",
                    "statements": [
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 1427,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 1424,
                              "name": "_returnData",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1419,
                              "src": "25070:11:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            },
                            "id": 1425,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "length",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "25070:18:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "<",
                          "rightExpression": {
                            "argumentTypes": null,
                            "hexValue": "3638",
                            "id": 1426,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "25091:2:0",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_68_by_1",
                              "typeString": "int_const 68"
                            },
                            "value": "68"
                          },
                          "src": "25070:23:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 1430,
                        "nodeType": "IfStatement",
                        "src": "25066:67:0",
                        "trueBody": {
                          "expression": {
                            "argumentTypes": null,
                            "hexValue": "5472616e73616374696f6e2072657665727465642073696c656e746c79",
                            "id": 1428,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "string",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "25102:31:0",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_stringliteral_d0b1e7612ebe87924453e5d4581b9067879655587bae8a2dfee438433699b890",
                              "typeString": "literal_string \"Transaction reverted silently\""
                            },
                            "value": "Transaction reverted silently"
                          },
                          "functionReturnParameters": 1423,
                          "id": 1429,
                          "nodeType": "Return",
                          "src": "25095:38:0"
                        }
                      },
                      {
                        "AST": {
                          "nodeType": "YulBlock",
                          "src": "25153:95:0",
                          "statements": [
                            {
                              "nodeType": "YulAssignment",
                              "src": "25201:37:0",
                              "value": {
                                "arguments": [
                                  {
                                    "name": "_returnData",
                                    "nodeType": "YulIdentifier",
                                    "src": "25220:11:0"
                                  },
                                  {
                                    "kind": "number",
                                    "nodeType": "YulLiteral",
                                    "src": "25233:4:0",
                                    "type": "",
                                    "value": "0x04"
                                  }
                                ],
                                "functionName": {
                                  "name": "add",
                                  "nodeType": "YulIdentifier",
                                  "src": "25216:3:0"
                                },
                                "nodeType": "YulFunctionCall",
                                "src": "25216:22:0"
                              },
                              "variableNames": [
                                {
                                  "name": "_returnData",
                                  "nodeType": "YulIdentifier",
                                  "src": "25201:11:0"
                                }
                              ]
                            }
                          ]
                        },
                        "evmVersion": "istanbul",
                        "externalReferences": [
                          {
                            "declaration": 1419,
                            "isOffset": false,
                            "isSlot": false,
                            "src": "25201:11:0",
                            "valueSize": 1
                          },
                          {
                            "declaration": 1419,
                            "isOffset": false,
                            "isSlot": false,
                            "src": "25220:11:0",
                            "valueSize": 1
                          }
                        ],
                        "id": 1431,
                        "nodeType": "InlineAssembly",
                        "src": "25144:104:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 1434,
                              "name": "_returnData",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1419,
                              "src": "25275:11:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "components": [
                                {
                                  "argumentTypes": null,
                                  "id": 1436,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "25289:6:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_string_storage_ptr_$",
                                    "typeString": "type(string storage pointer)"
                                  },
                                  "typeName": {
                                    "id": 1435,
                                    "name": "string",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "25289:6:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                }
                              ],
                              "id": 1437,
                              "isConstant": false,
                              "isInlineArray": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "TupleExpression",
                              "src": "25288:8:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_string_storage_ptr_$",
                                "typeString": "type(string storage pointer)"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              },
                              {
                                "typeIdentifier": "t_type$_t_string_storage_ptr_$",
                                "typeString": "type(string storage pointer)"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 1432,
                              "name": "abi",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": -1,
                              "src": "25264:3:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_magic_abi",
                                "typeString": "abi"
                              }
                            },
                            "id": 1433,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "memberName": "decode",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "25264:10:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_abidecode_pure$__$returns$__$",
                              "typeString": "function () pure"
                            }
                          },
                          "id": 1438,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "25264:33:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_memory_ptr",
                            "typeString": "string memory"
                          }
                        },
                        "functionReturnParameters": 1423,
                        "id": 1439,
                        "nodeType": "Return",
                        "src": "25257:40:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 1417,
                    "nodeType": "StructuredDocumentation",
                    "src": "24671:182:0",
                    "text": "@dev Helper function to extract a useful revert message from a failed call.\n If the returned data is malformed or not correctly abi encoded then this call can fail itself."
                  },
                  "id": 1441,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_getRevertMsg",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1420,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1419,
                        "mutability": "mutable",
                        "name": "_returnData",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1441,
                        "src": "24881:24:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 1418,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "24881:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "24880:26:0"
                  },
                  "returnParameters": {
                    "id": 1423,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1422,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1441,
                        "src": "24930:13:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 1421,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "24930:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "24929:15:0"
                  },
                  "scope": 1525,
                  "src": "24858:487:0",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 1523,
                    "nodeType": "Block",
                    "src": "26307:388:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 1463,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 1456,
                            "name": "successes",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1451,
                            "src": "26317:9:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_array$_t_bool_$dyn_memory_ptr",
                              "typeString": "bool[] memory"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 1460,
                                  "name": "calls",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1445,
                                  "src": "26340:5:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_array$_t_bytes_calldata_ptr_$dyn_calldata_ptr",
                                    "typeString": "bytes calldata[] calldata"
                                  }
                                },
                                "id": 1461,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "length",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "26340:12:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "id": 1459,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "NewExpression",
                              "src": "26329:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_objectcreation_pure$_t_uint256_$returns$_t_array$_t_bool_$dyn_memory_ptr_$",
                                "typeString": "function (uint256) pure returns (bool[] memory)"
                              },
                              "typeName": {
                                "baseType": {
                                  "id": 1457,
                                  "name": "bool",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "26333:4:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                "id": 1458,
                                "length": null,
                                "nodeType": "ArrayTypeName",
                                "src": "26333:6:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_array$_t_bool_$dyn_storage_ptr",
                                  "typeString": "bool[]"
                                }
                              }
                            },
                            "id": 1462,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "26329:24:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_array$_t_bool_$dyn_memory_ptr",
                              "typeString": "bool[] memory"
                            }
                          },
                          "src": "26317:36:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_bool_$dyn_memory_ptr",
                            "typeString": "bool[] memory"
                          }
                        },
                        "id": 1464,
                        "nodeType": "ExpressionStatement",
                        "src": "26317:36:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 1472,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 1465,
                            "name": "results",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1454,
                            "src": "26363:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_array$_t_bytes_memory_ptr_$dyn_memory_ptr",
                              "typeString": "bytes memory[] memory"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 1469,
                                  "name": "calls",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1445,
                                  "src": "26385:5:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_array$_t_bytes_calldata_ptr_$dyn_calldata_ptr",
                                    "typeString": "bytes calldata[] calldata"
                                  }
                                },
                                "id": 1470,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "length",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "26385:12:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "id": 1468,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "NewExpression",
                              "src": "26373:11:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_objectcreation_pure$_t_uint256_$returns$_t_array$_t_bytes_memory_ptr_$dyn_memory_ptr_$",
                                "typeString": "function (uint256) pure returns (bytes memory[] memory)"
                              },
                              "typeName": {
                                "baseType": {
                                  "id": 1466,
                                  "name": "bytes",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "26377:5:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes_storage_ptr",
                                    "typeString": "bytes"
                                  }
                                },
                                "id": 1467,
                                "length": null,
                                "nodeType": "ArrayTypeName",
                                "src": "26377:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_array$_t_bytes_storage_$dyn_storage_ptr",
                                  "typeString": "bytes[]"
                                }
                              }
                            },
                            "id": 1471,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "26373:25:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_array$_t_bytes_memory_ptr_$dyn_memory_ptr",
                              "typeString": "bytes memory[] memory"
                            }
                          },
                          "src": "26363:35:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_bytes_memory_ptr_$dyn_memory_ptr",
                            "typeString": "bytes memory[] memory"
                          }
                        },
                        "id": 1473,
                        "nodeType": "ExpressionStatement",
                        "src": "26363:35:0"
                      },
                      {
                        "body": {
                          "id": 1521,
                          "nodeType": "Block",
                          "src": "26451:238:0",
                          "statements": [
                            {
                              "assignments": [
                                1486,
                                1488
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 1486,
                                  "mutability": "mutable",
                                  "name": "success",
                                  "nodeType": "VariableDeclaration",
                                  "overrides": null,
                                  "scope": 1521,
                                  "src": "26466:12:0",
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  "typeName": {
                                    "id": 1485,
                                    "name": "bool",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "26466:4:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    }
                                  },
                                  "value": null,
                                  "visibility": "internal"
                                },
                                {
                                  "constant": false,
                                  "id": 1488,
                                  "mutability": "mutable",
                                  "name": "result",
                                  "nodeType": "VariableDeclaration",
                                  "overrides": null,
                                  "scope": 1521,
                                  "src": "26480:19:0",
                                  "stateVariable": false,
                                  "storageLocation": "memory",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes_memory_ptr",
                                    "typeString": "bytes"
                                  },
                                  "typeName": {
                                    "id": 1487,
                                    "name": "bytes",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "26480:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bytes_storage_ptr",
                                      "typeString": "bytes"
                                    }
                                  },
                                  "value": null,
                                  "visibility": "internal"
                                }
                              ],
                              "id": 1498,
                              "initialValue": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "baseExpression": {
                                      "argumentTypes": null,
                                      "id": 1494,
                                      "name": "calls",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1445,
                                      "src": "26530:5:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_array$_t_bytes_calldata_ptr_$dyn_calldata_ptr",
                                        "typeString": "bytes calldata[] calldata"
                                      }
                                    },
                                    "id": 1496,
                                    "indexExpression": {
                                      "argumentTypes": null,
                                      "id": 1495,
                                      "name": "i",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1475,
                                      "src": "26536:1:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "nodeType": "IndexAccess",
                                    "src": "26530:8:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bytes_calldata_ptr",
                                      "typeString": "bytes calldata"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_bytes_calldata_ptr",
                                      "typeString": "bytes calldata"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "id": 1491,
                                        "name": "this",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": -28,
                                        "src": "26511:4:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_contract$_BaseBoringBatchable_$1525",
                                          "typeString": "contract BaseBoringBatchable"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_contract$_BaseBoringBatchable_$1525",
                                          "typeString": "contract BaseBoringBatchable"
                                        }
                                      ],
                                      "id": 1490,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "lValueRequested": false,
                                      "nodeType": "ElementaryTypeNameExpression",
                                      "src": "26503:7:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_type$_t_address_$",
                                        "typeString": "type(address)"
                                      },
                                      "typeName": {
                                        "id": 1489,
                                        "name": "address",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "26503:7:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": null,
                                          "typeString": null
                                        }
                                      }
                                    },
                                    "id": 1492,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "typeConversion",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "26503:13:0",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  "id": 1493,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "delegatecall",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": null,
                                  "src": "26503:26:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_baredelegatecall_nonpayable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$",
                                    "typeString": "function (bytes memory) returns (bool,bytes memory)"
                                  }
                                },
                                "id": 1497,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "26503:36:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$_t_bool_$_t_bytes_memory_ptr_$",
                                  "typeString": "tuple(bool,bytes memory)"
                                }
                              },
                              "nodeType": "VariableDeclarationStatement",
                              "src": "26465:74:0"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "commonType": {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    },
                                    "id": 1503,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "leftExpression": {
                                      "argumentTypes": null,
                                      "id": 1500,
                                      "name": "success",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1486,
                                      "src": "26561:7:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                      }
                                    },
                                    "nodeType": "BinaryOperation",
                                    "operator": "||",
                                    "rightExpression": {
                                      "argumentTypes": null,
                                      "id": 1502,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "nodeType": "UnaryOperation",
                                      "operator": "!",
                                      "prefix": true,
                                      "src": "26572:13:0",
                                      "subExpression": {
                                        "argumentTypes": null,
                                        "id": 1501,
                                        "name": "revertOnFail",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 1447,
                                        "src": "26573:12:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_bool",
                                          "typeString": "bool"
                                        }
                                      },
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                      }
                                    },
                                    "src": "26561:24:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "id": 1505,
                                        "name": "result",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 1488,
                                        "src": "26601:6:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_bytes_memory_ptr",
                                          "typeString": "bytes memory"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_bytes_memory_ptr",
                                          "typeString": "bytes memory"
                                        }
                                      ],
                                      "id": 1504,
                                      "name": "_getRevertMsg",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1441,
                                      "src": "26587:13:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_function_internal_pure$_t_bytes_memory_ptr_$returns$_t_string_memory_ptr_$",
                                        "typeString": "function (bytes memory) pure returns (string memory)"
                                      }
                                    },
                                    "id": 1506,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "functionCall",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "26587:21:0",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_string_memory_ptr",
                                      "typeString": "string memory"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    },
                                    {
                                      "typeIdentifier": "t_string_memory_ptr",
                                      "typeString": "string memory"
                                    }
                                  ],
                                  "id": 1499,
                                  "name": "require",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [
                                    -18,
                                    -18
                                  ],
                                  "referencedDeclaration": -18,
                                  "src": "26553:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                                    "typeString": "function (bool,string memory) pure"
                                  }
                                },
                                "id": 1507,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "26553:56:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 1508,
                              "nodeType": "ExpressionStatement",
                              "src": "26553:56:0"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 1513,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "baseExpression": {
                                    "argumentTypes": null,
                                    "id": 1509,
                                    "name": "successes",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1451,
                                    "src": "26623:9:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_array$_t_bool_$dyn_memory_ptr",
                                      "typeString": "bool[] memory"
                                    }
                                  },
                                  "id": 1511,
                                  "indexExpression": {
                                    "argumentTypes": null,
                                    "id": 1510,
                                    "name": "i",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1475,
                                    "src": "26633:1:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": true,
                                  "nodeType": "IndexAccess",
                                  "src": "26623:12:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "id": 1512,
                                  "name": "success",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1486,
                                  "src": "26638:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                "src": "26623:22:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "id": 1514,
                              "nodeType": "ExpressionStatement",
                              "src": "26623:22:0"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 1519,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "baseExpression": {
                                    "argumentTypes": null,
                                    "id": 1515,
                                    "name": "results",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1454,
                                    "src": "26659:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_array$_t_bytes_memory_ptr_$dyn_memory_ptr",
                                      "typeString": "bytes memory[] memory"
                                    }
                                  },
                                  "id": 1517,
                                  "indexExpression": {
                                    "argumentTypes": null,
                                    "id": 1516,
                                    "name": "i",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1475,
                                    "src": "26667:1:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": true,
                                  "nodeType": "IndexAccess",
                                  "src": "26659:10:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes_memory_ptr",
                                    "typeString": "bytes memory"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "id": 1518,
                                  "name": "result",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1488,
                                  "src": "26672:6:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes_memory_ptr",
                                    "typeString": "bytes memory"
                                  }
                                },
                                "src": "26659:19:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bytes_memory_ptr",
                                  "typeString": "bytes memory"
                                }
                              },
                              "id": 1520,
                              "nodeType": "ExpressionStatement",
                              "src": "26659:19:0"
                            }
                          ]
                        },
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 1481,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 1478,
                            "name": "i",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1475,
                            "src": "26428:1:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "<",
                          "rightExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 1479,
                              "name": "calls",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1445,
                              "src": "26432:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_bytes_calldata_ptr_$dyn_calldata_ptr",
                                "typeString": "bytes calldata[] calldata"
                              }
                            },
                            "id": 1480,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "length",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "26432:12:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "26428:16:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 1522,
                        "initializationExpression": {
                          "assignments": [
                            1475
                          ],
                          "declarations": [
                            {
                              "constant": false,
                              "id": 1475,
                              "mutability": "mutable",
                              "name": "i",
                              "nodeType": "VariableDeclaration",
                              "overrides": null,
                              "scope": 1522,
                              "src": "26413:9:0",
                              "stateVariable": false,
                              "storageLocation": "default",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "typeName": {
                                "id": 1474,
                                "name": "uint256",
                                "nodeType": "ElementaryTypeName",
                                "src": "26413:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "value": null,
                              "visibility": "internal"
                            }
                          ],
                          "id": 1477,
                          "initialValue": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 1476,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "26425:1:0",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "nodeType": "VariableDeclarationStatement",
                          "src": "26413:13:0"
                        },
                        "loopExpression": {
                          "expression": {
                            "argumentTypes": null,
                            "id": 1483,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "UnaryOperation",
                            "operator": "++",
                            "prefix": false,
                            "src": "26446:3:0",
                            "subExpression": {
                              "argumentTypes": null,
                              "id": 1482,
                              "name": "i",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1475,
                              "src": "26446:1:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "id": 1484,
                          "nodeType": "ExpressionStatement",
                          "src": "26446:3:0"
                        },
                        "nodeType": "ForStatement",
                        "src": "26408:281:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 1442,
                    "nodeType": "StructuredDocumentation",
                    "src": "25351:419:0",
                    "text": "@notice Allows batched call to self (this contract).\n @param calls An array of inputs for each call.\n @param revertOnFail If True then reverts after a failed call and stops doing further calls.\n @return successes An array indicating the success of a call, mapped one-to-one to `calls`.\n @return results An array with the returned data of each function call, mapped one-to-one to `calls`."
                  },
                  "functionSelector": "d2423b51",
                  "id": 1524,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "batch",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1448,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1445,
                        "mutability": "mutable",
                        "name": "calls",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1524,
                        "src": "26189:22:0",
                        "stateVariable": false,
                        "storageLocation": "calldata",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_bytes_calldata_ptr_$dyn_calldata_ptr",
                          "typeString": "bytes[]"
                        },
                        "typeName": {
                          "baseType": {
                            "id": 1443,
                            "name": "bytes",
                            "nodeType": "ElementaryTypeName",
                            "src": "26189:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes_storage_ptr",
                              "typeString": "bytes"
                            }
                          },
                          "id": 1444,
                          "length": null,
                          "nodeType": "ArrayTypeName",
                          "src": "26189:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_bytes_storage_$dyn_storage_ptr",
                            "typeString": "bytes[]"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1447,
                        "mutability": "mutable",
                        "name": "revertOnFail",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1524,
                        "src": "26213:17:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 1446,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "26213:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "26188:43:0"
                  },
                  "returnParameters": {
                    "id": 1455,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1451,
                        "mutability": "mutable",
                        "name": "successes",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1524,
                        "src": "26258:23:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_bool_$dyn_memory_ptr",
                          "typeString": "bool[]"
                        },
                        "typeName": {
                          "baseType": {
                            "id": 1449,
                            "name": "bool",
                            "nodeType": "ElementaryTypeName",
                            "src": "26258:4:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "id": 1450,
                          "length": null,
                          "nodeType": "ArrayTypeName",
                          "src": "26258:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_bool_$dyn_storage_ptr",
                            "typeString": "bool[]"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1454,
                        "mutability": "mutable",
                        "name": "results",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1524,
                        "src": "26283:22:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_bytes_memory_ptr_$dyn_memory_ptr",
                          "typeString": "bytes[]"
                        },
                        "typeName": {
                          "baseType": {
                            "id": 1452,
                            "name": "bytes",
                            "nodeType": "ElementaryTypeName",
                            "src": "26283:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes_storage_ptr",
                              "typeString": "bytes"
                            }
                          },
                          "id": 1453,
                          "length": null,
                          "nodeType": "ArrayTypeName",
                          "src": "26283:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_bytes_storage_$dyn_storage_ptr",
                            "typeString": "bytes[]"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "26257:49:0"
                  },
                  "scope": 1525,
                  "src": "26174:521:0",
                  "stateMutability": "payable",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 3102,
              "src": "24636:2061:0"
            },
            {
              "abstract": false,
              "baseContracts": [
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 1526,
                    "name": "BaseBoringBatchable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1525,
                    "src": "26727:19:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_BaseBoringBatchable_$1525",
                      "typeString": "contract BaseBoringBatchable"
                    }
                  },
                  "id": 1527,
                  "nodeType": "InheritanceSpecifier",
                  "src": "26727:19:0"
                }
              ],
              "contractDependencies": [
                1525
              ],
              "contractKind": "contract",
              "documentation": null,
              "fullyImplemented": true,
              "id": 1561,
              "linearizedBaseContracts": [
                1561,
                1525
              ],
              "name": "BoringBatchable",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": {
                    "id": 1559,
                    "nodeType": "Block",
                    "src": "27284:66:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 1550,
                              "name": "from",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1532,
                              "src": "27307:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 1551,
                              "name": "to",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1534,
                              "src": "27313:2:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 1552,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1536,
                              "src": "27317:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 1553,
                              "name": "deadline",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1538,
                              "src": "27325:8:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 1554,
                              "name": "v",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1540,
                              "src": "27335:1:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint8",
                                "typeString": "uint8"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 1555,
                              "name": "r",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1542,
                              "src": "27338:1:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 1556,
                              "name": "s",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1544,
                              "src": "27341:1:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_uint8",
                                "typeString": "uint8"
                              },
                              {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              },
                              {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 1547,
                              "name": "token",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1530,
                              "src": "27294:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$67",
                                "typeString": "contract IERC20"
                              }
                            },
                            "id": 1549,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "permit",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 66,
                            "src": "27294:12:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_address_$_t_uint256_$_t_uint256_$_t_uint8_$_t_bytes32_$_t_bytes32_$returns$__$",
                              "typeString": "function (address,address,uint256,uint256,uint8,bytes32,bytes32) external"
                            }
                          },
                          "id": 1557,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "27294:49:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1558,
                        "nodeType": "ExpressionStatement",
                        "src": "27294:49:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 1528,
                    "nodeType": "StructuredDocumentation",
                    "src": "26753:97:0",
                    "text": "@notice Call wrapper that performs `ERC20.permit` on `token`.\n Lookup `IERC20.permit`."
                  },
                  "functionSelector": "7c516e94",
                  "id": 1560,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "permitToken",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1545,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1530,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1560,
                        "src": "27111:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$67",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 1529,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 67,
                          "src": "27111:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$67",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1532,
                        "mutability": "mutable",
                        "name": "from",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1560,
                        "src": "27133:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1531,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "27133:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1534,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1560,
                        "src": "27155:10:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1533,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "27155:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1536,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1560,
                        "src": "27175:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1535,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "27175:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1538,
                        "mutability": "mutable",
                        "name": "deadline",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1560,
                        "src": "27199:16:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1537,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "27199:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1540,
                        "mutability": "mutable",
                        "name": "v",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1560,
                        "src": "27225:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        "typeName": {
                          "id": 1539,
                          "name": "uint8",
                          "nodeType": "ElementaryTypeName",
                          "src": "27225:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1542,
                        "mutability": "mutable",
                        "name": "r",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1560,
                        "src": "27242:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 1541,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "27242:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1544,
                        "mutability": "mutable",
                        "name": "s",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1560,
                        "src": "27261:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 1543,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "27261:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "27101:175:0"
                  },
                  "returnParameters": {
                    "id": 1546,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "27284:0:0"
                  },
                  "scope": 1561,
                  "src": "27081:269:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                }
              ],
              "scope": 3102,
              "src": "26699:653:0"
            },
            {
              "abstract": false,
              "baseContracts": [
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 1563,
                    "name": "MasterContractManager",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1416,
                    "src": "27825:21:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_MasterContractManager_$1416",
                      "typeString": "contract MasterContractManager"
                    }
                  },
                  "id": 1564,
                  "nodeType": "InheritanceSpecifier",
                  "src": "27825:21:0"
                },
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 1565,
                    "name": "BoringBatchable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1561,
                    "src": "27848:15:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_BoringBatchable_$1561",
                      "typeString": "contract BoringBatchable"
                    }
                  },
                  "id": 1566,
                  "nodeType": "InheritanceSpecifier",
                  "src": "27848:15:0"
                }
              ],
              "contractDependencies": [
                903,
                1026,
                1111,
                1416,
                1525,
                1561
              ],
              "contractKind": "contract",
              "documentation": {
                "id": 1562,
                "nodeType": "StructuredDocumentation",
                "src": "27420:382:0",
                "text": "@title BentoBox\n @author BoringCrypto, Keno\n @notice The BentoBox is a vault for tokens. The stored tokens can be flash loaned and used in strategies.\n Yield from this will go to the token depositors.\n Rebasing tokens ARE NOT supported and WILL cause loss of funds.\n Any funds transfered directly onto the BentoBox will be lost, use the deposit function instead."
              },
              "fullyImplemented": true,
              "id": 3101,
              "linearizedBaseContracts": [
                3101,
                1561,
                1525,
                1416,
                1111,
                1026,
                903
              ],
              "name": "BentoBoxV1",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "id": 1569,
                  "libraryName": {
                    "contractScope": null,
                    "id": 1567,
                    "name": "BoringMath",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 407,
                    "src": "27876:10:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_BoringMath_$407",
                      "typeString": "library BoringMath"
                    }
                  },
                  "nodeType": "UsingForDirective",
                  "src": "27870:29:0",
                  "typeName": {
                    "id": 1568,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "27891:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  }
                },
                {
                  "id": 1572,
                  "libraryName": {
                    "contractScope": null,
                    "id": 1570,
                    "name": "BoringMath128",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 453,
                    "src": "27910:13:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_BoringMath128_$453",
                      "typeString": "library BoringMath128"
                    }
                  },
                  "nodeType": "UsingForDirective",
                  "src": "27904:32:0",
                  "typeName": {
                    "id": 1571,
                    "name": "uint128",
                    "nodeType": "ElementaryTypeName",
                    "src": "27928:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint128",
                      "typeString": "uint128"
                    }
                  }
                },
                {
                  "id": 1575,
                  "libraryName": {
                    "contractScope": null,
                    "id": 1573,
                    "name": "BoringERC20",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 255,
                    "src": "27947:11:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_BoringERC20_$255",
                      "typeString": "library BoringERC20"
                    }
                  },
                  "nodeType": "UsingForDirective",
                  "src": "27941:29:0",
                  "typeName": {
                    "contractScope": null,
                    "id": 1574,
                    "name": "IERC20",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 67,
                    "src": "27963:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IERC20_$67",
                      "typeString": "contract IERC20"
                    }
                  }
                },
                {
                  "id": 1578,
                  "libraryName": {
                    "contractScope": null,
                    "id": 1576,
                    "name": "RebaseLibrary",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 898,
                    "src": "27981:13:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_RebaseLibrary_$898",
                      "typeString": "library RebaseLibrary"
                    }
                  },
                  "nodeType": "UsingForDirective",
                  "src": "27975:31:0",
                  "typeName": {
                    "contractScope": null,
                    "id": 1577,
                    "name": "Rebase",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 550,
                    "src": "27999:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_Rebase_$550_storage_ptr",
                      "typeString": "struct Rebase"
                    }
                  }
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 1590,
                  "name": "LogDeposit",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 1589,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1580,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1590,
                        "src": "28105:20:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$67",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 1579,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 67,
                          "src": "28105:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$67",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1582,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "from",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1590,
                        "src": "28127:20:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1581,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "28127:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1584,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1590,
                        "src": "28149:18:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1583,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "28149:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1586,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1590,
                        "src": "28169:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1585,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "28169:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1588,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "share",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1590,
                        "src": "28185:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1587,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "28185:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "28104:95:0"
                  },
                  "src": "28088:112:0"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 1602,
                  "name": "LogWithdraw",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 1601,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1592,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1602,
                        "src": "28223:20:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$67",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 1591,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 67,
                          "src": "28223:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$67",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1594,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "from",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1602,
                        "src": "28245:20:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1593,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "28245:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1596,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1602,
                        "src": "28267:18:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1595,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "28267:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1598,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1602,
                        "src": "28287:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1597,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "28287:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1600,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "share",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1602,
                        "src": "28303:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1599,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "28303:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "28222:95:0"
                  },
                  "src": "28205:113:0"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 1612,
                  "name": "LogTransfer",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 1611,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1604,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1612,
                        "src": "28341:20:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$67",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 1603,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 67,
                          "src": "28341:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$67",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1606,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "from",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1612,
                        "src": "28363:20:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1605,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "28363:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1608,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1612,
                        "src": "28385:18:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1607,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "28385:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1610,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "share",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1612,
                        "src": "28405:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1609,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "28405:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "28340:79:0"
                  },
                  "src": "28323:97:0"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 1624,
                  "name": "LogFlashLoan",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 1623,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1614,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "borrower",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1624,
                        "src": "28445:24:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1613,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "28445:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1616,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1624,
                        "src": "28471:20:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$67",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 1615,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 67,
                          "src": "28471:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$67",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1618,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1624,
                        "src": "28493:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1617,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "28493:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1620,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "feeAmount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1624,
                        "src": "28509:17:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1619,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "28509:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1622,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "receiver",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1624,
                        "src": "28528:24:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1621,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "28528:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "28444:109:0"
                  },
                  "src": "28426:128:0"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 1630,
                  "name": "LogStrategyTargetPercentage",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 1629,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1626,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1630,
                        "src": "28594:20:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$67",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 1625,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 67,
                          "src": "28594:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$67",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1628,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "targetPercentage",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1630,
                        "src": "28616:24:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1627,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "28616:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "28593:48:0"
                  },
                  "src": "28560:82:0"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 1636,
                  "name": "LogStrategyQueued",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 1635,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1632,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1636,
                        "src": "28671:20:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$67",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 1631,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 67,
                          "src": "28671:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$67",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1634,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "strategy",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1636,
                        "src": "28693:26:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IStrategy_$142",
                          "typeString": "contract IStrategy"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 1633,
                          "name": "IStrategy",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 142,
                          "src": "28693:9:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IStrategy_$142",
                            "typeString": "contract IStrategy"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "28670:50:0"
                  },
                  "src": "28647:74:0"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 1642,
                  "name": "LogStrategySet",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 1641,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1638,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1642,
                        "src": "28747:20:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$67",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 1637,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 67,
                          "src": "28747:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$67",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1640,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "strategy",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1642,
                        "src": "28769:26:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IStrategy_$142",
                          "typeString": "contract IStrategy"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 1639,
                          "name": "IStrategy",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 142,
                          "src": "28769:9:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IStrategy_$142",
                            "typeString": "contract IStrategy"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "28746:50:0"
                  },
                  "src": "28726:71:0"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 1648,
                  "name": "LogStrategyInvest",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 1647,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1644,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1648,
                        "src": "28826:20:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$67",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 1643,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 67,
                          "src": "28826:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$67",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1646,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1648,
                        "src": "28848:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1645,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "28848:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "28825:38:0"
                  },
                  "src": "28802:62:0"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 1654,
                  "name": "LogStrategyDivest",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 1653,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1650,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1654,
                        "src": "28893:20:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$67",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 1649,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 67,
                          "src": "28893:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$67",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1652,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1654,
                        "src": "28915:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1651,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "28915:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "28892:38:0"
                  },
                  "src": "28869:62:0"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 1660,
                  "name": "LogStrategyProfit",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 1659,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1656,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1660,
                        "src": "28960:20:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$67",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 1655,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 67,
                          "src": "28960:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$67",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1658,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1660,
                        "src": "28982:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1657,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "28982:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "28959:38:0"
                  },
                  "src": "28936:62:0"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 1666,
                  "name": "LogStrategyLoss",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 1665,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1662,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1666,
                        "src": "29025:20:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$67",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 1661,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 67,
                          "src": "29025:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$67",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1664,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1666,
                        "src": "29047:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1663,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "29047:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "29024:38:0"
                  },
                  "src": "29003:60:0"
                },
                {
                  "canonicalName": "BentoBoxV1.StrategyData",
                  "id": 1673,
                  "members": [
                    {
                      "constant": false,
                      "id": 1668,
                      "mutability": "mutable",
                      "name": "strategyStartDate",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 1673,
                      "src": "29178:24:0",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint64",
                        "typeString": "uint64"
                      },
                      "typeName": {
                        "id": 1667,
                        "name": "uint64",
                        "nodeType": "ElementaryTypeName",
                        "src": "29178:6:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint64",
                          "typeString": "uint64"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    },
                    {
                      "constant": false,
                      "id": 1670,
                      "mutability": "mutable",
                      "name": "targetPercentage",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 1673,
                      "src": "29212:23:0",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint64",
                        "typeString": "uint64"
                      },
                      "typeName": {
                        "id": 1669,
                        "name": "uint64",
                        "nodeType": "ElementaryTypeName",
                        "src": "29212:6:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint64",
                          "typeString": "uint64"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    },
                    {
                      "constant": false,
                      "id": 1672,
                      "mutability": "mutable",
                      "name": "balance",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 1673,
                      "src": "29245:15:0",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint128",
                        "typeString": "uint128"
                      },
                      "typeName": {
                        "id": 1671,
                        "name": "uint128",
                        "nodeType": "ElementaryTypeName",
                        "src": "29245:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint128",
                          "typeString": "uint128"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "name": "StrategyData",
                  "nodeType": "StructDefinition",
                  "scope": 3101,
                  "src": "29148:183:0",
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "id": 1675,
                  "mutability": "immutable",
                  "name": "wethToken",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 3101,
                  "src": "29588:34:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_IERC20_$67",
                    "typeString": "contract IERC20"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 1674,
                    "name": "IERC20",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 67,
                    "src": "29588:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IERC20_$67",
                      "typeString": "contract IERC20"
                    }
                  },
                  "value": null,
                  "visibility": "private"
                },
                {
                  "constant": true,
                  "id": 1680,
                  "mutability": "constant",
                  "name": "USE_ETHEREUM",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 3101,
                  "src": "29629:48:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_IERC20_$67",
                    "typeString": "contract IERC20"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 1676,
                    "name": "IERC20",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 67,
                    "src": "29629:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IERC20_$67",
                      "typeString": "contract IERC20"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "hexValue": "30",
                        "id": 1678,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "number",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "29675:1:0",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_rational_0_by_1",
                          "typeString": "int_const 0"
                        },
                        "value": "0"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_rational_0_by_1",
                          "typeString": "int_const 0"
                        }
                      ],
                      "id": 1677,
                      "name": "IERC20",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 67,
                      "src": "29668:6:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_type$_t_contract$_IERC20_$67_$",
                        "typeString": "type(contract IERC20)"
                      }
                    },
                    "id": 1679,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "typeConversion",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "29668:9:0",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IERC20_$67",
                      "typeString": "contract IERC20"
                    }
                  },
                  "visibility": "private"
                },
                {
                  "constant": true,
                  "id": 1683,
                  "mutability": "constant",
                  "name": "FLASH_LOAN_FEE",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 3101,
                  "src": "29683:44:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1681,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "29683:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "3530",
                    "id": 1682,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "29725:2:0",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_50_by_1",
                      "typeString": "int_const 50"
                    },
                    "value": "50"
                  },
                  "visibility": "private"
                },
                {
                  "constant": true,
                  "id": 1686,
                  "mutability": "constant",
                  "name": "FLASH_LOAN_FEE_PRECISION",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 3101,
                  "src": "29742:55:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1684,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "29742:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "316535",
                    "id": 1685,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "29794:3:0",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_100000_by_1",
                      "typeString": "int_const 100000"
                    },
                    "value": "1e5"
                  },
                  "visibility": "private"
                },
                {
                  "constant": true,
                  "id": 1689,
                  "mutability": "constant",
                  "name": "STRATEGY_DELAY",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 3101,
                  "src": "29803:49:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1687,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "29803:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "32",
                    "id": 1688,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "29845:7:0",
                    "subdenomination": "weeks",
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_1209600_by_1",
                      "typeString": "int_const 1209600"
                    },
                    "value": "2"
                  },
                  "visibility": "private"
                },
                {
                  "constant": true,
                  "id": 1692,
                  "mutability": "constant",
                  "name": "MAX_TARGET_PERCENTAGE",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 3101,
                  "src": "29858:51:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1690,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "29858:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "3935",
                    "id": 1691,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "29907:2:0",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_95_by_1",
                      "typeString": "int_const 95"
                    },
                    "value": "95"
                  },
                  "visibility": "private"
                },
                {
                  "constant": true,
                  "id": 1695,
                  "mutability": "constant",
                  "name": "MINIMUM_SHARE_BALANCE",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 3101,
                  "src": "29922:53:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1693,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "29922:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "31303030",
                    "id": 1694,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "29971:4:0",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_1000_by_1",
                      "typeString": "int_const 1000"
                    },
                    "value": "1000"
                  },
                  "visibility": "private"
                },
                {
                  "constant": false,
                  "functionSelector": "f7888aec",
                  "id": 1701,
                  "mutability": "mutable",
                  "name": "balanceOf",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 3101,
                  "src": "30157:63:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_mapping$_t_contract$_IERC20_$67_$_t_mapping$_t_address_$_t_uint256_$_$",
                    "typeString": "mapping(contract IERC20 => mapping(address => uint256))"
                  },
                  "typeName": {
                    "id": 1700,
                    "keyType": {
                      "contractScope": null,
                      "id": 1696,
                      "name": "IERC20",
                      "nodeType": "UserDefinedTypeName",
                      "referencedDeclaration": 67,
                      "src": "30165:6:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_IERC20_$67",
                        "typeString": "contract IERC20"
                      }
                    },
                    "nodeType": "Mapping",
                    "src": "30157:46:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_mapping$_t_contract$_IERC20_$67_$_t_mapping$_t_address_$_t_uint256_$_$",
                      "typeString": "mapping(contract IERC20 => mapping(address => uint256))"
                    },
                    "valueType": {
                      "id": 1699,
                      "keyType": {
                        "id": 1697,
                        "name": "address",
                        "nodeType": "ElementaryTypeName",
                        "src": "30183:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "nodeType": "Mapping",
                      "src": "30175:27:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                        "typeString": "mapping(address => uint256)"
                      },
                      "valueType": {
                        "id": 1698,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "30194:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "functionSelector": "4ffe34db",
                  "id": 1705,
                  "mutability": "mutable",
                  "name": "totals",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 3101,
                  "src": "30262:39:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_mapping$_t_contract$_IERC20_$67_$_t_struct$_Rebase_$550_storage_$",
                    "typeString": "mapping(contract IERC20 => struct Rebase)"
                  },
                  "typeName": {
                    "id": 1704,
                    "keyType": {
                      "contractScope": null,
                      "id": 1702,
                      "name": "IERC20",
                      "nodeType": "UserDefinedTypeName",
                      "referencedDeclaration": 67,
                      "src": "30270:6:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_IERC20_$67",
                        "typeString": "contract IERC20"
                      }
                    },
                    "nodeType": "Mapping",
                    "src": "30262:25:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_mapping$_t_contract$_IERC20_$67_$_t_struct$_Rebase_$550_storage_$",
                      "typeString": "mapping(contract IERC20 => struct Rebase)"
                    },
                    "valueType": {
                      "contractScope": null,
                      "id": 1703,
                      "name": "Rebase",
                      "nodeType": "UserDefinedTypeName",
                      "referencedDeclaration": 550,
                      "src": "30280:6:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_Rebase_$550_storage_ptr",
                        "typeString": "struct Rebase"
                      }
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "functionSelector": "228bfd9f",
                  "id": 1709,
                  "mutability": "mutable",
                  "name": "strategy",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 3101,
                  "src": "30308:44:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_mapping$_t_contract$_IERC20_$67_$_t_contract$_IStrategy_$142_$",
                    "typeString": "mapping(contract IERC20 => contract IStrategy)"
                  },
                  "typeName": {
                    "id": 1708,
                    "keyType": {
                      "contractScope": null,
                      "id": 1706,
                      "name": "IERC20",
                      "nodeType": "UserDefinedTypeName",
                      "referencedDeclaration": 67,
                      "src": "30316:6:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_IERC20_$67",
                        "typeString": "contract IERC20"
                      }
                    },
                    "nodeType": "Mapping",
                    "src": "30308:28:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_mapping$_t_contract$_IERC20_$67_$_t_contract$_IStrategy_$142_$",
                      "typeString": "mapping(contract IERC20 => contract IStrategy)"
                    },
                    "valueType": {
                      "contractScope": null,
                      "id": 1707,
                      "name": "IStrategy",
                      "nodeType": "UserDefinedTypeName",
                      "referencedDeclaration": 142,
                      "src": "30326:9:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_IStrategy_$142",
                        "typeString": "contract IStrategy"
                      }
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "functionSelector": "5108a558",
                  "id": 1713,
                  "mutability": "mutable",
                  "name": "pendingStrategy",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 3101,
                  "src": "30358:51:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_mapping$_t_contract$_IERC20_$67_$_t_contract$_IStrategy_$142_$",
                    "typeString": "mapping(contract IERC20 => contract IStrategy)"
                  },
                  "typeName": {
                    "id": 1712,
                    "keyType": {
                      "contractScope": null,
                      "id": 1710,
                      "name": "IERC20",
                      "nodeType": "UserDefinedTypeName",
                      "referencedDeclaration": 67,
                      "src": "30366:6:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_IERC20_$67",
                        "typeString": "contract IERC20"
                      }
                    },
                    "nodeType": "Mapping",
                    "src": "30358:28:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_mapping$_t_contract$_IERC20_$67_$_t_contract$_IStrategy_$142_$",
                      "typeString": "mapping(contract IERC20 => contract IStrategy)"
                    },
                    "valueType": {
                      "contractScope": null,
                      "id": 1711,
                      "name": "IStrategy",
                      "nodeType": "UserDefinedTypeName",
                      "referencedDeclaration": 142,
                      "src": "30376:9:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_IStrategy_$142",
                        "typeString": "contract IStrategy"
                      }
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "functionSelector": "df23b45b",
                  "id": 1717,
                  "mutability": "mutable",
                  "name": "strategyData",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 3101,
                  "src": "30415:51:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_mapping$_t_contract$_IERC20_$67_$_t_struct$_StrategyData_$1673_storage_$",
                    "typeString": "mapping(contract IERC20 => struct BentoBoxV1.StrategyData)"
                  },
                  "typeName": {
                    "id": 1716,
                    "keyType": {
                      "contractScope": null,
                      "id": 1714,
                      "name": "IERC20",
                      "nodeType": "UserDefinedTypeName",
                      "referencedDeclaration": 67,
                      "src": "30423:6:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_IERC20_$67",
                        "typeString": "contract IERC20"
                      }
                    },
                    "nodeType": "Mapping",
                    "src": "30415:31:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_mapping$_t_contract$_IERC20_$67_$_t_struct$_StrategyData_$1673_storage_$",
                      "typeString": "mapping(contract IERC20 => struct BentoBoxV1.StrategyData)"
                    },
                    "valueType": {
                      "contractScope": null,
                      "id": 1715,
                      "name": "StrategyData",
                      "nodeType": "UserDefinedTypeName",
                      "referencedDeclaration": 1673,
                      "src": "30433:12:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_StrategyData_$1673_storage_ptr",
                        "typeString": "struct BentoBoxV1.StrategyData"
                      }
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 1726,
                    "nodeType": "Block",
                    "src": "30602:39:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 1724,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 1722,
                            "name": "wethToken",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1675,
                            "src": "30612:9:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC20_$67",
                              "typeString": "contract IERC20"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 1723,
                            "name": "wethToken_",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1719,
                            "src": "30624:10:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC20_$67",
                              "typeString": "contract IERC20"
                            }
                          },
                          "src": "30612:22:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$67",
                            "typeString": "contract IERC20"
                          }
                        },
                        "id": 1725,
                        "nodeType": "ExpressionStatement",
                        "src": "30612:22:0"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 1727,
                  "implemented": true,
                  "kind": "constructor",
                  "modifiers": [],
                  "name": "",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1720,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1719,
                        "mutability": "mutable",
                        "name": "wethToken_",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1727,
                        "src": "30576:17:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$67",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 1718,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 67,
                          "src": "30576:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$67",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "30575:19:0"
                  },
                  "returnParameters": {
                    "id": 1721,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "30602:0:0"
                  },
                  "scope": 3101,
                  "src": "30564:77:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 1772,
                    "nodeType": "Block",
                    "src": "31320:388:0",
                    "statements": [
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          },
                          "id": 1742,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            },
                            "id": 1735,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "id": 1732,
                              "name": "from",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1730,
                              "src": "31334:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "!=",
                            "rightExpression": {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 1733,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "31342:3:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 1734,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "31342:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            "src": "31334:18:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "&&",
                          "rightExpression": {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            },
                            "id": 1741,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "id": 1736,
                              "name": "from",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1730,
                              "src": "31356:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "!=",
                            "rightExpression": {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 1739,
                                  "name": "this",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -28,
                                  "src": "31372:4:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_BentoBoxV1_$3101",
                                    "typeString": "contract BentoBoxV1"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_BentoBoxV1_$3101",
                                    "typeString": "contract BentoBoxV1"
                                  }
                                ],
                                "id": 1738,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "31364:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 1737,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "31364:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 1740,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "31364:13:0",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            "src": "31356:21:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "src": "31334:43:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 1770,
                        "nodeType": "IfStatement",
                        "src": "31330:361:0",
                        "trueBody": {
                          "id": 1769,
                          "nodeType": "Block",
                          "src": "31379:312:0",
                          "statements": [
                            {
                              "assignments": [
                                1744
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 1744,
                                  "mutability": "mutable",
                                  "name": "masterContract",
                                  "nodeType": "VariableDeclaration",
                                  "overrides": null,
                                  "scope": 1769,
                                  "src": "31443:22:0",
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  "typeName": {
                                    "id": 1743,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "31443:7:0",
                                    "stateMutability": "nonpayable",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  "value": null,
                                  "visibility": "internal"
                                }
                              ],
                              "id": 1749,
                              "initialValue": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "id": 1745,
                                  "name": "masterContractOf",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1046,
                                  "src": "31468:16:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_mapping$_t_address_$_t_address_$",
                                    "typeString": "mapping(address => address)"
                                  }
                                },
                                "id": 1748,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 1746,
                                    "name": "msg",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": -15,
                                    "src": "31485:3:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_magic_message",
                                      "typeString": "msg"
                                    }
                                  },
                                  "id": 1747,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "sender",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": null,
                                  "src": "31485:10:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address_payable",
                                    "typeString": "address payable"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "31468:28:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "nodeType": "VariableDeclarationStatement",
                              "src": "31443:53:0"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "commonType": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    "id": 1756,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "leftExpression": {
                                      "argumentTypes": null,
                                      "id": 1751,
                                      "name": "masterContract",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1744,
                                      "src": "31518:14:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      }
                                    },
                                    "nodeType": "BinaryOperation",
                                    "operator": "!=",
                                    "rightExpression": {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "hexValue": "30",
                                          "id": 1754,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": true,
                                          "kind": "number",
                                          "lValueRequested": false,
                                          "nodeType": "Literal",
                                          "src": "31544:1:0",
                                          "subdenomination": null,
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_rational_0_by_1",
                                            "typeString": "int_const 0"
                                          },
                                          "value": "0"
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_rational_0_by_1",
                                            "typeString": "int_const 0"
                                          }
                                        ],
                                        "id": 1753,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": true,
                                        "lValueRequested": false,
                                        "nodeType": "ElementaryTypeNameExpression",
                                        "src": "31536:7:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_type$_t_address_$",
                                          "typeString": "type(address)"
                                        },
                                        "typeName": {
                                          "id": 1752,
                                          "name": "address",
                                          "nodeType": "ElementaryTypeName",
                                          "src": "31536:7:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": null,
                                            "typeString": null
                                          }
                                        }
                                      },
                                      "id": 1755,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "kind": "typeConversion",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "31536:10:0",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_address_payable",
                                        "typeString": "address payable"
                                      }
                                    },
                                    "src": "31518:28:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "42656e746f426f783a206e6f206d6173746572436f6e7472616374",
                                    "id": 1757,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "string",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "31548:29:0",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_stringliteral_d7d14096df5afc631fdc9eae262be0c2759632108b3c050dfdb6c6addefce167",
                                      "typeString": "literal_string \"BentoBox: no masterContract\""
                                    },
                                    "value": "BentoBox: no masterContract"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    },
                                    {
                                      "typeIdentifier": "t_stringliteral_d7d14096df5afc631fdc9eae262be0c2759632108b3c050dfdb6c6addefce167",
                                      "typeString": "literal_string \"BentoBox: no masterContract\""
                                    }
                                  ],
                                  "id": 1750,
                                  "name": "require",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [
                                    -18,
                                    -18
                                  ],
                                  "referencedDeclaration": -18,
                                  "src": "31510:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                                    "typeString": "function (bool,string memory) pure"
                                  }
                                },
                                "id": 1758,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "31510:68:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 1759,
                              "nodeType": "ExpressionStatement",
                              "src": "31510:68:0"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "baseExpression": {
                                      "argumentTypes": null,
                                      "baseExpression": {
                                        "argumentTypes": null,
                                        "id": 1761,
                                        "name": "masterContractApproved",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 1140,
                                        "src": "31600:22:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_bool_$_$",
                                          "typeString": "mapping(address => mapping(address => bool))"
                                        }
                                      },
                                      "id": 1763,
                                      "indexExpression": {
                                        "argumentTypes": null,
                                        "id": 1762,
                                        "name": "masterContract",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 1744,
                                        "src": "31623:14:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_address",
                                          "typeString": "address"
                                        }
                                      },
                                      "isConstant": false,
                                      "isLValue": true,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "nodeType": "IndexAccess",
                                      "src": "31600:38:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                                        "typeString": "mapping(address => bool)"
                                      }
                                    },
                                    "id": 1765,
                                    "indexExpression": {
                                      "argumentTypes": null,
                                      "id": 1764,
                                      "name": "from",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1730,
                                      "src": "31639:4:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      }
                                    },
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "nodeType": "IndexAccess",
                                    "src": "31600:44:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "42656e746f426f783a205472616e73666572206e6f7420617070726f766564",
                                    "id": 1766,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "string",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "31646:33:0",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_stringliteral_a5886c03122dc256fde2b6d013592d60118b2df18772ec3172671a4b2bcdd8ac",
                                      "typeString": "literal_string \"BentoBox: Transfer not approved\""
                                    },
                                    "value": "BentoBox: Transfer not approved"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    },
                                    {
                                      "typeIdentifier": "t_stringliteral_a5886c03122dc256fde2b6d013592d60118b2df18772ec3172671a4b2bcdd8ac",
                                      "typeString": "literal_string \"BentoBox: Transfer not approved\""
                                    }
                                  ],
                                  "id": 1760,
                                  "name": "require",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [
                                    -18,
                                    -18
                                  ],
                                  "referencedDeclaration": -18,
                                  "src": "31592:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                                    "typeString": "function (bool,string memory) pure"
                                  }
                                },
                                "id": 1767,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "31592:88:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 1768,
                              "nodeType": "ExpressionStatement",
                              "src": "31592:88:0"
                            }
                          ]
                        }
                      },
                      {
                        "id": 1771,
                        "nodeType": "PlaceholderStatement",
                        "src": "31700:1:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 1728,
                    "nodeType": "StructuredDocumentation",
                    "src": "30732:552:0",
                    "text": "Modifier to check if the msg.sender is allowed to use funds belonging to the 'from' address.\n If 'from' is msg.sender, it's allowed.\n If 'from' is the BentoBox itself, it's allowed. Any ETH, token balances (above the known balances) or BentoBox balances\n can be taken by anyone.\n This is to enable skimming, not just for deposits, but also for withdrawals or transfers, enabling better composability.\n If 'from' is a clone of a masterContract AND the 'from' address has approved that masterContract, it's allowed."
                  },
                  "id": 1773,
                  "name": "allowed",
                  "nodeType": "ModifierDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1731,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1730,
                        "mutability": "mutable",
                        "name": "from",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1773,
                        "src": "31306:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1729,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "31306:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "31305:14:0"
                  },
                  "src": "31289:419:0",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 1797,
                    "nodeType": "Block",
                    "src": "32047:89:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 1795,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 1781,
                            "name": "amount",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1779,
                            "src": "32057:6:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "baseExpression": {
                                    "argumentTypes": null,
                                    "id": 1790,
                                    "name": "strategyData",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1717,
                                    "src": "32101:12:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_mapping$_t_contract$_IERC20_$67_$_t_struct$_StrategyData_$1673_storage_$",
                                      "typeString": "mapping(contract IERC20 => struct BentoBoxV1.StrategyData storage ref)"
                                    }
                                  },
                                  "id": 1792,
                                  "indexExpression": {
                                    "argumentTypes": null,
                                    "id": 1791,
                                    "name": "token",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1776,
                                    "src": "32114:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IERC20_$67",
                                      "typeString": "contract IERC20"
                                    }
                                  },
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "nodeType": "IndexAccess",
                                  "src": "32101:19:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_struct$_StrategyData_$1673_storage",
                                    "typeString": "struct BentoBoxV1.StrategyData storage ref"
                                  }
                                },
                                "id": 1793,
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "balance",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 1672,
                                "src": "32101:27:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "id": 1786,
                                        "name": "this",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": -28,
                                        "src": "32090:4:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_contract$_BentoBoxV1_$3101",
                                          "typeString": "contract BentoBoxV1"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_contract$_BentoBoxV1_$3101",
                                          "typeString": "contract BentoBoxV1"
                                        }
                                      ],
                                      "id": 1785,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "lValueRequested": false,
                                      "nodeType": "ElementaryTypeNameExpression",
                                      "src": "32082:7:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_type$_t_address_$",
                                        "typeString": "type(address)"
                                      },
                                      "typeName": {
                                        "id": 1784,
                                        "name": "address",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "32082:7:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": null,
                                          "typeString": null
                                        }
                                      }
                                    },
                                    "id": 1787,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "typeConversion",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "32082:13:0",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address_payable",
                                      "typeString": "address payable"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_address_payable",
                                      "typeString": "address payable"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 1782,
                                    "name": "token",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1776,
                                    "src": "32066:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IERC20_$67",
                                      "typeString": "contract IERC20"
                                    }
                                  },
                                  "id": 1783,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "balanceOf",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 14,
                                  "src": "32066:15:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$",
                                    "typeString": "function (address) view external returns (uint256)"
                                  }
                                },
                                "id": 1788,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "32066:30:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 1789,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "add",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 278,
                              "src": "32066:34:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                "typeString": "function (uint256,uint256) pure returns (uint256)"
                              }
                            },
                            "id": 1794,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "32066:63:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "32057:72:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 1796,
                        "nodeType": "ExpressionStatement",
                        "src": "32057:72:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 1774,
                    "nodeType": "StructuredDocumentation",
                    "src": "31826:138:0",
                    "text": "@dev Returns the total balance of `token` this contracts holds,\n plus the total amount this contract thinks the strategy holds."
                  },
                  "id": 1798,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_tokenBalanceOf",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1777,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1776,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1798,
                        "src": "31994:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$67",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 1775,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 67,
                          "src": "31994:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$67",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "31993:14:0"
                  },
                  "returnParameters": {
                    "id": 1780,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1779,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1798,
                        "src": "32031:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1778,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "32031:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "32030:16:0"
                  },
                  "scope": 3101,
                  "src": "31969:167:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 1820,
                    "nodeType": "Block",
                    "src": "32663:62:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 1818,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 1810,
                            "name": "share",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1808,
                            "src": "32673:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 1815,
                                "name": "amount",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1803,
                                "src": "32702:6:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              {
                                "argumentTypes": null,
                                "id": 1816,
                                "name": "roundUp",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1805,
                                "src": "32710:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "id": 1811,
                                  "name": "totals",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1705,
                                  "src": "32681:6:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_mapping$_t_contract$_IERC20_$67_$_t_struct$_Rebase_$550_storage_$",
                                    "typeString": "mapping(contract IERC20 => struct Rebase storage ref)"
                                  }
                                },
                                "id": 1813,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "id": 1812,
                                  "name": "token",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1801,
                                  "src": "32688:5:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_IERC20_$67",
                                    "typeString": "contract IERC20"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "32681:13:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_Rebase_$550_storage",
                                  "typeString": "struct Rebase storage ref"
                                }
                              },
                              "id": 1814,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "toBase",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 613,
                              "src": "32681:20:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_struct$_Rebase_$550_memory_ptr_$_t_uint256_$_t_bool_$returns$_t_uint256_$bound_to$_t_struct$_Rebase_$550_memory_ptr_$",
                                "typeString": "function (struct Rebase memory,uint256,bool) pure returns (uint256)"
                              }
                            },
                            "id": 1817,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "32681:37:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "32673:45:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 1819,
                        "nodeType": "ExpressionStatement",
                        "src": "32673:45:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 1799,
                    "nodeType": "StructuredDocumentation",
                    "src": "32248:281:0",
                    "text": "@dev Helper function to represent an `amount` of `token` in shares.\n @param token The ERC-20 token.\n @param amount The `token` amount.\n @param roundUp If the result `share` should be rounded up.\n @return share The token amount represented in shares."
                  },
                  "functionSelector": "da5139ca",
                  "id": 1821,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "toShare",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1806,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1801,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1821,
                        "src": "32560:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$67",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 1800,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 67,
                          "src": "32560:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$67",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1803,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1821,
                        "src": "32582:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1802,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "32582:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1805,
                        "mutability": "mutable",
                        "name": "roundUp",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1821,
                        "src": "32606:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 1804,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "32606:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "32550:74:0"
                  },
                  "returnParameters": {
                    "id": 1809,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1808,
                        "mutability": "mutable",
                        "name": "share",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1821,
                        "src": "32648:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1807,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "32648:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "32647:15:0"
                  },
                  "scope": 3101,
                  "src": "32534:191:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 1843,
                    "nodeType": "Block",
                    "src": "33151:65:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 1841,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 1833,
                            "name": "amount",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1831,
                            "src": "33161:6:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 1838,
                                "name": "share",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1826,
                                "src": "33194:5:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              {
                                "argumentTypes": null,
                                "id": 1839,
                                "name": "roundUp",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1828,
                                "src": "33201:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "id": 1834,
                                  "name": "totals",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1705,
                                  "src": "33170:6:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_mapping$_t_contract$_IERC20_$67_$_t_struct$_Rebase_$550_storage_$",
                                    "typeString": "mapping(contract IERC20 => struct Rebase storage ref)"
                                  }
                                },
                                "id": 1836,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "id": 1835,
                                  "name": "token",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1824,
                                  "src": "33177:5:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_IERC20_$67",
                                    "typeString": "contract IERC20"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "33170:13:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_Rebase_$550_storage",
                                  "typeString": "struct Rebase storage ref"
                                }
                              },
                              "id": 1837,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "toElastic",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 669,
                              "src": "33170:23:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_struct$_Rebase_$550_memory_ptr_$_t_uint256_$_t_bool_$returns$_t_uint256_$bound_to$_t_struct$_Rebase_$550_memory_ptr_$",
                                "typeString": "function (struct Rebase memory,uint256,bool) pure returns (uint256)"
                              }
                            },
                            "id": 1840,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "33170:39:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "33161:48:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 1842,
                        "nodeType": "ExpressionStatement",
                        "src": "33161:48:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 1822,
                    "nodeType": "StructuredDocumentation",
                    "src": "32731:285:0",
                    "text": "@dev Helper function represent shares back into the `token` amount.\n @param token The ERC-20 token.\n @param share The amount of shares.\n @param roundUp If the result should be rounded up.\n @return amount The share amount back into native representation."
                  },
                  "functionSelector": "56623118",
                  "id": 1844,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "toAmount",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1829,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1824,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1844,
                        "src": "33048:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$67",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 1823,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 67,
                          "src": "33048:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$67",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1826,
                        "mutability": "mutable",
                        "name": "share",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1844,
                        "src": "33070:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1825,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "33070:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1828,
                        "mutability": "mutable",
                        "name": "roundUp",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1844,
                        "src": "33093:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 1827,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "33093:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "33038:73:0"
                  },
                  "returnParameters": {
                    "id": 1832,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1831,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1844,
                        "src": "33135:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1830,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "33135:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "33134:16:0"
                  },
                  "scope": 3101,
                  "src": "33021:195:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 2061,
                    "nodeType": "Block",
                    "src": "33965:2620:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 1871,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 1866,
                                "name": "to",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1851,
                                "src": "34001:2:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "!=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "30",
                                    "id": 1869,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "34015:1:0",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    },
                                    "value": "0"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    }
                                  ],
                                  "id": 1868,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "34007:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 1867,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "34007:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 1870,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "34007:10:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "src": "34001:16:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "42656e746f426f783a20746f206e6f7420736574",
                              "id": 1872,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "34019:22:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_8fe0a0ebc94ce87b7060385c1233e1d905bbe8354ad627a6edf6dbd8f627ab3c",
                                "typeString": "literal_string \"BentoBox: to not set\""
                              },
                              "value": "BentoBox: to not set"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_8fe0a0ebc94ce87b7060385c1233e1d905bbe8354ad627a6edf6dbd8f627ab3c",
                                "typeString": "literal_string \"BentoBox: to not set\""
                              }
                            ],
                            "id": 1865,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "33993:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 1873,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "33993:49:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1874,
                        "nodeType": "ExpressionStatement",
                        "src": "33993:49:0"
                      },
                      {
                        "assignments": [
                          1876
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 1876,
                            "mutability": "mutable",
                            "name": "token",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 2061,
                            "src": "34112:12:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC20_$67",
                              "typeString": "contract IERC20"
                            },
                            "typeName": {
                              "contractScope": null,
                              "id": 1875,
                              "name": "IERC20",
                              "nodeType": "UserDefinedTypeName",
                              "referencedDeclaration": 67,
                              "src": "34112:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$67",
                                "typeString": "contract IERC20"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 1883,
                        "initialValue": {
                          "argumentTypes": null,
                          "condition": {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_contract$_IERC20_$67",
                              "typeString": "contract IERC20"
                            },
                            "id": 1879,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "id": 1877,
                              "name": "token_",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1847,
                              "src": "34127:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$67",
                                "typeString": "contract IERC20"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "==",
                            "rightExpression": {
                              "argumentTypes": null,
                              "id": 1878,
                              "name": "USE_ETHEREUM",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1680,
                              "src": "34137:12:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$67",
                                "typeString": "contract IERC20"
                              }
                            },
                            "src": "34127:22:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "falseExpression": {
                            "argumentTypes": null,
                            "id": 1881,
                            "name": "token_",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1847,
                            "src": "34164:6:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC20_$67",
                              "typeString": "contract IERC20"
                            }
                          },
                          "id": 1882,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "Conditional",
                          "src": "34127:43:0",
                          "trueExpression": {
                            "argumentTypes": null,
                            "id": 1880,
                            "name": "wethToken",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1675,
                            "src": "34152:9:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC20_$67",
                              "typeString": "contract IERC20"
                            }
                          },
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$67",
                            "typeString": "contract IERC20"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "34112:58:0"
                      },
                      {
                        "assignments": [
                          1885
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 1885,
                            "mutability": "mutable",
                            "name": "total",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 2061,
                            "src": "34180:19:0",
                            "stateVariable": false,
                            "storageLocation": "memory",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_Rebase_$550_memory_ptr",
                              "typeString": "struct Rebase"
                            },
                            "typeName": {
                              "contractScope": null,
                              "id": 1884,
                              "name": "Rebase",
                              "nodeType": "UserDefinedTypeName",
                              "referencedDeclaration": 550,
                              "src": "34180:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Rebase_$550_storage_ptr",
                                "typeString": "struct Rebase"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 1889,
                        "initialValue": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "id": 1886,
                            "name": "totals",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1705,
                            "src": "34202:6:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_contract$_IERC20_$67_$_t_struct$_Rebase_$550_storage_$",
                              "typeString": "mapping(contract IERC20 => struct Rebase storage ref)"
                            }
                          },
                          "id": 1888,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 1887,
                            "name": "token",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1876,
                            "src": "34209:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC20_$67",
                              "typeString": "contract IERC20"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "34202:13:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Rebase_$550_storage",
                            "typeString": "struct Rebase storage ref"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "34180:35:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              "id": 1900,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                },
                                "id": 1894,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 1891,
                                    "name": "total",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1885,
                                    "src": "34355:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_struct$_Rebase_$550_memory_ptr",
                                      "typeString": "struct Rebase memory"
                                    }
                                  },
                                  "id": 1892,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "elastic",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 547,
                                  "src": "34355:13:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint128",
                                    "typeString": "uint128"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "!=",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "hexValue": "30",
                                  "id": 1893,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "34372:1:0",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  },
                                  "value": "0"
                                },
                                "src": "34355:18:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "||",
                              "rightExpression": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                "id": 1899,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "arguments": [],
                                  "expression": {
                                    "argumentTypes": [],
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 1895,
                                      "name": "token",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1876,
                                      "src": "34377:5:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_IERC20_$67",
                                        "typeString": "contract IERC20"
                                      }
                                    },
                                    "id": 1896,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "totalSupply",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 7,
                                    "src": "34377:17:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_external_view$__$returns$_t_uint256_$",
                                      "typeString": "function () view external returns (uint256)"
                                    }
                                  },
                                  "id": 1897,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "34377:19:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": ">",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "hexValue": "30",
                                  "id": 1898,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "34399:1:0",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  },
                                  "value": "0"
                                },
                                "src": "34377:23:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "src": "34355:45:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "42656e746f426f783a204e6f20746f6b656e73",
                              "id": 1901,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "34402:21:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_4e9af363c0eb225433acce27bef4ffc78237802324193bedd0cef86db26aa88a",
                                "typeString": "literal_string \"BentoBox: No tokens\""
                              },
                              "value": "BentoBox: No tokens"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_4e9af363c0eb225433acce27bef4ffc78237802324193bedd0cef86db26aa88a",
                                "typeString": "literal_string \"BentoBox: No tokens\""
                              }
                            ],
                            "id": 1890,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "34347:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 1902,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "34347:77:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1903,
                        "nodeType": "ExpressionStatement",
                        "src": "34347:77:0"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 1906,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 1904,
                            "name": "share",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1855,
                            "src": "34438:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 1905,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "34447:1:0",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "34438:10:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": {
                          "id": 1939,
                          "nodeType": "Block",
                          "src": "34843:186:0",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 1937,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "id": 1931,
                                  "name": "amount",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1853,
                                  "src": "34981:6:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 1934,
                                      "name": "share",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1855,
                                      "src": "35006:5:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    {
                                      "argumentTypes": null,
                                      "hexValue": "74727565",
                                      "id": 1935,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "kind": "bool",
                                      "lValueRequested": false,
                                      "nodeType": "Literal",
                                      "src": "35013:4:0",
                                      "subdenomination": null,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                      },
                                      "value": "true"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      },
                                      {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 1932,
                                      "name": "total",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1885,
                                      "src": "34990:5:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_Rebase_$550_memory_ptr",
                                        "typeString": "struct Rebase memory"
                                      }
                                    },
                                    "id": 1933,
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "toElastic",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 669,
                                    "src": "34990:15:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_internal_pure$_t_struct$_Rebase_$550_memory_ptr_$_t_uint256_$_t_bool_$returns$_t_uint256_$bound_to$_t_struct$_Rebase_$550_memory_ptr_$",
                                      "typeString": "function (struct Rebase memory,uint256,bool) pure returns (uint256)"
                                    }
                                  },
                                  "id": 1936,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "34990:28:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "34981:37:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 1938,
                              "nodeType": "ExpressionStatement",
                              "src": "34981:37:0"
                            }
                          ]
                        },
                        "id": 1940,
                        "nodeType": "IfStatement",
                        "src": "34434:595:0",
                        "trueBody": {
                          "id": 1930,
                          "nodeType": "Block",
                          "src": "34450:387:0",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 1913,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "id": 1907,
                                  "name": "share",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1855,
                                  "src": "34554:5:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 1910,
                                      "name": "amount",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1853,
                                      "src": "34575:6:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    {
                                      "argumentTypes": null,
                                      "hexValue": "66616c7365",
                                      "id": 1911,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "kind": "bool",
                                      "lValueRequested": false,
                                      "nodeType": "Literal",
                                      "src": "34583:5:0",
                                      "subdenomination": null,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                      },
                                      "value": "false"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      },
                                      {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 1908,
                                      "name": "total",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1885,
                                      "src": "34562:5:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_Rebase_$550_memory_ptr",
                                        "typeString": "struct Rebase memory"
                                      }
                                    },
                                    "id": 1909,
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "toBase",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 613,
                                    "src": "34562:12:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_internal_pure$_t_struct$_Rebase_$550_memory_ptr_$_t_uint256_$_t_bool_$returns$_t_uint256_$bound_to$_t_struct$_Rebase_$550_memory_ptr_$",
                                      "typeString": "function (struct Rebase memory,uint256,bool) pure returns (uint256)"
                                    }
                                  },
                                  "id": 1912,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "34562:27:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "34554:35:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 1914,
                              "nodeType": "ExpressionStatement",
                              "src": "34554:35:0"
                            },
                            {
                              "condition": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                "id": 1923,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "arguments": [],
                                      "expression": {
                                        "argumentTypes": [],
                                        "expression": {
                                          "argumentTypes": null,
                                          "id": 1918,
                                          "name": "share",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 1855,
                                          "src": "34741:5:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "id": 1919,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "memberName": "to128",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": 354,
                                        "src": "34741:11:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint128_$bound_to$_t_uint256_$",
                                          "typeString": "function (uint256) pure returns (uint128)"
                                        }
                                      },
                                      "id": 1920,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "34741:13:0",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint128",
                                        "typeString": "uint128"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_uint128",
                                        "typeString": "uint128"
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": null,
                                      "expression": {
                                        "argumentTypes": null,
                                        "id": 1915,
                                        "name": "total",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 1885,
                                        "src": "34726:5:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_struct$_Rebase_$550_memory_ptr",
                                          "typeString": "struct Rebase memory"
                                        }
                                      },
                                      "id": 1916,
                                      "isConstant": false,
                                      "isLValue": true,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "memberName": "base",
                                      "nodeType": "MemberAccess",
                                      "referencedDeclaration": 549,
                                      "src": "34726:10:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint128",
                                        "typeString": "uint128"
                                      }
                                    },
                                    "id": 1917,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "add",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 430,
                                    "src": "34726:14:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_internal_pure$_t_uint128_$_t_uint128_$returns$_t_uint128_$bound_to$_t_uint128_$",
                                      "typeString": "function (uint128,uint128) pure returns (uint128)"
                                    }
                                  },
                                  "id": 1921,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "34726:29:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint128",
                                    "typeString": "uint128"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "<",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "id": 1922,
                                  "name": "MINIMUM_SHARE_BALANCE",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1695,
                                  "src": "34758:21:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "34726:53:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "falseBody": null,
                              "id": 1929,
                              "nodeType": "IfStatement",
                              "src": "34722:105:0",
                              "trueBody": {
                                "id": 1928,
                                "nodeType": "Block",
                                "src": "34781:46:0",
                                "statements": [
                                  {
                                    "expression": {
                                      "argumentTypes": null,
                                      "components": [
                                        {
                                          "argumentTypes": null,
                                          "hexValue": "30",
                                          "id": 1924,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": true,
                                          "kind": "number",
                                          "lValueRequested": false,
                                          "nodeType": "Literal",
                                          "src": "34807:1:0",
                                          "subdenomination": null,
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_rational_0_by_1",
                                            "typeString": "int_const 0"
                                          },
                                          "value": "0"
                                        },
                                        {
                                          "argumentTypes": null,
                                          "hexValue": "30",
                                          "id": 1925,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": true,
                                          "kind": "number",
                                          "lValueRequested": false,
                                          "nodeType": "Literal",
                                          "src": "34810:1:0",
                                          "subdenomination": null,
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_rational_0_by_1",
                                            "typeString": "int_const 0"
                                          },
                                          "value": "0"
                                        }
                                      ],
                                      "id": 1926,
                                      "isConstant": false,
                                      "isInlineArray": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "lValueRequested": false,
                                      "nodeType": "TupleExpression",
                                      "src": "34806:6:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_tuple$_t_rational_0_by_1_$_t_rational_0_by_1_$",
                                        "typeString": "tuple(int_const 0,int_const 0)"
                                      }
                                    },
                                    "functionReturnParameters": 1864,
                                    "id": 1927,
                                    "nodeType": "Return",
                                    "src": "34799:13:0"
                                  }
                                ]
                              }
                            }
                          ]
                        }
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              "id": 1961,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                },
                                "id": 1951,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "commonType": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  "id": 1947,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "leftExpression": {
                                    "argumentTypes": null,
                                    "id": 1942,
                                    "name": "from",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1849,
                                    "src": "35343:4:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  "nodeType": "BinaryOperation",
                                  "operator": "!=",
                                  "rightExpression": {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "id": 1945,
                                        "name": "this",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": -28,
                                        "src": "35359:4:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_contract$_BentoBoxV1_$3101",
                                          "typeString": "contract BentoBoxV1"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_contract$_BentoBoxV1_$3101",
                                          "typeString": "contract BentoBoxV1"
                                        }
                                      ],
                                      "id": 1944,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "lValueRequested": false,
                                      "nodeType": "ElementaryTypeNameExpression",
                                      "src": "35351:7:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_type$_t_address_$",
                                        "typeString": "type(address)"
                                      },
                                      "typeName": {
                                        "id": 1943,
                                        "name": "address",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "35351:7:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": null,
                                          "typeString": null
                                        }
                                      }
                                    },
                                    "id": 1946,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "typeConversion",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "35351:13:0",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address_payable",
                                      "typeString": "address payable"
                                    }
                                  },
                                  "src": "35343:21:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "||",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "commonType": {
                                    "typeIdentifier": "t_contract$_IERC20_$67",
                                    "typeString": "contract IERC20"
                                  },
                                  "id": 1950,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "leftExpression": {
                                    "argumentTypes": null,
                                    "id": 1948,
                                    "name": "token_",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1847,
                                    "src": "35368:6:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IERC20_$67",
                                      "typeString": "contract IERC20"
                                    }
                                  },
                                  "nodeType": "BinaryOperation",
                                  "operator": "==",
                                  "rightExpression": {
                                    "argumentTypes": null,
                                    "id": 1949,
                                    "name": "USE_ETHEREUM",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1680,
                                    "src": "35378:12:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IERC20_$67",
                                      "typeString": "contract IERC20"
                                    }
                                  },
                                  "src": "35368:22:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                "src": "35343:47:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "||",
                              "rightExpression": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                "id": 1960,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "id": 1952,
                                  "name": "amount",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1853,
                                  "src": "35394:6:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "<=",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "expression": {
                                        "argumentTypes": null,
                                        "id": 1957,
                                        "name": "total",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 1885,
                                        "src": "35431:5:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_struct$_Rebase_$550_memory_ptr",
                                          "typeString": "struct Rebase memory"
                                        }
                                      },
                                      "id": 1958,
                                      "isConstant": false,
                                      "isLValue": true,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "memberName": "elastic",
                                      "nodeType": "MemberAccess",
                                      "referencedDeclaration": 547,
                                      "src": "35431:13:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint128",
                                        "typeString": "uint128"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_uint128",
                                        "typeString": "uint128"
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "id": 1954,
                                          "name": "token",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 1876,
                                          "src": "35420:5:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_contract$_IERC20_$67",
                                            "typeString": "contract IERC20"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_contract$_IERC20_$67",
                                            "typeString": "contract IERC20"
                                          }
                                        ],
                                        "id": 1953,
                                        "name": "_tokenBalanceOf",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 1798,
                                        "src": "35404:15:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_function_internal_view$_t_contract$_IERC20_$67_$returns$_t_uint256_$",
                                          "typeString": "function (contract IERC20) view returns (uint256)"
                                        }
                                      },
                                      "id": 1955,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "35404:22:0",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "id": 1956,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "sub",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 300,
                                    "src": "35404:26:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                      "typeString": "function (uint256,uint256) pure returns (uint256)"
                                    }
                                  },
                                  "id": 1959,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "35404:41:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "35394:51:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "src": "35343:102:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "42656e746f426f783a20536b696d20746f6f206d756368",
                              "id": 1962,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "35459:25:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_0437eaa0205ada0dd3e2cbc945bdbd0a3aa39c5f7ba00e766d7a75280e66e4de",
                                "typeString": "literal_string \"BentoBox: Skim too much\""
                              },
                              "value": "BentoBox: Skim too much"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_0437eaa0205ada0dd3e2cbc945bdbd0a3aa39c5f7ba00e766d7a75280e66e4de",
                                "typeString": "literal_string \"BentoBox: Skim too much\""
                              }
                            ],
                            "id": 1941,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "35322:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 1963,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "35322:172:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1964,
                        "nodeType": "ExpressionStatement",
                        "src": "35322:172:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 1978,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "id": 1965,
                                "name": "balanceOf",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1701,
                                "src": "35505:9:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_contract$_IERC20_$67_$_t_mapping$_t_address_$_t_uint256_$_$",
                                  "typeString": "mapping(contract IERC20 => mapping(address => uint256))"
                                }
                              },
                              "id": 1968,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 1966,
                                "name": "token",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1876,
                                "src": "35515:5:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_IERC20_$67",
                                  "typeString": "contract IERC20"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "35505:16:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                "typeString": "mapping(address => uint256)"
                              }
                            },
                            "id": 1969,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 1967,
                              "name": "to",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1851,
                              "src": "35522:2:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "35505:20:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 1976,
                                "name": "share",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1855,
                                "src": "35553:5:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "baseExpression": {
                                    "argumentTypes": null,
                                    "id": 1970,
                                    "name": "balanceOf",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1701,
                                    "src": "35528:9:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_mapping$_t_contract$_IERC20_$67_$_t_mapping$_t_address_$_t_uint256_$_$",
                                      "typeString": "mapping(contract IERC20 => mapping(address => uint256))"
                                    }
                                  },
                                  "id": 1972,
                                  "indexExpression": {
                                    "argumentTypes": null,
                                    "id": 1971,
                                    "name": "token",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1876,
                                    "src": "35538:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IERC20_$67",
                                      "typeString": "contract IERC20"
                                    }
                                  },
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "nodeType": "IndexAccess",
                                  "src": "35528:16:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                    "typeString": "mapping(address => uint256)"
                                  }
                                },
                                "id": 1974,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "id": 1973,
                                  "name": "to",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1851,
                                  "src": "35545:2:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "35528:20:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 1975,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "add",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 278,
                              "src": "35528:24:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                "typeString": "function (uint256,uint256) pure returns (uint256)"
                              }
                            },
                            "id": 1977,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "35528:31:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "35505:54:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 1979,
                        "nodeType": "ExpressionStatement",
                        "src": "35505:54:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 1990,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 1980,
                              "name": "total",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1885,
                              "src": "35569:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Rebase_$550_memory_ptr",
                                "typeString": "struct Rebase memory"
                              }
                            },
                            "id": 1982,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberName": "base",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 549,
                            "src": "35569:10:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "arguments": [],
                                "expression": {
                                  "argumentTypes": [],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 1986,
                                    "name": "share",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1855,
                                    "src": "35597:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "id": 1987,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "to128",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 354,
                                  "src": "35597:11:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint128_$bound_to$_t_uint256_$",
                                    "typeString": "function (uint256) pure returns (uint128)"
                                  }
                                },
                                "id": 1988,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "35597:13:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 1983,
                                  "name": "total",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1885,
                                  "src": "35582:5:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_struct$_Rebase_$550_memory_ptr",
                                    "typeString": "struct Rebase memory"
                                  }
                                },
                                "id": 1984,
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "base",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 549,
                                "src": "35582:10:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              },
                              "id": 1985,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "add",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 430,
                              "src": "35582:14:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint128_$_t_uint128_$returns$_t_uint128_$bound_to$_t_uint128_$",
                                "typeString": "function (uint128,uint128) pure returns (uint128)"
                              }
                            },
                            "id": 1989,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "35582:29:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "src": "35569:42:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "id": 1991,
                        "nodeType": "ExpressionStatement",
                        "src": "35569:42:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2002,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 1992,
                              "name": "total",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1885,
                              "src": "35621:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Rebase_$550_memory_ptr",
                                "typeString": "struct Rebase memory"
                              }
                            },
                            "id": 1994,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberName": "elastic",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 547,
                            "src": "35621:13:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "arguments": [],
                                "expression": {
                                  "argumentTypes": [],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 1998,
                                    "name": "amount",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1853,
                                    "src": "35655:6:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "id": 1999,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "to128",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 354,
                                  "src": "35655:12:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint128_$bound_to$_t_uint256_$",
                                    "typeString": "function (uint256) pure returns (uint128)"
                                  }
                                },
                                "id": 2000,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "35655:14:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 1995,
                                  "name": "total",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1885,
                                  "src": "35637:5:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_struct$_Rebase_$550_memory_ptr",
                                    "typeString": "struct Rebase memory"
                                  }
                                },
                                "id": 1996,
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "elastic",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 547,
                                "src": "35637:13:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              },
                              "id": 1997,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "add",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 430,
                              "src": "35637:17:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint128_$_t_uint128_$returns$_t_uint128_$bound_to$_t_uint128_$",
                                "typeString": "function (uint128,uint128) pure returns (uint128)"
                              }
                            },
                            "id": 2001,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "35637:33:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "src": "35621:49:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "id": 2003,
                        "nodeType": "ExpressionStatement",
                        "src": "35621:49:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2008,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 2004,
                              "name": "totals",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1705,
                              "src": "35680:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_contract$_IERC20_$67_$_t_struct$_Rebase_$550_storage_$",
                                "typeString": "mapping(contract IERC20 => struct Rebase storage ref)"
                              }
                            },
                            "id": 2006,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 2005,
                              "name": "token",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1876,
                              "src": "35687:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$67",
                                "typeString": "contract IERC20"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "35680:13:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_Rebase_$550_storage",
                              "typeString": "struct Rebase storage ref"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 2007,
                            "name": "total",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1885,
                            "src": "35696:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_Rebase_$550_memory_ptr",
                              "typeString": "struct Rebase memory"
                            }
                          },
                          "src": "35680:21:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Rebase_$550_storage",
                            "typeString": "struct Rebase storage ref"
                          }
                        },
                        "id": 2009,
                        "nodeType": "ExpressionStatement",
                        "src": "35680:21:0"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_contract$_IERC20_$67",
                            "typeString": "contract IERC20"
                          },
                          "id": 2012,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 2010,
                            "name": "token_",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1847,
                            "src": "35812:6:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC20_$67",
                              "typeString": "contract IERC20"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 2011,
                            "name": "USE_ETHEREUM",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1680,
                            "src": "35822:12:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC20_$67",
                              "typeString": "contract IERC20"
                            }
                          },
                          "src": "35812:22:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": {
                          "condition": {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            },
                            "id": 2030,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "id": 2025,
                              "name": "from",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1849,
                              "src": "36159:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "!=",
                            "rightExpression": {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 2028,
                                  "name": "this",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -28,
                                  "src": "36175:4:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_BentoBoxV1_$3101",
                                    "typeString": "contract BentoBoxV1"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_BentoBoxV1_$3101",
                                    "typeString": "contract BentoBoxV1"
                                  }
                                ],
                                "id": 2027,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "36167:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 2026,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "36167:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 2029,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "36167:13:0",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            "src": "36159:21:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "falseBody": null,
                          "id": 2043,
                          "nodeType": "IfStatement",
                          "src": "36155:313:0",
                          "trueBody": {
                            "id": 2042,
                            "nodeType": "Block",
                            "src": "36182:286:0",
                            "statements": [
                              {
                                "expression": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 2034,
                                      "name": "from",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1849,
                                      "src": "36429:4:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      }
                                    },
                                    {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "id": 2037,
                                          "name": "this",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": -28,
                                          "src": "36443:4:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_contract$_BentoBoxV1_$3101",
                                            "typeString": "contract BentoBoxV1"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_contract$_BentoBoxV1_$3101",
                                            "typeString": "contract BentoBoxV1"
                                          }
                                        ],
                                        "id": 2036,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": true,
                                        "lValueRequested": false,
                                        "nodeType": "ElementaryTypeNameExpression",
                                        "src": "36435:7:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_type$_t_address_$",
                                          "typeString": "type(address)"
                                        },
                                        "typeName": {
                                          "id": 2035,
                                          "name": "address",
                                          "nodeType": "ElementaryTypeName",
                                          "src": "36435:7:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": null,
                                            "typeString": null
                                          }
                                        }
                                      },
                                      "id": 2038,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "typeConversion",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "36435:13:0",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_address_payable",
                                        "typeString": "address payable"
                                      }
                                    },
                                    {
                                      "argumentTypes": null,
                                      "id": 2039,
                                      "name": "amount",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1853,
                                      "src": "36450:6:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      },
                                      {
                                        "typeIdentifier": "t_address_payable",
                                        "typeString": "address payable"
                                      },
                                      {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 2031,
                                      "name": "token",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1876,
                                      "src": "36406:5:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_IERC20_$67",
                                        "typeString": "contract IERC20"
                                      }
                                    },
                                    "id": 2033,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "safeTransferFrom",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 254,
                                    "src": "36406:22:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC20_$67_$_t_address_$_t_address_$_t_uint256_$returns$__$bound_to$_t_contract$_IERC20_$67_$",
                                      "typeString": "function (contract IERC20,address,address,uint256)"
                                    }
                                  },
                                  "id": 2040,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "36406:51:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_tuple$__$",
                                    "typeString": "tuple()"
                                  }
                                },
                                "id": 2041,
                                "nodeType": "ExpressionStatement",
                                "src": "36406:51:0"
                              }
                            ]
                          }
                        },
                        "id": 2044,
                        "nodeType": "IfStatement",
                        "src": "35808:660:0",
                        "trueBody": {
                          "id": 2024,
                          "nodeType": "Block",
                          "src": "35836:313:0",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [],
                                "expression": {
                                  "argumentTypes": [],
                                  "expression": {
                                    "argumentTypes": [],
                                    "expression": {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "arguments": [
                                            {
                                              "argumentTypes": null,
                                              "id": 2016,
                                              "name": "wethToken",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": 1675,
                                              "src": "36102:9:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_contract$_IERC20_$67",
                                                "typeString": "contract IERC20"
                                              }
                                            }
                                          ],
                                          "expression": {
                                            "argumentTypes": [
                                              {
                                                "typeIdentifier": "t_contract$_IERC20_$67",
                                                "typeString": "contract IERC20"
                                              }
                                            ],
                                            "id": 2015,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": true,
                                            "lValueRequested": false,
                                            "nodeType": "ElementaryTypeNameExpression",
                                            "src": "36094:7:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_type$_t_address_$",
                                              "typeString": "type(address)"
                                            },
                                            "typeName": {
                                              "id": 2014,
                                              "name": "address",
                                              "nodeType": "ElementaryTypeName",
                                              "src": "36094:7:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": null,
                                                "typeString": null
                                              }
                                            }
                                          },
                                          "id": 2017,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "kind": "typeConversion",
                                          "lValueRequested": false,
                                          "names": [],
                                          "nodeType": "FunctionCall",
                                          "src": "36094:18:0",
                                          "tryCall": false,
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                          }
                                        ],
                                        "id": 2013,
                                        "name": "IWETH",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 109,
                                        "src": "36088:5:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_type$_t_contract$_IWETH_$109_$",
                                          "typeString": "type(contract IWETH)"
                                        }
                                      },
                                      "id": 2018,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "typeConversion",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "36088:25:0",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_IWETH_$109",
                                        "typeString": "contract IWETH"
                                      }
                                    },
                                    "id": 2019,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "deposit",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 103,
                                    "src": "36088:33:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_external_payable$__$returns$__$",
                                      "typeString": "function () payable external"
                                    }
                                  },
                                  "id": 2021,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "names": [
                                    "value"
                                  ],
                                  "nodeType": "FunctionCallOptions",
                                  "options": [
                                    {
                                      "argumentTypes": null,
                                      "id": 2020,
                                      "name": "amount",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1853,
                                      "src": "36129:6:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    }
                                  ],
                                  "src": "36088:48:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_external_payable$__$returns$__$value",
                                    "typeString": "function () payable external"
                                  }
                                },
                                "id": 2022,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "36088:50:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 2023,
                              "nodeType": "ExpressionStatement",
                              "src": "36088:50:0"
                            }
                          ]
                        }
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 2046,
                              "name": "token",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1876,
                              "src": "36493:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$67",
                                "typeString": "contract IERC20"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2047,
                              "name": "from",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1849,
                              "src": "36500:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2048,
                              "name": "to",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1851,
                              "src": "36506:2:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2049,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1853,
                              "src": "36510:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2050,
                              "name": "share",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1855,
                              "src": "36518:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_IERC20_$67",
                                "typeString": "contract IERC20"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 2045,
                            "name": "LogDeposit",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1590,
                            "src": "36482:10:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_contract$_IERC20_$67_$_t_address_$_t_address_$_t_uint256_$_t_uint256_$returns$__$",
                              "typeString": "function (contract IERC20,address,address,uint256,uint256)"
                            }
                          },
                          "id": 2051,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "36482:42:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2052,
                        "nodeType": "EmitStatement",
                        "src": "36477:47:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2055,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 2053,
                            "name": "amountOut",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1861,
                            "src": "36534:9:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 2054,
                            "name": "amount",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1853,
                            "src": "36546:6:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "36534:18:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 2056,
                        "nodeType": "ExpressionStatement",
                        "src": "36534:18:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2059,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 2057,
                            "name": "shareOut",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1863,
                            "src": "36562:8:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 2058,
                            "name": "share",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1855,
                            "src": "36573:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "36562:16:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 2060,
                        "nodeType": "ExpressionStatement",
                        "src": "36562:16:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 1845,
                    "nodeType": "StructuredDocumentation",
                    "src": "33222:528:0",
                    "text": "@notice Deposit an amount of `token` represented in either `amount` or `share`.\n @param token_ The ERC-20 token to deposit.\n @param from which account to pull the tokens.\n @param to which account to push the tokens.\n @param amount Token amount in native representation to deposit.\n @param share Token amount represented in shares to deposit. Takes precedence over `amount`.\n @return amountOut The amount deposited.\n @return shareOut The deposited amount repesented in shares."
                  },
                  "functionSelector": "02b9446c",
                  "id": 2062,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 1858,
                          "name": "from",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 1849,
                          "src": "33913:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        }
                      ],
                      "id": 1859,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 1857,
                        "name": "allowed",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1773,
                        "src": "33905:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$_t_address_$",
                          "typeString": "modifier (address)"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "33905:13:0"
                    }
                  ],
                  "name": "deposit",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1856,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1847,
                        "mutability": "mutable",
                        "name": "token_",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2062,
                        "src": "33781:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$67",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 1846,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 67,
                          "src": "33781:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$67",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1849,
                        "mutability": "mutable",
                        "name": "from",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2062,
                        "src": "33804:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1848,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "33804:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1851,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2062,
                        "src": "33826:10:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1850,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "33826:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1853,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2062,
                        "src": "33846:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1852,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "33846:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1855,
                        "mutability": "mutable",
                        "name": "share",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2062,
                        "src": "33870:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1854,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "33870:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "33771:118:0"
                  },
                  "returnParameters": {
                    "id": 1864,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1861,
                        "mutability": "mutable",
                        "name": "amountOut",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2062,
                        "src": "33928:17:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1860,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "33928:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1863,
                        "mutability": "mutable",
                        "name": "shareOut",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2062,
                        "src": "33947:16:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1862,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "33947:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "33927:37:0"
                  },
                  "scope": 3101,
                  "src": "33755:2830:0",
                  "stateMutability": "payable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 2241,
                    "nodeType": "Block",
                    "src": "37180:1911:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 2089,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 2084,
                                "name": "to",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2069,
                                "src": "37216:2:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "!=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "30",
                                    "id": 2087,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "37230:1:0",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    },
                                    "value": "0"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    }
                                  ],
                                  "id": 2086,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "37222:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 2085,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "37222:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 2088,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "37222:10:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "src": "37216:16:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "42656e746f426f783a20746f206e6f7420736574",
                              "id": 2090,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "37234:22:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_8fe0a0ebc94ce87b7060385c1233e1d905bbe8354ad627a6edf6dbd8f627ab3c",
                                "typeString": "literal_string \"BentoBox: to not set\""
                              },
                              "value": "BentoBox: to not set"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_8fe0a0ebc94ce87b7060385c1233e1d905bbe8354ad627a6edf6dbd8f627ab3c",
                                "typeString": "literal_string \"BentoBox: to not set\""
                              }
                            ],
                            "id": 2083,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "37208:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 2091,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "37208:49:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2092,
                        "nodeType": "ExpressionStatement",
                        "src": "37208:49:0"
                      },
                      {
                        "assignments": [
                          2094
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 2094,
                            "mutability": "mutable",
                            "name": "token",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 2241,
                            "src": "37327:12:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC20_$67",
                              "typeString": "contract IERC20"
                            },
                            "typeName": {
                              "contractScope": null,
                              "id": 2093,
                              "name": "IERC20",
                              "nodeType": "UserDefinedTypeName",
                              "referencedDeclaration": 67,
                              "src": "37327:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$67",
                                "typeString": "contract IERC20"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 2101,
                        "initialValue": {
                          "argumentTypes": null,
                          "condition": {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_contract$_IERC20_$67",
                              "typeString": "contract IERC20"
                            },
                            "id": 2097,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "id": 2095,
                              "name": "token_",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2065,
                              "src": "37342:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$67",
                                "typeString": "contract IERC20"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "==",
                            "rightExpression": {
                              "argumentTypes": null,
                              "id": 2096,
                              "name": "USE_ETHEREUM",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1680,
                              "src": "37352:12:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$67",
                                "typeString": "contract IERC20"
                              }
                            },
                            "src": "37342:22:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "falseExpression": {
                            "argumentTypes": null,
                            "id": 2099,
                            "name": "token_",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2065,
                            "src": "37379:6:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC20_$67",
                              "typeString": "contract IERC20"
                            }
                          },
                          "id": 2100,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "Conditional",
                          "src": "37342:43:0",
                          "trueExpression": {
                            "argumentTypes": null,
                            "id": 2098,
                            "name": "wethToken",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1675,
                            "src": "37367:9:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC20_$67",
                              "typeString": "contract IERC20"
                            }
                          },
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$67",
                            "typeString": "contract IERC20"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "37327:58:0"
                      },
                      {
                        "assignments": [
                          2103
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 2103,
                            "mutability": "mutable",
                            "name": "total",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 2241,
                            "src": "37395:19:0",
                            "stateVariable": false,
                            "storageLocation": "memory",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_Rebase_$550_memory_ptr",
                              "typeString": "struct Rebase"
                            },
                            "typeName": {
                              "contractScope": null,
                              "id": 2102,
                              "name": "Rebase",
                              "nodeType": "UserDefinedTypeName",
                              "referencedDeclaration": 550,
                              "src": "37395:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Rebase_$550_storage_ptr",
                                "typeString": "struct Rebase"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 2107,
                        "initialValue": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "id": 2104,
                            "name": "totals",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1705,
                            "src": "37417:6:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_contract$_IERC20_$67_$_t_struct$_Rebase_$550_storage_$",
                              "typeString": "mapping(contract IERC20 => struct Rebase storage ref)"
                            }
                          },
                          "id": 2106,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 2105,
                            "name": "token",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2094,
                            "src": "37424:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC20_$67",
                              "typeString": "contract IERC20"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "37417:13:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Rebase_$550_storage",
                            "typeString": "struct Rebase storage ref"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "37395:35:0"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 2110,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 2108,
                            "name": "share",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2073,
                            "src": "37444:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 2109,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "37453:1:0",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "37444:10:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": {
                          "id": 2128,
                          "nodeType": "Block",
                          "src": "37657:149:0",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 2126,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "id": 2120,
                                  "name": "amount",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2071,
                                  "src": "37757:6:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 2123,
                                      "name": "share",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2073,
                                      "src": "37782:5:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    {
                                      "argumentTypes": null,
                                      "hexValue": "66616c7365",
                                      "id": 2124,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "kind": "bool",
                                      "lValueRequested": false,
                                      "nodeType": "Literal",
                                      "src": "37789:5:0",
                                      "subdenomination": null,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                      },
                                      "value": "false"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      },
                                      {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 2121,
                                      "name": "total",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2103,
                                      "src": "37766:5:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_Rebase_$550_memory_ptr",
                                        "typeString": "struct Rebase memory"
                                      }
                                    },
                                    "id": 2122,
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "toElastic",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 669,
                                    "src": "37766:15:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_internal_pure$_t_struct$_Rebase_$550_memory_ptr_$_t_uint256_$_t_bool_$returns$_t_uint256_$bound_to$_t_struct$_Rebase_$550_memory_ptr_$",
                                      "typeString": "function (struct Rebase memory,uint256,bool) pure returns (uint256)"
                                    }
                                  },
                                  "id": 2125,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "37766:29:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "37757:38:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 2127,
                              "nodeType": "ExpressionStatement",
                              "src": "37757:38:0"
                            }
                          ]
                        },
                        "id": 2129,
                        "nodeType": "IfStatement",
                        "src": "37440:366:0",
                        "trueBody": {
                          "id": 2119,
                          "nodeType": "Block",
                          "src": "37456:195:0",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 2117,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "id": 2111,
                                  "name": "share",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2073,
                                  "src": "37606:5:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 2114,
                                      "name": "amount",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2071,
                                      "src": "37627:6:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    {
                                      "argumentTypes": null,
                                      "hexValue": "74727565",
                                      "id": 2115,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "kind": "bool",
                                      "lValueRequested": false,
                                      "nodeType": "Literal",
                                      "src": "37635:4:0",
                                      "subdenomination": null,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                      },
                                      "value": "true"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      },
                                      {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 2112,
                                      "name": "total",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2103,
                                      "src": "37614:5:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_Rebase_$550_memory_ptr",
                                        "typeString": "struct Rebase memory"
                                      }
                                    },
                                    "id": 2113,
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "toBase",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 613,
                                    "src": "37614:12:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_internal_pure$_t_struct$_Rebase_$550_memory_ptr_$_t_uint256_$_t_bool_$returns$_t_uint256_$bound_to$_t_struct$_Rebase_$550_memory_ptr_$",
                                      "typeString": "function (struct Rebase memory,uint256,bool) pure returns (uint256)"
                                    }
                                  },
                                  "id": 2116,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "37614:26:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "37606:34:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 2118,
                              "nodeType": "ExpressionStatement",
                              "src": "37606:34:0"
                            }
                          ]
                        }
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2143,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "id": 2130,
                                "name": "balanceOf",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1701,
                                "src": "37816:9:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_contract$_IERC20_$67_$_t_mapping$_t_address_$_t_uint256_$_$",
                                  "typeString": "mapping(contract IERC20 => mapping(address => uint256))"
                                }
                              },
                              "id": 2133,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 2131,
                                "name": "token",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2094,
                                "src": "37826:5:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_IERC20_$67",
                                  "typeString": "contract IERC20"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "37816:16:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                "typeString": "mapping(address => uint256)"
                              }
                            },
                            "id": 2134,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 2132,
                              "name": "from",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2067,
                              "src": "37833:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "37816:22:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 2141,
                                "name": "share",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2073,
                                "src": "37868:5:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "baseExpression": {
                                    "argumentTypes": null,
                                    "id": 2135,
                                    "name": "balanceOf",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1701,
                                    "src": "37841:9:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_mapping$_t_contract$_IERC20_$67_$_t_mapping$_t_address_$_t_uint256_$_$",
                                      "typeString": "mapping(contract IERC20 => mapping(address => uint256))"
                                    }
                                  },
                                  "id": 2137,
                                  "indexExpression": {
                                    "argumentTypes": null,
                                    "id": 2136,
                                    "name": "token",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2094,
                                    "src": "37851:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IERC20_$67",
                                      "typeString": "contract IERC20"
                                    }
                                  },
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "nodeType": "IndexAccess",
                                  "src": "37841:16:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                    "typeString": "mapping(address => uint256)"
                                  }
                                },
                                "id": 2139,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "id": 2138,
                                  "name": "from",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2067,
                                  "src": "37858:4:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "37841:22:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 2140,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sub",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 300,
                              "src": "37841:26:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                "typeString": "function (uint256,uint256) pure returns (uint256)"
                              }
                            },
                            "id": 2142,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "37841:33:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "37816:58:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 2144,
                        "nodeType": "ExpressionStatement",
                        "src": "37816:58:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2155,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 2145,
                              "name": "total",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2103,
                              "src": "37884:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Rebase_$550_memory_ptr",
                                "typeString": "struct Rebase memory"
                              }
                            },
                            "id": 2147,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberName": "elastic",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 547,
                            "src": "37884:13:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "arguments": [],
                                "expression": {
                                  "argumentTypes": [],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 2151,
                                    "name": "amount",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2071,
                                    "src": "37918:6:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "id": 2152,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "to128",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 354,
                                  "src": "37918:12:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint128_$bound_to$_t_uint256_$",
                                    "typeString": "function (uint256) pure returns (uint128)"
                                  }
                                },
                                "id": 2153,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "37918:14:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 2148,
                                  "name": "total",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2103,
                                  "src": "37900:5:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_struct$_Rebase_$550_memory_ptr",
                                    "typeString": "struct Rebase memory"
                                  }
                                },
                                "id": 2149,
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "elastic",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 547,
                                "src": "37900:13:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              },
                              "id": 2150,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sub",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 452,
                              "src": "37900:17:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint128_$_t_uint128_$returns$_t_uint128_$bound_to$_t_uint128_$",
                                "typeString": "function (uint128,uint128) pure returns (uint128)"
                              }
                            },
                            "id": 2154,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "37900:33:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "src": "37884:49:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "id": 2156,
                        "nodeType": "ExpressionStatement",
                        "src": "37884:49:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2167,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 2157,
                              "name": "total",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2103,
                              "src": "37943:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Rebase_$550_memory_ptr",
                                "typeString": "struct Rebase memory"
                              }
                            },
                            "id": 2159,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberName": "base",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 549,
                            "src": "37943:10:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "arguments": [],
                                "expression": {
                                  "argumentTypes": [],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 2163,
                                    "name": "share",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2073,
                                    "src": "37971:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "id": 2164,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "to128",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 354,
                                  "src": "37971:11:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint128_$bound_to$_t_uint256_$",
                                    "typeString": "function (uint256) pure returns (uint128)"
                                  }
                                },
                                "id": 2165,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "37971:13:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 2160,
                                  "name": "total",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2103,
                                  "src": "37956:5:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_struct$_Rebase_$550_memory_ptr",
                                    "typeString": "struct Rebase memory"
                                  }
                                },
                                "id": 2161,
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "base",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 549,
                                "src": "37956:10:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              },
                              "id": 2162,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sub",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 452,
                              "src": "37956:14:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint128_$_t_uint128_$returns$_t_uint128_$bound_to$_t_uint128_$",
                                "typeString": "function (uint128,uint128) pure returns (uint128)"
                              }
                            },
                            "id": 2166,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "37956:29:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "src": "37943:42:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "id": 2168,
                        "nodeType": "ExpressionStatement",
                        "src": "37943:42:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              "id": 2178,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                "id": 2173,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 2170,
                                    "name": "total",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2103,
                                    "src": "38128:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_struct$_Rebase_$550_memory_ptr",
                                      "typeString": "struct Rebase memory"
                                    }
                                  },
                                  "id": 2171,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "base",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 549,
                                  "src": "38128:10:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint128",
                                    "typeString": "uint128"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": ">=",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "id": 2172,
                                  "name": "MINIMUM_SHARE_BALANCE",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1695,
                                  "src": "38142:21:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "38128:35:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "||",
                              "rightExpression": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                },
                                "id": 2177,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 2174,
                                    "name": "total",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2103,
                                    "src": "38167:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_struct$_Rebase_$550_memory_ptr",
                                      "typeString": "struct Rebase memory"
                                    }
                                  },
                                  "id": 2175,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "base",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 549,
                                  "src": "38167:10:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint128",
                                    "typeString": "uint128"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "==",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "hexValue": "30",
                                  "id": 2176,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "38181:1:0",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  },
                                  "value": "0"
                                },
                                "src": "38167:15:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "src": "38128:54:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "42656e746f426f783a2063616e6e6f7420656d707479",
                              "id": 2179,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "38184:24:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_3a09419fc78523f3366d766a341e48736ccec3b7137bd25440cf4f43d1a0ccc0",
                                "typeString": "literal_string \"BentoBox: cannot empty\""
                              },
                              "value": "BentoBox: cannot empty"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_3a09419fc78523f3366d766a341e48736ccec3b7137bd25440cf4f43d1a0ccc0",
                                "typeString": "literal_string \"BentoBox: cannot empty\""
                              }
                            ],
                            "id": 2169,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "38120:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 2180,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "38120:89:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2181,
                        "nodeType": "ExpressionStatement",
                        "src": "38120:89:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2186,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 2182,
                              "name": "totals",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1705,
                              "src": "38219:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_contract$_IERC20_$67_$_t_struct$_Rebase_$550_storage_$",
                                "typeString": "mapping(contract IERC20 => struct Rebase storage ref)"
                              }
                            },
                            "id": 2184,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 2183,
                              "name": "token",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2094,
                              "src": "38226:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$67",
                                "typeString": "contract IERC20"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "38219:13:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_Rebase_$550_storage",
                              "typeString": "struct Rebase storage ref"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 2185,
                            "name": "total",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2103,
                            "src": "38235:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_Rebase_$550_memory_ptr",
                              "typeString": "struct Rebase memory"
                            }
                          },
                          "src": "38219:21:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Rebase_$550_storage",
                            "typeString": "struct Rebase storage ref"
                          }
                        },
                        "id": 2187,
                        "nodeType": "ExpressionStatement",
                        "src": "38219:21:0"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_contract$_IERC20_$67",
                            "typeString": "contract IERC20"
                          },
                          "id": 2190,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 2188,
                            "name": "token_",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2065,
                            "src": "38279:6:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC20_$67",
                              "typeString": "contract IERC20"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 2189,
                            "name": "USE_ETHEREUM",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1680,
                            "src": "38289:12:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC20_$67",
                              "typeString": "contract IERC20"
                            }
                          },
                          "src": "38279:22:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": {
                          "id": 2223,
                          "nodeType": "Block",
                          "src": "38730:243:0",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 2219,
                                    "name": "to",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2069,
                                    "src": "38951:2:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 2220,
                                    "name": "amount",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2071,
                                    "src": "38955:6:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 2216,
                                    "name": "token",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2094,
                                    "src": "38932:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IERC20_$67",
                                      "typeString": "contract IERC20"
                                    }
                                  },
                                  "id": 2218,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "safeTransfer",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 204,
                                  "src": "38932:18:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC20_$67_$_t_address_$_t_uint256_$returns$__$bound_to$_t_contract$_IERC20_$67_$",
                                    "typeString": "function (contract IERC20,address,uint256)"
                                  }
                                },
                                "id": 2221,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "38932:30:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 2222,
                              "nodeType": "ExpressionStatement",
                              "src": "38932:30:0"
                            }
                          ]
                        },
                        "id": 2224,
                        "nodeType": "IfStatement",
                        "src": "38275:698:0",
                        "trueBody": {
                          "id": 2215,
                          "nodeType": "Block",
                          "src": "38303:421:0",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 2198,
                                    "name": "amount",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2071,
                                    "src": "38466:6:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "arguments": [
                                          {
                                            "argumentTypes": null,
                                            "id": 2194,
                                            "name": "wethToken",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 1675,
                                            "src": "38445:9:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_contract$_IERC20_$67",
                                              "typeString": "contract IERC20"
                                            }
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": [
                                            {
                                              "typeIdentifier": "t_contract$_IERC20_$67",
                                              "typeString": "contract IERC20"
                                            }
                                          ],
                                          "id": 2193,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": true,
                                          "lValueRequested": false,
                                          "nodeType": "ElementaryTypeNameExpression",
                                          "src": "38437:7:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_type$_t_address_$",
                                            "typeString": "type(address)"
                                          },
                                          "typeName": {
                                            "id": 2192,
                                            "name": "address",
                                            "nodeType": "ElementaryTypeName",
                                            "src": "38437:7:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": null,
                                              "typeString": null
                                            }
                                          }
                                        },
                                        "id": 2195,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "typeConversion",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "38437:18:0",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_address",
                                          "typeString": "address"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_address",
                                          "typeString": "address"
                                        }
                                      ],
                                      "id": 2191,
                                      "name": "IWETH",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 109,
                                      "src": "38431:5:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_type$_t_contract$_IWETH_$109_$",
                                        "typeString": "type(contract IWETH)"
                                      }
                                    },
                                    "id": 2196,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "typeConversion",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "38431:25:0",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IWETH_$109",
                                      "typeString": "contract IWETH"
                                    }
                                  },
                                  "id": 2197,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "withdraw",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 108,
                                  "src": "38431:34:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_external_nonpayable$_t_uint256_$returns$__$",
                                    "typeString": "function (uint256) external"
                                  }
                                },
                                "id": 2199,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "38431:42:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 2200,
                              "nodeType": "ExpressionStatement",
                              "src": "38431:42:0"
                            },
                            {
                              "assignments": [
                                2202,
                                null
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 2202,
                                  "mutability": "mutable",
                                  "name": "success",
                                  "nodeType": "VariableDeclaration",
                                  "overrides": null,
                                  "scope": 2215,
                                  "src": "38606:12:0",
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  "typeName": {
                                    "id": 2201,
                                    "name": "bool",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "38606:4:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    }
                                  },
                                  "value": null,
                                  "visibility": "internal"
                                },
                                null
                              ],
                              "id": 2209,
                              "initialValue": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "",
                                    "id": 2207,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "string",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "38647:2:0",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
                                      "typeString": "literal_string \"\""
                                    },
                                    "value": ""
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
                                      "typeString": "literal_string \"\""
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
                                        "typeString": "literal_string \"\""
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 2203,
                                      "name": "to",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2069,
                                      "src": "38624:2:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      }
                                    },
                                    "id": 2204,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "call",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": null,
                                    "src": "38624:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$",
                                      "typeString": "function (bytes memory) payable returns (bool,bytes memory)"
                                    }
                                  },
                                  "id": 2206,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "names": [
                                    "value"
                                  ],
                                  "nodeType": "FunctionCallOptions",
                                  "options": [
                                    {
                                      "argumentTypes": null,
                                      "id": 2205,
                                      "name": "amount",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2071,
                                      "src": "38639:6:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    }
                                  ],
                                  "src": "38624:22:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$value",
                                    "typeString": "function (bytes memory) payable returns (bool,bytes memory)"
                                  }
                                },
                                "id": 2208,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "38624:26:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$_t_bool_$_t_bytes_memory_ptr_$",
                                  "typeString": "tuple(bool,bytes memory)"
                                }
                              },
                              "nodeType": "VariableDeclarationStatement",
                              "src": "38605:45:0"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 2211,
                                    "name": "success",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2202,
                                    "src": "38672:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "42656e746f426f783a20455448207472616e73666572206661696c6564",
                                    "id": 2212,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "string",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "38681:31:0",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_stringliteral_ed75230845a0b3ad13f9a81669264ef413cffb7c9fdcdf7ecdf90a793a31b639",
                                      "typeString": "literal_string \"BentoBox: ETH transfer failed\""
                                    },
                                    "value": "BentoBox: ETH transfer failed"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    },
                                    {
                                      "typeIdentifier": "t_stringliteral_ed75230845a0b3ad13f9a81669264ef413cffb7c9fdcdf7ecdf90a793a31b639",
                                      "typeString": "literal_string \"BentoBox: ETH transfer failed\""
                                    }
                                  ],
                                  "id": 2210,
                                  "name": "require",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [
                                    -18,
                                    -18
                                  ],
                                  "referencedDeclaration": -18,
                                  "src": "38664:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                                    "typeString": "function (bool,string memory) pure"
                                  }
                                },
                                "id": 2213,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "38664:49:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 2214,
                              "nodeType": "ExpressionStatement",
                              "src": "38664:49:0"
                            }
                          ]
                        }
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 2226,
                              "name": "token",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2094,
                              "src": "38999:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$67",
                                "typeString": "contract IERC20"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2227,
                              "name": "from",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2067,
                              "src": "39006:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2228,
                              "name": "to",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2069,
                              "src": "39012:2:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2229,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2071,
                              "src": "39016:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2230,
                              "name": "share",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2073,
                              "src": "39024:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_IERC20_$67",
                                "typeString": "contract IERC20"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 2225,
                            "name": "LogWithdraw",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1602,
                            "src": "38987:11:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_contract$_IERC20_$67_$_t_address_$_t_address_$_t_uint256_$_t_uint256_$returns$__$",
                              "typeString": "function (contract IERC20,address,address,uint256,uint256)"
                            }
                          },
                          "id": 2231,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "38987:43:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2232,
                        "nodeType": "EmitStatement",
                        "src": "38982:48:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2235,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 2233,
                            "name": "amountOut",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2079,
                            "src": "39040:9:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 2234,
                            "name": "amount",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2071,
                            "src": "39052:6:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "39040:18:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 2236,
                        "nodeType": "ExpressionStatement",
                        "src": "39040:18:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2239,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 2237,
                            "name": "shareOut",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2081,
                            "src": "39068:8:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 2238,
                            "name": "share",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2073,
                            "src": "39079:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "39068:16:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 2240,
                        "nodeType": "ExpressionStatement",
                        "src": "39068:16:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 2063,
                    "nodeType": "StructuredDocumentation",
                    "src": "36591:381:0",
                    "text": "@notice Withdraws an amount of `token` from a user account.\n @param token_ The ERC-20 token to withdraw.\n @param from which user to pull the tokens.\n @param to which user to push the tokens.\n @param amount of tokens. Either one of `amount` or `share` needs to be supplied.\n @param share Like above, but `share` takes precedence over `amount`."
                  },
                  "functionSelector": "97da6d30",
                  "id": 2242,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 2076,
                          "name": "from",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2067,
                          "src": "37128:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        }
                      ],
                      "id": 2077,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 2075,
                        "name": "allowed",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1773,
                        "src": "37120:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$_t_address_$",
                          "typeString": "modifier (address)"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "37120:13:0"
                    }
                  ],
                  "name": "withdraw",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 2074,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2065,
                        "mutability": "mutable",
                        "name": "token_",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2242,
                        "src": "37004:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$67",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 2064,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 67,
                          "src": "37004:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$67",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2067,
                        "mutability": "mutable",
                        "name": "from",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2242,
                        "src": "37027:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 2066,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "37027:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2069,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2242,
                        "src": "37049:10:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 2068,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "37049:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2071,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2242,
                        "src": "37069:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 2070,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "37069:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2073,
                        "mutability": "mutable",
                        "name": "share",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2242,
                        "src": "37093:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 2072,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "37093:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "36994:118:0"
                  },
                  "returnParameters": {
                    "id": 2082,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2079,
                        "mutability": "mutable",
                        "name": "amountOut",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2242,
                        "src": "37143:17:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 2078,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "37143:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2081,
                        "mutability": "mutable",
                        "name": "shareOut",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2242,
                        "src": "37162:16:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 2080,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "37162:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "37142:37:0"
                  },
                  "scope": 3101,
                  "src": "36977:2114:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 2304,
                    "nodeType": "Block",
                    "src": "39725:327:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 2263,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 2258,
                                "name": "to",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2249,
                                "src": "39761:2:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "!=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "30",
                                    "id": 2261,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "39775:1:0",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    },
                                    "value": "0"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    }
                                  ],
                                  "id": 2260,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "39767:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 2259,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "39767:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 2262,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "39767:10:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "src": "39761:16:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "42656e746f426f783a20746f206e6f7420736574",
                              "id": 2264,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "39779:22:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_8fe0a0ebc94ce87b7060385c1233e1d905bbe8354ad627a6edf6dbd8f627ab3c",
                                "typeString": "literal_string \"BentoBox: to not set\""
                              },
                              "value": "BentoBox: to not set"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_8fe0a0ebc94ce87b7060385c1233e1d905bbe8354ad627a6edf6dbd8f627ab3c",
                                "typeString": "literal_string \"BentoBox: to not set\""
                              }
                            ],
                            "id": 2257,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "39753:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 2265,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "39753:49:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2266,
                        "nodeType": "ExpressionStatement",
                        "src": "39753:49:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2280,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "id": 2267,
                                "name": "balanceOf",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1701,
                                "src": "39872:9:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_contract$_IERC20_$67_$_t_mapping$_t_address_$_t_uint256_$_$",
                                  "typeString": "mapping(contract IERC20 => mapping(address => uint256))"
                                }
                              },
                              "id": 2270,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 2268,
                                "name": "token",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2245,
                                "src": "39882:5:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_IERC20_$67",
                                  "typeString": "contract IERC20"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "39872:16:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                "typeString": "mapping(address => uint256)"
                              }
                            },
                            "id": 2271,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 2269,
                              "name": "from",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2247,
                              "src": "39889:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "39872:22:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 2278,
                                "name": "share",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2251,
                                "src": "39924:5:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "baseExpression": {
                                    "argumentTypes": null,
                                    "id": 2272,
                                    "name": "balanceOf",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1701,
                                    "src": "39897:9:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_mapping$_t_contract$_IERC20_$67_$_t_mapping$_t_address_$_t_uint256_$_$",
                                      "typeString": "mapping(contract IERC20 => mapping(address => uint256))"
                                    }
                                  },
                                  "id": 2274,
                                  "indexExpression": {
                                    "argumentTypes": null,
                                    "id": 2273,
                                    "name": "token",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2245,
                                    "src": "39907:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IERC20_$67",
                                      "typeString": "contract IERC20"
                                    }
                                  },
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "nodeType": "IndexAccess",
                                  "src": "39897:16:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                    "typeString": "mapping(address => uint256)"
                                  }
                                },
                                "id": 2276,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "id": 2275,
                                  "name": "from",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2247,
                                  "src": "39914:4:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "39897:22:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 2277,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sub",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 300,
                              "src": "39897:26:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                "typeString": "function (uint256,uint256) pure returns (uint256)"
                              }
                            },
                            "id": 2279,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "39897:33:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "39872:58:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 2281,
                        "nodeType": "ExpressionStatement",
                        "src": "39872:58:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2295,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "id": 2282,
                                "name": "balanceOf",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1701,
                                "src": "39940:9:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_contract$_IERC20_$67_$_t_mapping$_t_address_$_t_uint256_$_$",
                                  "typeString": "mapping(contract IERC20 => mapping(address => uint256))"
                                }
                              },
                              "id": 2285,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 2283,
                                "name": "token",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2245,
                                "src": "39950:5:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_IERC20_$67",
                                  "typeString": "contract IERC20"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "39940:16:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                "typeString": "mapping(address => uint256)"
                              }
                            },
                            "id": 2286,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 2284,
                              "name": "to",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2249,
                              "src": "39957:2:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "39940:20:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 2293,
                                "name": "share",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2251,
                                "src": "39988:5:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "baseExpression": {
                                    "argumentTypes": null,
                                    "id": 2287,
                                    "name": "balanceOf",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1701,
                                    "src": "39963:9:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_mapping$_t_contract$_IERC20_$67_$_t_mapping$_t_address_$_t_uint256_$_$",
                                      "typeString": "mapping(contract IERC20 => mapping(address => uint256))"
                                    }
                                  },
                                  "id": 2289,
                                  "indexExpression": {
                                    "argumentTypes": null,
                                    "id": 2288,
                                    "name": "token",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2245,
                                    "src": "39973:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IERC20_$67",
                                      "typeString": "contract IERC20"
                                    }
                                  },
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "nodeType": "IndexAccess",
                                  "src": "39963:16:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                    "typeString": "mapping(address => uint256)"
                                  }
                                },
                                "id": 2291,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "id": 2290,
                                  "name": "to",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2249,
                                  "src": "39980:2:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "39963:20:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 2292,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "add",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 278,
                              "src": "39963:24:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                "typeString": "function (uint256,uint256) pure returns (uint256)"
                              }
                            },
                            "id": 2294,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "39963:31:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "39940:54:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 2296,
                        "nodeType": "ExpressionStatement",
                        "src": "39940:54:0"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 2298,
                              "name": "token",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2245,
                              "src": "40022:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$67",
                                "typeString": "contract IERC20"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2299,
                              "name": "from",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2247,
                              "src": "40029:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2300,
                              "name": "to",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2249,
                              "src": "40035:2:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2301,
                              "name": "share",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2251,
                              "src": "40039:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_IERC20_$67",
                                "typeString": "contract IERC20"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 2297,
                            "name": "LogTransfer",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1612,
                            "src": "40010:11:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_contract$_IERC20_$67_$_t_address_$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (contract IERC20,address,address,uint256)"
                            }
                          },
                          "id": 2302,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "40010:35:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2303,
                        "nodeType": "EmitStatement",
                        "src": "40005:40:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 2243,
                    "nodeType": "StructuredDocumentation",
                    "src": "39097:268:0",
                    "text": "@notice Transfer shares from a user account to another one.\n @param token The ERC-20 token to transfer.\n @param from which user to pull the tokens.\n @param to which user to push the tokens.\n @param share The amount of `token` in shares."
                  },
                  "functionSelector": "f18d03cc",
                  "id": 2305,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 2254,
                          "name": "from",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2247,
                          "src": "39719:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        }
                      ],
                      "id": 2255,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 2253,
                        "name": "allowed",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1773,
                        "src": "39711:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$_t_address_$",
                          "typeString": "modifier (address)"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "39711:13:0"
                    }
                  ],
                  "name": "transfer",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 2252,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2245,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2305,
                        "src": "39620:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$67",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 2244,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 67,
                          "src": "39620:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$67",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2247,
                        "mutability": "mutable",
                        "name": "from",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2305,
                        "src": "39642:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 2246,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "39642:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2249,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2305,
                        "src": "39664:10:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 2248,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "39664:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2251,
                        "mutability": "mutable",
                        "name": "share",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2305,
                        "src": "39684:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 2250,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "39684:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "39610:93:0"
                  },
                  "returnParameters": {
                    "id": 2256,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "39725:0:0"
                  },
                  "scope": 3101,
                  "src": "39593:459:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 2410,
                    "nodeType": "Block",
                    "src": "40658:559:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 2330,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "id": 2323,
                                  "name": "tos",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2313,
                                  "src": "40694:3:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_array$_t_address_$dyn_calldata_ptr",
                                    "typeString": "address[] calldata"
                                  }
                                },
                                "id": 2325,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "hexValue": "30",
                                  "id": 2324,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "40698:1:0",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  },
                                  "value": "0"
                                },
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "40694:6:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "!=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "30",
                                    "id": 2328,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "40712:1:0",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    },
                                    "value": "0"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    }
                                  ],
                                  "id": 2327,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "40704:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 2326,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "40704:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 2329,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "40704:10:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "src": "40694:20:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "42656e746f426f783a20746f5b305d206e6f7420736574",
                              "id": 2331,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "40716:25:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_86e38d8947702dc88c8a2cb40de95cb4c5aa30b612f692f9ec7fe577d43db136",
                                "typeString": "literal_string \"BentoBox: to[0] not set\""
                              },
                              "value": "BentoBox: to[0] not set"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_86e38d8947702dc88c8a2cb40de95cb4c5aa30b612f692f9ec7fe577d43db136",
                                "typeString": "literal_string \"BentoBox: to[0] not set\""
                              }
                            ],
                            "id": 2322,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "40686:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 2332,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "40686:56:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2333,
                        "nodeType": "ExpressionStatement",
                        "src": "40686:56:0"
                      },
                      {
                        "assignments": [
                          2335
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 2335,
                            "mutability": "mutable",
                            "name": "totalAmount",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 2410,
                            "src": "40812:19:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 2334,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "40812:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 2336,
                        "initialValue": null,
                        "nodeType": "VariableDeclarationStatement",
                        "src": "40812:19:0"
                      },
                      {
                        "assignments": [
                          2338
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 2338,
                            "mutability": "mutable",
                            "name": "len",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 2410,
                            "src": "40841:11:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 2337,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "40841:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 2341,
                        "initialValue": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 2339,
                            "name": "tos",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2313,
                            "src": "40855:3:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_array$_t_address_$dyn_calldata_ptr",
                              "typeString": "address[] calldata"
                            }
                          },
                          "id": 2340,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "length",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": null,
                          "src": "40855:10:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "40841:24:0"
                      },
                      {
                        "body": {
                          "id": 2393,
                          "nodeType": "Block",
                          "src": "40909:228:0",
                          "statements": [
                            {
                              "assignments": [
                                2353
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 2353,
                                  "mutability": "mutable",
                                  "name": "to",
                                  "nodeType": "VariableDeclaration",
                                  "overrides": null,
                                  "scope": 2393,
                                  "src": "40923:10:0",
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  "typeName": {
                                    "id": 2352,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "40923:7:0",
                                    "stateMutability": "nonpayable",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  "value": null,
                                  "visibility": "internal"
                                }
                              ],
                              "id": 2357,
                              "initialValue": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "id": 2354,
                                  "name": "tos",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2313,
                                  "src": "40936:3:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_array$_t_address_$dyn_calldata_ptr",
                                    "typeString": "address[] calldata"
                                  }
                                },
                                "id": 2356,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "id": 2355,
                                  "name": "i",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2343,
                                  "src": "40940:1:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "40936:6:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "nodeType": "VariableDeclarationStatement",
                              "src": "40923:19:0"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 2373,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "baseExpression": {
                                    "argumentTypes": null,
                                    "baseExpression": {
                                      "argumentTypes": null,
                                      "id": 2358,
                                      "name": "balanceOf",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1701,
                                      "src": "40956:9:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_mapping$_t_contract$_IERC20_$67_$_t_mapping$_t_address_$_t_uint256_$_$",
                                        "typeString": "mapping(contract IERC20 => mapping(address => uint256))"
                                      }
                                    },
                                    "id": 2361,
                                    "indexExpression": {
                                      "argumentTypes": null,
                                      "id": 2359,
                                      "name": "token",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2308,
                                      "src": "40966:5:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_IERC20_$67",
                                        "typeString": "contract IERC20"
                                      }
                                    },
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "nodeType": "IndexAccess",
                                    "src": "40956:16:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                      "typeString": "mapping(address => uint256)"
                                    }
                                  },
                                  "id": 2362,
                                  "indexExpression": {
                                    "argumentTypes": null,
                                    "id": 2360,
                                    "name": "to",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2353,
                                    "src": "40973:2:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": true,
                                  "nodeType": "IndexAccess",
                                  "src": "40956:20:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "baseExpression": {
                                        "argumentTypes": null,
                                        "id": 2369,
                                        "name": "shares",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 2316,
                                        "src": "41004:6:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_array$_t_uint256_$dyn_calldata_ptr",
                                          "typeString": "uint256[] calldata"
                                        }
                                      },
                                      "id": 2371,
                                      "indexExpression": {
                                        "argumentTypes": null,
                                        "id": 2370,
                                        "name": "i",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 2343,
                                        "src": "41011:1:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "nodeType": "IndexAccess",
                                      "src": "41004:9:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": null,
                                      "baseExpression": {
                                        "argumentTypes": null,
                                        "baseExpression": {
                                          "argumentTypes": null,
                                          "id": 2363,
                                          "name": "balanceOf",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 1701,
                                          "src": "40979:9:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_mapping$_t_contract$_IERC20_$67_$_t_mapping$_t_address_$_t_uint256_$_$",
                                            "typeString": "mapping(contract IERC20 => mapping(address => uint256))"
                                          }
                                        },
                                        "id": 2365,
                                        "indexExpression": {
                                          "argumentTypes": null,
                                          "id": 2364,
                                          "name": "token",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 2308,
                                          "src": "40989:5:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_contract$_IERC20_$67",
                                            "typeString": "contract IERC20"
                                          }
                                        },
                                        "isConstant": false,
                                        "isLValue": true,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "nodeType": "IndexAccess",
                                        "src": "40979:16:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                          "typeString": "mapping(address => uint256)"
                                        }
                                      },
                                      "id": 2367,
                                      "indexExpression": {
                                        "argumentTypes": null,
                                        "id": 2366,
                                        "name": "to",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 2353,
                                        "src": "40996:2:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_address",
                                          "typeString": "address"
                                        }
                                      },
                                      "isConstant": false,
                                      "isLValue": true,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "nodeType": "IndexAccess",
                                      "src": "40979:20:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "id": 2368,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "add",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 278,
                                    "src": "40979:24:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                      "typeString": "function (uint256,uint256) pure returns (uint256)"
                                    }
                                  },
                                  "id": 2372,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "40979:35:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "40956:58:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 2374,
                              "nodeType": "ExpressionStatement",
                              "src": "40956:58:0"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 2382,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "id": 2375,
                                  "name": "totalAmount",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2335,
                                  "src": "41028:11:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "baseExpression": {
                                        "argumentTypes": null,
                                        "id": 2378,
                                        "name": "shares",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 2316,
                                        "src": "41058:6:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_array$_t_uint256_$dyn_calldata_ptr",
                                          "typeString": "uint256[] calldata"
                                        }
                                      },
                                      "id": 2380,
                                      "indexExpression": {
                                        "argumentTypes": null,
                                        "id": 2379,
                                        "name": "i",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 2343,
                                        "src": "41065:1:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "nodeType": "IndexAccess",
                                      "src": "41058:9:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 2376,
                                      "name": "totalAmount",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2335,
                                      "src": "41042:11:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "id": 2377,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "add",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 278,
                                    "src": "41042:15:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                      "typeString": "function (uint256,uint256) pure returns (uint256)"
                                    }
                                  },
                                  "id": 2381,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "41042:26:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "41028:40:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 2383,
                              "nodeType": "ExpressionStatement",
                              "src": "41028:40:0"
                            },
                            {
                              "eventCall": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 2385,
                                    "name": "token",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2308,
                                    "src": "41099:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IERC20_$67",
                                      "typeString": "contract IERC20"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 2386,
                                    "name": "from",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2310,
                                    "src": "41106:4:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 2387,
                                    "name": "to",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2353,
                                    "src": "41112:2:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "baseExpression": {
                                      "argumentTypes": null,
                                      "id": 2388,
                                      "name": "shares",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2316,
                                      "src": "41116:6:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_array$_t_uint256_$dyn_calldata_ptr",
                                        "typeString": "uint256[] calldata"
                                      }
                                    },
                                    "id": 2390,
                                    "indexExpression": {
                                      "argumentTypes": null,
                                      "id": 2389,
                                      "name": "i",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2343,
                                      "src": "41123:1:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "nodeType": "IndexAccess",
                                    "src": "41116:9:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_contract$_IERC20_$67",
                                      "typeString": "contract IERC20"
                                    },
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "id": 2384,
                                  "name": "LogTransfer",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1612,
                                  "src": "41087:11:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_event_nonpayable$_t_contract$_IERC20_$67_$_t_address_$_t_address_$_t_uint256_$returns$__$",
                                    "typeString": "function (contract IERC20,address,address,uint256)"
                                  }
                                },
                                "id": 2391,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "41087:39:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 2392,
                              "nodeType": "EmitStatement",
                              "src": "41082:44:0"
                            }
                          ]
                        },
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 2348,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 2346,
                            "name": "i",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2343,
                            "src": "40895:1:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "<",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 2347,
                            "name": "len",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2338,
                            "src": "40899:3:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "40895:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 2394,
                        "initializationExpression": {
                          "assignments": [
                            2343
                          ],
                          "declarations": [
                            {
                              "constant": false,
                              "id": 2343,
                              "mutability": "mutable",
                              "name": "i",
                              "nodeType": "VariableDeclaration",
                              "overrides": null,
                              "scope": 2394,
                              "src": "40880:9:0",
                              "stateVariable": false,
                              "storageLocation": "default",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "typeName": {
                                "id": 2342,
                                "name": "uint256",
                                "nodeType": "ElementaryTypeName",
                                "src": "40880:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "value": null,
                              "visibility": "internal"
                            }
                          ],
                          "id": 2345,
                          "initialValue": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 2344,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "40892:1:0",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "nodeType": "VariableDeclarationStatement",
                          "src": "40880:13:0"
                        },
                        "loopExpression": {
                          "expression": {
                            "argumentTypes": null,
                            "id": 2350,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "UnaryOperation",
                            "operator": "++",
                            "prefix": false,
                            "src": "40904:3:0",
                            "subExpression": {
                              "argumentTypes": null,
                              "id": 2349,
                              "name": "i",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2343,
                              "src": "40904:1:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "id": 2351,
                          "nodeType": "ExpressionStatement",
                          "src": "40904:3:0"
                        },
                        "nodeType": "ForStatement",
                        "src": "40875:262:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2408,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "id": 2395,
                                "name": "balanceOf",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1701,
                                "src": "41146:9:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_contract$_IERC20_$67_$_t_mapping$_t_address_$_t_uint256_$_$",
                                  "typeString": "mapping(contract IERC20 => mapping(address => uint256))"
                                }
                              },
                              "id": 2398,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 2396,
                                "name": "token",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2308,
                                "src": "41156:5:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_IERC20_$67",
                                  "typeString": "contract IERC20"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "41146:16:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                "typeString": "mapping(address => uint256)"
                              }
                            },
                            "id": 2399,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 2397,
                              "name": "from",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2310,
                              "src": "41163:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "41146:22:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 2406,
                                "name": "totalAmount",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2335,
                                "src": "41198:11:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "baseExpression": {
                                    "argumentTypes": null,
                                    "id": 2400,
                                    "name": "balanceOf",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1701,
                                    "src": "41171:9:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_mapping$_t_contract$_IERC20_$67_$_t_mapping$_t_address_$_t_uint256_$_$",
                                      "typeString": "mapping(contract IERC20 => mapping(address => uint256))"
                                    }
                                  },
                                  "id": 2402,
                                  "indexExpression": {
                                    "argumentTypes": null,
                                    "id": 2401,
                                    "name": "token",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2308,
                                    "src": "41181:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IERC20_$67",
                                      "typeString": "contract IERC20"
                                    }
                                  },
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "nodeType": "IndexAccess",
                                  "src": "41171:16:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                    "typeString": "mapping(address => uint256)"
                                  }
                                },
                                "id": 2404,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "id": 2403,
                                  "name": "from",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2310,
                                  "src": "41188:4:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "41171:22:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 2405,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sub",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 300,
                              "src": "41171:26:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                "typeString": "function (uint256,uint256) pure returns (uint256)"
                              }
                            },
                            "id": 2407,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "41171:39:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "41146:64:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 2409,
                        "nodeType": "ExpressionStatement",
                        "src": "41146:64:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 2306,
                    "nodeType": "StructuredDocumentation",
                    "src": "40058:303:0",
                    "text": "@notice Transfer shares from a user account to multiple other ones.\n @param token The ERC-20 token to transfer.\n @param from which user to pull the tokens.\n @param tos The receivers of the tokens.\n @param shares The amount of `token` in shares for each receiver in `tos`."
                  },
                  "functionSelector": "0fca8843",
                  "id": 2411,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 2319,
                          "name": "from",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2310,
                          "src": "40652:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        }
                      ],
                      "id": 2320,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 2318,
                        "name": "allowed",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1773,
                        "src": "40644:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$_t_address_$",
                          "typeString": "modifier (address)"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "40644:13:0"
                    }
                  ],
                  "name": "transferMultiple",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 2317,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2308,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2411,
                        "src": "40529:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$67",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 2307,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 67,
                          "src": "40529:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$67",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2310,
                        "mutability": "mutable",
                        "name": "from",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2411,
                        "src": "40551:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 2309,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "40551:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2313,
                        "mutability": "mutable",
                        "name": "tos",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2411,
                        "src": "40573:22:0",
                        "stateVariable": false,
                        "storageLocation": "calldata",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_address_$dyn_calldata_ptr",
                          "typeString": "address[]"
                        },
                        "typeName": {
                          "baseType": {
                            "id": 2311,
                            "name": "address",
                            "nodeType": "ElementaryTypeName",
                            "src": "40573:7:0",
                            "stateMutability": "nonpayable",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "id": 2312,
                          "length": null,
                          "nodeType": "ArrayTypeName",
                          "src": "40573:9:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_address_$dyn_storage_ptr",
                            "typeString": "address[]"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2316,
                        "mutability": "mutable",
                        "name": "shares",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2411,
                        "src": "40605:25:0",
                        "stateVariable": false,
                        "storageLocation": "calldata",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_uint256_$dyn_calldata_ptr",
                          "typeString": "uint256[]"
                        },
                        "typeName": {
                          "baseType": {
                            "id": 2314,
                            "name": "uint256",
                            "nodeType": "ElementaryTypeName",
                            "src": "40605:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "id": 2315,
                          "length": null,
                          "nodeType": "ArrayTypeName",
                          "src": "40605:9:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                            "typeString": "uint256[]"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "40519:117:0"
                  },
                  "returnParameters": {
                    "id": 2321,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "40658:0:0"
                  },
                  "scope": 3101,
                  "src": "40494:723:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 2479,
                    "nodeType": "Block",
                    "src": "42135:384:0",
                    "statements": [
                      {
                        "assignments": [
                          2426
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 2426,
                            "mutability": "mutable",
                            "name": "fee",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 2479,
                            "src": "42145:11:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 2425,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "42145:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 2433,
                        "initialValue": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 2432,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 2429,
                                "name": "FLASH_LOAN_FEE",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1683,
                                "src": "42170:14:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "id": 2427,
                                "name": "amount",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2420,
                                "src": "42159:6:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 2428,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "mul",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 328,
                              "src": "42159:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                "typeString": "function (uint256,uint256) pure returns (uint256)"
                              }
                            },
                            "id": 2430,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "42159:26:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "/",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 2431,
                            "name": "FLASH_LOAN_FEE_PRECISION",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1686,
                            "src": "42188:24:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "42159:53:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "42145:67:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 2437,
                              "name": "receiver",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2416,
                              "src": "42241:8:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2438,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2420,
                              "src": "42251:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 2434,
                              "name": "token",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2418,
                              "src": "42222:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$67",
                                "typeString": "contract IERC20"
                              }
                            },
                            "id": 2436,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "safeTransfer",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 204,
                            "src": "42222:18:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC20_$67_$_t_address_$_t_uint256_$returns$__$bound_to$_t_contract$_IERC20_$67_$",
                              "typeString": "function (contract IERC20,address,uint256)"
                            }
                          },
                          "id": 2439,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "42222:36:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2440,
                        "nodeType": "ExpressionStatement",
                        "src": "42222:36:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 2444,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "42290:3:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 2445,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "42290:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2446,
                              "name": "token",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2418,
                              "src": "42302:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$67",
                                "typeString": "contract IERC20"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2447,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2420,
                              "src": "42309:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2448,
                              "name": "fee",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2426,
                              "src": "42317:3:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2449,
                              "name": "data",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2422,
                              "src": "42322:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_calldata_ptr",
                                "typeString": "bytes calldata"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              },
                              {
                                "typeIdentifier": "t_contract$_IERC20_$67",
                                "typeString": "contract IERC20"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_bytes_calldata_ptr",
                                "typeString": "bytes calldata"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 2441,
                              "name": "borrower",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2414,
                              "src": "42269:8:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IFlashBorrower_$82",
                                "typeString": "contract IFlashBorrower"
                              }
                            },
                            "id": 2443,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "onFlashLoan",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 81,
                            "src": "42269:20:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_contract$_IERC20_$67_$_t_uint256_$_t_uint256_$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (address,contract IERC20,uint256,uint256,bytes memory) external"
                            }
                          },
                          "id": 2450,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "42269:58:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2451,
                        "nodeType": "ExpressionStatement",
                        "src": "42269:58:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 2464,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 2454,
                                    "name": "token",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2418,
                                    "src": "42362:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IERC20_$67",
                                      "typeString": "contract IERC20"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_contract$_IERC20_$67",
                                      "typeString": "contract IERC20"
                                    }
                                  ],
                                  "id": 2453,
                                  "name": "_tokenBalanceOf",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1798,
                                  "src": "42346:15:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_view$_t_contract$_IERC20_$67_$returns$_t_uint256_$",
                                    "typeString": "function (contract IERC20) view returns (uint256)"
                                  }
                                },
                                "id": 2455,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "42346:22:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": ">=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "arguments": [],
                                    "expression": {
                                      "argumentTypes": [],
                                      "expression": {
                                        "argumentTypes": null,
                                        "id": 2460,
                                        "name": "fee",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 2426,
                                        "src": "42397:3:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "id": 2461,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "memberName": "to128",
                                      "nodeType": "MemberAccess",
                                      "referencedDeclaration": 354,
                                      "src": "42397:9:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint128_$bound_to$_t_uint256_$",
                                        "typeString": "function (uint256) pure returns (uint128)"
                                      }
                                    },
                                    "id": 2462,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "functionCall",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "42397:11:0",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint128",
                                      "typeString": "uint128"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_uint128",
                                      "typeString": "uint128"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "baseExpression": {
                                      "argumentTypes": null,
                                      "id": 2456,
                                      "name": "totals",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1705,
                                      "src": "42372:6:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_mapping$_t_contract$_IERC20_$67_$_t_struct$_Rebase_$550_storage_$",
                                        "typeString": "mapping(contract IERC20 => struct Rebase storage ref)"
                                      }
                                    },
                                    "id": 2458,
                                    "indexExpression": {
                                      "argumentTypes": null,
                                      "id": 2457,
                                      "name": "token",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2418,
                                      "src": "42379:5:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_IERC20_$67",
                                        "typeString": "contract IERC20"
                                      }
                                    },
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "nodeType": "IndexAccess",
                                    "src": "42372:13:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_struct$_Rebase_$550_storage",
                                      "typeString": "struct Rebase storage ref"
                                    }
                                  },
                                  "id": 2459,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "addElastic",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 873,
                                  "src": "42372:24:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_Rebase_$550_storage_ptr_$_t_uint256_$returns$_t_uint256_$bound_to$_t_struct$_Rebase_$550_storage_ptr_$",
                                    "typeString": "function (struct Rebase storage pointer,uint256) returns (uint256)"
                                  }
                                },
                                "id": 2463,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "42372:37:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "src": "42346:63:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "42656e746f426f783a2057726f6e6720616d6f756e74",
                              "id": 2465,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "42411:24:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_ec29ab2461bde73dbbafac2abefcdcf48be19dab993d25b4afd49bb37dc19396",
                                "typeString": "literal_string \"BentoBox: Wrong amount\""
                              },
                              "value": "BentoBox: Wrong amount"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_ec29ab2461bde73dbbafac2abefcdcf48be19dab993d25b4afd49bb37dc19396",
                                "typeString": "literal_string \"BentoBox: Wrong amount\""
                              }
                            ],
                            "id": 2452,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "42338:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 2466,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "42338:98:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2467,
                        "nodeType": "ExpressionStatement",
                        "src": "42338:98:0"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 2471,
                                  "name": "borrower",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2414,
                                  "src": "42472:8:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_IFlashBorrower_$82",
                                    "typeString": "contract IFlashBorrower"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_IFlashBorrower_$82",
                                    "typeString": "contract IFlashBorrower"
                                  }
                                ],
                                "id": 2470,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "42464:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 2469,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "42464:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 2472,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "42464:17:0",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2473,
                              "name": "token",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2418,
                              "src": "42483:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$67",
                                "typeString": "contract IERC20"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2474,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2420,
                              "src": "42490:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2475,
                              "name": "fee",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2426,
                              "src": "42498:3:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2476,
                              "name": "receiver",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2416,
                              "src": "42503:8:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_contract$_IERC20_$67",
                                "typeString": "contract IERC20"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "id": 2468,
                            "name": "LogFlashLoan",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1624,
                            "src": "42451:12:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_contract$_IERC20_$67_$_t_uint256_$_t_uint256_$_t_address_$returns$__$",
                              "typeString": "function (address,contract IERC20,uint256,uint256,address)"
                            }
                          },
                          "id": 2477,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "42451:61:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2478,
                        "nodeType": "EmitStatement",
                        "src": "42446:66:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 2412,
                    "nodeType": "StructuredDocumentation",
                    "src": "41223:388:0",
                    "text": "@notice Flashloan ability.\n @param borrower The address of the contract that implements and conforms to `IFlashBorrower` and handles the flashloan.\n @param receiver Address of the token receiver.\n @param token The address of the token to receive.\n @param amount of the tokens to receive.\n @param data The calldata to pass to the `borrower` contract."
                  },
                  "functionSelector": "f1676d37",
                  "id": 2480,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "flashLoan",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 2423,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2414,
                        "mutability": "mutable",
                        "name": "borrower",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2480,
                        "src": "41997:23:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IFlashBorrower_$82",
                          "typeString": "contract IFlashBorrower"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 2413,
                          "name": "IFlashBorrower",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 82,
                          "src": "41997:14:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IFlashBorrower_$82",
                            "typeString": "contract IFlashBorrower"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2416,
                        "mutability": "mutable",
                        "name": "receiver",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2480,
                        "src": "42030:16:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 2415,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "42030:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2418,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2480,
                        "src": "42056:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$67",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 2417,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 67,
                          "src": "42056:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$67",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2420,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2480,
                        "src": "42078:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 2419,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "42078:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2422,
                        "mutability": "mutable",
                        "name": "data",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2480,
                        "src": "42102:19:0",
                        "stateVariable": false,
                        "storageLocation": "calldata",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_calldata_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 2421,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "42102:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "41987:140:0"
                  },
                  "returnParameters": {
                    "id": 2424,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "42135:0:0"
                  },
                  "scope": 3101,
                  "src": "41969:550:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 2619,
                    "nodeType": "Block",
                    "src": "43626:720:0",
                    "statements": [
                      {
                        "assignments": [
                          2501
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 2501,
                            "mutability": "mutable",
                            "name": "fees",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 2619,
                            "src": "43636:21:0",
                            "stateVariable": false,
                            "storageLocation": "memory",
                            "typeDescriptions": {
                              "typeIdentifier": "t_array$_t_uint256_$dyn_memory_ptr",
                              "typeString": "uint256[]"
                            },
                            "typeName": {
                              "baseType": {
                                "id": 2499,
                                "name": "uint256",
                                "nodeType": "ElementaryTypeName",
                                "src": "43636:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 2500,
                              "length": null,
                              "nodeType": "ArrayTypeName",
                              "src": "43636:9:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                                "typeString": "uint256[]"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 2508,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 2505,
                                "name": "tokens",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2489,
                                "src": "43674:6:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_array$_t_contract$_IERC20_$67_$dyn_calldata_ptr",
                                  "typeString": "contract IERC20[] calldata"
                                }
                              },
                              "id": 2506,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "length",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "43674:13:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 2504,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "NewExpression",
                            "src": "43660:13:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_objectcreation_pure$_t_uint256_$returns$_t_array$_t_uint256_$dyn_memory_ptr_$",
                              "typeString": "function (uint256) pure returns (uint256[] memory)"
                            },
                            "typeName": {
                              "baseType": {
                                "id": 2502,
                                "name": "uint256",
                                "nodeType": "ElementaryTypeName",
                                "src": "43664:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 2503,
                              "length": null,
                              "nodeType": "ArrayTypeName",
                              "src": "43664:9:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                                "typeString": "uint256[]"
                              }
                            }
                          },
                          "id": 2507,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "43660:28:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_uint256_$dyn_memory_ptr",
                            "typeString": "uint256[] memory"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "43636:52:0"
                      },
                      {
                        "assignments": [
                          2510
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 2510,
                            "mutability": "mutable",
                            "name": "len",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 2619,
                            "src": "43699:11:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 2509,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "43699:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 2513,
                        "initialValue": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 2511,
                            "name": "tokens",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2489,
                            "src": "43713:6:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_array$_t_contract$_IERC20_$67_$dyn_calldata_ptr",
                              "typeString": "contract IERC20[] calldata"
                            }
                          },
                          "id": 2512,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "length",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": null,
                          "src": "43713:13:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "43699:27:0"
                      },
                      {
                        "body": {
                          "id": 2553,
                          "nodeType": "Block",
                          "src": "43770:192:0",
                          "statements": [
                            {
                              "assignments": [
                                2525
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 2525,
                                  "mutability": "mutable",
                                  "name": "amount",
                                  "nodeType": "VariableDeclaration",
                                  "overrides": null,
                                  "scope": 2553,
                                  "src": "43784:14:0",
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "typeName": {
                                    "id": 2524,
                                    "name": "uint256",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "43784:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "value": null,
                                  "visibility": "internal"
                                }
                              ],
                              "id": 2529,
                              "initialValue": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "id": 2526,
                                  "name": "amounts",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2492,
                                  "src": "43801:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_array$_t_uint256_$dyn_calldata_ptr",
                                    "typeString": "uint256[] calldata"
                                  }
                                },
                                "id": 2528,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "id": 2527,
                                  "name": "i",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2515,
                                  "src": "43809:1:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "43801:10:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "VariableDeclarationStatement",
                              "src": "43784:27:0"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 2539,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "baseExpression": {
                                    "argumentTypes": null,
                                    "id": 2530,
                                    "name": "fees",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2501,
                                    "src": "43825:4:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_array$_t_uint256_$dyn_memory_ptr",
                                      "typeString": "uint256[] memory"
                                    }
                                  },
                                  "id": 2532,
                                  "indexExpression": {
                                    "argumentTypes": null,
                                    "id": 2531,
                                    "name": "i",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2515,
                                    "src": "43830:1:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": true,
                                  "nodeType": "IndexAccess",
                                  "src": "43825:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "commonType": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "id": 2538,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "leftExpression": {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "id": 2535,
                                        "name": "FLASH_LOAN_FEE",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 1683,
                                        "src": "43846:14:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": null,
                                        "id": 2533,
                                        "name": "amount",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 2525,
                                        "src": "43835:6:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "id": 2534,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "memberName": "mul",
                                      "nodeType": "MemberAccess",
                                      "referencedDeclaration": 328,
                                      "src": "43835:10:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                        "typeString": "function (uint256,uint256) pure returns (uint256)"
                                      }
                                    },
                                    "id": 2536,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "functionCall",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "43835:26:0",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "nodeType": "BinaryOperation",
                                  "operator": "/",
                                  "rightExpression": {
                                    "argumentTypes": null,
                                    "id": 2537,
                                    "name": "FLASH_LOAN_FEE_PRECISION",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1686,
                                    "src": "43864:24:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "src": "43835:53:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "43825:63:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 2540,
                              "nodeType": "ExpressionStatement",
                              "src": "43825:63:0"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "baseExpression": {
                                      "argumentTypes": null,
                                      "id": 2545,
                                      "name": "receivers",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2486,
                                      "src": "43926:9:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_array$_t_address_$dyn_calldata_ptr",
                                        "typeString": "address[] calldata"
                                      }
                                    },
                                    "id": 2547,
                                    "indexExpression": {
                                      "argumentTypes": null,
                                      "id": 2546,
                                      "name": "i",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2515,
                                      "src": "43936:1:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "nodeType": "IndexAccess",
                                    "src": "43926:12:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "baseExpression": {
                                      "argumentTypes": null,
                                      "id": 2548,
                                      "name": "amounts",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2492,
                                      "src": "43940:7:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_array$_t_uint256_$dyn_calldata_ptr",
                                        "typeString": "uint256[] calldata"
                                      }
                                    },
                                    "id": 2550,
                                    "indexExpression": {
                                      "argumentTypes": null,
                                      "id": 2549,
                                      "name": "i",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2515,
                                      "src": "43948:1:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "nodeType": "IndexAccess",
                                    "src": "43940:10:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "baseExpression": {
                                      "argumentTypes": null,
                                      "id": 2541,
                                      "name": "tokens",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2489,
                                      "src": "43903:6:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_array$_t_contract$_IERC20_$67_$dyn_calldata_ptr",
                                        "typeString": "contract IERC20[] calldata"
                                      }
                                    },
                                    "id": 2543,
                                    "indexExpression": {
                                      "argumentTypes": null,
                                      "id": 2542,
                                      "name": "i",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2515,
                                      "src": "43910:1:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "nodeType": "IndexAccess",
                                    "src": "43903:9:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IERC20_$67",
                                      "typeString": "contract IERC20"
                                    }
                                  },
                                  "id": 2544,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "safeTransfer",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 204,
                                  "src": "43903:22:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC20_$67_$_t_address_$_t_uint256_$returns$__$bound_to$_t_contract$_IERC20_$67_$",
                                    "typeString": "function (contract IERC20,address,uint256)"
                                  }
                                },
                                "id": 2551,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "43903:48:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 2552,
                              "nodeType": "ExpressionStatement",
                              "src": "43903:48:0"
                            }
                          ]
                        },
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 2520,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 2518,
                            "name": "i",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2515,
                            "src": "43756:1:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "<",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 2519,
                            "name": "len",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2510,
                            "src": "43760:3:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "43756:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 2554,
                        "initializationExpression": {
                          "assignments": [
                            2515
                          ],
                          "declarations": [
                            {
                              "constant": false,
                              "id": 2515,
                              "mutability": "mutable",
                              "name": "i",
                              "nodeType": "VariableDeclaration",
                              "overrides": null,
                              "scope": 2554,
                              "src": "43741:9:0",
                              "stateVariable": false,
                              "storageLocation": "default",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "typeName": {
                                "id": 2514,
                                "name": "uint256",
                                "nodeType": "ElementaryTypeName",
                                "src": "43741:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "value": null,
                              "visibility": "internal"
                            }
                          ],
                          "id": 2517,
                          "initialValue": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 2516,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "43753:1:0",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "nodeType": "VariableDeclarationStatement",
                          "src": "43741:13:0"
                        },
                        "loopExpression": {
                          "expression": {
                            "argumentTypes": null,
                            "id": 2522,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "UnaryOperation",
                            "operator": "++",
                            "prefix": false,
                            "src": "43765:3:0",
                            "subExpression": {
                              "argumentTypes": null,
                              "id": 2521,
                              "name": "i",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2515,
                              "src": "43765:1:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "id": 2523,
                          "nodeType": "ExpressionStatement",
                          "src": "43765:3:0"
                        },
                        "nodeType": "ForStatement",
                        "src": "43736:226:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 2558,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "43998:3:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 2559,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "43998:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2560,
                              "name": "tokens",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2489,
                              "src": "44010:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_contract$_IERC20_$67_$dyn_calldata_ptr",
                                "typeString": "contract IERC20[] calldata"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2561,
                              "name": "amounts",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2492,
                              "src": "44018:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_uint256_$dyn_calldata_ptr",
                                "typeString": "uint256[] calldata"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2562,
                              "name": "fees",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2501,
                              "src": "44027:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_uint256_$dyn_memory_ptr",
                                "typeString": "uint256[] memory"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2563,
                              "name": "data",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2494,
                              "src": "44033:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_calldata_ptr",
                                "typeString": "bytes calldata"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              },
                              {
                                "typeIdentifier": "t_array$_t_contract$_IERC20_$67_$dyn_calldata_ptr",
                                "typeString": "contract IERC20[] calldata"
                              },
                              {
                                "typeIdentifier": "t_array$_t_uint256_$dyn_calldata_ptr",
                                "typeString": "uint256[] calldata"
                              },
                              {
                                "typeIdentifier": "t_array$_t_uint256_$dyn_memory_ptr",
                                "typeString": "uint256[] memory"
                              },
                              {
                                "typeIdentifier": "t_bytes_calldata_ptr",
                                "typeString": "bytes calldata"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 2555,
                              "name": "borrower",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2483,
                              "src": "43972:8:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IBatchFlashBorrower_$100",
                                "typeString": "contract IBatchFlashBorrower"
                              }
                            },
                            "id": 2557,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "onBatchFlashLoan",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 99,
                            "src": "43972:25:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_array$_t_contract$_IERC20_$67_$dyn_memory_ptr_$_t_array$_t_uint256_$dyn_memory_ptr_$_t_array$_t_uint256_$dyn_memory_ptr_$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (address,contract IERC20[] memory,uint256[] memory,uint256[] memory,bytes memory) external"
                            }
                          },
                          "id": 2564,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "43972:66:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2565,
                        "nodeType": "ExpressionStatement",
                        "src": "43972:66:0"
                      },
                      {
                        "body": {
                          "id": 2617,
                          "nodeType": "Block",
                          "src": "44083:257:0",
                          "statements": [
                            {
                              "assignments": [
                                2577
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 2577,
                                  "mutability": "mutable",
                                  "name": "token",
                                  "nodeType": "VariableDeclaration",
                                  "overrides": null,
                                  "scope": 2617,
                                  "src": "44097:12:0",
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_IERC20_$67",
                                    "typeString": "contract IERC20"
                                  },
                                  "typeName": {
                                    "contractScope": null,
                                    "id": 2576,
                                    "name": "IERC20",
                                    "nodeType": "UserDefinedTypeName",
                                    "referencedDeclaration": 67,
                                    "src": "44097:6:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IERC20_$67",
                                      "typeString": "contract IERC20"
                                    }
                                  },
                                  "value": null,
                                  "visibility": "internal"
                                }
                              ],
                              "id": 2581,
                              "initialValue": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "id": 2578,
                                  "name": "tokens",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2489,
                                  "src": "44112:6:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_array$_t_contract$_IERC20_$67_$dyn_calldata_ptr",
                                    "typeString": "contract IERC20[] calldata"
                                  }
                                },
                                "id": 2580,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "id": 2579,
                                  "name": "i",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2567,
                                  "src": "44119:1:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "44112:9:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_IERC20_$67",
                                  "typeString": "contract IERC20"
                                }
                              },
                              "nodeType": "VariableDeclarationStatement",
                              "src": "44097:24:0"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "commonType": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    },
                                    "id": 2596,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "leftExpression": {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "id": 2584,
                                          "name": "token",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 2577,
                                          "src": "44159:5:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_contract$_IERC20_$67",
                                            "typeString": "contract IERC20"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_contract$_IERC20_$67",
                                            "typeString": "contract IERC20"
                                          }
                                        ],
                                        "id": 2583,
                                        "name": "_tokenBalanceOf",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 1798,
                                        "src": "44143:15:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_function_internal_view$_t_contract$_IERC20_$67_$returns$_t_uint256_$",
                                          "typeString": "function (contract IERC20) view returns (uint256)"
                                        }
                                      },
                                      "id": 2585,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "44143:22:0",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "nodeType": "BinaryOperation",
                                    "operator": ">=",
                                    "rightExpression": {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "arguments": [],
                                          "expression": {
                                            "argumentTypes": [],
                                            "expression": {
                                              "argumentTypes": null,
                                              "baseExpression": {
                                                "argumentTypes": null,
                                                "id": 2590,
                                                "name": "fees",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 2501,
                                                "src": "44194:4:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_array$_t_uint256_$dyn_memory_ptr",
                                                  "typeString": "uint256[] memory"
                                                }
                                              },
                                              "id": 2592,
                                              "indexExpression": {
                                                "argumentTypes": null,
                                                "id": 2591,
                                                "name": "i",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 2567,
                                                "src": "44199:1:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_uint256",
                                                  "typeString": "uint256"
                                                }
                                              },
                                              "isConstant": false,
                                              "isLValue": true,
                                              "isPure": false,
                                              "lValueRequested": false,
                                              "nodeType": "IndexAccess",
                                              "src": "44194:7:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_uint256",
                                                "typeString": "uint256"
                                              }
                                            },
                                            "id": 2593,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "memberName": "to128",
                                            "nodeType": "MemberAccess",
                                            "referencedDeclaration": 354,
                                            "src": "44194:13:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint128_$bound_to$_t_uint256_$",
                                              "typeString": "function (uint256) pure returns (uint128)"
                                            }
                                          },
                                          "id": 2594,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "kind": "functionCall",
                                          "lValueRequested": false,
                                          "names": [],
                                          "nodeType": "FunctionCall",
                                          "src": "44194:15:0",
                                          "tryCall": false,
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint128",
                                            "typeString": "uint128"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_uint128",
                                            "typeString": "uint128"
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": null,
                                          "baseExpression": {
                                            "argumentTypes": null,
                                            "id": 2586,
                                            "name": "totals",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 1705,
                                            "src": "44169:6:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_mapping$_t_contract$_IERC20_$67_$_t_struct$_Rebase_$550_storage_$",
                                              "typeString": "mapping(contract IERC20 => struct Rebase storage ref)"
                                            }
                                          },
                                          "id": 2588,
                                          "indexExpression": {
                                            "argumentTypes": null,
                                            "id": 2587,
                                            "name": "token",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 2577,
                                            "src": "44176:5:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_contract$_IERC20_$67",
                                              "typeString": "contract IERC20"
                                            }
                                          },
                                          "isConstant": false,
                                          "isLValue": true,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "nodeType": "IndexAccess",
                                          "src": "44169:13:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_struct$_Rebase_$550_storage",
                                            "typeString": "struct Rebase storage ref"
                                          }
                                        },
                                        "id": 2589,
                                        "isConstant": false,
                                        "isLValue": true,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "memberName": "addElastic",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": 873,
                                        "src": "44169:24:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_Rebase_$550_storage_ptr_$_t_uint256_$returns$_t_uint256_$bound_to$_t_struct$_Rebase_$550_storage_ptr_$",
                                          "typeString": "function (struct Rebase storage pointer,uint256) returns (uint256)"
                                        }
                                      },
                                      "id": 2595,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "44169:41:0",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "src": "44143:67:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "42656e746f426f783a2057726f6e6720616d6f756e74",
                                    "id": 2597,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "string",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "44212:24:0",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_stringliteral_ec29ab2461bde73dbbafac2abefcdcf48be19dab993d25b4afd49bb37dc19396",
                                      "typeString": "literal_string \"BentoBox: Wrong amount\""
                                    },
                                    "value": "BentoBox: Wrong amount"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    },
                                    {
                                      "typeIdentifier": "t_stringliteral_ec29ab2461bde73dbbafac2abefcdcf48be19dab993d25b4afd49bb37dc19396",
                                      "typeString": "literal_string \"BentoBox: Wrong amount\""
                                    }
                                  ],
                                  "id": 2582,
                                  "name": "require",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [
                                    -18,
                                    -18
                                  ],
                                  "referencedDeclaration": -18,
                                  "src": "44135:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                                    "typeString": "function (bool,string memory) pure"
                                  }
                                },
                                "id": 2598,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "44135:102:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 2599,
                              "nodeType": "ExpressionStatement",
                              "src": "44135:102:0"
                            },
                            {
                              "eventCall": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "id": 2603,
                                        "name": "borrower",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 2483,
                                        "src": "44277:8:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_contract$_IBatchFlashBorrower_$100",
                                          "typeString": "contract IBatchFlashBorrower"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_contract$_IBatchFlashBorrower_$100",
                                          "typeString": "contract IBatchFlashBorrower"
                                        }
                                      ],
                                      "id": 2602,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "lValueRequested": false,
                                      "nodeType": "ElementaryTypeNameExpression",
                                      "src": "44269:7:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_type$_t_address_$",
                                        "typeString": "type(address)"
                                      },
                                      "typeName": {
                                        "id": 2601,
                                        "name": "address",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "44269:7:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": null,
                                          "typeString": null
                                        }
                                      }
                                    },
                                    "id": 2604,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "typeConversion",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "44269:17:0",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 2605,
                                    "name": "token",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2577,
                                    "src": "44288:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IERC20_$67",
                                      "typeString": "contract IERC20"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "baseExpression": {
                                      "argumentTypes": null,
                                      "id": 2606,
                                      "name": "amounts",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2492,
                                      "src": "44295:7:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_array$_t_uint256_$dyn_calldata_ptr",
                                        "typeString": "uint256[] calldata"
                                      }
                                    },
                                    "id": 2608,
                                    "indexExpression": {
                                      "argumentTypes": null,
                                      "id": 2607,
                                      "name": "i",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2567,
                                      "src": "44303:1:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "nodeType": "IndexAccess",
                                    "src": "44295:10:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "baseExpression": {
                                      "argumentTypes": null,
                                      "id": 2609,
                                      "name": "fees",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2501,
                                      "src": "44307:4:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_array$_t_uint256_$dyn_memory_ptr",
                                        "typeString": "uint256[] memory"
                                      }
                                    },
                                    "id": 2611,
                                    "indexExpression": {
                                      "argumentTypes": null,
                                      "id": 2610,
                                      "name": "i",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2567,
                                      "src": "44312:1:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "nodeType": "IndexAccess",
                                    "src": "44307:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "baseExpression": {
                                      "argumentTypes": null,
                                      "id": 2612,
                                      "name": "receivers",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2486,
                                      "src": "44316:9:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_array$_t_address_$dyn_calldata_ptr",
                                        "typeString": "address[] calldata"
                                      }
                                    },
                                    "id": 2614,
                                    "indexExpression": {
                                      "argumentTypes": null,
                                      "id": 2613,
                                      "name": "i",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2567,
                                      "src": "44326:1:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "nodeType": "IndexAccess",
                                    "src": "44316:12:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    {
                                      "typeIdentifier": "t_contract$_IERC20_$67",
                                      "typeString": "contract IERC20"
                                    },
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    },
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    },
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  ],
                                  "id": 2600,
                                  "name": "LogFlashLoan",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1624,
                                  "src": "44256:12:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_contract$_IERC20_$67_$_t_uint256_$_t_uint256_$_t_address_$returns$__$",
                                    "typeString": "function (address,contract IERC20,uint256,uint256,address)"
                                  }
                                },
                                "id": 2615,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "44256:73:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 2616,
                              "nodeType": "EmitStatement",
                              "src": "44251:78:0"
                            }
                          ]
                        },
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 2572,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 2570,
                            "name": "i",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2567,
                            "src": "44069:1:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "<",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 2571,
                            "name": "len",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2510,
                            "src": "44073:3:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "44069:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 2618,
                        "initializationExpression": {
                          "assignments": [
                            2567
                          ],
                          "declarations": [
                            {
                              "constant": false,
                              "id": 2567,
                              "mutability": "mutable",
                              "name": "i",
                              "nodeType": "VariableDeclaration",
                              "overrides": null,
                              "scope": 2618,
                              "src": "44054:9:0",
                              "stateVariable": false,
                              "storageLocation": "default",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "typeName": {
                                "id": 2566,
                                "name": "uint256",
                                "nodeType": "ElementaryTypeName",
                                "src": "44054:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "value": null,
                              "visibility": "internal"
                            }
                          ],
                          "id": 2569,
                          "initialValue": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 2568,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "44066:1:0",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "nodeType": "VariableDeclarationStatement",
                          "src": "44054:13:0"
                        },
                        "loopExpression": {
                          "expression": {
                            "argumentTypes": null,
                            "id": 2574,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "UnaryOperation",
                            "operator": "++",
                            "prefix": false,
                            "src": "44078:3:0",
                            "subExpression": {
                              "argumentTypes": null,
                              "id": 2573,
                              "name": "i",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2567,
                              "src": "44078:1:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "id": 2575,
                          "nodeType": "ExpressionStatement",
                          "src": "44078:3:0"
                        },
                        "nodeType": "ForStatement",
                        "src": "44049:291:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 2481,
                    "nodeType": "StructuredDocumentation",
                    "src": "42525:531:0",
                    "text": "@notice Support for batched flashloans. Useful to request multiple different `tokens` in a single transaction.\n @param borrower The address of the contract that implements and conforms to `IBatchFlashBorrower` and handles the flashloan.\n @param receivers An array of the token receivers. A one-to-one mapping with `tokens` and `amounts`.\n @param tokens The addresses of the tokens.\n @param amounts of the tokens for each receiver.\n @param data The calldata to pass to the `borrower` contract."
                  },
                  "functionSelector": "f483b3da",
                  "id": 2620,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "batchFlashLoan",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 2495,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2483,
                        "mutability": "mutable",
                        "name": "borrower",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2620,
                        "src": "43447:28:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IBatchFlashBorrower_$100",
                          "typeString": "contract IBatchFlashBorrower"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 2482,
                          "name": "IBatchFlashBorrower",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 100,
                          "src": "43447:19:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IBatchFlashBorrower_$100",
                            "typeString": "contract IBatchFlashBorrower"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2486,
                        "mutability": "mutable",
                        "name": "receivers",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2620,
                        "src": "43485:28:0",
                        "stateVariable": false,
                        "storageLocation": "calldata",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_address_$dyn_calldata_ptr",
                          "typeString": "address[]"
                        },
                        "typeName": {
                          "baseType": {
                            "id": 2484,
                            "name": "address",
                            "nodeType": "ElementaryTypeName",
                            "src": "43485:7:0",
                            "stateMutability": "nonpayable",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "id": 2485,
                          "length": null,
                          "nodeType": "ArrayTypeName",
                          "src": "43485:9:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_address_$dyn_storage_ptr",
                            "typeString": "address[]"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2489,
                        "mutability": "mutable",
                        "name": "tokens",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2620,
                        "src": "43523:24:0",
                        "stateVariable": false,
                        "storageLocation": "calldata",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_contract$_IERC20_$67_$dyn_calldata_ptr",
                          "typeString": "contract IERC20[]"
                        },
                        "typeName": {
                          "baseType": {
                            "contractScope": null,
                            "id": 2487,
                            "name": "IERC20",
                            "nodeType": "UserDefinedTypeName",
                            "referencedDeclaration": 67,
                            "src": "43523:6:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC20_$67",
                              "typeString": "contract IERC20"
                            }
                          },
                          "id": 2488,
                          "length": null,
                          "nodeType": "ArrayTypeName",
                          "src": "43523:8:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_contract$_IERC20_$67_$dyn_storage_ptr",
                            "typeString": "contract IERC20[]"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2492,
                        "mutability": "mutable",
                        "name": "amounts",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2620,
                        "src": "43557:26:0",
                        "stateVariable": false,
                        "storageLocation": "calldata",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_uint256_$dyn_calldata_ptr",
                          "typeString": "uint256[]"
                        },
                        "typeName": {
                          "baseType": {
                            "id": 2490,
                            "name": "uint256",
                            "nodeType": "ElementaryTypeName",
                            "src": "43557:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "id": 2491,
                          "length": null,
                          "nodeType": "ArrayTypeName",
                          "src": "43557:9:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                            "typeString": "uint256[]"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2494,
                        "mutability": "mutable",
                        "name": "data",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2620,
                        "src": "43593:19:0",
                        "stateVariable": false,
                        "storageLocation": "calldata",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_calldata_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 2493,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "43593:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "43437:181:0"
                  },
                  "returnParameters": {
                    "id": 2496,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "43626:0:0"
                  },
                  "scope": 3101,
                  "src": "43414:932:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 2649,
                    "nodeType": "Block",
                    "src": "44783:276:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 2633,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 2631,
                                "name": "targetPercentage_",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2625,
                                "src": "44819:17:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint64",
                                  "typeString": "uint64"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "<=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 2632,
                                "name": "MAX_TARGET_PERCENTAGE",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1692,
                                "src": "44840:21:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "src": "44819:42:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "53747261746567794d616e616765723a2054617267657420746f6f2068696768",
                              "id": 2634,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "44863:34:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_fa169a3b7ec1ea7a2a1a50e5f856d1f4ecd22f3eaba96fbdaee65d4d00485419",
                                "typeString": "literal_string \"StrategyManager: Target too high\""
                              },
                              "value": "StrategyManager: Target too high"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_fa169a3b7ec1ea7a2a1a50e5f856d1f4ecd22f3eaba96fbdaee65d4d00485419",
                                "typeString": "literal_string \"StrategyManager: Target too high\""
                              }
                            ],
                            "id": 2630,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "44811:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 2635,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "44811:87:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2636,
                        "nodeType": "ExpressionStatement",
                        "src": "44811:87:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2642,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "id": 2637,
                                "name": "strategyData",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1717,
                                "src": "44928:12:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_contract$_IERC20_$67_$_t_struct$_StrategyData_$1673_storage_$",
                                  "typeString": "mapping(contract IERC20 => struct BentoBoxV1.StrategyData storage ref)"
                                }
                              },
                              "id": 2639,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 2638,
                                "name": "token",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2623,
                                "src": "44941:5:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_IERC20_$67",
                                  "typeString": "contract IERC20"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "44928:19:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_StrategyData_$1673_storage",
                                "typeString": "struct BentoBoxV1.StrategyData storage ref"
                              }
                            },
                            "id": 2640,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberName": "targetPercentage",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1670,
                            "src": "44928:36:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint64",
                              "typeString": "uint64"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 2641,
                            "name": "targetPercentage_",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2625,
                            "src": "44967:17:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint64",
                              "typeString": "uint64"
                            }
                          },
                          "src": "44928:56:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint64",
                            "typeString": "uint64"
                          }
                        },
                        "id": 2643,
                        "nodeType": "ExpressionStatement",
                        "src": "44928:56:0"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 2645,
                              "name": "token",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2623,
                              "src": "45027:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$67",
                                "typeString": "contract IERC20"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2646,
                              "name": "targetPercentage_",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2625,
                              "src": "45034:17:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint64",
                                "typeString": "uint64"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_IERC20_$67",
                                "typeString": "contract IERC20"
                              },
                              {
                                "typeIdentifier": "t_uint64",
                                "typeString": "uint64"
                              }
                            ],
                            "id": 2644,
                            "name": "LogStrategyTargetPercentage",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1630,
                            "src": "44999:27:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_contract$_IERC20_$67_$_t_uint256_$returns$__$",
                              "typeString": "function (contract IERC20,uint256)"
                            }
                          },
                          "id": 2647,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "44999:53:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2648,
                        "nodeType": "EmitStatement",
                        "src": "44994:58:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 2621,
                    "nodeType": "StructuredDocumentation",
                    "src": "44352:332:0",
                    "text": "@notice Sets the target percentage of the strategy for `token`.\n @dev Only the owner of this contract is allowed to change this.\n @param token The address of the token that maps to a strategy to change.\n @param targetPercentage_ The new target in percent. Must be lesser or equal to `MAX_TARGET_PERCENTAGE`."
                  },
                  "functionSelector": "3e2a9d4e",
                  "id": 2650,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 2628,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 2627,
                        "name": "onlyOwner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1025,
                        "src": "44773:9:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "44773:9:0"
                    }
                  ],
                  "name": "setStrategyTargetPercentage",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 2626,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2623,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2650,
                        "src": "44726:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$67",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 2622,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 67,
                          "src": "44726:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$67",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2625,
                        "mutability": "mutable",
                        "name": "targetPercentage_",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2650,
                        "src": "44740:24:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint64",
                          "typeString": "uint64"
                        },
                        "typeName": {
                          "id": 2624,
                          "name": "uint64",
                          "nodeType": "ElementaryTypeName",
                          "src": "44740:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint64",
                            "typeString": "uint64"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "44725:40:0"
                  },
                  "returnParameters": {
                    "id": 2629,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "44783:0:0"
                  },
                  "scope": 3101,
                  "src": "44689:370:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 2835,
                    "nodeType": "Block",
                    "src": "45935:1583:0",
                    "statements": [
                      {
                        "assignments": [
                          2661
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 2661,
                            "mutability": "mutable",
                            "name": "data",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 2835,
                            "src": "45945:24:0",
                            "stateVariable": false,
                            "storageLocation": "memory",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_StrategyData_$1673_memory_ptr",
                              "typeString": "struct BentoBoxV1.StrategyData"
                            },
                            "typeName": {
                              "contractScope": null,
                              "id": 2660,
                              "name": "StrategyData",
                              "nodeType": "UserDefinedTypeName",
                              "referencedDeclaration": 1673,
                              "src": "45945:12:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_StrategyData_$1673_storage_ptr",
                                "typeString": "struct BentoBoxV1.StrategyData"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 2665,
                        "initialValue": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "id": 2662,
                            "name": "strategyData",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1717,
                            "src": "45972:12:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_contract$_IERC20_$67_$_t_struct$_StrategyData_$1673_storage_$",
                              "typeString": "mapping(contract IERC20 => struct BentoBoxV1.StrategyData storage ref)"
                            }
                          },
                          "id": 2664,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 2663,
                            "name": "token",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2653,
                            "src": "45985:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC20_$67",
                              "typeString": "contract IERC20"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "45972:19:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_StrategyData_$1673_storage",
                            "typeString": "struct BentoBoxV1.StrategyData storage ref"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "45945:46:0"
                      },
                      {
                        "assignments": [
                          2667
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 2667,
                            "mutability": "mutable",
                            "name": "pending",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 2835,
                            "src": "46001:17:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IStrategy_$142",
                              "typeString": "contract IStrategy"
                            },
                            "typeName": {
                              "contractScope": null,
                              "id": 2666,
                              "name": "IStrategy",
                              "nodeType": "UserDefinedTypeName",
                              "referencedDeclaration": 142,
                              "src": "46001:9:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IStrategy_$142",
                                "typeString": "contract IStrategy"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 2671,
                        "initialValue": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "id": 2668,
                            "name": "pendingStrategy",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1713,
                            "src": "46021:15:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_contract$_IERC20_$67_$_t_contract$_IStrategy_$142_$",
                              "typeString": "mapping(contract IERC20 => contract IStrategy)"
                            }
                          },
                          "id": 2670,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 2669,
                            "name": "token",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2653,
                            "src": "46037:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC20_$67",
                              "typeString": "contract IERC20"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "46021:22:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IStrategy_$142",
                            "typeString": "contract IStrategy"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "46001:42:0"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          },
                          "id": 2679,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_uint64",
                              "typeString": "uint64"
                            },
                            "id": 2675,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 2672,
                                "name": "data",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2661,
                                "src": "46057:4:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_StrategyData_$1673_memory_ptr",
                                  "typeString": "struct BentoBoxV1.StrategyData memory"
                                }
                              },
                              "id": 2673,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "strategyStartDate",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 1668,
                              "src": "46057:22:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint64",
                                "typeString": "uint64"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "==",
                            "rightExpression": {
                              "argumentTypes": null,
                              "hexValue": "30",
                              "id": 2674,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "46083:1:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              },
                              "value": "0"
                            },
                            "src": "46057:27:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "||",
                          "rightExpression": {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_contract$_IStrategy_$142",
                              "typeString": "contract IStrategy"
                            },
                            "id": 2678,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "id": 2676,
                              "name": "pending",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2667,
                              "src": "46088:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IStrategy_$142",
                                "typeString": "contract IStrategy"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "!=",
                            "rightExpression": {
                              "argumentTypes": null,
                              "id": 2677,
                              "name": "newStrategy",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2655,
                              "src": "46099:11:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IStrategy_$142",
                                "typeString": "contract IStrategy"
                              }
                            },
                            "src": "46088:22:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "src": "46057:53:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": {
                          "id": 2827,
                          "nodeType": "Block",
                          "src": "46455:1021:0",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "commonType": {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    },
                                    "id": 2714,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "leftExpression": {
                                      "argumentTypes": null,
                                      "commonType": {
                                        "typeIdentifier": "t_uint64",
                                        "typeString": "uint64"
                                      },
                                      "id": 2708,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftExpression": {
                                        "argumentTypes": null,
                                        "expression": {
                                          "argumentTypes": null,
                                          "id": 2705,
                                          "name": "data",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 2661,
                                          "src": "46477:4:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_struct$_StrategyData_$1673_memory_ptr",
                                            "typeString": "struct BentoBoxV1.StrategyData memory"
                                          }
                                        },
                                        "id": 2706,
                                        "isConstant": false,
                                        "isLValue": true,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "memberName": "strategyStartDate",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": 1668,
                                        "src": "46477:22:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint64",
                                          "typeString": "uint64"
                                        }
                                      },
                                      "nodeType": "BinaryOperation",
                                      "operator": "!=",
                                      "rightExpression": {
                                        "argumentTypes": null,
                                        "hexValue": "30",
                                        "id": 2707,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": true,
                                        "kind": "number",
                                        "lValueRequested": false,
                                        "nodeType": "Literal",
                                        "src": "46503:1:0",
                                        "subdenomination": null,
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_rational_0_by_1",
                                          "typeString": "int_const 0"
                                        },
                                        "value": "0"
                                      },
                                      "src": "46477:27:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                      }
                                    },
                                    "nodeType": "BinaryOperation",
                                    "operator": "&&",
                                    "rightExpression": {
                                      "argumentTypes": null,
                                      "commonType": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      },
                                      "id": 2713,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftExpression": {
                                        "argumentTypes": null,
                                        "expression": {
                                          "argumentTypes": null,
                                          "id": 2709,
                                          "name": "block",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": -4,
                                          "src": "46508:5:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_magic_block",
                                            "typeString": "block"
                                          }
                                        },
                                        "id": 2710,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "memberName": "timestamp",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": null,
                                        "src": "46508:15:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "nodeType": "BinaryOperation",
                                      "operator": ">=",
                                      "rightExpression": {
                                        "argumentTypes": null,
                                        "expression": {
                                          "argumentTypes": null,
                                          "id": 2711,
                                          "name": "data",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 2661,
                                          "src": "46527:4:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_struct$_StrategyData_$1673_memory_ptr",
                                            "typeString": "struct BentoBoxV1.StrategyData memory"
                                          }
                                        },
                                        "id": 2712,
                                        "isConstant": false,
                                        "isLValue": true,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "memberName": "strategyStartDate",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": 1668,
                                        "src": "46527:22:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint64",
                                          "typeString": "uint64"
                                        }
                                      },
                                      "src": "46508:41:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                      }
                                    },
                                    "src": "46477:72:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "53747261746567794d616e616765723a20546f6f206561726c79",
                                    "id": 2715,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "string",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "46551:28:0",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_stringliteral_90881d0adc7ac2d6397f1fee49db9e56cb6d6db8a51f54dd8223c6e98e46c87d",
                                      "typeString": "literal_string \"StrategyManager: Too early\""
                                    },
                                    "value": "StrategyManager: Too early"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    },
                                    {
                                      "typeIdentifier": "t_stringliteral_90881d0adc7ac2d6397f1fee49db9e56cb6d6db8a51f54dd8223c6e98e46c87d",
                                      "typeString": "literal_string \"StrategyManager: Too early\""
                                    }
                                  ],
                                  "id": 2704,
                                  "name": "require",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [
                                    -18,
                                    -18
                                  ],
                                  "referencedDeclaration": -18,
                                  "src": "46469:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                                    "typeString": "function (bool,string memory) pure"
                                  }
                                },
                                "id": 2716,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "46469:111:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 2717,
                              "nodeType": "ExpressionStatement",
                              "src": "46469:111:0"
                            },
                            {
                              "condition": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                },
                                "id": 2728,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "baseExpression": {
                                        "argumentTypes": null,
                                        "id": 2720,
                                        "name": "strategy",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 1709,
                                        "src": "46606:8:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_mapping$_t_contract$_IERC20_$67_$_t_contract$_IStrategy_$142_$",
                                          "typeString": "mapping(contract IERC20 => contract IStrategy)"
                                        }
                                      },
                                      "id": 2722,
                                      "indexExpression": {
                                        "argumentTypes": null,
                                        "id": 2721,
                                        "name": "token",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 2653,
                                        "src": "46615:5:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_contract$_IERC20_$67",
                                          "typeString": "contract IERC20"
                                        }
                                      },
                                      "isConstant": false,
                                      "isLValue": true,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "nodeType": "IndexAccess",
                                      "src": "46606:15:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_IStrategy_$142",
                                        "typeString": "contract IStrategy"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_contract$_IStrategy_$142",
                                        "typeString": "contract IStrategy"
                                      }
                                    ],
                                    "id": 2719,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "ElementaryTypeNameExpression",
                                    "src": "46598:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_address_$",
                                      "typeString": "type(address)"
                                    },
                                    "typeName": {
                                      "id": 2718,
                                      "name": "address",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "46598:7:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": null,
                                        "typeString": null
                                      }
                                    }
                                  },
                                  "id": 2723,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "46598:24:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "!=",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "hexValue": "30",
                                      "id": 2726,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "kind": "number",
                                      "lValueRequested": false,
                                      "nodeType": "Literal",
                                      "src": "46634:1:0",
                                      "subdenomination": null,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_rational_0_by_1",
                                        "typeString": "int_const 0"
                                      },
                                      "value": "0"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_rational_0_by_1",
                                        "typeString": "int_const 0"
                                      }
                                    ],
                                    "id": 2725,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "ElementaryTypeNameExpression",
                                    "src": "46626:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_address_$",
                                      "typeString": "type(address)"
                                    },
                                    "typeName": {
                                      "id": 2724,
                                      "name": "address",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "46626:7:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": null,
                                        "typeString": null
                                      }
                                    }
                                  },
                                  "id": 2727,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "46626:10:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address_payable",
                                    "typeString": "address payable"
                                  }
                                },
                                "src": "46598:38:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "falseBody": null,
                              "id": 2795,
                              "nodeType": "IfStatement",
                              "src": "46594:659:0",
                              "trueBody": {
                                "id": 2794,
                                "nodeType": "Block",
                                "src": "46638:615:0",
                                "statements": [
                                  {
                                    "assignments": [
                                      2730
                                    ],
                                    "declarations": [
                                      {
                                        "constant": false,
                                        "id": 2730,
                                        "mutability": "mutable",
                                        "name": "balanceChange",
                                        "nodeType": "VariableDeclaration",
                                        "overrides": null,
                                        "scope": 2794,
                                        "src": "46656:20:0",
                                        "stateVariable": false,
                                        "storageLocation": "default",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_int256",
                                          "typeString": "int256"
                                        },
                                        "typeName": {
                                          "id": 2729,
                                          "name": "int256",
                                          "nodeType": "ElementaryTypeName",
                                          "src": "46656:6:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_int256",
                                            "typeString": "int256"
                                          }
                                        },
                                        "value": null,
                                        "visibility": "internal"
                                      }
                                    ],
                                    "id": 2738,
                                    "initialValue": {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "expression": {
                                            "argumentTypes": null,
                                            "id": 2735,
                                            "name": "data",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 2661,
                                            "src": "46700:4:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_struct$_StrategyData_$1673_memory_ptr",
                                              "typeString": "struct BentoBoxV1.StrategyData memory"
                                            }
                                          },
                                          "id": 2736,
                                          "isConstant": false,
                                          "isLValue": true,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "memberName": "balance",
                                          "nodeType": "MemberAccess",
                                          "referencedDeclaration": 1672,
                                          "src": "46700:12:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint128",
                                            "typeString": "uint128"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_uint128",
                                            "typeString": "uint128"
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": null,
                                          "baseExpression": {
                                            "argumentTypes": null,
                                            "id": 2731,
                                            "name": "strategy",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 1709,
                                            "src": "46679:8:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_mapping$_t_contract$_IERC20_$67_$_t_contract$_IStrategy_$142_$",
                                              "typeString": "mapping(contract IERC20 => contract IStrategy)"
                                            }
                                          },
                                          "id": 2733,
                                          "indexExpression": {
                                            "argumentTypes": null,
                                            "id": 2732,
                                            "name": "token",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 2653,
                                            "src": "46688:5:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_contract$_IERC20_$67",
                                              "typeString": "contract IERC20"
                                            }
                                          },
                                          "isConstant": false,
                                          "isLValue": true,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "nodeType": "IndexAccess",
                                          "src": "46679:15:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_contract$_IStrategy_$142",
                                            "typeString": "contract IStrategy"
                                          }
                                        },
                                        "id": 2734,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "memberName": "exit",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": 141,
                                        "src": "46679:20:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_function_external_nonpayable$_t_uint256_$returns$_t_int256_$",
                                          "typeString": "function (uint256) external returns (int256)"
                                        }
                                      },
                                      "id": 2737,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "46679:34:0",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_int256",
                                        "typeString": "int256"
                                      }
                                    },
                                    "nodeType": "VariableDeclarationStatement",
                                    "src": "46656:57:0"
                                  },
                                  {
                                    "condition": {
                                      "argumentTypes": null,
                                      "commonType": {
                                        "typeIdentifier": "t_int256",
                                        "typeString": "int256"
                                      },
                                      "id": 2741,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftExpression": {
                                        "argumentTypes": null,
                                        "id": 2739,
                                        "name": "balanceChange",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 2730,
                                        "src": "46762:13:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_int256",
                                          "typeString": "int256"
                                        }
                                      },
                                      "nodeType": "BinaryOperation",
                                      "operator": ">",
                                      "rightExpression": {
                                        "argumentTypes": null,
                                        "hexValue": "30",
                                        "id": 2740,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": true,
                                        "kind": "number",
                                        "lValueRequested": false,
                                        "nodeType": "Literal",
                                        "src": "46778:1:0",
                                        "subdenomination": null,
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_rational_0_by_1",
                                          "typeString": "int_const 0"
                                        },
                                        "value": "0"
                                      },
                                      "src": "46762:17:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                      }
                                    },
                                    "falseBody": {
                                      "condition": {
                                        "argumentTypes": null,
                                        "commonType": {
                                          "typeIdentifier": "t_int256",
                                          "typeString": "int256"
                                        },
                                        "id": 2764,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "leftExpression": {
                                          "argumentTypes": null,
                                          "id": 2762,
                                          "name": "balanceChange",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 2730,
                                          "src": "46975:13:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_int256",
                                            "typeString": "int256"
                                          }
                                        },
                                        "nodeType": "BinaryOperation",
                                        "operator": "<",
                                        "rightExpression": {
                                          "argumentTypes": null,
                                          "hexValue": "30",
                                          "id": 2763,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": true,
                                          "kind": "number",
                                          "lValueRequested": false,
                                          "nodeType": "Literal",
                                          "src": "46991:1:0",
                                          "subdenomination": null,
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_rational_0_by_1",
                                            "typeString": "int_const 0"
                                          },
                                          "value": "0"
                                        },
                                        "src": "46975:17:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_bool",
                                          "typeString": "bool"
                                        }
                                      },
                                      "falseBody": null,
                                      "id": 2786,
                                      "nodeType": "IfStatement",
                                      "src": "46971:206:0",
                                      "trueBody": {
                                        "id": 2785,
                                        "nodeType": "Block",
                                        "src": "46994:183:0",
                                        "statements": [
                                          {
                                            "assignments": [
                                              2766
                                            ],
                                            "declarations": [
                                              {
                                                "constant": false,
                                                "id": 2766,
                                                "mutability": "mutable",
                                                "name": "sub",
                                                "nodeType": "VariableDeclaration",
                                                "overrides": null,
                                                "scope": 2785,
                                                "src": "47016:11:0",
                                                "stateVariable": false,
                                                "storageLocation": "default",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_uint256",
                                                  "typeString": "uint256"
                                                },
                                                "typeName": {
                                                  "id": 2765,
                                                  "name": "uint256",
                                                  "nodeType": "ElementaryTypeName",
                                                  "src": "47016:7:0",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                  }
                                                },
                                                "value": null,
                                                "visibility": "internal"
                                              }
                                            ],
                                            "id": 2772,
                                            "initialValue": {
                                              "argumentTypes": null,
                                              "arguments": [
                                                {
                                                  "argumentTypes": null,
                                                  "id": 2770,
                                                  "isConstant": false,
                                                  "isLValue": false,
                                                  "isPure": false,
                                                  "lValueRequested": false,
                                                  "nodeType": "UnaryOperation",
                                                  "operator": "-",
                                                  "prefix": true,
                                                  "src": "47038:14:0",
                                                  "subExpression": {
                                                    "argumentTypes": null,
                                                    "id": 2769,
                                                    "name": "balanceChange",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 2730,
                                                    "src": "47039:13:0",
                                                    "typeDescriptions": {
                                                      "typeIdentifier": "t_int256",
                                                      "typeString": "int256"
                                                    }
                                                  },
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_int256",
                                                    "typeString": "int256"
                                                  }
                                                }
                                              ],
                                              "expression": {
                                                "argumentTypes": [
                                                  {
                                                    "typeIdentifier": "t_int256",
                                                    "typeString": "int256"
                                                  }
                                                ],
                                                "id": 2768,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": true,
                                                "lValueRequested": false,
                                                "nodeType": "ElementaryTypeNameExpression",
                                                "src": "47030:7:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_type$_t_uint256_$",
                                                  "typeString": "type(uint256)"
                                                },
                                                "typeName": {
                                                  "id": 2767,
                                                  "name": "uint256",
                                                  "nodeType": "ElementaryTypeName",
                                                  "src": "47030:7:0",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": null,
                                                    "typeString": null
                                                  }
                                                }
                                              },
                                              "id": 2771,
                                              "isConstant": false,
                                              "isLValue": false,
                                              "isPure": false,
                                              "kind": "typeConversion",
                                              "lValueRequested": false,
                                              "names": [],
                                              "nodeType": "FunctionCall",
                                              "src": "47030:23:0",
                                              "tryCall": false,
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_uint256",
                                                "typeString": "uint256"
                                              }
                                            },
                                            "nodeType": "VariableDeclarationStatement",
                                            "src": "47016:37:0"
                                          },
                                          {
                                            "expression": {
                                              "argumentTypes": null,
                                              "arguments": [
                                                {
                                                  "argumentTypes": null,
                                                  "id": 2777,
                                                  "name": "sub",
                                                  "nodeType": "Identifier",
                                                  "overloadedDeclarations": [],
                                                  "referencedDeclaration": 2766,
                                                  "src": "47100:3:0",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                  }
                                                }
                                              ],
                                              "expression": {
                                                "argumentTypes": [
                                                  {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                  }
                                                ],
                                                "expression": {
                                                  "argumentTypes": null,
                                                  "baseExpression": {
                                                    "argumentTypes": null,
                                                    "id": 2773,
                                                    "name": "totals",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 1705,
                                                    "src": "47075:6:0",
                                                    "typeDescriptions": {
                                                      "typeIdentifier": "t_mapping$_t_contract$_IERC20_$67_$_t_struct$_Rebase_$550_storage_$",
                                                      "typeString": "mapping(contract IERC20 => struct Rebase storage ref)"
                                                    }
                                                  },
                                                  "id": 2775,
                                                  "indexExpression": {
                                                    "argumentTypes": null,
                                                    "id": 2774,
                                                    "name": "token",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 2653,
                                                    "src": "47082:5:0",
                                                    "typeDescriptions": {
                                                      "typeIdentifier": "t_contract$_IERC20_$67",
                                                      "typeString": "contract IERC20"
                                                    }
                                                  },
                                                  "isConstant": false,
                                                  "isLValue": true,
                                                  "isPure": false,
                                                  "lValueRequested": false,
                                                  "nodeType": "IndexAccess",
                                                  "src": "47075:13:0",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_struct$_Rebase_$550_storage",
                                                    "typeString": "struct Rebase storage ref"
                                                  }
                                                },
                                                "id": 2776,
                                                "isConstant": false,
                                                "isLValue": true,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "memberName": "subElastic",
                                                "nodeType": "MemberAccess",
                                                "referencedDeclaration": 897,
                                                "src": "47075:24:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_Rebase_$550_storage_ptr_$_t_uint256_$returns$_t_uint256_$bound_to$_t_struct$_Rebase_$550_storage_ptr_$",
                                                  "typeString": "function (struct Rebase storage pointer,uint256) returns (uint256)"
                                                }
                                              },
                                              "id": 2778,
                                              "isConstant": false,
                                              "isLValue": false,
                                              "isPure": false,
                                              "kind": "functionCall",
                                              "lValueRequested": false,
                                              "names": [],
                                              "nodeType": "FunctionCall",
                                              "src": "47075:29:0",
                                              "tryCall": false,
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_uint256",
                                                "typeString": "uint256"
                                              }
                                            },
                                            "id": 2779,
                                            "nodeType": "ExpressionStatement",
                                            "src": "47075:29:0"
                                          },
                                          {
                                            "eventCall": {
                                              "argumentTypes": null,
                                              "arguments": [
                                                {
                                                  "argumentTypes": null,
                                                  "id": 2781,
                                                  "name": "token",
                                                  "nodeType": "Identifier",
                                                  "overloadedDeclarations": [],
                                                  "referencedDeclaration": 2653,
                                                  "src": "47147:5:0",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_contract$_IERC20_$67",
                                                    "typeString": "contract IERC20"
                                                  }
                                                },
                                                {
                                                  "argumentTypes": null,
                                                  "id": 2782,
                                                  "name": "sub",
                                                  "nodeType": "Identifier",
                                                  "overloadedDeclarations": [],
                                                  "referencedDeclaration": 2766,
                                                  "src": "47154:3:0",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                  }
                                                }
                                              ],
                                              "expression": {
                                                "argumentTypes": [
                                                  {
                                                    "typeIdentifier": "t_contract$_IERC20_$67",
                                                    "typeString": "contract IERC20"
                                                  },
                                                  {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                  }
                                                ],
                                                "id": 2780,
                                                "name": "LogStrategyLoss",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 1666,
                                                "src": "47131:15:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_function_event_nonpayable$_t_contract$_IERC20_$67_$_t_uint256_$returns$__$",
                                                  "typeString": "function (contract IERC20,uint256)"
                                                }
                                              },
                                              "id": 2783,
                                              "isConstant": false,
                                              "isLValue": false,
                                              "isPure": false,
                                              "kind": "functionCall",
                                              "lValueRequested": false,
                                              "names": [],
                                              "nodeType": "FunctionCall",
                                              "src": "47131:27:0",
                                              "tryCall": false,
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_tuple$__$",
                                                "typeString": "tuple()"
                                              }
                                            },
                                            "id": 2784,
                                            "nodeType": "EmitStatement",
                                            "src": "47126:32:0"
                                          }
                                        ]
                                      }
                                    },
                                    "id": 2787,
                                    "nodeType": "IfStatement",
                                    "src": "46758:419:0",
                                    "trueBody": {
                                      "id": 2761,
                                      "nodeType": "Block",
                                      "src": "46781:184:0",
                                      "statements": [
                                        {
                                          "assignments": [
                                            2743
                                          ],
                                          "declarations": [
                                            {
                                              "constant": false,
                                              "id": 2743,
                                              "mutability": "mutable",
                                              "name": "add",
                                              "nodeType": "VariableDeclaration",
                                              "overrides": null,
                                              "scope": 2761,
                                              "src": "46803:11:0",
                                              "stateVariable": false,
                                              "storageLocation": "default",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_uint256",
                                                "typeString": "uint256"
                                              },
                                              "typeName": {
                                                "id": 2742,
                                                "name": "uint256",
                                                "nodeType": "ElementaryTypeName",
                                                "src": "46803:7:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_uint256",
                                                  "typeString": "uint256"
                                                }
                                              },
                                              "value": null,
                                              "visibility": "internal"
                                            }
                                          ],
                                          "id": 2748,
                                          "initialValue": {
                                            "argumentTypes": null,
                                            "arguments": [
                                              {
                                                "argumentTypes": null,
                                                "id": 2746,
                                                "name": "balanceChange",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 2730,
                                                "src": "46825:13:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_int256",
                                                  "typeString": "int256"
                                                }
                                              }
                                            ],
                                            "expression": {
                                              "argumentTypes": [
                                                {
                                                  "typeIdentifier": "t_int256",
                                                  "typeString": "int256"
                                                }
                                              ],
                                              "id": 2745,
                                              "isConstant": false,
                                              "isLValue": false,
                                              "isPure": true,
                                              "lValueRequested": false,
                                              "nodeType": "ElementaryTypeNameExpression",
                                              "src": "46817:7:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_type$_t_uint256_$",
                                                "typeString": "type(uint256)"
                                              },
                                              "typeName": {
                                                "id": 2744,
                                                "name": "uint256",
                                                "nodeType": "ElementaryTypeName",
                                                "src": "46817:7:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": null,
                                                  "typeString": null
                                                }
                                              }
                                            },
                                            "id": 2747,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "kind": "typeConversion",
                                            "lValueRequested": false,
                                            "names": [],
                                            "nodeType": "FunctionCall",
                                            "src": "46817:22:0",
                                            "tryCall": false,
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          },
                                          "nodeType": "VariableDeclarationStatement",
                                          "src": "46803:36:0"
                                        },
                                        {
                                          "expression": {
                                            "argumentTypes": null,
                                            "arguments": [
                                              {
                                                "argumentTypes": null,
                                                "id": 2753,
                                                "name": "add",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 2743,
                                                "src": "46886:3:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_uint256",
                                                  "typeString": "uint256"
                                                }
                                              }
                                            ],
                                            "expression": {
                                              "argumentTypes": [
                                                {
                                                  "typeIdentifier": "t_uint256",
                                                  "typeString": "uint256"
                                                }
                                              ],
                                              "expression": {
                                                "argumentTypes": null,
                                                "baseExpression": {
                                                  "argumentTypes": null,
                                                  "id": 2749,
                                                  "name": "totals",
                                                  "nodeType": "Identifier",
                                                  "overloadedDeclarations": [],
                                                  "referencedDeclaration": 1705,
                                                  "src": "46861:6:0",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_mapping$_t_contract$_IERC20_$67_$_t_struct$_Rebase_$550_storage_$",
                                                    "typeString": "mapping(contract IERC20 => struct Rebase storage ref)"
                                                  }
                                                },
                                                "id": 2751,
                                                "indexExpression": {
                                                  "argumentTypes": null,
                                                  "id": 2750,
                                                  "name": "token",
                                                  "nodeType": "Identifier",
                                                  "overloadedDeclarations": [],
                                                  "referencedDeclaration": 2653,
                                                  "src": "46868:5:0",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_contract$_IERC20_$67",
                                                    "typeString": "contract IERC20"
                                                  }
                                                },
                                                "isConstant": false,
                                                "isLValue": true,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "nodeType": "IndexAccess",
                                                "src": "46861:13:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_struct$_Rebase_$550_storage",
                                                  "typeString": "struct Rebase storage ref"
                                                }
                                              },
                                              "id": 2752,
                                              "isConstant": false,
                                              "isLValue": true,
                                              "isPure": false,
                                              "lValueRequested": false,
                                              "memberName": "addElastic",
                                              "nodeType": "MemberAccess",
                                              "referencedDeclaration": 873,
                                              "src": "46861:24:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_Rebase_$550_storage_ptr_$_t_uint256_$returns$_t_uint256_$bound_to$_t_struct$_Rebase_$550_storage_ptr_$",
                                                "typeString": "function (struct Rebase storage pointer,uint256) returns (uint256)"
                                              }
                                            },
                                            "id": 2754,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "kind": "functionCall",
                                            "lValueRequested": false,
                                            "names": [],
                                            "nodeType": "FunctionCall",
                                            "src": "46861:29:0",
                                            "tryCall": false,
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          },
                                          "id": 2755,
                                          "nodeType": "ExpressionStatement",
                                          "src": "46861:29:0"
                                        },
                                        {
                                          "eventCall": {
                                            "argumentTypes": null,
                                            "arguments": [
                                              {
                                                "argumentTypes": null,
                                                "id": 2757,
                                                "name": "token",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 2653,
                                                "src": "46935:5:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_contract$_IERC20_$67",
                                                  "typeString": "contract IERC20"
                                                }
                                              },
                                              {
                                                "argumentTypes": null,
                                                "id": 2758,
                                                "name": "add",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 2743,
                                                "src": "46942:3:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_uint256",
                                                  "typeString": "uint256"
                                                }
                                              }
                                            ],
                                            "expression": {
                                              "argumentTypes": [
                                                {
                                                  "typeIdentifier": "t_contract$_IERC20_$67",
                                                  "typeString": "contract IERC20"
                                                },
                                                {
                                                  "typeIdentifier": "t_uint256",
                                                  "typeString": "uint256"
                                                }
                                              ],
                                              "id": 2756,
                                              "name": "LogStrategyProfit",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": 1660,
                                              "src": "46917:17:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_function_event_nonpayable$_t_contract$_IERC20_$67_$_t_uint256_$returns$__$",
                                                "typeString": "function (contract IERC20,uint256)"
                                              }
                                            },
                                            "id": 2759,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "kind": "functionCall",
                                            "lValueRequested": false,
                                            "names": [],
                                            "nodeType": "FunctionCall",
                                            "src": "46917:29:0",
                                            "tryCall": false,
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_tuple$__$",
                                              "typeString": "tuple()"
                                            }
                                          },
                                          "id": 2760,
                                          "nodeType": "EmitStatement",
                                          "src": "46912:34:0"
                                        }
                                      ]
                                    }
                                  },
                                  {
                                    "eventCall": {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "id": 2789,
                                          "name": "token",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 2653,
                                          "src": "47218:5:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_contract$_IERC20_$67",
                                            "typeString": "contract IERC20"
                                          }
                                        },
                                        {
                                          "argumentTypes": null,
                                          "expression": {
                                            "argumentTypes": null,
                                            "id": 2790,
                                            "name": "data",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 2661,
                                            "src": "47225:4:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_struct$_StrategyData_$1673_memory_ptr",
                                              "typeString": "struct BentoBoxV1.StrategyData memory"
                                            }
                                          },
                                          "id": 2791,
                                          "isConstant": false,
                                          "isLValue": true,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "memberName": "balance",
                                          "nodeType": "MemberAccess",
                                          "referencedDeclaration": 1672,
                                          "src": "47225:12:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint128",
                                            "typeString": "uint128"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_contract$_IERC20_$67",
                                            "typeString": "contract IERC20"
                                          },
                                          {
                                            "typeIdentifier": "t_uint128",
                                            "typeString": "uint128"
                                          }
                                        ],
                                        "id": 2788,
                                        "name": "LogStrategyDivest",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 1654,
                                        "src": "47200:17:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_function_event_nonpayable$_t_contract$_IERC20_$67_$_t_uint256_$returns$__$",
                                          "typeString": "function (contract IERC20,uint256)"
                                        }
                                      },
                                      "id": 2792,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "47200:38:0",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_tuple$__$",
                                        "typeString": "tuple()"
                                      }
                                    },
                                    "id": 2793,
                                    "nodeType": "EmitStatement",
                                    "src": "47195:43:0"
                                  }
                                ]
                              }
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 2800,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "baseExpression": {
                                    "argumentTypes": null,
                                    "id": 2796,
                                    "name": "strategy",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1709,
                                    "src": "47266:8:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_mapping$_t_contract$_IERC20_$67_$_t_contract$_IStrategy_$142_$",
                                      "typeString": "mapping(contract IERC20 => contract IStrategy)"
                                    }
                                  },
                                  "id": 2798,
                                  "indexExpression": {
                                    "argumentTypes": null,
                                    "id": 2797,
                                    "name": "token",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2653,
                                    "src": "47275:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IERC20_$67",
                                      "typeString": "contract IERC20"
                                    }
                                  },
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": true,
                                  "nodeType": "IndexAccess",
                                  "src": "47266:15:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_IStrategy_$142",
                                    "typeString": "contract IStrategy"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "id": 2799,
                                  "name": "pending",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2667,
                                  "src": "47284:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_IStrategy_$142",
                                    "typeString": "contract IStrategy"
                                  }
                                },
                                "src": "47266:25:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_IStrategy_$142",
                                  "typeString": "contract IStrategy"
                                }
                              },
                              "id": 2801,
                              "nodeType": "ExpressionStatement",
                              "src": "47266:25:0"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 2806,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 2802,
                                    "name": "data",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2661,
                                    "src": "47305:4:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_struct$_StrategyData_$1673_memory_ptr",
                                      "typeString": "struct BentoBoxV1.StrategyData memory"
                                    }
                                  },
                                  "id": 2804,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": true,
                                  "memberName": "strategyStartDate",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 1668,
                                  "src": "47305:22:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint64",
                                    "typeString": "uint64"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "hexValue": "30",
                                  "id": 2805,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "47330:1:0",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  },
                                  "value": "0"
                                },
                                "src": "47305:26:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint64",
                                  "typeString": "uint64"
                                }
                              },
                              "id": 2807,
                              "nodeType": "ExpressionStatement",
                              "src": "47305:26:0"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 2812,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 2808,
                                    "name": "data",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2661,
                                    "src": "47345:4:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_struct$_StrategyData_$1673_memory_ptr",
                                      "typeString": "struct BentoBoxV1.StrategyData memory"
                                    }
                                  },
                                  "id": 2810,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": true,
                                  "memberName": "balance",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 1672,
                                  "src": "47345:12:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint128",
                                    "typeString": "uint128"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "hexValue": "30",
                                  "id": 2811,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "47360:1:0",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  },
                                  "value": "0"
                                },
                                "src": "47345:16:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              },
                              "id": 2813,
                              "nodeType": "ExpressionStatement",
                              "src": "47345:16:0"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 2820,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "baseExpression": {
                                    "argumentTypes": null,
                                    "id": 2814,
                                    "name": "pendingStrategy",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1713,
                                    "src": "47375:15:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_mapping$_t_contract$_IERC20_$67_$_t_contract$_IStrategy_$142_$",
                                      "typeString": "mapping(contract IERC20 => contract IStrategy)"
                                    }
                                  },
                                  "id": 2816,
                                  "indexExpression": {
                                    "argumentTypes": null,
                                    "id": 2815,
                                    "name": "token",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2653,
                                    "src": "47391:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IERC20_$67",
                                      "typeString": "contract IERC20"
                                    }
                                  },
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": true,
                                  "nodeType": "IndexAccess",
                                  "src": "47375:22:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_IStrategy_$142",
                                    "typeString": "contract IStrategy"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "hexValue": "30",
                                      "id": 2818,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "kind": "number",
                                      "lValueRequested": false,
                                      "nodeType": "Literal",
                                      "src": "47410:1:0",
                                      "subdenomination": null,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_rational_0_by_1",
                                        "typeString": "int_const 0"
                                      },
                                      "value": "0"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_rational_0_by_1",
                                        "typeString": "int_const 0"
                                      }
                                    ],
                                    "id": 2817,
                                    "name": "IStrategy",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 142,
                                    "src": "47400:9:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_contract$_IStrategy_$142_$",
                                      "typeString": "type(contract IStrategy)"
                                    }
                                  },
                                  "id": 2819,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "47400:12:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_IStrategy_$142",
                                    "typeString": "contract IStrategy"
                                  }
                                },
                                "src": "47375:37:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_IStrategy_$142",
                                  "typeString": "contract IStrategy"
                                }
                              },
                              "id": 2821,
                              "nodeType": "ExpressionStatement",
                              "src": "47375:37:0"
                            },
                            {
                              "eventCall": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 2823,
                                    "name": "token",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2653,
                                    "src": "47446:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IERC20_$67",
                                      "typeString": "contract IERC20"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 2824,
                                    "name": "newStrategy",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2655,
                                    "src": "47453:11:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IStrategy_$142",
                                      "typeString": "contract IStrategy"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_contract$_IERC20_$67",
                                      "typeString": "contract IERC20"
                                    },
                                    {
                                      "typeIdentifier": "t_contract$_IStrategy_$142",
                                      "typeString": "contract IStrategy"
                                    }
                                  ],
                                  "id": 2822,
                                  "name": "LogStrategySet",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1642,
                                  "src": "47431:14:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_event_nonpayable$_t_contract$_IERC20_$67_$_t_contract$_IStrategy_$142_$returns$__$",
                                    "typeString": "function (contract IERC20,contract IStrategy)"
                                  }
                                },
                                "id": 2825,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "47431:34:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 2826,
                              "nodeType": "EmitStatement",
                              "src": "47426:39:0"
                            }
                          ]
                        },
                        "id": 2828,
                        "nodeType": "IfStatement",
                        "src": "46053:1423:0",
                        "trueBody": {
                          "id": 2703,
                          "nodeType": "Block",
                          "src": "46112:337:0",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 2684,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "baseExpression": {
                                    "argumentTypes": null,
                                    "id": 2680,
                                    "name": "pendingStrategy",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1713,
                                    "src": "46126:15:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_mapping$_t_contract$_IERC20_$67_$_t_contract$_IStrategy_$142_$",
                                      "typeString": "mapping(contract IERC20 => contract IStrategy)"
                                    }
                                  },
                                  "id": 2682,
                                  "indexExpression": {
                                    "argumentTypes": null,
                                    "id": 2681,
                                    "name": "token",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2653,
                                    "src": "46142:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IERC20_$67",
                                      "typeString": "contract IERC20"
                                    }
                                  },
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": true,
                                  "nodeType": "IndexAccess",
                                  "src": "46126:22:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_IStrategy_$142",
                                    "typeString": "contract IStrategy"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "id": 2683,
                                  "name": "newStrategy",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2655,
                                  "src": "46151:11:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_IStrategy_$142",
                                    "typeString": "contract IStrategy"
                                  }
                                },
                                "src": "46126:36:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_IStrategy_$142",
                                  "typeString": "contract IStrategy"
                                }
                              },
                              "id": 2685,
                              "nodeType": "ExpressionStatement",
                              "src": "46126:36:0"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 2696,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 2686,
                                    "name": "data",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2661,
                                    "src": "46316:4:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_struct$_StrategyData_$1673_memory_ptr",
                                      "typeString": "struct BentoBoxV1.StrategyData memory"
                                    }
                                  },
                                  "id": 2688,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": true,
                                  "memberName": "strategyStartDate",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 1668,
                                  "src": "46316:22:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint64",
                                    "typeString": "uint64"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "arguments": [],
                                  "expression": {
                                    "argumentTypes": [],
                                    "expression": {
                                      "argumentTypes": null,
                                      "components": [
                                        {
                                          "argumentTypes": null,
                                          "commonType": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          },
                                          "id": 2692,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "leftExpression": {
                                            "argumentTypes": null,
                                            "expression": {
                                              "argumentTypes": null,
                                              "id": 2689,
                                              "name": "block",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": -4,
                                              "src": "46342:5:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_magic_block",
                                                "typeString": "block"
                                              }
                                            },
                                            "id": 2690,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "memberName": "timestamp",
                                            "nodeType": "MemberAccess",
                                            "referencedDeclaration": null,
                                            "src": "46342:15:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          },
                                          "nodeType": "BinaryOperation",
                                          "operator": "+",
                                          "rightExpression": {
                                            "argumentTypes": null,
                                            "id": 2691,
                                            "name": "STRATEGY_DELAY",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 1689,
                                            "src": "46360:14:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          },
                                          "src": "46342:32:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        }
                                      ],
                                      "id": 2693,
                                      "isConstant": false,
                                      "isInlineArray": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "nodeType": "TupleExpression",
                                      "src": "46341:34:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "id": 2694,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "to64",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 380,
                                    "src": "46341:39:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint64_$bound_to$_t_uint256_$",
                                      "typeString": "function (uint256) pure returns (uint64)"
                                    }
                                  },
                                  "id": 2695,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "46341:41:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint64",
                                    "typeString": "uint64"
                                  }
                                },
                                "src": "46316:66:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint64",
                                  "typeString": "uint64"
                                }
                              },
                              "id": 2697,
                              "nodeType": "ExpressionStatement",
                              "src": "46316:66:0"
                            },
                            {
                              "eventCall": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 2699,
                                    "name": "token",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2653,
                                    "src": "46419:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IERC20_$67",
                                      "typeString": "contract IERC20"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 2700,
                                    "name": "newStrategy",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2655,
                                    "src": "46426:11:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IStrategy_$142",
                                      "typeString": "contract IStrategy"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_contract$_IERC20_$67",
                                      "typeString": "contract IERC20"
                                    },
                                    {
                                      "typeIdentifier": "t_contract$_IStrategy_$142",
                                      "typeString": "contract IStrategy"
                                    }
                                  ],
                                  "id": 2698,
                                  "name": "LogStrategyQueued",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1636,
                                  "src": "46401:17:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_event_nonpayable$_t_contract$_IERC20_$67_$_t_contract$_IStrategy_$142_$returns$__$",
                                    "typeString": "function (contract IERC20,contract IStrategy)"
                                  }
                                },
                                "id": 2701,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "46401:37:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 2702,
                              "nodeType": "EmitStatement",
                              "src": "46396:42:0"
                            }
                          ]
                        }
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2833,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 2829,
                              "name": "strategyData",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1717,
                              "src": "47485:12:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_contract$_IERC20_$67_$_t_struct$_StrategyData_$1673_storage_$",
                                "typeString": "mapping(contract IERC20 => struct BentoBoxV1.StrategyData storage ref)"
                              }
                            },
                            "id": 2831,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 2830,
                              "name": "token",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2653,
                              "src": "47498:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$67",
                                "typeString": "contract IERC20"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "47485:19:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_StrategyData_$1673_storage",
                              "typeString": "struct BentoBoxV1.StrategyData storage ref"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 2832,
                            "name": "data",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2661,
                            "src": "47507:4:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_StrategyData_$1673_memory_ptr",
                              "typeString": "struct BentoBoxV1.StrategyData memory"
                            }
                          },
                          "src": "47485:26:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_StrategyData_$1673_storage",
                            "typeString": "struct BentoBoxV1.StrategyData storage ref"
                          }
                        },
                        "id": 2834,
                        "nodeType": "ExpressionStatement",
                        "src": "47485:26:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 2651,
                    "nodeType": "StructuredDocumentation",
                    "src": "45065:486:0",
                    "text": "@notice Sets the contract address of a new strategy that conforms to `IStrategy` for `token`.\n Must be called twice with the same arguments.\n A new strategy becomes pending first and can be activated once `STRATEGY_DELAY` is over.\n @dev Only the owner of this contract is allowed to change this.\n @param token The address of the token that maps to a strategy to change.\n @param newStrategy The address of the contract that conforms to `IStrategy`."
                  },
                  "functionSelector": "72cb5d97",
                  "id": 2836,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 2658,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 2657,
                        "name": "onlyOwner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1025,
                        "src": "45925:9:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "45925:9:0"
                    }
                  ],
                  "name": "setStrategy",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 2656,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2653,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2836,
                        "src": "45881:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$67",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 2652,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 67,
                          "src": "45881:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$67",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2655,
                        "mutability": "mutable",
                        "name": "newStrategy",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2836,
                        "src": "45895:21:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IStrategy_$142",
                          "typeString": "contract IStrategy"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 2654,
                          "name": "IStrategy",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 142,
                          "src": "45895:9:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IStrategy_$142",
                            "typeString": "contract IStrategy"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "45880:37:0"
                  },
                  "returnParameters": {
                    "id": 2659,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "45935:0:0"
                  },
                  "scope": 3101,
                  "src": "45860:1658:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 3095,
                    "nodeType": "Block",
                    "src": "48365:2314:0",
                    "statements": [
                      {
                        "assignments": [
                          2847
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 2847,
                            "mutability": "mutable",
                            "name": "data",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 3095,
                            "src": "48375:24:0",
                            "stateVariable": false,
                            "storageLocation": "memory",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_StrategyData_$1673_memory_ptr",
                              "typeString": "struct BentoBoxV1.StrategyData"
                            },
                            "typeName": {
                              "contractScope": null,
                              "id": 2846,
                              "name": "StrategyData",
                              "nodeType": "UserDefinedTypeName",
                              "referencedDeclaration": 1673,
                              "src": "48375:12:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_StrategyData_$1673_storage_ptr",
                                "typeString": "struct BentoBoxV1.StrategyData"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 2851,
                        "initialValue": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "id": 2848,
                            "name": "strategyData",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1717,
                            "src": "48402:12:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_contract$_IERC20_$67_$_t_struct$_StrategyData_$1673_storage_$",
                              "typeString": "mapping(contract IERC20 => struct BentoBoxV1.StrategyData storage ref)"
                            }
                          },
                          "id": 2850,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 2849,
                            "name": "token",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2839,
                            "src": "48415:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC20_$67",
                              "typeString": "contract IERC20"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "48402:19:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_StrategyData_$1673_storage",
                            "typeString": "struct BentoBoxV1.StrategyData storage ref"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "48375:46:0"
                      },
                      {
                        "assignments": [
                          2853
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 2853,
                            "mutability": "mutable",
                            "name": "_strategy",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 3095,
                            "src": "48431:19:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IStrategy_$142",
                              "typeString": "contract IStrategy"
                            },
                            "typeName": {
                              "contractScope": null,
                              "id": 2852,
                              "name": "IStrategy",
                              "nodeType": "UserDefinedTypeName",
                              "referencedDeclaration": 142,
                              "src": "48431:9:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IStrategy_$142",
                                "typeString": "contract IStrategy"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 2857,
                        "initialValue": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "id": 2854,
                            "name": "strategy",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1709,
                            "src": "48453:8:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_contract$_IERC20_$67_$_t_contract$_IStrategy_$142_$",
                              "typeString": "mapping(contract IERC20 => contract IStrategy)"
                            }
                          },
                          "id": 2856,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 2855,
                            "name": "token",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2839,
                            "src": "48462:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC20_$67",
                              "typeString": "contract IERC20"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "48453:15:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IStrategy_$142",
                            "typeString": "contract IStrategy"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "48431:37:0"
                      },
                      {
                        "assignments": [
                          2859
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 2859,
                            "mutability": "mutable",
                            "name": "balanceChange",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 3095,
                            "src": "48478:20:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_int256",
                              "typeString": "int256"
                            },
                            "typeName": {
                              "id": 2858,
                              "name": "int256",
                              "nodeType": "ElementaryTypeName",
                              "src": "48478:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_int256",
                                "typeString": "int256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 2867,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 2862,
                                "name": "data",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2847,
                                "src": "48519:4:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_StrategyData_$1673_memory_ptr",
                                  "typeString": "struct BentoBoxV1.StrategyData memory"
                                }
                              },
                              "id": 2863,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "balance",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 1672,
                              "src": "48519:12:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint128",
                                "typeString": "uint128"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 2864,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "48533:3:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 2865,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "48533:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint128",
                                "typeString": "uint128"
                              },
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 2860,
                              "name": "_strategy",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2853,
                              "src": "48501:9:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IStrategy_$142",
                                "typeString": "contract IStrategy"
                              }
                            },
                            "id": 2861,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "harvest",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 125,
                            "src": "48501:17:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_uint256_$_t_address_$returns$_t_int256_$",
                              "typeString": "function (uint256,address) external returns (int256)"
                            }
                          },
                          "id": 2866,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "48501:43:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_int256",
                            "typeString": "int256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "48478:66:0"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          },
                          "id": 2873,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_int256",
                              "typeString": "int256"
                            },
                            "id": 2870,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "id": 2868,
                              "name": "balanceChange",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2859,
                              "src": "48558:13:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_int256",
                                "typeString": "int256"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "==",
                            "rightExpression": {
                              "argumentTypes": null,
                              "hexValue": "30",
                              "id": 2869,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "48575:1:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              },
                              "value": "0"
                            },
                            "src": "48558:18:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "&&",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 2872,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "UnaryOperation",
                            "operator": "!",
                            "prefix": true,
                            "src": "48580:8:0",
                            "subExpression": {
                              "argumentTypes": null,
                              "id": 2871,
                              "name": "balance",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2841,
                              "src": "48581:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "src": "48558:30:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 2876,
                        "nodeType": "IfStatement",
                        "src": "48554:67:0",
                        "trueBody": {
                          "id": 2875,
                          "nodeType": "Block",
                          "src": "48590:31:0",
                          "statements": [
                            {
                              "expression": null,
                              "functionReturnParameters": 2845,
                              "id": 2874,
                              "nodeType": "Return",
                              "src": "48604:7:0"
                            }
                          ]
                        }
                      },
                      {
                        "assignments": [
                          2878
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 2878,
                            "mutability": "mutable",
                            "name": "totalElastic",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 3095,
                            "src": "48631:20:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 2877,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "48631:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 2883,
                        "initialValue": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 2879,
                              "name": "totals",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1705,
                              "src": "48654:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_contract$_IERC20_$67_$_t_struct$_Rebase_$550_storage_$",
                                "typeString": "mapping(contract IERC20 => struct Rebase storage ref)"
                              }
                            },
                            "id": 2881,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 2880,
                              "name": "token",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2839,
                              "src": "48661:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$67",
                                "typeString": "contract IERC20"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "IndexAccess",
                            "src": "48654:13:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_Rebase_$550_storage",
                              "typeString": "struct Rebase storage ref"
                            }
                          },
                          "id": 2882,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "elastic",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 547,
                          "src": "48654:21:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "48631:44:0"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_int256",
                            "typeString": "int256"
                          },
                          "id": 2886,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 2884,
                            "name": "balanceChange",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2859,
                            "src": "48690:13:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_int256",
                              "typeString": "int256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": ">",
                          "rightExpression": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 2885,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "48706:1:0",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "48690:17:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": {
                          "condition": {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_int256",
                              "typeString": "int256"
                            },
                            "id": 2918,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "id": 2916,
                              "name": "balanceChange",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2859,
                              "src": "48936:13:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_int256",
                                "typeString": "int256"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "<",
                            "rightExpression": {
                              "argumentTypes": null,
                              "hexValue": "30",
                              "id": 2917,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "48952:1:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              },
                              "value": "0"
                            },
                            "src": "48936:17:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "falseBody": null,
                          "id": 2961,
                          "nodeType": "IfStatement",
                          "src": "48932:523:0",
                          "trueBody": {
                            "id": 2960,
                            "nodeType": "Block",
                            "src": "48955:500:0",
                            "statements": [
                              {
                                "assignments": [
                                  2920
                                ],
                                "declarations": [
                                  {
                                    "constant": false,
                                    "id": 2920,
                                    "mutability": "mutable",
                                    "name": "sub",
                                    "nodeType": "VariableDeclaration",
                                    "overrides": null,
                                    "scope": 2960,
                                    "src": "49195:11:0",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    },
                                    "typeName": {
                                      "id": 2919,
                                      "name": "uint256",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "49195:7:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "value": null,
                                    "visibility": "internal"
                                  }
                                ],
                                "id": 2926,
                                "initialValue": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 2924,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "nodeType": "UnaryOperation",
                                      "operator": "-",
                                      "prefix": true,
                                      "src": "49217:14:0",
                                      "subExpression": {
                                        "argumentTypes": null,
                                        "id": 2923,
                                        "name": "balanceChange",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 2859,
                                        "src": "49218:13:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_int256",
                                          "typeString": "int256"
                                        }
                                      },
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_int256",
                                        "typeString": "int256"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_int256",
                                        "typeString": "int256"
                                      }
                                    ],
                                    "id": 2922,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "ElementaryTypeNameExpression",
                                    "src": "49209:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_uint256_$",
                                      "typeString": "type(uint256)"
                                    },
                                    "typeName": {
                                      "id": 2921,
                                      "name": "uint256",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "49209:7:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": null,
                                        "typeString": null
                                      }
                                    }
                                  },
                                  "id": 2925,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "49209:23:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "VariableDeclarationStatement",
                                "src": "49195:37:0"
                              },
                              {
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 2932,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "leftHandSide": {
                                    "argumentTypes": null,
                                    "id": 2927,
                                    "name": "totalElastic",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2878,
                                    "src": "49246:12:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "nodeType": "Assignment",
                                  "operator": "=",
                                  "rightHandSide": {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "id": 2930,
                                        "name": "sub",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 2920,
                                        "src": "49278:3:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": null,
                                        "id": 2928,
                                        "name": "totalElastic",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 2878,
                                        "src": "49261:12:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "id": 2929,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "memberName": "sub",
                                      "nodeType": "MemberAccess",
                                      "referencedDeclaration": 300,
                                      "src": "49261:16:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                        "typeString": "function (uint256,uint256) pure returns (uint256)"
                                      }
                                    },
                                    "id": 2931,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "functionCall",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "49261:21:0",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "src": "49246:36:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "id": 2933,
                                "nodeType": "ExpressionStatement",
                                "src": "49246:36:0"
                              },
                              {
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 2941,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "leftHandSide": {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "baseExpression": {
                                        "argumentTypes": null,
                                        "id": 2934,
                                        "name": "totals",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 1705,
                                        "src": "49296:6:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_mapping$_t_contract$_IERC20_$67_$_t_struct$_Rebase_$550_storage_$",
                                          "typeString": "mapping(contract IERC20 => struct Rebase storage ref)"
                                        }
                                      },
                                      "id": 2936,
                                      "indexExpression": {
                                        "argumentTypes": null,
                                        "id": 2935,
                                        "name": "token",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 2839,
                                        "src": "49303:5:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_contract$_IERC20_$67",
                                          "typeString": "contract IERC20"
                                        }
                                      },
                                      "isConstant": false,
                                      "isLValue": true,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "nodeType": "IndexAccess",
                                      "src": "49296:13:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_Rebase_$550_storage",
                                        "typeString": "struct Rebase storage ref"
                                      }
                                    },
                                    "id": 2937,
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": true,
                                    "memberName": "elastic",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 547,
                                    "src": "49296:21:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint128",
                                      "typeString": "uint128"
                                    }
                                  },
                                  "nodeType": "Assignment",
                                  "operator": "=",
                                  "rightHandSide": {
                                    "argumentTypes": null,
                                    "arguments": [],
                                    "expression": {
                                      "argumentTypes": [],
                                      "expression": {
                                        "argumentTypes": null,
                                        "id": 2938,
                                        "name": "totalElastic",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 2878,
                                        "src": "49320:12:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "id": 2939,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "memberName": "to128",
                                      "nodeType": "MemberAccess",
                                      "referencedDeclaration": 354,
                                      "src": "49320:18:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint128_$bound_to$_t_uint256_$",
                                        "typeString": "function (uint256) pure returns (uint128)"
                                      }
                                    },
                                    "id": 2940,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "functionCall",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "49320:20:0",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint128",
                                      "typeString": "uint128"
                                    }
                                  },
                                  "src": "49296:44:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint128",
                                    "typeString": "uint128"
                                  }
                                },
                                "id": 2942,
                                "nodeType": "ExpressionStatement",
                                "src": "49296:44:0"
                              },
                              {
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 2953,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "leftHandSide": {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 2943,
                                      "name": "data",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2847,
                                      "src": "49354:4:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_StrategyData_$1673_memory_ptr",
                                        "typeString": "struct BentoBoxV1.StrategyData memory"
                                      }
                                    },
                                    "id": 2945,
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": true,
                                    "memberName": "balance",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 1672,
                                    "src": "49354:12:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint128",
                                      "typeString": "uint128"
                                    }
                                  },
                                  "nodeType": "Assignment",
                                  "operator": "=",
                                  "rightHandSide": {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "arguments": [],
                                        "expression": {
                                          "argumentTypes": [],
                                          "expression": {
                                            "argumentTypes": null,
                                            "id": 2949,
                                            "name": "sub",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 2920,
                                            "src": "49386:3:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          },
                                          "id": 2950,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "memberName": "to128",
                                          "nodeType": "MemberAccess",
                                          "referencedDeclaration": 354,
                                          "src": "49386:9:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint128_$bound_to$_t_uint256_$",
                                            "typeString": "function (uint256) pure returns (uint128)"
                                          }
                                        },
                                        "id": 2951,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "49386:11:0",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint128",
                                          "typeString": "uint128"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_uint128",
                                          "typeString": "uint128"
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": null,
                                        "expression": {
                                          "argumentTypes": null,
                                          "id": 2946,
                                          "name": "data",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 2847,
                                          "src": "49369:4:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_struct$_StrategyData_$1673_memory_ptr",
                                            "typeString": "struct BentoBoxV1.StrategyData memory"
                                          }
                                        },
                                        "id": 2947,
                                        "isConstant": false,
                                        "isLValue": true,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "memberName": "balance",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": 1672,
                                        "src": "49369:12:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint128",
                                          "typeString": "uint128"
                                        }
                                      },
                                      "id": 2948,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "memberName": "sub",
                                      "nodeType": "MemberAccess",
                                      "referencedDeclaration": 452,
                                      "src": "49369:16:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_function_internal_pure$_t_uint128_$_t_uint128_$returns$_t_uint128_$bound_to$_t_uint128_$",
                                        "typeString": "function (uint128,uint128) pure returns (uint128)"
                                      }
                                    },
                                    "id": 2952,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "functionCall",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "49369:29:0",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint128",
                                      "typeString": "uint128"
                                    }
                                  },
                                  "src": "49354:44:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint128",
                                    "typeString": "uint128"
                                  }
                                },
                                "id": 2954,
                                "nodeType": "ExpressionStatement",
                                "src": "49354:44:0"
                              },
                              {
                                "eventCall": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 2956,
                                      "name": "token",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2839,
                                      "src": "49433:5:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_IERC20_$67",
                                        "typeString": "contract IERC20"
                                      }
                                    },
                                    {
                                      "argumentTypes": null,
                                      "id": 2957,
                                      "name": "sub",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2920,
                                      "src": "49440:3:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_contract$_IERC20_$67",
                                        "typeString": "contract IERC20"
                                      },
                                      {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    ],
                                    "id": 2955,
                                    "name": "LogStrategyLoss",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1666,
                                    "src": "49417:15:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_event_nonpayable$_t_contract$_IERC20_$67_$_t_uint256_$returns$__$",
                                      "typeString": "function (contract IERC20,uint256)"
                                    }
                                  },
                                  "id": 2958,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "49417:27:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_tuple$__$",
                                    "typeString": "tuple()"
                                  }
                                },
                                "id": 2959,
                                "nodeType": "EmitStatement",
                                "src": "49412:32:0"
                              }
                            ]
                          }
                        },
                        "id": 2962,
                        "nodeType": "IfStatement",
                        "src": "48686:769:0",
                        "trueBody": {
                          "id": 2915,
                          "nodeType": "Block",
                          "src": "48709:217:0",
                          "statements": [
                            {
                              "assignments": [
                                2888
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 2888,
                                  "mutability": "mutable",
                                  "name": "add",
                                  "nodeType": "VariableDeclaration",
                                  "overrides": null,
                                  "scope": 2915,
                                  "src": "48723:11:0",
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "typeName": {
                                    "id": 2887,
                                    "name": "uint256",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "48723:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "value": null,
                                  "visibility": "internal"
                                }
                              ],
                              "id": 2893,
                              "initialValue": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 2891,
                                    "name": "balanceChange",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2859,
                                    "src": "48745:13:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_int256",
                                      "typeString": "int256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_int256",
                                      "typeString": "int256"
                                    }
                                  ],
                                  "id": 2890,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "48737:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_uint256_$",
                                    "typeString": "type(uint256)"
                                  },
                                  "typeName": {
                                    "id": 2889,
                                    "name": "uint256",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "48737:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 2892,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "48737:22:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "VariableDeclarationStatement",
                              "src": "48723:36:0"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 2899,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "id": 2894,
                                  "name": "totalElastic",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2878,
                                  "src": "48773:12:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 2897,
                                      "name": "add",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2888,
                                      "src": "48805:3:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 2895,
                                      "name": "totalElastic",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2878,
                                      "src": "48788:12:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "id": 2896,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "add",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 278,
                                    "src": "48788:16:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                      "typeString": "function (uint256,uint256) pure returns (uint256)"
                                    }
                                  },
                                  "id": 2898,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "48788:21:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "48773:36:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 2900,
                              "nodeType": "ExpressionStatement",
                              "src": "48773:36:0"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 2908,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "baseExpression": {
                                      "argumentTypes": null,
                                      "id": 2901,
                                      "name": "totals",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1705,
                                      "src": "48823:6:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_mapping$_t_contract$_IERC20_$67_$_t_struct$_Rebase_$550_storage_$",
                                        "typeString": "mapping(contract IERC20 => struct Rebase storage ref)"
                                      }
                                    },
                                    "id": 2903,
                                    "indexExpression": {
                                      "argumentTypes": null,
                                      "id": 2902,
                                      "name": "token",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2839,
                                      "src": "48830:5:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_IERC20_$67",
                                        "typeString": "contract IERC20"
                                      }
                                    },
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "nodeType": "IndexAccess",
                                    "src": "48823:13:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_struct$_Rebase_$550_storage",
                                      "typeString": "struct Rebase storage ref"
                                    }
                                  },
                                  "id": 2904,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": true,
                                  "memberName": "elastic",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 547,
                                  "src": "48823:21:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint128",
                                    "typeString": "uint128"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "arguments": [],
                                  "expression": {
                                    "argumentTypes": [],
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 2905,
                                      "name": "totalElastic",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2878,
                                      "src": "48847:12:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "id": 2906,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "to128",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 354,
                                    "src": "48847:18:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint128_$bound_to$_t_uint256_$",
                                      "typeString": "function (uint256) pure returns (uint128)"
                                    }
                                  },
                                  "id": 2907,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "48847:20:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint128",
                                    "typeString": "uint128"
                                  }
                                },
                                "src": "48823:44:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              },
                              "id": 2909,
                              "nodeType": "ExpressionStatement",
                              "src": "48823:44:0"
                            },
                            {
                              "eventCall": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 2911,
                                    "name": "token",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2839,
                                    "src": "48904:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IERC20_$67",
                                      "typeString": "contract IERC20"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 2912,
                                    "name": "add",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2888,
                                    "src": "48911:3:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_contract$_IERC20_$67",
                                      "typeString": "contract IERC20"
                                    },
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "id": 2910,
                                  "name": "LogStrategyProfit",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1660,
                                  "src": "48886:17:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_event_nonpayable$_t_contract$_IERC20_$67_$_t_uint256_$returns$__$",
                                    "typeString": "function (contract IERC20,uint256)"
                                  }
                                },
                                "id": 2913,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "48886:29:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 2914,
                              "nodeType": "EmitStatement",
                              "src": "48881:34:0"
                            }
                          ]
                        }
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "id": 2963,
                          "name": "balance",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2841,
                          "src": "49469:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 3088,
                        "nodeType": "IfStatement",
                        "src": "49465:1171:0",
                        "trueBody": {
                          "id": 3087,
                          "nodeType": "Block",
                          "src": "49478:1158:0",
                          "statements": [
                            {
                              "assignments": [
                                2965
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 2965,
                                  "mutability": "mutable",
                                  "name": "targetBalance",
                                  "nodeType": "VariableDeclaration",
                                  "overrides": null,
                                  "scope": 3087,
                                  "src": "49492:21:0",
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "typeName": {
                                    "id": 2964,
                                    "name": "uint256",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "49492:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "value": null,
                                  "visibility": "internal"
                                }
                              ],
                              "id": 2973,
                              "initialValue": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                "id": 2972,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "expression": {
                                        "argumentTypes": null,
                                        "id": 2968,
                                        "name": "data",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 2847,
                                        "src": "49533:4:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_struct$_StrategyData_$1673_memory_ptr",
                                          "typeString": "struct BentoBoxV1.StrategyData memory"
                                        }
                                      },
                                      "id": 2969,
                                      "isConstant": false,
                                      "isLValue": true,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "memberName": "targetPercentage",
                                      "nodeType": "MemberAccess",
                                      "referencedDeclaration": 1670,
                                      "src": "49533:21:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint64",
                                        "typeString": "uint64"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_uint64",
                                        "typeString": "uint64"
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 2966,
                                      "name": "totalElastic",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2878,
                                      "src": "49516:12:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "id": 2967,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "mul",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 328,
                                    "src": "49516:16:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                      "typeString": "function (uint256,uint256) pure returns (uint256)"
                                    }
                                  },
                                  "id": 2970,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "49516:39:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "/",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "hexValue": "313030",
                                  "id": 2971,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "49558:3:0",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_100_by_1",
                                    "typeString": "int_const 100"
                                  },
                                  "value": "100"
                                },
                                "src": "49516:45:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "VariableDeclarationStatement",
                              "src": "49492:69:0"
                            },
                            {
                              "condition": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                "id": 2977,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 2974,
                                    "name": "data",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2847,
                                    "src": "49654:4:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_struct$_StrategyData_$1673_memory_ptr",
                                      "typeString": "struct BentoBoxV1.StrategyData memory"
                                    }
                                  },
                                  "id": 2975,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "balance",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 1672,
                                  "src": "49654:12:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint128",
                                    "typeString": "uint128"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "<",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "id": 2976,
                                  "name": "targetBalance",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2965,
                                  "src": "49669:13:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "49654:28:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "falseBody": {
                                "condition": {
                                  "argumentTypes": null,
                                  "commonType": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "id": 3036,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "leftExpression": {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 3033,
                                      "name": "data",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2847,
                                      "src": "50156:4:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_StrategyData_$1673_memory_ptr",
                                        "typeString": "struct BentoBoxV1.StrategyData memory"
                                      }
                                    },
                                    "id": 3034,
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "balance",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 1672,
                                    "src": "50156:12:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint128",
                                      "typeString": "uint128"
                                    }
                                  },
                                  "nodeType": "BinaryOperation",
                                  "operator": ">",
                                  "rightExpression": {
                                    "argumentTypes": null,
                                    "id": 3035,
                                    "name": "targetBalance",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2965,
                                    "src": "50171:13:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "src": "50156:28:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                "falseBody": null,
                                "id": 3085,
                                "nodeType": "IfStatement",
                                "src": "50152:474:0",
                                "trueBody": {
                                  "id": 3084,
                                  "nodeType": "Block",
                                  "src": "50186:440:0",
                                  "statements": [
                                    {
                                      "assignments": [
                                        3038
                                      ],
                                      "declarations": [
                                        {
                                          "constant": false,
                                          "id": 3038,
                                          "mutability": "mutable",
                                          "name": "amountIn",
                                          "nodeType": "VariableDeclaration",
                                          "overrides": null,
                                          "scope": 3084,
                                          "src": "50204:16:0",
                                          "stateVariable": false,
                                          "storageLocation": "default",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          },
                                          "typeName": {
                                            "id": 3037,
                                            "name": "uint256",
                                            "nodeType": "ElementaryTypeName",
                                            "src": "50204:7:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          },
                                          "value": null,
                                          "visibility": "internal"
                                        }
                                      ],
                                      "id": 3046,
                                      "initialValue": {
                                        "argumentTypes": null,
                                        "arguments": [
                                          {
                                            "argumentTypes": null,
                                            "arguments": [],
                                            "expression": {
                                              "argumentTypes": [],
                                              "expression": {
                                                "argumentTypes": null,
                                                "id": 3042,
                                                "name": "targetBalance",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 2965,
                                                "src": "50240:13:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_uint256",
                                                  "typeString": "uint256"
                                                }
                                              },
                                              "id": 3043,
                                              "isConstant": false,
                                              "isLValue": false,
                                              "isPure": false,
                                              "lValueRequested": false,
                                              "memberName": "to128",
                                              "nodeType": "MemberAccess",
                                              "referencedDeclaration": 354,
                                              "src": "50240:19:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint128_$bound_to$_t_uint256_$",
                                                "typeString": "function (uint256) pure returns (uint128)"
                                              }
                                            },
                                            "id": 3044,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "kind": "functionCall",
                                            "lValueRequested": false,
                                            "names": [],
                                            "nodeType": "FunctionCall",
                                            "src": "50240:21:0",
                                            "tryCall": false,
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint128",
                                              "typeString": "uint128"
                                            }
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": [
                                            {
                                              "typeIdentifier": "t_uint128",
                                              "typeString": "uint128"
                                            }
                                          ],
                                          "expression": {
                                            "argumentTypes": null,
                                            "expression": {
                                              "argumentTypes": null,
                                              "id": 3039,
                                              "name": "data",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": 2847,
                                              "src": "50223:4:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_struct$_StrategyData_$1673_memory_ptr",
                                                "typeString": "struct BentoBoxV1.StrategyData memory"
                                              }
                                            },
                                            "id": 3040,
                                            "isConstant": false,
                                            "isLValue": true,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "memberName": "balance",
                                            "nodeType": "MemberAccess",
                                            "referencedDeclaration": 1672,
                                            "src": "50223:12:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint128",
                                              "typeString": "uint128"
                                            }
                                          },
                                          "id": 3041,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "memberName": "sub",
                                          "nodeType": "MemberAccess",
                                          "referencedDeclaration": 452,
                                          "src": "50223:16:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_function_internal_pure$_t_uint128_$_t_uint128_$returns$_t_uint128_$bound_to$_t_uint128_$",
                                            "typeString": "function (uint128,uint128) pure returns (uint128)"
                                          }
                                        },
                                        "id": 3045,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "50223:39:0",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint128",
                                          "typeString": "uint128"
                                        }
                                      },
                                      "nodeType": "VariableDeclarationStatement",
                                      "src": "50204:58:0"
                                    },
                                    {
                                      "condition": {
                                        "argumentTypes": null,
                                        "commonType": {
                                          "typeIdentifier": "t_bool",
                                          "typeString": "bool"
                                        },
                                        "id": 3053,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "leftExpression": {
                                          "argumentTypes": null,
                                          "commonType": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          },
                                          "id": 3049,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "leftExpression": {
                                            "argumentTypes": null,
                                            "id": 3047,
                                            "name": "maxChangeAmount",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 2843,
                                            "src": "50284:15:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          },
                                          "nodeType": "BinaryOperation",
                                          "operator": "!=",
                                          "rightExpression": {
                                            "argumentTypes": null,
                                            "hexValue": "30",
                                            "id": 3048,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": true,
                                            "kind": "number",
                                            "lValueRequested": false,
                                            "nodeType": "Literal",
                                            "src": "50303:1:0",
                                            "subdenomination": null,
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_rational_0_by_1",
                                              "typeString": "int_const 0"
                                            },
                                            "value": "0"
                                          },
                                          "src": "50284:20:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_bool",
                                            "typeString": "bool"
                                          }
                                        },
                                        "nodeType": "BinaryOperation",
                                        "operator": "&&",
                                        "rightExpression": {
                                          "argumentTypes": null,
                                          "commonType": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          },
                                          "id": 3052,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "leftExpression": {
                                            "argumentTypes": null,
                                            "id": 3050,
                                            "name": "amountIn",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 3038,
                                            "src": "50308:8:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          },
                                          "nodeType": "BinaryOperation",
                                          "operator": ">",
                                          "rightExpression": {
                                            "argumentTypes": null,
                                            "id": 3051,
                                            "name": "maxChangeAmount",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 2843,
                                            "src": "50319:15:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          },
                                          "src": "50308:26:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_bool",
                                            "typeString": "bool"
                                          }
                                        },
                                        "src": "50284:50:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_bool",
                                          "typeString": "bool"
                                        }
                                      },
                                      "falseBody": null,
                                      "id": 3059,
                                      "nodeType": "IfStatement",
                                      "src": "50280:123:0",
                                      "trueBody": {
                                        "id": 3058,
                                        "nodeType": "Block",
                                        "src": "50336:67:0",
                                        "statements": [
                                          {
                                            "expression": {
                                              "argumentTypes": null,
                                              "id": 3056,
                                              "isConstant": false,
                                              "isLValue": false,
                                              "isPure": false,
                                              "lValueRequested": false,
                                              "leftHandSide": {
                                                "argumentTypes": null,
                                                "id": 3054,
                                                "name": "amountIn",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 3038,
                                                "src": "50358:8:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_uint256",
                                                  "typeString": "uint256"
                                                }
                                              },
                                              "nodeType": "Assignment",
                                              "operator": "=",
                                              "rightHandSide": {
                                                "argumentTypes": null,
                                                "id": 3055,
                                                "name": "maxChangeAmount",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 2843,
                                                "src": "50369:15:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_uint256",
                                                  "typeString": "uint256"
                                                }
                                              },
                                              "src": "50358:26:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_uint256",
                                                "typeString": "uint256"
                                              }
                                            },
                                            "id": 3057,
                                            "nodeType": "ExpressionStatement",
                                            "src": "50358:26:0"
                                          }
                                        ]
                                      }
                                    },
                                    {
                                      "assignments": [
                                        3061
                                      ],
                                      "declarations": [
                                        {
                                          "constant": false,
                                          "id": 3061,
                                          "mutability": "mutable",
                                          "name": "actualAmountIn",
                                          "nodeType": "VariableDeclaration",
                                          "overrides": null,
                                          "scope": 3084,
                                          "src": "50421:22:0",
                                          "stateVariable": false,
                                          "storageLocation": "default",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          },
                                          "typeName": {
                                            "id": 3060,
                                            "name": "uint256",
                                            "nodeType": "ElementaryTypeName",
                                            "src": "50421:7:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          },
                                          "value": null,
                                          "visibility": "internal"
                                        }
                                      ],
                                      "id": 3066,
                                      "initialValue": {
                                        "argumentTypes": null,
                                        "arguments": [
                                          {
                                            "argumentTypes": null,
                                            "id": 3064,
                                            "name": "amountIn",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 3038,
                                            "src": "50465:8:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": [
                                            {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          ],
                                          "expression": {
                                            "argumentTypes": null,
                                            "id": 3062,
                                            "name": "_strategy",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 2853,
                                            "src": "50446:9:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_contract$_IStrategy_$142",
                                              "typeString": "contract IStrategy"
                                            }
                                          },
                                          "id": 3063,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "memberName": "withdraw",
                                          "nodeType": "MemberAccess",
                                          "referencedDeclaration": 133,
                                          "src": "50446:18:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_function_external_nonpayable$_t_uint256_$returns$_t_uint256_$",
                                            "typeString": "function (uint256) external returns (uint256)"
                                          }
                                        },
                                        "id": 3065,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "50446:28:0",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "nodeType": "VariableDeclarationStatement",
                                      "src": "50421:53:0"
                                    },
                                    {
                                      "expression": {
                                        "argumentTypes": null,
                                        "id": 3077,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "leftHandSide": {
                                          "argumentTypes": null,
                                          "expression": {
                                            "argumentTypes": null,
                                            "id": 3067,
                                            "name": "data",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 2847,
                                            "src": "50493:4:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_struct$_StrategyData_$1673_memory_ptr",
                                              "typeString": "struct BentoBoxV1.StrategyData memory"
                                            }
                                          },
                                          "id": 3069,
                                          "isConstant": false,
                                          "isLValue": true,
                                          "isPure": false,
                                          "lValueRequested": true,
                                          "memberName": "balance",
                                          "nodeType": "MemberAccess",
                                          "referencedDeclaration": 1672,
                                          "src": "50493:12:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint128",
                                            "typeString": "uint128"
                                          }
                                        },
                                        "nodeType": "Assignment",
                                        "operator": "=",
                                        "rightHandSide": {
                                          "argumentTypes": null,
                                          "arguments": [
                                            {
                                              "argumentTypes": null,
                                              "arguments": [],
                                              "expression": {
                                                "argumentTypes": [],
                                                "expression": {
                                                  "argumentTypes": null,
                                                  "id": 3073,
                                                  "name": "actualAmountIn",
                                                  "nodeType": "Identifier",
                                                  "overloadedDeclarations": [],
                                                  "referencedDeclaration": 3061,
                                                  "src": "50525:14:0",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                  }
                                                },
                                                "id": 3074,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "memberName": "to128",
                                                "nodeType": "MemberAccess",
                                                "referencedDeclaration": 354,
                                                "src": "50525:20:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint128_$bound_to$_t_uint256_$",
                                                  "typeString": "function (uint256) pure returns (uint128)"
                                                }
                                              },
                                              "id": 3075,
                                              "isConstant": false,
                                              "isLValue": false,
                                              "isPure": false,
                                              "kind": "functionCall",
                                              "lValueRequested": false,
                                              "names": [],
                                              "nodeType": "FunctionCall",
                                              "src": "50525:22:0",
                                              "tryCall": false,
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_uint128",
                                                "typeString": "uint128"
                                              }
                                            }
                                          ],
                                          "expression": {
                                            "argumentTypes": [
                                              {
                                                "typeIdentifier": "t_uint128",
                                                "typeString": "uint128"
                                              }
                                            ],
                                            "expression": {
                                              "argumentTypes": null,
                                              "expression": {
                                                "argumentTypes": null,
                                                "id": 3070,
                                                "name": "data",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 2847,
                                                "src": "50508:4:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_struct$_StrategyData_$1673_memory_ptr",
                                                  "typeString": "struct BentoBoxV1.StrategyData memory"
                                                }
                                              },
                                              "id": 3071,
                                              "isConstant": false,
                                              "isLValue": true,
                                              "isPure": false,
                                              "lValueRequested": false,
                                              "memberName": "balance",
                                              "nodeType": "MemberAccess",
                                              "referencedDeclaration": 1672,
                                              "src": "50508:12:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_uint128",
                                                "typeString": "uint128"
                                              }
                                            },
                                            "id": 3072,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "memberName": "sub",
                                            "nodeType": "MemberAccess",
                                            "referencedDeclaration": 452,
                                            "src": "50508:16:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_function_internal_pure$_t_uint128_$_t_uint128_$returns$_t_uint128_$bound_to$_t_uint128_$",
                                              "typeString": "function (uint128,uint128) pure returns (uint128)"
                                            }
                                          },
                                          "id": 3076,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "kind": "functionCall",
                                          "lValueRequested": false,
                                          "names": [],
                                          "nodeType": "FunctionCall",
                                          "src": "50508:40:0",
                                          "tryCall": false,
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint128",
                                            "typeString": "uint128"
                                          }
                                        },
                                        "src": "50493:55:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint128",
                                          "typeString": "uint128"
                                        }
                                      },
                                      "id": 3078,
                                      "nodeType": "ExpressionStatement",
                                      "src": "50493:55:0"
                                    },
                                    {
                                      "eventCall": {
                                        "argumentTypes": null,
                                        "arguments": [
                                          {
                                            "argumentTypes": null,
                                            "id": 3080,
                                            "name": "token",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 2839,
                                            "src": "50589:5:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_contract$_IERC20_$67",
                                              "typeString": "contract IERC20"
                                            }
                                          },
                                          {
                                            "argumentTypes": null,
                                            "id": 3081,
                                            "name": "actualAmountIn",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 3061,
                                            "src": "50596:14:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": [
                                            {
                                              "typeIdentifier": "t_contract$_IERC20_$67",
                                              "typeString": "contract IERC20"
                                            },
                                            {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          ],
                                          "id": 3079,
                                          "name": "LogStrategyDivest",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 1654,
                                          "src": "50571:17:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_function_event_nonpayable$_t_contract$_IERC20_$67_$_t_uint256_$returns$__$",
                                            "typeString": "function (contract IERC20,uint256)"
                                          }
                                        },
                                        "id": 3082,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "50571:40:0",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_tuple$__$",
                                          "typeString": "tuple()"
                                        }
                                      },
                                      "id": 3083,
                                      "nodeType": "EmitStatement",
                                      "src": "50566:45:0"
                                    }
                                  ]
                                }
                              },
                              "id": 3086,
                              "nodeType": "IfStatement",
                              "src": "49650:976:0",
                              "trueBody": {
                                "id": 3032,
                                "nodeType": "Block",
                                "src": "49684:462:0",
                                "statements": [
                                  {
                                    "assignments": [
                                      2979
                                    ],
                                    "declarations": [
                                      {
                                        "constant": false,
                                        "id": 2979,
                                        "mutability": "mutable",
                                        "name": "amountOut",
                                        "nodeType": "VariableDeclaration",
                                        "overrides": null,
                                        "scope": 3032,
                                        "src": "49702:17:0",
                                        "stateVariable": false,
                                        "storageLocation": "default",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        },
                                        "typeName": {
                                          "id": 2978,
                                          "name": "uint256",
                                          "nodeType": "ElementaryTypeName",
                                          "src": "49702:7:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "value": null,
                                        "visibility": "internal"
                                      }
                                    ],
                                    "id": 2985,
                                    "initialValue": {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "expression": {
                                            "argumentTypes": null,
                                            "id": 2982,
                                            "name": "data",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 2847,
                                            "src": "49740:4:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_struct$_StrategyData_$1673_memory_ptr",
                                              "typeString": "struct BentoBoxV1.StrategyData memory"
                                            }
                                          },
                                          "id": 2983,
                                          "isConstant": false,
                                          "isLValue": true,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "memberName": "balance",
                                          "nodeType": "MemberAccess",
                                          "referencedDeclaration": 1672,
                                          "src": "49740:12:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint128",
                                            "typeString": "uint128"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_uint128",
                                            "typeString": "uint128"
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": null,
                                          "id": 2980,
                                          "name": "targetBalance",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 2965,
                                          "src": "49722:13:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "id": 2981,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "memberName": "sub",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": 300,
                                        "src": "49722:17:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                          "typeString": "function (uint256,uint256) pure returns (uint256)"
                                        }
                                      },
                                      "id": 2984,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "49722:31:0",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "nodeType": "VariableDeclarationStatement",
                                    "src": "49702:51:0"
                                  },
                                  {
                                    "condition": {
                                      "argumentTypes": null,
                                      "commonType": {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                      },
                                      "id": 2992,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftExpression": {
                                        "argumentTypes": null,
                                        "commonType": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        },
                                        "id": 2988,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "leftExpression": {
                                          "argumentTypes": null,
                                          "id": 2986,
                                          "name": "maxChangeAmount",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 2843,
                                          "src": "49775:15:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "nodeType": "BinaryOperation",
                                        "operator": "!=",
                                        "rightExpression": {
                                          "argumentTypes": null,
                                          "hexValue": "30",
                                          "id": 2987,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": true,
                                          "kind": "number",
                                          "lValueRequested": false,
                                          "nodeType": "Literal",
                                          "src": "49794:1:0",
                                          "subdenomination": null,
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_rational_0_by_1",
                                            "typeString": "int_const 0"
                                          },
                                          "value": "0"
                                        },
                                        "src": "49775:20:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_bool",
                                          "typeString": "bool"
                                        }
                                      },
                                      "nodeType": "BinaryOperation",
                                      "operator": "&&",
                                      "rightExpression": {
                                        "argumentTypes": null,
                                        "commonType": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        },
                                        "id": 2991,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "leftExpression": {
                                          "argumentTypes": null,
                                          "id": 2989,
                                          "name": "amountOut",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 2979,
                                          "src": "49799:9:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "nodeType": "BinaryOperation",
                                        "operator": ">",
                                        "rightExpression": {
                                          "argumentTypes": null,
                                          "id": 2990,
                                          "name": "maxChangeAmount",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 2843,
                                          "src": "49811:15:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "src": "49799:27:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_bool",
                                          "typeString": "bool"
                                        }
                                      },
                                      "src": "49775:51:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                      }
                                    },
                                    "falseBody": null,
                                    "id": 2998,
                                    "nodeType": "IfStatement",
                                    "src": "49771:125:0",
                                    "trueBody": {
                                      "id": 2997,
                                      "nodeType": "Block",
                                      "src": "49828:68:0",
                                      "statements": [
                                        {
                                          "expression": {
                                            "argumentTypes": null,
                                            "id": 2995,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "leftHandSide": {
                                              "argumentTypes": null,
                                              "id": 2993,
                                              "name": "amountOut",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": 2979,
                                              "src": "49850:9:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_uint256",
                                                "typeString": "uint256"
                                              }
                                            },
                                            "nodeType": "Assignment",
                                            "operator": "=",
                                            "rightHandSide": {
                                              "argumentTypes": null,
                                              "id": 2994,
                                              "name": "maxChangeAmount",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": 2843,
                                              "src": "49862:15:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_uint256",
                                                "typeString": "uint256"
                                              }
                                            },
                                            "src": "49850:27:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          },
                                          "id": 2996,
                                          "nodeType": "ExpressionStatement",
                                          "src": "49850:27:0"
                                        }
                                      ]
                                    }
                                  },
                                  {
                                    "expression": {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "arguments": [
                                            {
                                              "argumentTypes": null,
                                              "id": 3004,
                                              "name": "_strategy",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": 2853,
                                              "src": "49940:9:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_contract$_IStrategy_$142",
                                                "typeString": "contract IStrategy"
                                              }
                                            }
                                          ],
                                          "expression": {
                                            "argumentTypes": [
                                              {
                                                "typeIdentifier": "t_contract$_IStrategy_$142",
                                                "typeString": "contract IStrategy"
                                              }
                                            ],
                                            "id": 3003,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": true,
                                            "lValueRequested": false,
                                            "nodeType": "ElementaryTypeNameExpression",
                                            "src": "49932:7:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_type$_t_address_$",
                                              "typeString": "type(address)"
                                            },
                                            "typeName": {
                                              "id": 3002,
                                              "name": "address",
                                              "nodeType": "ElementaryTypeName",
                                              "src": "49932:7:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": null,
                                                "typeString": null
                                              }
                                            }
                                          },
                                          "id": 3005,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "kind": "typeConversion",
                                          "lValueRequested": false,
                                          "names": [],
                                          "nodeType": "FunctionCall",
                                          "src": "49932:18:0",
                                          "tryCall": false,
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                          }
                                        },
                                        {
                                          "argumentTypes": null,
                                          "id": 3006,
                                          "name": "amountOut",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 2979,
                                          "src": "49952:9:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                          },
                                          {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": null,
                                          "id": 2999,
                                          "name": "token",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 2839,
                                          "src": "49913:5:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_contract$_IERC20_$67",
                                            "typeString": "contract IERC20"
                                          }
                                        },
                                        "id": 3001,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "memberName": "safeTransfer",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": 204,
                                        "src": "49913:18:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC20_$67_$_t_address_$_t_uint256_$returns$__$bound_to$_t_contract$_IERC20_$67_$",
                                          "typeString": "function (contract IERC20,address,uint256)"
                                        }
                                      },
                                      "id": 3007,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "49913:49:0",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_tuple$__$",
                                        "typeString": "tuple()"
                                      }
                                    },
                                    "id": 3008,
                                    "nodeType": "ExpressionStatement",
                                    "src": "49913:49:0"
                                  },
                                  {
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 3019,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftHandSide": {
                                        "argumentTypes": null,
                                        "expression": {
                                          "argumentTypes": null,
                                          "id": 3009,
                                          "name": "data",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 2847,
                                          "src": "49980:4:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_struct$_StrategyData_$1673_memory_ptr",
                                            "typeString": "struct BentoBoxV1.StrategyData memory"
                                          }
                                        },
                                        "id": 3011,
                                        "isConstant": false,
                                        "isLValue": true,
                                        "isPure": false,
                                        "lValueRequested": true,
                                        "memberName": "balance",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": 1672,
                                        "src": "49980:12:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint128",
                                          "typeString": "uint128"
                                        }
                                      },
                                      "nodeType": "Assignment",
                                      "operator": "=",
                                      "rightHandSide": {
                                        "argumentTypes": null,
                                        "arguments": [
                                          {
                                            "argumentTypes": null,
                                            "arguments": [],
                                            "expression": {
                                              "argumentTypes": [],
                                              "expression": {
                                                "argumentTypes": null,
                                                "id": 3015,
                                                "name": "amountOut",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 2979,
                                                "src": "50012:9:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_uint256",
                                                  "typeString": "uint256"
                                                }
                                              },
                                              "id": 3016,
                                              "isConstant": false,
                                              "isLValue": false,
                                              "isPure": false,
                                              "lValueRequested": false,
                                              "memberName": "to128",
                                              "nodeType": "MemberAccess",
                                              "referencedDeclaration": 354,
                                              "src": "50012:15:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint128_$bound_to$_t_uint256_$",
                                                "typeString": "function (uint256) pure returns (uint128)"
                                              }
                                            },
                                            "id": 3017,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "kind": "functionCall",
                                            "lValueRequested": false,
                                            "names": [],
                                            "nodeType": "FunctionCall",
                                            "src": "50012:17:0",
                                            "tryCall": false,
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint128",
                                              "typeString": "uint128"
                                            }
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": [
                                            {
                                              "typeIdentifier": "t_uint128",
                                              "typeString": "uint128"
                                            }
                                          ],
                                          "expression": {
                                            "argumentTypes": null,
                                            "expression": {
                                              "argumentTypes": null,
                                              "id": 3012,
                                              "name": "data",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": 2847,
                                              "src": "49995:4:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_struct$_StrategyData_$1673_memory_ptr",
                                                "typeString": "struct BentoBoxV1.StrategyData memory"
                                              }
                                            },
                                            "id": 3013,
                                            "isConstant": false,
                                            "isLValue": true,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "memberName": "balance",
                                            "nodeType": "MemberAccess",
                                            "referencedDeclaration": 1672,
                                            "src": "49995:12:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint128",
                                              "typeString": "uint128"
                                            }
                                          },
                                          "id": 3014,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "memberName": "add",
                                          "nodeType": "MemberAccess",
                                          "referencedDeclaration": 430,
                                          "src": "49995:16:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_function_internal_pure$_t_uint128_$_t_uint128_$returns$_t_uint128_$bound_to$_t_uint128_$",
                                            "typeString": "function (uint128,uint128) pure returns (uint128)"
                                          }
                                        },
                                        "id": 3018,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "49995:35:0",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint128",
                                          "typeString": "uint128"
                                        }
                                      },
                                      "src": "49980:50:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint128",
                                        "typeString": "uint128"
                                      }
                                    },
                                    "id": 3020,
                                    "nodeType": "ExpressionStatement",
                                    "src": "49980:50:0"
                                  },
                                  {
                                    "expression": {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "id": 3024,
                                          "name": "amountOut",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 2979,
                                          "src": "50063:9:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": null,
                                          "id": 3021,
                                          "name": "_strategy",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 2853,
                                          "src": "50048:9:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_contract$_IStrategy_$142",
                                            "typeString": "contract IStrategy"
                                          }
                                        },
                                        "id": 3023,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "memberName": "skim",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": 115,
                                        "src": "50048:14:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_function_external_nonpayable$_t_uint256_$returns$__$",
                                          "typeString": "function (uint256) external"
                                        }
                                      },
                                      "id": 3025,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "50048:25:0",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_tuple$__$",
                                        "typeString": "tuple()"
                                      }
                                    },
                                    "id": 3026,
                                    "nodeType": "ExpressionStatement",
                                    "src": "50048:25:0"
                                  },
                                  {
                                    "eventCall": {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "id": 3028,
                                          "name": "token",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 2839,
                                          "src": "50114:5:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_contract$_IERC20_$67",
                                            "typeString": "contract IERC20"
                                          }
                                        },
                                        {
                                          "argumentTypes": null,
                                          "id": 3029,
                                          "name": "amountOut",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 2979,
                                          "src": "50121:9:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_contract$_IERC20_$67",
                                            "typeString": "contract IERC20"
                                          },
                                          {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        ],
                                        "id": 3027,
                                        "name": "LogStrategyInvest",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 1648,
                                        "src": "50096:17:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_function_event_nonpayable$_t_contract$_IERC20_$67_$_t_uint256_$returns$__$",
                                          "typeString": "function (contract IERC20,uint256)"
                                        }
                                      },
                                      "id": 3030,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "50096:35:0",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_tuple$__$",
                                        "typeString": "tuple()"
                                      }
                                    },
                                    "id": 3031,
                                    "nodeType": "EmitStatement",
                                    "src": "50091:40:0"
                                  }
                                ]
                              }
                            }
                          ]
                        }
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 3093,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 3089,
                              "name": "strategyData",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1717,
                              "src": "50646:12:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_contract$_IERC20_$67_$_t_struct$_StrategyData_$1673_storage_$",
                                "typeString": "mapping(contract IERC20 => struct BentoBoxV1.StrategyData storage ref)"
                              }
                            },
                            "id": 3091,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 3090,
                              "name": "token",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2839,
                              "src": "50659:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$67",
                                "typeString": "contract IERC20"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "50646:19:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_StrategyData_$1673_storage",
                              "typeString": "struct BentoBoxV1.StrategyData storage ref"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 3092,
                            "name": "data",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2847,
                            "src": "50668:4:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_StrategyData_$1673_memory_ptr",
                              "typeString": "struct BentoBoxV1.StrategyData memory"
                            }
                          },
                          "src": "50646:26:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_StrategyData_$1673_storage",
                            "typeString": "struct BentoBoxV1.StrategyData storage ref"
                          }
                        },
                        "id": 3094,
                        "nodeType": "ExpressionStatement",
                        "src": "50646:26:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 2837,
                    "nodeType": "StructuredDocumentation",
                    "src": "47524:483:0",
                    "text": "@notice The actual process of yield farming. Executes the strategy of `token`.\n Optionally does housekeeping if `balance` is true.\n `maxChangeAmount` is relevant for skimming or withdrawing if `balance` is true.\n @param token The address of the token for which a strategy is deployed.\n @param balance True if housekeeping should be done.\n @param maxChangeAmount The maximum amount for either pulling or pushing from/to the `IStrategy` contract."
                  },
                  "functionSelector": "66c6bb0b",
                  "id": 3096,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "harvest",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 2844,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2839,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3096,
                        "src": "48284:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$67",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 2838,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 67,
                          "src": "48284:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$67",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2841,
                        "mutability": "mutable",
                        "name": "balance",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3096,
                        "src": "48306:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 2840,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "48306:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2843,
                        "mutability": "mutable",
                        "name": "maxChangeAmount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3096,
                        "src": "48328:23:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 2842,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "48328:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "48274:83:0"
                  },
                  "returnParameters": {
                    "id": 2845,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "48365:0:0"
                  },
                  "scope": 3101,
                  "src": "48258:2421:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 3099,
                    "nodeType": "Block",
                    "src": "50842:2:0",
                    "statements": []
                  },
                  "documentation": null,
                  "id": 3100,
                  "implemented": true,
                  "kind": "receive",
                  "modifiers": [],
                  "name": "",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 3097,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "50822:2:0"
                  },
                  "returnParameters": {
                    "id": 3098,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "50842:0:0"
                  },
                  "scope": 3101,
                  "src": "50815:29:0",
                  "stateMutability": "payable",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 3102,
              "src": "27802:23044:0"
            }
          ],
          "src": "891:49956:0"
        },
        "id": 0
      }
    }
  }
}
