ETH Price: $3,158.01 (+2.85%)
Gas: 2 Gwei

Token

ERC20 ***
 

Overview

Max Total Supply

253.410819272714073756 ERC20 ***

Holders

19

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
9.806883060331586072 ERC20 ***

Value
$0.00
0xe4e69ef860d3018b61a25134d60678be8628f780
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.

Contract Source Code Verified (Exact Match)

Contract Name:
IdleDAI

Compiler Version
v0.5.2+commit.1df8f40c

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2019-08-15
*/

// File: openzeppelin-solidity/contracts/token/ERC20/IERC20.sol

pragma solidity ^0.5.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP. Does not include
 * the optional functions; to access them see `ERC20Detailed`.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

    /**
     * @dev Moves `amount` tokens from the caller's account to `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.
     *
     * > 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 Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

// File: openzeppelin-solidity/contracts/math/SafeMath.sol

pragma solidity ^0.5.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a, "SafeMath: subtraction overflow");
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, "SafeMath: division by zero");
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b != 0, "SafeMath: modulo by zero");
        return a % b;
    }
}

// File: openzeppelin-solidity/contracts/token/ERC20/ERC20.sol

pragma solidity ^0.5.0;



/**
 * @dev Implementation of the `IERC20` interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using `_mint`.
 * For a generic mechanism see `ERC20Mintable`.
 *
 * *For a detailed writeup see our guide [How to implement supply
 * mechanisms](https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226).*
 *
 * We have followed general OpenZeppelin guidelines: functions revert instead
 * of returning `false` on failure. This behavior is nonetheless conventional
 * and does not conflict with the expectations of ERC20 applications.
 *
 * Additionally, an `Approval` event is emitted on calls to `transferFrom`.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard `decreaseAllowance` and `increaseAllowance`
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See `IERC20.approve`.
 */
contract ERC20 is IERC20 {
    using SafeMath for uint256;

    mapping (address => uint256) private _balances;

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

    uint256 private _totalSupply;

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

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

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

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

    /**
     * @dev See `IERC20.approve`.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 value) public returns (bool) {
        _approve(msg.sender, spender, value);
        return true;
    }

    /**
     * @dev See `IERC20.transferFrom`.
     *
     * Emits an `Approval` event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of `ERC20`;
     *
     * Requirements:
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `value`.
     * - the caller must have allowance for `sender`'s tokens of at least
     * `amount`.
     */
    function transferFrom(address sender, address recipient, uint256 amount) public returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, msg.sender, _allowances[sender][msg.sender].sub(amount));
        return true;
    }

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

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to `approve` that can be used as a mitigation for
     * problems described in `IERC20.approve`.
     *
     * Emits an `Approval` event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) {
        _approve(msg.sender, spender, _allowances[msg.sender][spender].sub(subtractedValue));
        return true;
    }

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

        _balances[sender] = _balances[sender].sub(amount);
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

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

        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(address(0), account, amount);
    }

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

        _totalSupply = _totalSupply.sub(value);
        _balances[account] = _balances[account].sub(value);
        emit Transfer(account, address(0), value);
    }

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

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

    /**
     * @dev Destoys `amount` tokens from `account`.`amount` is then deducted
     * from the caller's allowance.
     *
     * See `_burn` and `_approve`.
     */
    function _burnFrom(address account, uint256 amount) internal {
        _burn(account, amount);
        _approve(account, msg.sender, _allowances[account][msg.sender].sub(amount));
    }
}

// File: openzeppelin-solidity/contracts/token/ERC20/ERC20Detailed.sol

pragma solidity ^0.5.0;


/**
 * @dev Optional functions from the ERC20 standard.
 */
contract ERC20Detailed is IERC20 {
    string private _name;
    string private _symbol;
    uint8 private _decimals;

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

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

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

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5,05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei.
     *
     * > Note that this information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * `IERC20.balanceOf` and `IERC20.transfer`.
     */
    function decimals() public view returns (uint8) {
        return _decimals;
    }
}

// File: openzeppelin-solidity/contracts/utils/ReentrancyGuard.sol

