Contract 0x91ebc8c746CD13b5cbcffC2A6787Ed2aba87e02c 8

 
Txn Hash Method
Block
From
To
Value
0x82d151270c8b62997cf1097428dc404d53c24e64c9e074b7b754392ac2f11263Exercise130340712024-04-11 17:44:494 days 11 hrs ago0xf67affbcfaa9a6e2888eb1f754d83b3acabfeeaa IN  0x91ebc8c746cd13b5cbcffc2a6787ed2aba87e02c0 ETH0.0000865741930.1466
0x553c21fd3d5d5d8df8294f11f9eeb102d61876ae72a4c537c6ffda40610a8613Exercise130331902024-04-11 17:15:274 days 11 hrs ago0x0b776552c1aef1dc33005dd25acda22493b6615d IN  0x91ebc8c746cd13b5cbcffc2a6787ed2aba87e02c0 ETH0.000070763710.1691
0x94d768eda05efe7ee8c54d3b04ec3ed829dbc3367ad34c82956a342c7ec3a0b6Exercise130103012024-04-11 4:32:295 days 29 mins ago0xaad212afbb37cef736b917e1849c1b9c4a31f918 IN  0x91ebc8c746cd13b5cbcffc2a6787ed2aba87e02c0 ETH0.0000429538640.096438999
0x9cdd79a42911b8d8d5e88506134efe1423584209580990f1509a9c15db9f2424Exercise129872792024-04-10 15:45:055 days 13 hrs agoMorphex: Deployer IN  0x91ebc8c746cd13b5cbcffc2a6787ed2aba87e02c0 ETH0.0000992045820.2369
0x3d617667efddf3f85f4b5c16467a71e28d932e5edb62c8a81bf22148cbe10371Exercise128747402024-04-08 1:13:478 days 3 hrs ago0x90f15e09b8fb5bc080b968170c638920db3a3446 IN  0x91ebc8c746cd13b5cbcffc2a6787ed2aba87e02c0 ETH0.0000588272240.1232
0x413373626e6239a25c3955a7003fb6b8a61ed7f6a7d2e7807b4708e14f62c8efExercise128504182024-04-07 11:43:038 days 17 hrs ago0x14dbbeb5a9bccda3aed04ba62b14a2216ea5bcab IN  0x91ebc8c746cd13b5cbcffc2a6787ed2aba87e02c0 ETH0.0000096584980.023
0x6905a2c59b101f036f8e901b7dea9da72961d095dcb870f3f15a0e65a1befad0Exercise128249012024-04-06 21:32:299 days 7 hrs ago0xcb154f36e69ae26a96942f7a1ebaf3d181a082df IN  0x91ebc8c746cd13b5cbcffc2a6787ed2aba87e02c0 ETH0.0000320974820.067618823
0x54e256e4bfb61747c2a4d63d5bc59a1d09b5f2d2e2fc71bf8cf41e97f87e0fe1Exercise127891962024-04-06 1:42:1910 days 3 hrs ago0x31e55af6c55476b3ca0a6e7689d2ee91f55840c4 IN  0x91ebc8c746cd13b5cbcffc2a6787ed2aba87e02c0 ETH0.0000070601590.0168
0x4892827df2d8927b1277dc119fc66a0bc30fc4ae158f49d6258382f77314eeadExercise124106252024-03-28 7:23:1718 days 21 hrs ago0xced3fc4610761f79242d7d8a72fe86f3a1c626b4 IN  0x91ebc8c746cd13b5cbcffc2a6787ed2aba87e02c0 ETH0.0000419140290.0906
0x11be0396434587c550d0295a62c987183dc5ba98829cb21df91d695a709d18e1Exercise123989092024-03-28 0:52:4519 days 4 hrs ago0xba1ee94032904bd9e8fe966a924355fe5542b5a7 IN  0x91ebc8c746cd13b5cbcffc2a6787ed2aba87e02c0 ETH0.0000604443140.1406
0x4e65db1649ba12658e9a3394e6e3c2fc1b970ff427697e22e6adc9d0fd8cdab7Exercise123961752024-03-27 23:21:3719 days 5 hrs ago0xced3fc4610761f79242d7d8a72fe86f3a1c626b4 IN  0x91ebc8c746cd13b5cbcffc2a6787ed2aba87e02c0 ETH0.0000660637960.141
0x70fe2153fab208640771efbcd85d4926abe39c3f61c8306636020f191a4c9a7bExercise123801952024-03-27 14:28:5719 days 14 hrs ago0x78e801136f77805239a7f533521a7a5570f572c8 IN  0x91ebc8c746cd13b5cbcffc2a6787ed2aba87e02c0 ETH0.0013245380313.068496811
0x82ddf1c16bd7d69acb90405c6ea0b8554b44d85269b1043bb10149cefd7beccbExercise123407592024-03-26 16:34:2520 days 12 hrs ago0x7dde93fb4387951124f2937ea3720320bda83c29 IN  0x91ebc8c746cd13b5cbcffc2a6787ed2aba87e02c0 ETH0.0010827360552.442
0xf3ea861b756de8f107648ae8f4e9e458678c60928823529e6996ccbb15367dc0Exercise123406372024-03-26 16:30:2120 days 12 hrs ago0x71f4283bca1170b704331362b7e93f4704436918 IN  0x91ebc8c746cd13b5cbcffc2a6787ed2aba87e02c0 ETH0.0010568793762.4596
0x6f5d87f42695dce451c34aeaddd210fd68d8d9f39bb3dcac52b3c0ffcbd574cdExercise123330722024-03-26 12:18:1120 days 16 hrs ago0x56be76bd656813fd5ac5a65ebdbe28a1fd56deb3 IN  0x91ebc8c746cd13b5cbcffc2a6787ed2aba87e02c0 ETH0.000165476630.395767357
0x633e1585124924a504f23f3ebcd68864a3c523d15f989583d8e1fd0f2813da2eExercise123307942024-03-26 11:02:1520 days 18 hrs ago0x73c32955ef940685df78e1f7db2b4df2f8519050 IN  0x91ebc8c746cd13b5cbcffc2a6787ed2aba87e02c0 ETH0.0000991900660.237192735
0xdb0ed7f93aaedcce1a95e9bbeb835b4e90b4296a97cea930bad40d358ac088eaExercise123270792024-03-26 8:58:2520 days 20 hrs ago0x90b2bc5807ced285e18b09b7d7a6c2760356e35f IN  0x91ebc8c746cd13b5cbcffc2a6787ed2aba87e02c0 ETH0.0001290974350.263570245
0xc5b8b779c77993370ee200fd49dbdcbe9fe150f85c8022a05fafa6750113b70fExercise123262992024-03-26 8:32:2520 days 20 hrs ago0x5a1a3dff949225e39767ca981218756db47c7d8c IN  0x91ebc8c746cd13b5cbcffc2a6787ed2aba87e02c0 ETH0.0001251375170.239977111
0xdd4271542aee4d40adb444dda5e32e7f45092869d4f7afa75f4fc01ef40fd209Exercise122995212024-03-25 17:39:4921 days 11 hrs ago0x1ca000befdf544c46b2eca0fc62a42113fae6833 IN  0x91ebc8c746cd13b5cbcffc2a6787ed2aba87e02c0 ETH0.0010397701282.487689681
0x778b7a2d6755fe9f2eeb76ab715dd4821431d3161d2b92fdbf5e2fa0db5f360eExercise122934372024-03-25 14:17:0121 days 14 hrs ago0xadffc760edf4f6146dce89022b5ae7ebb7edd2b9 IN  0x91ebc8c746cd13b5cbcffc2a6787ed2aba87e02c0 ETH0.0013202473243.1588
0xe8f347db1eebd08ce16bce80b473f464dbb07962313273bdd5db0b84f6c6660eExercise122528512024-03-24 15:44:0922 days 13 hrs ago0xaad212afbb37cef736b917e1849c1b9c4a31f918 IN  0x91ebc8c746cd13b5cbcffc2a6787ed2aba87e02c0 ETH0.0003244614260.68515805
0xc59b2b4b57da51ef93923ebd17fb32f1a36b091ecd665d6f04e12ac533bd6ae3Exercise122168362024-03-23 19:43:3923 days 9 hrs ago0xaf79312eb821871208ac76a80c8e282f8796964e IN  0x91ebc8c746cd13b5cbcffc2a6787ed2aba87e02c0 ETH0.0000966852440.204
0x2679f366aaf9981e643ad7cf046975e88f80e96c9ad0e6d31bc2a308ae96f4c3Exercise121763212024-03-22 21:13:0924 days 7 hrs ago0xde6759faebaba270a8cb80633ccd5ce3143fff28 IN  0x91ebc8c746cd13b5cbcffc2a6787ed2aba87e02c0 ETH0.0000948809150.200146088
0xecc7c8395b147ec63ac9554157a2dc0188d000ffe7cd45cc5c24e4914f15acefExercise121644032024-03-22 14:35:5324 days 14 hrs ago0x0b776552c1aef1dc33005dd25acda22493b6615d IN  0x91ebc8c746cd13b5cbcffc2a6787ed2aba87e02c0 ETH0.0002076047940.438
0xcf57eb6eb152200c4e2a03fe139e58915c9869fc238e47deb6dbfbc5a5a35ff5Exercise121160312024-03-21 11:43:2925 days 17 hrs ago0x9d13b1fafaa5f3eca37f724d61697cd420dcb9d7 IN  0x91ebc8c746cd13b5cbcffc2a6787ed2aba87e02c0 ETH0.0004777360281.0084
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
SimpleExerciseHelper

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, GNU AGPLv3 license
File 1 of 7 : SimpleExerciseHelperBVM.sol
// SPDX-License-Identifier: AGPL-3.0
pragma solidity 0.8.17;

import "@openzeppelin/contracts/access/Ownable2Step.sol";
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";

interface IoToken is IERC20 {
    function exercise(
        uint256 _amount,
        uint256 _maxPaymentAmount,
        address _recipient
    ) external returns (uint256);

    function getDiscountedPrice(
        uint256 _amount
    ) external view returns (uint256);

    function discount() external view returns (uint256);

    function underlyingToken() external view returns (address);
}

interface IBalancer {
    function flashLoan(
        address recipient,
        address[] memory tokens,
        uint256[] memory amounts,
        bytes memory userData
    ) external;
}

interface IRouter {
    struct route {
        address from;
        address to;
        bool stable;
    }

    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        route[] calldata routes,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);

    function getAmountOut(
        uint amountIn,
        address tokenIn,
        address tokenOut,
        bool stable
    ) external view returns (uint amount);
}

/**
 * @title Simple Exercise Helper
 * @notice This contract easily converts oTokens paired with WETH
 *  such as oBVM to WETH using flash loans.
 */

