ETH Price: $3,490.30 (+4.32%)

Token

BOMB - defswap.io pooled (SHUF-BOMB)
 

Overview

Max Total Supply

28.323184425838174418 SHUF-BOMB

Holders

6

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0.516552940723308923 SHUF-BOMB

Value
$0.00
0x8ecc379c8d744142aff3ea80caf53e3e57779ebd
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Similar Match Source Code
This contract matches the deployed Bytecode of the Source Code for Contract 0x329aFB0d...6e5221D1C
The constructor portion of the code might be different and could alter the actual behaviour of the contract

Contract Name:
DefswapExchange

Compiler Version
v0.5.12+commit.7709ece9

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2019-10-22
*/

// File: contracts/interfaces/IERC20.sol

pragma solidity ^0.5.12;


interface IERC20 {
    /*
     * Metadata
     */
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint256);

    /**
     * @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 `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, 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 `sender` to `recipient` 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 sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Only used on BASE token
     */
    function transferFromWithFee(address sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Only used on BASE token
     */
    function transferWithFee(address recipient, uint256 amount) external returns (bool);

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

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

// File: contracts/interfaces/IUniswapExchange.sol

pragma solidity ^0.5.12;


interface IUniswapExchange {
    // Address of ERC20 token sold on this exchange
    function tokenAddress() external view returns (address token);
    // Address of Uniswap Factory
    function factoryAddress() external view returns (address factory);
    // Provide Liquidity
    function addLiquidity(uint256 min_liquidity, uint256 max_tokens, uint256 deadline) external payable returns (uint256);
    function removeLiquidity(uint256 amount, uint256 min_eth, uint256 min_tokens, uint256 deadline) external returns (uint256, uint256);
    // Get Prices
    function getEthToTokenInputPrice(uint256 eth_sold) external view returns (uint256 tokens_bought);
    function getEthToTokenOutputPrice(uint256 tokens_bought) external view returns (uint256 eth_sold);
    function getTokenToEthInputPrice(uint256 tokens_sold) external view returns (uint256 eth_bought);
    function getTokenToEthOutputPrice(uint256 eth_bought) external view returns (uint256 tokens_sold);
    // Trade ETH to ERC20
    function ethToTokenSwapInput(uint256 min_tokens, uint256 deadline) external payable returns (uint256  tokens_bought);
    function ethToTokenTransferInput(uint256 min_tokens, uint256 deadline, address recipient) external payable returns (uint256  tokens_bought);
    function ethToTokenSwapOutput(uint256 tokens_bought, uint256 deadline) external payable returns (uint256  eth_sold);
    function ethToTokenTransferOutput(uint256 tokens_bought, uint256 deadline, address recipient) external payable returns (uint256  eth_sold);
    // Trade ERC20 to ETH
    function tokenToEthSwapInput(uint256 tokens_sold, uint256 min_eth, uint256 deadline) external returns (uint256  eth_bought);
    function tokenToEthTransferInput(uint256 tokens_sold, uint256 min_eth, uint256 deadline, address recipient) external returns (uint256  eth_bought);
    function tokenToEthSwapOutput(uint256 eth_bought, uint256 max_tokens, uint256 deadline) external returns (uint256  tokens_sold);
    function tokenToEthTransferOutput(uint256 eth_bought, uint256 max_tokens, uint256 deadline, address recipient) external returns (uint256  tokens_sold);
    // Trade ERC20 to ERC20
    function tokenToTokenSwapInput(uint256 tokens_sold, uint256 min_tokens_bought, uint256 min_eth_bought, uint256 deadline, address token_addr) external returns (uint256  tokens_bought);
    function tokenToTokenTransferInput(uint256 tokens_sold, uint256 min_tokens_bought, uint256 min_eth_bought, uint256 deadline, address recipient, address token_addr) external returns (uint256  tokens_bought);
    function tokenToTokenSwapOutput(uint256 tokens_bought, uint256 max_tokens_sold, uint256 max_eth_sold, uint256 deadline, address token_addr) external returns (uint256  tokens_sold);
    function tokenToTokenTransferOutput(uint256 tokens_bought, uint256 max_tokens_sold, uint256 max_eth_sold, uint256 deadline, address recipient, address token_addr) external returns (uint256  tokens_sold);
    // Trade ERC20 to Custom Pool
    function tokenToExchangeSwapInput(uint256 tokens_sold, uint256 min_tokens_bought, uint256 min_eth_bought, uint256 deadline, address exchange_addr) external returns (uint256  tokens_bought);
    function tokenToExchangeTransferInput(uint256 tokens_sold, uint256 min_tokens_bought, uint256 min_eth_bought, uint256 deadline, address recipient, address exchange_addr) external returns (uint256  tokens_bought);
    function tokenToExchangeSwapOutput(uint256 tokens_bought, uint256 max_tokens_sold, uint256 max_eth_sold, uint256 deadline, address exchange_addr) external returns (uint256  tokens_sold);
    function tokenToExchangeTransferOutput(uint256 tokens_bought, uint256 max_tokens_sold, uint256 max_eth_sold, uint256 deadline, address recipient, address exchange_addr) external returns (uint256  tokens_sold);
    // ERC20 comaptibility for liquidity tokens
    function transfer(address _to, uint256 _value) external returns (bool);
    function transferFrom(address _from, address _to, uint256 value) external returns (bool);
    function approve(address _spender, uint256 _value) external returns (bool);
    function allowance(address _owner, address _spender) external view returns (uint256);
    function balanceOf(address _owner) external view returns (uint256);
    function totalSupply() external view returns (uint256);
    // Never use
    function setup(address token_addr) external;
}

// File: contracts/utils/IsContract.sol

pragma solidity ^0.5.12;


library IsContract {
    function isContract(address _addr) internal view returns (bool) {
        bytes32 codehash;
        /* solium-disable-next-line */
        assembly { codehash := extcodehash(_addr) }
        return codehash != bytes32(0) && codehash != bytes32(0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470);
    }
}

// File: contracts/interfaces/IDefswapExchange.sol

pragma solidity ^0.5.12;


interface IDefswapExchange {
    function base() external view returns (IERC20);
    function token() external view returns (IERC20);
    function addLiquidity(uint256 _tokens, uint256 _maxBase) external returns (uint256);
    function removeLiquidity(uint256 _amount, uint256 _minBase, uint256 _minTokens) external returns (uint256, uint256);
    function ethToTokenSwapInput(uint256 _minTokens) external payable returns (uint256);
    function baseToTokenSwapInput(uint256 _amount, uint256 _minTokens) external returns (uint256);
    function baseToTokenTransferInput(uint256 _amount, uint256 _minTokens, address _recipient) external returns (uint256);
    function tokenToEthSwapInput(uint256 _amount, uint256 _minEth) external returns (uint256);
    function tokenToEthTransferInput(uint256 _amount, uint256 _minEth, address _recipient) external returns (uint256);
    function tokenToEthExchangeTransferInput(uint256 _amount, uint256 _minTokens, address _recipient, address _exchangeAddr) external returns (uint256);
    function tokenToBaseSwapInput(uint256 _amount, uint256 _minBase) external returns (uint256);
    function tokenToBaseTransferInput(uint256 _amount, uint256 _minBase, address _recipient) external returns (uint256);
    function tokenToBaseExchangeTransferInput(uint256 _amount, uint256 _minTokens, address _recipient, address _exchangeAddr) external returns (uint256);
    // Uniswap exchange compat
    function ethToTokenTransferInput(uint256 _minTokens, uint256 _deadline, address _recipient) external payable returns (uint256);
}

// File: contracts/utils/ReentrancyGuard.sol

pragma solidity ^0.5.12;


/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 */
contract ReentrancyGuard {
    uint256 private _guardFlag;

    uint256 private constant FLAG_LOCK = 2;
    uint256 private constant FLAG_UNLOCK = 1;

    constructor () internal {
        // The flag starts at one to prevent changing it from zero to a non-zero
        // value, which is a more expensive operation.
        _guardFlag = FLAG_UNLOCK;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        require(_guardFlag != FLAG_LOCK, "reentrancy-guard: reentrant call");
        _guardFlag = FLAG_LOCK;
        _;
        _guardFlag = FLAG_UNLOCK;
    }
}

// File: contracts/utils/SafeMath.sol

pragma solidity ^0.5.12;


library SafeMath {
    function add(uint256 x, uint256 y) internal pure returns (uint256) {
        uint256 z = x + y;
        require(z >= x, "safemath: add overflow");
        return z;
    }

    function sub(uint256 x, uint256 y) internal pure returns (uint256) {
        require(x >= y, "safemath: sub overflow");
        return x - y;
    }

    function mul(uint256 x, uint256 y) internal pure returns (uint256) {
        if (x == 0) {
            return 0;
        }

        uint256 z = x * y;
        require(z / x == y, "safemath: mul overflow");
        return z;
    }

    function div(uint256 x, uint256 y) internal pure returns (uint256) {
        require(y != 0, "safemath: div by zero");
        return x / y;
    }

    function divRound(uint256 x, uint256 y) internal pure returns (uint256) {
        require(y != 0, "safemath: div by zero");
        uint256 z = x / y;
        if (x % y != 0) {
            z = z + 1;
        }

        return z;
    }
}

// File: contracts/commons/ERC20.sol

pragma solidity ^0.5.12;


contract ERC20 is IERC20 {
    using SafeMath for uint256;

    uint256 internal p_totalSupply;
    mapping(address => uint256) private p_balance;
    mapping(address => mapping(address => uint256)) private p_allowance;

    string private p_symbol;
    string private p_name;
    uint256 private p_decimals;

    function _setMetadata(
        string memory _symbol,
        string memory _name,
        uint256 _decimals
    ) internal {
        p_symbol = _symbol;
        p_name = _name;
        p_decimals = _decimals;
    }

    function symbol() external view returns (string memory) {
        return p_symbol;
    }

    function name() external view returns (string memory) {
        return p_name;
    }

    function decimals() external view returns (uint256) {
        return p_decimals;
    }

    function totalSupply() external view returns (uint256) {
        return p_totalSupply;
    }

    function balanceOf(address _addr) external view returns (uint256) {
        return p_balance[_addr];
    }

    function allowance(address _addr, address _spender) external view returns (uint256) {
        return p_allowance[_addr][_spender];
    }

    function approve(address _spender, uint256 _wad) external returns (bool) {
        emit Approval(msg.sender, _spender, _wad);
        p_allowance[msg.sender][_spender] = _wad;
        return true;
    }

    function transfer(address _to, uint256 _wad) external returns (bool) {
        _transfer(msg.sender, _to, _wad);
        return true;
    }

    function transferWithFee(address _to, uint256 _wad) external returns (bool) {
        _transfer(msg.sender, _to, _wad);
        return true;
    }

    function transferFrom(address _from, address _to, uint256 _wad) external returns (bool) {
        _transfer(_from, _to, _wad);
        return true;
    }

    function transferFromWithFee(address _from, address _to, uint256 _wad) external returns (bool) {
        _transfer(_from, _to, _wad);
        return true;
    }

    function _mint(
        address _to,
        uint256 _wad
    ) internal {
        p_totalSupply = p_totalSupply.add(_wad);
        p_balance[_to] = p_balance[_to].add(_wad);

        emit Transfer(address(0), _to, _wad);
    }

    function _burn(
        address _from,
        uint256 _wad
    ) internal {
        uint256 balance = p_balance[_from];
        require(balance >= _wad, "erc20: burn _from balance is not enough");
        p_balance[_from] = balance.sub(_wad);
        p_totalSupply = p_totalSupply.sub(_wad);
        emit Transfer(_from, address(0), _wad);
    }

    function _transfer(
        address _from,
        address _to,
        uint256 _wad
    ) private {
        if (msg.sender != _from) {
            uint256 t_allowance = p_allowance[_from][msg.sender];
            if (t_allowance != uint(-1)) {
                require(t_allowance >= _wad, "erc20: sender allowance is not enough");
                p_allowance[_from][msg.sender] = t_allowance.sub(_wad);
            }
        }

        uint256 fromBalance = p_balance[_from];
        require(fromBalance >= _wad, "erc20: transfer _from balance is not enough");
        p_balance[_from] = fromBalance.sub(_wad);
        p_balance[_to] = p_balance[_to].add(_wad);

        emit Transfer(_from, _to, _wad);
    }
}

// File: contracts/utils/SafeDefERC20.sol

pragma solidity ^0.5.12;


library SafeDefERC20 {
    using SafeMath for uint256;

    function safeTransfer(
        IERC20 _token,
        address _to,
        uint256 _wad
    ) internal returns (uint256) {
        uint256 prev = _token.balanceOf(address(this));

        (bool success, ) = address(_token).call(
            abi.encodeWithSelector(
                _token.transfer.selector,
                _to,
                _wad
            )
        );

        require(success, "safedeferc20: error sending tokens");
        return prev.sub(_token.balanceOf(address(this)));
    }

    function safeTransferFrom(
        IERC20 _token,
        address _from,
        address _to,
        uint256 _wad
    ) internal returns (uint256) {
        uint256 prev = _token.balanceOf(_to);

        (bool success, ) = address(_token).call(
            abi.encodeWithSelector(
                _token.transferFrom.selector,
                _from,
                _to,
                _wad
            )
        );

        require(success, "safedeferc20: error pulling tokens");
        return _token.balanceOf(_to).sub(prev);
    }
}

// File: contracts/utils/ShufUtils.sol

pragma solidity ^0.5.12;


library ShufUtils {
    using SafeMath for uint256;

    function takeFee(uint256 _a) internal pure returns (uint256) {
        if (_a == 1) {
            return 0;
        }

        uint256 fee = _a / 100;
        if (_a % 100 != 0) {
            fee = fee + 1;
        }

        return _a - (fee * 2);
    }

    function untakeFee(uint256 _a) internal pure returns (uint256) {
        if (_a == 1) {
            return 3;
        }

        uint256 aux = _a / 49;
        if (aux % 2 == 0) {
            aux = _a.add(aux);
            if (aux % 100 == 0) {
                return aux;
            } else {
                return aux.add(2);
            }
        } else {
            return _a.add(aux).add(1);
        }
    }
}

// File: contracts/DefswapExchange.sol

pragma solidity ^0.5.12;


contract DefswapExchange is IDefswapExchange, ERC20, ReentrancyGuard {
    using SafeDefERC20 for IERC20;
    using SafeMath for uint256;

    IERC20 private p_base;
    IERC20 private p_token;
    IUniswapExchange private p_uniswap;

    string private constant SYMBOL_PREFIX = "SHUF-";
    string private constant NAME_SUFIX = " - defswap.io pooled";
    uint256 private constant DECIMALS = 18;

    event AddLiquidity(
        address indexed _provider,
        uint256 _baseAmount,
        uint256 _tokenAmount,
        uint256 _minted
    );

    event RemoveLiquidity(
        address indexed _provider,
        uint256 _baseAmount,
        uint256 _tokenAmount,
        uint256 _burned,
        uint256 _type
    );

    event TokenPurchase(
        address indexed _buyer,
        uint256 _baseSold,
        uint256 _tokensBought,
        uint256 _baseReserve,
        uint256 _tokenReserve,
        address _recipient
    );

    event BasePurchase(
        address indexed _buyer,
        uint256 _tokensSold,
        uint256 _baseBought,
        uint256 _tokenReserve,
        uint256 _baseReserve,
        address _recipient
    );

    constructor(IERC20 _base, IERC20 _token, IUniswapExchange _uniswap) public {
        require(_uniswap.tokenAddress() == address(_base), "defswap: uniswap token doesn't match");
        require(address(_base) != address(_token), "defswap: token and base can't be the same");

        p_base = _base;
        p_token = _token;
        p_uniswap = _uniswap;

        approveUniswap();
        buildMetadata();
    }

    function approveUniswap() public nonReentrant {
        p_base.approve(
            address(p_uniswap),
            uint(-1)
        );
    }

    function buildMetadata() public nonReentrant {
        address token = address(p_token);
        require(gasleft() >= 402000, "defswap: gasleft build metadata is not enough");

        (
            bool successName,
            bytes memory name
        ) = token.staticcall(
            abi.encodeWithSelector(p_token.name.selector)
        );

        (
            bool successSymbol,
            bytes memory symbol
        ) = token.staticcall(
            abi.encodeWithSelector(p_token.symbol.selector)
        );

        _setMetadata(
            string(abi.encodePacked(SYMBOL_PREFIX, successSymbol ? abi.decode(symbol, (string)) : "???")),
            string(abi.encodePacked(successName ? abi.decode(name, (string)) : "Unknown", NAME_SUFIX)),
            DECIMALS
        );
    }

    function base() external view returns (IERC20) {
        return p_base;
    }

    function token() external view returns (IERC20) {
        return p_token;
    }

    function uniswap() external view returns (IUniswapExchange) {
        return p_uniswap;
    }

    function addLiquidity(
        uint256 _tokens,
        uint256 _maxBase
    ) external nonReentrant returns (uint256 minted) {
        IERC20 t_token = p_token;
        IERC20 t_base = p_base;

        // Pull tokens and store them in pool
        // received stores the real amount of received tokens
        uint256 received = t_token.safeTransferFrom(msg.sender, address(this), _tokens);
        require(received != 0, "defswap: pull zero tokens is not allowed");

        uint256 baseReceived;
        uint256 t_totalSupply = p_totalSupply;

        // Check if this is the first pool
        if (t_totalSupply == 0) {
            // Pull all _maxBase and mint received
            require(t_base.transferFrom(msg.sender, address(this), _maxBase), "defswap: error pulling base tokens");
            baseReceived = ShufUtils.takeFee(_maxBase);
            minted = baseReceived;
        } else {
            // Calculate required pull, following current pool rate
            uint256 tokenReserve = t_token.balanceOf(address(this)).sub(received);
            uint256 baseReserve = t_base.balanceOf(address(this));
            uint256 requiredPull = received.mul(baseReserve).divRound(tokenReserve);

            // Pull tokens after untaking fee
            baseReceived = t_base.safeTransferFrom(msg.sender, address(this), ShufUtils.untakeFee(requiredPull));
            require(baseReceived <= _maxBase, "defswap: _maxBase is below of pulled required");
            require(baseReceived >= requiredPull, "defswap: pulled base is not enough");

            // Mint proportional tokens
            minted = baseReceived.mul(t_totalSupply).div(baseReserve);
        }

        // Mint tokens and event
        emit AddLiquidity(msg.sender, baseReceived, received, minted);
        _mint(msg.sender, minted);
    }

    function removeLiquidity(
        uint256 _amount,
        uint256 _minBase,
        uint256 _minTokens
    ) external nonReentrant returns (
        uint256 baseAmount,
        uint256 tokenAmount
    ) {
        // Load totalSupply and check that it's not zero
        uint256 t_totalSupply = p_totalSupply;
        require(t_totalSupply != 0, "defswap: pool is empty");

        // Load token contracts
        IERC20 t_token = p_token;
        IERC20 t_base = p_base;

        // Load token reserves
        uint256 tokenReserve = t_token.balanceOf(address(this));
        uint256 baseReserve = t_base.balanceOf(address(this));

        // Calculate base and tokens to withdraw
        baseAmount = _amount.mul(baseReserve) / t_totalSupply;
        tokenAmount = _amount.mul(tokenReserve) / t_totalSupply;

        // Emit event and remove burn tokens from sender
        emit RemoveLiquidity(msg.sender, baseAmount, tokenAmount, _amount, 0);
        _burn(msg.sender, _amount);

        // Check if taken base if above _minBase
        require(baseAmount >= _minBase, "defswap: baseAmount is below _minBase");

        // Transfer tokens and base
        require(t_token.safeTransfer(msg.sender, tokenAmount) >= _minTokens, "defswap: tokenAmount is below _minTokens");
        t_base.transferWithFee(msg.sender, baseAmount); // t_base is trusted
    }

    function removeBaseLiquidity(
        uint256 _amount,
        uint256 _minBase
    ) external nonReentrant returns (
        uint256 baseAmount
    ) {
        // Load totalSupply and check that it's not zero
        uint256 t_totalSupply = p_totalSupply;
        require(t_totalSupply != 0, "defswap: pool is empty");

        // Load token contract
        IERC20 t_base = p_base;

        // Load base reserve
        uint256 baseReserve = t_base.balanceOf(address(this));

        // Calculate base to withdraw
        baseAmount = _amount.mul(baseReserve) / t_totalSupply;

        // Burn tokens and emit event
        // it burns the full _amount
        emit RemoveLiquidity(msg.sender, baseAmount, 0, _amount, 1);
        _burn(msg.sender, _amount);

        // Check if withdraw base is above _minBase and transfer tokens
        require(baseAmount >= _minBase, "defswap: baseAmount is below _minBase");
        t_base.transferWithFee(msg.sender, baseAmount); // t_base is trusted
    }

    function removeTokenLiquidity(
        uint256 _amount,
        uint256 _minTokens
    ) external nonReentrant returns (
        uint256 tokenAmount
    ) {
        // Load totalSupply and check that it's not zero
        uint256 t_totalSupply = p_totalSupply;
        require(t_totalSupply != 0, "defswap: pool is empty");

        // Load token contract
        IERC20 t_token = p_token;

        // Load token reserve
        uint256 tokenReserve = t_token.balanceOf(address(this));

        // Calculate token to withdraw
        tokenAmount = _amount.mul(tokenReserve) / t_totalSupply;

        // Burn tokens and emit event
        // it burns the full _amount
        emit RemoveLiquidity(msg.sender, 0, tokenAmount, _amount, 2);
        _burn(msg.sender, _amount);

        // Transfer tokens and check if withdrawn amount is above _minTokens
        require(t_token.safeTransfer(msg.sender, tokenAmount) >= _minTokens, "defswap: tokenAmount is below _minTokens");
    }

    function getBaseToTokenPrice(uint256 _baseSold) external view returns (uint256 tokensBought) {
        tokensBought = _getInputPrice(
            _baseSold,
            p_base.balanceOf(address(this)),
            p_token.balanceOf(address(this))
        );
    }

    function getTokenToBasePrice(uint256 _tokenSold) external view returns (uint256 baseBought) {
        baseBought = _getInputPrice(
            _tokenSold,
            p_token.balanceOf(address(this)),
            p_base.balanceOf(address(this))
        );
    }

    function ethToTokenSwapInput(
        uint256 _minTokens
    ) external nonReentrant payable returns (uint256 bought) {
        // Trade ETH -> BASE, only if msg.value is not zero
        uint256 baseBought = msg.value != 0 ? ShufUtils.takeFee(
            p_uniswap.ethToTokenSwapInput.value(msg.value)(1, uint(-1))
        ) : 0;

        // Trade BASE -> TOKEN, and transfer to sender
        bought = _baseToToken(
            p_base,     // Base address
            p_token,    // Token address
            baseBought, // Base bought on trade ETH -> BASE
            _minTokens, // Min base to receive
            msg.sender, // Origin of the trade
            msg.sender  // Recipient of the tokens
        );
    }

    // Uniswap exchange compat
    function ethToTokenTransferInput(
        uint256 _minTokens,
        uint256 _deadline,
        address _recipient
    ) external nonReentrant payable returns (uint256 bought) {
        // Check if _deadile was exceeded
        require(_deadline >= block.timestamp, "defswap: expired transaction");

        // Trade ETH -> BASE, only if msg.value is not zero
        uint256 baseBought = msg.value != 0 ? ShufUtils.takeFee(
            p_uniswap.ethToTokenSwapInput.value(msg.value)(1, uint(-1))
        ) : 0;

        // Trade BASE -> TOKEN, and transfer to _recipient
        bought = _baseToToken(
            p_base,     // Base address
            p_token,    // Token address
            baseBought, // Base bought on trade ETH -> BASE
            _minTokens, // Min base to receive
            msg.sender, // Origin of the trade
            _recipient  // Recipient of the tokens
        );
    }

    function baseToTokenSwapInput(
        uint256 _amount,
        uint256 _minTokens
    ) external nonReentrant returns (uint256 bought) {
        // Load base contract
        IERC20 t_base = p_base;

        // Transfer base from msg.sender to this
        t_base.transferFromWithFee(msg.sender, address(this), _amount);
        // real received has to take into account the transfer fee
        uint256 received = ShufUtils.takeFee(_amount);

        // Trade BASE -> TOKEN, and transfer to msg.sender
        bought = _baseToToken(
            t_base,     // Base address (already loaded)
            p_token,    // Token address
            received,   // Base received from msg.sender
            _minTokens, // Min tokens to buy
            msg.sender, // Origin of the trade
            msg.sender  // Recipient of the tokens
        );
    }

    function baseToTokenTransferInput(
        uint256 _amount,
        uint256 _minTokens,
        address _recipient
    ) external nonReentrant returns (uint256 bought) {
        // Load base contract
        IERC20 t_base = p_base;

        // Transfer base from msg.sender to this
        t_base.transferFromWithFee(msg.sender, address(this), _amount);
        // real received has to take into account the transfer fee
        uint256 received = ShufUtils.takeFee(_amount);

        // Trade BASE -> TOKEN, and transfer to msg.sender
        bought = _baseToToken(
            t_base,     // Base address (already loaded)
            p_token,    // Token address
            received,   // Base received from msg.sender
            _minTokens, // Min tokens to buy
            msg.sender, // Origin of the trade
            _recipient  // Recipient of the tokens
        );
    }

    function tokenToEthSwapInput(
        uint256 _amount,
        uint256 _minEth
    ) external nonReentrant returns (uint256 bought) {
        // Load token contract from storage
        IERC20 t_token = p_token;

        // Transfer tokens from sender to this
        // and store the real amount of received tokens
        uint256 received = t_token.safeTransferFrom(msg.sender, address(this), _amount);

        // Convert TOKEN -> BASE and send base to this
        // to later be converted into ETH
        uint256 baseBought = ShufUtils.takeFee(
            _tokenToBase(
                p_base,       // Base address (already loaded)
                t_token,      // Token address (already loaded)
                received,     // Received tokens from msg.sender
                0,            // Min base to buy (zero, will check the final result)
                msg.sender,   // Origin of the trade
                address(this) // Recipent of the base (self)
            )
        );

        // Convert BASE -> ETH if baseBought is not zero
        bought = baseBought != 0 ? p_uniswap.tokenToEthTransferInput(
            baseBought, // Base amount to convert
            1,          // Min ETH to buy (1, will check later using require)
            uint(-1),   // Trade expiration (never)
            msg.sender  // Recipent of the ETH
        ) : 0;

        // Check if bought ETH is above _minEth
        require(bought >= _minEth, "defswap: eth bought is below _minEth");
    }

    function tokenToEthTransferInput(
        uint256 _amount,
        uint256 _minEth,
        address _recipient
    ) external nonReentrant returns (uint256 bought) {
        // Load token contract from storage
        IERC20 t_token = p_token;

        // Transfer tokens from sender to this
        // and store the real amount of received tokens
        uint256 received = t_token.safeTransferFrom(msg.sender, address(this), _amount);

        // Convert TOKEN -> BASE and send base to this
        // to later be converted into ETH
        uint256 baseBought = ShufUtils.takeFee(
            _tokenToBase(
                p_base,       // Base address (already loaded)
                t_token,      // Token address (already loaded)
                received,     // Received tokens from msg.sender
                0,            // Min base to buy (zero, will check the final result)
                msg.sender,   // Origin of the trade
                address(this) // Recipent of the base (self)
            )
        );

        // Convert BASE -> ETH if baseBought is not zero
        bought = baseBought != 0 ? p_uniswap.tokenToEthTransferInput(
            baseBought, // Base amount to convert
            1,          // Min ETH to buy (1, will check later using require)
            uint(-1),   // Trade expiration (never)
            _recipient  // Recipent of the ETH
        ) : 0;

        // Check if bought ETH is above _minEth
        require(bought >= _minEth, "defswap: eth bought is below _minEth");
    }

    function tokenToEthExchangeTransferInput(
        uint256 _amount,
        uint256 _minTokens,
        address _recipient,
        address _exchangeAddr
    ) external nonReentrant returns (uint256 bought) {
        // Load token contract from storage
        IERC20 t_token = p_token;

        // Transfer tokens from sender to this
        // and store the real amount of received tokens
        uint256 received = t_token.safeTransferFrom(msg.sender, address(this), _amount);

        // Convert TOKEN -> BASE and send base to this
        // to later be converted into ETH
        uint256 baseBought = ShufUtils.takeFee(
            _tokenToBase(
                p_base,       // Base address (already loaded)
                t_token,      // Token address (already loaded)
                received,     // Received tokens from msg.sender
                0,            // Min base to buy (zero, will check the final result)
                msg.sender,   // Origin of the trade
                address(this) // Recipent of the base (self)
            )
        );

        // Convert BASE -> ETH if baseBought is not zero
        // and transfer to self
        uint256 ethBought = baseBought != 0 ? p_uniswap.tokenToEthSwapInput(
            baseBought, // Base amount to sell
            1,          // Min ETH to buy (1, will be check later)
            uint(-1)    // Trade expiration (never)
        ) : 0;

        // Convert ETH -> TOKEN if ethBought is not zero
        bought = ethBought != 0 ? IUniswapExchange(_exchangeAddr).ethToTokenTransferInput.value(
            ethBought   // ETH to sell
        )(
            1,          // Min token buy (1, will check later)
            uint(-1),   // Trade expiration (never)
            _recipient  // Recipient of the tokens
        ) : 0;

        // Check if bought tokens is above _minTokens
        // _exchangeAddr is considered trusted and it may never have transfered
        // the ETH to the _recipient, this code trusts the return value of _exchangeAddr.ethToTokenTransferInput
        require(bought >= _minTokens, "defswap: tokens bought is below _minTokens");
    }

    function tokenToBaseSwapInput(
        uint256 _amount,
        uint256 _minBase
    ) external nonReentrant returns (uint256 bought) {
        // Load token contract from storage
        IERC20 t_token = p_token;

        // Transfer tokens from sender to this
        // and store the real amount of received tokens
        uint256 received = t_token.safeTransferFrom(msg.sender, address(this), _amount);

        // Convert TOKEN -> BASE and send base to msg.sender
        bought = _tokenToBase(
            p_base,     // Base address (already loaded)
            t_token,    // Token address (already loaded)
            received,   // Tokens to sell (received from msg.sender)
            _minBase,   // Min base to buy
            msg.sender, // Origin of the trade
            msg.sender  // Recipient of the base
        );
    }

    function tokenToBaseTransferInput(
        uint256 _amount,
        uint256 _minBase,
        address _recipient
    ) external nonReentrant returns (uint256 bought) {
        // Load token contract from storage
        IERC20 t_token = p_token;

        // Transfer tokens from sender to this
        // and store the real amount of received tokens
        uint256 received = t_token.safeTransferFrom(msg.sender, address(this), _amount);

        // Convert TOKEN -> BASE and send base to _recipient
        bought = _tokenToBase(
            p_base,     // Base address (already loaded)
            t_token,    // Token address (already loaded)
            received,   // Tokens to sell (received from msg.sender)
            _minBase,   // Min base to buy
            msg.sender, // Origin of the trade
            _recipient  // Recipient of the base
        );
    }

    function tokenToBaseExchangeTransferInput(
        uint256 _amount,
        uint256 _minTokens,
        address _recipient,
        address _exchangeAddr
    ) external nonReentrant returns (uint256 bought) {
        // _exchangeAddr can't be uniswap
        // because that would remove the Uniswap approve made during the exchange creation
        require(_exchangeAddr != address(p_uniswap), "defswap: _exchange can't be Uniswap");

        // Load contracts from storage
        IERC20 t_token = p_token;
        IERC20 t_base = p_base;

        // Transfer tokens from sender to this
        // and store the real amount of received tokens
        uint256 received = t_token.safeTransferFrom(msg.sender, address(this), _amount);

        // Load token and base reserves
        uint256 tokenReserve = t_token.balanceOf(address(this)).sub(received);
        uint256 baseReserve = t_base.balanceOf(address(this));

        // Calculate baseBought, the trade it's not executed to avoid charging the transfer fee twice
        // this represents TOKEN_A -> BASE
        uint256 baseBought = _getInputPrice(received, tokenReserve, baseReserve);
        emit BasePurchase(msg.sender, received, baseBought, tokenReserve, baseReserve, _exchangeAddr);

        // Trade BASE -> TOKEN_B, using base baseBought with TOKEN_A
        // the exchange is approve to withdraw `baseBought` and the approve is removed after
        // the trade, _exchangeAddr can't exploit the temporal reserve ratio because of the reentrancy lock
        t_base.approve(_exchangeAddr, baseBought);
        bought = IDefswapExchange(_exchangeAddr).baseToTokenTransferInput(
            baseBought, // BASE tokens to sell
            _minTokens, // Min TOKEN_B to buy
            _recipient  // Recipeint of token b
        );

        // Always remove the approve after the trade
        t_base.approve(_exchangeAddr, 0);
    }

    function _getInputPrice(
        uint256 _inputAmount,
        uint256 _inputReserve,
        uint256 _outputReserve
    ) private pure returns (uint256) {
        require(_inputReserve != 0 && _outputReserve != 0, "defswap: one reserve is empty");
        uint256 inputAmountWithFee = _inputAmount.mul(997);
        uint256 numerator = inputAmountWithFee.mul(_outputReserve);
        uint256 denominator = _inputReserve.mul(1000).add(inputAmountWithFee);
        return numerator / denominator;
    }

    function _baseToToken(
        IERC20 t_base,
        IERC20 t_token,
        uint256 _amount,
        uint256 _minTokens,
        address _buyer,
        address _recipient
    ) private returns (uint256 tokensBought) {
        // Load base and token reserves
        uint256 tokenReserve = t_token.balanceOf(address(this));
        uint256 baseReserve = t_base.balanceOf(address(this)).sub(_amount);

        // Calculate tokens bought
        tokensBought = _getInputPrice(_amount, baseReserve, tokenReserve);

        // Check if tokens bought is above _minTokens and execute transfer
        require(tokensBought >= _minTokens, "defswap: bought tokens below _minTokens");
        require(t_token.safeTransfer(_recipient, tokensBought) != 0 || tokensBought == 0, "defswap: error sending tokens");

        emit TokenPurchase(_buyer, _amount, tokensBought, baseReserve, tokenReserve, _recipient);
    }

    function _tokenToBase(
        IERC20 t_base,
        IERC20 t_token,
        uint256 _amount,
        uint256 _minBase,
        address _buyer,
        address _recipient
    ) private returns (uint256 baseBought) {
        // Load base and token reserves
        uint256 tokenReserve = t_token.balanceOf(address(this)).sub(_amount);
        uint256 baseReserve = t_base.balanceOf(address(this));

        // Calculate base bought
        baseBought = _getInputPrice(_amount, tokenReserve, baseReserve);

        // Check if base bought is above _minBase and execute transfer
        require(baseBought >= _minBase, "defswap: bought base below _minBase");
        t_base.transferWithFee(_recipient, baseBought);

        emit BasePurchase(_buyer, _amount, baseBought, tokenReserve, baseReserve, _recipient);
    }

    function() external payable {
        // Revert if an EOA send's ETH
        require(msg.sender != tx.origin, "defswap: ETH rejected");
    }
}

// File: contracts/DefswapFactory.sol

pragma solidity ^0.5.12;


contract DefswapFactory {
    using IsContract for address;

    IUniswapExchange public uniswap;
    IERC20 public base;

    event CreatedExchange(address indexed _token, address indexed _exchange);

    address[] private p_tokens;
    mapping(address => address) public tokenToExchange;
    mapping(address => address) public exchangeToToken;

    constructor(IERC20 _base, IUniswapExchange _uniswap) public {
        require(_uniswap.tokenAddress() == address(_base), "defswap-factory: uniswap token doesn't match");

        base = _base;
        uniswap = _uniswap;
    }

    function getToken(uint256 _i) external view returns (address) {
        require(_i < p_tokens.length, "defswap-factory: array out of bounds");
        return p_tokens[_i];
    }

    function getExchange(uint256 _i) external view returns (address) {
        require(_i < p_tokens.length, "defswap-factory: array out of bounds");
        return tokenToExchange[p_tokens[_i]];
    }

    function createExchange(address _token) external returns (address exchange) {
        require(tokenToExchange[_token] == address(0), "defswap-factory: exchange already exists");
        require(_token.isContract(), "defswap-factory: _token has to be a contract");

        exchange = address(
            new DefswapExchange(
                base,
                IERC20(_token),
                uniswap
            )
        );

        emit CreatedExchange(_token, exchange);

        tokenToExchange[_token] = exchange;
        exchangeToToken[exchange] = _token;
        p_tokens.push(_token);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"contract IERC20","name":"_base","type":"address"},{"internalType":"contract IERC20","name":"_token","type":"address"},{"internalType":"contract IUniswapExchange","name":"_uniswap","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_provider","type":"address"},{"indexed":false,"internalType":"uint256","name":"_baseAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_tokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_minted","type":"uint256"}],"name":"AddLiquidity","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"_tokensSold","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_baseBought","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_tokenReserve","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_baseReserve","type":"uint256"},{"indexed":false,"internalType":"address","name":"_recipient","type":"address"}],"name":"BasePurchase","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_provider","type":"address"},{"indexed":false,"internalType":"uint256","name":"_baseAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_tokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_burned","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_type","type":"uint256"}],"name":"RemoveLiquidity","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"_baseSold","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_tokensBought","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_baseReserve","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_tokenReserve","type":"uint256"},{"indexed":false,"internalType":"address","name":"_recipient","type":"address"}],"name":"TokenPurchase","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_tokens","type":"uint256"},{"internalType":"uint256","name":"_maxBase","type":"uint256"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"minted","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"address","name":"_spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_wad","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"approveUniswap","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"base","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_minTokens","type":"uint256"}],"name":"baseToTokenSwapInput","outputs":[{"internalType":"uint256","name":"bought","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_minTokens","type":"uint256"},{"internalType":"address","name":"_recipient","type":"address"}],"name":"baseToTokenTransferInput","outputs":[{"internalType":"uint256","name":"bought","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"buildMetadata","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_minTokens","type":"uint256"}],"name":"ethToTokenSwapInput","outputs":[{"internalType":"uint256","name":"bought","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_minTokens","type":"uint256"},{"internalType":"uint256","name":"_deadline","type":"uint256"},{"internalType":"address","name":"_recipient","type":"address"}],"name":"ethToTokenTransferInput","outputs":[{"internalType":"uint256","name":"bought","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_baseSold","type":"uint256"}],"name":"getBaseToTokenPrice","outputs":[{"internalType":"uint256","name":"tokensBought","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_tokenSold","type":"uint256"}],"name":"getTokenToBasePrice","outputs":[{"internalType":"uint256","name":"baseBought","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_minBase","type":"uint256"}],"name":"removeBaseLiquidity","outputs":[{"internalType":"uint256","name":"baseAmount","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_minBase","type":"uint256"},{"internalType":"uint256","name":"_minTokens","type":"uint256"}],"name":"removeLiquidity","outputs":[{"internalType":"uint256","name":"baseAmount","type":"uint256"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_minTokens","type":"uint256"}],"name":"removeTokenLiquidity","outputs":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_minTokens","type":"uint256"},{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"address","name":"_exchangeAddr","type":"address"}],"name":"tokenToBaseExchangeTransferInput","outputs":[{"internalType":"uint256","name":"bought","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_minBase","type":"uint256"}],"name":"tokenToBaseSwapInput","outputs":[{"internalType":"uint256","name":"bought","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_minBase","type":"uint256"},{"internalType":"address","name":"_recipient","type":"address"}],"name":"tokenToBaseTransferInput","outputs":[{"internalType":"uint256","name":"bought","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_minTokens","type":"uint256"},{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"address","name":"_exchangeAddr","type":"address"}],"name":"tokenToEthExchangeTransferInput","outputs":[{"internalType":"uint256","name":"bought","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_minEth","type":"uint256"}],"name":"tokenToEthSwapInput","outputs":[{"internalType":"uint256","name":"bought","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_minEth","type":"uint256"},{"internalType":"address","name":"_recipient","type":"address"}],"name":"tokenToEthTransferInput","outputs":[{"internalType":"uint256","name":"bought","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_wad","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_wad","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_wad","type":"uint256"}],"name":"transferFromWithFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_wad","type":"uint256"}],"name":"transferWithFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"uniswap","outputs":[{"internalType":"contract IUniswapExchange","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b50604051620049fe380380620049fe833981810160405260608110156200003757600080fd5b508051602080830151604093840151600160065584517f9d76ea5800000000000000000000000000000000000000000000000000000000815294519394919390926001600160a01b038087169390851692639d76ea5892600480840193919291829003018186803b158015620000ac57600080fd5b505afa158015620000c1573d6000803e3d6000fd5b505050506040513d6020811015620000d857600080fd5b50516001600160a01b0316146200013b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180620049da6024913960400191505060405180910390fd5b816001600160a01b0316836001600160a01b03161415620001a8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180620049916029913960400191505060405180910390fd5b600780546001600160a01b038086166001600160a01b031992831617909255600880548584169083161790556009805492841692909116919091179055620001f86001600160e01b036200021416565b6200020b6001600160e01b036200032416565b50505062000ab6565b600260065414156200027657604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482018190526024820152600080516020620049ba833981519152604482015290519081900360640190fd5b6002600655600754600954604080517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b03928316600482015260001960248201529051919092169163095ea7b39160448083019260209291908290030181600087803b158015620002ef57600080fd5b505af115801562000304573d6000803e3d6000fd5b505050506040513d60208110156200031b57600080fd5b50506001600655565b600260065414156200038657604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482018190526024820152600080516020620049ba833981519152604482015290519081900360640190fd5b60026006556008546001600160a01b0316620622505a1015620003f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d81526020018062004964602d913960400191505060405180910390fd5b60408051600481526024810182526020810180516001600160e01b03167f06fdde0300000000000000000000000000000000000000000000000000000000178152915181516000936060936001600160a01b038716939092909182918083835b60208310620004765780518252601f19909201916020918201910162000455565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855afa9150503d8060008114620004d8576040519150601f19603f3d011682016040523d82523d6000602084013e620004dd565b606091505b5060408051600481526024810182526020810180516001600160e01b03167f95d89b4100000000000000000000000000000000000000000000000000000000178152915181519496509294506000936060936001600160a01b0389169390918291908083835b60208310620005645780518252601f19909201916020918201910162000543565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855afa9150503d8060008114620005c6576040519150601f19603f3d011682016040523d82523d6000602084013e620005cb565b606091505b5091509150620009d26040518060400160405280600581526020017f534855462d000000000000000000000000000000000000000000000000000000815250836200064c576040518060400160405280600381526020017f3f3f3f000000000000000000000000000000000000000000000000000000000081525062000719565b8280602001905160208110156200066257600080fd5b81019080805160405193929190846401000000008211156200068357600080fd5b9083019060208201858111156200069957600080fd5b8251640100000000811182820188101715620006b457600080fd5b82525081516020918201929091019080838360005b83811015620006e3578181015183820152602001620006c9565b50505050905090810190601f168015620007115780820380516001836020036101000a031916815260200191505b506040525050505b6040516020018083805190602001908083835b602083106200074d5780518252601f1990920191602091820191016200072c565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b60208310620007975780518252601f19909201916020918201910162000776565b6001836020036101000a03801982511681845116808217855250505050505090500192505050604051602081830303815290604052856200080e576040518060400160405280600781526020017f556e6b6e6f776e00000000000000000000000000000000000000000000000000815250620008db565b8480602001905160208110156200082457600080fd5b81019080805160405193929190846401000000008211156200084557600080fd5b9083019060208201858111156200085b57600080fd5b82516401000000008111828201881017156200087657600080fd5b82525081516020918201929091019080838360005b83811015620008a55781810151838201526020016200088b565b50505050905090810190601f168015620008d35780820380516001836020036101000a031916815260200191505b506040525050505b6040518060400160405280601481526020017f202d20646566737761702e696f20706f6f6c65640000000000000000000000008152506040516020018083805190602001908083835b60208310620009455780518252601f19909201916020918201910162000924565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b602083106200098f5780518252601f1990920191602091820191016200096e565b6001836020036101000a038019825116818451168082178552505050505050905001925050506040516020818303038152906040526012620009de60201b60201c565b50506001600655505050565b8251620009f390600390602086019062000a11565b50815162000a0990600490602085019062000a11565b506005555050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1062000a5457805160ff191683800117855562000a84565b8280016001018555821562000a84579182015b8281111562000a8457825182559160200191906001019062000a67565b5062000a9292915062000a96565b5090565b62000ab391905b8082111562000a92576000815560010162000a9d565b90565b613e9e8062000ac66000396000f3fe6080604052600436106101e35760003560e01c806395d89b4111610102578063d38d702911610095578063ea5d5a9211610064578063ea5d5a921461076e578063ecdf2b5914610783578063f5700fdd146107ca578063fc0c546a14610811576101e3565b8063d38d7029146106af578063d5457baf146106ee578063dd62ed3e14610703578063def5e98d1461073e576101e3565b8063ae33a99b116100d1578063ae33a99b146105f3578063bc18f21814610623578063c5d14d3914610653578063c74825e414610692576101e3565b806395d89b411461057c5780639cd441da14610591578063a9059cbb146102bc578063ad65d76d146105c1576101e3565b80633df3cc0c1161017a57806370a082311161014957806370a08231146104ca5780637ea9c5e3146104fd578063857620e11461052d57806389f3546814610369576101e3565b80633df3cc0c146104225780634f48da091461044c5780635001f3b51461047657806367511f481461048b576101e3565b806323b872dd116101b657806323b872dd146103695780632681f7e4146103ac578063313ce567146103dd5780633868e1f4146103f2576101e3565b806306fdde031461023257806308acece2146102bc578063095ea7b31461030957806318160ddd14610342575b33321415610230576040805162461bcd60e51b81526020600482015260156024820152741919599cddd85c0e88115512081c995a9958dd1959605a1b604482015290519081900360640190fd5b005b34801561023e57600080fd5b50610247610826565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610281578181015183820152602001610269565b50505050905090810190601f1680156102ae5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156102c857600080fd5b506102f5600480360360408110156102df57600080fd5b506001600160a01b0381351690602001356108bd565b604080519115158252519081900360200190f35b34801561031557600080fd5b506102f56004803603604081101561032c57600080fd5b506001600160a01b0381351690602001356108d4565b34801561034e57600080fd5b50610357610946565b60408051918252519081900360200190f35b34801561037557600080fd5b506102f56004803603606081101561038c57600080fd5b506001600160a01b0381358116916020810135909116906040013561094c565b3480156103b857600080fd5b506103c1610963565b604080516001600160a01b039092168252519081900360200190f35b3480156103e957600080fd5b50610357610972565b3480156103fe57600080fd5b506103576004803603604081101561041557600080fd5b5080359060200135610978565b34801561042e57600080fd5b506103576004803603602081101561044557600080fd5b5035610bcd565b34801561045857600080fd5b506103576004803603602081101561046f57600080fd5b5035610cc9565b34801561048257600080fd5b506103c1610d94565b34801561049757600080fd5b50610357600480360360608110156104ae57600080fd5b50803590602081013590604001356001600160a01b0316610da3565b3480156104d657600080fd5b50610357600480360360208110156104ed57600080fd5b50356001600160a01b0316610e3c565b34801561050957600080fd5b506103576004803603604081101561052057600080fd5b5080359060200135610e5b565b34801561053957600080fd5b506105636004803603606081101561055057600080fd5b5080359060208101359060400135610ef3565b6040805192835260208301919091528051918290030190f35b34801561058857600080fd5b50610247611241565b34801561059d57600080fd5b50610357600480360360408110156105b457600080fd5b50803590602001356112a2565b610357600480360360608110156105d757600080fd5b50803590602081013590604001356001600160a01b0316611677565b3480156105ff57600080fd5b506103576004803603604081101561061657600080fd5b50803590602001356117d5565b34801561062f57600080fd5b506103576004803603604081101561064657600080fd5b50803590602001356119c8565b34801561065f57600080fd5b506103576004803603606081101561067657600080fd5b50803590602081013590604001356001600160a01b0316611b3d565b610357600480360360208110156106a857600080fd5b5035611c3b565b3480156106bb57600080fd5b50610357600480360360608110156106d257600080fd5b50803590602081013590604001356001600160a01b0316611d1e565b3480156106fa57600080fd5b50610230611e9f565b34801561070f57600080fd5b506103576004803603604081101561072657600080fd5b506001600160a01b0381358116916020013516611f77565b34801561074a57600080fd5b506103576004803603604081101561076157600080fd5b5080359060200135611fa2565b34801561077a57600080fd5b506102306120a0565b34801561078f57600080fd5b50610357600480360360808110156107a657600080fd5b508035906020810135906001600160a01b0360408201358116916060013516612675565b3480156107d657600080fd5b50610357600480360360808110156107ed57600080fd5b508035906020810135906001600160a01b0360408201358116916060013516612a20565b34801561081d57600080fd5b506103c1612c35565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156108b25780601f10610887576101008083540402835291602001916108b2565b820191906000526020600020905b81548152906001019060200180831161089557829003601f168201915b505050505090505b90565b60006108ca338484612c44565b5060015b92915050565b6040805182815290516000916001600160a01b0385169133917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925919081900360200190a3503360009081526002602090815260408083206001600160a01b039590951683529390529190912055600190565b60005490565b6000610959848484612c44565b5060019392505050565b6009546001600160a01b031690565b60055490565b6000600260065414156109c0576040805162461bcd60e51b81526020600482018190526024820152600080516020613df8833981519152604482015290519081900360640190fd5b600260065560005480610a13576040805162461bcd60e51b8152602060048201526016602482015275646566737761703a20706f6f6c20697320656d70747960501b604482015290519081900360640190fd5b600754604080516370a0823160e01b815230600482015290516001600160a01b039092169160009183916370a0823191602480820192602092909190829003018186803b158015610a6357600080fd5b505afa158015610a77573d6000803e3d6000fd5b505050506040513d6020811015610a8d57600080fd5b5051905082610aa2878363ffffffff612df116565b81610aa957fe5b60408051929091048083526000602084015282820189905260016060840152905190955033917f0c7095efab4844307a2d270e6feda743289e3f8bd8a4fa71bc0006ef39bb7793919081900360800190a2610b043387612e60565b84841015610b435760405162461bcd60e51b8152600401808060200182810382526025815260200180613be36025913960400191505060405180910390fd5b60408051630456767160e11b81523360048201526024810186905290516001600160a01b038416916308acece29160448083019260209291908290030181600087803b158015610b9257600080fd5b505af1158015610ba6573d6000803e3d6000fd5b505050506040513d6020811015610bbc57600080fd5b505060016006555091949350505050565b600754604080516370a0823160e01b815230600482015290516000926108ce9285926001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015610c2157600080fd5b505afa158015610c35573d6000803e3d6000fd5b505050506040513d6020811015610c4b57600080fd5b5051600854604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015610c9857600080fd5b505afa158015610cac573d6000803e3d6000fd5b505050506040513d6020811015610cc257600080fd5b5051612f3e565b600854604080516370a0823160e01b815230600482015290516000926108ce9285926001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015610d1d57600080fd5b505afa158015610d31573d6000803e3d6000fd5b505050506040513d6020811015610d4757600080fd5b5051600754604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015610c9857600080fd5b6007546001600160a01b031690565b600060026006541415610deb576040805162461bcd60e51b81526020600482018190526024820152600080516020613df8833981519152604482015290519081900360640190fd5b60026006556008546001600160a01b03166000610e108233308963ffffffff61300416565b600754909150610e2d906001600160a01b0316838388338961321a565b60016006559695505050505050565b6001600160a01b0381166000908152600160205260409020545b919050565b600060026006541415610ea3576040805162461bcd60e51b81526020600482018190526024820152600080516020613df8833981519152604482015290519081900360640190fd5b60026006556008546001600160a01b03166000610ec88233308863ffffffff61300416565b600754909150610ee5906001600160a01b0316838387338061321a565b600160065595945050505050565b60008060026006541415610f3c576040805162461bcd60e51b81526020600482018190526024820152600080516020613df8833981519152604482015290519081900360640190fd5b600260065560005480610f8f576040805162461bcd60e51b8152602060048201526016602482015275646566737761703a20706f6f6c20697320656d70747960501b604482015290519081900360640190fd5b600854600754604080516370a0823160e01b815230600482015290516001600160a01b03938416939092169160009184916370a0823191602480820192602092909190829003018186803b158015610fe657600080fd5b505afa158015610ffa573d6000803e3d6000fd5b505050506040513d602081101561101057600080fd5b5051604080516370a0823160e01b815230600482015290519192506000916001600160a01b038516916370a08231916024808301926020929190829003018186803b15801561105e57600080fd5b505afa158015611072573d6000803e3d6000fd5b505050506040513d602081101561108857600080fd5b505190508461109d8b8363ffffffff612df116565b816110a457fe5b049650846110b88b8463ffffffff612df116565b816110bf57fe5b604080518a815292909104602083018190528282018d905260006060840152905190975033917f0c7095efab4844307a2d270e6feda743289e3f8bd8a4fa71bc0006ef39bb7793919081900360800190a261111a338b612e60565b888710156111595760405162461bcd60e51b8152600401808060200182810382526025815260200180613be36025913960400191505060405180910390fd5b876111746001600160a01b038616338963ffffffff61343016565b10156111b15760405162461bcd60e51b8152600401808060200182810382526028815260200180613e426028913960400191505060405180910390fd5b60408051630456767160e11b81523360048201526024810189905290516001600160a01b038516916308acece29160448083019260209291908290030181600087803b15801561120057600080fd5b505af1158015611214573d6000803e3d6000fd5b505050506040513d602081101561122a57600080fd5b505060016006555094989397509295505050505050565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156108b25780601f10610887576101008083540402835291602001916108b2565b6000600260065414156112ea576040805162461bcd60e51b81526020600482018190526024820152600080516020613df8833981519152604482015290519081900360640190fd5b60026006556008546007546001600160a01b03918216911660006113168333308963ffffffff61300416565b9050806113545760405162461bcd60e51b8152600401808060200182810382526028815260200180613dd06028913960400191505060405180910390fd5b600080548061142c57604080516323b872dd60e01b81523360048201523060248201526044810189905290516001600160a01b038616916323b872dd9160648083019260209291908290030181600087803b1580156113b257600080fd5b505af11580156113c6573d6000803e3d6000fd5b505050506040513d60208110156113dc57600080fd5b50516114195760405162461bcd60e51b8152600401808060200182810382526022815260200180613d166022913960400191505060405180910390fd5b61142287613659565b915081955061162a565b60006114c084876001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561148857600080fd5b505afa15801561149c573d6000803e3d6000fd5b505050506040513d60208110156114b257600080fd5b50519063ffffffff61368816565b604080516370a0823160e01b815230600482015290519192506000916001600160a01b038816916370a08231916024808301926020929190829003018186803b15801561150c57600080fd5b505afa158015611520573d6000803e3d6000fd5b505050506040513d602081101561153657600080fd5b50519050600061155c83611550888563ffffffff612df116565b9063ffffffff6136de16565b9050611584333061156c84613751565b6001600160a01b038b1692919063ffffffff61300416565b9450898511156115c55760405162461bcd60e51b815260040180806020018281038252602d815260200180613c08602d913960400191505060405180910390fd5b808510156116045760405162461bcd60e51b8152600401808060200182810382526022815260200180613c626022913960400191505060405180910390fd5b61162482611618878763ffffffff612df116565b9063ffffffff6137bf16565b98505050505b6040805183815260208101859052808201889052905133917fbeb3885786d637a474cbc287c0a44587231633a077f0bd30354d5a4b18996fce919081900360600190a2610bbc338761381c565b6000600260065414156116bf576040805162461bcd60e51b81526020600482018190526024820152600080516020613df8833981519152604482015290519081900360640190fd5b600260065542831015611719576040805162461bcd60e51b815260206004820152601c60248201527f646566737761703a2065787069726564207472616e73616374696f6e00000000604482015290519081900360640190fd5b6000346117275760006117b2565b6009546040805163f39b5b9b60e01b815260016004820152600019602482015290516117b2926001600160a01b03169163f39b5b9b91349160448082019260209290919082900301818588803b15801561178057600080fd5b505af1158015611794573d6000803e3d6000fd5b50505050506040513d60208110156117ab57600080fd5b5051613659565b600754600854919250610ee5916001600160a01b039182169116838833886138b2565b60006002600654141561181d576040805162461bcd60e51b81526020600482018190526024820152600080516020613df8833981519152604482015290519081900360640190fd5b600260065560005480611870576040805162461bcd60e51b8152602060048201526016602482015275646566737761703a20706f6f6c20697320656d70747960501b604482015290519081900360640190fd5b600854604080516370a0823160e01b815230600482015290516001600160a01b039092169160009183916370a0823191602480820192602092909190829003018186803b1580156118c057600080fd5b505afa1580156118d4573d6000803e3d6000fd5b505050506040513d60208110156118ea57600080fd5b50519050826118ff878363ffffffff612df116565b8161190657fe5b6040805160008152929091046020830181905282820189905260026060840152905190955033917f0c7095efab4844307a2d270e6feda743289e3f8bd8a4fa71bc0006ef39bb7793919081900360800190a26119623387612e60565b8461197d6001600160a01b038416338763ffffffff61343016565b10156119ba5760405162461bcd60e51b8152600401808060200182810382526028815260200180613e426028913960400191505060405180910390fd5b505060016006555092915050565b600060026006541415611a10576040805162461bcd60e51b81526020600482018190526024820152600080516020613df8833981519152604482015290519081900360640190fd5b60026006556008546001600160a01b03166000611a358233308863ffffffff61300416565b600754909150600090611a5e90611a59906001600160a01b0316858585333061321a565b613659565b905080611a6c576000611afc565b60095460408051637237e03160e01b81526004810184905260016024820152600019604482015233606482015290516001600160a01b0390921691637237e031916084808201926020929091908290030181600087803b158015611acf57600080fd5b505af1158015611ae3573d6000803e3d6000fd5b505050506040513d6020811015611af957600080fd5b50515b9350848410156119ba5760405162461bcd60e51b8152600401808060200182810382526024815260200180613c846024913960400191505060405180910390fd5b600060026006541415611b85576040805162461bcd60e51b81526020600482018190526024820152600080516020613df8833981519152604482015290519081900360640190fd5b60026006556007546040805163113e6a8d60e31b81523360048201523060248201526044810187905290516001600160a01b039092169182916389f354689160648083019260209291908290030181600087803b158015611be557600080fd5b505af1158015611bf9573d6000803e3d6000fd5b505050506040513d6020811015611c0f57600080fd5b5060009050611c1d86613659565b600854909150610e2d9083906001600160a01b0316838833896138b2565b600060026006541415611c83576040805162461bcd60e51b81526020600482018190526024820152600080516020613df8833981519152604482015290519081900360640190fd5b6002600655600034611c96576000611cef565b6009546040805163f39b5b9b60e01b81526001600482015260001960248201529051611cef926001600160a01b03169163f39b5b9b91349160448082019260209290919082900301818588803b15801561178057600080fd5b600754600854919250611d12916001600160a01b039182169116838633806138b2565b60016006559392505050565b600060026006541415611d66576040805162461bcd60e51b81526020600482018190526024820152600080516020613df8833981519152604482015290519081900360640190fd5b60026006556008546001600160a01b03166000611d8b8233308963ffffffff61300416565b600754909150600090611daf90611a59906001600160a01b0316858585333061321a565b905080611dbd576000611e4f565b60095460408051637237e03160e01b8152600481018490526001602482015260001960448201526001600160a01b03888116606483015291519190921691637237e0319160848083019260209291908290030181600087803b158015611e2257600080fd5b505af1158015611e36573d6000803e3d6000fd5b505050506040513d6020811015611e4c57600080fd5b50515b935085841015611e905760405162461bcd60e51b8152600401808060200182810382526024815260200180613c846024913960400191505060405180910390fd5b50506001600655509392505050565b60026006541415611ee5576040805162461bcd60e51b81526020600482018190526024820152600080516020613df8833981519152604482015290519081900360640190fd5b60026006556007546009546040805163095ea7b360e01b81526001600160a01b03928316600482015260001960248201529051919092169163095ea7b39160448083019260209291908290030181600087803b158015611f4457600080fd5b505af1158015611f58573d6000803e3d6000fd5b505050506040513d6020811015611f6e57600080fd5b50506001600655565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b600060026006541415611fea576040805162461bcd60e51b81526020600482018190526024820152600080516020613df8833981519152604482015290519081900360640190fd5b60026006556007546040805163113e6a8d60e31b81523360048201523060248201526044810186905290516001600160a01b039092169182916389f354689160648083019260209291908290030181600087803b15801561204a57600080fd5b505af115801561205e573d6000803e3d6000fd5b505050506040513d602081101561207457600080fd5b506000905061208285613659565b600854909150610ee59083906001600160a01b0316838733806138b2565b600260065414156120e6576040805162461bcd60e51b81526020600482018190526024820152600080516020613df8833981519152604482015290519081900360640190fd5b60026006556008546001600160a01b0316620622505a10156121395760405162461bcd60e51b815260040180806020018281038252602d815260200180613c35602d913960400191505060405180910390fd5b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b178152915181516000936060936001600160a01b038716939092909182918083835b6020831061219f5780518252601f199092019160209182019101612180565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855afa9150503d80600081146121ff576040519150601f19603f3d011682016040523d82523d6000602084013e612204565b606091505b5060408051600481526024810182526020810180516001600160e01b03166395d89b4160e01b178152915181519496509294506000936060936001600160a01b0389169390918291908083835b602083106122705780518252601f199092019160209182019101612251565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855afa9150503d80600081146122d0576040519150601f19603f3d011682016040523d82523d6000602084013e6122d5565b606091505b509150915061266960405180604001604052806005815260200164534855462d60d81b8152508361232157604051806040016040528060038152602001623f3f3f60e81b8152506123e7565b82806020019051602081101561233657600080fd5b810190808051604051939291908464010000000082111561235657600080fd5b90830190602082018581111561236b57600080fd5b825164010000000081118282018810171561238557600080fd5b82525081516020918201929091019080838360005b838110156123b257818101518382015260200161239a565b50505050905090810190601f1680156123df5780820380516001836020036101000a031916815260200191505b506040525050505b6040516020018083805190602001908083835b602083106124195780518252601f1990920191602091820191016123fa565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b602083106124615780518252601f199092019160209182019101612442565b6001836020036101000a03801982511681845116808217855250505050505090500192505050604051602081830303815290604052856124c057604051806040016040528060078152602001662ab735b737bbb760c91b815250612586565b8480602001905160208110156124d557600080fd5b81019080805160405193929190846401000000008211156124f557600080fd5b90830190602082018581111561250a57600080fd5b825164010000000081118282018810171561252457600080fd5b82525081516020918201929091019080838360005b83811015612551578181015183820152602001612539565b50505050905090810190601f16801561257e5780820380516001836020036101000a031916815260200191505b506040525050505b60405180604001604052806014815260200173080b481919599cddd85c0b9a5bc81c1bdbdb195960621b8152506040516020018083805190602001908083835b602083106125e55780518252601f1990920191602091820191016125c6565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b6020831061262d5780518252601f19909201916020918201910161260e565b6001836020036101000a038019825116818451168082178552505050505050905001925050506040516020818303038152906040526012613aa6565b50506001600655505050565b6000600260065414156126bd576040805162461bcd60e51b81526020600482018190526024820152600080516020613df8833981519152604482015290519081900360640190fd5b60026006556009546001600160a01b038381169116141561270f5760405162461bcd60e51b8152600401808060200182810382526023815260200180613dad6023913960400191505060405180910390fd5b6008546007546001600160a01b03918216911660006127368333308b63ffffffff61300416565b9050600061279482856001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561148857600080fd5b604080516370a0823160e01b815230600482015290519192506000916001600160a01b038616916370a08231916024808301926020929190829003018186803b1580156127e057600080fd5b505afa1580156127f4573d6000803e3d6000fd5b505050506040513d602081101561280a57600080fd5b50519050600061281b848484612f3e565b6040805186815260208101839052808201869052606081018590526001600160a01b038b166080820152905191925033917f0e67a82a4480e87657297872f2e152fcd5881f5ac59832c276c37357833b7d549181900360a00190a2846001600160a01b031663095ea7b389836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156128d657600080fd5b505af11580156128ea573d6000803e3d6000fd5b505050506040513d602081101561290057600080fd5b50506040805163c5d14d3960e01b815260048101839052602481018c90526001600160a01b038b811660448301529151918a169163c5d14d39916064808201926020929091908290030181600087803b15801561295c57600080fd5b505af1158015612970573d6000803e3d6000fd5b505050506040513d602081101561298657600080fd5b50516040805163095ea7b360e01b81526001600160a01b038b811660048301526000602483018190529251939a5088169263095ea7b392604480840193602093929083900390910190829087803b1580156129e057600080fd5b505af11580156129f4573d6000803e3d6000fd5b505050506040513d6020811015612a0a57600080fd5b5050600160065550949998505050505050505050565b600060026006541415612a68576040805162461bcd60e51b81526020600482018190526024820152600080516020613df8833981519152604482015290519081900360640190fd5b60026006556008546001600160a01b03166000612a8d8233308a63ffffffff61300416565b600754909150600090612ab190611a59906001600160a01b0316858585333061321a565b9050600081612ac1576000612b4b565b600954604080516395e3c50b60e01b81526004810185905260016024820152600019604482015290516001600160a01b03909216916395e3c50b916064808201926020929091908290030181600087803b158015612b1e57600080fd5b505af1158015612b32573d6000803e3d6000fd5b505050506040513d6020811015612b4857600080fd5b50515b905080612b59576000612be2565b6040805163ad65d76d60e01b81526001600482015260001960248201526001600160a01b03898116604483015291519188169163ad65d76d918491606480830192602092919082900301818588803b158015612bb457600080fd5b505af1158015612bc8573d6000803e3d6000fd5b50505050506040513d6020811015612bdf57600080fd5b50515b945087851015612c235760405162461bcd60e51b815260040180806020018281038252602a815260200180613e18602a913960400191505060405180910390fd5b50506001600655509095945050505050565b6008546001600160a01b031690565b336001600160a01b03841614612cf7576001600160a01b03831660009081526002602090815260408083203384529091529020546000198114612cf55781811015612cc05760405162461bcd60e51b8152600401808060200182810382526025815260200180613ca86025913960400191505060405180910390fd5b612cd0818363ffffffff61368816565b6001600160a01b03851660009081526002602090815260408083203384529091529020555b505b6001600160a01b03831660009081526001602052604090205481811015612d4f5760405162461bcd60e51b815260040180806020018281038252602b815260200180613d38602b913960400191505060405180910390fd5b612d5f818363ffffffff61368816565b6001600160a01b038086166000908152600160205260408082209390935590851681522054612d94908363ffffffff613ad516565b6001600160a01b0380851660008181526001602090815260409182902094909455805186815290519193928816927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a350505050565b600082612e00575060006108ce565b82820282848281612e0d57fe5b0414612e59576040805162461bcd60e51b8152602060048201526016602482015275736166656d6174683a206d756c206f766572666c6f7760501b604482015290519081900360640190fd5b9392505050565b6001600160a01b03821660009081526001602052604090205481811015612eb85760405162461bcd60e51b8152600401808060200182810382526027815260200180613cef6027913960400191505060405180910390fd5b612ec8818363ffffffff61368816565b6001600160a01b03841660009081526001602052604081209190915554612ef5908363ffffffff61368816565b60009081556040805184815290516001600160a01b038616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef919081900360200190a3505050565b60008215801590612f4e57508115155b612f9f576040805162461bcd60e51b815260206004820152601d60248201527f646566737761703a206f6e65207265736572766520697320656d707479000000604482015290519081900360640190fd5b6000612fb3856103e563ffffffff612df116565b90506000612fc7828563ffffffff612df116565b90506000612fed83612fe1886103e863ffffffff612df116565b9063ffffffff613ad516565b9050808281612ff857fe5b04979650505050505050565b600080856001600160a01b03166370a08231856040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561305d57600080fd5b505afa158015613071573d6000803e3d6000fd5b505050506040513d602081101561308757600080fd5b5051604080516001600160a01b0388811660248301528781166044830152606480830188905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251949550600094918b169390918291908083835b6020831061310e5780518252601f1990920191602091820191016130ef565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613170576040519150601f19603f3d011682016040523d82523d6000602084013e613175565b606091505b50509050806131b55760405162461bcd60e51b8152600401808060200182810382526022815260200180613ccd6022913960400191505060405180910390fd5b61320f82886001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561148857600080fd5b979650505050505050565b60008061327786886001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561148857600080fd5b604080516370a0823160e01b815230600482015290519192506000916001600160a01b038b16916370a08231916024808301926020929190829003018186803b1580156132c357600080fd5b505afa1580156132d7573d6000803e3d6000fd5b505050506040513d60208110156132ed57600080fd5b505190506132fc878383612f3e565b92508583101561333d5760405162461bcd60e51b8152600401808060200182810382526023815260200180613d636023913960400191505060405180910390fd5b886001600160a01b03166308acece285856040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561339d57600080fd5b505af11580156133b1573d6000803e3d6000fd5b505050506040513d60208110156133c757600080fd5b50506040805188815260208101859052808201849052606081018390526001600160a01b0386811660808301529151918716917f0e67a82a4480e87657297872f2e152fcd5881f5ac59832c276c37357833b7d549181900360a00190a250509695505050505050565b604080516370a0823160e01b8152306004820152905160009182916001600160a01b038716916370a08231916024808301926020929190829003018186803b15801561347b57600080fd5b505afa15801561348f573d6000803e3d6000fd5b505050506040513d60208110156134a557600080fd5b5051604080516001600160a01b038781166024830152604480830188905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17815292518251949550600094918a169390918291908083835b602083106135245780518252601f199092019160209182019101613505565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613586576040519150601f19603f3d011682016040523d82523d6000602084013e61358b565b606091505b50509050806135cb5760405162461bcd60e51b8152600401808060200182810382526022815260200180613bc16022913960400191505060405180910390fd5b604080516370a0823160e01b8152306004820152905161364f916001600160a01b038916916370a0823191602480820192602092909190829003018186803b15801561361657600080fd5b505afa15801561362a573d6000803e3d6000fd5b505050506040513d602081101561364057600080fd5b5051839063ffffffff61368816565b9695505050505050565b6000816001141561366c57506000610e56565b60648083049083061561367d576001015b600202909103919050565b6000818310156136d8576040805162461bcd60e51b8152602060048201526016602482015275736166656d6174683a20737562206f766572666c6f7760501b604482015290519081900360640190fd5b50900390565b60008161372a576040805162461bcd60e51b8152602060048201526015602482015274736166656d6174683a20646976206279207a65726f60581b604482015290519081900360640190fd5b600082848161373557fe5b04905082848161374157fe5b0615612e59576001019392505050565b6000816001141561376457506003610e56565b60318204600181166137aa57613780838263ffffffff613ad516565b905060648106613791579050610e56565b6137a281600263ffffffff613ad516565b915050610e56565b6137a26001612fe1858463ffffffff613ad516565b60008161380b576040805162461bcd60e51b8152602060048201526015602482015274736166656d6174683a20646976206279207a65726f60581b604482015290519081900360640190fd5b81838161381457fe5b049392505050565b60005461382f908263ffffffff613ad516565b60009081556001600160a01b03831681526001602052604090205461385a908263ffffffff613ad516565b6001600160a01b03831660008181526001602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b604080516370a0823160e01b8152306004820152905160009182916001600160a01b038916916370a08231916024808301926020929190829003018186803b1580156138fd57600080fd5b505afa158015613911573d6000803e3d6000fd5b505050506040513d602081101561392757600080fd5b5051604080516370a0823160e01b8152306004820152905191925060009161397b9189916001600160a01b038d16916370a08231916024808301926020929190829003018186803b15801561148857600080fd5b9050613988878284612f3e565b9250858310156139c95760405162461bcd60e51b8152600401808060200182810382526027815260200180613d866027913960400191505060405180910390fd5b6139e36001600160a01b038916858563ffffffff61343016565b1515806139ee575082155b613a3f576040805162461bcd60e51b815260206004820152601d60248201527f646566737761703a206572726f722073656e64696e6720746f6b656e73000000604482015290519081900360640190fd5b6040805188815260208101859052808201839052606081018490526001600160a01b0386811660808301529151918716917f237ebbadd3df6d7d4821941f616af88a57b22ae4a03607c118d23fb3d7fcadc29181900360a00190a250509695505050505050565b8251613ab9906003906020860190613b28565b508151613acd906004906020850190613b28565b506005555050565b600082820183811015612e59576040805162461bcd60e51b8152602060048201526016602482015275736166656d6174683a20616464206f766572666c6f7760501b604482015290519081900360640190fd5b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613b6957805160ff1916838001178555613b96565b82800160010185558215613b96579182015b82811115613b96578251825591602001919060010190613b7b565b50613ba2929150613ba6565b5090565b6108ba91905b80821115613ba25760008155600101613bac56fe7361666564656665726332303a206572726f722073656e64696e6720746f6b656e73646566737761703a2062617365416d6f756e742069732062656c6f77205f6d696e42617365646566737761703a205f6d6178426173652069732062656c6f77206f662070756c6c6564207265717569726564646566737761703a206761736c656674206275696c64206d65746164617461206973206e6f7420656e6f756768646566737761703a2070756c6c65642062617365206973206e6f7420656e6f756768646566737761703a2065746820626f756768742069732062656c6f77205f6d696e45746865726332303a2073656e64657220616c6c6f77616e6365206973206e6f7420656e6f7567687361666564656665726332303a206572726f722070756c6c696e6720746f6b656e7365726332303a206275726e205f66726f6d2062616c616e6365206973206e6f7420656e6f756768646566737761703a206572726f722070756c6c696e67206261736520746f6b656e7365726332303a207472616e73666572205f66726f6d2062616c616e6365206973206e6f7420656e6f756768646566737761703a20626f7567687420626173652062656c6f77205f6d696e42617365646566737761703a20626f7567687420746f6b656e732062656c6f77205f6d696e546f6b656e73646566737761703a205f65786368616e67652063616e277420626520556e6973776170646566737761703a2070756c6c207a65726f20746f6b656e73206973206e6f7420616c6c6f7765647265656e7472616e63792d67756172643a207265656e7472616e742063616c6c646566737761703a20746f6b656e7320626f756768742069732062656c6f77205f6d696e546f6b656e73646566737761703a20746f6b656e416d6f756e742069732062656c6f77205f6d696e546f6b656e73a265627a7a72315820a5f9aa9deabd146e5c52eeacbd222794edfa1b31fc324a95dde183a84840ec6564736f6c634300050c0032646566737761703a206761736c656674206275696c64206d65746164617461206973206e6f7420656e6f756768646566737761703a20746f6b656e20616e6420626173652063616e2774206265207468652073616d657265656e7472616e63792d67756172643a207265656e7472616e742063616c6c646566737761703a20756e697377617020746f6b656e20646f65736e2774206d617463680000000000000000000000003a9fff453d50d4ac52a6890647b823379ba36b9e0000000000000000000000006dc25bd44dab2139cfa118cb4761a659eb4ca97c000000000000000000000000536956fab86774fb55cfaacf496bc25e4d2b435c