pragma solidity ^0.5.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the `nonReentrant` modifier
 * available, which can be aplied 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 {
    /// @dev counter to allow mutex lock with only one SSTORE operation
    uint256 private _guardCounter;

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

    /**
     * @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() {
        _guardCounter += 1;
        uint256 localCounter = _guardCounter;
        _;
        require(localCounter == _guardCounter, "ReentrancyGuard: reentrant call");
    }
}

// File: openzeppelin-solidity/contracts/ownership/Ownable.sol

pragma solidity ^0.5.0;

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () internal {
        _owner = msg.sender;
        emit OwnershipTransferred(address(0), _owner);
    }

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(isOwner(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Returns true if the caller is the current owner.
     */
    function isOwner() public view returns (bool) {
        return msg.sender == _owner;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * > Note: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public onlyOwner {
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     */
    function _transferOwnership(address newOwner) internal {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

// File: openzeppelin-solidity/contracts/utils/Address.sol

pragma solidity ^0.5.0;

/**
 * @dev Collection of functions related to the address type,
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * This test is non-exhaustive, and there may be false-negatives: during the
     * execution of a contract's constructor, its address will be reported as
     * not containing a contract.
     *
     * > It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies in extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }
}

// File: openzeppelin-solidity/contracts/token/ERC20/SafeERC20.sol

pragma solidity ^0.5.0;




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

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

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

    function safeApprove(IERC20 token, address spender, uint256 value) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        // solhint-disable-next-line max-line-length
        require((value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

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

    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).sub(value);
        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves.

        // A Solidity high level call has three parts:
        //  1. The target address is checked to verify it contains contract code
        //  2. The call itself is made, and success asserted
        //  3. The return value is decoded, which in turn checks the size of the returned data.
        // solhint-disable-next-line max-line-length
        require(address(token).isContract(), "SafeERC20: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = address(token).call(data);
        require(success, "SafeERC20: low-level call failed");

        if (returndata.length > 0) { // Return data is optional
            // solhint-disable-next-line max-line-length
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

// File: contracts/interfaces/CERC20.sol

pragma solidity ^0.5.2;

interface CERC20 {
  function mint(uint256 mintAmount) external returns (uint256);
  function redeem(uint256 redeemTokens) external returns (uint256);
  function exchangeRateStored() external view returns (uint256);
  function supplyRatePerBlock() external view returns (uint256);

  function borrowRatePerBlock() external view returns (uint256);
  function totalReserves() external view returns (uint256);
  function getCash() external view returns (uint256);
  function totalBorrows() external view returns (uint256);
  function reserveFactorMantissa() external view returns (uint256);
}

// File: contracts/interfaces/iERC20.sol

pragma solidity ^0.5.2;

interface iERC20 {
  function mint(
    address receiver,
    uint256 depositAmount)
    external
    returns (uint256 mintAmount);

  function burn(
    address receiver,
    uint256 burnAmount)
    external
    returns (uint256 loanAmountPaid);

  function tokenPrice()
    external
    view
    returns (uint256 price);

  function supplyInterestRate()
    external
    view
    returns (uint256);

  function rateMultiplier()
    external
    view
    returns (uint256);
  function baseRate()
    external
    view
    returns (uint256);

  function borrowInterestRate()
    external
    view
    returns (uint256);

  function totalAssetBorrow()
    external
    view
    returns (uint256);

  function totalAssetSupply()
    external
    view
    returns (uint256);

  function nextSupplyInterestRate(uint256)
    external
    view
    returns (uint256);

  function nextBorrowInterestRate(uint256)
    external
    view
    returns (uint256);
  function nextLoanInterestRate(uint256)
    external
    view
    returns (uint256);

  function claimLoanToken()
    external
    returns (uint256 claimedAmount);

  /* function burnToEther(
    address receiver,
    uint256 burnAmount)
    external
    returns (uint256 loanAmountPaid);


  function supplyInterestRate()
    external
    view
    returns (uint256);

  function assetBalanceOf(
    address _owner)
    external
    view
    returns (uint256);

  function claimLoanToken()
    external
    returns (uint256 claimedAmount); */
}

// File: contracts/IdleHelp.sol

pragma solidity ^0.5.2;





library IdleHelp {
  using SafeMath for uint256;
  function getPriceInToken(address cToken, address iToken, address bestToken, uint256 totalSupply, uint256 poolSupply)
    public view
    returns (uint256 tokenPrice) {
      // 1Token = net_asset_value / total_Token_liquidity
      // net_asset_value = (rate of 1(cToken || iToken) in underlying_Token) * balanceOf((cToken || iToken))
      uint256 navPool;
      uint256 price;

      // rate
      if (bestToken == cToken) {
        // exchangeRateStored is the rate (in wei, 8 decimals) of 1cDAI in DAI * 10**18
        price = CERC20(cToken).exchangeRateStored(); // 202487304197710837666727644 ->
      } else {
        price = iERC20(iToken).tokenPrice(); // eg 1001495070730287403 -> 1iToken in wei = 1001495070730287403 Token
      }
      navPool = price.mul(poolSupply); // eg 43388429749999990000 in DAI
      tokenPrice = navPool.div(totalSupply); // idleToken price in token wei
  }
  function getAPRs(address cToken, address iToken, uint256 blocksInAYear)
    public view
    returns (uint256 cApr, uint256 iApr) {
      uint256 cRate = CERC20(cToken).supplyRatePerBlock(); // interest % per block
      cApr = cRate.mul(blocksInAYear).mul(100);
      iApr = iERC20(iToken).supplyInterestRate(); // APR in wei 18 decimals
  }
  function getBestRateToken(address cToken, address iToken, uint256 blocksInAYear)
    public view
    returns (address bestRateToken, uint256 bestRate, uint256 worstRate) {
      (uint256 cApr, uint256 iApr) = getAPRs(cToken, iToken, blocksInAYear);
      bestRateToken = cToken;
      bestRate = cApr;
      worstRate = iApr;
      if (iApr > cApr) {
        worstRate = cApr;
        bestRate = iApr;
        bestRateToken = iToken;
      }
  }
  function rebalanceCheck(address cToken, address iToken, address bestToken, uint256 blocksInAYear, uint256 minRateDifference)
    public view
    returns (bool shouldRebalance, address bestTokenAddr) {
      shouldRebalance = false;

      uint256 _bestRate;
      uint256 _worstRate;
      (bestTokenAddr, _bestRate, _worstRate) = getBestRateToken(cToken, iToken, blocksInAYear);
      if (
          bestToken == address(0) ||
          (bestTokenAddr != bestToken && (_worstRate.add(minRateDifference) < _bestRate))) {
        shouldRebalance = true;
        return (shouldRebalance, bestTokenAddr);
      }

      return (shouldRebalance, bestTokenAddr);
  }
}

// File: contracts/IdleDAI.sol

pragma solidity ^0.5.2;











contract IdleDAI is ERC20, ERC20Detailed, ReentrancyGuard, Ownable {
  using SafeERC20 for IERC20;
  using SafeMath for uint256;

  address public cToken; // cTokens have 8 decimals
  address public iToken; // iTokens have 18 decimals
  address public token;
  address public bestToken;

  uint256 public blocksInAYear;
  uint256 public minRateDifference;

  /**
   * @dev constructor
   */
  constructor(address _cToken, address _iToken, address _token)
    public
    ERC20Detailed("IdleDAI", "IDLEDAI", 18) {
      cToken = _cToken;
      iToken = _iToken;
      token = _token;
      blocksInAYear = 2102400; // ~15 sec per block
      minRateDifference = 100000000000000000; // 0.1% min
  }

  // onlyOwner
  function setMinRateDifference(uint256 _rate)
    external onlyOwner {
      minRateDifference = _rate;
  }
  function setBlocksInAYear(uint256 _blocks)
    external onlyOwner {
      blocksInAYear = _blocks;
  }
  function setToken(address _token)
    external onlyOwner {
      token = _token;
  }
  function setIToken(address _iToken)
    external onlyOwner {
      iToken = _iToken;
  }
  function setCToken(address _cToken)
    external onlyOwner {
      cToken = _cToken;
  }
  // This should never be called, only in case of contract failure
  // after an audit this should be removed
  function emergencyWithdraw(address _token, uint256 _value)
    external onlyOwner {
      IERC20 underlying = IERC20(_token);
      if (_value != 0) {
        underlying.safeTransfer(msg.sender, _value);
      } else {
        underlying.safeTransfer(msg.sender, underlying.balanceOf(address(this)));
      }
  }

  // view
  function tokenPrice()
    public view
    returns (uint256 price) {
      uint256 poolSupply = IERC20(cToken).balanceOf(address(this));
      if (bestToken == iToken) {
        poolSupply = IERC20(iToken).balanceOf(address(this));
      }

      price = IdleHelp.getPriceInToken(
        cToken,
        iToken,
        bestToken,
        this.totalSupply(),
        poolSupply
      );
  }
  function rebalanceCheck()
    public view
    returns (bool, address) {
      return IdleHelp.rebalanceCheck(cToken, iToken, bestToken, blocksInAYear, minRateDifference);
  }
  function getAPRs()
    external view
    returns (uint256, uint256) {
      return IdleHelp.getAPRs(cToken, iToken, blocksInAYear);
  }

  // public
  /**
   * @dev User should 'approve' _amount tokens before calling mintIdleToken
   */
  function mintIdleToken(uint256 _amount)
    external nonReentrant
    returns (uint256 mintedTokens) {
      require(_amount > 0, "Amount is not > 0");

      // First rebalance the current pool if needed
      rebalance();

      // get a handle for the underlying asset contract
      IERC20 underlying = IERC20(token);
      // transfer to this contract
      underlying.safeTransferFrom(msg.sender, address(this), _amount);

      uint256 idlePrice = 10**18;
      uint256 totalSupply = this.totalSupply();

      if (totalSupply != 0) {
        idlePrice = tokenPrice();
      }

      if (bestToken == cToken) {
        _mintCTokens(_amount);
      } else {
        _mintITokens(_amount);
      }
      if (totalSupply == 0) {
        mintedTokens = _amount; // 1:1
      } else {
        mintedTokens = _amount.mul(10**18).div(idlePrice);
      }
      _mint(msg.sender, mintedTokens);
  }

  /**
   * @dev here we calc the pool share of the cTokens | iTokens one can withdraw
   */
  function redeemIdleToken(uint256 _amount)
    external nonReentrant
    returns (uint256 tokensRedeemed) {
    uint256 idleSupply = this.totalSupply();
    require(idleSupply > 0, 'No IDLEDAI have been issued');

    if (bestToken == cToken) {
      uint256 cPoolBalance = IERC20(cToken).balanceOf(address(this));
      uint256 cDAItoRedeem = _amount.mul(cPoolBalance).div(idleSupply);
      tokensRedeemed = _redeemCTokens(cDAItoRedeem, msg.sender);
    } else {
      uint256 iPoolBalance = IERC20(iToken).balanceOf(address(this));
      uint256 iDAItoRedeem = _amount.mul(iPoolBalance).div(idleSupply);
      // TODO we should inform the user of the eventual excess of token that can be redeemed directly in Fulcrum
      tokensRedeemed = _redeemITokens(iDAItoRedeem, msg.sender);
    }
    _burn(msg.sender, _amount);
    rebalance();
  }

  /**
   * @dev Convert cToken pool in iToken pool (or the contrary) if needed
   * Everyone should be incentivized in calling this method
   */
  function rebalance()
    public {
      (bool shouldRebalance, address newBestTokenAddr) = rebalanceCheck();
      if (!shouldRebalance) {
        return;
      }

      if (bestToken != address(0)) {
        // bestToken here is the 'old' best token
        if (bestToken == cToken) {
          _redeemCTokens(IERC20(cToken).balanceOf(address(this)), address(this)); // token are now in this contract
          _mintITokens(IERC20(token).balanceOf(address(this)));
        } else {
          _redeemITokens(IERC20(iToken).balanceOf(address(this)), address(this));
          _mintCTokens(IERC20(token).balanceOf(address(this)));
        }
      }

      // Update best token address
      bestToken = newBestTokenAddr;
  }
  /**
   * @dev here we are redeeming unclaimed token (from iToken contract) to this contracts
   * then converting the claimedTokens in the bestToken after rebalancing
   * Everyone should be incentivized in calling this method
   */
  function claimITokens()
    external
    returns (uint256 claimedTokens) {
      claimedTokens = iERC20(iToken).claimLoanToken();
      if (claimedTokens == 0) {
        return claimedTokens;
      }

      rebalance();
      if (bestToken == cToken) {
        _mintCTokens(claimedTokens);
      } else {
        _mintITokens(claimedTokens);
      }

      return claimedTokens;
  }

  // internal
  function _mintCTokens(uint256 _amount)
    internal
    returns (uint256 cTokens) {
      if (IERC20(token).balanceOf(address(this)) == 0) {
        return cTokens;
      }
      // approve the transfer to cToken contract
      IERC20(token).safeIncreaseAllowance(cToken, _amount);

      // get a handle for the corresponding cToken contract
      CERC20 _cToken = CERC20(cToken);
      // mint the cTokens and assert there is no error
      require(_cToken.mint(_amount) == 0, "Error minting");
      // cTokens are now in this contract

      // generic solidity formula is exchangeRateMantissa = (underlying / cTokens) * 1e18
      uint256 exchangeRateMantissa = _cToken.exchangeRateStored(); // (exchange_rate * 1e18)
      // so cTokens = (underlying * 1e18) / exchangeRateMantissa
      cTokens = _amount.mul(10**18).div(exchangeRateMantissa);
  }
  function _mintITokens(uint256 _amount)
    internal
    returns (uint256 iTokens) {
      if (IERC20(token).balanceOf(address(this)) == 0) {
        return iTokens;
      }
      // approve the transfer to iToken contract
      IERC20(token).safeIncreaseAllowance(iToken, _amount);
      // get a handle for the corresponding iToken contract
      iERC20 _iToken = iERC20(iToken);
      // mint the iTokens
      iTokens = _iToken.mint(address(this), _amount);
  }

  function _redeemCTokens(uint256 _amount, address _account)
    internal
    returns (uint256 tokens) {
      CERC20 _cToken = CERC20(cToken);
      // redeem all user's underlying
      require(_cToken.redeem(_amount) == 0, "Something went wrong when redeeming in cTokens");

      // generic solidity formula is exchangeRateMantissa = (underlying / cTokens) * 1e18
      uint256 exchangeRateMantissa = _cToken.exchangeRateStored(); // exchange_rate * 1e18
      // so underlying = (exchangeRateMantissa * cTokens) / 1e18
      tokens = _amount.mul(exchangeRateMantissa).div(10**18);

      if (_account != address(this)) {
        IERC20(token).safeTransfer(_account, tokens);
      }
  }
  function _redeemITokens(uint256 _amount, address _account)
    internal
    returns (uint256 tokens) {
      tokens = iERC20(iToken).burn(_account, _amount);
  }
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_amount","type":"uint256"}],"name":"mintIdleToken","outputs":[{"name":"mintedTokens","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"value","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"}],"name":"setToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_rate","type":"uint256"}],"name":"setMinRateDifference","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"minRateDifference","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"sender","type":"address"},{"name":"recipient","type":"address"},{"name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"iToken","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rebalanceCheck","outputs":[{"name":"","type":"bool"},{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_cToken","type":"address"}],"name":"setCToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"blocksInAYear","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"bestToken","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"claimITokens","outputs":[{"name":"claimedTokens","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_blocks","type":"uint256"}],"name":"setBlocksInAYear","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"cToken","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"rebalance","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_iToken","type":"address"}],"name":"setIToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"tokenPrice","outputs":[{"name":"price","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_amount","type":"uint256"}],"name":"redeemIdleToken","outputs":[{"name":"tokensRedeemed","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"},{"name":"_value","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"recipient","type":"address"},{"name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getAPRs","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"},{"name":"spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"token","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_cToken","type":"address"},{"name":"_iToken","type":"address"},{"name":"_token","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"}]

