Contract 0xF7428FFCb2581A2804998eFbB036A43255c8A8D3 3

Contract Overview

Balance:
0 MATIC

Token:
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x08dcde4ceec4bd0ab15a29d19e5abc53dd25314fbee0175bb3ad74d76f131aa90x60c06040277261072022-08-22 4:49:1744 days 12 hrs ago0xfa9da51631268a30ec3ddd1ccbf46c65fad99251 IN  Create: AnycallProxy_SushiSwap0 MATIC0.087836316875 32.497257328
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
AnycallProxy_SushiSwap

Compiler Version
v0.8.14+commit.80d49f37

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at polygonscan.com on 2022-09-08
*/

// SPDX-License-Identifier: GPL-3.0-or-later
// Sources flattened with hardhat v2.9.1 https://hardhat.org

// File @openzeppelin/contracts/token/ERC20/[email protected]

// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}


// File @openzeppelin/contracts/utils/[email protected]

// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}


// File @openzeppelin/contracts/token/ERC20/utils/[email protected]

// OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol)

pragma solidity ^0.8.0;


/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}


// File contracts/access/MPCManageable.sol


pragma solidity ^0.8.10;

abstract contract MPCManageable {
    using Address for address;

    address public mpc;
    address public pendingMPC;

    uint256 public constant delay = 2 days;
    uint256 public delayMPC;

    modifier onlyMPC() {
        require(msg.sender == mpc, "MPC: only mpc");
        _;
    }

    event LogChangeMPC(address indexed oldMPC, address indexed newMPC, uint256 effectiveTime);
    event LogApplyMPC(address indexed oldMPC, address indexed newMPC, uint256 applyTime);

    constructor(address _mpc) {
        require(_mpc != address(0), "MPC: mpc is the zero address");
        mpc = _mpc;
        emit LogChangeMPC(address(0), mpc, block.timestamp);
    }

    function changeMPC(address _mpc) external onlyMPC {
        require(_mpc != address(0), "MPC: mpc is the zero address");
        pendingMPC = _mpc;
        delayMPC = block.timestamp + delay;
        emit LogChangeMPC(mpc, pendingMPC, delayMPC);
    }

    function applyMPC() external {
        require(
            msg.sender == pendingMPC ||
            (msg.sender == mpc && address(pendingMPC).isContract()),
            "MPC: only pending mpc"
        );
        require(delayMPC > 0 && block.timestamp >= delayMPC, "MPC: time before delayMPC");
        emit LogApplyMPC(mpc, pendingMPC, block.timestamp);
        mpc = pendingMPC;
        pendingMPC = address(0);
        delayMPC = 0;
    }
}


// File contracts/router/interfaces/IAnycallProxy.sol

pragma solidity ^0.8.10;

interface IAnycallProxy {
    function exec(
        address token,
        uint256 amount,
        bytes calldata data
    ) external returns (bool success, bytes memory result);
}


// File contracts/router/proxy/AnycallProxyBase.sol


pragma solidity ^0.8.10;


abstract contract AnycallProxyBase is MPCManageable, IAnycallProxy {
    mapping(address => bool) public supportedCaller;

    modifier onlyAuth() {
        require(supportedCaller[msg.sender], "AnycallProxyBase: only auth");
        _;
    }

    constructor(address mpc_, address caller_) MPCManageable(mpc_) {
        supportedCaller[caller_] = true;
    }

    function addSupportedCaller(address caller) external onlyMPC {
        supportedCaller[caller] = true;
    }

    function removeSupportedCaller(address caller) external onlyMPC {
        supportedCaller[caller] = false;
    }
}


// File contracts/router/interfaces/SwapInfo.sol

pragma solidity ^0.8.6;

struct SwapInfo {
    bytes32 swapoutID;
    address token;
    address receiver;
    uint256 amount;
    uint256 fromChainID;
}


// File contracts/router/interfaces/IRetrySwapinAndExec.sol

pragma solidity ^0.8.10;

interface IRetrySwapinAndExec {
    function retrySwapinAndExec(
        string calldata swapID,
        SwapInfo calldata swapInfo,
        address anycallProxy,
        bytes calldata data,
        bool dontExec
    ) external;
}


// File contracts/router/interfaces/IUnderlying.sol


pragma solidity ^0.8.10;

interface IUnderlying {
    function underlying() external view returns (address);

    function deposit(uint256 amount, address to) external returns (uint256);

    function withdraw(uint256 amount, address to) external returns (uint256);
}


// File contracts/router/interfaces/IwNATIVE.sol

pragma solidity ^0.8.10;

interface IwNATIVE {
    function deposit() external payable;

    function withdraw(uint256) external;
}


// File contracts/router/proxy/SushiSwapProxy.sol


pragma solidity ^0.8.10;





library SafeMathSushiswap {
    function add(uint256 x, uint256 y) internal pure returns (uint256 z) {
        unchecked {
            require((z = x + y) >= x, "ds-math-add-overflow");
        }
    }

    function sub(uint256 x, uint256 y) internal pure returns (uint256 z) {
        unchecked {
            require((z = x - y) <= x, "ds-math-sub-underflow");
        }
    }

    function mul(uint256 x, uint256 y) internal pure returns (uint256 z) {
        unchecked {
            require(y == 0 || (z = x * y) / y == x, "ds-math-mul-overflow");
        }
    }
}

interface ISushiswapV2Factory {
    function getPair(address tokenA, address tokenB)
        external
        view
        returns (address pair);
}

interface ISushiswapV2Pair {
    function getReserves()
        external
        view
        returns (
            uint112 reserve0,
            uint112 reserve1,
            uint32 blockTimestampLast
        );

    function swap(
        uint256 amount0Out,
        uint256 amount1Out,
        address to,
        bytes calldata data
    ) external;
}

library SushiswapV2Library {
    using SafeMathSushiswap for uint256;

    // returns sorted token addresses, used to handle return values from pairs sorted in this order
    function sortTokens(address tokenA, address tokenB)
        internal
        pure
        returns (address token0, address token1)
    {
        require(tokenA != tokenB, "SushiswapV2Library: IDENTICAL_ADDRESSES");
        (token0, token1) = tokenA < tokenB
            ? (tokenA, tokenB)
            : (tokenB, tokenA);
        require(token0 != address(0), "SushiswapV2Library: ZERO_ADDRESS");
    }

    // calculates the CREATE2 address for a pair without making any external calls
    function pairFor(
        address factory,
        address tokenA,
        address tokenB
    ) internal view returns (address pair) {
        return ISushiswapV2Factory(factory).getPair(tokenA, tokenB);
    }

    // fetches and sorts the reserves for a pair
    function getReserves(
        address factory,
        address tokenA,
        address tokenB
    ) internal view returns (uint256 reserveA, uint256 reserveB) {
        (address token0, ) = sortTokens(tokenA, tokenB);
        (uint256 reserve0, uint256 reserve1, ) = ISushiswapV2Pair(
            pairFor(factory, tokenA, tokenB)
        ).getReserves();
        (reserveA, reserveB) = tokenA == token0
            ? (reserve0, reserve1)
            : (reserve1, reserve0);
    }

    // given an input amount of an asset and pair reserves, returns the maximum output amount of the other asset
    function getAmountOut(
        uint256 amountIn,
        uint256 reserveIn,
        uint256 reserveOut
    ) internal pure returns (uint256 amountOut) {
        require(amountIn > 0, "SushiswapV2Library: INSUFFICIENT_INPUT_AMOUNT");
        require(
            reserveIn > 0 && reserveOut > 0,
            "SushiswapV2Library: INSUFFICIENT_LIQUIDITY"
        );
        uint256 amountInWithFee = amountIn.mul(997);
        uint256 numerator = amountInWithFee.mul(reserveOut);
        uint256 denominator = reserveIn.mul(1000).add(amountInWithFee);
        amountOut = numerator / denominator;
    }

    // given an output amount of an asset and pair reserves, returns a required input amount of the other asset
    function getAmountIn(
        uint256 amountOut,
        uint256 reserveIn,
        uint256 reserveOut
    ) internal pure returns (uint256 amountIn) {
        require(
            amountOut > 0,
            "SushiswapV2Library: INSUFFICIENT_OUTPUT_AMOUNT"
        );
        require(
            reserveIn > 0 && reserveOut > 0,
            "SushiswapV2Library: INSUFFICIENT_LIQUIDITY"
        );
        uint256 numerator = reserveIn.mul(amountOut).mul(1000);
        uint256 denominator = reserveOut.sub(amountOut).mul(997);
        amountIn = (numerator / denominator).add(1);
    }

    // performs chained getAmountOut calculations on any number of pairs
    function getAmountsOut(
        address factory,
        uint256 amountIn,
        address[] memory path
    ) internal view returns (uint256[] memory amounts) {
        require(path.length >= 2, "SushiswapV2Library: INVALID_PATH");
        amounts = new uint256[](path.length);
        amounts[0] = amountIn;
        for (uint256 i; i < path.length - 1; i++) {
            (uint256 reserveIn, uint256 reserveOut) = getReserves(
                factory,
                path[i],
                path[i + 1]
            );
            amounts[i + 1] = getAmountOut(amounts[i], reserveIn, reserveOut);
        }
    }

    // performs chained getAmountIn calculations on any number of pairs
    function getAmountsIn(
        address factory,
        uint256 amountOut,
        address[] memory path
    ) internal view returns (uint256[] memory amounts) {
        require(path.length >= 2, "SushiswapV2Library: INVALID_PATH");
        amounts = new uint256[](path.length);
        amounts[amounts.length - 1] = amountOut;
        for (uint256 i = path.length - 1; i > 0; i--) {
            (uint256 reserveIn, uint256 reserveOut) = getReserves(
                factory,
                path[i - 1],
                path[i]
            );
            amounts[i - 1] = getAmountIn(amounts[i], reserveIn, reserveOut);
        }
    }
}