Deployed Bytecode

0x6080604052600436106101e35760003560e01c806395d89b4111610102578063d38d702911610095578063ea5d5a9211610064578063ea5d5a921461076e578063ecdf2b5914610783578063f5700fdd146107ca578063fc0c546a14610811576101e3565b8063d38d7029146106af578063d5457baf146106ee578063dd62ed3e14610703578063def5e98d1461073e576101e3565b8063ae33a99b116100d1578063ae33a99b146105f3578063bc18f21814610623578063c5d14d3914610653578063c74825e414610692576101e3565b806395d89b411461057c5780639cd441da14610591578063a9059cbb146102bc578063ad65d76d146105c1576101e3565b80633df3cc0c1161017a57806370a082311161014957806370a08231146104ca5780637ea9c5e3146104fd578063857620e11461052d57806389f3546814610369576101e3565b80633df3cc0c146104225780634f48da091461044c5780635001f3b51461047657806367511f481461048b576101e3565b806323b872dd116101b657806323b872dd146103695780632681f7e4146103ac578063313ce567146103dd5780633868e1f4146103f2576101e3565b806306fdde031461023257806308acece2146102bc578063095ea7b31461030957806318160ddd14610342575b33321415610230576040805162461bcd60e51b81526020600482015260156024820152741919599cddd85c0e88115512081c995a9958dd1959605a1b604482015290519081900360640190fd5b005b34801561023e57600080fd5b50610247610826565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610281578181015183820152602001610269565b50505050905090810190601f1680156102ae5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156102c857600080fd5b506102f5600480360360408110156102df57600080fd5b506001600160a01b0381351690602001356108bd565b604080519115158252519081900360200190f35b34801561031557600080fd5b506102f56004803603604081101561032c57600080fd5b506001600160a01b0381351690602001356108d4565b34801561034e57600080fd5b50610357610946565b60408051918252519081900360200190f35b34801561037557600080fd5b506102f56004803603606081101561038c57600080fd5b506001600160a01b0381358116916020810135909116906040013561094c565b3480156103b857600080fd5b506103c1610963565b604080516001600160a01b039092168252519081900360200190f35b3480156103e957600080fd5b50610357610972565b3480156103fe57600080fd5b506103576004803603604081101561041557600080fd5b5080359060200135610978565b34801561042e57600080fd5b506103576004803603602081101561044557600080fd5b5035610bcd565b34801561045857600080fd5b506103576004803603602081101561046f57600080fd5b5035610cc9565b34801561048257600080fd5b506103c1610d94565b34801561049757600080fd5b50610357600480360360608110156104ae57600080fd5b50803590602081013590604001356001600160a01b0316610da3565b3480156104d657600080fd5b50610357600480360360208110156104ed57600080fd5b50356001600160a01b0316610e3c565b34801561050957600080fd5b506103576004803603604081101561052057600080fd5b5080359060200135610e5b565b34801561053957600080fd5b506105636004803603606081101561055057600080fd5b5080359060208101359060400135610ef3565b6040805192835260208301919091528051918290030190f35b34801561058857600080fd5b50610247611241565b34801561059d57600080fd5b50610357600480360360408110156105b457600080fd5b50803590602001356112a2565b610357600480360360608110156105d757600080fd5b50803590602081013590604001356001600160a01b0316611677565b3480156105ff57600080fd5b506103576004803603604081101561061657600080fd5b50803590602001356117d5565b34801561062f57600080fd5b506103576004803603604081101561064657600080fd5b50803590602001356119c8565b34801561065f57600080fd5b506103576004803603606081101561067657600080fd5b50803590602081013590604001356001600160a01b0316611b3d565b610357600480360360208110156106a857600080fd5b5035611c3b565b3480156106bb57600080fd5b50610357600480360360608110156106d257600080fd5b50803590602081013590604001356001600160a01b0316611d1e565b3480156106fa57600080fd5b50610230611e9f565b34801561070f57600080fd5b506103576004803603604081101561072657600080fd5b506001600160a01b0381358116916020013516611f77565b34801561074a57600080fd5b506103576004803603604081101561076157600080fd5b5080359060200135611fa2565b34801561077a57600080fd5b506102306120a0565b34801561078f57600080fd5b50610357600480360360808110156107a657600080fd5b508035906020810135906001600160a01b0360408201358116916060013516612675565b3480156107d657600080fd5b50610357600480360360808110156107ed57600080fd5b508035906020810135906001600160a01b0360408201358116916060013516612a20565b34801561081d57600080fd5b506103c1612c35565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156108b25780601f10610887576101008083540402835291602001916108b2565b820191906000526020600020905b81548152906001019060200180831161089557829003601f168201915b505050505090505b90565b60006108ca338484612c44565b5060015b92915050565b6040805182815290516000916001600160a01b0385169133917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925919081900360200190a3503360009081526002602090815260408083206001600160a01b039590951683529390529190912055600190565b60005490565b6000610959848484612c44565b5060019392505050565b6009546001600160a01b031690565b60055490565b6000600260065414156109c0576040805162461bcd60e51b81526020600482018190526024820152600080516020613df8833981519152604482015290519081900360640190fd5b600260065560005480610a13576040805162461bcd60e51b8152602060048201526016602482015275646566737761703a20706f6f6c20697320656d70747960501b604482015290519081900360640190fd5b600754604080516370a0823160e01b815230600482015290516001600160a01b039092169160009183916370a0823191602480820192602092909190829003018186803b158015610a6357600080fd5b505afa158015610a77573d6000803e3d6000fd5b505050506040513d6020811015610a8d57600080fd5b5051905082610aa2878363ffffffff612df116565b81610aa957fe5b60408051929091048083526000602084015282820189905260016060840152905190955033917f0c7095efab4844307a2d270e6feda743289e3f8bd8a4fa71bc0006ef39bb7793919081900360800190a2610b043387612e60565b84841015610b435760405162461bcd60e51b8152600401808060200182810382526025815260200180613be36025913960400191505060405180910390fd5b60408051630456767160e11b81523360048201526024810186905290516001600160a01b038416916308acece29160448083019260209291908290030181600087803b158015610b9257600080fd5b505af1158015610ba6573d6000803e3d6000fd5b505050506040513d6020811015610bbc57600080fd5b505060016006555091949350505050565b600754604080516370a0823160e01b815230600482015290516000926108ce9285926001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015610c2157600080fd5b505afa158015610c35573d6000803e3d6000fd5b505050506040513d6020811015610c4b57600080fd5b5051600854604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015610c9857600080fd5b505afa158015610cac573d6000803e3d6000fd5b505050506040513d6020811015610cc257600080fd5b5051612f3e565b600854604080516370a0823160e01b815230600482015290516000926108ce9285926001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015610d1d57600080fd5b505afa158015610d31573d6000803e3d6000fd5b505050506040513d6020811015610d4757600080fd5b5051600754604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015610c9857600080fd5b6007546001600160a01b031690565b600060026006541415610deb576040805162461bcd60e51b81526020600482018190526024820152600080516020613df8833981519152604482015290519081900360640190fd5b60026006556008546001600160a01b03166000610e108233308963ffffffff61300416565b600754909150610e2d906001600160a01b0316838388338961321a565b60016006559695505050505050565b6001600160a01b0381166000908152600160205260409020545b919050565b600060026006541415610ea3576040805162461bcd60e51b81526020600482018190526024820152600080516020613df8833981519152604482015290519081900360640190fd5b60026006556008546001600160a01b03166000610ec88233308863ffffffff61300416565b600754909150610ee5906001600160a01b0316838387338061321a565b600160065595945050505050565b60008060026006541415610f3c576040805162461bcd60e51b81526020600482018190526024820152600080516020613df8833981519152604482015290519081900360640190fd5b600260065560005480610f8f576040805162461bcd60e51b8152602060048201526016602482015275646566737761703a20706f6f6c20697320656d70747960501b604482015290519081900360640190fd5b600854600754604080516370a0823160e01b815230600482015290516001600160a01b03938416939092169160009184916370a0823191602480820192602092909190829003018186803b158015610fe657600080fd5b505afa158015610ffa573d6000803e3d6000fd5b505050506040513d602081101561101057600080fd5b5051604080516370a0823160e01b815230600482015290519192506000916001600160a01b038516916370a08231916024808301926020929190829003018186803b15801561105e57600080fd5b505afa158015611072573d6000803e3d6000fd5b505050506040513d602081101561108857600080fd5b505190508461109d8b8363ffffffff612df116565b816110a457fe5b049650846110b88b8463ffffffff612df116565b816110bf57fe5b604080518a815292909104602083018190528282018d905260006060840152905190975033917f0c7095efab4844307a2d270e6feda743289e3f8bd8a4fa71bc0006ef39bb7793919081900360800190a261111a338b612e60565b888710156111595760405162461bcd60e51b8152600401808060200182810382526025815260200180613be36025913960400191505060405180910390fd5b876111746001600160a01b038616338963ffffffff61343016565b10156111b15760405162461bcd60e51b8152600401808060200182810382526028815260200180613e426028913960400191505060405180910390fd5b60408051630456767160e11b81523360048201526024810189905290516001600160a01b038516916308acece29160448083019260209291908290030181600087803b15801561120057600080fd5b505af1158015611214573d6000803e3d6000fd5b505050506040513d602081101561122a57600080fd5b505060016006555094989397509295505050505050565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156108b25780601f10610887576101008083540402835291602001916108b2565b6000600260065414156112ea576040805162461bcd60e51b81526020600482018190526024820152600080516020613df8833981519152604482015290519081900360640190fd5b60026006556008546007546001600160a01b03918216911660006113168333308963ffffffff61300416565b9050806113545760405162461bcd60e51b8152600401808060200182810382526028815260200180613dd06028913960400191505060405180910390fd5b600080548061142c57604080516323b872dd60e01b81523360048201523060248201526044810189905290516001600160a01b038616916323b872dd9160648083019260209291908290030181600087803b1580156113b257600080fd5b505af11580156113c6573d6000803e3d6000fd5b505050506040513d60208110156113dc57600080fd5b50516114195760405162461bcd60e51b8152600401808060200182810382526022815260200180613d166022913960400191505060405180910390fd5b61142287613659565b915081955061162a565b60006114c084876001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561148857600080fd5b505afa15801561149c573d6000803e3d6000fd5b505050506040513d60208110156114b257600080fd5b50519063ffffffff61368816565b604080516370a0823160e01b815230600482015290519192506000916001600160a01b038816916370a08231916024808301926020929190829003018186803b15801561150c57600080fd5b505afa158015611520573d6000803e3d6000fd5b505050506040513d602081101561153657600080fd5b50519050600061155c83611550888563ffffffff612df116565b9063ffffffff6136de16565b9050611584333061156c84613751565b6001600160a01b038b1692919063ffffffff61300416565b9450898511156115c55760405162461bcd60e51b815260040180806020018281038252602d815260200180613c08602d913960400191505060405180910390fd5b808510156116045760405162461bcd60e51b8152600401808060200182810382526022815260200180613c626022913960400191505060405180910390fd5b61162482611618878763ffffffff612df116565b9063ffffffff6137bf16565b98505050505b6040805183815260208101859052808201889052905133917fbeb3885786d637a474cbc287c0a44587231633a077f0bd30354d5a4b18996fce919081900360600190a2610bbc338761381c565b6000600260065414156116bf576040805162461bcd60e51b81526020600482018190526024820152600080516020613df8833981519152604482015290519081900360640190fd5b600260065542831015611719576040805162461bcd60e51b815260206004820152601c60248201527f646566737761703a2065787069726564207472616e73616374696f6e00000000604482015290519081900360640190fd5b6000346117275760006117b2565b6009546040805163f39b5b9b60e01b815260016004820152600019602482015290516117b2926001600160a01b03169163f39b5b9b91349160448082019260209290919082900301818588803b15801561178057600080fd5b505af1158015611794573d6000803e3d6000fd5b50505050506040513d60208110156117ab57600080fd5b5051613659565b600754600854919250610ee5916001600160a01b039182169116838833886138b2565b60006002600654141561181d576040805162461bcd60e51b81526020600482018190526024820152600080516020613df8833981519152604482015290519081900360640190fd5b600260065560005480611870576040805162461bcd60e51b8152602060048201526016602482015275646566737761703a20706f6f6c20697320656d70747960501b604482015290519081900360640190fd5b600854604080516370a0823160e01b815230600482015290516001600160a01b039092169160009183916370a0823191602480820192602092909190829003018186803b1580156118c057600080fd5b505afa1580156118d4573d6000803e3d6000fd5b505050506040513d60208110156118ea57600080fd5b50519050826118ff878363ffffffff612df116565b8161190657fe5b6040805160008152929091046020830181905282820189905260026060840152905190955033917f0c7095efab4844307a2d270e6feda743289e3f8bd8a4fa71bc0006ef39bb7793919081900360800190a26119623387612e60565b8461197d6001600160a01b038416338763ffffffff61343016565b10156119ba5760405162461bcd60e51b8152600401808060200182810382526028815260200180613e426028913960400191505060405180910390fd5b505060016006555092915050565b600060026006541415611a10576040805162461bcd60e51b81526020600482018190526024820152600080516020613df8833981519152604482015290519081900360640190fd5b60026006556008546001600160a01b03166000611a358233308863ffffffff61300416565b600754909150600090611a5e90611a59906001600160a01b0316858585333061321a565b613659565b905080611a6c576000611afc565b60095460408051637237e03160e01b81526004810184905260016024820152600019604482015233606482015290516001600160a01b0390921691637237e031916084808201926020929091908290030181600087803b158015611acf57600080fd5b505af1158015611ae3573d6000803e3d6000fd5b505050506040513d6020811015611af957600080fd5b50515b9350848410156119ba5760405162461bcd60e51b8152600401808060200182810382526024815260200180613c846024913960400191505060405180910390fd5b600060026006541415611b85576040805162461bcd60e51b81526020600482018190526024820152600080516020613df8833981519152604482015290519081900360640190fd5b60026006556007546040805163113e6a8d60e31b81523360048201523060248201526044810187905290516001600160a01b039092169182916389f354689160648083019260209291908290030181600087803b158015611be557600080fd5b505af1158015611bf9573d6000803e3d6000fd5b505050506040513d6020811015611c0f57600080fd5b5060009050611c1d86613659565b600854909150610e2d9083906001600160a01b0316838833896138b2565b600060026006541415611c83576040805162461bcd60e51b81526020600482018190526024820152600080516020613df8833981519152604482015290519081900360640190fd5b6002600655600034611c96576000611cef565b6009546040805163f39b5b9b60e01b81526001600482015260001960248201529051611cef926001600160a01b03169163f39b5b9b91349160448082019260209290919082900301818588803b15801561178057600080fd5b600754600854919250611d12916001600160a01b039182169116838633806138b2565b60016006559392505050565b600060026006541415611d66576040805162461bcd60e51b81526020600482018190526024820152600080516020613df8833981519152604482015290519081900360640190fd5b60026006556008546001600160a01b03166000611d8b8233308963ffffffff61300416565b600754909150600090611daf90611a59906001600160a01b0316858585333061321a565b905080611dbd576000611e4f565b60095460408051637237e03160e01b8152600481018490526001602482015260001960448201526001600160a01b03888116606483015291519190921691637237e0319160848083019260209291908290030181600087803b158015611e2257600080fd5b505af1158015611e36573d6000803e3d6000fd5b505050506040513d6020811015611e4c57600080fd5b50515b935085841015611e905760405162461bcd60e51b8152600401808060200182810382526024815260200180613c846024913960400191505060405180910390fd5b50506001600655509392505050565b60026006541415611ee5576040805162461bcd60e51b81526020600482018190526024820152600080516020613df8833981519152604482015290519081900360640190fd5b60026006556007546009546040805163095ea7b360e01b81526001600160a01b03928316600482015260001960248201529051919092169163095ea7b39160448083019260209291908290030181600087803b158015611f4457600080fd5b505af1158015611f58573d6000803e3d6000fd5b505050506040513d6020811015611f6e57600080fd5b50506001600655565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b600060026006541415611fea576040805162461bcd60e51b81526020600482018190526024820152600080516020613df8833981519152604482015290519081900360640190fd5b60026006556007546040805163113e6a8d60e31b81523360048201523060248201526044810186905290516001600160a01b039092169182916389f354689160648083019260209291908290030181600087803b15801561204a57600080fd5b505af115801561205e573d6000803e3d6000fd5b505050506040513d602081101561207457600080fd5b506000905061208285613659565b600854909150610ee59083906001600160a01b0316838733806138b2565b600260065414156120e6576040805162461bcd60e51b81526020600482018190526024820152600080516020613df8833981519152604482015290519081900360640190fd5b60026006556008546001600160a01b0316620622505a10156121395760405162461bcd60e51b815260040180806020018281038252602d815260200180613c35602d913960400191505060405180910390fd5b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b178152915181516000936060936001600160a01b038716939092909182918083835b6020831061219f5780518252601f199092019160209182019101612180565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855afa9150503d80600081146121ff576040519150601f19603f3d011682016040523d82523d6000602084013e612204565b606091505b5060408051600481526024810182526020810180516001600160e01b03166395d89b4160e01b178152915181519496509294506000936060936001600160a01b0389169390918291908083835b602083106122705780518252601f199092019160209182019101612251565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855afa9150503d80600081146122d0576040519150601f19603f3d011682016040523d82523d6000602084013e6122d5565b606091505b509150915061266960405180604001604052806005815260200164534855462d60d81b8152508361232157604051806040016040528060038152602001623f3f3f60e81b8152506123e7565b82806020019051602081101561233657600080fd5b810190808051604051939291908464010000000082111561235657600080fd5b90830190602082018581111561236b57600080fd5b825164010000000081118282018810171561238557600080fd5b82525081516020918201929091019080838360005b838110156123b257818101518382015260200161239a565b50505050905090810190601f1680156123df5780820380516001836020036101000a031916815260200191505b506040525050505b6040516020018083805190602001908083835b602083106124195780518252601f1990920191602091820191016123fa565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b602083106124615780518252601f199092019160209182019101612442565b6001836020036101000a03801982511681845116808217855250505050505090500192505050604051602081830303815290604052856124c057604051806040016040528060078152602001662ab735b737bbb760c91b815250612586565b8480602001905160208110156124d557600080fd5b81019080805160405193929190846401000000008211156124f557600080fd5b90830190602082018581111561250a57600080fd5b825164010000000081118282018810171561252457600080fd5b82525081516020918201929091019080838360005b83811015612551578181015183820152602001612539565b50505050905090810190601f16801561257e5780820380516001836020036101000a031916815260200191505b506040525050505b60405180604001604052806014815260200173080b481919599cddd85c0b9a5bc81c1bdbdb195960621b8152506040516020018083805190602001908083835b602083106125e55780518252601f1990920191602091820191016125c6565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b6020831061262d5780518252601f19909201916020918201910161260e565b6001836020036101000a038019825116818451168082178552505050505050905001925050506040516020818303038152906040526012613aa6565b50506001600655505050565b6000600260065414156126bd576040805162461bcd60e51b81526020600482018190526024820152600080516020613df8833981519152604482015290519081900360640190fd5b60026006556009546001600160a01b038381169116141561270f5760405162461bcd60e51b8152600401808060200182810382526023815260200180613dad6023913960400191505060405180910390fd5b6008546007546001600160a01b03918216911660006127368333308b63ffffffff61300416565b9050600061279482856001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561148857600080fd5b604080516370a0823160e01b815230600482015290519192506000916001600160a01b038616916370a08231916024808301926020929190829003018186803b1580156127e057600080fd5b505afa1580156127f4573d6000803e3d6000fd5b505050506040513d602081101561280a57600080fd5b50519050600061281b848484612f3e565b6040805186815260208101839052808201869052606081018590526001600160a01b038b166080820152905191925033917f0e67a82a4480e87657297872f2e152fcd5881f5ac59832c276c37357833b7d549181900360a00190a2846001600160a01b031663095ea7b389836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156128d657600080fd5b505af11580156128ea573d6000803e3d6000fd5b505050506040513d602081101561290057600080fd5b50506040805163c5d14d3960e01b815260048101839052602481018c90526001600160a01b038b811660448301529151918a169163c5d14d39916064808201926020929091908290030181600087803b15801561295c57600080fd5b505af1158015612970573d6000803e3d6000fd5b505050506040513d602081101561298657600080fd5b50516040805163095ea7b360e01b81526001600160a01b038b811660048301526000602483018190529251939a5088169263095ea7b392604480840193602093929083900390910190829087803b1580156129e057600080fd5b505af11580156129f4573d6000803e3d6000fd5b505050506040513d6020811015612a0a57600080fd5b5050600160065550949998505050505050505050565b600060026006541415612a68576040805162461bcd60e51b81526020600482018190526024820152600080516020613df8833981519152604482015290519081900360640190fd5b60026006556008546001600160a01b03166000612a8d8233308a63ffffffff61300416565b600754909150600090612ab190611a59906001600160a01b0316858585333061321a565b9050600081612ac1576000612b4b565b600954604080516395e3c50b60e01b81526004810185905260016024820152600019604482015290516001600160a01b03909216916395e3c50b916064808201926020929091908290030181600087803b158015612b1e57600080fd5b505af1158015612b32573d6000803e3d6000fd5b505050506040513d6020811015612b4857600080fd5b50515b905080612b59576000612be2565b6040805163ad65d76d60e01b81526001600482015260001960248201526001600160a01b03898116604483015291519188169163ad65d76d918491606480830192602092919082900301818588803b158015612bb457600080fd5b505af1158015612bc8573d6000803e3d6000fd5b50505050506040513d6020811015612bdf57600080fd5b50515b945087851015612c235760405162461bcd60e51b815260040180806020018281038252602a815260200180613e18602a913960400191505060405180910390fd5b50506001600655509095945050505050565b6008546001600160a01b031690565b336001600160a01b03841614612cf7576001600160a01b03831660009081526002602090815260408083203384529091529020546000198114612cf55781811015612cc05760405162461bcd60e51b8152600401808060200182810382526025815260200180613ca86025913960400191505060405180910390fd5b612cd0818363ffffffff61368816565b6001600160a01b03851660009081526002602090815260408083203384529091529020555b505b6001600160a01b03831660009081526001602052604090205481811015612d4f5760405162461bcd60e51b815260040180806020018281038252602b815260200180613d38602b913960400191505060405180910390fd5b612d5f818363ffffffff61368816565b6001600160a01b038086166000908152600160205260408082209390935590851681522054612d94908363ffffffff613ad516565b6001600160a01b0380851660008181526001602090815260409182902094909455805186815290519193928816927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a350505050565b600082612e00575060006108ce565b82820282848281612e0d57fe5b0414612e59576040805162461bcd60e51b8152602060048201526016602482015275736166656d6174683a206d756c206f766572666c6f7760501b604482015290519081900360640190fd5b9392505050565b6001600160a01b03821660009081526001602052604090205481811015612eb85760405162461bcd60e51b8152600401808060200182810382526027815260200180613cef6027913960400191505060405180910390fd5b612ec8818363ffffffff61368816565b6001600160a01b03841660009081526001602052604081209190915554612ef5908363ffffffff61368816565b60009081556040805184815290516001600160a01b038616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef919081900360200190a3505050565b60008215801590612f4e57508115155b612f9f576040805162461bcd60e51b815260206004820152601d60248201527f646566737761703a206f6e65207265736572766520697320656d707479000000604482015290519081900360640190fd5b6000612fb3856103e563ffffffff612df116565b90506000612fc7828563ffffffff612df116565b90506000612fed83612fe1886103e863ffffffff612df116565b9063ffffffff613ad516565b9050808281612ff857fe5b04979650505050505050565b600080856001600160a01b03166370a08231856040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561305d57600080fd5b505afa158015613071573d6000803e3d6000fd5b505050506040513d602081101561308757600080fd5b5051604080516001600160a01b0388811660248301528781166044830152606480830188905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251949550600094918b169390918291908083835b6020831061310e5780518252601f1990920191602091820191016130ef565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613170576040519150601f19603f3d011682016040523d82523d6000602084013e613175565b606091505b50509050806131b55760405162461bcd60e51b8152600401808060200182810382526022815260200180613ccd6022913960400191505060405180910390fd5b61320f82886001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561148857600080fd5b979650505050505050565b60008061327786886001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561148857600080fd5b604080516370a0823160e01b815230600482015290519192506000916001600160a01b038b16916370a08231916024808301926020929190829003018186803b1580156132c357600080fd5b505afa1580156132d7573d6000803e3d6000fd5b505050506040513d60208110156132ed57600080fd5b505190506132fc878383612f3e565b92508583101561333d5760405162461bcd60e51b8152600401808060200182810382526023815260200180613d636023913960400191505060405180910390fd5b886001600160a01b03166308acece285856040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561339d57600080fd5b505af11580156133b1573d6000803e3d6000fd5b505050506040513d60208110156133c757600080fd5b50506040805188815260208101859052808201849052606081018390526001600160a01b0386811660808301529151918716917f0e67a82a4480e87657297872f2e152fcd5881f5ac59832c276c37357833b7d549181900360a00190a250509695505050505050565b604080516370a0823160e01b8152306004820152905160009182916001600160a01b038716916370a08231916024808301926020929190829003018186803b15801561347b57600080fd5b505afa15801561348f573d6000803e3d6000fd5b505050506040513d60208110156134a557600080fd5b5051604080516001600160a01b038781166024830152604480830188905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17815292518251949550600094918a169390918291908083835b602083106135245780518252601f199092019160209182019101613505565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613586576040519150601f19603f3d011682016040523d82523d6000602084013e61358b565b606091505b50509050806135cb5760405162461bcd60e51b8152600401808060200182810382526022815260200180613bc16022913960400191505060405180910390fd5b604080516370a0823160e01b8152306004820152905161364f916001600160a01b038916916370a0823191602480820192602092909190829003018186803b15801561361657600080fd5b505afa15801561362a573d6000803e3d6000fd5b505050506040513d602081101561364057600080fd5b5051839063ffffffff61368816565b9695505050505050565b6000816001141561366c57506000610e56565b60648083049083061561367d576001015b600202909103919050565b6000818310156136d8576040805162461bcd60e51b8152602060048201526016602482015275736166656d6174683a20737562206f766572666c6f7760501b604482015290519081900360640190fd5b50900390565b60008161372a576040805162461bcd60e51b8152602060048201526015602482015274736166656d6174683a20646976206279207a65726f60581b604482015290519081900360640190fd5b600082848161373557fe5b04905082848161374157fe5b0615612e59576001019392505050565b6000816001141561376457506003610e56565b60318204600181166137aa57613780838263ffffffff613ad516565b905060648106613791579050610e56565b6137a281600263ffffffff613ad516565b915050610e56565b6137a26001612fe1858463ffffffff613ad516565b60008161380b576040805162461bcd60e51b8152602060048201526015602482015274736166656d6174683a20646976206279207a65726f60581b604482015290519081900360640190fd5b81838161381457fe5b049392505050565b60005461382f908263ffffffff613ad516565b60009081556001600160a01b03831681526001602052604090205461385a908263ffffffff613ad516565b6001600160a01b03831660008181526001602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b604080516370a0823160e01b8152306004820152905160009182916001600160a01b038916916370a08231916024808301926020929190829003018186803b1580156138fd57600080fd5b505afa158015613911573d6000803e3d6000fd5b505050506040513d602081101561392757600080fd5b5051604080516370a0823160e01b8152306004820152905191925060009161397b9189916001600160a01b038d16916370a08231916024808301926020929190829003018186803b15801561148857600080fd5b9050613988878284612f3e565b9250858310156139c95760405162461bcd60e51b8152600401808060200182810382526027815260200180613d866027913960400191505060405180910390fd5b6139e36001600160a01b038916858563ffffffff61343016565b1515806139ee575082155b613a3f576040805162461bcd60e51b815260206004820152601d60248201527f646566737761703a206572726f722073656e64696e6720746f6b656e73000000604482015290519081900360640190fd5b6040805188815260208101859052808201839052606081018490526001600160a01b0386811660808301529151918716917f237ebbadd3df6d7d4821941f616af88a57b22ae4a03607c118d23fb3d7fcadc29181900360a00190a250509695505050505050565b8251613ab9906003906020860190613b28565b508151613acd906004906020850190613b28565b506005555050565b600082820183811015612e59576040805162461bcd60e51b8152602060048201526016602482015275736166656d6174683a20616464206f766572666c6f7760501b604482015290519081900360640190fd5b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613b6957805160ff1916838001178555613b96565b82800160010185558215613b96579182015b82811115613b96578251825591602001919060010190613b7b565b50613ba2929150613ba6565b5090565b6108ba91905b80821115613ba25760008155600101613bac56fe7361666564656665726332303a206572726f722073656e64696e6720746f6b656e73646566737761703a2062617365416d6f756e742069732062656c6f77205f6d696e42617365646566737761703a205f6d6178426173652069732062656c6f77206f662070756c6c6564207265717569726564646566737761703a206761736c656674206275696c64206d65746164617461206973206e6f7420656e6f756768646566737761703a2070756c6c65642062617365206973206e6f7420656e6f756768646566737761703a2065746820626f756768742069732062656c6f77205f6d696e45746865726332303a2073656e64657220616c6c6f77616e6365206973206e6f7420656e6f7567687361666564656665726332303a206572726f722070756c6c696e6720746f6b656e7365726332303a206275726e205f66726f6d2062616c616e6365206973206e6f7420656e6f756768646566737761703a206572726f722070756c6c696e67206261736520746f6b656e7365726332303a207472616e73666572205f66726f6d2062616c616e6365206973206e6f7420656e6f756768646566737761703a20626f7567687420626173652062656c6f77205f6d696e42617365646566737761703a20626f7567687420746f6b656e732062656c6f77205f6d696e546f6b656e73646566737761703a205f65786368616e67652063616e277420626520556e6973776170646566737761703a2070756c6c207a65726f20746f6b656e73206973206e6f7420616c6c6f7765647265656e7472616e63792d67756172643a207265656e7472616e742063616c6c646566737761703a20746f6b656e7320626f756768742069732062656c6f77205f6d696e546f6b656e73646566737761703a20746f6b656e416d6f756e742069732062656c6f77205f6d696e546f6b656e73a265627a7a72315820a5f9aa9deabd146e5c52eeacbd222794edfa1b31fc324a95dde183a84840ec6564736f6c634300050c0032