60806040523480156200001157600080fd5b5060405160608062004e73833981018060405260608110156200003357600080fd5b810190808051906020019092919080519060200190929190805190602001909291905050506040805190810160405280600781526020017f49646c65444149000000000000000000000000000000000000000000000000008152506040805190810160405280600781526020017f49444c454441490000000000000000000000000000000000000000000000000081525060128260039080519060200190620000de929190620002c1565b508160049080519060200190620000f7929190620002c1565b5080600560006101000a81548160ff021916908360ff160217905550505050600160068190555033600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a382600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062201480600c8190555067016345785d8a0000600d8190555050505062000370565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200030457805160ff191683800117855562000335565b8280016001018555821562000335579182015b828111156200033457825182559160200191906001019062000317565b5b50905062000344919062000348565b5090565b6200036d91905b80821115620003695760008160009055506001016200034f565b5090565b90565b614af380620003806000396000f3fe608060405234801561001057600080fd5b5060043610610223576000357c01000000000000000000000000000000000000000000000000000000009004806369e527da116101375780638f32d59b116100ca578063a9059cbb11610099578063a9059cbb146109a5578063b13bd49114610a0b578063dd62ed3e14610a30578063f2fde38b14610aa8578063fc0c546a14610aec57610223565b80638f32d59b1461084c57806395ccea671461086e57806395d89b41146108bc578063a457c2d71461093f57610223565b80637e2a53af116101065780637e2a53af1461075e5780637ff9b596146107a25780638b30b516146107c05780638da5cb5b1461080257610223565b806369e527da146106a857806370a08231146106f2578063715018a61461074a5780637d7c2a1c1461075457610223565b8063313ce567116101ba5780634cb71222116101895780634cb71222146105b05780634d02f1c2146105f457806351707e4614610612578063621eb0931461065c57806367f8d85d1461067a57610223565b8063313ce5671461048757806339509351146104ab578063408cfe24146105115780634732376d1461055b57610223565b806318160ddd116101f657806318160ddd146103975780631aaa4a18146103b557806322c9f971146103e357806323b872dd1461040157610223565b806306fdde031461022857806308677d7e146102ab578063095ea7b3146102ed578063144fa6d714610353575b600080fd5b610230610b36565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610270578082015181840152602081019050610255565b50505050905090810190601f16801561029d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102d7600480360360208110156102c157600080fd5b8101908080359060200190929190505050610bd8565b6040518082815260200191505060405180910390f35b6103396004803603604081101561030357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610ee8565b604051808215151515815260200191505060405180910390f35b6103956004803603602081101561036957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610eff565b005b61039f610fbf565b6040518082815260200191505060405180910390f35b6103e1600480360360208110156103cb57600080fd5b8101908080359060200190929190505050610fc9565b005b6103eb61104f565b6040518082815260200191505060405180910390f35b61046d6004803603606081101561041757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611055565b604051808215151515815260200191505060405180910390f35b61048f611106565b604051808260ff1660ff16815260200191505060405180910390f35b6104f7600480360360408110156104c157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061111d565b604051808215151515815260200191505060405180910390f35b6105196111c2565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6105636111e8565b60405180831515151581526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390f35b6105f2600480360360208110156105c657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506113b0565b005b6105fc611470565b6040518082815260200191505060405180910390f35b61061a611476565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61066461149c565b6040518082815260200191505060405180910390f35b6106a66004803603602081101561069057600080fd5b8101908080359060200190929190505050611613565b005b6106b0611699565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6107346004803603602081101561070857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506116bf565b6040518082815260200191505060405180910390f35b610752611707565b005b61075c611844565b005b6107a06004803603602081101561077457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611d7c565b005b6107aa611e3c565b6040518082815260200191505060405180910390f35b6107ec600480360360208110156107d657600080fd5b81019080803590602001909291905050506122fa565b6040518082815260200191505060405180910390f35b61080a61279f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6108546127c9565b604051808215151515815260200191505060405180910390f35b6108ba6004803603604081101561088457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612821565b005b6108c46129e0565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156109045780820151818401526020810190506108e9565b50505050905090810190601f1680156109315780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61098b6004803603604081101561095557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612a82565b604051808215151515815260200191505060405180910390f35b6109f1600480360360408110156109bb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612b27565b604051808215151515815260200191505060405180910390f35b610a13612b3e565b604051808381526020018281526020019250505060405180910390f35b610a9260048036036040811015610a4657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612ca6565b6040518082815260200191505060405180910390f35b610aea60048036036020811015610abe57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612d2d565b005b610af4612db5565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b606060038054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610bce5780601f10610ba357610100808354040283529160200191610bce565b820191906000526020600020905b815481529060010190602001808311610bb157829003601f168201915b5050505050905090565b6000600160066000828254019250508190555060006006549050600083111515610c6a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f416d6f756e74206973206e6f74203e203000000000000000000000000000000081525060200191505060405180910390fd5b610c72611844565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050610cc63330868473ffffffffffffffffffffffffffffffffffffffff16612ddb909392919063ffffffff16565b6000670de0b6b3a7640000905060003073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b158015610d3757600080fd5b505afa158015610d4b573d6000803e3d6000fd5b505050506040513d6020811015610d6157600080fd5b81019080805190602001909291905050509050600081141515610d8957610d86611e3c565b91505b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610e1057610e0a86612efd565b50610e1b565b610e1986613293565b505b6000811415610e2c57859450610e5c565b610e5982610e4b670de0b6b3a76400008961351790919063ffffffff16565b6135a190919063ffffffff16565b94505b610e663386613634565b50505060065481141515610ee2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b50919050565b6000610ef53384846137f1565b6001905092915050565b610f076127c9565b1515610f7b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600254905090565b610fd16127c9565b1515611045576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600d8190555050565b600d5481565b60006110628484846139ec565b6110fb84336110f685600160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613c8c90919063ffffffff16565b6137f1565b600190509392505050565b6000600560009054906101000a900460ff16905090565b60006111b833846111b385600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613d1790919063ffffffff16565b6137f1565b6001905092915050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008073e66127a3539e1a415cfaae8a43cb9d73e650429563a5ae97da600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600c54600d546040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200182815260200195505050505050604080518083038186803b15801561136357600080fd5b505af4158015611377573d6000803e3d6000fd5b505050506040513d604081101561138d57600080fd5b810190808051906020019092919080519060200190929190505050915091509091565b6113b86127c9565b151561142c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600c5481565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663087fc48b6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561152457600080fd5b505af1158015611538573d6000803e3d6000fd5b505050506040513d602081101561154e57600080fd5b81019080805190602001909291905050509050600081141561157257809050611610565b61157a611844565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611601576115fb81612efd565b5061160c565b61160a81613293565b505b8090505b90565b61161b6127c9565b151561168f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600c8190555050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61170f6127c9565b1515611783576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60008061184f6111e8565b91509150811515611861575050611d7a565b600073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515611d3657600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611b3557611a30600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156119ef57600080fd5b505afa158015611a03573d6000803e3d6000fd5b505050506040513d6020811015611a1957600080fd5b810190808051906020019092919050505030613da1565b50611b2f600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611aef57600080fd5b505afa158015611b03573d6000803e3d6000fd5b505050506040513d6020811015611b1957600080fd5b8101908080519060200190929190505050613293565b50611d35565b611c34600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611bf357600080fd5b505afa158015611c07573d6000803e3d6000fd5b505050506040513d6020811015611c1d57600080fd5b810190808051906020019092919050505030614028565b50611d33600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611cf357600080fd5b505afa158015611d07573d6000803e3d6000fd5b505050506040513d6020811015611d1d57600080fd5b8101908080519060200190929190505050612efd565b505b5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505b565b611d846127c9565b1515611df8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611efa57600080fd5b505afa158015611f0e573d6000803e3d6000fd5b505050506040513d6020811015611f2457600080fd5b81019080805190602001909291905050509050600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156120a857600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561206a57600080fd5b505afa15801561207e573d6000803e3d6000fd5b505050506040513d602081101561209457600080fd5b810190808051906020019092919050505090505b73e66127a3539e1a415cfaae8a43cb9d73e65042956379d88372600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b15801561218d57600080fd5b505afa1580156121a1573d6000803e3d6000fd5b505050506040513d60208110156121b757600080fd5b8101908080519060200190929190505050866040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018281526020019550505050505060206040518083038186803b1580156122b957600080fd5b505af41580156122cd573d6000803e3d6000fd5b505050506040513d60208110156122e357600080fd5b810190808051906020019092919050505091505090565b600060016006600082825401925050819055506000600654905060003073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b15801561237857600080fd5b505afa15801561238c573d6000803e3d6000fd5b505050506040513d60208110156123a257600080fd5b8101908080519060200190929190505050905060008111151561242d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4e6f2049444c454441492068617665206265656e20697373756564000000000081525060200191505060405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156125db576000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561256257600080fd5b505afa158015612576573d6000803e3d6000fd5b505050506040513d602081101561258c57600080fd5b8101908080519060200190929190505050905060006125c6836125b8848961351790919063ffffffff16565b6135a190919063ffffffff16565b90506125d28133613da1565b9450505061270d565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561269857600080fd5b505afa1580156126ac573d6000803e3d6000fd5b505050506040513d60208110156126c257600080fd5b8101908080519060200190929190505050905060006126fc836126ee848961351790919063ffffffff16565b6135a190919063ffffffff16565b90506127088133614028565b945050505b6127173385614132565b61271f611844565b5060065481141515612799576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b50919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b6128296127c9565b151561289d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60008290506000821415156128dc576128d733838373ffffffffffffffffffffffffffffffffffffffff166142d29092919063ffffffff16565b6129db565b6129da338273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561297957600080fd5b505afa15801561298d573d6000803e3d6000fd5b505050506040513d60208110156129a357600080fd5b81019080805190602001909291905050508373ffffffffffffffffffffffffffffffffffffffff166142d29092919063ffffffff16565b5b505050565b606060048054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612a785780601f10612a4d57610100808354040283529160200191612a78565b820191906000526020600020905b815481529060010190602001808311612a5b57829003601f168201915b5050505050905090565b6000612b1d3384612b1885600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613c8c90919063ffffffff16565b6137f1565b6001905092915050565b6000612b343384846139ec565b6001905092915050565b60008073e66127a3539e1a415cfaae8a43cb9d73e650429563fe26dc40600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600c546040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604080518083038186803b158015612c5957600080fd5b505af4158015612c6d573d6000803e3d6000fd5b505050506040513d6040811015612c8357600080fd5b810190808051906020019092919080519060200190929190505050915091509091565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b612d356127c9565b1515612da9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b612db2816143bf565b50565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b612ef7848573ffffffffffffffffffffffffffffffffffffffff166323b872dd90507c010000000000000000000000000000000000000000000000000000000002858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050614507565b50505050565b600080600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612fbb57600080fd5b505afa158015612fcf573d6000803e3d6000fd5b505050506040513d6020811015612fe557600080fd5b810190808051906020019092919050505014156130045780905061328e565b613073600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661475a9092919063ffffffff16565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff1663a0712d68856040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b15801561310b57600080fd5b505af115801561311f573d6000803e3d6000fd5b505050506040513d602081101561313557600080fd5b81019080805190602001909291905050501415156131bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f4572726f72206d696e74696e670000000000000000000000000000000000000081525060200191505060405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff1663182df0f56040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b15801561321f57600080fd5b505afa158015613233573d6000803e3d6000fd5b505050506040513d602081101561324957600080fd5b810190808051906020019092919050505090506132898161327b670de0b6b3a76400008761351790919063ffffffff16565b6135a190919063ffffffff16565b925050505b919050565b600080600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561335157600080fd5b505afa158015613365573d6000803e3d6000fd5b505050506040513d602081101561337b57600080fd5b8101908080519060200190929190505050141561339a57809050613512565b613409600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661475a9092919063ffffffff16565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff166340c10f1930856040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156134d357600080fd5b505af11580156134e7573d6000803e3d6000fd5b505050506040513d60208110156134fd57600080fd5b81019080805190602001909291905050509150505b919050565b60008083141561352a576000905061359b565b6000828402905082848281151561353d57fe5b04141515613596576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806149e56021913960400191505060405180910390fd5b809150505b92915050565b6000808211151561361a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525060200191505060405180910390fd5b6000828481151561362757fe5b0490508091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156136d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206d696e7420746f20746865207a65726f20616464726573730081525060200191505060405180910390fd5b6136ee81600254613d1790919063ffffffff16565b600281905550613745816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613d1790919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515613879576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180614a4c6024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515613901576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806149c36022913960400191505060405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515613a74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180614a276025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515613afc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018061497a6023913960400191505060405180910390fd5b613b4d816000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613c8c90919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613be0816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613d1790919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b6000828211151515613d06576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525060200191505060405180910390fd5b600082840390508091505092915050565b6000808284019050838110151515613d97576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff1663db006a75866040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b158015613e3a57600080fd5b505af1158015613e4e573d6000803e3d6000fd5b505050506040513d6020811015613e6457600080fd5b8101908080519060200190929190505050141515613ecd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180614a9a602e913960400191505060405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff1663182df0f56040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b158015613f3157600080fd5b505afa158015613f45573d6000803e3d6000fd5b505050506040513d6020811015613f5b57600080fd5b81019080805190602001909291905050509050613f9b670de0b6b3a7640000613f8d838861351790919063ffffffff16565b6135a190919063ffffffff16565b92503073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415156140205761401f8484600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166142d29092919063ffffffff16565b5b505092915050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639dc29fac83856040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156140ef57600080fd5b505af1158015614103573d6000803e3d6000fd5b505050506040513d602081101561411957600080fd5b8101908080519060200190929190505050905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156141ba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180614a066021913960400191505060405180910390fd5b6141cf81600254613c8c90919063ffffffff16565b600281905550614226816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613c8c90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b6143ba838473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb90507c0100000000000000000000000000000000000000000000000000000000028484604051602401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050614507565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515614447576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602681526020018061499d6026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6145268273ffffffffffffffffffffffffffffffffffffffff16614966565b151561459a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e74726163740081525060200191505060405180910390fd5b600060608373ffffffffffffffffffffffffffffffffffffffff16836040518082805190602001908083835b6020831015156145eb57805182526020820191506020810190506020830392506145c6565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461464d576040519150601f19603f3d011682016040523d82523d6000602084013e614652565b606091505b50915091508115156146cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656481525060200191505060405180910390fd5b600081511115614754578080602001905160208110156146eb57600080fd5b81019080805190602001909291905050501515614753576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180614a70602a913960400191505060405180910390fd5b5b50505050565b6000614876828573ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30876040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b15801561482d57600080fd5b505afa158015614841573d6000803e3d6000fd5b505050506040513d602081101561485757600080fd5b8101908080519060200190929190505050613d1790919063ffffffff16565b9050614960848573ffffffffffffffffffffffffffffffffffffffff1663095ea7b390507c0100000000000000000000000000000000000000000000000000000000028584604051602401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050614507565b50505050565b600080823b90506000811191505091905056fe45524332303a207472616e7366657220746f20746865207a65726f20616464726573734f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573735361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564536f6d657468696e672077656e742077726f6e67207768656e2072656465656d696e6720696e2063546f6b656e73a165627a7a723058203971eb9d650d67af8872478aefb583b93ffd3f6422f1b4601f7254024586fef50029000000000000000000000000f5dce57282a584d2746faf1593d3121fcac444dc00000000000000000000000014094949152eddbfcd073717200da82fed8dc96000000000000000000000000089d24a6b4ccb1b6faa2625fe562bdd9a23260359