contract SimpleExerciseHelper is Ownable2Step {
    /// @notice WETH, payment token
    IERC20 internal constant weth =
        IERC20(0x4200000000000000000000000000000000000006);

    /// @notice Flashloan from Balancer vault
    IBalancer internal constant balancerVault =
        IBalancer(0xBA12222222228d8Ba445958a75a0704d566BF2C8);

    /// @notice BVM router for swaps
    IRouter internal constant router =
        IRouter(0x68dc9978d159300767e541e0DDde1E1B2Ec79680);

    /// @notice Check whether we are in the middle of a flashloan (used for callback)
    bool public flashEntered;

    /// @notice Where we send our 0.25% fee
    address public feeAddress = 0x58761D6C6bF6c4bab96CaE125a2e5c8B1859b48a;

    uint256 public fee = 25;

    uint256 internal constant MAX_BPS = 10_000;
    uint256 internal constant DISCOUNT_DENOMINATOR = 100;

    /**
     * @notice Check if spot swap and exercising fall are similar enough for our liking.
     * @param _oToken The option token we are exercising.
     * @param _optionTokenAmount The amount of oToken to exercise to WETH.
     * @param _profitSlippageAllowed Considers effect of TWAP vs spot pricing of options on profit outcomes.
     * @return paymentTokenNeeded How much payment token is needed for given amount of oToken.
     * @return withinSlippageTolerance Whether expected vs real profit fall within our slippage tolerance.
     * @return realProfit Simulated profit in paymentToken after repaying flash loan.
     * @return expectedProfit Calculated ideal profit based on redemption discount plus allowed slippage.
     * @return profitSlippage Expected profit slippage with given oToken amount, 18 decimals. Zero
     *  means extra profit (positive slippage).
     */
    function quoteExerciseProfit(
        address _oToken,
        uint256 _optionTokenAmount,
        uint256 _profitSlippageAllowed
    )
        public
        view
        returns (
            uint256 paymentTokenNeeded,
            bool withinSlippageTolerance,
            uint256 realProfit,
            uint256 expectedProfit,
            uint256 profitSlippage
        )
    {
        if (_optionTokenAmount == 0) {
            revert("Can't exercise zero");
        }
        if (_profitSlippageAllowed > MAX_BPS) {
            revert("Slippage must be less than 10,000");
        }

        // figure out how much WETH we need for our oToken amount
        paymentTokenNeeded = IoToken(_oToken).getDiscountedPrice(
            _optionTokenAmount
        );

        // compare our token needed to spot price
        uint256 spotPaymentTokenReceived = router.getAmountOut(
            _optionTokenAmount,
            IoToken(_oToken).underlyingToken(),
            address(weth),
            false
        );
        realProfit = spotPaymentTokenReceived - paymentTokenNeeded;

        // calculate our ideal profit using the discount
        uint256 discount = IoToken(_oToken).discount();
        expectedProfit =
            (paymentTokenNeeded * (DISCOUNT_DENOMINATOR - discount)) /
            discount;

        // if profitSlippage returns zero, we have positive slippage (extra profit)
        if (expectedProfit > realProfit) {
            profitSlippage = 1e18 - ((realProfit * 1e18) / expectedProfit);
        }

        // allow for our expected slippage as well
        expectedProfit =
            (expectedProfit * (MAX_BPS - _profitSlippageAllowed)) /
            MAX_BPS;

        // check if real profit is greater than expected when accounting for allowed slippage
        if (realProfit > expectedProfit) {
            withinSlippageTolerance = true;
        }
    }

    /**
     * @notice Exercise our oToken for WETH.
     * @param _oToken The option token we are exercising.
     * @param _amount The amount of oToken to exercise to WETH.
     * @param _profitSlippageAllowed Considers effect of TWAP vs spot pricing of options on profit outcomes.
     * @param _swapSlippageAllowed Slippage (really price impact) we allow while swapping underlying to WETH.
     */
    function exercise(
        address _oToken,
        uint256 _amount,
        uint256 _profitSlippageAllowed,
        uint256 _swapSlippageAllowed
    ) external {
        // first person does the approvals for everyone else, what a nice person!
        _checkAllowance(_oToken);

        // transfer option token to this contract
        _safeTransferFrom(_oToken, msg.sender, address(this), _amount);

        // check that slippage tolerance for profit is okay
        (
            uint256 paymentTokenNeeded,
            bool withinSlippageTolerance,
            ,
            ,

        ) = quoteExerciseProfit(_oToken, _amount, _profitSlippageAllowed);

        if (!withinSlippageTolerance) {
            revert("Profit not within slippage tolerance, check TWAP");
        }

        // get our flash loan started
        _borrowPaymentToken(_oToken, paymentTokenNeeded, _swapSlippageAllowed);

        // send remaining profit back to user
        _safeTransfer(address(weth), msg.sender, weth.balanceOf(address(this)));
    }

    /**
     * @notice Flash loan our WETH from Balancer.
     * @param _oToken The option token we are exercising.
     * @param _amountNeeded The amount of WETH needed.
     * @param _slippageAllowed Slippage (really price impact) we allow while swapping underlying to WETH.
     */
    function _borrowPaymentToken(
        address _oToken,
        uint256 _amountNeeded,
        uint256 _slippageAllowed
    ) internal {
        // change our state
        flashEntered = true;

        // create our input args
        address[] memory tokens = new address[](1);
        tokens[0] = address(weth);

        uint256[] memory amounts = new uint256[](1);
        amounts[0] = _amountNeeded;

        bytes memory userData = abi.encode(
            _oToken,
            _amountNeeded,
            _slippageAllowed
        );

        // call the flash loan
        balancerVault.flashLoan(address(this), tokens, amounts, userData);
    }

    /**
     * @notice Fallback function used during flash loans.
     * @dev May only be called by balancer vault as part of
     *  flash loan callback.
     * @param _tokens The tokens we are swapping (in our case, only WETH).
     * @param _amounts The amounts of said tokens.
     * @param _feeAmounts The fee amounts for said tokens.
     * @param _userData Payment token amount passed from our flash loan.
     */
    function receiveFlashLoan(
        address[] memory _tokens,
        uint256[] memory _amounts,
        uint256[] memory _feeAmounts,
        bytes memory _userData
    ) external {
        // only balancer vault may call this, during a flash loan
        if (msg.sender != address(balancerVault)) {
            revert("Only balancer vault can call");
        }
        if (!flashEntered) {
            revert("Flashloan not in progress");
        }

        // pull our option info from the userData
        (
            address _oToken,
            uint256 paymentTokenNeeded,
            uint256 slippageAllowed
        ) = abi.decode(_userData, (address, uint256, uint256));

        // exercise our option with our new WETH, swap all underlying to WETH
        uint256 optionTokenBalance = IoToken(_oToken).balanceOf(address(this));
        _exerciseAndSwap(
            _oToken,
            optionTokenBalance,
            paymentTokenNeeded,
            slippageAllowed
        );

        // check our output and take fees
        uint256 wethAmount = weth.balanceOf(address(this));
        _takeFees(wethAmount);

        // repay our flash loan
        uint256 payback = _amounts[0] + _feeAmounts[0];
        _safeTransfer(address(weth), address(balancerVault), payback);
        flashEntered = false;
    }

    /**
     * @notice Exercise our oToken, then swap underlying to WETH.
     * @param _oToken The option token we are exercising.
     * @param _optionTokenAmount Amount of oToken to exercise.
     * @param _paymentTokenAmount Amount of WETH needed to pay for exercising.
     * @param _slippageAllowed Slippage (really price impact) we allow while swapping underlying to WETH.
     */
    function _exerciseAndSwap(
        address _oToken,
        uint256 _optionTokenAmount,
        uint256 _paymentTokenAmount,
        uint256 _slippageAllowed
    ) internal {
        // pull our underlying from the oToken
        IERC20 underlying = IERC20(IoToken(_oToken).underlyingToken());

        // exercise
        IoToken(_oToken).exercise(
            _optionTokenAmount,
            _paymentTokenAmount,
            address(this)
        );
        uint256 underlyingReceived = underlying.balanceOf(address(this));

        IRouter.route[] memory tokenToWeth = new IRouter.route[](1);
        tokenToWeth[0] = IRouter.route(
            address(underlying),
            address(weth),
            false
        );

        // use this to minimize issues with slippage (swapping with too much size)
        uint256 wethPerToken = router.getAmountOut(
            1e18,
            address(underlying),
            address(weth),
            false
        );
        uint256 minAmountOut = (underlyingReceived *
            wethPerToken *
            (MAX_BPS - _slippageAllowed)) / (1e18 * MAX_BPS);

        // use our router to swap from underlying to WETH
        router.swapExactTokensForTokens(
            underlyingReceived,
            minAmountOut,
            tokenToWeth,
            address(this),
            block.timestamp
        );
    }

    /**
     * @notice Apply fees to our after-swap total.
     * @dev Default is 0.25% but this may be updated later.
     * @param _amount Amount to apply our fee to.
     */
    function _takeFees(uint256 _amount) internal {
        uint256 toSend = (_amount * fee) / MAX_BPS;
        _safeTransfer(address(weth), feeAddress, toSend);
    }

    // helper to approve new oTokens to spend WETH, etc. from this contract
    function _checkAllowance(address _oToken) internal {
        if (weth.allowance(address(this), _oToken) == 0) {
            weth.approve(_oToken, type(uint256).max);

            // approve router to spend underlying from this contract
            IERC20 underlying = IERC20(IoToken(_oToken).underlyingToken());
            underlying.approve(address(router), type(uint256).max);
        }
    }

    /**
     * @notice Sweep out tokens accidentally sent here.
     * @dev May only be called by owner.
     * @param _tokenAddress Address of token to sweep.
     * @param _tokenAmount Amount of tokens to sweep.
     */
    function recoverERC20(
        address _tokenAddress,
        uint256 _tokenAmount
    ) external onlyOwner {
        _safeTransfer(_tokenAddress, owner(), _tokenAmount);
    }

    /**
     * @notice
     *  Update fee for oToken -> WETH conversion.
     * @param _recipient Fee recipient address.
     * @param _newFee New fee, out of 10,000.
     */
    function setFee(address _recipient, uint256 _newFee) external onlyOwner {
        if (_newFee > DISCOUNT_DENOMINATOR) {
            revert("Fee max is 1%");
        }
        fee = _newFee;
        feeAddress = _recipient;
    }

    /* ========== HELPER FUNCTIONS ========== */

    function _safeTransfer(address token, address to, uint256 value) internal {
        require(token.code.length > 0);
        (bool success, bytes memory data) = token.call(
            abi.encodeWithSelector(IERC20.transfer.selector, to, value)
        );
        require(success && (data.length == 0 || abi.decode(data, (bool))));
    }

    function _safeTransferFrom(
        address token,
        address from,
        address to,
        uint256 value
    ) internal {
        require(token.code.length > 0);
        (bool success, bytes memory data) = token.call(
            abi.encodeWithSelector(
                IERC20.transferFrom.selector,
                from,
                to,
                value
            )
        );
        require(success && (data.length == 0 || abi.decode(data, (bool))));
    }
}

File 2 of 7 : ERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;

import "./IERC20.sol";
import "./extensions/IERC20Metadata.sol";
import "../../utils/Context.sol";

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * The default value of {decimals} is 18. To change this, you should override
 * this function so it returns a different value.
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the default value returned by this function, unless
     * it's overridden.
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, spender) + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `from` to `to`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(address from, address to, uint256 amount) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
            // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
            // decrementing then incrementing.
            _balances[to] += amount;
        }

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        unchecked {
            // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
            _balances[account] += amount;
        }
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
            // Overflow not possible: amount <= accountBalance <= totalSupply.
            _totalSupply -= amount;
        }

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(address owner, address spender, uint256 amount) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(address owner, address spender, uint256 amount) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {}
}

File 3 of 7 : Ownable2Step.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable2Step.sol)

pragma solidity ^0.8.0;

import "./Ownable.sol";

/**
 * @dev Contract module which provides access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership} and {acceptOwnership}.
 *
 * This module is used through inheritance. It will make available all functions
 * from parent (Ownable).
 */
abstract contract Ownable2Step is Ownable {
    address private _pendingOwner;

    event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Returns the address of the pending owner.
     */
    function pendingOwner() public view virtual returns (address) {
        return _pendingOwner;
    }

    /**
     * @dev Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one.
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual override onlyOwner {
        _pendingOwner = newOwner;
        emit OwnershipTransferStarted(owner(), newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`) and deletes any pending owner.
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual override {
        delete _pendingOwner;
        super._transferOwnership(newOwner);
    }

    /**
     * @dev The new owner accepts the ownership transfer.
     */
    function acceptOwnership() public virtual {
        address sender = _msgSender();
        require(pendingOwner() == sender, "Ownable2Step: caller is not the new owner");
        _transferOwnership(sender);
    }
}

File 4 of 7 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

File 5 of 7 : IERC20Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;

import "../IERC20.sol";

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