contract AnycallProxy_SushiSwap is AnycallProxyBase {
    using SafeMathSushiswap for uint256;
    using SafeERC20 for IERC20;

    address public immutable sushiFactory;
    address public immutable wNATIVE;

    event TokenSwap(
        address indexed token,
        address indexed receiver,
        uint256 amount
    );
    event TokenBack(
        address indexed token,
        address indexed receiver,
        uint256 amount
    );
    event ExecFailed(address indexed token, uint256 amount, bytes data);

    constructor(
        address mpc_,
        address caller_,
        address sushiV2Factory_,
        address wNATIVE_
    ) AnycallProxyBase(mpc_, caller_) {
        sushiFactory = sushiV2Factory_;
        wNATIVE = wNATIVE_;
    }

    struct AnycallInfo {
        uint256 amountOut;
        uint256 amountOutMin;
        uint256 amountInMax;
        address[] path;
        address receiver;
        uint256 deadline;
        bool toNative;
    }

    struct AnycallRes {
        address recvToken;
        address receiver;
        uint256 recvAmount;
    }

    function encode_anycall_info(AnycallInfo calldata info)
        public
        pure
        returns (bytes memory)
    {
        return abi.encode(info);
    }

    function decode_anycall_info(bytes memory data)
        public
        pure
        returns (AnycallInfo memory)
    {
        return abi.decode(data, (AnycallInfo));
    }

    // impl `IAnycallProxy` interface
    // Note: take care of the situation when do the business failed.
    function exec(
        address token,
        uint256 amount,
        bytes calldata data
    ) external onlyAuth returns (bool success, bytes memory result) {
        AnycallInfo memory anycallInfo = decode_anycall_info(data);
        try this.execSwap(token, amount, anycallInfo) returns (
            bool succ,
            bytes memory res
        ) {
            (success, result) = (succ, res);
        } catch {
            // process failure situation (eg. return token)
            IERC20(token).safeTransfer(anycallInfo.receiver, amount);
            emit ExecFailed(token, amount, data);
        }
    }

    function execSwap(
        address token,
        uint256 amount,
        AnycallInfo calldata anycallInfo
    ) external returns (bool success, bytes memory result) {
        require(msg.sender == address(this));
        require(
            anycallInfo.deadline >= block.timestamp,
            "SushiSwapAnycallProxy: EXPIRED"
        );
        address receiver = anycallInfo.receiver;
        require(receiver != address(0), "SushiSwapAnycallProxy: zero receiver");

        address[] memory path = anycallInfo.path;
        require(path.length >= 2, "SushiSwapAnycallProxy: invalid path length");
        require(
            path[0] == token,
            "SushiSwapAnycallProxy: source token mismatch"
        );

        require(
            anycallInfo.amountInMax <= amount,
            "SushiSwapAnycallProxy:EXCESSIVE_INPUT_AMOUNT"
        );

        uint256 amountInMax = anycallInfo.amountInMax == 0
            ? amount
            : anycallInfo.amountInMax;

        uint256[] memory amounts;
        if (anycallInfo.amountOut == 0) {
            amounts = swapExactTokensForTokens(anycallInfo, amountInMax);
        } else {
            amounts = swapTokensForExactTokens(anycallInfo, amountInMax);
        }

        IERC20(path[0]).safeTransfer(
            SushiswapV2Library.pairFor(sushiFactory, path[0], path[1]),
            amounts[0]
        );

        address recvToken;
        uint256 recvAmount;
        if (anycallInfo.toNative) {
            require(
                path[path.length - 1] == wNATIVE,
                "SushiSwapAnycallProxy:INVALID_PATH"
            );
            (recvToken, recvAmount) = _swap(amounts, path, address(this));
            IwNATIVE(wNATIVE).withdraw(recvAmount);
            Address.sendValue(payable(receiver), recvAmount);
            recvToken = address(0);
        } else {
            (recvToken, recvAmount) = _swap(amounts, path, receiver);
        }
        emit TokenSwap(recvToken, receiver, recvAmount);

        if (amount.sub(amounts[0]) > 0) {
            IERC20(path[0]).safeTransfer(receiver, amount.sub(amounts[0]));
            emit TokenBack(token, receiver, amount.sub(amounts[0]));
        }

        return (true, abi.encode(recvToken, recvAmount));
    }

    function swapTokensForExactTokens(
        AnycallInfo memory anycallInfo,
        uint256 amountInMax
    ) internal view returns (uint256[] memory amounts) {
        amounts = SushiswapV2Library.getAmountsIn(
            sushiFactory,
            anycallInfo.amountOut,
            anycallInfo.path
        );
        require(
            amounts[0] <= amountInMax,
            "SushiSwapAnycallProxy: EXCESSIVE_INPUT_AMOUNT"
        );
    }

    function swapExactTokensForTokens(
        AnycallInfo memory anycallInfo,
        uint256 amountInMax
    ) internal view returns (uint256[] memory amounts) {
        amounts = SushiswapV2Library.getAmountsOut(
            sushiFactory,
            amountInMax,
            anycallInfo.path
        );

        require(
            amounts[amounts.length - 1] >= anycallInfo.amountOutMin,
            "SushiSwapAnycallProxy: INSUFFICIENT_OUTPUT_AMOUNT"
        );
    }

    function retrySwapinAndExec(
        address router,
        string calldata swapID,
        SwapInfo calldata swapInfo,
        bytes calldata data,
        bool dontExec
    ) external {
        require(supportedCaller[router], "unsupported router");
        AnycallInfo memory anycallInfo = decode_anycall_info(data);
        require(msg.sender == anycallInfo.receiver, "forbid call retry");

        address _underlying = IUnderlying(swapInfo.token).underlying();
        require(_underlying != address(0), "zero underlying");
        uint256 old_balance = IERC20(_underlying).balanceOf(address(this));

        IRetrySwapinAndExec(router).retrySwapinAndExec(
            swapID,
            swapInfo,
            address(this),
            data,
            dontExec
        );
        if (dontExec) {
            // process don't exec situation (eg. return token)
            uint256 new_balance = IERC20(_underlying).balanceOf(address(this));
            require(
                new_balance >= old_balance &&
                    new_balance <= old_balance + swapInfo.amount,
                "balance check failed"
            );
            IERC20(_underlying).safeTransfer(
                anycallInfo.receiver,
                new_balance - old_balance
            );
        }
    }

    // **** SWAP ****
    // requires the initial amount to have already been sent to the first pair
    function _swap(
        uint256[] memory amounts,
        address[] memory path,
        address _to
    ) internal virtual returns (address, uint256) {
        for (uint256 i; i < path.length - 1; i++) {
            (address input, address output) = (path[i], path[i + 1]);
            (address token0, ) = SushiswapV2Library.sortTokens(input, output);
            uint256 amountOut = amounts[i + 1];
            (uint256 amount0Out, uint256 amount1Out) = input == token0
                ? (uint256(0), amountOut)
                : (amountOut, uint256(0));
            address to = i < path.length - 2
                ? SushiswapV2Library.pairFor(sushiFactory, output, path[i + 2])
                : _to;
            ISushiswapV2Pair(
                SushiswapV2Library.pairFor(sushiFactory, input, output)
            ).swap(amount0Out, amount1Out, to, new bytes(0));
        }
        return (path[path.length - 1], amounts[amounts.length - 1]);
    }

    fallback() external payable {
        assert(msg.sender == wNATIVE); // only accept Native via fallback from the wNative contract
    }

    receive() external payable {
        assert(msg.sender == wNATIVE); // only accept Native via fallback from the wNative contract
    }
}

Contract ABI