Deployed Bytecode

0x608060405234801561001057600080fd5b5060043610610223576000357c01000000000000000000000000000000000000000000000000000000009004806369e527da116101375780638f32d59b116100ca578063a9059cbb11610099578063a9059cbb146109a5578063b13bd49114610a0b578063dd62ed3e14610a30578063f2fde38b14610aa8578063fc0c546a14610aec57610223565b80638f32d59b1461084c57806395ccea671461086e57806395d89b41146108bc578063a457c2d71461093f57610223565b80637e2a53af116101065780637e2a53af1461075e5780637ff9b596146107a25780638b30b516146107c05780638da5cb5b1461080257610223565b806369e527da146106a857806370a08231146106f2578063715018a61461074a5780637d7c2a1c1461075457610223565b8063313ce567116101ba5780634cb71222116101895780634cb71222146105b05780634d02f1c2146105f457806351707e4614610612578063621eb0931461065c57806367f8d85d1461067a57610223565b8063313ce5671461048757806339509351146104ab578063408cfe24146105115780634732376d1461055b57610223565b806318160ddd116101f657806318160ddd146103975780631aaa4a18146103b557806322c9f971146103e357806323b872dd1461040157610223565b806306fdde031461022857806308677d7e146102ab578063095ea7b3146102ed578063144fa6d714610353575b600080fd5b610230610b36565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610270578082015181840152602081019050610255565b50505050905090810190601f16801561029d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102d7600480360360208110156102c157600080fd5b8101908080359060200190929190505050610bd8565b6040518082815260200191505060405180910390f35b6103396004803603604081101561030357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610ee8565b604051808215151515815260200191505060405180910390f35b6103956004803603602081101561036957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610eff565b005b61039f610fbf565b6040518082815260200191505060405180910390f35b6103e1600480360360208110156103cb57600080fd5b8101908080359060200190929190505050610fc9565b005b6103eb61104f565b6040518082815260200191505060405180910390f35b61046d6004803603606081101561041757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611055565b604051808215151515815260200191505060405180910390f35b61048f611106565b604051808260ff1660ff16815260200191505060405180910390f35b6104f7600480360360408110156104c157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061111d565b604051808215151515815260200191505060405180910390f35b6105196111c2565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6105636111e8565b60405180831515151581526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390f35b6105f2600480360360208110156105c657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506113b0565b005b6105fc611470565b6040518082815260200191505060405180910390f35b61061a611476565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61066461149c565b6040518082815260200191505060405180910390f35b6106a66004803603602081101561069057600080fd5b8101908080359060200190929190505050611613565b005b6106b0611699565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6107346004803603602081101561070857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506116bf565b6040518082815260200191505060405180910390f35b610752611707565b005b61075c611844565b005b6107a06004803603602081101561077457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611d7c565b005b6107aa611e3c565b6040518082815260200191505060405180910390f35b6107ec600480360360208110156107d657600080fd5b81019080803590602001909291905050506122fa565b6040518082815260200191505060405180910390f35b61080a61279f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6108546127c9565b604051808215151515815260200191505060405180910390f35b6108ba6004803603604081101561088457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612821565b005b6108c46129e0565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156109045780820151818401526020810190506108e9565b50505050905090810190601f1680156109315780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61098b6004803603604081101561095557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612a82565b604051808215151515815260200191505060405180910390f35b6109f1600480360360408110156109bb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612b27565b604051808215151515815260200191505060405180910390f35b610a13612b3e565b604051808381526020018281526020019250505060405180910390f35b610a9260048036036040811015610a4657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612ca6565b6040518082815260200191505060405180910390f35b610aea60048036036020811015610abe57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612d2d565b005b610af4612db5565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b606060038054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610bce5780601f10610ba357610100808354040283529160200191610bce565b820191906000526020600020905b815481529060010190602001808311610bb157829003601f168201915b5050505050905090565b6000600160066000828254019250508190555060006006549050600083111515610c6a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f416d6f756e74206973206e6f74203e203000000000000000000000000000000081525060200191505060405180910390fd5b610c72611844565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050610cc63330868473ffffffffffffffffffffffffffffffffffffffff16612ddb909392919063ffffffff16565b6000670de0b6b3a7640000905060003073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b158015610d3757600080fd5b505afa158015610d4b573d6000803e3d6000fd5b505050506040513d6020811015610d6157600080fd5b81019080805190602001909291905050509050600081141515610d8957610d86611e3c565b91505b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610e1057610e0a86612efd565b50610e1b565b610e1986613293565b505b6000811415610e2c57859450610e5c565b610e5982610e4b670de0b6b3a76400008961351790919063ffffffff16565b6135a190919063ffffffff16565b94505b610e663386613634565b50505060065481141515610ee2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b50919050565b6000610ef53384846137f1565b6001905092915050565b610f076127c9565b1515610f7b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600254905090565b610fd16127c9565b1515611045576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600d8190555050565b600d5481565b60006110628484846139ec565b6110fb84336110f685600160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613c8c90919063ffffffff16565b6137f1565b600190509392505050565b6000600560009054906101000a900460ff16905090565b60006111b833846111b385600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613d1790919063ffffffff16565b6137f1565b6001905092915050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008073e66127a3539e1a415cfaae8a43cb9d73e650429563a5ae97da600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600c54600d546040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200182815260200195505050505050604080518083038186803b15801561136357600080fd5b505af4158015611377573d6000803e3d6000fd5b505050506040513d604081101561138d57600080fd5b810190808051906020019092919080519060200190929190505050915091509091565b6113b86127c9565b151561142c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600c5481565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663087fc48b6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561152457600080fd5b505af1158015611538573d6000803e3d6000fd5b505050506040513d602081101561154e57600080fd5b81019080805190602001909291905050509050600081141561157257809050611610565b61157a611844565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611601576115fb81612efd565b5061160c565b61160a81613293565b505b8090505b90565b61161b6127c9565b151561168f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600c8190555050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61170f6127c9565b1515611783576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60008061184f6111e8565b91509150811515611861575050611d7a565b600073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515611d3657600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611b3557611a30600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156119ef57600080fd5b505afa158015611a03573d6000803e3d6000fd5b505050506040513d6020811015611a1957600080fd5b810190808051906020019092919050505030613da1565b50611b2f600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611aef57600080fd5b505afa158015611b03573d6000803e3d6000fd5b505050506040513d6020811015611b1957600080fd5b8101908080519060200190929190505050613293565b50611d35565b611c34600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611bf357600080fd5b505afa158015611c07573d6000803e3d6000fd5b505050506040513d6020811015611c1d57600080fd5b810190808051906020019092919050505030614028565b50611d33600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611cf357600080fd5b505afa158015611d07573d6000803e3d6000fd5b505050506040513d6020811015611d1d57600080fd5b8101908080519060200190929190505050612efd565b505b5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505b565b611d846127c9565b1515611df8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611efa57600080fd5b505afa158015611f0e573d6000803e3d6000fd5b505050506040513d6020811015611f2457600080fd5b81019080805190602001909291905050509050600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156120a857600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561206a57600080fd5b505afa15801561207e573d6000803e3d6000fd5b505050506040513d602081101561209457600080fd5b810190808051906020019092919050505090505b73e66127a3539e1a415cfaae8a43cb9d73e65042956379d88372600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b15801561218d57600080fd5b505afa1580156121a1573d6000803e3d6000fd5b505050506040513d60208110156121b757600080fd5b8101908080519060200190929190505050866040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018281526020019550505050505060206040518083038186803b1580156122b957600080fd5b505af41580156122cd573d6000803e3d6000fd5b505050506040513d60208110156122e357600080fd5b810190808051906020019092919050505091505090565b600060016006600082825401925050819055506000600654905060003073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b15801561237857600080fd5b505afa15801561238c573d6000803e3d6000fd5b505050506040513d60208110156123a257600080fd5b8101908080519060200190929190505050905060008111151561242d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4e6f2049444c454441492068617665206265656e20697373756564000000000081525060200191505060405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156125db576000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561256257600080fd5b505afa158015612576573d6000803e3d6000fd5b505050506040513d602081101561258c57600080fd5b8101908080519060200190929190505050905060006125c6836125b8848961351790919063ffffffff16565b6135a190919063ffffffff16565b90506125d28133613da1565b9450505061270d565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561269857600080fd5b505afa1580156126ac573d6000803e3d6000fd5b505050506040513d60208110156126c257600080fd5b8101908080519060200190929190505050905060006126fc836126ee848961351790919063ffffffff16565b6135a190919063ffffffff16565b90506127088133614028565b945050505b6127173385614132565b61271f611844565b5060065481141515612799576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b50919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b6128296127c9565b151561289d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60008290506000821415156128dc576128d733838373ffffffffffffffffffffffffffffffffffffffff166142d29092919063ffffffff16565b6129db565b6129da338273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561297957600080fd5b505afa15801561298d573d6000803e3d6000fd5b505050506040513d60208110156129a357600080fd5b81019080805190602001909291905050508373ffffffffffffffffffffffffffffffffffffffff166142d29092919063ffffffff16565b5b505050565b606060048054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612a785780601f10612a4d57610100808354040283529160200191612a78565b820191906000526020600020905b815481529060010190602001808311612a5b57829003601f168201915b5050505050905090565b6000612b1d3384612b1885600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613c8c90919063ffffffff16565b6137f1565b6001905092915050565b6000612b343384846139ec565b6001905092915050565b60008073e66127a3539e1a415cfaae8a43cb9d73e650429563fe26dc40600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600c546040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604080518083038186803b158015612c5957600080fd5b505af4158015612c6d573d6000803e3d6000fd5b505050506040513d6040811015612c8357600080fd5b810190808051906020019092919080519060200190929190505050915091509091565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b612d356127c9565b1515612da9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b612db2816143bf565b50565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b612ef7848573ffffffffffffffffffffffffffffffffffffffff166323b872dd90507c010000000000000000000000000000000000000000000000000000000002858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050614507565b50505050565b600080600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612fbb57600080fd5b505afa158015612fcf573d6000803e3d6000fd5b505050506040513d6020811015612fe557600080fd5b810190808051906020019092919050505014156130045780905061328e565b613073600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661475a9092919063ffffffff16565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff1663a0712d68856040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b15801561310b57600080fd5b505af115801561311f573d6000803e3d6000fd5b505050506040513d602081101561313557600080fd5b81019080805190602001909291905050501415156131bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f4572726f72206d696e74696e670000000000000000000000000000000000000081525060200191505060405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff1663182df0f56040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b15801561321f57600080fd5b505afa158015613233573d6000803e3d6000fd5b505050506040513d602081101561324957600080fd5b810190808051906020019092919050505090506132898161327b670de0b6b3a76400008761351790919063ffffffff16565b6135a190919063ffffffff16565b925050505b919050565b600080600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561335157600080fd5b505afa158015613365573d6000803e3d6000fd5b505050506040513d602081101561337b57600080fd5b8101908080519060200190929190505050141561339a57809050613512565b613409600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661475a9092919063ffffffff16565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff166340c10f1930856040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156134d357600080fd5b505af11580156134e7573d6000803e3d6000fd5b505050506040513d60208110156134fd57600080fd5b81019080805190602001909291905050509150505b919050565b60008083141561352a576000905061359b565b6000828402905082848281151561353d57fe5b04141515613596576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806149e56021913960400191505060405180910390fd5b809150505b92915050565b6000808211151561361a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525060200191505060405180910390fd5b6000828481151561362757fe5b0490508091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156136d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206d696e7420746f20746865207a65726f20616464726573730081525060200191505060405180910390fd5b6136ee81600254613d1790919063ffffffff16565b600281905550613745816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613d1790919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515613879576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180614a4c6024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515613901576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806149c36022913960400191505060405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515613a74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180614a276025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515613afc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018061497a6023913960400191505060405180910390fd5b613b4d816000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613c8c90919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613be0816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613d1790919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b6000828211151515613d06576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525060200191505060405180910390fd5b600082840390508091505092915050565b6000808284019050838110151515613d97576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff1663db006a75866040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b158015613e3a57600080fd5b505af1158015613e4e573d6000803e3d6000fd5b505050506040513d6020811015613e6457600080fd5b8101908080519060200190929190505050141515613ecd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180614a9a602e913960400191505060405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff1663182df0f56040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b158015613f3157600080fd5b505afa158015613f45573d6000803e3d6000fd5b505050506040513d6020811015613f5b57600080fd5b81019080805190602001909291905050509050613f9b670de0b6b3a7640000613f8d838861351790919063ffffffff16565b6135a190919063ffffffff16565b92503073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415156140205761401f8484600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166142d29092919063ffffffff16565b5b505092915050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639dc29fac83856040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156140ef57600080fd5b505af1158015614103573d6000803e3d6000fd5b505050506040513d602081101561411957600080fd5b8101908080519060200190929190505050905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156141ba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180614a066021913960400191505060405180910390fd5b6141cf81600254613c8c90919063ffffffff16565b600281905550614226816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613c8c90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b6143ba838473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb90507c0100000000000000000000000000000000000000000000000000000000028484604051602401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050614507565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515614447576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602681526020018061499d6026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6145268273ffffffffffffffffffffffffffffffffffffffff16614966565b151561459a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e74726163740081525060200191505060405180910390fd5b600060608373ffffffffffffffffffffffffffffffffffffffff16836040518082805190602001908083835b6020831015156145eb57805182526020820191506020810190506020830392506145c6565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461464d576040519150601f19603f3d011682016040523d82523d6000602084013e614652565b606091505b50915091508115156146cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656481525060200191505060405180910390fd5b600081511115614754578080602001905160208110156146eb57600080fd5b81019080805190602001909291905050501515614753576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180614a70602a913960400191505060405180910390fd5b5b50505050565b6000614876828573ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30876040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b15801561482d57600080fd5b505afa158015614841573d6000803e3d6000fd5b505050506040513d602081101561485757600080fd5b8101908080519060200190929190505050613d1790919063ffffffff16565b9050614960848573ffffffffffffffffffffffffffffffffffffffff1663095ea7b390507c0100000000000000000000000000000000000000000000000000000000028584604051602401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050614507565b50505050565b600080823b90506000811191505091905056fe45524332303a207472616e7366657220746f20746865207a65726f20616464726573734f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573735361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564536f6d657468696e672077656e742077726f6e67207768656e2072656465656d696e6720696e2063546f6b656e73a165627a7a723058203971eb9d650d67af8872478aefb583b93ffd3f6422f1b4601f7254024586fef50029

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