File 6 of 7 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @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);

    /**
     * @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);
}

File 7 of 7 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

Settings
{
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_oToken","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_profitSlippageAllowed","type":"uint256"},{"internalType":"uint256","name":"_swapSlippageAllowed","type":"uint256"}],"name":"exercise","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flashEntered","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_oToken","type":"address"},{"internalType":"uint256","name":"_optionTokenAmount","type":"uint256"},{"internalType":"uint256","name":"_profitSlippageAllowed","type":"uint256"}],"name":"quoteExerciseProfit","outputs":[{"internalType":"uint256","name":"paymentTokenNeeded","type":"uint256"},{"internalType":"bool","name":"withinSlippageTolerance","type":"bool"},{"internalType":"uint256","name":"realProfit","type":"uint256"},{"internalType":"uint256","name":"expectedProfit","type":"uint256"},{"internalType":"uint256","name":"profitSlippage","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_tokens","type":"address[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"},{"internalType":"uint256[]","name":"_feeAmounts","type":"uint256[]"},{"internalType":"bytes","name":"_userData","type":"bytes"}],"name":"receiveFlashLoan","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256","name":"_tokenAmount","type":"uint256"}],"name":"recoverERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_newFee","type":"uint256"}],"name":"setFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040527358761d6c6bf6c4bab96cae125a2e5c8b1859b48a600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060196003553480156200006b57600080fd5b506200008c620000806200009260201b60201c565b6200009a60201b60201c565b6200019c565b600033905090565b600160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055620000d581620000d860201b62000bfd1760201c565b50565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612cf180620001ac6000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c80638da5cb5b1161008c578063e55156b511610066578063e55156b5146101ce578063f04f2707146101ea578063f2fde38b14610206578063f6e7fd3b14610222576100cf565b80638da5cb5b14610174578063ddca3f4314610192578063e30c3978146101b0576100cf565b80630c1d6358146100d457806341275358146100f25780635bd7f35b14610110578063715018a61461014457806379ba50971461014e5780638980f11f14610158575b600080fd5b6100dc61023e565b6040516100e99190611921565b60405180910390f35b6100fa610251565b604051610107919061197d565b60405180910390f35b61012a60048036038101906101259190611a0e565b610277565b60405161013b959493929190611a70565b60405180910390f35b61014c6105c2565b005b6101566105d6565b005b610172600480360381019061016d9190611ac3565b610663565b005b61017c610681565b604051610189919061197d565b60405180910390f35b61019a6106aa565b6040516101a79190611b03565b60405180910390f35b6101b86106b0565b6040516101c5919061197d565b60405180910390f35b6101e860048036038101906101e39190611ac3565b6106da565b005b61020460048036038101906101ff9190611def565b610772565b005b610220600480360381019061021b9190611ec6565b610a27565b005b61023c60048036038101906102379190611ef3565b610ad4565b005b600160149054906101000a900460ff1681565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008060008087036102c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102b890611fb7565b60405180910390fd5b612710861115610306576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102fd90612049565b60405180910390fd5b8773ffffffffffffffffffffffffffffffffffffffff1663339ccade886040518263ffffffff1660e01b815260040161033f9190611b03565b602060405180830381865afa15801561035c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610380919061207e565b945060007368dc9978d159300767e541e0ddde1e1b2ec7968073ffffffffffffffffffffffffffffffffffffffff1663da214231898b73ffffffffffffffffffffffffffffffffffffffff16632495a5996040518163ffffffff1660e01b8152600401602060405180830381865afa158015610400573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061042491906120c0565b73420000000000000000000000000000000000000660006040518563ffffffff1660e01b815260040161045a94939291906120ed565b602060405180830381865afa158015610477573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061049b919061207e565b905085816104a99190612161565b935060008973ffffffffffffffffffffffffffffffffffffffff16636b6f4a9d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051c919061207e565b90508081606461052c9190612161565b886105379190612195565b6105419190612206565b9350848411156105805783670de0b6b3a7640000866105609190612195565b61056a9190612206565b670de0b6b3a764000061057d9190612161565b92505b612710886127106105919190612161565b8561059c9190612195565b6105a69190612206565b9350838511156105b557600195505b5050939792965093509350565b6105ca610cc1565b6105d46000610d3f565b565b60006105e0610d70565b90508073ffffffffffffffffffffffffffffffffffffffff166106016106b0565b73ffffffffffffffffffffffffffffffffffffffff1614610657576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064e906122a9565b60405180910390fd5b61066081610d3f565b50565b61066b610cc1565b61067d82610677610681565b83610d78565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60035481565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6106e2610cc1565b6064811115610726576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071d90612315565b60405180910390fd5b8060038190555081600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b73ba12222222228d8ba445958a75a0704d566bf2c873ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146107f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107eb90612381565b60405180910390fd5b600160149054906101000a900460ff16610843576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083a906123ed565b60405180910390fd5b60008060008380602001905181019061085c919061244b565b92509250925060008373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161089d919061197d565b602060405180830381865afa1580156108ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108de919061207e565b90506108ec84828585610ebb565b600073420000000000000000000000000000000000000673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161093b919061197d565b602060405180830381865afa158015610958573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097c919061207e565b9050610987816112a9565b60008760008151811061099d5761099c61249e565b5b6020026020010151896000815181106109b9576109b861249e565b5b60200260200101516109cb91906124cd565b9050610a0073420000000000000000000000000000000000000673ba12222222228d8ba445958a75a0704d566bf2c883610d78565b6000600160146101000a81548160ff02191690831515021790555050505050505050505050565b610a2f610cc1565b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16610a8f610681565b73ffffffffffffffffffffffffffffffffffffffff167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b610add8461130d565b610ae984333086611582565b600080610af7868686610277565b5050509150915080610b3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3590612573565b60405180910390fd5b610b498683856116c8565b610bf57342000000000000000000000000000000000000063373420000000000000000000000000000000000000673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610baf919061197d565b602060405180830381865afa158015610bcc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf0919061207e565b610d78565b505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b610cc9610d70565b73ffffffffffffffffffffffffffffffffffffffff16610ce7610681565b73ffffffffffffffffffffffffffffffffffffffff1614610d3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d34906125df565b60405180910390fd5b565b600160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055610d6d81610bfd565b50565b600033905090565b60008373ffffffffffffffffffffffffffffffffffffffff163b11610d9c57600080fd5b6000808473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb60e01b8585604051602401610dd19291906125ff565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610e3b9190612699565b6000604051808303816000865af19150503d8060008114610e78576040519150601f19603f3d011682016040523d82523d6000602084013e610e7d565b606091505b5091509150818015610eab5750600081511480610eaa575080806020019051810190610ea991906126dc565b5b5b610eb457600080fd5b5050505050565b60008473ffffffffffffffffffffffffffffffffffffffff16632495a5996040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f2c91906120c0565b90508473ffffffffffffffffffffffffffffffffffffffff1663d6379b728585306040518463ffffffff1660e01b8152600401610f6b93929190612709565b6020604051808303816000875af1158015610f8a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fae919061207e565b5060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610fea919061197d565b602060405180830381865afa158015611007573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102b919061207e565b90506000600167ffffffffffffffff81111561104a57611049611b34565b5b60405190808252806020026020018201604052801561108357816020015b6110706118b7565b8152602001906001900390816110685790505b50905060405180606001604052808473ffffffffffffffffffffffffffffffffffffffff16815260200173420000000000000000000000000000000000000673ffffffffffffffffffffffffffffffffffffffff16815260200160001515815250816000815181106110f8576110f761249e565b5b602002602001018190525060007368dc9978d159300767e541e0ddde1e1b2ec7968073ffffffffffffffffffffffffffffffffffffffff1663da214231670de0b6b3a76400008673420000000000000000000000000000000000000660006040518563ffffffff1660e01b81526004016111759493929190612785565b602060405180830381865afa158015611192573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111b6919061207e565b90506000612710670de0b6b3a76400006111d09190612195565b866127106111de9190612161565b83866111ea9190612195565b6111f49190612195565b6111fe9190612206565b90507368dc9978d159300767e541e0ddde1e1b2ec7968073ffffffffffffffffffffffffffffffffffffffff1663f41766d885838630426040518663ffffffff1660e01b81526004016112559594939291906128d9565b6000604051808303816000875af1158015611274573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061129d91906129ca565b50505050505050505050565b6000612710600354836112bc9190612195565b6112c69190612206565b9050611309734200000000000000000000000000000000000006600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683610d78565b5050565b600073420000000000000000000000000000000000000673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30846040518363ffffffff1660e01b815260040161135e929190612a13565b602060405180830381865afa15801561137b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061139f919061207e565b0361157f5773420000000000000000000000000000000000000673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b81526004016114139291906125ff565b6020604051808303816000875af1158015611432573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061145691906126dc565b5060008173ffffffffffffffffffffffffffffffffffffffff16632495a5996040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114c891906120c0565b90508073ffffffffffffffffffffffffffffffffffffffff1663095ea7b37368dc9978d159300767e541e0ddde1e1b2ec796807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b81526004016115399291906125ff565b6020604051808303816000875af1158015611558573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061157c91906126dc565b50505b50565b60008473ffffffffffffffffffffffffffffffffffffffff163b116115a657600080fd5b6000808573ffffffffffffffffffffffffffffffffffffffff166323b872dd60e01b8686866040516024016115dd93929190612a3c565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516116479190612699565b6000604051808303816000865af19150503d8060008114611684576040519150601f19603f3d011682016040523d82523d6000602084013e611689565b606091505b50915091508180156116b757506000815114806116b65750808060200190518101906116b591906126dc565b5b5b6116c057600080fd5b505050505050565b60018060146101000a81548160ff0219169083151502179055506000600167ffffffffffffffff8111156116ff576116fe611b34565b5b60405190808252806020026020018201604052801561172d5781602001602082028036833780820191505090505b509050734200000000000000000000000000000000000006816000815181106117595761175861249e565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000600167ffffffffffffffff8111156117b0576117af611b34565b5b6040519080825280602002602001820160405280156117de5781602001602082028036833780820191505090505b50905083816000815181106117f6576117f561249e565b5b602002602001018181525050600085858560405160200161181993929190612a73565b604051602081830303815290604052905073ba12222222228d8ba445958a75a0704d566bf2c873ffffffffffffffffffffffffffffffffffffffff16635c38449e308585856040518563ffffffff1660e01b815260040161187d9493929190612c61565b600060405180830381600087803b15801561189757600080fd5b505af11580156118ab573d6000803e3d6000fd5b50505050505050505050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000151581525090565b60008115159050919050565b61191b81611906565b82525050565b60006020820190506119366000830184611912565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006119678261193c565b9050919050565b6119778161195c565b82525050565b6000602082019050611992600083018461196e565b92915050565b6000604051905090565b600080fd5b600080fd5b6119b58161195c565b81146119c057600080fd5b50565b6000813590506119d2816119ac565b92915050565b6000819050919050565b6119eb816119d8565b81146119f657600080fd5b50565b600081359050611a08816119e2565b92915050565b600080600060608486031215611a2757611a266119a2565b5b6000611a35868287016119c3565b9350506020611a46868287016119f9565b9250506040611a57868287016119f9565b9150509250925092565b611a6a816119d8565b82525050565b600060a082019050611a856000830188611a61565b611a926020830187611912565b611a9f6040830186611a61565b611aac6060830185611a61565b611ab96080830184611a61565b9695505050505050565b60008060408385031215611ada57611ad96119a2565b5b6000611ae8858286016119c3565b9250506020611af9858286016119f9565b9150509250929050565b6000602082019050611b186000830184611a61565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611b6c82611b23565b810181811067ffffffffffffffff82111715611b8b57611b8a611b34565b5b80604052505050565b6000611b9e611998565b9050611baa8282611b63565b919050565b600067ffffffffffffffff821115611bca57611bc9611b34565b5b602082029050602081019050919050565b600080fd5b6000611bf3611bee84611baf565b611b94565b90508083825260208201905060208402830185811115611c1657611c15611bdb565b5b835b81811015611c3f5780611c2b88826119c3565b845260208401935050602081019050611c18565b5050509392505050565b600082601f830112611c5e57611c5d611b1e565b5b8135611c6e848260208601611be0565b91505092915050565b600067ffffffffffffffff821115611c9257611c91611b34565b5b602082029050602081019050919050565b6000611cb6611cb184611c77565b611b94565b90508083825260208201905060208402830185811115611cd957611cd8611bdb565b5b835b81811015611d025780611cee88826119f9565b845260208401935050602081019050611cdb565b5050509392505050565b600082601f830112611d2157611d20611b1e565b5b8135611d31848260208601611ca3565b91505092915050565b600080fd5b600067ffffffffffffffff821115611d5a57611d59611b34565b5b611d6382611b23565b9050602081019050919050565b82818337600083830152505050565b6000611d92611d8d84611d3f565b611b94565b905082815260208101848484011115611dae57611dad611d3a565b5b611db9848285611d70565b509392505050565b600082601f830112611dd657611dd5611b1e565b5b8135611de6848260208601611d7f565b91505092915050565b60008060008060808587031215611e0957611e086119a2565b5b600085013567ffffffffffffffff811115611e2757611e266119a7565b5b611e3387828801611c49565b945050602085013567ffffffffffffffff811115611e5457611e536119a7565b5b611e6087828801611d0c565b935050604085013567ffffffffffffffff811115611e8157611e806119a7565b5b611e8d87828801611d0c565b925050606085013567ffffffffffffffff811115611eae57611ead6119a7565b5b611eba87828801611dc1565b91505092959194509250565b600060208284031215611edc57611edb6119a2565b5b6000611eea848285016119c3565b91505092915050565b60008060008060808587031215611f0d57611f0c6119a2565b5b6000611f1b878288016119c3565b9450506020611f2c878288016119f9565b9350506040611f3d878288016119f9565b9250506060611f4e878288016119f9565b91505092959194509250565b600082825260208201905092915050565b7f43616e2774206578657263697365207a65726f00000000000000000000000000600082015250565b6000611fa1601383611f5a565b9150611fac82611f6b565b602082019050919050565b60006020820190508181036000830152611fd081611f94565b9050919050565b7f536c697070616765206d757374206265206c657373207468616e2031302c303060008201527f3000000000000000000000000000000000000000000000000000000000000000602082015250565b6000612033602183611f5a565b915061203e82611fd7565b604082019050919050565b6000602082019050818103600083015261206281612026565b9050919050565b600081519050612078816119e2565b92915050565b600060208284031215612094576120936119a2565b5b60006120a284828501612069565b91505092915050565b6000815190506120ba816119ac565b92915050565b6000602082840312156120d6576120d56119a2565b5b60006120e4848285016120ab565b91505092915050565b60006080820190506121026000830187611a61565b61210f602083018661196e565b61211c604083018561196e565b6121296060830184611912565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061216c826119d8565b9150612177836119d8565b925082820390508181111561218f5761218e612132565b5b92915050565b60006121a0826119d8565b91506121ab836119d8565b92508282026121b9816119d8565b915082820484148315176121d0576121cf612132565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612211826119d8565b915061221c836119d8565b92508261222c5761222b6121d7565b5b828204905092915050565b7f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060008201527f6e6577206f776e65720000000000000000000000000000000000000000000000602082015250565b6000612293602983611f5a565b915061229e82612237565b604082019050919050565b600060208201905081810360008301526122c281612286565b9050919050565b7f466565206d617820697320312500000000000000000000000000000000000000600082015250565b60006122ff600d83611f5a565b915061230a826122c9565b602082019050919050565b6000602082019050818103600083015261232e816122f2565b9050919050565b7f4f6e6c792062616c616e636572207661756c742063616e2063616c6c00000000600082015250565b600061236b601c83611f5a565b915061237682612335565b602082019050919050565b6000602082019050818103600083015261239a8161235e565b9050919050565b7f466c6173686c6f616e206e6f7420696e2070726f677265737300000000000000600082015250565b60006123d7601983611f5a565b91506123e2826123a1565b602082019050919050565b60006020820190508181036000830152612406816123ca565b9050919050565b60006124188261193c565b9050919050565b6124288161240d565b811461243357600080fd5b50565b6000815190506124458161241f565b92915050565b600080600060608486031215612464576124636119a2565b5b600061247286828701612436565b935050602061248386828701612069565b925050604061249486828701612069565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006124d8826119d8565b91506124e3836119d8565b92508282019050808211156124fb576124fa612132565b5b92915050565b7f50726f666974206e6f742077697468696e20736c69707061676520746f6c657260008201527f616e63652c20636865636b205457415000000000000000000000000000000000602082015250565b600061255d603083611f5a565b915061256882612501565b604082019050919050565b6000602082019050818103600083015261258c81612550565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006125c9602083611f5a565b91506125d482612593565b602082019050919050565b600060208201905081810360008301526125f8816125bc565b9050919050565b6000604082019050612614600083018561196e565b6126216020830184611a61565b9392505050565b600081519050919050565b600081905092915050565b60005b8381101561265c578082015181840152602081019050612641565b60008484015250505050565b600061267382612628565b61267d8185612633565b935061268d81856020860161263e565b80840191505092915050565b60006126a58284612668565b915081905092915050565b6126b981611906565b81146126c457600080fd5b50565b6000815190506126d6816126b0565b92915050565b6000602082840312156126f2576126f16119a2565b5b6000612700848285016126c7565b91505092915050565b600060608201905061271e6000830186611a61565b61272b6020830185611a61565b612738604083018461196e565b949350505050565b6000819050919050565b6000819050919050565b600061276f61276a61276584612740565b61274a565b6119d8565b9050919050565b61277f81612754565b82525050565b600060808201905061279a6000830187612776565b6127a7602083018661196e565b6127b4604083018561196e565b6127c16060830184611912565b95945050505050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6127ff8161195c565b82525050565b61280e81611906565b82525050565b60608201600082015161282a60008501826127f6565b50602082015161283d60208501826127f6565b5060408201516128506040850182612805565b50505050565b60006128628383612814565b60608301905092915050565b6000602082019050919050565b6000612886826127ca565b61289081856127d5565b935061289b836127e6565b8060005b838110156128cc5781516128b38882612856565b97506128be8361286e565b92505060018101905061289f565b5085935050505092915050565b600060a0820190506128ee6000830188611a61565b6128fb6020830187611a61565b818103604083015261290d818661287b565b905061291c606083018561196e565b6129296080830184611a61565b9695505050505050565b600061294661294184611c77565b611b94565b9050808382526020820190506020840283018581111561296957612968611bdb565b5b835b81811015612992578061297e8882612069565b84526020840193505060208101905061296b565b5050509392505050565b600082601f8301126129b1576129b0611b1e565b5b81516129c1848260208601612933565b91505092915050565b6000602082840312156129e0576129df6119a2565b5b600082015167ffffffffffffffff8111156129fe576129fd6119a7565b5b612a0a8482850161299c565b91505092915050565b6000604082019050612a28600083018561196e565b612a35602083018461196e565b9392505050565b6000606082019050612a51600083018661196e565b612a5e602083018561196e565b612a6b6040830184611a61565b949350505050565b6000606082019050612a88600083018661196e565b612a956020830185611a61565b612aa26040830184611a61565b949350505050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000612ae283836127f6565b60208301905092915050565b6000602082019050919050565b6000612b0682612aaa565b612b108185612ab5565b9350612b1b83612ac6565b8060005b83811015612b4c578151612b338882612ad6565b9750612b3e83612aee565b925050600181019050612b1f565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612b8e816119d8565b82525050565b6000612ba08383612b85565b60208301905092915050565b6000602082019050919050565b6000612bc482612b59565b612bce8185612b64565b9350612bd983612b75565b8060005b83811015612c0a578151612bf18882612b94565b9750612bfc83612bac565b925050600181019050612bdd565b5085935050505092915050565b600082825260208201905092915050565b6000612c3382612628565b612c3d8185612c17565b9350612c4d81856020860161263e565b612c5681611b23565b840191505092915050565b6000608082019050612c76600083018761196e565b8181036020830152612c888186612afb565b90508181036040830152612c9c8185612bb9565b90508181036060830152612cb08184612c28565b90509594505050505056fea2646970667358221220e8fe3ade93c026fef7a5e2c29597c1c1207f2cad82e409bc86e2eb896883f50664736f6c63430008110033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100cf5760003560e01c80638da5cb5b1161008c578063e55156b511610066578063e55156b5146101ce578063f04f2707146101ea578063f2fde38b14610206578063f6e7fd3b14610222576100cf565b80638da5cb5b14610174578063ddca3f4314610192578063e30c3978146101b0576100cf565b80630c1d6358146100d457806341275358146100f25780635bd7f35b14610110578063715018a61461014457806379ba50971461014e5780638980f11f14610158575b600080fd5b6100dc61023e565b6040516100e99190611921565b60405180910390f35b6100fa610251565b604051610107919061197d565b60405180910390f35b61012a60048036038101906101259190611a0e565b610277565b60405161013b959493929190611a70565b60405180910390f35b61014c6105c2565b005b6101566105d6565b005b610172600480360381019061016d9190611ac3565b610663565b005b61017c610681565b604051610189919061197d565b60405180910390f35b61019a6106aa565b6040516101a79190611b03565b60405180910390f35b6101b86106b0565b6040516101c5919061197d565b60405180910390f35b6101e860048036038101906101e39190611ac3565b6106da565b005b61020460048036038101906101ff9190611def565b610772565b005b610220600480360381019061021b9190611ec6565b610a27565b005b61023c60048036038101906102379190611ef3565b610ad4565b005b600160149054906101000a900460ff1681565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008060008087036102c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102b890611fb7565b60405180910390fd5b612710861115610306576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102fd90612049565b60405180910390fd5b8773ffffffffffffffffffffffffffffffffffffffff1663339ccade886040518263ffffffff1660e01b815260040161033f9190611b03565b602060405180830381865afa15801561035c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610380919061207e565b945060007368dc9978d159300767e541e0ddde1e1b2ec7968073ffffffffffffffffffffffffffffffffffffffff1663da214231898b73ffffffffffffffffffffffffffffffffffffffff16632495a5996040518163ffffffff1660e01b8152600401602060405180830381865afa158015610400573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061042491906120c0565b73420000000000000000000000000000000000000660006040518563ffffffff1660e01b815260040161045a94939291906120ed565b602060405180830381865afa158015610477573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061049b919061207e565b905085816104a99190612161565b935060008973ffffffffffffffffffffffffffffffffffffffff16636b6f4a9d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051c919061207e565b90508081606461052c9190612161565b886105379190612195565b6105419190612206565b9350848411156105805783670de0b6b3a7640000866105609190612195565b61056a9190612206565b670de0b6b3a764000061057d9190612161565b92505b612710886127106105919190612161565b8561059c9190612195565b6105a69190612206565b9350838511156105b557600195505b5050939792965093509350565b6105ca610cc1565b6105d46000610d3f565b565b60006105e0610d70565b90508073ffffffffffffffffffffffffffffffffffffffff166106016106b0565b73ffffffffffffffffffffffffffffffffffffffff1614610657576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064e906122a9565b60405180910390fd5b61066081610d3f565b50565b61066b610cc1565b61067d82610677610681565b83610d78565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60035481565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6106e2610cc1565b6064811115610726576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071d90612315565b60405180910390fd5b8060038190555081600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b73ba12222222228d8ba445958a75a0704d566bf2c873ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146107f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107eb90612381565b60405180910390fd5b600160149054906101000a900460ff16610843576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083a906123ed565b60405180910390fd5b60008060008380602001905181019061085c919061244b565b92509250925060008373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161089d919061197d565b602060405180830381865afa1580156108ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108de919061207e565b90506108ec84828585610ebb565b600073420000000000000000000000000000000000000673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161093b919061197d565b602060405180830381865afa158015610958573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097c919061207e565b9050610987816112a9565b60008760008151811061099d5761099c61249e565b5b6020026020010151896000815181106109b9576109b861249e565b5b60200260200101516109cb91906124cd565b9050610a0073420000000000000000000000000000000000000673ba12222222228d8ba445958a75a0704d566bf2c883610d78565b6000600160146101000a81548160ff02191690831515021790555050505050505050505050565b610a2f610cc1565b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16610a8f610681565b73ffffffffffffffffffffffffffffffffffffffff167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b610add8461130d565b610ae984333086611582565b600080610af7868686610277565b5050509150915080610b3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3590612573565b60405180910390fd5b610b498683856116c8565b610bf57342000000000000000000000000000000000000063373420000000000000000000000000000000000000673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610baf919061197d565b602060405180830381865afa158015610bcc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf0919061207e565b610d78565b505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b610cc9610d70565b73ffffffffffffffffffffffffffffffffffffffff16610ce7610681565b73ffffffffffffffffffffffffffffffffffffffff1614610d3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d34906125df565b60405180910390fd5b565b600160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055610d6d81610bfd565b50565b600033905090565b60008373ffffffffffffffffffffffffffffffffffffffff163b11610d9c57600080fd5b6000808473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb60e01b8585604051602401610dd19291906125ff565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610e3b9190612699565b6000604051808303816000865af19150503d8060008114610e78576040519150601f19603f3d011682016040523d82523d6000602084013e610e7d565b606091505b5091509150818015610eab5750600081511480610eaa575080806020019051810190610ea991906126dc565b5b5b610eb457600080fd5b5050505050565b60008473ffffffffffffffffffffffffffffffffffffffff16632495a5996040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f2c91906120c0565b90508473ffffffffffffffffffffffffffffffffffffffff1663d6379b728585306040518463ffffffff1660e01b8152600401610f6b93929190612709565b6020604051808303816000875af1158015610f8a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fae919061207e565b5060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610fea919061197d565b602060405180830381865afa158015611007573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102b919061207e565b90506000600167ffffffffffffffff81111561104a57611049611b34565b5b60405190808252806020026020018201604052801561108357816020015b6110706118b7565b8152602001906001900390816110685790505b50905060405180606001604052808473ffffffffffffffffffffffffffffffffffffffff16815260200173420000000000000000000000000000000000000673ffffffffffffffffffffffffffffffffffffffff16815260200160001515815250816000815181106110f8576110f761249e565b5b602002602001018190525060007368dc9978d159300767e541e0ddde1e1b2ec7968073ffffffffffffffffffffffffffffffffffffffff1663da214231670de0b6b3a76400008673420000000000000000000000000000000000000660006040518563ffffffff1660e01b81526004016111759493929190612785565b602060405180830381865afa158015611192573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111b6919061207e565b90506000612710670de0b6b3a76400006111d09190612195565b866127106111de9190612161565b83866111ea9190612195565b6111f49190612195565b6111fe9190612206565b90507368dc9978d159300767e541e0ddde1e1b2ec7968073ffffffffffffffffffffffffffffffffffffffff1663f41766d885838630426040518663ffffffff1660e01b81526004016112559594939291906128d9565b6000604051808303816000875af1158015611274573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061129d91906129ca565b50505050505050505050565b6000612710600354836112bc9190612195565b6112c69190612206565b9050611309734200000000000000000000000000000000000006600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683610d78565b5050565b600073420000000000000000000000000000000000000673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30846040518363ffffffff1660e01b815260040161135e929190612a13565b602060405180830381865afa15801561137b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061139f919061207e565b0361157f5773420000000000000000000000000000000000000673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b81526004016114139291906125ff565b6020604051808303816000875af1158015611432573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061145691906126dc565b5060008173ffffffffffffffffffffffffffffffffffffffff16632495a5996040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114c891906120c0565b90508073ffffffffffffffffffffffffffffffffffffffff1663095ea7b37368dc9978d159300767e541e0ddde1e1b2ec796807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b81526004016115399291906125ff565b6020604051808303816000875af1158015611558573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061157c91906126dc565b50505b50565b60008473ffffffffffffffffffffffffffffffffffffffff163b116115a657600080fd5b6000808573ffffffffffffffffffffffffffffffffffffffff166323b872dd60e01b8686866040516024016115dd93929190612a3c565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516116479190612699565b6000604051808303816000865af19150503d8060008114611684576040519150601f19603f3d011682016040523d82523d6000602084013e611689565b606091505b50915091508180156116b757506000815114806116b65750808060200190518101906116b591906126dc565b5b5b6116c057600080fd5b505050505050565b60018060146101000a81548160ff0219169083151502179055506000600167ffffffffffffffff8111156116ff576116fe611b34565b5b60405190808252806020026020018201604052801561172d5781602001602082028036833780820191505090505b509050734200000000000000000000000000000000000006816000815181106117595761175861249e565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000600167ffffffffffffffff8111156117b0576117af611b34565b5b6040519080825280602002602001820160405280156117de5781602001602082028036833780820191505090505b50905083816000815181106117f6576117f561249e565b5b602002602001018181525050600085858560405160200161181993929190612a73565b604051602081830303815290604052905073ba12222222228d8ba445958a75a0704d566bf2c873ffffffffffffffffffffffffffffffffffffffff16635c38449e308585856040518563ffffffff1660e01b815260040161187d9493929190612c61565b600060405180830381600087803b15801561189757600080fd5b505af11580156118ab573d6000803e3d6000fd5b50505050505050505050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000151581525090565b60008115159050919050565b61191b81611906565b82525050565b60006020820190506119366000830184611912565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006119678261193c565b9050919050565b6119778161195c565b82525050565b6000602082019050611992600083018461196e565b92915050565b6000604051905090565b600080fd5b600080fd5b6119b58161195c565b81146119c057600080fd5b50565b6000813590506119d2816119ac565b92915050565b6000819050919050565b6119eb816119d8565b81146119f657600080fd5b50565b600081359050611a08816119e2565b92915050565b600080600060608486031215611a2757611a266119a2565b5b6000611a35868287016119c3565b9350506020611a46868287016119f9565b9250506040611a57868287016119f9565b9150509250925092565b611a6a816119d8565b82525050565b600060a082019050611a856000830188611a61565b611a926020830187611912565b611a9f6040830186611a61565b611aac6060830185611a61565b611ab96080830184611a61565b9695505050505050565b60008060408385031215611ada57611ad96119a2565b5b6000611ae8858286016119c3565b9250506020611af9858286016119f9565b9150509250929050565b6000602082019050611b186000830184611a61565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611b6c82611b23565b810181811067ffffffffffffffff82111715611b8b57611b8a611b34565b5b80604052505050565b6000611b9e611998565b9050611baa8282611b63565b919050565b600067ffffffffffffffff821115611bca57611bc9611b34565b5b602082029050602081019050919050565b600080fd5b6000611bf3611bee84611baf565b611b94565b90508083825260208201905060208402830185811115611c1657611c15611bdb565b5b835b81811015611c3f5780611c2b88826119c3565b845260208401935050602081019050611c18565b5050509392505050565b600082601f830112611c5e57611c5d611b1e565b5b8135611c6e848260208601611be0565b91505092915050565b600067ffffffffffffffff821115611c9257611c91611b34565b5b602082029050602081019050919050565b6000611cb6611cb184611c77565b611b94565b90508083825260208201905060208402830185811115611cd957611cd8611bdb565b5b835b81811015611d025780611cee88826119f9565b845260208401935050602081019050611cdb565b5050509392505050565b600082601f830112611d2157611d20611b1e565b5b8135611d31848260208601611ca3565b91505092915050565b600080fd5b600067ffffffffffffffff821115611d5a57611d59611b34565b5b611d6382611b23565b9050602081019050919050565b82818337600083830152505050565b6000611d92611d8d84611d3f565b611b94565b905082815260208101848484011115611dae57611dad611d3a565b5b611db9848285611d70565b509392505050565b600082601f830112611dd657611dd5611b1e565b5b8135611de6848260208601611d7f565b91505092915050565b60008060008060808587031215611e0957611e086119a2565b5b600085013567ffffffffffffffff811115611e2757611e266119a7565b5b611e3387828801611c49565b945050602085013567ffffffffffffffff811115611e5457611e536119a7565b5b611e6087828801611d0c565b935050604085013567ffffffffffffffff811115611e8157611e806119a7565b5b611e8d87828801611d0c565b925050606085013567ffffffffffffffff811115611eae57611ead6119a7565b5b611eba87828801611dc1565b91505092959194509250565b600060208284031215611edc57611edb6119a2565b5b6000611eea848285016119c3565b91505092915050565b60008060008060808587031215611f0d57611f0c6119a2565b5b6000611f1b878288016119c3565b9450506020611f2c878288016119f9565b9350506040611f3d878288016119f9565b9250506060611f4e878288016119f9565b91505092959194509250565b600082825260208201905092915050565b7f43616e2774206578657263697365207a65726f00000000000000000000000000600082015250565b6000611fa1601383611f5a565b9150611fac82611f6b565b602082019050919050565b60006020820190508181036000830152611fd081611f94565b9050919050565b7f536c697070616765206d757374206265206c657373207468616e2031302c303060008201527f3000000000000000000000000000000000000000000000000000000000000000602082015250565b6000612033602183611f5a565b915061203e82611fd7565b604082019050919050565b6000602082019050818103600083015261206281612026565b9050919050565b600081519050612078816119e2565b92915050565b600060208284031215612094576120936119a2565b5b60006120a284828501612069565b91505092915050565b6000815190506120ba816119ac565b92915050565b6000602082840312156120d6576120d56119a2565b5b60006120e4848285016120ab565b91505092915050565b60006080820190506121026000830187611a61565b61210f602083018661196e565b61211c604083018561196e565b6121296060830184611912565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061216c826119d8565b9150612177836119d8565b925082820390508181111561218f5761218e612132565b5b92915050565b60006121a0826119d8565b91506121ab836119d8565b92508282026121b9816119d8565b915082820484148315176121d0576121cf612132565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612211826119d8565b915061221c836119d8565b92508261222c5761222b6121d7565b5b828204905092915050565b7f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060008201527f6e6577206f776e65720000000000000000000000000000000000000000000000602082015250565b6000612293602983611f5a565b915061229e82612237565b604082019050919050565b600060208201905081810360008301526122c281612286565b9050919050565b7f466565206d617820697320312500000000000000000000000000000000000000600082015250565b60006122ff600d83611f5a565b915061230a826122c9565b602082019050919050565b6000602082019050818103600083015261232e816122f2565b9050919050565b7f4f6e6c792062616c616e636572207661756c742063616e2063616c6c00000000600082015250565b600061236b601c83611f5a565b915061237682612335565b602082019050919050565b6000602082019050818103600083015261239a8161235e565b9050919050565b7f466c6173686c6f616e206e6f7420696e2070726f677265737300000000000000600082015250565b60006123d7601983611f5a565b91506123e2826123a1565b602082019050919050565b60006020820190508181036000830152612406816123ca565b9050919050565b60006124188261193c565b9050919050565b6124288161240d565b811461243357600080fd5b50565b6000815190506124458161241f565b92915050565b600080600060608486031215612464576124636119a2565b5b600061247286828701612436565b935050602061248386828701612069565b925050604061249486828701612069565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006124d8826119d8565b91506124e3836119d8565b92508282019050808211156124fb576124fa612132565b5b92915050565b7f50726f666974206e6f742077697468696e20736c69707061676520746f6c657260008201527f616e63652c20636865636b205457415000000000000000000000000000000000602082015250565b600061255d603083611f5a565b915061256882612501565b604082019050919050565b6000602082019050818103600083015261258c81612550565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006125c9602083611f5a565b91506125d482612593565b602082019050919050565b600060208201905081810360008301526125f8816125bc565b9050919050565b6000604082019050612614600083018561196e565b6126216020830184611a61565b9392505050565b600081519050919050565b600081905092915050565b60005b8381101561265c578082015181840152602081019050612641565b60008484015250505050565b600061267382612628565b61267d8185612633565b935061268d81856020860161263e565b80840191505092915050565b60006126a58284612668565b915081905092915050565b6126b981611906565b81146126c457600080fd5b50565b6000815190506126d6816126b0565b92915050565b6000602082840312156126f2576126f16119a2565b5b6000612700848285016126c7565b91505092915050565b600060608201905061271e6000830186611a61565b61272b6020830185611a61565b612738604083018461196e565b949350505050565b6000819050919050565b6000819050919050565b600061276f61276a61276584612740565b61274a565b6119d8565b9050919050565b61277f81612754565b82525050565b600060808201905061279a6000830187612776565b6127a7602083018661196e565b6127b4604083018561196e565b6127c16060830184611912565b95945050505050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6127ff8161195c565b82525050565b61280e81611906565b82525050565b60608201600082015161282a60008501826127f6565b50602082015161283d60208501826127f6565b5060408201516128506040850182612805565b50505050565b60006128628383612814565b60608301905092915050565b6000602082019050919050565b6000612886826127ca565b61289081856127d5565b935061289b836127e6565b8060005b838110156128cc5781516128b38882612856565b97506128be8361286e565b92505060018101905061289f565b5085935050505092915050565b600060a0820190506128ee6000830188611a61565b6128fb6020830187611a61565b818103604083015261290d818661287b565b905061291c606083018561196e565b6129296080830184611a61565b9695505050505050565b600061294661294184611c77565b611b94565b9050808382526020820190506020840283018581111561296957612968611bdb565b5b835b81811015612992578061297e8882612069565b84526020840193505060208101905061296b565b5050509392505050565b600082601f8301126129b1576129b0611b1e565b5b81516129c1848260208601612933565b91505092915050565b6000602082840312156129e0576129df6119a2565b5b600082015167ffffffffffffffff8111156129fe576129fd6119a7565b5b612a0a8482850161299c565b91505092915050565b6000604082019050612a28600083018561196e565b612a35602083018461196e565b9392505050565b6000606082019050612a51600083018661196e565b612a5e602083018561196e565b612a6b6040830184611a61565b949350505050565b6000606082019050612a88600083018661196e565b612a956020830185611a61565b612aa26040830184611a61565b949350505050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000612ae283836127f6565b60208301905092915050565b6000602082019050919050565b6000612b0682612aaa565b612b108185612ab5565b9350612b1b83612ac6565b8060005b83811015612b4c578151612b338882612ad6565b9750612b3e83612aee565b925050600181019050612b1f565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612b8e816119d8565b82525050565b6000612ba08383612b85565b60208301905092915050565b6000602082019050919050565b6000612bc482612b59565b612bce8185612b64565b9350612bd983612b75565b8060005b83811015612c0a578151612bf18882612b94565b9750612bfc83612bac565b925050600181019050612bdd565b5085935050505092915050565b600082825260208201905092915050565b6000612c3382612628565b612c3d8185612c17565b9350612c4d81856020860161263e565b612c5681611b23565b840191505092915050565b6000608082019050612c76600083018761196e565b8181036020830152612c888186612afb565b90508181036040830152612c9c8185612bb9565b90508181036060830152612cb08184612c28565b90509594505050505056fea2646970667358221220e8fe3ade93c026fef7a5e2c29597c1c1207f2cad82e409bc86e2eb896883f50664736f6c63430008110033

Deployed ByteCode Sourcemap

1404:12037:6:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1971:24;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2046:70;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3148:1893;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;1824:101:0;;;:::i;:::-;;1734:212:1;;;:::i;:::-;;11976:176:6;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1201:85:0;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2123:23:6;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;847:99:1;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12333:228:6;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7850:1318;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1139:178:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5449:1034:6;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1971:24;;;;;;;;;;;;;:::o;2046:70::-;;;;;;;;;;;;;:::o;3148:1893::-;3342:26;3382:28;3424:18;3456:22;3492;3565:1;3543:18;:23;3539:83;;3582:29;;;;;;;;;;:::i;:::-;;;;;;;;3539:83;2189:6;3635:22;:32;3631:106;;;3683:43;;;;;;;;;;:::i;:::-;;;;;;;;3631:106;3842:7;3834:35;;;3883:18;3834:77;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3813:98;;3972:32;1835:42;4007:19;;;4040:18;4080:7;4072:32;;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1539:42;4147:5;4007:155;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3972:190;;4212:18;4185:24;:45;;;;:::i;:::-;4172:58;;4298:16;4325:7;4317:25;;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4298:46;;4454:8;4429;2250:3;4406:31;;;;:::i;:::-;4384:18;:54;;;;:::i;:::-;4383:79;;;;:::i;:::-;4354:108;;4578:10;4561:14;:27;4557:120;;;4651:14;4643:4;4630:10;:17;;;;:::i;:::-;4629:36;;;;:::i;:::-;4621:4;:45;;;;:::i;:::-;4604:62;;4557:120;2189:6;4796:22;2189:6;4786:32;;;;:::i;:::-;4768:14;:51;;;;:::i;:::-;4767:75;;;;:::i;:::-;4738:104;;4964:14;4951:10;:27;4947:88;;;5020:4;4994:30;;4947:88;3529:1512;;3148:1893;;;;;;;;;:::o;1824:101:0:-;1094:13;:11;:13::i;:::-;1888:30:::1;1915:1;1888:18;:30::i;:::-;1824:101::o:0;1734:212:1:-;1786:14;1803:12;:10;:12::i;:::-;1786:29;;1851:6;1833:24;;:14;:12;:14::i;:::-;:24;;;1825:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;1913:26;1932:6;1913:18;:26::i;:::-;1776:170;1734:212::o;11976:176:6:-;1094:13:0;:11;:13::i;:::-;12094:51:6::1;12108:13;12123:7;:5;:7::i;:::-;12132:12;12094:13;:51::i;:::-;11976:176:::0;;:::o;1201:85:0:-;1247:7;1273:6;;;;;;;;;;;1266:13;;1201:85;:::o;2123:23:6:-;;;;:::o;847:99:1:-;900:7;926:13;;;;;;;;;;;919:20;;847:99;:::o;12333:228:6:-;1094:13:0;:11;:13::i;:::-;2250:3:6::1;12419:7;:30;12415:84;;;12465:23;;;;;;;;;;:::i;:::-;;;;;;;;12415:84;12514:7;12508:3;:13;;;;12544:10;12531;;:23;;;;;;;;;;;;;;;;;;12333:228:::0;;:::o;7850:1318::-;1697:42;8110:36;;:10;:36;;;8106:105;;8162:38;;;;;;;;;;:::i;:::-;;;;;;;;8106:105;8225:12;;;;;;;;;;;8220:79;;8253:35;;;;;;;;;;:::i;:::-;;;;;;;;8220:79;8373:15;8402:26;8442:23;8489:9;8478:50;;;;;;;;;;;;:::i;:::-;8359:169;;;;;;8617:26;8654:7;8646:26;;;8681:4;8646:41;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8617:70;;8697:140;8727:7;8748:18;8780;8812:15;8697:16;:140::i;:::-;8890:18;1539:42;8911:14;;;8934:4;8911:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8890:50;;8950:21;8960:10;8950:9;:21::i;:::-;9014:15;9046:11;9058:1;9046:14;;;;;;;;:::i;:::-;;;;;;;;9032:8;9041:1;9032:11;;;;;;;;:::i;:::-;;;;;;;;:28;;;;:::i;:::-;9014:46;;9070:61;1539:42;1697;9123:7;9070:13;:61::i;:::-;9156:5;9141:12;;:20;;;;;;;;;;;;;;;;;;8030:1138;;;;;;7850:1318;;;;:::o;1139:178:1:-;1094:13:0;:11;:13::i;:::-;1244:8:1::1;1228:13;;:24;;;;;;;;;;;;;;;;;;1301:8;1267:43;;1292:7;:5;:7::i;:::-;1267:43;;;;;;;;;;;;1139:178:::0;:::o;5449:1034:6:-;5702:24;5718:7;5702:15;:24::i;:::-;5787:62;5805:7;5814:10;5834:4;5841:7;5787:17;:62::i;:::-;5934:26;5974:28;6045:61;6065:7;6074;6083:22;6045:19;:61::i;:::-;5920:186;;;;;;;6122:23;6117:113;;6161:58;;;;;;;;;;:::i;:::-;;;;;;;;6117:113;6278:70;6298:7;6307:18;6327:20;6278:19;:70::i;:::-;6405:71;1539:42;6434:10;1539:42;6446:14;;;6469:4;6446:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6405:13;:71::i;:::-;5610:873;;5449:1034;;;;:::o;2426:187:0:-;2499:16;2518:6;;;;;;;;;;;2499:25;;2543:8;2534:6;;:17;;;;;;;;;;;;;;;;;;2597:8;2566:40;;2587:8;2566:40;;;;;;;;;;;;2489:124;2426:187;:::o;1359:130::-;1433:12;:10;:12::i;:::-;1422:23;;:7;:5;:7::i;:::-;:23;;;1414:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1359:130::o;1501:153:1:-;1590:13;;1583:20;;;;;;;;;;;1613:34;1638:8;1613:24;:34::i;:::-;1501:153;:::o;640:96:5:-;693:7;719:10;712:17;;640:96;:::o;12617:336:6:-;12729:1;12709:5;:17;;;:21;12701:30;;;;;;12742:12;12756:17;12777:5;:10;;12824:24;;;12850:2;12854:5;12801:59;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12777:93;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12741:129;;;;12888:7;:57;;;;;12915:1;12900:4;:11;:16;:44;;;;12931:4;12920:24;;;;;;;;;;;;:::i;:::-;12900:44;12888:57;12880:66;;;;;;12691:262;;12617:336;;;:::o;9562:1364::-;9792:17;9827:7;9819:32;;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9792:62;;9893:7;9885:25;;;9924:18;9956:19;9997:4;9885:127;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;10022:26;10051:10;:20;;;10080:4;10051:35;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10022:64;;10097:34;10154:1;10134:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;10097:59;;10183:102;;;;;;;;10218:10;10183:102;;;;;;1539:42;10183:102;;;;;;10270:5;10183:102;;;;;10166:11;10178:1;10166:14;;;;;;;;:::i;:::-;;;;;;;:119;;;;10379:20;1835:42;10402:19;;;10435:4;10461:10;1539:42;10513:5;10402:126;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10379:149;;10538:20;2189:6;10655:4;:14;;;;:::i;:::-;10633:16;2189:6;10623:26;;;;:::i;:::-;10595:12;10562:18;:45;;;;:::i;:::-;:88;;;;:::i;:::-;10561:109;;;;:::i;:::-;10538:132;;1835:42;10739:31;;;10784:18;10816:12;10842:11;10875:4;10894:15;10739:180;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;9735:1191;;;;;9562:1364;;;;:::o;11109:162::-;11164:14;2189:6;11192:3;;11182:7;:13;;;;:::i;:::-;11181:25;;;;:::i;:::-;11164:42;;11216:48;1539:42;11245:10;;;;;;;;;;;11257:6;11216:13;:48::i;:::-;11154:117;11109:162;:::o;11353:395::-;11460:1;1539:42;11418:14;;;11441:4;11448:7;11418:38;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:43;11414:328;;1539:42;11477:12;;;11490:7;11499:17;11477:40;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;11601:17;11636:7;11628:32;;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11601:62;;11677:10;:18;;;1835:42;11713:17;11677:54;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;11463:279;11414:328;11353:395;:::o;12959:480::-;13127:1;13107:5;:17;;;:21;13099:30;;;;;;13140:12;13154:17;13175:5;:10;;13239:28;;;13285:4;13307:2;13327:5;13199:147;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13175:181;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13139:217;;;;13374:7;:57;;;;;13401:1;13386:4;:11;:16;:44;;;;13417:4;13406:24;;;;;;;;;;;;:::i;:::-;13386:44;13374:57;13366:66;;;;;;13089:350;;12959:480;;;;:::o;6774:649::-;6961:4;6946:12;;:19;;;;;;;;;;;;;;;;;;7009:23;7049:1;7035:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7009:42;;1539;7061:6;7068:1;7061:9;;;;;;;;:::i;:::-;;;;;;;:25;;;;;;;;;;;7097:24;7138:1;7124:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7097:43;;7163:13;7150:7;7158:1;7150:10;;;;;;;;:::i;:::-;;;;;;;:26;;;;;7187:21;7235:7;7256:13;7283:16;7211:98;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;7187:122;;1697:42;7351:23;;;7383:4;7390:6;7398:7;7407:8;7351:65;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6908:515;;;6774:649;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:90:7:-;41:7;84:5;77:13;70:21;59:32;;7:90;;;:::o;103:109::-;184:21;199:5;184:21;:::i;:::-;179:3;172:34;103:109;;:::o;218:210::-;305:4;343:2;332:9;328:18;320:26;;356:65;418:1;407:9;403:17;394:6;356:65;:::i;:::-;218:210;;;;:::o;434:126::-;471:7;511:42;504:5;500:54;489:65;;434:126;;;:::o;566:96::-;603:7;632:24;650:5;632:24;:::i;:::-;621:35;;566:96;;;:::o;668:118::-;755:24;773:5;755:24;:::i;:::-;750:3;743:37;668:118;;:::o;792:222::-;885:4;923:2;912:9;908:18;900:26;;936:71;1004:1;993:9;989:17;980:6;936:71;:::i;:::-;792:222;;;;:::o;1020:75::-;1053:6;1086:2;1080:9;1070:19;;1020:75;:::o;1101:117::-;1210:1;1207;1200:12;1224:117;1333:1;1330;1323:12;1347:122;1420:24;1438:5;1420:24;:::i;:::-;1413:5;1410:35;1400:63;;1459:1;1456;1449:12;1400:63;1347:122;:::o;1475:139::-;1521:5;1559:6;1546:20;1537:29;;1575:33;1602:5;1575:33;:::i;:::-;1475:139;;;;:::o;1620:77::-;1657:7;1686:5;1675:16;;1620:77;;;:::o;1703:122::-;1776:24;1794:5;1776:24;:::i;:::-;1769:5;1766:35;1756:63;;1815:1;1812;1805:12;1756:63;1703:122;:::o;1831:139::-;1877:5;1915:6;1902:20;1893:29;;1931:33;1958:5;1931:33;:::i;:::-;1831:139;;;;:::o;1976:619::-;2053:6;2061;2069;2118:2;2106:9;2097:7;2093:23;2089:32;2086:119;;;2124:79;;:::i;:::-;2086:119;2244:1;2269:53;2314:7;2305:6;2294:9;2290:22;2269:53;:::i;:::-;2259:63;;2215:117;2371:2;2397:53;2442:7;2433:6;2422:9;2418:22;2397:53;:::i;:::-;2387:63;;2342:118;2499:2;2525:53;2570:7;2561:6;2550:9;2546:22;2525:53;:::i;:::-;2515:63;;2470:118;1976:619;;;;;:::o;2601:118::-;2688:24;2706:5;2688:24;:::i;:::-;2683:3;2676:37;2601:118;;:::o;2725:652::-;2924:4;2962:3;2951:9;2947:19;2939:27;;2976:71;3044:1;3033:9;3029:17;3020:6;2976:71;:::i;:::-;3057:66;3119:2;3108:9;3104:18;3095:6;3057:66;:::i;:::-;3133:72;3201:2;3190:9;3186:18;3177:6;3133:72;:::i;:::-;3215;3283:2;3272:9;3268:18;3259:6;3215:72;:::i;:::-;3297:73;3365:3;3354:9;3350:19;3341:6;3297:73;:::i;:::-;2725:652;;;;;;;;:::o;3383:474::-;3451:6;3459;3508:2;3496:9;3487:7;3483:23;3479:32;3476:119;;;3514:79;;:::i;:::-;3476:119;3634:1;3659:53;3704:7;3695:6;3684:9;3680:22;3659:53;:::i;:::-;3649:63;;3605:117;3761:2;3787:53;3832:7;3823:6;3812:9;3808:22;3787:53;:::i;:::-;3777:63;;3732:118;3383:474;;;;;:::o;3863:222::-;3956:4;3994:2;3983:9;3979:18;3971:26;;4007:71;4075:1;4064:9;4060:17;4051:6;4007:71;:::i;:::-;3863:222;;;;:::o;4091:117::-;4200:1;4197;4190:12;4214:102;4255:6;4306:2;4302:7;4297:2;4290:5;4286:14;4282:28;4272:38;;4214:102;;;:::o;4322:180::-;4370:77;4367:1;4360:88;4467:4;4464:1;4457:15;4491:4;4488:1;4481:15;4508:281;4591:27;4613:4;4591:27;:::i;:::-;4583:6;4579:40;4721:6;4709:10;4706:22;4685:18;4673:10;4670:34;4667:62;4664:88;;;4732:18;;:::i;:::-;4664:88;4772:10;4768:2;4761:22;4551:238;4508:281;;:::o;4795:129::-;4829:6;4856:20;;:::i;:::-;4846:30;;4885:33;4913:4;4905:6;4885:33;:::i;:::-;4795:129;;;:::o;4930:311::-;5007:4;5097:18;5089:6;5086:30;5083:56;;;5119:18;;:::i;:::-;5083:56;5169:4;5161:6;5157:17;5149:25;;5229:4;5223;5219:15;5211:23;;4930:311;;;:::o;5247:117::-;5356:1;5353;5346:12;5387:710;5483:5;5508:81;5524:64;5581:6;5524:64;:::i;:::-;5508:81;:::i;:::-;5499:90;;5609:5;5638:6;5631:5;5624:21;5672:4;5665:5;5661:16;5654:23;;5725:4;5717:6;5713:17;5705:6;5701:30;5754:3;5746:6;5743:15;5740:122;;;5773:79;;:::i;:::-;5740:122;5888:6;5871:220;5905:6;5900:3;5897:15;5871:220;;;5980:3;6009:37;6042:3;6030:10;6009:37;:::i;:::-;6004:3;5997:50;6076:4;6071:3;6067:14;6060:21;;5947:144;5931:4;5926:3;5922:14;5915:21;;5871:220;;;5875:21;5489:608;;5387:710;;;;;:::o;6120:370::-;6191:5;6240:3;6233:4;6225:6;6221:17;6217:27;6207:122;;6248:79;;:::i;:::-;6207:122;6365:6;6352:20;6390:94;6480:3;6472:6;6465:4;6457:6;6453:17;6390:94;:::i;:::-;6381:103;;6197:293;6120:370;;;;:::o;6496:311::-;6573:4;6663:18;6655:6;6652:30;6649:56;;;6685:18;;:::i;:::-;6649:56;6735:4;6727:6;6723:17;6715:25;;6795:4;6789;6785:15;6777:23;;6496:311;;;:::o;6830:710::-;6926:5;6951:81;6967:64;7024:6;6967:64;:::i;:::-;6951:81;:::i;:::-;6942:90;;7052:5;7081:6;7074:5;7067:21;7115:4;7108:5;7104:16;7097:23;;7168:4;7160:6;7156:17;7148:6;7144:30;7197:3;7189:6;7186:15;7183:122;;;7216:79;;:::i;:::-;7183:122;7331:6;7314:220;7348:6;7343:3;7340:15;7314:220;;;7423:3;7452:37;7485:3;7473:10;7452:37;:::i;:::-;7447:3;7440:50;7519:4;7514:3;7510:14;7503:21;;7390:144;7374:4;7369:3;7365:14;7358:21;;7314:220;;;7318:21;6932:608;;6830:710;;;;;:::o;7563:370::-;7634:5;7683:3;7676:4;7668:6;7664:17;7660:27;7650:122;;7691:79;;:::i;:::-;7650:122;7808:6;7795:20;7833:94;7923:3;7915:6;7908:4;7900:6;7896:17;7833:94;:::i;:::-;7824:103;;7640:293;7563:370;;;;:::o;7939:117::-;8048:1;8045;8038:12;8062:307;8123:4;8213:18;8205:6;8202:30;8199:56;;;8235:18;;:::i;:::-;8199:56;8273:29;8295:6;8273:29;:::i;:::-;8265:37;;8357:4;8351;8347:15;8339:23;;8062:307;;;:::o;8375:146::-;8472:6;8467:3;8462;8449:30;8513:1;8504:6;8499:3;8495:16;8488:27;8375:146;;;:::o;8527:423::-;8604:5;8629:65;8645:48;8686:6;8645:48;:::i;:::-;8629:65;:::i;:::-;8620:74;;8717:6;8710:5;8703:21;8755:4;8748:5;8744:16;8793:3;8784:6;8779:3;8775:16;8772:25;8769:112;;;8800:79;;:::i;:::-;8769:112;8890:54;8937:6;8932:3;8927;8890:54;:::i;:::-;8610:340;8527:423;;;;;:::o;8969:338::-;9024:5;9073:3;9066:4;9058:6;9054:17;9050:27;9040:122;;9081:79;;:::i;:::-;9040:122;9198:6;9185:20;9223:78;9297:3;9289:6;9282:4;9274:6;9270:17;9223:78;:::i;:::-;9214:87;;9030:277;8969:338;;;;:::o;9313:1573::-;9483:6;9491;9499;9507;9556:3;9544:9;9535:7;9531:23;9527:33;9524:120;;;9563:79;;:::i;:::-;9524:120;9711:1;9700:9;9696:17;9683:31;9741:18;9733:6;9730:30;9727:117;;;9763:79;;:::i;:::-;9727:117;9868:78;9938:7;9929:6;9918:9;9914:22;9868:78;:::i;:::-;9858:88;;9654:302;10023:2;10012:9;10008:18;9995:32;10054:18;10046:6;10043:30;10040:117;;;10076:79;;:::i;:::-;10040:117;10181:78;10251:7;10242:6;10231:9;10227:22;10181:78;:::i;:::-;10171:88;;9966:303;10336:2;10325:9;10321:18;10308:32;10367:18;10359:6;10356:30;10353:117;;;10389:79;;:::i;:::-;10353:117;10494:78;10564:7;10555:6;10544:9;10540:22;10494:78;:::i;:::-;10484:88;;10279:303;10649:2;10638:9;10634:18;10621:32;10680:18;10672:6;10669:30;10666:117;;;10702:79;;:::i;:::-;10666:117;10807:62;10861:7;10852:6;10841:9;10837:22;10807:62;:::i;:::-;10797:72;;10592:287;9313:1573;;;;;;;:::o;10892:329::-;10951:6;11000:2;10988:9;10979:7;10975:23;10971:32;10968:119;;;11006:79;;:::i;:::-;10968:119;11126:1;11151:53;11196:7;11187:6;11176:9;11172:22;11151:53;:::i;:::-;11141:63;;11097:117;10892:329;;;;:::o;11227:765::-;11313:6;11321;11329;11337;11386:3;11374:9;11365:7;11361:23;11357:33;11354:120;;;11393:79;;:::i;:::-;11354:120;11513:1;11538:53;11583:7;11574:6;11563:9;11559:22;11538:53;:::i;:::-;11528:63;;11484:117;11640:2;11666:53;11711:7;11702:6;11691:9;11687:22;11666:53;:::i;:::-;11656:63;;11611:118;11768:2;11794:53;11839:7;11830:6;11819:9;11815:22;11794:53;:::i;:::-;11784:63;;11739:118;11896:2;11922:53;11967:7;11958:6;11947:9;11943:22;11922:53;:::i;:::-;11912:63;;11867:118;11227:765;;;;;;;:::o;11998:169::-;12082:11;12116:6;12111:3;12104:19;12156:4;12151:3;12147:14;12132:29;;11998:169;;;;:::o;12173:::-;12313:21;12309:1;12301:6;12297:14;12290:45;12173:169;:::o;12348:366::-;12490:3;12511:67;12575:2;12570:3;12511:67;:::i;:::-;12504:74;;12587:93;12676:3;12587:93;:::i;:::-;12705:2;12700:3;12696:12;12689:19;;12348:366;;;:::o;12720:419::-;12886:4;12924:2;12913:9;12909:18;12901:26;;12973:9;12967:4;12963:20;12959:1;12948:9;12944:17;12937:47;13001:131;13127:4;13001:131;:::i;:::-;12993:139;;12720:419;;;:::o;13145:220::-;13285:34;13281:1;13273:6;13269:14;13262:58;13354:3;13349:2;13341:6;13337:15;13330:28;13145:220;:::o;13371:366::-;13513:3;13534:67;13598:2;13593:3;13534:67;:::i;:::-;13527:74;;13610:93;13699:3;13610:93;:::i;:::-;13728:2;13723:3;13719:12;13712:19;;13371:366;;;:::o;13743:419::-;13909:4;13947:2;13936:9;13932:18;13924:26;;13996:9;13990:4;13986:20;13982:1;13971:9;13967:17;13960:47;14024:131;14150:4;14024:131;:::i;:::-;14016:139;;13743:419;;;:::o;14168:143::-;14225:5;14256:6;14250:13;14241:22;;14272:33;14299:5;14272:33;:::i;:::-;14168:143;;;;:::o;14317:351::-;14387:6;14436:2;14424:9;14415:7;14411:23;14407:32;14404:119;;;14442:79;;:::i;:::-;14404:119;14562:1;14587:64;14643:7;14634:6;14623:9;14619:22;14587:64;:::i;:::-;14577:74;;14533:128;14317:351;;;;:::o;14674:143::-;14731:5;14762:6;14756:13;14747:22;;14778:33;14805:5;14778:33;:::i;:::-;14674:143;;;;:::o;14823:351::-;14893:6;14942:2;14930:9;14921:7;14917:23;14913:32;14910:119;;;14948:79;;:::i;:::-;14910:119;15068:1;15093:64;15149:7;15140:6;15129:9;15125:22;15093:64;:::i;:::-;15083:74;;15039:128;14823:351;;;;:::o;15180:541::-;15351:4;15389:3;15378:9;15374:19;15366:27;;15403:71;15471:1;15460:9;15456:17;15447:6;15403:71;:::i;:::-;15484:72;15552:2;15541:9;15537:18;15528:6;15484:72;:::i;:::-;15566;15634:2;15623:9;15619:18;15610:6;15566:72;:::i;:::-;15648:66;15710:2;15699:9;15695:18;15686:6;15648:66;:::i;:::-;15180:541;;;;;;;:::o;15727:180::-;15775:77;15772:1;15765:88;15872:4;15869:1;15862:15;15896:4;15893:1;15886:15;15913:194;15953:4;15973:20;15991:1;15973:20;:::i;:::-;15968:25;;16007:20;16025:1;16007:20;:::i;:::-;16002:25;;16051:1;16048;16044:9;16036:17;;16075:1;16069:4;16066:11;16063:37;;;16080:18;;:::i;:::-;16063:37;15913:194;;;;:::o;16113:410::-;16153:7;16176:20;16194:1;16176:20;:::i;:::-;16171:25;;16210:20;16228:1;16210:20;:::i;:::-;16205:25;;16265:1;16262;16258:9;16287:30;16305:11;16287:30;:::i;:::-;16276:41;;16466:1;16457:7;16453:15;16450:1;16447:22;16427:1;16420:9;16400:83;16377:139;;16496:18;;:::i;:::-;16377:139;16161:362;16113:410;;;;:::o;16529:180::-;16577:77;16574:1;16567:88;16674:4;16671:1;16664:15;16698:4;16695:1;16688:15;16715:185;16755:1;16772:20;16790:1;16772:20;:::i;:::-;16767:25;;16806:20;16824:1;16806:20;:::i;:::-;16801:25;;16845:1;16835:35;;16850:18;;:::i;:::-;16835:35;16892:1;16889;16885:9;16880:14;;16715:185;;;;:::o;16906:228::-;17046:34;17042:1;17034:6;17030:14;17023:58;17115:11;17110:2;17102:6;17098:15;17091:36;16906:228;:::o;17140:366::-;17282:3;17303:67;17367:2;17362:3;17303:67;:::i;:::-;17296:74;;17379:93;17468:3;17379:93;:::i;:::-;17497:2;17492:3;17488:12;17481:19;;17140:366;;;:::o;17512:419::-;17678:4;17716:2;17705:9;17701:18;17693:26;;17765:9;17759:4;17755:20;17751:1;17740:9;17736:17;17729:47;17793:131;17919:4;17793:131;:::i;:::-;17785:139;;17512:419;;;:::o;17937:163::-;18077:15;18073:1;18065:6;18061:14;18054:39;17937:163;:::o;18106:366::-;18248:3;18269:67;18333:2;18328:3;18269:67;:::i;:::-;18262:74;;18345:93;18434:3;18345:93;:::i;:::-;18463:2;18458:3;18454:12;18447:19;;18106:366;;;:::o;18478:419::-;18644:4;18682:2;18671:9;18667:18;18659:26;;18731:9;18725:4;18721:20;18717:1;18706:9;18702:17;18695:47;18759:131;18885:4;18759:131;:::i;:::-;18751:139;;18478:419;;;:::o;18903:178::-;19043:30;19039:1;19031:6;19027:14;19020:54;18903:178;:::o;19087:366::-;19229:3;19250:67;19314:2;19309:3;19250:67;:::i;:::-;19243:74;;19326:93;19415:3;19326:93;:::i;:::-;19444:2;19439:3;19435:12;19428:19;;19087:366;;;:::o;19459:419::-;19625:4;19663:2;19652:9;19648:18;19640:26;;19712:9;19706:4;19702:20;19698:1;19687:9;19683:17;19676:47;19740:131;19866:4;19740:131;:::i;:::-;19732:139;;19459:419;;;:::o;19884:175::-;20024:27;20020:1;20012:6;20008:14;20001:51;19884:175;:::o;20065:366::-;20207:3;20228:67;20292:2;20287:3;20228:67;:::i;:::-;20221:74;;20304:93;20393:3;20304:93;:::i;:::-;20422:2;20417:3;20413:12;20406:19;;20065:366;;;:::o;20437:419::-;20603:4;20641:2;20630:9;20626:18;20618:26;;20690:9;20684:4;20680:20;20676:1;20665:9;20661:17;20654:47;20718:131;20844:4;20718:131;:::i;:::-;20710:139;;20437:419;;;:::o;20862:104::-;20907:7;20936:24;20954:5;20936:24;:::i;:::-;20925:35;;20862:104;;;:::o;20972:138::-;21053:32;21079:5;21053:32;:::i;:::-;21046:5;21043:43;21033:71;;21100:1;21097;21090:12;21033:71;20972:138;:::o;21116:159::-;21181:5;21212:6;21206:13;21197:22;;21228:41;21263:5;21228:41;:::i;:::-;21116:159;;;;:::o;21281:679::-;21377:6;21385;21393;21442:2;21430:9;21421:7;21417:23;21413:32;21410:119;;;21448:79;;:::i;:::-;21410:119;21568:1;21593:72;21657:7;21648:6;21637:9;21633:22;21593:72;:::i;:::-;21583:82;;21539:136;21714:2;21740:64;21796:7;21787:6;21776:9;21772:22;21740:64;:::i;:::-;21730:74;;21685:129;21853:2;21879:64;21935:7;21926:6;21915:9;21911:22;21879:64;:::i;:::-;21869:74;;21824:129;21281:679;;;;;:::o;21966:180::-;22014:77;22011:1;22004:88;22111:4;22108:1;22101:15;22135:4;22132:1;22125:15;22152:191;22192:3;22211:20;22229:1;22211:20;:::i;:::-;22206:25;;22245:20;22263:1;22245:20;:::i;:::-;22240:25;;22288:1;22285;22281:9;22274:16;;22309:3;22306:1;22303:10;22300:36;;;22316:18;;:::i;:::-;22300:36;22152:191;;;;:::o;22349:235::-;22489:34;22485:1;22477:6;22473:14;22466:58;22558:18;22553:2;22545:6;22541:15;22534:43;22349:235;:::o;22590:366::-;22732:3;22753:67;22817:2;22812:3;22753:67;:::i;:::-;22746:74;;22829:93;22918:3;22829:93;:::i;:::-;22947:2;22942:3;22938:12;22931:19;;22590:366;;;:::o;22962:419::-;23128:4;23166:2;23155:9;23151:18;23143:26;;23215:9;23209:4;23205:20;23201:1;23190:9;23186:17;23179:47;23243:131;23369:4;23243:131;:::i;:::-;23235:139;;22962:419;;;:::o;23387:182::-;23527:34;23523:1;23515:6;23511:14;23504:58;23387:182;:::o;23575:366::-;23717:3;23738:67;23802:2;23797:3;23738:67;:::i;:::-;23731:74;;23814:93;23903:3;23814:93;:::i;:::-;23932:2;23927:3;23923:12;23916:19;;23575:366;;;:::o;23947:419::-;24113:4;24151:2;24140:9;24136:18;24128:26;;24200:9;24194:4;24190:20;24186:1;24175:9;24171:17;24164:47;24228:131;24354:4;24228:131;:::i;:::-;24220:139;;23947:419;;;:::o;24372:332::-;24493:4;24531:2;24520:9;24516:18;24508:26;;24544:71;24612:1;24601:9;24597:17;24588:6;24544:71;:::i;:::-;24625:72;24693:2;24682:9;24678:18;24669:6;24625:72;:::i;:::-;24372:332;;;;;:::o;24710:98::-;24761:6;24795:5;24789:12;24779:22;;24710:98;;;:::o;24814:147::-;24915:11;24952:3;24937:18;;24814:147;;;;:::o;24967:246::-;25048:1;25058:113;25072:6;25069:1;25066:13;25058:113;;;25157:1;25152:3;25148:11;25142:18;25138:1;25133:3;25129:11;25122:39;25094:2;25091:1;25087:10;25082:15;;25058:113;;;25205:1;25196:6;25191:3;25187:16;25180:27;25029:184;24967:246;;;:::o;25219:386::-;25323:3;25351:38;25383:5;25351:38;:::i;:::-;25405:88;25486:6;25481:3;25405:88;:::i;:::-;25398:95;;25502:65;25560:6;25555:3;25548:4;25541:5;25537:16;25502:65;:::i;:::-;25592:6;25587:3;25583:16;25576:23;;25327:278;25219:386;;;;:::o;25611:271::-;25741:3;25763:93;25852:3;25843:6;25763:93;:::i;:::-;25756:100;;25873:3;25866:10;;25611:271;;;;:::o;25888:116::-;25958:21;25973:5;25958:21;:::i;:::-;25951:5;25948:32;25938:60;;25994:1;25991;25984:12;25938:60;25888:116;:::o;26010:137::-;26064:5;26095:6;26089:13;26080:22;;26111:30;26135:5;26111:30;:::i;:::-;26010:137;;;;:::o;26153:345::-;26220:6;26269:2;26257:9;26248:7;26244:23;26240:32;26237:119;;;26275:79;;:::i;:::-;26237:119;26395:1;26420:61;26473:7;26464:6;26453:9;26449:22;26420:61;:::i;:::-;26410:71;;26366:125;26153:345;;;;:::o;26504:442::-;26653:4;26691:2;26680:9;26676:18;26668:26;;26704:71;26772:1;26761:9;26757:17;26748:6;26704:71;:::i;:::-;26785:72;26853:2;26842:9;26838:18;26829:6;26785:72;:::i;:::-;26867;26935:2;26924:9;26920:18;26911:6;26867:72;:::i;:::-;26504:442;;;;;;:::o;26952:103::-;27015:7;27044:5;27033:16;;26952:103;;;:::o;27061:60::-;27089:3;27110:5;27103:12;;27061:60;;;:::o;27127:194::-;27203:9;27236:79;27254:60;27263:50;27307:5;27263:50;:::i;:::-;27254:60;:::i;:::-;27236:79;:::i;:::-;27223:92;;27127:194;;;:::o;27327:183::-;27440:63;27497:5;27440:63;:::i;:::-;27435:3;27428:76;27327:183;;:::o;27516:593::-;27713:4;27751:3;27740:9;27736:19;27728:27;;27765:97;27859:1;27848:9;27844:17;27835:6;27765:97;:::i;:::-;27872:72;27940:2;27929:9;27925:18;27916:6;27872:72;:::i;:::-;27954;28022:2;28011:9;28007:18;27998:6;27954:72;:::i;:::-;28036:66;28098:2;28087:9;28083:18;28074:6;28036:66;:::i;:::-;27516:593;;;;;;;:::o;28115:136::-;28204:6;28238:5;28232:12;28222:22;;28115:136;;;:::o;28257:206::-;28378:11;28412:6;28407:3;28400:19;28452:4;28447:3;28443:14;28428:29;;28257:206;;;;:::o;28469:154::-;28558:4;28581:3;28573:11;;28611:4;28606:3;28602:14;28594:22;;28469:154;;;:::o;28629:108::-;28706:24;28724:5;28706:24;:::i;:::-;28701:3;28694:37;28629:108;;:::o;28743:99::-;28814:21;28829:5;28814:21;:::i;:::-;28809:3;28802:34;28743:99;;:::o;28900:659::-;29031:4;29026:3;29022:14;29118:4;29111:5;29107:16;29101:23;29137:63;29194:4;29189:3;29185:14;29171:12;29137:63;:::i;:::-;29046:164;29290:4;29283:5;29279:16;29273:23;29309:63;29366:4;29361:3;29357:14;29343:12;29309:63;:::i;:::-;29220:162;29466:4;29459:5;29455:16;29449:23;29485:57;29536:4;29531:3;29527:14;29513:12;29485:57;:::i;:::-;29392:160;29000:559;28900:659;;:::o;29565:267::-;29678:10;29699:90;29785:3;29777:6;29699:90;:::i;:::-;29821:4;29816:3;29812:14;29798:28;;29565:267;;;;:::o;29838:135::-;29930:4;29962;29957:3;29953:14;29945:22;;29838:135;;;:::o;30035:908::-;30198:3;30227:76;30297:5;30227:76;:::i;:::-;30319:108;30420:6;30415:3;30319:108;:::i;:::-;30312:115;;30451:78;30523:5;30451:78;:::i;:::-;30552:7;30583:1;30568:350;30593:6;30590:1;30587:13;30568:350;;;30669:6;30663:13;30696:107;30799:3;30784:13;30696:107;:::i;:::-;30689:114;;30826:82;30901:6;30826:82;:::i;:::-;30816:92;;30628:290;30615:1;30612;30608:9;30603:14;;30568:350;;;30572:14;30934:3;30927:10;;30203:740;;;30035:908;;;;:::o;30949:903::-;31248:4;31286:3;31275:9;31271:19;31263:27;;31300:71;31368:1;31357:9;31353:17;31344:6;31300:71;:::i;:::-;31381:72;31449:2;31438:9;31434:18;31425:6;31381:72;:::i;:::-;31500:9;31494:4;31490:20;31485:2;31474:9;31470:18;31463:48;31528:152;31675:4;31666:6;31528:152;:::i;:::-;31520:160;;31690:72;31758:2;31747:9;31743:18;31734:6;31690:72;:::i;:::-;31772:73;31840:3;31829:9;31825:19;31816:6;31772:73;:::i;:::-;30949:903;;;;;;;;:::o;31875:732::-;31982:5;32007:81;32023:64;32080:6;32023:64;:::i;:::-;32007:81;:::i;:::-;31998:90;;32108:5;32137:6;32130:5;32123:21;32171:4;32164:5;32160:16;32153:23;;32224:4;32216:6;32212:17;32204:6;32200:30;32253:3;32245:6;32242:15;32239:122;;;32272:79;;:::i;:::-;32239:122;32387:6;32370:231;32404:6;32399:3;32396:15;32370:231;;;32479:3;32508:48;32552:3;32540:10;32508:48;:::i;:::-;32503:3;32496:61;32586:4;32581:3;32577:14;32570:21;;32446:155;32430:4;32425:3;32421:14;32414:21;;32370:231;;;32374:21;31988:619;;31875:732;;;;;:::o;32630:385::-;32712:5;32761:3;32754:4;32746:6;32742:17;32738:27;32728:122;;32769:79;;:::i;:::-;32728:122;32879:6;32873:13;32904:105;33005:3;32997:6;32990:4;32982:6;32978:17;32904:105;:::i;:::-;32895:114;;32718:297;32630:385;;;;:::o;33021:554::-;33116:6;33165:2;33153:9;33144:7;33140:23;33136:32;33133:119;;;33171:79;;:::i;:::-;33133:119;33312:1;33301:9;33297:17;33291:24;33342:18;33334:6;33331:30;33328:117;;;33364:79;;:::i;:::-;33328:117;33469:89;33550:7;33541:6;33530:9;33526:22;33469:89;:::i;:::-;33459:99;;33262:306;33021:554;;;;:::o;33581:332::-;33702:4;33740:2;33729:9;33725:18;33717:26;;33753:71;33821:1;33810:9;33806:17;33797:6;33753:71;:::i;:::-;33834:72;33902:2;33891:9;33887:18;33878:6;33834:72;:::i;:::-;33581:332;;;;;:::o;33919:442::-;34068:4;34106:2;34095:9;34091:18;34083:26;;34119:71;34187:1;34176:9;34172:17;34163:6;34119:71;:::i;:::-;34200:72;34268:2;34257:9;34253:18;34244:6;34200:72;:::i;:::-;34282;34350:2;34339:9;34335:18;34326:6;34282:72;:::i;:::-;33919:442;;;;;;:::o;34367:::-;34516:4;34554:2;34543:9;34539:18;34531:26;;34567:71;34635:1;34624:9;34620:17;34611:6;34567:71;:::i;:::-;34648:72;34716:2;34705:9;34701:18;34692:6;34648:72;:::i;:::-;34730;34798:2;34787:9;34783:18;34774:6;34730:72;:::i;:::-;34367:442;;;;;;:::o;34815:114::-;34882:6;34916:5;34910:12;34900:22;;34815:114;;;:::o;34935:184::-;35034:11;35068:6;35063:3;35056:19;35108:4;35103:3;35099:14;35084:29;;34935:184;;;;:::o;35125:132::-;35192:4;35215:3;35207:11;;35245:4;35240:3;35236:14;35228:22;;35125:132;;;:::o;35263:179::-;35332:10;35353:46;35395:3;35387:6;35353:46;:::i;:::-;35431:4;35426:3;35422:14;35408:28;;35263:179;;;;:::o;35448:113::-;35518:4;35550;35545:3;35541:14;35533:22;;35448:113;;;:::o;35597:732::-;35716:3;35745:54;35793:5;35745:54;:::i;:::-;35815:86;35894:6;35889:3;35815:86;:::i;:::-;35808:93;;35925:56;35975:5;35925:56;:::i;:::-;36004:7;36035:1;36020:284;36045:6;36042:1;36039:13;36020:284;;;36121:6;36115:13;36148:63;36207:3;36192:13;36148:63;:::i;:::-;36141:70;;36234:60;36287:6;36234:60;:::i;:::-;36224:70;;36080:224;36067:1;36064;36060:9;36055:14;;36020:284;;;36024:14;36320:3;36313:10;;35721:608;;;35597:732;;;;:::o;36335:114::-;36402:6;36436:5;36430:12;36420:22;;36335:114;;;:::o;36455:184::-;36554:11;36588:6;36583:3;36576:19;36628:4;36623:3;36619:14;36604:29;;36455:184;;;;:::o;36645:132::-;36712:4;36735:3;36727:11;;36765:4;36760:3;36756:14;36748:22;;36645:132;;;:::o;36783:108::-;36860:24;36878:5;36860:24;:::i;:::-;36855:3;36848:37;36783:108;;:::o;36897:179::-;36966:10;36987:46;37029:3;37021:6;36987:46;:::i;:::-;37065:4;37060:3;37056:14;37042:28;;36897:179;;;;:::o;37082:113::-;37152:4;37184;37179:3;37175:14;37167:22;;37082:113;;;:::o;37231:732::-;37350:3;37379:54;37427:5;37379:54;:::i;:::-;37449:86;37528:6;37523:3;37449:86;:::i;:::-;37442:93;;37559:56;37609:5;37559:56;:::i;:::-;37638:7;37669:1;37654:284;37679:6;37676:1;37673:13;37654:284;;;37755:6;37749:13;37782:63;37841:3;37826:13;37782:63;:::i;:::-;37775:70;;37868:60;37921:6;37868:60;:::i;:::-;37858:70;;37714:224;37701:1;37698;37694:9;37689:14;;37654:284;;;37658:14;37954:3;37947:10;;37355:608;;;37231:732;;;;:::o;37969:168::-;38052:11;38086:6;38081:3;38074:19;38126:4;38121:3;38117:14;38102:29;;37969:168;;;;:::o;38143:373::-;38229:3;38257:38;38289:5;38257:38;:::i;:::-;38311:70;38374:6;38369:3;38311:70;:::i;:::-;38304:77;;38390:65;38448:6;38443:3;38436:4;38429:5;38425:16;38390:65;:::i;:::-;38480:29;38502:6;38480:29;:::i;:::-;38475:3;38471:39;38464:46;;38233:283;38143:373;;;;:::o;38522:942::-;38817:4;38855:3;38844:9;38840:19;38832:27;;38869:71;38937:1;38926:9;38922:17;38913:6;38869:71;:::i;:::-;38987:9;38981:4;38977:20;38972:2;38961:9;38957:18;38950:48;39015:108;39118:4;39109:6;39015:108;:::i;:::-;39007:116;;39170:9;39164:4;39160:20;39155:2;39144:9;39140:18;39133:48;39198:108;39301:4;39292:6;39198:108;:::i;:::-;39190:116;;39353:9;39347:4;39343:20;39338:2;39327:9;39323:18;39316:48;39381:76;39452:4;39443:6;39381:76;:::i;:::-;39373:84;;38522:942;;;;;;;:::o

Swarm Source

ipfs://e8fe3ade93c026fef7a5e2c29597c1c1207f2cad82e409bc86e2eb896883f506
Block Transaction Difficulty Gas Used Reward
Block Uncle Number Difficulty Gas Used Reward
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.