[{"inputs":[{"internalType":"address","name":"mpc_","type":"address"},{"internalType":"address","name":"caller_","type":"address"},{"internalType":"address","name":"sushiV2Factory_","type":"address"},{"internalType":"address","name":"wNATIVE_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"ExecFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldMPC","type":"address"},{"indexed":true,"internalType":"address","name":"newMPC","type":"address"},{"indexed":false,"internalType":"uint256","name":"applyTime","type":"uint256"}],"name":"LogApplyMPC","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldMPC","type":"address"},{"indexed":true,"internalType":"address","name":"newMPC","type":"address"},{"indexed":false,"internalType":"uint256","name":"effectiveTime","type":"uint256"}],"name":"LogChangeMPC","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TokenBack","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TokenSwap","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"address","name":"caller","type":"address"}],"name":"addSupportedCaller","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyMPC","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_mpc","type":"address"}],"name":"changeMPC","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"data","type":"bytes"}],"name":"decode_anycall_info","outputs":[{"components":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"toNative","type":"bool"}],"internalType":"struct AnycallProxy_SushiSwap.AnycallInfo","name":"","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"delay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"delayMPC","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"toNative","type":"bool"}],"internalType":"struct AnycallProxy_SushiSwap.AnycallInfo","name":"info","type":"tuple"}],"name":"encode_anycall_info","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"exec","outputs":[{"internalType":"bool","name":"success","type":"bool"},{"internalType":"bytes","name":"result","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"components":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"toNative","type":"bool"}],"internalType":"struct AnycallProxy_SushiSwap.AnycallInfo","name":"anycallInfo","type":"tuple"}],"name":"execSwap","outputs":[{"internalType":"bool","name":"success","type":"bool"},{"internalType":"bytes","name":"result","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mpc","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingMPC","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"caller","type":"address"}],"name":"removeSupportedCaller","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"router","type":"address"},{"internalType":"string","name":"swapID","type":"string"},{"components":[{"internalType":"bytes32","name":"swapoutID","type":"bytes32"},{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"fromChainID","type":"uint256"}],"internalType":"struct SwapInfo","name":"swapInfo","type":"tuple"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"bool","name":"dontExec","type":"bool"}],"name":"retrySwapinAndExec","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"supportedCaller","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sushiFactory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wNATIVE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c06040523480156200001157600080fd5b50604051620030fd380380620030fd83398101604081905262000034916200013b565b8383816001600160a01b038116620000925760405162461bcd60e51b815260206004820152601c60248201527f4d50433a206d706320697320746865207a65726f206164647265737300000000604482015260640160405180910390fd5b600080546001600160a01b0319166001600160a01b03831690811782556040514281529091907f581f388e3dd32e1bbf62a290f509c8245f9d0b71ef82614fb2b967ad0a10d5b99060200160405180910390a3506001600160a01b039081166000908152600360205260409020805460ff19166001179055928316608052501660a05250620001989050565b80516001600160a01b03811681146200013657600080fd5b919050565b600080600080608085870312156200015257600080fd5b6200015d856200011e565b93506200016d602086016200011e565b92506200017d604086016200011e565b91506200018d606086016200011e565b905092959194509250565b60805160a051612f00620001fd60003960008181610107015281816101410152818161030b0152818161091001526109e601526000818161021b0152818161084e0152818161134a0152818161141101528181611627015261166a0152612f006000f3fe6080604052600436106100f75760003560e01c80636fed5b831161008a578063dc77b06511610059578063dc77b06514610342578063e43b2d7a14610382578063f75c2664146103af578063f830e7b4146103cf57610136565b80636fed5b83146102ac5780637ba95c0d146102cc5780638fd903f5146102f9578063b63b38d01461032d57610136565b806322984b24116100c657806322984b2414610209578063580e70d5146102555780635b7b018c146102755780636a42b8f81461029557610136565b80630565bb671461016e578063075d8d90146101a557806308cb277f146101c5578063160f1053146101e557610136565b3661013657336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101345761013461226e565b005b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101345761013461226e565b34801561017a57600080fd5b5061018e6101893660046122ed565b6103ef565b60405161019c9291906123a4565b60405180910390f35b3480156101b157600080fd5b5061018e6101c03660046123d7565b610578565b3480156101d157600080fd5b506101346101e036600461242f565b610be8565b3480156101f157600080fd5b506101fb60025481565b60405190815260200161019c565b34801561021557600080fd5b5061023d7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161019c565b34801561026157600080fd5b5061013461027036600461242f565b610c33565b34801561028157600080fd5b5061013461029036600461242f565b610c81565b3480156102a157600080fd5b506101fb6202a30081565b3480156102b857600080fd5b506101346102c7366004612465565b610d79565b3480156102d857600080fd5b506102ec6102e73660046125b1565b61110c565b60405161019c91906126d6565b34801561030557600080fd5b5061023d7f000000000000000000000000000000000000000000000000000000000000000081565b34801561033957600080fd5b50610134611171565b34801561034e57600080fd5b5061037261035d36600461242f565b60036020526000908152604090205460ff1681565b604051901515815260200161019c565b34801561038e57600080fd5b506103a261039d3660046126e9565b6112c3565b60405161019c9190612725565b3480156103bb57600080fd5b5060005461023d906001600160a01b031681565b3480156103db57600080fd5b5060015461023d906001600160a01b031681565b3360009081526003602052604081205460609060ff166104565760405162461bcd60e51b815260206004820152601b60248201527f416e7963616c6c50726f7879426173653a206f6e6c792061757468000000000060448201526064015b60405180910390fd5b600061049785858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061110c92505050565b6040516275d8d960e41b8152909150309063075d8d90906104c0908a908a908690600401612738565b6000604051808303816000875af192505050801561050057506040513d6000823e601f3d908101601f191682016040526104fd9190810190612773565b60015b61056857608081015161051e906001600160a01b03891690886112ec565b866001600160a01b03167fa7bedada770b7e088a13b6fec22cdbf7ca3eb4b24becbc4874aa5124c6f9467187878760405161055b93929190612828565b60405180910390a261056e565b90935091505b5094509492505050565b6000606033301461058857600080fd5b428360a0013510156105dc5760405162461bcd60e51b815260206004820152601e60248201527f537573686953776170416e7963616c6c50726f78793a20455850495245440000604482015260640161044d565b60006105ee60a085016080860161242f565b90506001600160a01b0381166106525760405162461bcd60e51b8152602060048201526024808201527f537573686953776170416e7963616c6c50726f78793a207a65726f207265636560448201526334bb32b960e11b606482015260840161044d565b60006106616060860186612842565b808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505082519293505050600211156106fa5760405162461bcd60e51b815260206004820152602a60248201527f537573686953776170416e7963616c6c50726f78793a20696e76616c696420706044820152690c2e8d040d8cadccee8d60b31b606482015260840161044d565b866001600160a01b0316816000815181106107175761071761288b565b60200260200101516001600160a01b03161461078a5760405162461bcd60e51b815260206004820152602c60248201527f537573686953776170416e7963616c6c50726f78793a20736f7572636520746f60448201526b0d6cadc40dad2e6dac2e8c6d60a31b606482015260840161044d565b85856040013511156107f35760405162461bcd60e51b815260206004820152602c60248201527f537573686953776170416e7963616c6c50726f78793a4558434553534956455f60448201526b125394155517d05353d5539560a21b606482015260840161044d565b600060408601351561080957856040013561080b565b865b9050606086356000036108315761082a61082488612933565b83611343565b9050610846565b61084361083d88612933565b8361140a565b90505b6108f66108a87f0000000000000000000000000000000000000000000000000000000000000000856000815181106108805761088061288b565b60200260200101518660018151811061089b5761089b61288b565b60200260200101516114c1565b826000815181106108bb576108bb61288b565b6020026020010151856000815181106108d6576108d661288b565b60200260200101516001600160a01b03166112ec9092919063ffffffff16565b60008061090960e08a0160c08b016129c2565b15610a5d577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001875161094791906129f5565b815181106109575761095761288b565b60200260200101516001600160a01b0316146109c05760405162461bcd60e51b815260206004820152602260248201527f537573686953776170416e7963616c6c50726f78793a494e56414c49445f50416044820152610a8960f31b606482015260840161044d565b6109cb838630611541565b604051632e1a7d4d60e01b81526004810182905291935091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b158015610a3257600080fd5b505af1158015610a46573d6000803e3d6000fd5b50505050610a548682611794565b60009150610a6e565b610a68838688611541565b90925090505b856001600160a01b0316826001600160a01b03167f9d3e64e0b9bc617a229c24a7aa25ef6c9c775a1998f32e31dde4da03c467dc0e83604051610ab391815260200190565b60405180910390a36000610aea84600081518110610ad357610ad361288b565b60200260200101518c6118ad90919063ffffffff16565b1115610ba857610b3486610b2185600081518110610b0a57610b0a61288b565b60200260200101518d6118ad90919063ffffffff16565b876000815181106108d6576108d661288b565b856001600160a01b03168b6001600160a01b03167f353a6c8294e9701b5dc4d2c67c534aec1a7ddca8daee2a72b026add9d52102d0610b9686600081518110610b7f57610b7f61288b565b60200260200101518e6118ad90919063ffffffff16565b60405190815260200160405180910390a35b604080516001600160a01b038416602082015290810182905260019060600160405160208183030381529060405297509750505050505050935093915050565b6000546001600160a01b03163314610c125760405162461bcd60e51b815260040161044d90612a0c565b6001600160a01b03166000908152600360205260409020805460ff19169055565b6000546001600160a01b03163314610c5d5760405162461bcd60e51b815260040161044d90612a0c565b6001600160a01b03166000908152600360205260409020805460ff19166001179055565b6000546001600160a01b03163314610cab5760405162461bcd60e51b815260040161044d90612a0c565b6001600160a01b038116610d015760405162461bcd60e51b815260206004820152601c60248201527f4d50433a206d706320697320746865207a65726f206164647265737300000000604482015260640161044d565b600180546001600160a01b0319166001600160a01b038316179055610d296202a30042612a33565b60028190556001546000546040519283526001600160a01b03918216929116907f581f388e3dd32e1bbf62a290f509c8245f9d0b71ef82614fb2b967ad0a10d5b99060200160405180910390a350565b6001600160a01b03871660009081526003602052604090205460ff16610dd65760405162461bcd60e51b81526020600482015260126024820152713ab739bab83837b93a32b2103937baba32b960711b604482015260640161044d565b6000610e1784848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061110c92505050565b905080608001516001600160a01b0316336001600160a01b031614610e725760405162461bcd60e51b8152602060048201526011602482015270666f726269642063616c6c20726574727960781b604482015260640161044d565b6000610e84604087016020880161242f565b6001600160a01b0316636f307dc36040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ec1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ee59190612a56565b90506001600160a01b038116610f2f5760405162461bcd60e51b815260206004820152600f60248201526e7a65726f20756e6465726c79696e6760881b604482015260640161044d565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a0823190602401602060405180830381865afa158015610f76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f9a9190612a73565b6040516321cab34160e21b81529091506001600160a01b038b169063872acd0490610fd5908c908c908c9030908d908d908d90600401612a8c565b600060405180830381600087803b158015610fef57600080fd5b505af1158015611003573d6000803e3d6000fd5b505050508315611100576040516370a0823160e01b81523060048201526000906001600160a01b038416906370a0823190602401602060405180830381865afa158015611054573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110789190612a73565b90508181101580156110975750611093606089013583612a33565b8111155b6110da5760405162461bcd60e51b815260206004820152601460248201527318985b185b98d94818da1958dac819985a5b195960621b604482015260640161044d565b60808401516110fe906110ed84846129f5565b6001600160a01b03861691906112ec565b505b50505050505050505050565b6111576040518060e001604052806000815260200160008152602001600081526020016060815260200160006001600160a01b03168152602001600081526020016000151581525090565b8180602001905181019061116b9190612b8e565b92915050565b6001546001600160a01b03163314806111aa57506000546001600160a01b0316331480156111aa57506001546001600160a01b03163b15155b6111ee5760405162461bcd60e51b81526020600482015260156024820152744d50433a206f6e6c792070656e64696e67206d706360581b604482015260640161044d565b600060025411801561120257506002544210155b61124e5760405162461bcd60e51b815260206004820152601960248201527f4d50433a2074696d65206265666f72652064656c61794d504300000000000000604482015260640161044d565b6001546000546040514281526001600160a01b0392831692909116907f8d32c9dd498e08090b44a0f77fe9ec0278851f9dffc4b430428411243e7df0769060200160405180910390a360018054600080546001600160a01b03199081166001600160a01b038416178255909116909155600255565b6060816040516020016112d69190612c8d565b6040516020818303038152906040529050919050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261133e9084906118f8565b505050565b60606113747f00000000000000000000000000000000000000000000000000000000000000008385606001516119ca565b90508260200151816001835161138a91906129f5565b8151811061139a5761139a61288b565b6020026020010151101561116b5760405162461bcd60e51b815260206004820152603160248201527f537573686953776170416e7963616c6c50726f78793a20494e5355464649434960448201527011539517d3d55514155517d05353d55395607a1b606482015260840161044d565b606061143f7f000000000000000000000000000000000000000000000000000000000000000084600001518560600151611b54565b905081816000815181106114555761145561288b565b6020026020010151111561116b5760405162461bcd60e51b815260206004820152602d60248201527f537573686953776170416e7963616c6c50726f78793a2045584345535349564560448201526c17d25394155517d05353d55395609a1b606482015260840161044d565b60405163e6a4390560e01b81526001600160a01b03838116600483015282811660248301526000919085169063e6a4390590604401602060405180830381865afa158015611513573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115379190612a56565b90505b9392505050565b60008060005b6001855161155591906129f5565b811015611739576000808683815181106115715761157161288b565b6020026020010151878460016115879190612a33565b815181106115975761159761288b565b60200260200101519150915060006115af8383611cd4565b5090506000896115c0866001612a33565b815181106115d0576115d061288b565b60200260200101519050600080836001600160a01b0316866001600160a01b0316146115fe57826000611602565b6000835b91509150600060028c5161161691906129f5565b8810611622578a611663565b6116637f0000000000000000000000000000000000000000000000000000000000000000878e6116538c6002612a33565b8151811061089b5761089b61288b565b90506116907f000000000000000000000000000000000000000000000000000000000000000088886114c1565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f1916602001820160405280156116cd576020820181803683370190505b506040518563ffffffff1660e01b81526004016116ed9493929190612d4b565b600060405180830381600087803b15801561170757600080fd5b505af115801561171b573d6000803e3d6000fd5b5050505050505050505050808061173190612d78565b915050611547565b50836001855161174991906129f5565b815181106117595761175961288b565b6020026020010151856001875161177091906129f5565b815181106117805761178061288b565b602002602001015191509150935093915050565b804710156117e45760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604482015260640161044d565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611831576040519150601f19603f3d011682016040523d82523d6000602084013e611836565b606091505b505090508061133e5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d61792068617665207265766572746564000000000000606482015260840161044d565b8082038281111561116b5760405162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015260640161044d565b600061194d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611dcd9092919063ffffffff16565b80519091501561133e578080602001905181019061196b9190612d91565b61133e5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161044d565b6060600282511015611a1e5760405162461bcd60e51b815260206004820181905260248201527f53757368697377617056324c6962726172793a20494e56414c49445f50415448604482015260640161044d565b81516001600160401b03811115611a3757611a3761251c565b604051908082528060200260200182016040528015611a60578160200160208202803683370190505b5090508281600081518110611a7757611a7761288b565b60200260200101818152505060005b60018351611a9491906129f5565b811015611b4c57600080611ae787868581518110611ab457611ab461288b565b602002602001015187866001611aca9190612a33565b81518110611ada57611ada61288b565b6020026020010151611ddc565b91509150611b0f848481518110611b0057611b0061288b565b60200260200101518383611ea6565b84611b1b856001612a33565b81518110611b2b57611b2b61288b565b60200260200101818152505050508080611b4490612d78565b915050611a86565b509392505050565b6060600282511015611ba85760405162461bcd60e51b815260206004820181905260248201527f53757368697377617056324c6962726172793a20494e56414c49445f50415448604482015260640161044d565b81516001600160401b03811115611bc157611bc161251c565b604051908082528060200260200182016040528015611bea578160200160208202803683370190505b509050828160018351611bfd91906129f5565b81518110611c0d57611c0d61288b565b602002602001018181525050600060018351611c2991906129f5565b90505b8015611b4c57600080611c6f8786611c456001876129f5565b81518110611c5557611c5561288b565b6020026020010151878681518110611ada57611ada61288b565b91509150611c97848481518110611c8857611c8861288b565b60200260200101518383611f86565b84611ca36001866129f5565b81518110611cb357611cb361288b565b60200260200101818152505050508080611ccc90612dae565b915050611c2c565b600080826001600160a01b0316846001600160a01b031603611d485760405162461bcd60e51b815260206004820152602760248201527f53757368697377617056324c6962726172793a204944454e544943414c5f41446044820152664452455353455360c81b606482015260840161044d565b826001600160a01b0316846001600160a01b031610611d68578284611d6b565b83835b90925090506001600160a01b038216611dc65760405162461bcd60e51b815260206004820181905260248201527f53757368697377617056324c6962726172793a205a45524f5f41444452455353604482015260640161044d565b9250929050565b60606115378484600085612061565b6000806000611deb8585611cd4565b509050600080611dfc8888886114c1565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015611e39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e5d9190612ddc565b506001600160701b031691506001600160701b03169150826001600160a01b0316876001600160a01b031614611e94578082611e97565b81815b90999098509650505050505050565b6000808411611f0d5760405162461bcd60e51b815260206004820152602d60248201527f53757368697377617056324c6962726172793a20494e53554646494349454e5460448201526c17d25394155517d05353d55395609a1b606482015260840161044d565b600083118015611f1d5750600082115b611f395760405162461bcd60e51b815260040161044d90612e2c565b6000611f47856103e5612187565b90506000611f558285612187565b90506000611f6f83611f69886103e8612187565b906121eb565b9050611f7b8183612e8c565b979650505050505050565b6000808411611fee5760405162461bcd60e51b815260206004820152602e60248201527f53757368697377617056324c6962726172793a20494e53554646494349454e5460448201526d17d3d55514155517d05353d5539560921b606482015260840161044d565b600083118015611ffe5750600082115b61201a5760405162461bcd60e51b815260040161044d90612e2c565b60006120326103e861202c8688612187565b90612187565b905060006120466103e561202c86896118ad565b90506120576001611f698385612e8c565b9695505050505050565b6060824710156120c25760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161044d565b6001600160a01b0385163b6121195760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161044d565b600080866001600160a01b031685876040516121359190612eae565b60006040518083038185875af1925050503d8060008114612172576040519150601f19603f3d011682016040523d82523d6000602084013e612177565b606091505b5091509150611f7b828286612235565b60008115806121a8575050808202828282816121a5576121a5612e76565b04145b61116b5760405162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015260640161044d565b8082018281101561116b5760405162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015260640161044d565b6060831561224457508161153a565b8251156122545782518084602001fd5b8160405162461bcd60e51b815260040161044d9190612725565b634e487b7160e01b600052600160045260246000fd5b6001600160a01b038116811461229957600080fd5b50565b80356122a781612284565b919050565b60008083601f8401126122be57600080fd5b5081356001600160401b038111156122d557600080fd5b602083019150836020828501011115611dc657600080fd5b6000806000806060858703121561230357600080fd5b843561230e81612284565b93506020850135925060408501356001600160401b0381111561233057600080fd5b61233c878288016122ac565b95989497509550505050565b60005b8381101561236357818101518382015260200161234b565b83811115612372576000848401525b50505050565b60008151808452612390816020860160208601612348565b601f01601f19169290920160200192915050565b82151581526040602082015260006115376040830184612378565b600060e082840312156123d157600080fd5b50919050565b6000806000606084860312156123ec57600080fd5b83356123f781612284565b92506020840135915060408401356001600160401b0381111561241957600080fd5b612425868287016123bf565b9150509250925092565b60006020828403121561244157600080fd5b813561153a81612284565b801515811461229957600080fd5b80356122a78161244c565b600080600080600080600087890361012081121561248257600080fd5b883561248d81612284565b975060208901356001600160401b03808211156124a957600080fd5b6124b58c838d016122ac565b909950975087915060a0603f19840112156124cf57600080fd5b60408b01965060e08b01359250808311156124e957600080fd5b50506124f78a828b016122ac565b90945092505061010088013561250c8161244c565b8091505092959891949750929550565b634e487b7160e01b600052604160045260246000fd5b60405160e081016001600160401b03811182821017156125545761255461251c565b60405290565b604051601f8201601f191681016001600160401b03811182821017156125825761258261251c565b604052919050565b60006001600160401b038211156125a3576125a361251c565b50601f01601f191660200190565b6000602082840312156125c357600080fd5b81356001600160401b038111156125d957600080fd5b8201601f810184136125ea57600080fd5b80356125fd6125f88261258a565b61255a565b81815285602083850101111561261257600080fd5b81602084016020830137600091810160200191909152949350505050565b600060e08301825184526020808401518186015260408401516040860152606084015160e06060870152828151808552610100880191508383019450600092505b8083101561269a5784516001600160a01b03168252938301936001929092019190830190612671565b50608086015193506126b760808801856001600160a01b03169052565b60a086015160a088015260c0860151935061205760c088018515159052565b60208152600061153a6020830184612630565b6000602082840312156126fb57600080fd5b81356001600160401b0381111561271157600080fd5b61271d848285016123bf565b949350505050565b60208152600061153a6020830184612378565b60018060a01b038416815282602082015260606040820152600061275f6060830184612630565b95945050505050565b80516122a78161244c565b6000806040838503121561278657600080fd5b82516127918161244c565b60208401519092506001600160401b038111156127ad57600080fd5b8301601f810185136127be57600080fd5b80516127cc6125f88261258a565b8181528660208385010111156127e157600080fd5b6127f2826020830160208601612348565b8093505050509250929050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b83815260406020820152600061275f6040830184866127ff565b6000808335601e1984360301811261285957600080fd5b8301803591506001600160401b0382111561287357600080fd5b6020019150600581901b3603821315611dc657600080fd5b634e487b7160e01b600052603260045260246000fd5b60006001600160401b038211156128ba576128ba61251c565b5060051b60200190565b600082601f8301126128d557600080fd5b813560206128e56125f8836128a1565b82815260059290921b8401810191818101908684111561290457600080fd5b8286015b8481101561292857803561291b81612284565b8352918301918301612908565b509695505050505050565b600060e0823603121561294557600080fd5b61294d612532565b82358152602083013560208201526040830135604082015260608301356001600160401b0381111561297e57600080fd5b61298a368286016128c4565b60608301525061299c6080840161229c565b608082015260a083013560a08201526129b760c0840161245a565b60c082015292915050565b6000602082840312156129d457600080fd5b813561153a8161244c565b634e487b7160e01b600052601160045260246000fd5b600082821015612a0757612a076129df565b500390565b6020808252600d908201526c4d50433a206f6e6c79206d706360981b604082015260600190565b60008219821115612a4657612a466129df565b500190565b80516122a781612284565b600060208284031215612a6857600080fd5b815161153a81612284565b600060208284031215612a8557600080fd5b5051919050565b6000610120808352612aa18184018a8c6127ff565b9050873560208401526020880135612ab881612284565b6001600160a01b0390811660408581019190915289013590612ad982612284565b808216606086015260608a0135608086015260808a013560a086015280891660c0860152505082810360e0840152612b128186886127ff565b91505082151561010083015298975050505050505050565b600082601f830112612b3b57600080fd5b81516020612b4b6125f8836128a1565b82815260059290921b84018101918181019086841115612b6a57600080fd5b8286015b84811015612928578051612b8181612284565b8352918301918301612b6e565b600060208284031215612ba057600080fd5b81516001600160401b0380821115612bb757600080fd5b9083019060e08286031215612bcb57600080fd5b612bd3612532565b825181526020830151602082015260408301516040820152606083015182811115612bfd57600080fd5b612c0987828601612b2a565b606083015250612c1b60808401612a4b565b608082015260a083015160a0820152612c3660c08401612768565b60c082015295945050505050565b8183526000602080850194508260005b85811015612c82578135612c6781612284565b6001600160a01b031687529582019590820190600101612c54565b509495945050505050565b6020815281356020820152602082013560408201526040820135606082015260006060830135601e19843603018112612cc557600080fd5b83016020810190356001600160401b03811115612ce157600080fd5b8060051b3603821315612cf357600080fd5b60e06080850152612d0961010085018284612c44565b915050612d186080850161229c565b6001600160a01b03811660a08501525060a084013560c0840152612d3e60c0850161245a565b80151560e0850152611b4c565b84815283602082015260018060a01b03831660408201526080606082015260006120576080830184612378565b600060018201612d8a57612d8a6129df565b5060010190565b600060208284031215612da357600080fd5b815161153a8161244c565b600081612dbd57612dbd6129df565b506000190190565b80516001600160701b03811681146122a757600080fd5b600080600060608486031215612df157600080fd5b612dfa84612dc5565b9250612e0860208501612dc5565b9150604084015163ffffffff81168114612e2157600080fd5b809150509250925092565b6020808252602a908201527f53757368697377617056324c6962726172793a20494e53554646494349454e546040820152695f4c495155494449545960b01b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b600082612ea957634e487b7160e01b600052601260045260246000fd5b500490565b60008251612ec0818460208701612348565b919091019291505056fea2646970667358221220a87aa0c23b2c117d784bd6d354dd6bb613e5160133ec5c613f14ee98de8723c764736f6c634300080e0033000000000000000000000000acff45ac056e9ab186b56725a83b3e48d7db43250000000000000000000000004518231a8fdf6ac553b9bbd51bbb86825b583263000000000000000000000000c35dadb65012ec5796536bd9864ed8773abc74c40000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf1270

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000acff45ac056e9ab186b56725a83b3e48d7db43250000000000000000000000004518231a8fdf6ac553b9bbd51bbb86825b583263000000000000000000000000c35dadb65012ec5796536bd9864ed8773abc74c40000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf1270