000000000000000000000000f5dce57282a584d2746faf1593d3121fcac444dc00000000000000000000000014094949152eddbfcd073717200da82fed8dc96000000000000000000000000089d24a6b4ccb1b6faa2625fe562bdd9a23260359

-----Decoded View---------------
Arg [0] : _cToken (address): 0xF5DCe57282A584D2746FaF1593d3121Fcac444dC
Arg [1] : _iToken (address): 0x14094949152EDDBFcd073717200DA82fEd8dC960
Arg [2] : _token (address): 0x89d24A6b4CcB1B6fAA2625fE562bDD9a23260359

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000f5dce57282a584d2746faf1593d3121fcac444dc
Arg [1] : 00000000000000000000000014094949152eddbfcd073717200da82fed8dc960
Arg [2] : 00000000000000000000000089d24a6b4ccb1b6faa2625fe562bdd9a23260359


Deployed Bytecode Sourcemap

30111:8215:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30111:8215:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15348:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;15348:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32643:927;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;32643:927:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;9118:148;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;9118:148:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;31073:87;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;31073:87:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;8141:91;;;:::i;:::-;;;;;;;;;;;;;;;;;;;30851:109;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;30851:109:0;;;;;;;;;;;;;;;;;:::i;:::-;;30443:32;;;:::i;:::-;;;;;;;;;;;;;;;;;;;9737:256;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;9737:256:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;16206:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;10402:206;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;10402:206:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;30300:21;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;32212:178;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31259:91;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;31259:91:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;30410:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;30379:24;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;35672:398;;;:::i;:::-;;;;;;;;;;;;;;;;;;;30964:105;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;30964:105:0;;;;;;;;;;;;;;;;;:::i;:::-;;30247:21;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;8295:110;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;8295:110:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;19593:140;;;:::i;:::-;;34686:742;;;:::i;:::-;;31164:91;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;31164:91:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;31803:405;;;:::i;:::-;;;;;;;;;;;;;;;;;;;33671:860;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;33671:860:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;18782:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;19148:92;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;31466:320;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;31466:320:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;15550:87;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;15550:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11111:216;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;11111:216:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;8618:156;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;8618:156:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;32394:139;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;8837:134;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;8837:134:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;19888:109;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;19888:109:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;30354:20;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;15348:83;15385:13;15418:5;15411:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15348:83;:::o;32643:927::-;32724:20;17716:1;17699:13;;:18;;;;;;;;;;;17728:20;17751:13;;17728:36;;32773:1;32763:7;:11;32755:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32860:11;:9;:11::i;:::-;32939:17;32966:5;;;;;;;;;;;32939:33;;33017:63;33045:10;33065:4;33072:7;33017:10;:27;;;;:63;;;;;;:::i;:::-;33091:17;33111:6;33091:26;;33126:19;33148:4;:16;;;:18;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33148:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33148:18:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;33148:18:0;;;;;;;;;;;;;;;;33126:40;;33196:1;33181:11;:16;;33177:67;;;33222:12;:10;:12::i;:::-;33210:24;;33177:67;33271:6;;;;;;;;;;;33258:19;;:9;;;;;;;;;;;:19;;;33254:115;;;33290:21;33303:7;33290:12;:21::i;:::-;;33254:115;;;33338:21;33351:7;33338:12;:21::i;:::-;;33254:115;33396:1;33381:11;:16;33377:148;;;33425:7;33410:22;;33377:148;;;33481:34;33505:9;33481:19;33493:6;33481:7;:11;;:19;;;;:::i;:::-;:23;;:34;;;;:::i;:::-;33466:49;;33377:148;33533:31;33539:10;33551:12;33533:5;:31::i;:::-;17775:1;;;17811:13;;17795:12;:29;17787:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32643:927;;;;:::o;9118:148::-;9183:4;9200:36;9209:10;9221:7;9230:5;9200:8;:36::i;:::-;9254:4;9247:11;;9118:148;;;;:::o;31073:87::-;18994:9;:7;:9::i;:::-;18986:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31148:6;31140:5;;:14;;;;;;;;;;;;;;;;;;31073:87;:::o;8141:91::-;8185:7;8212:12;;8205:19;;8141:91;:::o;30851:109::-;18994:9;:7;:9::i;:::-;18986:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30949:5;30929:17;:25;;;;30851:109;:::o;30443:32::-;;;;:::o;9737:256::-;9826:4;9843:36;9853:6;9861:9;9872:6;9843:9;:36::i;:::-;9890:73;9899:6;9907:10;9919:43;9955:6;9919:11;:19;9931:6;9919:19;;;;;;;;;;;;;;;:31;9939:10;9919:31;;;;;;;;;;;;;;;;:35;;:43;;;;:::i;:::-;9890:8;:73::i;:::-;9981:4;9974:11;;9737:256;;;;;:::o;16206:83::-;16247:5;16272:9;;;;;;;;;;;16265:16;;16206:83;:::o;10402:206::-;10482:4;10499:79;10508:10;10520:7;10529:48;10566:10;10529:11;:23;10541:10;10529:23;;;;;;;;;;;;;;;:32;10553:7;10529:32;;;;;;;;;;;;;;;;:36;;:48;;;;:::i;:::-;10499:8;:79::i;:::-;10596:4;10589:11;;10402:206;;;;:::o;30300:21::-;;;;;;;;;;;;;:::o;32212:178::-;32269:4;32275:7;32300:8;:23;32324:6;;;;;;;;;;;32332;;;;;;;;;;;32340:9;;;;;;;;;;;32351:13;;32366:17;;32300:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32300:84:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32300:84:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;32300:84:0;;;;;;;;;;;;;;;;;;;;;;;;;32293:91;;;;32212:178;;:::o;31259:91::-;18994:9;:7;:9::i;:::-;18986:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31337:7;31328:6;;:16;;;;;;;;;;;;;;;;;;31259:91;:::o;30410:28::-;;;;:::o;30379:24::-;;;;;;;;;;;;;:::o;35672:398::-;35724:21;35779:6;;;;;;;;;;;35772:29;;;:31;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35772:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35772:31:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;35772:31:0;;;;;;;;;;;;;;;;35756:47;;35833:1;35816:13;:18;35812:65;;;35854:13;35847:20;;;;35812:65;35887:11;:9;:11::i;:::-;35924:6;;;;;;;;;;;35911:19;;:9;;;;;;;;;;;:19;;;35907:127;;;35943:27;35956:13;35943:12;:27::i;:::-;;35907:127;;;35997:27;36010:13;35997:12;:27::i;:::-;;35907:127;36051:13;36044:20;;35672:398;;:::o;30964:105::-;18994:9;:7;:9::i;:::-;18986:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31056:7;31040:13;:23;;;;30964:105;:::o;30247:21::-;;;;;;;;;;;;;:::o;8295:110::-;8352:7;8379:9;:18;8389:7;8379:18;;;;;;;;;;;;;;;;8372:25;;8295:110;;;:::o;19593:140::-;18994:9;:7;:9::i;:::-;18986:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19692:1;19655:40;;19676:6;;;;;;;;;;;19655:40;;;;;;;;;;;;19723:1;19706:6;;:19;;;;;;;;;;;;;;;;;;19593:140::o;34686:742::-;34729:20;34751:24;34779:16;:14;:16::i;:::-;34728:67;;;;34809:15;34808:16;34804:49;;;34837:7;;;;34804:49;34888:1;34867:23;;:9;;;;;;;;;;;:23;;;;34863:485;;;34971:6;;;;;;;;;;;34958:19;;:9;;;;;;;;;;;:19;;;34954:385;;;34992:70;35014:6;;;;;;;;;;;35007:24;;;35040:4;35007:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35007:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35007:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;35007:39:0;;;;;;;;;;;;;;;;35056:4;34992:14;:70::i;:::-;;35109:52;35129:5;;;;;;;;;;;35122:23;;;35154:4;35122:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35122:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35122:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;35122:38:0;;;;;;;;;;;;;;;;35109:12;:52::i;:::-;;34954:385;;;35192:70;35214:6;;;;;;;;;;;35207:24;;;35240:4;35207:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35207:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35207:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;35207:39:0;;;;;;;;;;;;;;;;35256:4;35192:14;:70::i;:::-;;35275:52;35295:5;;;;;;;;;;;35288:23;;;35320:4;35288:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35288:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35288:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;35288:38:0;;;;;;;;;;;;;;;;35275:12;:52::i;:::-;;34954:385;34863:485;35406:16;35394:9;;:28;;;;;;;;;;;;;;;;;;34686:742;;;:::o;31164:91::-;18994:9;:7;:9::i;:::-;18986:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31242:7;31233:6;;:16;;;;;;;;;;;;;;;;;;31164:91;:::o;31803:405::-;31856:13;31880:18;31908:6;;;;;;;;;;;31901:24;;;31934:4;31901:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31901:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31901:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;31901:39:0;;;;;;;;;;;;;;;;31880:60;;31966:6;;;;;;;;;;;31953:19;;:9;;;;;;;;;;;:19;;;31949:98;;;32005:6;;;;;;;;;;;31998:24;;;32031:4;31998:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31998:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31998:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;31998:39:0;;;;;;;;;;;;;;;;31985:52;;31949:98;32065:8;:24;32100:6;;;;;;;;;;;32117;;;;;;;;;;;32134:9;;;;;;;;;;;32154:4;:16;;;:18;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32154:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32154:18:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;32154:18:0;;;;;;;;;;;;;;;;32183:10;32065:137;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32065:137:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32065:137:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;32065:137:0;;;;;;;;;;;;;;;;32057:145;;31803:405;;:::o;33671:860::-;33754:22;17716:1;17699:13;;:18;;;;;;;;;;;17728:20;17751:13;;17728:36;;33785:18;33806:4;:16;;;:18;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33806:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33806:18:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;33806:18:0;;;;;;;;;;;;;;;;33785:39;;33852:1;33839:10;:14;33831:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33911:6;;;;;;;;;;;33898:19;;:9;;;;;;;;;;;:19;;;33894:581;;;33928:20;33958:6;;;;;;;;;;;33951:24;;;33984:4;33951:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33951:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33951:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;33951:39:0;;;;;;;;;;;;;;;;33928:62;;33999:20;34022:41;34052:10;34022:25;34034:12;34022:7;:11;;:25;;;;:::i;:::-;:29;;:41;;;;:::i;:::-;33999:64;;34089:40;34104:12;34118:10;34089:14;:40::i;:::-;34072:57;;33894:581;;;;;34152:20;34182:6;;;;;;;;;;;34175:24;;;34208:4;34175:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34175:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34175:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;34175:39:0;;;;;;;;;;;;;;;;34152:62;;34223:20;34246:41;34276:10;34246:25;34258:12;34246:7;:11;;:25;;;;:::i;:::-;:29;;:41;;;;:::i;:::-;34223:64;;34427:40;34442:12;34456:10;34427:14;:40::i;:::-;34410:57;;33894:581;;;34481:26;34487:10;34499:7;34481:5;:26::i;:::-;34514:11;:9;:11::i;:::-;17775:1;17811:13;;17795:12;:29;17787:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33671:860;;;;:::o;18782:79::-;18820:7;18847:6;;;;;;;;;;;18840:13;;18782:79;:::o;19148:92::-;19188:4;19226:6;;;;;;;;;;;19212:20;;:10;:20;;;19205:27;;19148:92;:::o;31466:320::-;18994:9;:7;:9::i;:::-;18986:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31558:17;31585:6;31558:34;;31615:1;31605:6;:11;;31601:180;;;31629:43;31653:10;31665:6;31629:10;:23;;;;:43;;;;;:::i;:::-;31601:180;;;31699:72;31723:10;31735;:20;;;31764:4;31735:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31735:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31735:35:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;31735:35:0;;;;;;;;;;;;;;;;31699:10;:23;;;;:72;;;;;:::i;:::-;31601:180;19051:1;31466:320;;:::o;15550:87::-;15589:13;15622:7;15615:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15550:87;:::o;11111:216::-;11196:4;11213:84;11222:10;11234:7;11243:53;11280:15;11243:11;:23;11255:10;11243:23;;;;;;;;;;;;;;;:32;11267:7;11243:32;;;;;;;;;;;;;;;;:36;;:53;;;;:::i;:::-;11213:8;:84::i;:::-;11315:4;11308:11;;11111:216;;;;:::o;8618:156::-;8687:4;8704:40;8714:10;8726:9;8737:6;8704:9;:40::i;:::-;8762:4;8755:11;;8618:156;;;;:::o;32394:139::-;32446:7;32455;32480:8;:16;32497:6;;;;;;;;;;;32505;;;;;;;;;;;32513:13;;32480:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32480:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32480:47:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;32480:47:0;;;;;;;;;;;;;;;;;;;;;;;;;32473:54;;;;32394:139;;:::o;8837:134::-;8909:7;8936:11;:18;8948:5;8936:18;;;;;;;;;;;;;;;:27;8955:7;8936:27;;;;;;;;;;;;;;;;8929:34;;8837:134;;;;:::o;19888:109::-;18994:9;:7;:9::i;:::-;18986:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19961:28;19980:8;19961:18;:28::i;:::-;19888:109;:::o;30354:20::-;;;;;;;;;;;;;:::o;22233:204::-;22334:95;22353:5;22383;:18;;;:27;;;;22412:4;22418:2;22422:5;22360:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;22360:68:0;;;;;;;38:4:-1;29:7;25:18;67:10;61:17;96:58;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;22360:68:0;22334:18;:95::i;:::-;22233:204;;;;:::o;36091:873::-;36158:15;36230:1;36195:5;;;;;;;;;;;36188:23;;;36220:4;36188:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36188:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36188:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;36188:38:0;;;;;;;;;;;;;;;;:43;36184:84;;;36251:7;36244:14;;;;36184:84;36326:52;36362:6;;;;;;;;;;;36370:7;36333:5;;;;;;;;;;;36326:35;;;;:52;;;;;:::i;:::-;36450:14;36474:6;;;;;;;;;;;36450:31;;36579:1;36554:7;:12;;;36567:7;36554:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36554:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36554:21:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;36554:21:0;;;;;;;;;;;;;;;;:26;36546:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36743:28;36774:7;:26;;;:28;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36774:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36774:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;36774:28:0;;;;;;;;;;;;;;;;36743:59;;36913:45;36937:20;36913:19;36925:6;36913:7;:11;;:19;;;;:::i;:::-;:23;;:45;;;;:::i;:::-;36903:55;;36091:873;;;;;;:::o;36968:476::-;37035:15;37107:1;37072:5;;;;;;;;;;;37065:23;;;37097:4;37065:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37065:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37065:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;37065:38:0;;;;;;;;;;;;;;;;:43;37061:84;;;37128:7;37121:14;;;;37061:84;37203:52;37239:6;;;;;;;;;;;37247:7;37210:5;;;;;;;;;;;37203:35;;;;:52;;;;;:::i;:::-;37325:14;37349:6;;;;;;;;;;;37325:31;;37402:7;:12;;;37423:4;37430:7;37402:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37402:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37402:36:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;37402:36:0;;;;;;;;;;;;;;;;37392:46;;36968:476;;;;;:::o;4691:470::-;4749:7;4998:1;4993;:6;4989:47;;;5023:1;5016:8;;;;4989:47;5048:9;5064:1;5060;:5;5048:17;;5093:1;5088;5084;:5;;;;;;;;:10;5076:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5152:1;5145:8;;;4691:470;;;;;:::o;5629:333::-;5687:7;5786:1;5782;:5;5774:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5829:9;5845:1;5841;:5;;;;;;;;5829:17;;5953:1;5946:8;;;5629:333;;;;:::o;12527:308::-;12622:1;12603:21;;:7;:21;;;;12595:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12688:24;12705:6;12688:12;;:16;;:24;;;;:::i;:::-;12673:12;:39;;;;12744:30;12767:6;12744:9;:18;12754:7;12744:18;;;;;;;;;;;;;;;;:22;;:30;;;;:::i;:::-;12723:9;:18;12733:7;12723:18;;;;;;;;;;;;;;;:51;;;;12811:7;12790:37;;12807:1;12790:37;;;12820:6;12790:37;;;;;;;;;;;;;;;;;;12527:308;;:::o;13913:335::-;14023:1;14006:19;;:5;:19;;;;13998:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14104:1;14085:21;;:7;:21;;;;14077:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14188:5;14158:11;:18;14170:5;14158:18;;;;;;;;;;;;;;;:27;14177:7;14158:27;;;;;;;;;;;;;;;:35;;;;14225:7;14209:31;;14218:5;14209:31;;;14234:5;14209:31;;;;;;;;;;;;;;;;;;13913:335;;;:::o;11817:429::-;11933:1;11915:20;;:6;:20;;;;11907:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12017:1;11996:23;;:9;:23;;;;11988:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12092:29;12114:6;12092:9;:17;12102:6;12092:17;;;;;;;;;;;;;;;;:21;;:29;;;;:::i;:::-;12072:9;:17;12082:6;12072:17;;;;;;;;;;;;;;;:49;;;;12155:32;12180:6;12155:9;:20;12165:9;12155:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;12132:9;:20;12142:9;12132:20;;;;;;;;;;;;;;;:55;;;;12220:9;12203:35;;12212:6;12203:35;;;12231:6;12203:35;;;;;;;;;;;;;;;;;;11817:429;;;:::o;4256:184::-;4314:7;4347:1;4342;:6;;4334:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4394:9;4410:1;4406;:5;4394:17;;4431:1;4424:8;;;4256:184;;;;:::o;3800:181::-;3858:7;3878:9;3894:1;3890;:5;3878:17;;3919:1;3914;:6;;3906:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3972:1;3965:8;;;3800:181;;;;:::o;37450:704::-;37537:14;37562;37586:6;;;;;;;;;;;37562:31;;37676:1;37649:7;:14;;;37664:7;37649:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37649:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37649:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;37649:23:0;;;;;;;;;;;;;;;;:28;37641:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37830:28;37861:7;:26;;;:28;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37861:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37861:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;37861:28:0;;;;;;;;;;;;;;;;37830:59;;37997:45;38035:6;37997:33;38009:20;37997:7;:11;;:33;;;;:::i;:::-;:37;;:45;;;;:::i;:::-;37988:54;;38077:4;38057:25;;:8;:25;;;;38053:96;;;38095:44;38122:8;38132:6;38102:5;;;;;;;;;;;38095:26;;;;:44;;;;;:::i;:::-;38053:96;37450:704;;;;;;:::o;38158:165::-;38245:14;38286:6;;;;;;;;;;;38279:19;;;38299:8;38309:7;38279:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38279:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38279:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;38279:38:0;;;;;;;;;;;;;;;;38270:47;;38158:165;;;;:::o;13167:306::-;13261:1;13242:21;;:7;:21;;;;13234:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13329:23;13346:5;13329:12;;:16;;:23;;;;:::i;:::-;13314:12;:38;;;;13384:29;13407:5;13384:9;:18;13394:7;13384:18;;;;;;;;;;;;;;;;:22;;:29;;;;:::i;:::-;13363:9;:18;13373:7;13363:18;;;;;;;;;;;;;;;:50;;;;13455:1;13429:36;;13438:7;13429:36;;;13459:5;13429:36;;;;;;;;;;;;;;;;;;13167:306;;:::o;22049:176::-;22132:85;22151:5;22181;:14;;;:23;;;;22206:2;22210:5;22158:58;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;22158:58:0;;;;;;;38:4:-1;29:7;25:18;67:10;61:17;96:58;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;22158:58:0;22132:18;:85::i;:::-;22049:176;;;:::o;20103:229::-;20197:1;20177:22;;:8;:22;;;;20169:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20287:8;20258:38;;20279:6;;;;;;;;;;;20258:38;;;;;;;;;;;;20316:8;20307:6;;:17;;;;;;;;;;;;;;;;;;20103:229;:::o;24043:1114::-;24647:27;24655:5;24647:25;;;:27::i;:::-;24639:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24784:12;24798:23;24833:5;24825:19;;24845:4;24825:25;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;51:19;36:153;;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;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;;;24825:25: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;;24783:67:0;;;;24869:7;24861:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24950:1;24930:10;:17;:21;24926:224;;;25072:10;25061:30;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;25061:30:0;;;;;;;;;;;;;;;;25053:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24926:224;24043:1114;;;;:::o;23074:285::-;23171:20;23194:50;23238:5;23194;:15;;;23218:4;23225:7;23194:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23194:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23194:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;23194:39:0;;;;;;;;;;;;;;;;:43;;:50;;;;:::i;:::-;23171:73;;23255:96;23274:5;23304;:13;;;:22;;;;23328:7;23337:12;23281:69;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;23281:69:0;;;;;;;38:4:-1;29:7;25:18;67:10;61:17;96:58;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;23281:69:0;23255:18;:96::i;:::-;23074:285;;;;:::o;20959:422::-;21019:4;21227:12;21338:7;21326:20;21318:28;;21372:1;21365:4;:8;21358:15;;;20959:422;;;:::o

Swarm Source

bzzr://3971eb9d650d67af8872478aefb583b93ffd3f6422f1b4601f7254024586fef5
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.