Deployed Bytecode Sourcemap

18114:23691:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41745:10;41759:9;41745:23;;41737:57;;;;;-1:-1:-1;;;41737:57:0;;;;;;;;;;;;-1:-1:-1;;;41737:57:0;;;;;;;;;;;;;;;18114:23691;13221:86;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13221:86:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;13221:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14139:149;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14139:149:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14139:149:0;;-1:-1:-1;;;;;14139:149:0;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;13775:206;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13775:206:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13775:206:0;;-1:-1:-1;;;;;13775:206:0;;;;;;:::i;13411:94::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13411:94:0;;;:::i;:::-;;;;;;;;;;;;;;;;14296:156;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14296:156:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;14296:156:0;;;;;;;;;;;;;;;;;:::i;20892:95::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20892:95:0;;;:::i;:::-;;;;-1:-1:-1;;;;;20892:95:0;;;;;;;;;;;;;;13315:88;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13315:88:0;;;:::i;24256:1024::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24256:1024:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24256:1024:0;;;;;;;:::i;26300:269::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26300:269:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26300:269:0;;:::i;26577:267::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26577:267:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26577:267:0;;:::i;20716:79::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20716:79:0;;;:::i;36519:892::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36519:892:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36519:892:0;;;;;;;;;;;-1:-1:-1;;;;;36519:892:0;;:::i;13513:108::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13513:108:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13513:108:0;-1:-1:-1;;;;;13513:108:0;;:::i;35652:859::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35652:859:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35652:859:0;;;;;;;:::i;22858:1390::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22858:1390:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22858:1390:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;13123:90;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13123:90:0;;;:::i;20995:1855::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20995:1855:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20995:1855:0;;;;;;;:::i;27630:928::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27630:928:0;;;;;;;;;;;-1:-1:-1;;;;;27630:928:0;;:::i;25288:1004::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25288:1004:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25288:1004:0;;;;;;;:::i;30355:1527::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30355:1527:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30355:1527:0;;;;;;;:::i;29444:903::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29444:903:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29444:903:0;;;;;;;;;;;-1:-1:-1;;;;;29444:903:0;;:::i;26852:738::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26852:738:0;;:::i;31890:1560::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31890:1560:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31890:1560:0;;;;;;;;;;;-1:-1:-1;;;;;31890:1560:0;;:::i;19738:146::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19738:146:0;;;:::i;13629:138::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13629:138:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;13629:138:0;;;;;;;;;;:::i;28566:870::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28566:870:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28566:870:0;;;;;;;:::i;19892:816::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19892:816:0;;;:::i;37419:1937::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37419:1937:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;37419:1937:0;;;;;;;;-1:-1:-1;;;;;37419:1937:0;;;;;;;;;;;;:::i;33458:2186::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33458:2186:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;33458:2186:0;;;;;;;;-1:-1:-1;;;;;33458:2186:0;;;;;;;;;;;;:::i;20803:81::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20803:81:0;;;:::i;13221:86::-;13293:6;13286:13;;;;;;;;;;;;;-1:-1:-1;;13286:13:0;;;;;;;;;;;;;;;;;;;;;;;;;;13260;;13286;;13293:6;;13286:13;;;13293:6;13286:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13221:86;;:::o;14139:149::-;14209:4;14226:32;14236:10;14248:3;14253:4;14226:9;:32::i;:::-;-1:-1:-1;14276:4:0;14139:149;;;;;:::o;13775:206::-;13864:36;;;;;;;;13842:4;;-1:-1:-1;;;;;13864:36:0;;;13873:10;;13864:36;;;;;;;;;;-1:-1:-1;13923:10:0;13911:23;;;;:11;:23;;;;;;;;-1:-1:-1;;;;;13911:33:0;;;;;;;;;;;;;:40;-1:-1:-1;;13775:206:0:o;13411:94::-;13457:7;13484:13;13411:94;:::o;14296:156::-;14378:4;14395:27;14405:5;14412:3;14417:4;14395:9;:27::i;:::-;-1:-1:-1;14440:4:0;14296:156;;;;;:::o;20892:95::-;20970:9;;-1:-1:-1;;;;;20970:9:0;;20892:95::o;13315:88::-;13385:10;;13315:88;:::o;24256:1024::-;24386:18;10567:1;11256:10;;:23;;11248:68;;;;;-1:-1:-1;;;11248:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;11248:68:0;;;;;;;;;;;;;;;10567:1;11327:10;:22;24481:21;24505:13;24537:18;24529:53;;;;;-1:-1:-1;;;24529:53:0;;;;;;;;;;;;-1:-1:-1;;;24529:53:0;;;;;;;;;;;;;;;24643:6;;24714:31;;;-1:-1:-1;;;24714:31:0;;24739:4;24714:31;;;;;;-1:-1:-1;;;;;24643:6:0;;;;-1:-1:-1;;24643:6:0;;-1:-1:-1;;24714:31:0;;;;;;;;;;;;;;;24643:6;24714:31;;;5:2:-1;;;;30:1;27;20:12;5:2;24714:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24714:31:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24714:31:0;;-1:-1:-1;24837:13:0;24810:24;:7;24714:31;24810:24;:11;:24;:::i;:::-;:40;;;;;24945:54;;;24810:40;;;;24945:54;;;24985:1;24945:54;;;;;;;;;;24997:1;24945:54;;;;;;24810:40;;-1:-1:-1;24961:10:0;;24945:54;;;;;;;;;;25010:26;25016:10;25028:7;25010:5;:26::i;:::-;25144:8;25130:10;:22;;25122:72;;;;-1:-1:-1;;;25122:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25205:46;;;-1:-1:-1;;;25205:46:0;;25228:10;25205:46;;;;;;;;;;;;-1:-1:-1;;;;;25205:22:0;;;;;:46;;;;;;;;;;;;;;-1:-1:-1;25205:22:0;:46;;;5:2:-1;;;;30:1;27;20:12;5:2;25205:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25205:46:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;10614:1:0;11372:10;:24;-1:-1:-1;24256:1024:0;;;-1:-1:-1;;;;24256:1024:0:o;26300:269::-;26472:6;;:31;;;-1:-1:-1;;;26472:31:0;;26497:4;26472:31;;;;;;-1:-1:-1;;26419:142:0;;26448:9;;-1:-1:-1;;;;;26472:6:0;;;;-1:-1:-1;;26472:31:0;;;;;;;;;;;;;;;:6;:31;;;5:2:-1;;;;30:1;27;20:12;5:2;26472:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26472:31:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26472:31:0;26518:7;;:32;;;-1:-1:-1;;;26518:32:0;;26544:4;26518:32;;;;;;-1:-1:-1;;;;;26518:7:0;;;;-1:-1:-1;;26518:32:0;;;;;26472:31;;26518:32;;;;;;;;:7;:32;;;5:2:-1;;;;30:1;27;20:12;5:2;26518:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26518:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26518:32:0;26419:14;:142::i;26577:267::-;26747:7;;:32;;;-1:-1:-1;;;26747:32:0;;26773:4;26747:32;;;;;;-1:-1:-1;;26693:143:0;;26722:10;;-1:-1:-1;;;;;26747:7:0;;;;-1:-1:-1;;26747:32:0;;;;;;;;;;;;;;;:7;:32;;;5:2:-1;;;;30:1;27;20:12;5:2;26747:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26747:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26747:32:0;26794:6;;:31;;;-1:-1:-1;;;26794:31:0;;26819:4;26794:31;;;;;;-1:-1:-1;;;;;26794:6:0;;;;-1:-1:-1;;26794:31:0;;;;;26747:32;;26794:31;;;;;;;;:6;:31;;;5:2:-1;;;;30:1;27;20:12;20716:79:0;20781:6;;-1:-1:-1;;;;;20781:6:0;;20716:79::o;36519:892::-;36673:14;10567:1;11256:10;;:23;;11248:68;;;;;-1:-1:-1;;;11248:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;11248:68:0;;;;;;;;;;;;;;;10567:1;11327:10;:22;36762:7;;-1:-1:-1;;;;;36762:7:0;36745:14;36906:60;36762:7;36931:10;36951:4;36958:7;36906:24;:60::i;:::-;37077:6;;36887:79;;-1:-1:-1;37050:353:0;;-1:-1:-1;;;;;37077:6:0;37135:7;36887:79;37264:8;37308:10;37356;37050:12;:353::i;:::-;10614:1;11372:10;:24;37041:362;36519:892;-1:-1:-1;;;;;;36519:892:0:o;13513:108::-;-1:-1:-1;;;;;13597:16:0;;13570:7;13597:16;;;-1:-1:-1;13597:16:0;;;;;;13513:108;;;;:::o;35652:859::-;35773:14;10567:1;11256:10;;:23;;11248:68;;;;;-1:-1:-1;;;11248:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;11248:68:0;;;;;;;;;;;;;;;10567:1;11327:10;:22;35862:7;;-1:-1:-1;;;;;35862:7:0;35845:14;36006:60;35862:7;36031:10;36051:4;36058:7;36006:24;:60::i;:::-;36177:6;;35987:79;;-1:-1:-1;36150:353:0;;-1:-1:-1;;;;;36177:6:0;36235:7;35987:79;36364:8;36408:10;;36150:12;:353::i;:::-;10614:1;11372:10;:24;36141:362;35652:859;-1:-1:-1;;;;;35652:859:0:o;22858:1390::-;23013:18;23042:19;10567:1;11256:10;;:23;;11248:68;;;;;-1:-1:-1;;;11248:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;11248:68:0;;;;;;;;;;;;;;;10567:1;11327:10;:22;23138:21;23162:13;23194:18;23186:53;;;;;-1:-1:-1;;;23186:53:0;;;;;;;;;;;;-1:-1:-1;;;23186:53:0;;;;;;;;;;;;;;;23302:7;;23336:6;;23410:32;;;-1:-1:-1;;;23410:32:0;;23436:4;23410:32;;;;;;-1:-1:-1;;;;;23302:7:0;;;;23336:6;;;;-1:-1:-1;;23302:7:0;;-1:-1:-1;;23410:32:0;;;;;;;;;;;;;;;23302:7;23410:32;;;5:2:-1;;;;30:1;27;20:12;5:2;23410:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23410:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23410:32:0;23475:31;;;-1:-1:-1;;;23475:31:0;;23500:4;23475:31;;;;;;23410:32;;-1:-1:-1;;;;;;;;23475:16:0;;;-1:-1:-1;;23475:31:0;;;;;23410:32;;23475:31;;;;;;;:16;:31;;;5:2:-1;;;;30:1;27;20:12;5:2;23475:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23475:31:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23475:31:0;;-1:-1:-1;23609:13:0;23582:24;:7;23475:31;23582:24;:11;:24;:::i;:::-;:40;;;;;;;-1:-1:-1;23675:13:0;23647:25;:7;23659:12;23647:25;:11;:25;:::i;:::-;:41;;;;;23764:64;;;;;;23647:41;;;;23764:64;;;;;;;;;;;;23826:1;23764:64;;;;;;23647:41;;-1:-1:-1;23780:10:0;;23764:64;;;;;;;;;;23839:26;23845:10;23857:7;23839:5;:26::i;:::-;23950:8;23936:10;:22;;23928:72;;;;-1:-1:-1;;;23928:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24107:10;24058:45;-1:-1:-1;;;;;24058:20:0;;24079:10;24091:11;24058:20;:45::i;:::-;:59;;24050:112;;;;-1:-1:-1;;;24050:112:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24173:46;;;-1:-1:-1;;;24173:46:0;;24196:10;24173:46;;;;;;;;;;;;-1:-1:-1;;;;;24173:22:0;;;;;:46;;;;;;;;;;;;;;-1:-1:-1;24173:22:0;:46;;;5:2:-1;;;;30:1;27;20:12;5:2;24173:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24173:46:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;10614:1:0;11372:10;:24;-1:-1:-1;22858:1390:0;;;;-1:-1:-1;22858:1390:0;;-1:-1:-1;;;;;;22858:1390:0:o;13123:90::-;13197:8;13190:15;;;;;;;;;;;;;-1:-1:-1;;13190:15:0;;;;;;;;;;;;;;;;;;;;;;;;;;13164:13;;13190:15;;13197:8;;13190:15;;;13197:8;13190:15;;;;;;;;;;;;;;;;;;;;;;;;20995:1855;21108:14;10567:1;11256:10;;:23;;11248:68;;;;;-1:-1:-1;;;11248:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;11248:68:0;;;;;;;;;;;;;;;10567:1;11327:10;:22;21152:7;;21186:6;;-1:-1:-1;;;;;21152:7:0;;;;21186:6;21135:14;21334:60;21152:7;21359:10;21379:4;21386:7;21334:24;:60::i;:::-;21315:79;-1:-1:-1;21413:13:0;21405:66;;;;-1:-1:-1;;;21405:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21484:20;21539:13;;21613:18;21609:1090;;21708:56;;;-1:-1:-1;;;21708:56:0;;21728:10;21708:56;;;;21748:4;21708:56;;;;;;;;;;;;-1:-1:-1;;;;;21708:19:0;;;-1:-1:-1;;21708:56:0;;;;;;;;;;;;;;-1:-1:-1;21708:19:0;:56;;;5:2:-1;;;;30:1;27;20:12;5:2;21708:56:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21708:56:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21708:56:0;21700:103;;;;-1:-1:-1;;;21700:103:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21833:27;21851:8;21833:17;:27::i;:::-;21818:42;;21884:12;21875:21;;21609:1090;;;22021:32;;;-1:-1:-1;;;22021:32:0;;22047:4;22021:32;;;;;;21998:20;;22021:46;;22058:8;;-1:-1:-1;;;;;22021:17:0;;;;;:32;;;;;;;;;;;;;;;:17;:32;;;5:2:-1;;;;30:1;27;20:12;5:2;22021:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22021:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22021:32:0;;:46;:36;:46;:::i;:::-;22104:31;;;-1:-1:-1;;;22104:31:0;;22129:4;22104:31;;;;;;21998:69;;-1:-1:-1;;;;;;;;22104:16:0;;;-1:-1:-1;;22104:31:0;;;;;;;;;;;;;;:16;:31;;;5:2:-1;;;;30:1;27;20:12;5:2;22104:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22104:31:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22104:31:0;;-1:-1:-1;22150:20:0;22173:48;22208:12;22173:25;:8;22104:31;22173:25;:12;:25;:::i;:::-;:34;:48;:34;:48;:::i;:::-;22150:71;;22300:85;22324:10;22344:4;22351:33;22371:12;22351:19;:33::i;:::-;-1:-1:-1;;;;;22300:23:0;;;;:85;:23;:85::i;:::-;22285:100;;22424:8;22408:12;:24;;22400:82;;;;-1:-1:-1;;;22400:82:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22521:12;22505;:28;;22497:75;;;;-1:-1:-1;;;22497:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22639:48;22675:11;22639:31;:12;22656:13;22639:31;:16;:31;:::i;:::-;:35;:48;:35;:48;:::i;:::-;22630:57;;21609:1090;;;;22750:56;;;;;;;;;;;;;;;;;;;;22763:10;;22750:56;;;;;;;;;;22817:25;22823:10;22835:6;22817:5;:25::i;27630:928::-;27795:14;10567:1;11256:10;;:23;;11248:68;;;;;-1:-1:-1;;;11248:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;11248:68:0;;;;;;;;;;;;;;;10567:1;11327:10;:22;27886:15;27873:28;;;27865:69;;;;;-1:-1:-1;;;27865:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;28008:18;28029:9;:123;;28151:1;28029:123;;;28078:9;;:59;;;-1:-1:-1;;;28078:59:0;;:9;:59;;;;-1:-1:-1;;28078:59:0;;;;;;28046:102;;-1:-1:-1;;;;;28078:9:0;;-1:-1:-1;;28114:9:0;;28078:59;;;;;;;;;;;;;;;28114:9;28078;:59;;;5:2:-1;;;;30:1;27;20:12;5:2;28078:59:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28078:59:0;;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28078:59:0;28046:17;:102::i;:::-;28261:6;;28302:7;;28008:144;;-1:-1:-1;28234:316:0;;-1:-1:-1;;;;;28261:6:0;;;;28302:7;28008:144;28405:10;28453;28501;28234:12;:316::i;25288:1004::-;25421:19;10567:1;11256:10;;:23;;11248:68;;;;;-1:-1:-1;;;11248:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;11248:68:0;;;;;;;;;;;;;;;10567:1;11327:10;:22;25517:21;25541:13;25573:18;25565:53;;;;;-1:-1:-1;;;25565:53:0;;;;;;;;;;;;-1:-1:-1;;;25565:53:0;;;;;;;;;;;;;;;25680:7;;25754:32;;;-1:-1:-1;;;25754:32:0;;25780:4;25754:32;;;;;;-1:-1:-1;;;;;25680:7:0;;;;-1:-1:-1;;25680:7:0;;-1:-1:-1;;25754:32:0;;;;;;;;;;;;;;;25680:7;25754:32;;;5:2:-1;;;;30:1;27;20:12;5:2;25754:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25754:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25754:32:0;;-1:-1:-1;25881:13:0;25853:25;:7;25754:32;25853:25;:11;:25;:::i;:::-;:41;;;;;25989:55;;;26017:1;25989:55;;25853:41;;;;25989:55;;;;;;;;;;;;26042:1;25989:55;;;;;;25853:41;;-1:-1:-1;26005:10:0;;25989:55;;;;;;;;;;26055:26;26061:10;26073:7;26055:5;:26::i;:::-;26229:10;26180:45;-1:-1:-1;;;;;26180:20:0;;26201:10;26213:11;26180:20;:45::i;:::-;:59;;26172:112;;;;-1:-1:-1;;;26172:112:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;10614:1:0;11372:10;:24;-1:-1:-1;25288:1004:0;;-1:-1:-1;;25288:1004:0:o;30355:1527::-;30474:14;10567:1;11256:10;;:23;;11248:68;;;;;-1:-1:-1;;;11248:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;11248:68:0;;;;;;;;;;;;;;;10567:1;11327:10;:22;30563:7;;-1:-1:-1;;;;;30563:7:0;30546:14;30707:60;30563:7;30732:10;30752:4;30759:7;30707:24;:60::i;:::-;30963:6;;30688:79;;-1:-1:-1;30879:18:0;;30900:468;;30932:425;;-1:-1:-1;;;;;30963:6:0;31027:7;30688:79;30879:18;31244:10;31306:4;30932:12;:425::i;:::-;30900:17;:468::i;:::-;30879:489;-1:-1:-1;31448:15:0;:298;;31745:1;31448:298;;;31466:9;;:276;;;-1:-1:-1;;;31466:276:0;;;;;;;;:9;:276;;;;-1:-1:-1;;31466:276:0;;;;31697:10;31466:276;;;;;;-1:-1:-1;;;;;31466:9:0;;;;-1:-1:-1;;31466:276:0;;;;;;;;;;;;;;;-1:-1:-1;31466:9:0;:276;;;5:2:-1;;;;30:1;27;20:12;5:2;31466:276:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31466:276:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31466:276:0;31448:298;31439:307;;31826:7;31816:6;:17;;31808:66;;;;-1:-1:-1;;;31808:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29444:903;29600:14;10567:1;11256:10;;:23;;11248:68;;;;;-1:-1:-1;;;11248:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;11248:68:0;;;;;;;;;;;;;;;10567:1;11327:10;:22;29674:6;;29743:62;;;-1:-1:-1;;;29743:62:0;;29770:10;29743:62;;;;29790:4;29743:62;;;;;;;;;;;;-1:-1:-1;;;;;29674:6:0;;;;;;29743:26;;:62;;;;;;;;;;;;;;-1:-1:-1;29674:6:0;29743:62;;;5:2:-1;;;;30:1;27;20:12;5:2;29743:62:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29743:62:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29884:16:0;;-1:-1:-1;29903:26:0;29921:7;29903:17;:26::i;:::-;30096:7;;29884:45;;-1:-1:-1;30011:328:0;;30038:6;;-1:-1:-1;;;;;30096:7:0;29884:45;30196:10;30242;30290;30011:12;:328::i;26852:738::-;26956:14;10567:1;11256:10;;:23;;11248:68;;;;;-1:-1:-1;;;11248:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;11248:68:0;;;;;;;;;;;;;;;10567:1;11327:10;:22;27044:18;27065:9;:123;;27187:1;27065:123;;;27114:9;;:59;;;-1:-1:-1;;;27114:59:0;;:9;:59;;;;-1:-1:-1;;27114:59:0;;;;;;27082:102;;-1:-1:-1;;;;;27114:9:0;;-1:-1:-1;;27150:9:0;;27114:59;;;;;;;;;;;;;;;27150:9;27114;:59;;;5:2:-1;;;;30:1;27;20:12;27082:102:0;27293:6;;27334:7;;27044:144;;-1:-1:-1;27266:316:0;;-1:-1:-1;;;;;27293:6:0;;;;27334:7;27044:144;27437:10;27485;;27266:12;:316::i;:::-;10614:1;11372:10;:24;27257:325;26852:738;-1:-1:-1;;;26852:738:0:o;31890:1560::-;32042:14;10567:1;11256:10;;:23;;11248:68;;;;;-1:-1:-1;;;11248:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;11248:68:0;;;;;;;;;;;;;;;10567:1;11327:10;:22;32131:7;;-1:-1:-1;;;;;32131:7:0;32114:14;32275:60;32131:7;32300:10;32320:4;32327:7;32275:24;:60::i;:::-;32531:6;;32256:79;;-1:-1:-1;32447:18:0;;32468:468;;32500:425;;-1:-1:-1;;;;;32531:6:0;32595:7;32256:79;32447:18;32812:10;32874:4;32500:12;:425::i;32468:468::-;32447:489;-1:-1:-1;33016:15:0;:298;;33313:1;33016:298;;;33034:9;;:276;;;-1:-1:-1;;;33034:276:0;;;;;;;;:9;:276;;;;-1:-1:-1;;33034:276:0;;;;-1:-1:-1;;;;;33034:276:0;;;;;;;;;:9;;;;;-1:-1:-1;;33034:276:0;;;;;;;;;;;;;;-1:-1:-1;33034:9:0;:276;;;5:2:-1;;;;30:1;27;20:12;5:2;33034:276:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33034:276:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33034:276:0;33016:298;33007:307;;33394:7;33384:6;:17;;33376:66;;;;-1:-1:-1;;;33376:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;10614:1:0;11372:10;:24;-1:-1:-1;31890:1560:0;;-1:-1:-1;;;31890:1560:0:o;19738:146::-;10567:1;11256:10;;:23;;11248:68;;;;;-1:-1:-1;;;11248:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;11248:68:0;;;;;;;;;;;;;;;10567:1;11327:10;:22;19795:6;;19832:9;;19795:81;;;-1:-1:-1;;;19795:81:0;;-1:-1:-1;;;;;19832:9:0;;;19795:81;;;;-1:-1:-1;;19795:81:0;;;;;;:6;;;;;-1:-1:-1;;19795:81:0;;;;;;;;;;;;;;-1:-1:-1;19795:6:0;:81;;;5:2:-1;;;;30:1;27;20:12;5:2;19795:81:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19795:81:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;10614:1:0;11372:10;:24;19738:146::o;13629:138::-;-1:-1:-1;;;;;13731:18:0;;;13704:7;13731:18;;;:11;:18;;;;;;;;:28;;;;;;;;;;;;;13629:138::o;28566:870::-;28689:14;10567:1;11256:10;;:23;;11248:68;;;;;-1:-1:-1;;;11248:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;11248:68:0;;;;;;;;;;;;;;;10567:1;11327:10;:22;28763:6;;28832:62;;;-1:-1:-1;;;28832:62:0;;28859:10;28832:62;;;;28879:4;28832:62;;;;;;;;;;;;-1:-1:-1;;;;;28763:6:0;;;;;;28832:26;;:62;;;;;;;;;;;;;;-1:-1:-1;28763:6:0;28832:62;;;5:2:-1;;;;30:1;27;20:12;5:2;28832:62:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28832:62:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28973:16:0;;-1:-1:-1;28992:26:0;29010:7;28992:17;:26::i;:::-;29185:7;;28973:45;;-1:-1:-1;29100:328:0;;29127:6;;-1:-1:-1;;;;;29185:7:0;28973:45;29285:10;29331;;29100:12;:328::i;19892:816::-;10567:1;11256:10;;:23;;11248:68;;;;;-1:-1:-1;;;11248:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;11248:68:0;;;;;;;;;;;;;;;10567:1;11327:10;:22;19972:7;;-1:-1:-1;;;;;19972:7:0;20012:6;19999:9;:19;;19991:77;;;;-1:-1:-1;;;19991:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20189:45;;;22:32:-1;6:49;;20189:45:0;;;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;20158:87:0;;;;-1:-1:-1;;20127:17:0;;-1:-1:-1;;;;;20158:16:0;;;20189:45;;20158:87;;;;;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;20158:87:0;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;-1:-1;20370:47:0;;;22:32:-1;6:49;;20370:47:0;;;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;20339:89:0;;;;20081:164;;-1:-1:-1;20081:164:0;;-1:-1:-1;;;20306:19:0;;-1:-1:-1;;;;;20339:16:0;;;:89;;;;25:18:-1;20339:89:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;20339:89:0;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;20258:170:0;;;;20441:259;20492:13;;;;;;;;;;;;;-1:-1:-1;;;20492:13:0;;;20507;:52;;;;;;;;;;;;;;-1:-1:-1;;;20507:52:0;;;;;;;20534:6;20523:28;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;20523:28:0;;;;;;;;;;;;;19:11:-1;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;213:10;;261:11;244:29;;285:43;;;282:58;-1:-1;233:115;230:2;;;361:1;358;351:12;230:2;372:25;;-1:-1;20523:28:0;;420:4:-1;411:14;;;;20523:28:0;;;;;411:14:-1;20523:28:0;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;20523:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20507:52;20475:85;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;20475:85:0;;;;;;;;;;-1:-1:-1;20475:85:0;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;20475:85:0;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;20475:85:0;;;20600:11;:52;;;;;;;;;;;;;;-1:-1:-1;;;20600:52:0;;;;;;;20625:4;20614:26;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;20614:26:0;;;;;;;;;;;;;19:11:-1;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;213:10;;261:11;244:29;;285:43;;;282:58;-1:-1;233:115;230:2;;;361:1;358;351:12;230:2;372:25;;-1:-1;20614:26:0;;420:4:-1;411:14;;;;20614:26:0;;;;;411:14:-1;20614:26:0;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;20614:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20600:52;20654:10;;;;;;;;;;;;;-1:-1:-1;;;20654:10:0;;;20583:82;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;20583:82:0;;;;;;;;;;-1:-1:-1;20583:82:0;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;20583:82:0;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;20583:82:0;;;18517:2;20441:12;:259::i;:::-;-1:-1:-1;;10614:1:0;11372:10;:24;-1:-1:-1;;;19892:816:0:o;37419:1937::-;37615:14;10567:1;11256:10;;:23;;11248:68;;;;;-1:-1:-1;;;11248:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;11248:68:0;;;;;;;;;;;;;;;10567:1;11327:10;:22;37810:9;;-1:-1:-1;;;;;37785:35:0;;;37810:9;;37785:35;;37777:83;;;;-1:-1:-1;;;37777:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37930:7;;37964:6;;-1:-1:-1;;;;;37930:7:0;;;;37964:6;37913:14;38107:60;37930:7;38132:10;38152:4;38159:7;38107:24;:60::i;:::-;38244:32;;;-1:-1:-1;;;38244:32:0;;38270:4;38244:32;;;;;;38088:79;;-1:-1:-1;38221:20:0;;38244:46;;38088:79;;-1:-1:-1;;;;;38244:17:0;;;;;:32;;;;;;;;;;;;;;:17;:32;;;5:2:-1;;;;30:1;27;20:12;38244:46:0;38323:31;;;-1:-1:-1;;;38323:31:0;;38348:4;38323:31;;;;;;38221:69;;-1:-1:-1;;;;;;;;38323:16:0;;;-1:-1:-1;;38323:31:0;;;;;;;;;;;;;;:16;:31;;;5:2:-1;;;;30:1;27;20:12;5:2;38323:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38323:31:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38323:31:0;;-1:-1:-1;38514:18:0;38535:51;38550:8;38560:12;38323:31;38535:14;:51::i;:::-;38602:88;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38602:88:0;;;;;;;;;;-1:-1:-1;38615:10:0;;38602:88;;;;;-1:-1:-1;38602:88:0;;;38976:41;;;-1:-1:-1;;;38976:41:0;;-1:-1:-1;;;;;38976:41:0;;;;;;;;;;;;;;;:14;;;;;;:41;;;;;;;;;;;;;;;-1:-1:-1;38976:14:0;:41;;;5:2:-1;;;;30:1;27;20:12;5:2;38976:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38976:41:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;39037:212:0;;;-1:-1:-1;;;39037:212:0;;;;;;;;;;;;;;-1:-1:-1;;;;;39037:212:0;;;;;;;;;:56;;;;-1:-1:-1;;39037:212:0;;;;;38976:41;;39037:212;;;;;;;;-1:-1:-1;39037:56:0;:212;;;5:2:-1;;;;30:1;27;20:12;5:2;39037:212:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39037:212:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39037:212:0;39316:32;;;-1:-1:-1;;;39316:32:0;;-1:-1:-1;;;;;39316:32:0;;;;;;;-1:-1:-1;39316:32:0;;;;;;;;39037:212;;-1:-1:-1;39316:14:0;;;-1:-1:-1;;39316:32:0;;;;;39037:212;;39316:32;;;;;;;;;;;:14;:32;;;5:2:-1;;;;30:1;27;20:12;5:2;39316:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39316:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;10614:1:0;11372:10;:24;-1:-1:-1;37419:1937:0;;;-1:-1:-1;;;;;;;;;37419:1937:0:o;33458:2186::-;33653:14;10567:1;11256:10;;:23;;11248:68;;;;;-1:-1:-1;;;11248:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;11248:68:0;;;;;;;;;;;;;;;10567:1;11327:10;:22;33742:7;;-1:-1:-1;;;;;33742:7:0;33725:14;33886:60;33742:7;33911:10;33931:4;33938:7;33886:24;:60::i;:::-;34142:6;;33867:79;;-1:-1:-1;34058:18:0;;34079:468;;34111:425;;-1:-1:-1;;;;;34142:6:0;34206:7;33867:79;34058:18;34423:10;34485:4;34111:12;:425::i;34079:468::-;34058:489;-1:-1:-1;34651:17:0;34671:15;:232;;34902:1;34671:232;;;34689:9;;:210;;;-1:-1:-1;;;34689:210:0;;;;;;;;:9;:210;;;;-1:-1:-1;;34689:210:0;;;;;;-1:-1:-1;;;;;34689:9:0;;;;-1:-1:-1;;34689:210:0;;;;;;;;;;;;;;;-1:-1:-1;34689:9:0;:210;;;5:2:-1;;;;30:1;27;20:12;5:2;34689:210:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34689:210:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34689:210:0;34671:232;34651:252;-1:-1:-1;34983:14:0;:315;;35297:1;34983:315;;;35000:294;;;-1:-1:-1;;;35000:294:0;;35128:1;35000:294;;;;-1:-1:-1;;35000:294:0;;;;-1:-1:-1;;;;;35000:294:0;;;;;;;;;:55;;;;-1:-1:-1;;35076:9:0;;35000:294;;;;;;;;;;;;;;35076:9;35000:55;:294;;;5:2:-1;;;;30:1;27;20:12;5:2;35000:294:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35000:294:0;;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35000:294:0;34983:315;34974:324;;35579:10;35569:6;:20;;35561:75;;;;-1:-1:-1;;;35561:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;10614:1:0;11372:10;:24;-1:-1:-1;33458:2186:0;;;-1:-1:-1;;;;;33458:2186:0:o;20803:81::-;20869:7;;-1:-1:-1;;;;;20869:7:0;;20803:81::o;15237:729::-;-1:-1:-1;;;;;15355:19:0;;:10;:19;15351:324;;-1:-1:-1;;;;;15413:18:0;;15391:19;15413:18;;;:11;:18;;;;;;;;15432:10;15413:30;;;;;;;;-1:-1:-1;;15462:23:0;;15458:206;;15529:4;15514:11;:19;;15506:69;;;;-1:-1:-1;;;15506:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15627:21;:11;15643:4;15627:21;:15;:21;:::i;:::-;-1:-1:-1;;;;;15594:18:0;;;;;;:11;:18;;;;;;;;15613:10;15594:30;;;;;;;:54;15458:206;15351:324;;-1:-1:-1;;;;;15709:16:0;;15687:19;15709:16;;;-1:-1:-1;15709:16:0;;;;;;15744:19;;;;15736:75;;;;-1:-1:-1;;;15736:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15841:21;:11;15857:4;15841:21;:15;:21;:::i;:::-;-1:-1:-1;;;;;15822:16:0;;;;;;;-1:-1:-1;15822:16:0;;;;;;:40;;;;15890:14;;;;;;;:24;;15909:4;15890:18;:24::i;:::-;-1:-1:-1;;;;;15873:14:0;;;;;;;-1:-1:-1;15873:14:0;;;;;;;;;:41;;;;15932:26;;;;;;;15873:14;;15932:26;;;;;;;;;;;;;15237:729;;;;:::o;11846:237::-;11904:7;11928:6;11924:47;;-1:-1:-1;11958:1:0;11951:8;;11924:47;11995:5;;;11999:1;11995;:5;:1;12019:5;;;;;:10;12011:45;;;;;-1:-1:-1;;;12011:45:0;;;;;;;;;;;;-1:-1:-1;;;12011:45:0;;;;;;;;;;;;;;;12074:1;11846:237;-1:-1:-1;;;11846:237:0:o;14874:355::-;-1:-1:-1;;;;;14981:16:0;;14963:15;14981:16;;;-1:-1:-1;14981:16:0;;;;;;15016:15;;;;15008:67;;;;-1:-1:-1;;;15008:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15105:17;:7;15117:4;15105:17;:11;:17;:::i;:::-;-1:-1:-1;;;;;15086:16:0;;;;;;-1:-1:-1;15086:16:0;;;;;:36;;;;15149:13;:23;;15167:4;15149:17;:23::i;:::-;15133:13;:39;;;15188:33;;;;;;;;-1:-1:-1;;;;;15188:33:0;;;;;;;;;;;;;14874:355;;;:::o;39364:511::-;39513:7;39541:18;;;;;:41;;-1:-1:-1;39563:19:0;;;39541:41;39533:83;;;;;-1:-1:-1;;;39533:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;39627:26;39656:21;:12;39673:3;39656:21;:16;:21;:::i;:::-;39627:50;-1:-1:-1;39688:17:0;39708:38;39627:50;39731:14;39708:38;:22;:38;:::i;:::-;39688:58;-1:-1:-1;39757:19:0;39779:47;39807:18;39779:23;:13;39797:4;39779:23;:17;:23;:::i;:::-;:27;:47;:27;:47;:::i;:::-;39757:69;;39856:11;39844:9;:23;;;;;;;39364:511;-1:-1:-1;;;;;;;39364:511:0:o;16638:555::-;16817:21;;;-1:-1:-1;;;16817:21:0;;-1:-1:-1;;;;;16817:21:0;;;;;;;;;16782:7;;;;16817:16;;;;;;:21;;;;;;;;;;;;;;;:16;:21;;;5:2:-1;;;;30:1;27;20:12;5:2;16817:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16817:21:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16817:21:0;16905:153;;;-1:-1:-1;;;;;16905:153:0;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;16905:153:0;;;;;;16817:21;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;16870:199:0;;;;16817:21;;-1:-1:-1;;;16870:20:0;;;;:199;;;;25:18:-1;16870:199:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;16870:199:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;16851:218:0;;;17090:7;17082:54;;;;-1:-1:-1;;;17082:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17154:21;;;-1:-1:-1;;;17154:21:0;;-1:-1:-1;;;;;17154:21:0;;;;;;;;;:31;;17180:4;;17154:16;;;;;;:21;;;;;;;;;;;;;;;:16;:21;;;5:2:-1;;;;30:1;27;20:12;17154:31:0;17147:38;16638:555;-1:-1:-1;;;;;;;16638:555:0:o;40816:834::-;41113:32;;;-1:-1:-1;;;41113:32:0;;41139:4;41113:32;;;;;;41018:18;;;;41113:45;;41150:7;;-1:-1:-1;;;;;41113:17:0;;;;;:32;;;;;;;;;;;;;;:17;:32;;;5:2:-1;;;;30:1;27;20:12;41113:45:0;41191:31;;;-1:-1:-1;;;41191:31:0;;41216:4;41191:31;;;;;;41090:68;;-1:-1:-1;;;;;;;;41191:16:0;;;-1:-1:-1;;41191:31:0;;;;;;;;;;;;;;:16;:31;;;5:2:-1;;;;30:1;27;20:12;5:2;41191:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41191:31:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41191:31:0;;-1:-1:-1;41282:50:0;41297:7;41306:12;41191:31;41282:14;:50::i;:::-;41269:63;;41439:8;41425:10;:22;;41417:70;;;;-1:-1:-1;;;41417:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41498:46;;;-1:-1:-1;;;41498:46:0;;-1:-1:-1;;;;;41498:46:0;;;;;;;;;;;;;;;:22;;;;;;:46;;;;;;;;;;;;;;;-1:-1:-1;41498:22:0;:46;;;5:2:-1;;;;30:1;27;20:12;5:2;41498:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41498:46:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;41562:80:0;;;;;;41498:46;41562:80;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;41562:80:0;;;;;;;;;;;;;;;;;;-1:-1:-1;41562:80:0;;;40816:834;;;;;;;;;;:::o;16111:519::-;16262:31;;;-1:-1:-1;;;16262:31:0;;16287:4;16262:31;;;;;;-1:-1:-1;;;;;;;;;16262:16:0;;;-1:-1:-1;;16262:31:0;;;;;;;;;;;;;;:16;:31;;;5:2:-1;;;;30:1;27;20:12;5:2;16262:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16262:31:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16262:31:0;16360:125;;;-1:-1:-1;;;;;16360:125:0;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;16360:125:0;;;;;;16262:31;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;16325:171:0;;;;16262:31;;-1:-1:-1;;;16325:20:0;;;;:171;;;;25:18:-1;16325:171:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;16325:171:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;16306:190:0;;;16517:7;16509:54;;;;-1:-1:-1;;;16509:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16590:31;;;-1:-1:-1;;;16590:31:0;;16615:4;16590:31;;;;;;16581:41;;-1:-1:-1;;;;;16590:16:0;;;-1:-1:-1;;16590:31:0;;;;;;;;;;;;;;;:16;:31;;;5:2:-1;;;;30:1;27;20:12;5:2;16590:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16590:31:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16590:31:0;16581:4;;:41;:8;:41;:::i;:::-;16574:48;16111:519;-1:-1:-1;;;;;;16111:519:0:o;17332:265::-;17384:7;17408:2;17414:1;17408:7;17404:48;;;-1:-1:-1;17439:1:0;17432:8;;17404:48;17483:3;17478:8;;;;17501;;:13;17497:59;;17543:1;17537:7;17497:59;17587:1;17581:7;17575:14;;;;17332:265;-1:-1:-1;17332:265:0:o;11688:150::-;11746:7;11779:1;11774;:6;;11766:41;;;;;-1:-1:-1;;;11766:41:0;;;;;;;;;;;;-1:-1:-1;;;11766:41:0;;;;;;;;;;;;;;;-1:-1:-1;11825:5:0;;;11688:150::o;12248:242::-;12311:7;12339:6;12331:40;;;;;-1:-1:-1;;;12331:40:0;;;;;;;;;;;;-1:-1:-1;;;12331:40:0;;;;;;;;;;;;;;;12382:9;12398:1;12394;:5;;;;;;12382:17;;12418:1;12414;:5;;;;;;:10;12410:52;;12449:1;12445:5;;12248:242;-1:-1:-1;;;12248:242:0:o;17605:430::-;17659:7;17683:2;17689:1;17683:7;17679:48;;;-1:-1:-1;17714:1:0;17707:8;;17679:48;17758:2;17753:7;;17775;;;17771:257;;17810:11;:2;17817:3;17810:11;:6;:11;:::i;:::-;17804:17;-1:-1:-1;17846:3:0;17804:17;17840:9;17836:123;;17882:3;-1:-1:-1;17875:10:0;;17836:123;17933:10;:3;17941:1;17933:10;:7;:10;:::i;:::-;17926:17;;;;;17771:257;17998:18;18014:1;17998:11;:2;18005:3;17998:11;:6;:11;:::i;12091:149::-;12149:7;12177:6;12169:40;;;;;-1:-1:-1;;;12169:40:0;;;;;;;;;;;;-1:-1:-1;;;12169:40:0;;;;;;;;;;;;;;;12231:1;12227;:5;;;;;;;12091:149;-1:-1:-1;;;12091:149:0:o;14631:235::-;14734:13;;:23;;14752:4;14734:23;:17;:23;:::i;:::-;14718:13;:39;;;-1:-1:-1;;;;;14785:14:0;;;;-1:-1:-1;14785:14:0;;;;;;:24;;14804:4;14785:18;:24::i;:::-;-1:-1:-1;;;;;14768:14:0;;;;;;-1:-1:-1;14768:14:0;;;;;;;;:41;;;;14827:31;;;;;;;14768:14;;;;14827:31;;;;;;;;;;14631:235;;:::o;39883:925::-;40184:32;;;-1:-1:-1;;;40184:32:0;;40210:4;40184:32;;;;;;-1:-1:-1;;;;;;;;;40184:17:0;;;-1:-1:-1;;40184:32:0;;;;;;;;;;;;;;:17;:32;;;5:2:-1;;;;30:1;27;20:12;5:2;40184:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40184:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40184:32:0;40249:31;;;-1:-1:-1;;;40249:31:0;;40274:4;40249:31;;;;;;40184:32;;-1:-1:-1;;;40249:44:0;;40285:7;;-1:-1:-1;;;;;40249:16:0;;;-1:-1:-1;;40249:31:0;;;;;40184:32;;40249:31;;;;;;;:16;:31;;;5:2:-1;;;;30:1;27;20:12;40249:44:0;40227:66;;40357:50;40372:7;40381:11;40394:12;40357:14;:50::i;:::-;40342:65;;40520:10;40504:12;:26;;40496:78;;;;-1:-1:-1;;;40496:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40593:46;-1:-1:-1;;;;;40593:20:0;;40614:10;40626:12;40593:20;:46::i;:::-;:51;;;:72;;-1:-1:-1;40648:17:0;;40593:72;40585:114;;;;;-1:-1:-1;;;40585:114:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;40717:83;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;40717:83:0;;;;;;;;;;;;;;;;;;-1:-1:-1;40717:83:0;;;39883:925;;;;;;;;;;:::o;12892:223::-;13031:18;;;;:8;;:18;;;;;:::i;:::-;-1:-1:-1;13060:14:0;;;;:6;;:14;;;;;:::i;:::-;-1:-1:-1;13085:10:0;:22;-1:-1:-1;;12892:223:0:o;11506:174::-;11564:7;11596:5;;;11620:6;;;;11612:41;;;;;-1:-1:-1;;;11612:41:0;;;;;;;;;;;;-1:-1:-1;;;11612:41:0;;;;;;;;;;;;;;18114:23691;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18114:23691:0;;;-1:-1:-1;18114:23691:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;

Swarm Source

bzzr://a5f9aa9deabd146e5c52eeacbd222794edfa1b31fc324a95dde183a84840ec65
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.