-----Decoded View---------------
Arg [0] : mpc_ (address): 0xacff45ac056e9ab186b56725a83b3e48d7db4325
Arg [1] : caller_ (address): 0x4518231a8fdf6ac553b9bbd51bbb86825b583263
Arg [2] : sushiV2Factory_ (address): 0xc35dadb65012ec5796536bd9864ed8773abc74c4
Arg [3] : wNATIVE_ (address): 0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000acff45ac056e9ab186b56725a83b3e48d7db4325
Arg [1] : 0000000000000000000000004518231a8fdf6ac553b9bbd51bbb86825b583263
Arg [2] : 000000000000000000000000c35dadb65012ec5796536bd9864ed8773abc74c4
Arg [3] : 0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf1270


Deployed ByteCode Sourcemap

24636:8213:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32755:10;-1:-1:-1;;;;;32769:7:0;32755:21;;32748:29;;;;:::i;:::-;24636:8213;;32611:10;-1:-1:-1;;;;;32625:7:0;32611:21;;32604:29;;;;:::i;26235:630::-;;;;;;;;;;-1:-1:-1;26235:630:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;26873:2306;;;;;;;;;;-1:-1:-1;26873:2306:0;;;;;:::i;:::-;;:::i;17856:114::-;;;;;;;;;;-1:-1:-1;17856:114:0;;;;;:::i;:::-;;:::i;15754:23::-;;;;;;;;;;;;;;;;;;;3449:25:1;;;3437:2;3422:18;15754:23:0;3303:177:1;24772:37:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3758:32:1;;;3740:51;;3728:2;3713:18;24772:37:0;3594:203:1;17738:110:0;;;;;;;;;;-1:-1:-1;17738:110:0;;;;;:::i;:::-;;:::i;16271:256::-;;;;;;;;;;-1:-1:-1;16271:256:0;;;;;:::i;:::-;;:::i;15709:38::-;;;;;;;;;;;;15741:6;15709:38;;30144:1328;;;;;;;;;;-1:-1:-1;30144:1328:0;;;;;:::i;:::-;;:::i;25940:178::-;;;;;;;;;;-1:-1:-1;25940:178:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;24816:32::-;;;;;;;;;;;;;;;16535:452;;;;;;;;;;;;;:::i;17435:47::-;;;;;;;;;;-1:-1:-1;17435:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;8252:14:1;;8245:22;8227:41;;8215:2;8200:18;17435:47:0;8087:187:1;25767:165:0;;;;;;;;;;-1:-1:-1;25767:165:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;15650:18::-;;;;;;;;;;-1:-1:-1;15650:18:0;;;;-1:-1:-1;;;;;15650:18:0;;;15675:25;;;;;;;;;;-1:-1:-1;15675:25:0;;;;-1:-1:-1;;;;;15675:25:0;;;26235:630;17546:10;26362:12;17530:27;;;:15;:27;;;;;;26376:19;;17530:27;;17522:67;;;;-1:-1:-1;;;17522:67:0;;9072:2:1;17522:67:0;;;9054:21:1;9111:2;9091:18;;;9084:30;9150:29;9130:18;;;9123:57;9197:18;;17522:67:0;;;;;;;;;26408:30:::1;26441:25;26461:4;;26441:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;26441:19:0::1;::::0;-1:-1:-1;;;26441:25:0:i:1;:::-;26481:41;::::0;-1:-1:-1;;;26481:41:0;;26408:58;;-1:-1:-1;26481:4:0::1;::::0;:13:::1;::::0;:41:::1;::::0;26495:5;;26502:6;;26408:58;;26481:41:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;26481:41:0::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;;;26477:381;;26766:20;::::0;::::1;::::0;26739:56:::1;::::0;-1:-1:-1;;;;;26739:26:0;::::1;::::0;26788:6;26739:26:::1;:56::i;:::-;26826:5;-1:-1:-1::0;;;;;26815:31:0::1;;26833:6;26841:4;;26815:31;;;;;;;;:::i;:::-;;;;;;;;26477:381;;;26634:4:::0;;-1:-1:-1;26640:3:0;-1:-1:-1;26477:381:0::1;26397:468;26235:630:::0;;;;;;;:::o;26873:2306::-;27008:12;27022:19;27062:10;27084:4;27062:27;27054:36;;;;;;27147:15;27123:11;:20;;;:39;;27101:119;;;;-1:-1:-1;;;27101:119:0;;11360:2:1;27101:119:0;;;11342:21:1;11399:2;11379:18;;;11372:30;11438:32;11418:18;;;11411:60;11488:18;;27101:119:0;11158:354:1;27101:119:0;27231:16;27250:20;;;;;;;;:::i;:::-;27231:39;-1:-1:-1;;;;;;27289:22:0;;27281:71;;;;-1:-1:-1;;;27281:71:0;;11719:2:1;27281:71:0;;;11701:21:1;11758:2;11738:18;;;11731:30;11797:34;11777:18;;;11770:62;-1:-1:-1;;;11848:18:1;;;11841:34;11892:19;;27281:71:0;11517:400:1;27281:71:0;27365:21;27389:16;;;;:11;:16;:::i;:::-;27365:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;27424:11:0;;27365:40;;-1:-1:-1;;;27439:1:0;-1:-1:-1;27424:16:0;27416:71;;;;-1:-1:-1;;;27416:71:0;;12674:2:1;27416:71:0;;;12656:21:1;12713:2;12693:18;;;12686:30;12752:34;12732:18;;;12725:62;-1:-1:-1;;;12803:18:1;;;12796:40;12853:19;;27416:71:0;12472:406:1;27416:71:0;27531:5;-1:-1:-1;;;;;27520:16:0;:4;27525:1;27520:7;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;27520:16:0;;27498:110;;;;-1:-1:-1;;;27498:110:0;;13217:2:1;27498:110:0;;;13199:21:1;13256:2;13236:18;;;13229:30;13295:34;13275:18;;;13268:62;-1:-1:-1;;;13346:18:1;;;13339:42;13398:19;;27498:110:0;13015:408:1;27498:110:0;27670:6;27643:11;:23;;;:33;;27621:127;;;;-1:-1:-1;;;27621:127:0;;13630:2:1;27621:127:0;;;13612:21:1;13669:2;13649:18;;;13642:30;13708:34;13688:18;;;13681:62;-1:-1:-1;;;13759:18:1;;;13752:42;13811:19;;27621:127:0;13428:408:1;27621:127:0;27761:19;27783:23;;;;:28;:89;;27849:11;:23;;;27783:89;;;27827:6;27783:89;27761:111;-1:-1:-1;27885:24:0;27924:21;;;:26;27920:212;;27977:50;;28002:11;27977:50;:::i;:::-;28015:11;27977:24;:50::i;:::-;27967:60;;27920:212;;;28070:50;;28095:11;28070:50;:::i;:::-;28108:11;28070:24;:50::i;:::-;28060:60;;27920:212;28144:137;28187:58;28214:12;28228:4;28233:1;28228:7;;;;;;;;:::i;:::-;;;;;;;28237:4;28242:1;28237:7;;;;;;;;:::i;:::-;;;;;;;28187:26;:58::i;:::-;28260:7;28268:1;28260:10;;;;;;;;:::i;:::-;;;;;;;28151:4;28156:1;28151:7;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;28144:28:0;;;:137;;;;;:::i;:::-;28294:17;;28355:20;;;;;;;;:::i;:::-;28351:499;;;28443:7;-1:-1:-1;;;;;28418:32:0;:4;28437:1;28423:4;:11;:15;;;;:::i;:::-;28418:21;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;28418:32:0;;28392:128;;;;-1:-1:-1;;;28392:128:0;;16342:2:1;28392:128:0;;;16324:21:1;16381:2;16361:18;;;16354:30;16420:34;16400:18;;;16393:62;-1:-1:-1;;;16471:18:1;;;16464:32;16513:19;;28392:128:0;16140:398:1;28392:128:0;28561:35;28567:7;28576:4;28590;28561:5;:35::i;:::-;28611:38;;-1:-1:-1;;;28611:38:0;;;;;3449:25:1;;;28535:61:0;;-1:-1:-1;28535:61:0;-1:-1:-1;28620:7:0;-1:-1:-1;;;;;28611:26:0;;;;3422:18:1;;28611:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28664:48;28690:8;28701:10;28664:17;:48::i;:::-;28747:1;28727:22;;28351:499;;;28808:30;28814:7;28823:4;28829:8;28808:5;:30::i;:::-;28782:56;;-1:-1:-1;28782:56:0;-1:-1:-1;28351:499:0;28886:8;-1:-1:-1;;;;;28865:42:0;28875:9;-1:-1:-1;;;;;28865:42:0;;28896:10;28865:42;;;;3449:25:1;;3437:2;3422:18;;3303:177;28865:42:0;;;;;;;;28949:1;28924:22;28935:7;28943:1;28935:10;;;;;;;;:::i;:::-;;;;;;;28924:6;:10;;:22;;;;:::i;:::-;:26;28920:191;;;28967:62;28996:8;29006:22;29017:7;29025:1;29017:10;;;;;;;;:::i;:::-;;;;;;;29006:6;:10;;:22;;;;:::i;:::-;28974:4;28979:1;28974:7;;;;;;;;:::i;28967:62::-;29066:8;-1:-1:-1;;;;;29049:50:0;29059:5;-1:-1:-1;;;;;29049:50:0;;29076:22;29087:7;29095:1;29087:10;;;;;;;;:::i;:::-;;;;;;;29076:6;:10;;:22;;;;:::i;:::-;29049:50;;3449:25:1;;;3437:2;3422:18;29049:50:0;;;;;;;28920:191;29137:33;;;-1:-1:-1;;;;;16735:32:1;;29137:33:0;;;16717:51:1;16784:18;;;16777:34;;;29131:4:0;;16690:18:1;;29137:33:0;;;;;;;;;;;;29123:48;;;;;;;;;;26873:2306;;;;;;:::o;17856:114::-;15838:3;;-1:-1:-1;;;;;15838:3:0;15824:10;:17;15816:43;;;;-1:-1:-1;;;15816:43:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;17931:23:0::1;17957:5;17931:23:::0;;;:15:::1;:23;::::0;;;;:31;;-1:-1:-1;;17931:31:0::1;::::0;;17856:114::o;17738:110::-;15838:3;;-1:-1:-1;;;;;15838:3:0;15824:10;:17;15816:43;;;;-1:-1:-1;;;15816:43:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;17810:23:0::1;;::::0;;;:15:::1;:23;::::0;;;;:30;;-1:-1:-1;;17810:30:0::1;17836:4;17810:30;::::0;;17738:110::o;16271:256::-;15838:3;;-1:-1:-1;;;;;15838:3:0;15824:10;:17;15816:43;;;;-1:-1:-1;;;15816:43:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;16340:18:0;::::1;16332:59;;;::::0;-1:-1:-1;;;16332:59:0;;17366:2:1;16332:59:0::1;::::0;::::1;17348:21:1::0;17405:2;17385:18;;;17378:30;17444;17424:18;;;17417:58;17492:18;;16332:59:0::1;17164:352:1::0;16332:59:0::1;16402:10;:17:::0;;-1:-1:-1;;;;;;16402:17:0::1;-1:-1:-1::0;;;;;16402:17:0;::::1;;::::0;;16441:23:::1;15741:6;16441:15;:23;:::i;:::-;16430:8;:34:::0;;;16498:10:::1;::::0;::::1;16493:3:::0;16480:39:::1;::::0;3449:25:1;;;-1:-1:-1;;;;;16498:10:0;;::::1;::::0;16493:3;::::1;::::0;16480:39:::1;::::0;3437:2:1;3422:18;16480:39:0::1;;;;;;;16271:256:::0;:::o;30144:1328::-;-1:-1:-1;;;;;30356:23:0;;;;;;:15;:23;;;;;;;;30348:54;;;;-1:-1:-1;;;30348:54:0;;17856:2:1;30348:54:0;;;17838:21:1;17895:2;17875:18;;;17868:30;-1:-1:-1;;;17914:18:1;;;17907:48;17972:18;;30348:54:0;17654:342:1;30348:54:0;30413:30;30446:25;30466:4;;30446:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30446:19:0;;-1:-1:-1;;;30446:25:0:i;:::-;30413:58;;30504:11;:20;;;-1:-1:-1;;;;;30490:34:0;:10;-1:-1:-1;;;;;30490:34:0;;30482:64;;;;-1:-1:-1;;;30482:64:0;;18203:2:1;30482:64:0;;;18185:21:1;18242:2;18222:18;;;18215:30;-1:-1:-1;;;18261:18:1;;;18254:47;18318:18;;30482:64:0;18001:341:1;30482:64:0;30559:19;30593:14;;;;;;;;:::i;:::-;-1:-1:-1;;;;;30581:38:0;;:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30559:62;-1:-1:-1;;;;;;30640:25:0;;30632:53;;;;-1:-1:-1;;;30632:53:0;;18948:2:1;30632:53:0;;;18930:21:1;18987:2;18967:18;;;18960:30;-1:-1:-1;;;19006:18:1;;;18999:45;19061:18;;30632:53:0;18746:339:1;30632:53:0;30718:44;;-1:-1:-1;;;30718:44:0;;30756:4;30718:44;;;3740:51:1;30696:19:0;;-1:-1:-1;;;;;30718:29:0;;;;;3713:18:1;;30718:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30775:171;;-1:-1:-1;;;30775:171:0;;30696:66;;-1:-1:-1;;;;;;30775:46:0;;;;;:171;;30836:6;;;;30857:8;;30888:4;;30908;;;;30927:8;;30775:171;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30961:8;30957:508;;;31072:44;;-1:-1:-1;;;31072:44:0;;31110:4;31072:44;;;3740:51:1;31050:19:0;;-1:-1:-1;;;;;31072:29:0;;;;;3713:18:1;;31072:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31050:66;;31172:11;31157;:26;;:95;;;;-1:-1:-1;31223:29:0;31237:15;;;;31223:11;:29;:::i;:::-;31208:11;:44;;31157:95;31131:177;;;;-1:-1:-1;;;31131:177:0;;20705:2:1;31131:177:0;;;20687:21:1;20744:2;20724:18;;;20717:30;-1:-1:-1;;;20763:18:1;;;20756:50;20823:18;;31131:177:0;20503:344:1;31131:177:0;31374:20;;;;31323:130;;31413:25;31427:11;31413;:25;:::i;:::-;-1:-1:-1;;;;;31323:32:0;;;:130;:32;:130::i;:::-;30971:494;30957:508;30337:1135;;;30144:1328;;;;;;;:::o;25940:178::-;26036:18;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26036:18:0;26090:4;26079:31;;;;;;;;;;;;:::i;:::-;26072:38;25940:178;-1:-1:-1;;25940:178:0:o;16535:452::-;16611:10;;-1:-1:-1;;;;;16611:10:0;16597;:24;;:96;;-1:-1:-1;16653:3:0;;-1:-1:-1;;;;;16653:3:0;16639:10;:17;:53;;;;-1:-1:-1;16668:10:0;;-1:-1:-1;;;;;16668:10:0;4527:19;:23;;16660:32;16575:167;;;;-1:-1:-1;;;16575:167:0;;22787:2:1;16575:167:0;;;22769:21:1;22826:2;22806:18;;;22799:30;-1:-1:-1;;;22845:18:1;;;22838:51;22906:18;;16575:167:0;22585:345:1;16575:167:0;16772:1;16761:8;;:12;:43;;;;;16796:8;;16777:15;:27;;16761:43;16753:81;;;;-1:-1:-1;;;16753:81:0;;23137:2:1;16753:81:0;;;23119:21:1;23176:2;23156:18;;;23149:30;23215:27;23195:18;;;23188:55;23260:18;;16753:81:0;22935:349:1;16753:81:0;16867:10;;;16862:3;16850:45;;16879:15;3449:25:1;;-1:-1:-1;;;;;16867:10:0;;;;16862:3;;;;16850:45;;3437:2:1;3422:18;16850:45:0;;;;;;;16912:10;;;;16906:16;;-1:-1:-1;;;;;;16906:16:0;;;-1:-1:-1;;;;;16912:10:0;;16906:16;;;16933:23;;;;;;16967:8;:12;16535:452::o;25767:165::-;25871:12;25919:4;25908:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;25901:23;;25767:165;;;:::o;12203:211::-;12347:58;;;-1:-1:-1;;;;;16735:32:1;;12347:58:0;;;16717:51:1;16784:18;;;;16777:34;;;12347:58:0;;;;;;;;;;16690:18:1;;;;12347:58:0;;;;;;;;-1:-1:-1;;;;;12347:58:0;-1:-1:-1;;;12347:58:0;;;12320:86;;12340:5;;12320:19;:86::i;:::-;12203:211;;;:::o;29652:484::-;29787:24;29834:127;29881:12;29908:11;29934;:16;;;29834:32;:127::i;:::-;29824:137;;30027:11;:24;;;29996:7;30021:1;30004:7;:14;:18;;;;:::i;:::-;29996:27;;;;;;;;:::i;:::-;;;;;;;:55;;29974:154;;;;-1:-1:-1;;;29974:154:0;;25331:2:1;29974:154:0;;;25313:21:1;25370:2;25350:18;;;25343:30;25409:34;25389:18;;;25382:62;-1:-1:-1;;;25460:18:1;;;25453:47;25517:19;;29974:154:0;25129:413:1;29187:457:0;29322:24;29369:136;29415:12;29442:11;:21;;;29478:11;:16;;;29369:31;:136::i;:::-;29359:146;;29552:11;29538:7;29546:1;29538:10;;;;;;;;:::i;:::-;;;;;;;:25;;29516:120;;;;-1:-1:-1;;;29516:120:0;;25749:2:1;29516:120:0;;;25731:21:1;25788:2;25768:18;;;25761:30;25827:34;25807:18;;;25800:62;-1:-1:-1;;;25878:18:1;;;25871:43;25931:19;;29516:120:0;25547:409:1;20961:215:0;21116:52;;-1:-1:-1;;;21116:52:0;;-1:-1:-1;;;;;26191:15:1;;;21116:52:0;;;26173:34:1;26243:15;;;26223:18;;;26216:43;21084:12:0;;21116:36;;;;;;26108:18:1;;21116:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21109:59;;20961:215;;;;;;:::o;31583:974::-;31720:7;31729;31754:9;31749:731;31783:1;31769:4;:11;:15;;;;:::i;:::-;31765:1;:19;31749:731;;;31807:13;31822:14;31841:4;31846:1;31841:7;;;;;;;;:::i;:::-;;;;;;;31850:4;31855:1;31859;31855:5;;;;:::i;:::-;31850:11;;;;;;;;:::i;:::-;;;;;;;31806:56;;;;31878:14;31898:44;31928:5;31935:6;31898:29;:44::i;:::-;-1:-1:-1;31877:65:0;-1:-1:-1;31957:17:0;31977:7;31985:5;:1;31989;31985:5;:::i;:::-;31977:14;;;;;;;;:::i;:::-;;;;;;;31957:34;;32007:18;32027;32058:6;-1:-1:-1;;;;;32049:15:0;:5;-1:-1:-1;;;;;32049:15:0;;:101;;32128:9;32147:1;32049:101;;;32093:1;32097:9;32049:101;32006:144;;;;32165:10;32196:1;32182:4;:11;:15;;;;:::i;:::-;32178:1;:19;:123;;32298:3;32178:123;;;32217:61;32244:12;32258:6;32266:4;32271:5;:1;32275;32271:5;:::i;:::-;32266:11;;;;;;;;:::i;32217:61::-;32165:136;;32351:55;32378:12;32392:5;32399:6;32351:26;:55::i;:::-;-1:-1:-1;;;;;32316:110:0;;32427:10;32439;32451:2;32465:1;32455:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32455:12:0;;32316:152;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31791:689;;;;;;;31786:3;;;;;:::i;:::-;;;;31749:731;;;;32498:4;32517:1;32503:4;:11;:15;;;;:::i;:::-;32498:21;;;;;;;;:::i;:::-;;;;;;;32521:7;32546:1;32529:7;:14;:18;;;;:::i;:::-;32521:27;;;;;;;;:::i;:::-;;;;;;;32490:59;;;;31583:974;;;;;;:::o;5493:317::-;5608:6;5583:21;:31;;5575:73;;;;-1:-1:-1;;;5575:73:0;;27075:2:1;5575:73:0;;;27057:21:1;27114:2;27094:18;;;27087:30;27153:31;27133:18;;;27126:59;27202:18;;5575:73:0;26873:353:1;5575:73:0;5662:12;5680:9;-1:-1:-1;;;;;5680:14:0;5702:6;5680:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5661:52;;;5732:7;5724:78;;;;-1:-1:-1;;;5724:78:0;;27643:2:1;5724:78:0;;;27625:21:1;27682:2;27662:18;;;27655:30;27721:34;27701:18;;;27694:62;27792:28;27772:18;;;27765:56;27838:19;;5724:78:0;27441:422:1;19372:174:0;19490:5;;;19485:16;;;;19477:50;;;;-1:-1:-1;;;19477:50:0;;28070:2:1;19477:50:0;;;28052:21:1;28109:2;28089:18;;;28082:30;-1:-1:-1;;;28128:18:1;;;28121:51;28189:18;;19477:50:0;27868:345:1;14776:716:0;15200:23;15226:69;15254:4;15226:69;;;;;;;;;;;;;;;;;15234:5;-1:-1:-1;;;;;15226:27:0;;;:69;;;;;:::i;:::-;15310:17;;15200:95;;-1:-1:-1;15310:21:0;15306:179;;15407:10;15396:30;;;;;;;;;;;;:::i;:::-;15388:85;;;;-1:-1:-1;;;15388:85:0;;28670:2:1;15388:85:0;;;28652:21:1;28709:2;28689:18;;;28682:30;28748:34;28728:18;;;28721:62;-1:-1:-1;;;28799:18:1;;;28792:40;28849:19;;15388:85:0;28468:406:1;23265:631:0;23403:24;23463:1;23448:4;:11;:16;;23440:61;;;;-1:-1:-1;;;23440:61:0;;29081:2:1;23440:61:0;;;29063:21:1;;;29100:18;;;29093:30;29159:34;29139:18;;;29132:62;29211:18;;23440:61:0;28879:356:1;23440:61:0;23536:4;:11;-1:-1:-1;;;;;23522:26:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23522:26:0;;23512:36;;23572:8;23559:7;23567:1;23559:10;;;;;;;;:::i;:::-;;;;;;:21;;;;;23596:9;23591:298;23625:1;23611:4;:11;:15;;;;:::i;:::-;23607:1;:19;23591:298;;;23649:17;23668:18;23690:108;23720:7;23746:4;23751:1;23746:7;;;;;;;;:::i;:::-;;;;;;;23772:4;23777:1;23781;23777:5;;;;:::i;:::-;23772:11;;;;;;;;:::i;:::-;;;;;;;23690;:108::i;:::-;23648:150;;;;23830:47;23843:7;23851:1;23843:10;;;;;;;;:::i;:::-;;;;;;;23855:9;23866:10;23830:12;:47::i;:::-;23813:7;23821:5;:1;23825;23821:5;:::i;:::-;23813:14;;;;;;;;:::i;:::-;;;;;;:64;;;;;23633:256;;23628:3;;;;;:::i;:::-;;;;23591:298;;;;23265:631;;;;;:::o;23977:652::-;24115:24;24175:1;24160:4;:11;:16;;24152:61;;;;-1:-1:-1;;;24152:61:0;;29081:2:1;24152:61:0;;;29063:21:1;;;29100:18;;;29093:30;29159:34;29139:18;;;29132:62;29211:18;;24152:61:0;28879:356:1;24152:61:0;24248:4;:11;-1:-1:-1;;;;;24234:26:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24234:26:0;;24224:36;;24301:9;24271:7;24296:1;24279:7;:14;:18;;;;:::i;:::-;24271:27;;;;;;;;:::i;:::-;;;;;;:39;;;;;24326:9;24352:1;24338:4;:11;:15;;;;:::i;:::-;24326:27;;24321:301;24355:5;;24321:301;;24383:17;;24424:108;24454:7;24480:4;24485:5;24489:1;24485;:5;:::i;:::-;24480:11;;;;;;;;:::i;:::-;;;;;;;24510:4;24515:1;24510:7;;;;;;;;:::i;24424:108::-;24382:150;;;;24564:46;24576:7;24584:1;24576:10;;;;;;;;:::i;:::-;;;;;;;24588:9;24599:10;24564:11;:46::i;:::-;24547:7;24555:5;24559:1;24555;:5;:::i;:::-;24547:14;;;;;;;;:::i;:::-;;;;;;:63;;;;;24367:255;;24362:3;;;;;:::i;:::-;;;;24321:301;;20458:411;20560:14;20576;20626:6;-1:-1:-1;;;;;20616:16:0;:6;-1:-1:-1;;;;;20616:16:0;;20608:68;;;;-1:-1:-1;;;20608:68:0;;29583:2:1;20608:68:0;;;29565:21:1;29622:2;29602:18;;;29595:30;29661:34;29641:18;;;29634:62;-1:-1:-1;;;29712:18:1;;;29705:37;29759:19;;20608:68:0;29381:403:1;20608:68:0;20715:6;-1:-1:-1;;;;;20706:15:0;:6;-1:-1:-1;;;;;20706:15:0;;:79;;20770:6;20778;20706:79;;;20738:6;20746;20706:79;20687:98;;-1:-1:-1;20687:98:0;-1:-1:-1;;;;;;20804:20:0;;20796:65;;;;-1:-1:-1;;;20796:65:0;;29991:2:1;20796:65:0;;;29973:21:1;;;30010:18;;;30003:30;30069:34;30049:18;;;30042:62;30121:18;;20796:65:0;29789:356:1;20796:65:0;20458:411;;;;;:::o;6977:229::-;7114:12;7146:52;7168:6;7176:4;7182:1;7185:12;7146:21;:52::i;21234:491::-;21361:16;21379;21409:14;21429:26;21440:6;21448;21429:10;:26::i;:::-;21408:47;;;21467:16;21485;21538:32;21546:7;21555:6;21563;21538:7;:32::i;:::-;-1:-1:-1;;;;;21507:86:0;;:88;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21466:129;-1:-1:-1;;;;;21466:129:0;;;-1:-1:-1;;;;;21466:129:0;;;21639:6;-1:-1:-1;;;;;21629:16:0;:6;-1:-1:-1;;;;;21629:16:0;;:88;;21698:8;21708;21629:88;;;21662:8;21672;21629:88;21606:111;;;;-1:-1:-1;21234:491:0;-1:-1:-1;;;;;;;21234:491:0:o;21847:613::-;21983:17;22032:1;22021:8;:12;22013:70;;;;-1:-1:-1;;;22013:70:0;;31000:2:1;22013:70:0;;;30982:21:1;31039:2;31019:18;;;31012:30;31078:34;31058:18;;;31051:62;-1:-1:-1;;;31129:18:1;;;31122:43;31182:19;;22013:70:0;30798:409:1;22013:70:0;22128:1;22116:9;:13;:31;;;;;22146:1;22133:10;:14;22116:31;22094:123;;;;-1:-1:-1;;;22094:123:0;;;;;;;:::i;:::-;22228:23;22254:17;:8;22267:3;22254:12;:17::i;:::-;22228:43;-1:-1:-1;22282:17:0;22302:31;22228:43;22322:10;22302:19;:31::i;:::-;22282:51;-1:-1:-1;22344:19:0;22366:40;22390:15;22366:19;:9;22380:4;22366:13;:19::i;:::-;:23;;:40::i;:::-;22344:62;-1:-1:-1;22429:23:0;22344:62;22429:9;:23;:::i;:::-;22417:35;21847:613;-1:-1:-1;;;;;;;21847:613:0:o;22581:602::-;22717:16;22780:1;22768:9;:13;22746:109;;;;-1:-1:-1;;;22746:109:0;;32179:2:1;22746:109:0;;;32161:21:1;32218:2;32198:18;;;32191:30;32257:34;32237:18;;;32230:62;-1:-1:-1;;;32308:18:1;;;32301:44;32362:19;;22746:109:0;31977:410:1;22746:109:0;22900:1;22888:9;:13;:31;;;;;22918:1;22905:10;:14;22888:31;22866:123;;;;-1:-1:-1;;;22866:123:0;;;;;;;:::i;:::-;23000:17;23020:34;23049:4;23020:24;:9;23034;23020:13;:24::i;:::-;:28;;:34::i;:::-;23000:54;-1:-1:-1;23065:19:0;23087:34;23117:3;23087:25;:10;23102:9;23087:14;:25::i;:34::-;23065:56;-1:-1:-1;23143:32:0;23173:1;23144:23;23065:56;23144:9;:23;:::i;23143:32::-;23132:43;22581:602;-1:-1:-1;;;;;;22581:602:0:o;8097:510::-;8267:12;8325:5;8300:21;:30;;8292:81;;;;-1:-1:-1;;;8292:81:0;;32594:2:1;8292:81:0;;;32576:21:1;32633:2;32613:18;;;32606:30;32672:34;32652:18;;;32645:62;-1:-1:-1;;;32723:18:1;;;32716:36;32769:19;;8292:81:0;32392:402:1;8292:81:0;-1:-1:-1;;;;;4527:19:0;;;8384:60;;;;-1:-1:-1;;;8384:60:0;;33001:2:1;8384:60:0;;;32983:21:1;33040:2;33020:18;;;33013:30;33079:31;33059:18;;;33052:59;33128:18;;8384:60:0;32799:353:1;8384:60:0;8458:12;8472:23;8499:6;-1:-1:-1;;;;;8499:11:0;8518:5;8525:4;8499:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8457:73;;;;8548:51;8565:7;8574:10;8586:12;8548:16;:51::i;19554:187::-;19612:9;19667:6;;;:30;;-1:-1:-1;;19682:5:0;;;19696:1;19691;19682:5;19691:1;19677:15;;;;:::i;:::-;;:20;19667:30;19659:63;;;;-1:-1:-1;;;19659:63:0;;33638:2:1;19659:63:0;;;33620:21:1;33677:2;33657:18;;;33650:30;-1:-1:-1;;;33696:18:1;;;33689:50;33756:18;;19659:63:0;33436:344:1;19191:173:0;19309:5;;;19304:16;;;;19296:49;;;;-1:-1:-1;;;19296:49:0;;33987:2:1;19296:49:0;;;33969:21:1;34026:2;34006:18;;;33999:30;-1:-1:-1;;;34045:18:1;;;34038:50;34105:18;;19296:49:0;33785:344:1;10783:712:0;10933:12;10962:7;10958:530;;;-1:-1:-1;10993:10:0;10986:17;;10958:530;11107:17;;:21;11103:374;;11305:10;11299:17;11366:15;11353:10;11349:2;11345:19;11338:44;11103:374;11448:12;11441:20;;-1:-1:-1;;;11441:20:0;;;;;;;;:::i;14:127:1:-;75:10;70:3;66:20;63:1;56:31;106:4;103:1;96:15;130:4;127:1;120:15;146:131;-1:-1:-1;;;;;221:31:1;;211:42;;201:70;;267:1;264;257:12;201:70;146:131;:::o;282:134::-;350:20;;379:31;350:20;379:31;:::i;:::-;282:134;;;:::o;421:347::-;472:8;482:6;536:3;529:4;521:6;517:17;513:27;503:55;;554:1;551;544:12;503:55;-1:-1:-1;577:20:1;;-1:-1:-1;;;;;609:30:1;;606:50;;;652:1;649;642:12;606:50;689:4;681:6;677:17;665:29;;741:3;734:4;725:6;717;713:19;709:30;706:39;703:59;;;758:1;755;748:12;773:612;861:6;869;877;885;938:2;926:9;917:7;913:23;909:32;906:52;;;954:1;951;944:12;906:52;993:9;980:23;1012:31;1037:5;1012:31;:::i;:::-;1062:5;-1:-1:-1;1114:2:1;1099:18;;1086:32;;-1:-1:-1;1169:2:1;1154:18;;1141:32;-1:-1:-1;;;;;1185:30:1;;1182:50;;;1228:1;1225;1218:12;1182:50;1267:58;1317:7;1308:6;1297:9;1293:22;1267:58;:::i;:::-;773:612;;;;-1:-1:-1;1344:8:1;-1:-1:-1;;;;773:612:1:o;1486:258::-;1558:1;1568:113;1582:6;1579:1;1576:13;1568:113;;;1658:11;;;1652:18;1639:11;;;1632:39;1604:2;1597:10;1568:113;;;1699:6;1696:1;1693:13;1690:48;;;1734:1;1725:6;1720:3;1716:16;1709:27;1690:48;;1486:258;;;:::o;1749:257::-;1790:3;1828:5;1822:12;1855:6;1850:3;1843:19;1871:63;1927:6;1920:4;1915:3;1911:14;1904:4;1897:5;1893:16;1871:63;:::i;:::-;1988:2;1967:15;-1:-1:-1;;1963:29:1;1954:39;;;;1995:4;1950:50;;1749:257;-1:-1:-1;;1749:257:1:o;2011:298::-;2194:6;2187:14;2180:22;2169:9;2162:41;2239:2;2234;2223:9;2219:18;2212:30;2143:4;2259:44;2299:2;2288:9;2284:18;2276:6;2259:44;:::i;2314:160::-;2378:5;2423:3;2414:6;2409:3;2405:16;2401:26;2398:46;;;2440:1;2437;2430:12;2398:46;-1:-1:-1;2462:6:1;2314:160;-1:-1:-1;2314:160:1:o;2479:567::-;2587:6;2595;2603;2656:2;2644:9;2635:7;2631:23;2627:32;2624:52;;;2672:1;2669;2662:12;2624:52;2711:9;2698:23;2730:31;2755:5;2730:31;:::i;:::-;2780:5;-1:-1:-1;2832:2:1;2817:18;;2804:32;;-1:-1:-1;2887:2:1;2872:18;;2859:32;-1:-1:-1;;;;;2903:30:1;;2900:50;;;2946:1;2943;2936:12;2900:50;2969:71;3032:7;3023:6;3012:9;3008:22;2969:71;:::i;:::-;2959:81;;;2479:567;;;;;:::o;3051:247::-;3110:6;3163:2;3151:9;3142:7;3138:23;3134:32;3131:52;;;3179:1;3176;3169:12;3131:52;3218:9;3205:23;3237:31;3262:5;3237:31;:::i;3802:118::-;3888:5;3881:13;3874:21;3867:5;3864:32;3854:60;;3910:1;3907;3900:12;3925:128;3990:20;;4019:28;3990:20;4019:28;:::i;4058:1148::-;4200:6;4208;4216;4224;4232;4240;4248;4292:9;4283:7;4279:23;4322:3;4318:2;4314:12;4311:32;;;4339:1;4336;4329:12;4311:32;4378:9;4365:23;4397:31;4422:5;4397:31;:::i;:::-;4447:5;-1:-1:-1;4503:2:1;4488:18;;4475:32;-1:-1:-1;;;;;4556:14:1;;;4553:34;;;4583:1;4580;4573:12;4553:34;4622:58;4672:7;4663:6;4652:9;4648:22;4622:58;:::i;:::-;4699:8;;-1:-1:-1;4596:84:1;-1:-1:-1;4596:84:1;;-1:-1:-1;4768:3:1;-1:-1:-1;;4750:16:1;;4746:26;4743:46;;;4785:1;4782;4775:12;4743:46;4823:2;4812:9;4808:18;4798:28;;4879:3;4868:9;4864:19;4851:33;4835:49;;4909:2;4899:8;4896:16;4893:36;;;4925:1;4922;4915:12;4893:36;;;4964:60;5016:7;5005:8;4994:9;4990:24;4964:60;:::i;:::-;5043:8;;-1:-1:-1;4938:86:1;-1:-1:-1;;5130:3:1;5115:19;;5102:33;5144:30;5102:33;5144:30;:::i;:::-;5193:7;5183:17;;;4058:1148;;;;;;;;;;:::o;5211:127::-;5272:10;5267:3;5263:20;5260:1;5253:31;5303:4;5300:1;5293:15;5327:4;5324:1;5317:15;5343:253;5415:2;5409:9;5457:4;5445:17;;-1:-1:-1;;;;;5477:34:1;;5513:22;;;5474:62;5471:88;;;5539:18;;:::i;:::-;5575:2;5568:22;5343:253;:::o;5601:275::-;5672:2;5666:9;5737:2;5718:13;;-1:-1:-1;;5714:27:1;5702:40;;-1:-1:-1;;;;;5757:34:1;;5793:22;;;5754:62;5751:88;;;5819:18;;:::i;:::-;5855:2;5848:22;5601:275;;-1:-1:-1;5601:275:1:o;5881:186::-;5929:4;-1:-1:-1;;;;;5954:6:1;5951:30;5948:56;;;5984:18;;:::i;:::-;-1:-1:-1;6050:2:1;6029:15;-1:-1:-1;;6025:29:1;6056:4;6021:40;;5881:186::o;6072:671::-;6140:6;6193:2;6181:9;6172:7;6168:23;6164:32;6161:52;;;6209:1;6206;6199:12;6161:52;6249:9;6236:23;-1:-1:-1;;;;;6274:6:1;6271:30;6268:50;;;6314:1;6311;6304:12;6268:50;6337:22;;6390:4;6382:13;;6378:27;-1:-1:-1;6368:55:1;;6419:1;6416;6409:12;6368:55;6455:2;6442:16;6480:48;6496:31;6524:2;6496:31;:::i;:::-;6480:48;:::i;:::-;6551:2;6544:5;6537:17;6591:7;6586:2;6581;6577;6573:11;6569:20;6566:33;6563:53;;;6612:1;6609;6602:12;6563:53;6667:2;6662;6658;6654:11;6649:2;6642:5;6638:14;6625:45;6711:1;6690:14;;;6706:2;6686:23;6679:34;;;;6694:5;6072:671;-1:-1:-1;;;;6072:671:1:o;6748:1059::-;6802:3;6841:4;6836:3;6832:14;6873:5;6867:12;6862:3;6855:25;6899:4;6950:2;6943:5;6939:14;6933:21;6928:2;6923:3;6919:12;6912:43;7004:4;6997:5;6993:16;6987:23;6980:4;6975:3;6971:14;6964:47;7057:4;7050:5;7046:16;7040:23;7095:4;7088;7083:3;7079:14;7072:28;7122:4;7155:12;7149:19;7190:6;7184:4;7177:20;7224:3;7219;7215:13;7206:22;;7269:2;7255:12;7251:21;7237:35;;7290:1;7281:10;;7300:201;7314:6;7311:1;7308:13;7300:201;;;7381:13;;-1:-1:-1;;;;;7377:39:1;7363:54;;7476:15;;;;7413:1;7329:9;;;;;7439:14;;;;7300:201;;;7304:3;7549:4;7542:5;7538:16;7532:23;7510:45;;7564:50;7608:4;7603:3;7599:14;7583;-1:-1:-1;;;;;3551:31:1;3539:44;;3485:104;7564:50;7663:4;7656:5;7652:16;7646:23;7639:4;7634:3;7630:14;7623:47;7718:4;7711:5;7707:16;7701:23;7679:45;;7733:47;7774:4;7769:3;7765:14;7749;1460:13;1453:21;1441:34;;1390:91;7812:270;7999:2;7988:9;7981:21;7962:4;8019:57;8072:2;8061:9;8057:18;8049:6;8019:57;:::i;8279:364::-;8369:6;8422:2;8410:9;8401:7;8397:23;8393:32;8390:52;;;8438:1;8435;8428:12;8390:52;8478:9;8465:23;-1:-1:-1;;;;;8503:6:1;8500:30;8497:50;;;8543:1;8540;8533:12;8497:50;8566:71;8629:7;8620:6;8609:9;8605:22;8566:71;:::i;:::-;8556:81;8279:364;-1:-1:-1;;;;8279:364:1:o;8648:217::-;8795:2;8784:9;8777:21;8758:4;8815:44;8855:2;8844:9;8840:18;8832:6;8815:44;:::i;9226:438::-;9498:1;9494;9489:3;9485:11;9481:19;9473:6;9469:32;9458:9;9451:51;9538:6;9533:2;9522:9;9518:18;9511:34;9581:2;9576;9565:9;9561:18;9554:30;9432:4;9601:57;9654:2;9643:9;9639:18;9631:6;9601:57;:::i;:::-;9593:65;9226:438;-1:-1:-1;;;;;9226:438:1:o;9669:132::-;9745:13;;9767:28;9745:13;9767:28;:::i;9806:756::-;9891:6;9899;9952:2;9940:9;9931:7;9927:23;9923:32;9920:52;;;9968:1;9965;9958:12;9920:52;10000:9;9994:16;10019:28;10041:5;10019:28;:::i;:::-;10115:2;10100:18;;10094:25;10066:5;;-1:-1:-1;;;;;;10131:30:1;;10128:50;;;10174:1;10171;10164:12;10128:50;10197:22;;10250:4;10242:13;;10238:27;-1:-1:-1;10228:55:1;;10279:1;10276;10269:12;10228:55;10308:2;10302:9;10333:48;10349:31;10377:2;10349:31;:::i;10333:48::-;10404:2;10397:5;10390:17;10444:7;10439:2;10434;10430;10426:11;10422:20;10419:33;10416:53;;;10465:1;10462;10455:12;10416:53;10478:54;10529:2;10524;10517:5;10513:14;10508:2;10504;10500:11;10478:54;:::i;:::-;10551:5;10541:15;;;;;9806:756;;;;;:::o;10567:266::-;10655:6;10650:3;10643:19;10707:6;10700:5;10693:4;10688:3;10684:14;10671:43;-1:-1:-1;10759:1:1;10734:16;;;10752:4;10730:27;;;10723:38;;;;10815:2;10794:15;;;-1:-1:-1;;10790:29:1;10781:39;;;10777:50;;10567:266::o;10838:315::-;11023:6;11012:9;11005:25;11066:2;11061;11050:9;11046:18;11039:30;10986:4;11086:61;11143:2;11132:9;11128:18;11120:6;11112;11086:61;:::i;11922:545::-;12015:4;12021:6;12081:11;12068:25;12175:2;12171:7;12160:8;12144:14;12140:29;12136:43;12116:18;12112:68;12102:96;;12194:1;12191;12184:12;12102:96;12221:33;;12273:20;;;-1:-1:-1;;;;;;12305:30:1;;12302:50;;;12348:1;12345;12338:12;12302:50;12381:4;12369:17;;-1:-1:-1;12432:1:1;12428:14;;;12412;12408:35;12398:46;;12395:66;;;12457:1;12454;12447:12;12883:127;12944:10;12939:3;12935:20;12932:1;12925:31;12975:4;12972:1;12965:15;12999:4;12996:1;12989:15;13841:183;13901:4;-1:-1:-1;;;;;13926:6:1;13923:30;13920:56;;;13956:18;;:::i;:::-;-1:-1:-1;14001:1:1;13997:14;14013:4;13993:25;;13841:183::o;14029:737::-;14083:5;14136:3;14129:4;14121:6;14117:17;14113:27;14103:55;;14154:1;14151;14144:12;14103:55;14190:6;14177:20;14216:4;14240:60;14256:43;14296:2;14256:43;:::i;14240:60::-;14334:15;;;14420:1;14416:10;;;;14404:23;;14400:32;;;14365:12;;;;14444:15;;;14441:35;;;14472:1;14469;14462:12;14441:35;14508:2;14500:6;14496:15;14520:217;14536:6;14531:3;14528:15;14520:217;;;14616:3;14603:17;14633:31;14658:5;14633:31;:::i;:::-;14677:18;;14715:12;;;;14553;;14520:217;;;-1:-1:-1;14755:5:1;14029:737;-1:-1:-1;;;;;;14029:737:1:o;14771:856::-;14881:9;14940:4;14932:5;14916:14;14912:26;14908:37;14905:57;;;14958:1;14955;14948:12;14905:57;14986:22;;:::i;:::-;15046:5;15033:19;15024:7;15017:36;15111:2;15104:5;15100:14;15087:28;15082:2;15073:7;15069:16;15062:54;15174:2;15167:5;15163:14;15150:28;15145:2;15136:7;15132:16;15125:54;15226:2;15219:5;15215:14;15202:28;-1:-1:-1;;;;;15245:6:1;15242:30;15239:50;;;15285:1;15282;15275:12;15239:50;15323:64;15372:14;15363:6;15356:5;15352:18;15323:64;:::i;:::-;15318:2;15309:7;15305:16;15298:90;;15423:35;15453:3;15446:5;15442:15;15423:35;:::i;:::-;15417:3;15408:7;15404:17;15397:62;15518:3;15511:5;15507:15;15494:29;15488:3;15479:7;15475:17;15468:56;15559:32;15586:3;15579:5;15575:15;15559:32;:::i;:::-;15553:3;15540:17;;15533:59;15544:7;14771:856;-1:-1:-1;;14771:856:1:o;15632:241::-;15688:6;15741:2;15729:9;15720:7;15716:23;15712:32;15709:52;;;15757:1;15754;15747:12;15709:52;15796:9;15783:23;15815:28;15837:5;15815:28;:::i;15878:127::-;15939:10;15934:3;15930:20;15927:1;15920:31;15970:4;15967:1;15960:15;15994:4;15991:1;15984:15;16010:125;16050:4;16078:1;16075;16072:8;16069:34;;;16083:18;;:::i;:::-;-1:-1:-1;16120:9:1;;16010:125::o;16822:337::-;17024:2;17006:21;;;17063:2;17043:18;;;17036:30;-1:-1:-1;;;17097:2:1;17082:18;;17075:43;17150:2;17135:18;;16822:337::o;17521:128::-;17561:3;17592:1;17588:6;17585:1;17582:13;17579:39;;;17598:18;;:::i;:::-;-1:-1:-1;17634:9:1;;17521:128::o;18347:138::-;18426:13;;18448:31;18426:13;18448:31;:::i;18490:251::-;18560:6;18613:2;18601:9;18592:7;18588:23;18584:32;18581:52;;;18629:1;18626;18619:12;18581:52;18661:9;18655:16;18680:31;18705:5;18680:31;:::i;19090:184::-;19160:6;19213:2;19201:9;19192:7;19188:23;19184:32;19181:52;;;19229:1;19226;19219:12;19181:52;-1:-1:-1;19252:16:1;;19090:184;-1:-1:-1;19090:184:1:o;19279:1219::-;19587:4;19616:3;19646:2;19635:9;19628:21;19672:61;19729:2;19718:9;19714:18;19706:6;19698;19672:61;:::i;:::-;19658:75;;19782:6;19769:20;19764:2;19753:9;19749:18;19742:48;19837:2;19829:6;19825:15;19812:29;19850:31;19875:5;19850:31;:::i;:::-;-1:-1:-1;;;;;19955:14:1;;;19950:2;19935:18;;;19928:42;;;;20007:15;;19994:29;;20032:33;19994:29;20032:33;:::i;:::-;20114:2;20105:7;20101:16;20096:2;20085:9;20081:18;20074:44;20180:2;20172:6;20168:15;20155:29;20149:3;20138:9;20134:19;20127:58;20247:3;20239:6;20235:16;20222:30;20216:3;20205:9;20201:19;20194:59;20302:2;20294:6;20290:15;20284:3;20273:9;20269:19;20262:44;;;20355:9;20347:6;20343:22;20337:3;20326:9;20322:19;20315:51;20383:49;20425:6;20417;20409;20383:49;:::i;:::-;20375:57;;;20483:6;20476:14;20469:22;20463:3;20452:9;20448:19;20441:51;19279:1219;;;;;;;;;;:::o;20852:734::-;20917:5;20970:3;20963:4;20955:6;20951:17;20947:27;20937:55;;20988:1;20985;20978:12;20937:55;21017:6;21011:13;21043:4;21067:60;21083:43;21123:2;21083:43;:::i;21067:60::-;21161:15;;;21247:1;21243:10;;;;21231:23;;21227:32;;;21192:12;;;;21271:15;;;21268:35;;;21299:1;21296;21289:12;21268:35;21335:2;21327:6;21323:15;21347:210;21363:6;21358:3;21355:15;21347:210;;;21436:3;21430:10;21453:31;21478:5;21453:31;:::i;:::-;21497:18;;21535:12;;;;21380;;21347:210;;21591:989;21690:6;21743:2;21731:9;21722:7;21718:23;21714:32;21711:52;;;21759:1;21756;21749:12;21711:52;21792:9;21786:16;-1:-1:-1;;;;;21862:2:1;21854:6;21851:14;21848:34;;;21878:1;21875;21868:12;21848:34;21901:22;;;;21957:4;21939:16;;;21935:27;21932:47;;;21975:1;21972;21965:12;21932:47;22001:22;;:::i;:::-;22052:2;22046:9;22039:5;22032:24;22102:2;22098;22094:11;22088:18;22083:2;22076:5;22072:14;22065:42;22153:2;22149;22145:11;22139:18;22134:2;22127:5;22123:14;22116:42;22197:2;22193;22189:11;22183:18;22226:2;22216:8;22213:16;22210:36;;;22242:1;22239;22232:12;22210:36;22278:67;22337:7;22326:8;22322:2;22318:17;22278:67;:::i;:::-;22273:2;22266:5;22262:14;22255:91;;22379:43;22417:3;22413:2;22409:12;22379:43;:::i;:::-;22373:3;22366:5;22362:15;22355:68;22470:3;22466:2;22462:12;22456:19;22450:3;22443:5;22439:15;22432:44;22509:40;22544:3;22540:2;22536:12;22509:40;:::i;:::-;22503:3;22492:15;;22485:65;22496:5;21591:989;-1:-1:-1;;;;;21591:989:1:o;23289:522::-;23389:6;23384:3;23377:19;23359:3;23415:4;23444:2;23439:3;23435:12;23428:19;;23470:5;23493:1;23503:283;23517:6;23514:1;23511:13;23503:283;;;23594:6;23581:20;23614:33;23639:7;23614:33;:::i;:::-;-1:-1:-1;;;;;23672:33:1;23660:46;;23726:12;;;;23761:15;;;;23702:1;23532:9;23503:283;;;-1:-1:-1;23802:3:1;;23289:522;-1:-1:-1;;;;;23289:522:1:o;23816:1308::-;24005:2;23994:9;23987:21;24057:6;24044:20;24039:2;24028:9;24024:18;24017:48;24126:2;24118:6;24114:15;24101:29;24096:2;24085:9;24081:18;24074:57;24192:2;24184:6;24180:15;24167:29;24162:2;24151:9;24147:18;24140:57;23968:4;24257:2;24249:6;24245:15;24232:29;24341:2;24337:7;24328:6;24312:14;24308:27;24304:41;24284:18;24280:66;24270:94;;24360:1;24357;24350:12;24270:94;24386:31;;24494:2;24483:14;;;24440:19;-1:-1:-1;;;;;24509:30:1;;24506:50;;;24552:1;24549;24542:12;24506:50;24608:6;24605:1;24601:14;24585;24581:35;24572:7;24568:49;24565:69;;;24630:1;24627;24620:12;24565:69;24671:4;24665:3;24654:9;24650:19;24643:33;24699:75;24769:3;24758:9;24754:19;24746:6;24737:7;24699:75;:::i;:::-;24685:89;;;24803:36;24834:3;24826:6;24822:16;24803:36;:::i;:::-;-1:-1:-1;;;;;3551:31:1;;24896:3;24881:19;;3539:44;24848:53;24963:3;24955:6;24951:16;24938:30;24932:3;24921:9;24917:19;24910:59;25000:33;25028:3;25020:6;25016:16;25000:33;:::i;:::-;1460:13;;1453:21;25089:4;25074:20;;1441:34;25042:53;1390:91;26270:458;26501:6;26490:9;26483:25;26544:6;26539:2;26528:9;26524:18;26517:34;26616:1;26612;26607:3;26603:11;26599:19;26591:6;26587:32;26582:2;26571:9;26567:18;26560:60;26656:3;26651:2;26640:9;26636:18;26629:31;26464:4;26677:45;26717:3;26706:9;26702:19;26694:6;26677:45;:::i;26733:135::-;26772:3;26793:17;;;26790:43;;26813:18;;:::i;:::-;-1:-1:-1;26860:1:1;26849:13;;26733:135::o;28218:245::-;28285:6;28338:2;28326:9;28317:7;28313:23;28309:32;28306:52;;;28354:1;28351;28344:12;28306:52;28386:9;28380:16;28405:28;28427:5;28405:28;:::i;29240:136::-;29279:3;29307:5;29297:39;;29316:18;;:::i;:::-;-1:-1:-1;;;29352:18:1;;29240:136::o;30150:188::-;30229:13;;-1:-1:-1;;;;;30271:42:1;;30261:53;;30251:81;;30328:1;30325;30318:12;30343:450;30430:6;30438;30446;30499:2;30487:9;30478:7;30474:23;30470:32;30467:52;;;30515:1;30512;30505:12;30467:52;30538:40;30568:9;30538:40;:::i;:::-;30528:50;;30597:49;30642:2;30631:9;30627:18;30597:49;:::i;:::-;30587:59;;30689:2;30678:9;30674:18;30668:25;30733:10;30726:5;30722:22;30715:5;30712:33;30702:61;;30759:1;30756;30749:12;30702:61;30782:5;30772:15;;;30343:450;;;;;:::o;31212:406::-;31414:2;31396:21;;;31453:2;31433:18;;;31426:30;31492:34;31487:2;31472:18;;31465:62;-1:-1:-1;;;31558:2:1;31543:18;;31536:40;31608:3;31593:19;;31212:406::o;31623:127::-;31684:10;31679:3;31675:20;31672:1;31665:31;31715:4;31712:1;31705:15;31739:4;31736:1;31729:15;31755:217;31795:1;31821;31811:132;;31865:10;31860:3;31856:20;31853:1;31846:31;31900:4;31897:1;31890:15;31928:4;31925:1;31918:15;31811:132;-1:-1:-1;31957:9:1;;31755:217::o;33157:274::-;33286:3;33324:6;33318:13;33340:53;33386:6;33381:3;33374:4;33366:6;33362:17;33340:53;:::i;:::-;33409:16;;;;;33157:274;-1:-1:-1;;33157:274:1:o

Swarm Source

ipfs://a87aa0c23b2c117d784bd6d354dd6bb613e5160133ec5c613f14ee98de8723c7
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading