ETH Price: $3,243.71 (+1.52%)
 

Overview

Max Total Supply

10,000,000 MXRBOT

Holders

106

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
15,558.210842325342126559 MXRBOT

Value
$0.00
0x07a86c71ece8beff92dcbade1e4391bcf0d78a8e
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
MixerBot

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-09-06
*/

// File: Mix/IUniswapV2Router.sol
 
 
 
pragma solidity ^0.8.19;
 
 
interface IUniswapV2Router01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
 
    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
 
    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}
 
// File: @uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router02.sol
 
 
interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);
 
    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}
// File: Mix/IUniswapV2Factory.sol
 
 
 
pragma solidity ^0.8.19;
 
interface IUniswapV2Factory {
    function createPair(address tokenA, address tokenB) external returns (address pair);
    function getPair(address tokenA, address tokenB) external view returns (address pair);
}
// File: Mix/SafeMath.sol
 
 
 
pragma solidity ^0.8.19;
 
library SafeMath {
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }
 
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }
 
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;
        return c;
    }
 
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }
 
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }
 
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        return c;
    }
 
}
 
 
/**
 * @title SafeMathUint
 * @dev Math operations with safety checks that revert on error
 */
library SafeMathUint {
  function toInt256Safe(uint256 a) internal pure returns (int256) {
    int256 b = int256(a);
    require(b >= 0);
    return b;
  }
}
 
/**
 * @title SafeMathInt
 * @dev Math operations for int256 with overflow safety checks.
 */
library SafeMathInt {
    int256 private constant MIN_INT256 = int256(1) << 255;
    int256 private constant MAX_INT256 = ~(int256(1) << 255);
 
    /**
     * @dev Multiplies two int256 variables and fails on overflow.
     */
    function mul(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a * b;
 
        // Detect overflow when multiplying MIN_INT256 with -1
        require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256));
        require((b == 0) || (c / b == a));
        return c;
    }
 
    /**
     * @dev Division of two int256 variables and fails on overflow.
     */
    function div(int256 a, int256 b) internal pure returns (int256) {
        // Prevent overflow when dividing MIN_INT256 by -1
        require(b != -1 || a != MIN_INT256);
 
        // Solidity already throws when dividing by 0.
        return a / b;
    }
 
    /**
     * @dev Subtracts two int256 variables and fails on overflow.
     */
    function sub(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a - b;
        require((b >= 0 && c <= a) || (b < 0 && c > a));
        return c;
    }
 
    /**
     * @dev Adds two int256 variables and fails on overflow.
     */
    function add(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a + b;
        require((b >= 0 && c >= a) || (b < 0 && c < a));
        return c;
    }
 
    /**
     * @dev Converts to absolute value, and fails on overflow.
     */
    function abs(int256 a) internal pure returns (int256) {
        require(a != MIN_INT256);
        return a < 0 ? -a : a;
    }
 
 
    function toUint256Safe(int256 a) internal pure returns (uint256) {
        require(a >= 0);
        return uint256(a);
    }
}
// File: Mix/IERC20.sol
 
 
 
pragma solidity ^0.8.19;
 
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);
 
    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
 
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);
 
    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);
 
    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);
 
    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);
 
    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);
 
    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);
}
// File: Mix/IERC20Metadata.sol
 
 
 
pragma solidity ^0.8.19;
 
 
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);
 
    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);
 
    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}
// File: Mix/Context.sol
 
 
 
pragma solidity ^0.8.19;
 
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }
 
    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}
// File: Mix/ERC20.sol
 
 
 
pragma solidity ^0.8.19;
 
 
 
 
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;
 
    mapping(address => mapping(address => uint256)) private _allowances;
 
    uint256 private _totalSupply;
 
    string private _name;
    string private _symbol;
 
    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }
 
    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }
 
    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }
 
    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overridden;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }
 
    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }
 
    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }
 
    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }
 
    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }
 
    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }
 
    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);
 
        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        unchecked {
            _approve(sender, _msgSender(), currentAllowance - amount);
        }
 
        return true;
    }
 
    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);
        return true;
    }
 
    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(_msgSender(), spender, currentAllowance - subtractedValue);
        }
 
        return true;
    }
 
    /**
     * @dev Moves `amount` of tokens from `sender` to `recipient`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `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 virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");
 
        _beforeTokenTransfer(sender, recipient, amount);
 
        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[sender] = senderBalance - amount;
        }
        _balances[recipient] += amount;
 
        emit Transfer(sender, recipient, amount);
 
        _afterTokenTransfer(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:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");
 
        _beforeTokenTransfer(address(0), account, amount);
 
        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);
 
        _afterTokenTransfer(address(0), account, amount);
    }
 
    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");
 
        _beforeTokenTransfer(account, address(0), amount);
 
        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;
 
        emit Transfer(account, address(0), amount);
 
        _afterTokenTransfer(account, address(0), amount);
    }
 
    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");
 
        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }
 
    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
 
    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}
// File: Mix/Ownable.sol
 
 
 
 
pragma solidity ^0.8.19;
 
abstract contract Ownable is Context {
    address private _owner;
 
    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _owner = msg.sender;
    }
 
    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(_owner == msg.sender);
        _;
    }
 
    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }
}
// File: Mix/Dividends.sol
 
// 
//
//
 
 
 
 
 
 
pragma solidity ^0.8.19;
 
contract DividendPayingToken is ERC20 {
  using SafeMath for uint256;
  using SafeMathUint for uint256;
  using SafeMathInt for int256;
 
  // With `magnitude`, we can properly distribute dividends even if the amount of received ether is small.
  // For more discussion about choosing the value of `magnitude`,
  //  see https://github.com/ethereum/EIPs/issues/1726#issuecomment-472352728
  uint256 constant internal magnitude = 2**128;
 
  uint256 internal magnifiedDividendPerShare;
 
  // About dividendCorrection:
  // If the token balance of a `_user` is never changed, the dividend of `_user` can be computed with:
  //   `dividendOf(_user) = dividendPerShare * balanceOf(_user)`.
  // When `balanceOf(_user)` is changed (via minting/burning/transferring tokens),
  //   `dividendOf(_user)` should not be changed,
  //   but the computed value of `dividendPerShare * balanceOf(_user)` is changed.
  // To keep the `dividendOf(_user)` unchanged, we add a correction term:
  //   `dividendOf(_user) = dividendPerShare * balanceOf(_user) + dividendCorrectionOf(_user)`,
  //   where `dividendCorrectionOf(_user)` is updated whenever `balanceOf(_user)` is changed:
  //   `dividendCorrectionOf(_user) = dividendPerShare * (old balanceOf(_user)) - (new balanceOf(_user))`.
  // So now `dividendOf(_user)` returns the same value before and after `balanceOf(_user)` is changed.
  mapping(address => int256) internal magnifiedDividendCorrections;
  mapping(address => uint256) internal withdrawnDividends;
 
  uint256 public totalDividendsDistributed;
 
  event DividendsDistributed(address user, uint256 amount);
  event DividendWithdrawn(address user, uint256 amount);
 
  constructor(string memory _name, string memory _symbol) ERC20(_name, _symbol) {
 
  }
 
  /// @dev Distributes dividends whenever ether is paid to this contract.
  receive() external payable {
    distributeDividends();
  }
 
  /// @notice Distributes ether to token holders as dividends.
  /// @dev It reverts if the total supply of tokens is 0.
  /// It emits the `DividendsDistributed` event if the amount of received ether is greater than 0.
  /// About undistributed ether:
  ///   In each distribution, there is a small amount of ether not distributed,
  ///     the magnified amount of which is
  ///     `(msg.value * magnitude) % totalSupply()`.
  ///   With a well-chosen `magnitude`, the amount of undistributed ether
  ///     (de-magnified) in a distribution can be less than 1 wei.
  ///   We can actually keep track of the undistributed ether in a distribution
  ///     and try to distribute it in the next distribution,
  ///     but keeping track of such data on-chain costs much more than
  ///     the saved ether, so we don't do that.
  function distributeDividends() public virtual payable {
    require(totalSupply() > 0);
 
    if (msg.value > 0) {
      magnifiedDividendPerShare = magnifiedDividendPerShare.add(
        (msg.value).mul(magnitude) / totalSupply()
      );
      emit DividendsDistributed(msg.sender, msg.value);
 
      totalDividendsDistributed = totalDividendsDistributed.add(msg.value);
    }
  }
 
  /// @notice Withdraws the ether distributed to the sender.
  /// @dev It emits a `DividendWithdrawn` event if the amount of withdrawn ether is greater than 0.
  function withdrawDividend() public virtual {
    _withdrawDividendOfUser(payable(msg.sender));
  }
 
  /// @notice Withdraws the ether distributed to the sender.
  /// @dev It emits a `DividendWithdrawn` event if the amount of withdrawn ether is greater than 0.
  function _withdrawDividendOfUser(address payable user) internal returns (uint256) {
    uint256 _withdrawableDividend = withdrawableDividendOf(user);
    if (_withdrawableDividend > 0) {
      withdrawnDividends[user] = withdrawnDividends[user].add(_withdrawableDividend);
      emit DividendWithdrawn(user, _withdrawableDividend);
      (bool success,) = user.call{value: _withdrawableDividend, gas: 3000}("");
 
      if(!success) {
        withdrawnDividends[user] = withdrawnDividends[user].sub(_withdrawableDividend);
        return 0;
      }
 
      return _withdrawableDividend;
    }
 
    return 0;
  }
 
 
  /// @notice View the amount of dividend in wei that an address can withdraw.
  /// @param _owner The address of a token holder.
  /// @return The amount of dividend in wei that `_owner` can withdraw.
  function dividendOf(address _owner) public view returns(uint256) {
    return withdrawableDividendOf(_owner);
  }
 
  /// @notice View the amount of dividend in wei that an address can withdraw.
  /// @param _owner The address of a token holder.
  /// @return The amount of dividend in wei that `_owner` can withdraw.
  function withdrawableDividendOf(address _owner) public view returns(uint256) {
    return accumulativeDividendOf(_owner).sub(withdrawnDividends[_owner]);
  }
 
  /// @notice View the amount of dividend in wei that an address has withdrawn.
  /// @param _owner The address of a token holder.
  /// @return The amount of dividend in wei that `_owner` has withdrawn.
  function withdrawnDividendOf(address _owner) public view returns(uint256) {
    return withdrawnDividends[_owner];
  }
 
 
  /// @notice View the amount of dividend in wei that an address has earned in total.
  /// @dev accumulativeDividendOf(_owner) = withdrawableDividendOf(_owner) + withdrawnDividendOf(_owner)
  /// = (magnifiedDividendPerShare * balanceOf(_owner) + magnifiedDividendCorrections[_owner]) / magnitude
  /// @param _owner The address of a token holder.
  /// @return The amount of dividend in wei that `_owner` has earned in total.
  function accumulativeDividendOf(address _owner) public view returns(uint256) {
    return magnifiedDividendPerShare.mul(balanceOf(_owner)).toInt256Safe()
      .add(magnifiedDividendCorrections[_owner]).toUint256Safe() / magnitude;
  }
 
  /// @dev Internal function that transfer tokens from one address to another.
  /// Update magnifiedDividendCorrections to keep dividends unchanged.
  /// @param from The address to transfer from.
  /// @param to The address to transfer to.
  /// @param value The amount to be transferred.
  function _transfer(address from, address to, uint256 value) internal virtual override {
    require(false);
 
    int256 _magCorrection = magnifiedDividendPerShare.mul(value).toInt256Safe();
    magnifiedDividendCorrections[from] = magnifiedDividendCorrections[from].add(_magCorrection);
    magnifiedDividendCorrections[to] = magnifiedDividendCorrections[to].sub(_magCorrection);
  }
 
  /// @dev Internal function that mints tokens to an account.
  /// Update magnifiedDividendCorrections to keep dividends unchanged.
  /// @param account The account that will receive the created tokens.
  /// @param value The amount that will be created.
  function _mint(address account, uint256 value) internal override {
    super._mint(account, value);
 
    magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account]
      .sub( (magnifiedDividendPerShare.mul(value)).toInt256Safe() );
  }
 
  /// @dev Internal function that burns an amount of the token of a given account.
  /// Update magnifiedDividendCorrections to keep dividends unchanged.
  /// @param account The account whose tokens will be burnt.
  /// @param value The amount that will be burnt.
  function _burn(address account, uint256 value) internal override {
    super._burn(account, value);
 
    magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account]
      .add( (magnifiedDividendPerShare.mul(value)).toInt256Safe() );
  }
 
  function _setBalance(address account, uint256 newBalance) internal {
    uint256 currentBalance = balanceOf(account);
 
    if(newBalance > currentBalance) {
      uint256 mintAmount = newBalance.sub(currentBalance);
      _mint(account, mintAmount);
    } else if(newBalance < currentBalance) {
      uint256 burnAmount = currentBalance.sub(newBalance);
      _burn(account, burnAmount);
    }
  }
}
 
 
contract MixerDividends is DividendPayingToken, Ownable {
    using SafeMath for uint256;
    using SafeMathInt for int256;
 
    IERC20 token;
 
    mapping (address => bool) public excludedFromDividends;
 
    address private deployer;
    uint256 public closeTime;
 
    uint256 public constant claimGracePeriod = 30 days;
 
    event ExcludeFromDividends(address indexed account);
 
    event Claim(address indexed account, uint256 amount, bool indexed automatic);
 
    constructor() DividendPayingToken("MIXERBOT_Dividends", "MIXERBOT_Dividends") {
        deployer = tx.origin;
        token = IERC20(msg.sender);
    }
 
    bool noWarning;
 
    function _transfer(address, address, uint256) internal override {
        require(false, "No transfers allowed");
        noWarning = noWarning;
    }
 
    function withdrawDividend() public override {
        require(false, "withdrawDividend disabled. Use the 'claim' function on the main token contract.");
        noWarning = noWarning;
    }
 
    function claim(address account) external onlyOwner {
        require(closeTime == 0 || block.timestamp < closeTime + claimGracePeriod, "closed");
        _withdrawDividendOfUser(payable(account));
    }
 
    function excludeFromDividends(address account) external onlyOwner {
    	excludedFromDividends[account] = true;
 
    	_setBalance(account, 0);
 
    	emit ExcludeFromDividends(account);
    }
 
    function getAccount(address _account)
        public view returns (
            address account,
            uint256 withdrawableDividends,
            uint256 totalDividends) {
        account = _account;
        withdrawableDividends = withdrawableDividendOf(account);
        totalDividends = accumulativeDividendOf(account);
    }
 
    function updateBalance(address payable account) external {
    	if(excludedFromDividends[account]) {
    		return;
    	}
 
        _setBalance(account, token.balanceOf(account));
    }
 
    //If the dividend contract needs to be updated, we can close
    //this one, and let people claim for a month
    //After that is over, we can take the remaining funds and
    //use for the project
    function close() external onlyOwner {
        require(closeTime == 0, "cannot take yet");
        closeTime = block.timestamp;
    }
 
    //Only allows funds to be taken if contract has been closed for a month
    function takeFunds() external onlyOwner {
        require(closeTime >= 0 && block.timestamp >= closeTime + claimGracePeriod, "already closed");
        (bool success,) = msg.sender.call{value: address(this).balance}("");
        require(success);
    }
}
// File: Mix/token.sol
 
pragma solidity ^0.8.19;
 
contract MixerBot is Ownable, ERC20 {
    uint256 public maxWallet;
    address public uniswapV2Pair;
    IUniswapV2Router02 immutable router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
 
    MixerDividends public dividends;
 
    uint256 SUPPLY = 10_000_000 * 10**18;
 
    uint256 snipeFee = 40; 
    uint256 totalFee = 5;
    uint256 botFee = 1; 
 
    bool private inSwap = false;
    address public marketingWallet;
    address public devWallet;
    address public botWallet;
 
    uint256 public openTradingBlock;
 
    mapping (address => uint256) public receiveBlock;
 
    uint256 public swapAt = SUPPLY / 1000; //0.1%
 
    constructor() ERC20("MixerBot", "MXRBOT") payable {
        _mint(msg.sender, SUPPLY);
 
        maxWallet = SUPPLY/100;
        marketingWallet = msg.sender;
        devWallet = msg.sender;
        botWallet = 0x9B15710198Ef7915F5F03C714719A09b0DEdcF1b;
 
        dividends = new MixerDividends();
 
        dividends.excludeFromDividends(address(dividends));
        dividends.excludeFromDividends(address(this));
        dividends.excludeFromDividends(owner());
    }
 
    receive() external payable {}
 
    function isContract(address account) private view returns (bool) {
        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }
 
    function updateBotWallet(address _botWallet) external onlyOwner {
        botWallet = _botWallet;
    }
 
    function updateDividends(address _dividends) external onlyOwner {
        dividends = MixerDividends(payable(_dividends));
 
        dividends.excludeFromDividends(address(dividends));
        dividends.excludeFromDividends(address(this));
        dividends.excludeFromDividends(owner());
        dividends.excludeFromDividends(uniswapV2Pair);
        dividends.excludeFromDividends(address(router));
    }
 
    function updateFee(uint256 _totalFee, uint256 _botFee) external onlyOwner {
        require(_totalFee <= 5 && _botFee <= _totalFee);
        totalFee = _totalFee;
        botFee = _botFee;
    }
 
    function updateMaxHoldingPercent(uint256 percent) public onlyOwner {
        require(percent >= 1 && percent <= 100, "invalid percent");
        maxWallet = SUPPLY * percent / 100;
    }
 
    function updateSwapAt(uint256 value) external onlyOwner() {
        require(value <= SUPPLY / 50);
        swapAt = value;
    }
 
    function stats(address account) external view returns (uint256 withdrawableDividends, uint256 totalDividends) {
        (,withdrawableDividends,totalDividends) = dividends.getAccount(account);
    }
 
    function claim() external {
		dividends.claim(msg.sender);
    }
 
    function openTrading() external onlyOwner {
 
        address pair = IUniswapV2Factory(router.factory()).createPair(address(this), router.WETH());
        _approve(address(this), address(router), balanceOf(address(this)));
        router.addLiquidityETH{
            value: address(this).balance
        } (
            address(this),
            balanceOf(address(this)),
            0,
            0,
            owner(),
            block.timestamp
        );
 
        uniswapV2Pair = pair;
        openTradingBlock = block.number;
        dividends.excludeFromDividends(address(router));
        dividends.excludeFromDividends(pair);
 
        updateMaxHoldingPercent(1);
 
    }
 
    function _transfer(address from, address to, uint256 amount) internal override {
        if(uniswapV2Pair == address(0)) {
            require(from == address(this) || from == address(0) || from == owner() || to == owner(), "Not started");
            super._transfer(from, to, amount);
            return;
        }
 
        if(from == uniswapV2Pair && to != address(this) && to != owner() && to != address(router)) {
            require(super.balanceOf(to) + amount <= maxWallet, "max wallet");
        }
 
        uint256 swapAmount = balanceOf(address(this));
 
        if(swapAmount > swapAt) {
            swapAmount = swapAt;
        }
 
        if(
            swapAt > 0 &&
            swapAmount == swapAt &&
            !inSwap &&
            from != uniswapV2Pair) {
 
            inSwap = true;
 
            swapTokensForEth(swapAmount);
 
            uint256 balance = address(this).balance;
 
            if(balance > 0) {
                withdraw(balance);
            }
 
            inSwap = false;
        }
 
        uint256 fee;
 
        if(block.number <= openTradingBlock + 4 && from == uniswapV2Pair) {
            require(!isContract(to));
            fee = snipeFee;
        }
        else if(totalFee > 0) {
            fee = totalFee;
        }
 
        if(
            fee > 0 &&
            from != address(this) &&
            from != owner() &&
            from != address(router)
        ) {
            uint256 feeTokens = amount * fee / 100;
            amount -= feeTokens;
 
            super._transfer(from, address(this), feeTokens);
        }
 
        super._transfer(from, to, amount);
 
        dividends.updateBalance(payable(from));
        dividends.updateBalance(payable(to));
    }
 
    function swapTokensForEth(uint256 tokenAmount) private {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = router.WETH();
        _approve(address(this), address(router), tokenAmount);
 
        router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }
 
    function sendFunds(address user, uint256 value) private {
        if(value > 0) {
            (bool success,) = user.call{value: value}("");
            success;
        }
    }
 
    function withdraw(uint256 amount) private {
        uint256 botShare = totalFee > 0 ? botFee * 10000 / totalFee : 0;
 
        uint256 toBot = amount * botShare / 10000;
        uint256 toMarketing = (amount - toBot) / 2;
        uint256 toDev = toMarketing;
 
        sendFunds(marketingWallet, toMarketing);
        sendFunds(devWallet, toDev);
        sendFunds(botWallet, toBot);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"payable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"botWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dividends","outputs":[{"internalType":"contract MixerDividends","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"openTradingBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"receiveBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"stats","outputs":[{"internalType":"uint256","name":"withdrawableDividends","type":"uint256"},{"internalType":"uint256","name":"totalDividends","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_botWallet","type":"address"}],"name":"updateBotWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_dividends","type":"address"}],"name":"updateDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_totalFee","type":"uint256"},{"internalType":"uint256","name":"_botFee","type":"uint256"}],"name":"updateFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"percent","type":"uint256"}],"name":"updateMaxHoldingPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"updateSwapAt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a0604052737a250d5630b4cf539739df2c5dacb4c659f2488d6080526a084595161401484a00000060098190556028600a556005600b556001600c55600d805460ff1916905562000055906103e890620003be565b6012556040805180820182526008815267135a5e195c909bdd60c21b602080830191909152825180840190935260068352651356149093d560d21b90830152600080546001600160a01b03191633179055906004620000b5838262000485565b506005620000c4828262000485565b505050620000db33600954620002c360201b60201c565b6064600954620000ec9190620003be565b600655600d8054610100600160a81b03191633610100810291909117909155600e80546001600160a01b03199081169092179055600f8054739b15710198ef7915f5f03c714719a09b0dedcf1b92169190911790556040516200014f90620003b0565b604051809103906000f0801580156200016c573d6000803e3d6000fd5b50600880546001600160a01b0319166001600160a01b0392909216918217905560405163031e79db60e41b8152600481018290526331e79db090602401600060405180830381600087803b158015620001c457600080fd5b505af1158015620001d9573d6000803e3d6000fd5b505060085460405163031e79db60e41b81523060048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b1580156200022357600080fd5b505af115801562000238573d6000803e3d6000fd5b50506008546001600160a01b031691506331e79db09050620002626000546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b158015620002a457600080fd5b505af1158015620002b9573d6000803e3d6000fd5b5050505062000579565b6001600160a01b0382166200031e5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640160405180910390fd5b806003600082825462000332919062000551565b90915550506001600160a01b038216600090815260016020526040812080548392906200036190849062000551565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b505050565b6118ce806200230f83390190565b600082620003dc57634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200040c57607f821691505b6020821081036200042d57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620003ab57600081815260208120601f850160051c810160208610156200045c5750805b601f850160051c820191505b818110156200047d5782815560010162000468565b505050505050565b81516001600160401b03811115620004a157620004a1620003e1565b620004b981620004b28454620003f7565b8462000433565b602080601f831160018114620004f15760008415620004d85750858301515b600019600386901b1c1916600185901b1785556200047d565b600085815260208120601f198616915b82811015620005225788860151825594840194600190910190840162000501565b5085821015620005415787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b808201808211156200057357634e487b7160e01b600052601160045260246000fd5b92915050565b608051611d34620005db60003960008181610acb01528181610bf601528181610c8701528181610d9101528181610db801528181610ee00152818161124d01528181611411015281816117730152818161182c01526118680152611d346000f3fe6080604052600436106101c65760003560e01c806362e9ddd4116100f757806395d89b4111610095578063c9567bf911610064578063c9567bf914610537578063dd62ed3e1461054c578063f8b45b0514610592578063f8f2bfce146105a857600080fd5b806395d89b41146104c2578063a1972fc4146104d7578063a457c2d7146104f7578063a9059cbb1461051757600080fd5b806375f0a874116100d157806375f0a8741461042a5780638bcdcbf31461044f5780638da5cb5b146104845780638ea5220f146104a257600080fd5b806362e9ddd4146103be5780636abfe846146103d457806370a08231146103f457600080fd5b80632d03f90011610164578063395093511161013e57806339509351146103495780633f129a981461036957806349bd5a5e146103895780634e71d92d146103a957600080fd5b80632d03f900146102d5578063313ce5671461030d57806335d974051461032957600080fd5b8063098fec39116101a0578063098fec391461025157806318160ddd1461027e57806323b872dd146102935780632740c197146102b357600080fd5b806306fdde03146101d257806308aa2695146101fd578063095ea7b31461022157600080fd5b366101cd57005b600080fd5b3480156101de57600080fd5b506101e76105c8565b6040516101f491906119de565b60405180910390f35b34801561020957600080fd5b5061021360125481565b6040519081526020016101f4565b34801561022d57600080fd5b5061024161023c366004611a41565b61065a565b60405190151581526020016101f4565b34801561025d57600080fd5b5061021361026c366004611a6d565b60116020526000908152604090205481565b34801561028a57600080fd5b50600354610213565b34801561029f57600080fd5b506102416102ae366004611a91565b610671565b3480156102bf57600080fd5b506102d36102ce366004611ad2565b610720565b005b3480156102e157600080fd5b50600f546102f5906001600160a01b031681565b6040516001600160a01b0390911681526020016101f4565b34801561031957600080fd5b50604051601281526020016101f4565b34801561033557600080fd5b506008546102f5906001600160a01b031681565b34801561035557600080fd5b50610241610364366004611a41565b61075c565b34801561037557600080fd5b506102d3610384366004611a6d565b610798565b34801561039557600080fd5b506007546102f5906001600160a01b031681565b3480156103b557600080fd5b506102d36107d1565b3480156103ca57600080fd5b5061021360105481565b3480156103e057600080fd5b506102d36103ef366004611af4565b610830565b34801561040057600080fd5b5061021361040f366004611a6d565b6001600160a01b031660009081526001602052604090205490565b34801561043657600080fd5b50600d546102f59061010090046001600160a01b031681565b34801561045b57600080fd5b5061046f61046a366004611a6d565b610867565b604080519283526020830191909152016101f4565b34801561049057600080fd5b506000546001600160a01b03166102f5565b3480156104ae57600080fd5b50600e546102f5906001600160a01b031681565b3480156104ce57600080fd5b506101e76108e4565b3480156104e357600080fd5b506102d36104f2366004611a6d565b6108f3565b34801561050357600080fd5b50610241610512366004611a41565b610b35565b34801561052357600080fd5b50610241610532366004611a41565b610bce565b34801561054357600080fd5b506102d3610bdb565b34801561055857600080fd5b50610213610567366004611b0d565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b34801561059e57600080fd5b5061021360065481565b3480156105b457600080fd5b506102d36105c3366004611af4565b610fb1565b6060600480546105d790611b46565b80601f016020809104026020016040519081016040528092919081815260200182805461060390611b46565b80156106505780601f1061062557610100808354040283529160200191610650565b820191906000526020600020905b81548152906001019060200180831161063357829003601f168201915b5050505050905090565b6000610667338484611038565b5060015b92915050565b600061067e84848461115c565b6001600160a01b0384166000908152600260209081526040808320338452909152902054828110156107085760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084015b60405180910390fd5b6107158533858403611038565b506001949350505050565b6000546001600160a01b0316331461073757600080fd5b600582111580156107485750818111155b61075157600080fd5b600b91909155600c55565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610667918590610793908690611b96565b611038565b6000546001600160a01b031633146107af57600080fd5b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b600854604051630f41a04d60e11b81523360048201526001600160a01b0390911690631e83409a90602401600060405180830381600087803b15801561081657600080fd5b505af115801561082a573d6000803e3d6000fd5b50505050565b6000546001600160a01b0316331461084757600080fd5b60326009546108569190611ba9565b81111561086257600080fd5b601255565b60085460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839291169063fbcbc0f190602401606060405180830381865afa1580156108b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108d99190611bcb565b909590945092505050565b6060600580546105d790611b46565b6000546001600160a01b0316331461090a57600080fd5b600880546001600160a01b0319166001600160a01b03831690811790915560405163031e79db60e41b8152600481018290526331e79db090602401600060405180830381600087803b15801561095f57600080fd5b505af1158015610973573d6000803e3d6000fd5b505060085460405163031e79db60e41b81523060048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b1580156109bc57600080fd5b505af11580156109d0573d6000803e3d6000fd5b50506008546001600160a01b031691506331e79db090506109f96000546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b158015610a3a57600080fd5b505af1158015610a4e573d6000803e3d6000fd5b505060085460075460405163031e79db60e41b81526001600160a01b039182166004820152911692506331e79db09150602401600060405180830381600087803b158015610a9b57600080fd5b505af1158015610aaf573d6000803e3d6000fd5b505060085460405163031e79db60e41b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116600483015290911692506331e79db09150602401600060405180830381600087803b158015610b1a57600080fd5b505af1158015610b2e573d6000803e3d6000fd5b5050505050565b3360009081526002602090815260408083206001600160a01b038616845290915281205482811015610bb75760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016106ff565b610bc43385858403611038565b5060019392505050565b600061066733848461115c565b6000546001600160a01b03163314610bf257600080fd5b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c52573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c769190611c02565b6001600160a01b031663c9c65396307f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ce3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d079190611c02565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015610d54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d789190611c02565b30600081815260016020526040902054919250610db6917f000000000000000000000000000000000000000000000000000000000000000090611038565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f305d7194730610e06306001600160a01b031660009081526001602052604090205490565b600080610e1b6000546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af1158015610e83573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610ea89190611c1f565b5050600780546001600160a01b0319166001600160a01b03848116919091179091554360105560085460405163031e79db60e41b81527f000000000000000000000000000000000000000000000000000000000000000083166004820152911691506331e79db090602401600060405180830381600087803b158015610f2d57600080fd5b505af1158015610f41573d6000803e3d6000fd5b505060085460405163031e79db60e41b81526001600160a01b03858116600483015290911692506331e79db09150602401600060405180830381600087803b158015610f8c57600080fd5b505af1158015610fa0573d6000803e3d6000fd5b50505050610fae6001610fb1565b50565b6000546001600160a01b03163314610fc857600080fd5b60018110158015610fda575060648111155b6110185760405162461bcd60e51b815260206004820152600f60248201526e1a5b9d985b1a59081c195c98d95b9d608a1b60448201526064016106ff565b6064816009546110289190611c4d565b6110329190611ba9565b60065550565b6001600160a01b03831661109a5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016106ff565b6001600160a01b0382166110fb5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016106ff565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6007546001600160a01b0316611204576001600160a01b03831630148061118a57506001600160a01b038316155b806111a257506000546001600160a01b038481169116145b806111ba57506000546001600160a01b038381169116145b6111f45760405162461bcd60e51b815260206004820152600b60248201526a139bdd081cdd185c9d195960aa1b60448201526064016106ff565b6111ff83838361154e565b505050565b6007546001600160a01b03848116911614801561122a57506001600160a01b0382163014155b801561124457506000546001600160a01b03838116911614155b801561128257507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614155b156112ef57600654816112aa846001600160a01b031660009081526001602052604090205490565b6112b49190611b96565b11156112ef5760405162461bcd60e51b815260206004820152600a6024820152691b585e081dd85b1b195d60b21b60448201526064016106ff565b3060009081526001602052604090205460125481111561130e57506012545b6000601254118015611321575060125481145b80156113305750600d5460ff16155b801561134a57506007546001600160a01b03858116911614155b1561138157600d805460ff191660011790556113658161171c565b47801561137557611375816118dc565b50600d805460ff191690555b600060105460046113929190611b96565b43111580156113ae57506007546001600160a01b038681169116145b156113c857833b156113bf57600080fd5b50600a546113d5565b600b54156113d55750600b545b6000811180156113ee57506001600160a01b0385163014155b801561140857506000546001600160a01b03868116911614155b801561144657507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b031614155b1561147e57600060646114598386611c4d565b6114639190611ba9565b905061146f8185611c64565b935061147c86308361154e565b505b61148985858561154e565b60085460405163205c202d60e11b81526001600160a01b038781166004830152909116906340b8405a90602401600060405180830381600087803b1580156114d057600080fd5b505af11580156114e4573d6000803e3d6000fd5b505060085460405163205c202d60e11b81526001600160a01b03888116600483015290911692506340b8405a9150602401600060405180830381600087803b15801561152f57600080fd5b505af1158015611543573d6000803e3d6000fd5b505050505050505050565b6001600160a01b0383166115b25760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016106ff565b6001600160a01b0382166116145760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016106ff565b6001600160a01b0383166000908152600160205260409020548181101561168c5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016106ff565b6001600160a01b038085166000908152600160205260408082208585039055918516815290812080548492906116c3908490611b96565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161170f91815260200190565b60405180910390a361082a565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061175157611751611c77565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117f39190611c02565b8160018151811061180657611806611c77565b60200260200101906001600160a01b031690816001600160a01b031681525050611851307f000000000000000000000000000000000000000000000000000000000000000084611038565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063791ac947906118a6908590600090869030904290600401611c8d565b600060405180830381600087803b1580156118c057600080fd5b505af11580156118d4573d6000803e3d6000fd5b505050505050565b600080600b54116118ee57600061190a565b600b54600c5461190090612710611c4d565b61190a9190611ba9565b9050600061271061191b8385611c4d565b6119259190611ba9565b9050600060026119358386611c64565b61193f9190611ba9565b600d54909150819061195f9061010090046001600160a01b031682611987565b600e54611975906001600160a01b031682611987565b600f54610b2e906001600160a01b0316845b80156119da576000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146118d4576040519150601f19603f3d011682016040523d82523d6000602084013e6118d4565b5050565b600060208083528351808285015260005b81811015611a0b578581018301518582016040015282016119ef565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610fae57600080fd5b60008060408385031215611a5457600080fd5b8235611a5f81611a2c565b946020939093013593505050565b600060208284031215611a7f57600080fd5b8135611a8a81611a2c565b9392505050565b600080600060608486031215611aa657600080fd5b8335611ab181611a2c565b92506020840135611ac181611a2c565b929592945050506040919091013590565b60008060408385031215611ae557600080fd5b50508035926020909101359150565b600060208284031215611b0657600080fd5b5035919050565b60008060408385031215611b2057600080fd5b8235611b2b81611a2c565b91506020830135611b3b81611a2c565b809150509250929050565b600181811c90821680611b5a57607f821691505b602082108103611b7a57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561066b5761066b611b80565b600082611bc657634e487b7160e01b600052601260045260246000fd5b500490565b600080600060608486031215611be057600080fd5b8351611beb81611a2c565b602085015160409095015190969495509392505050565b600060208284031215611c1457600080fd5b8151611a8a81611a2c565b600080600060608486031215611c3457600080fd5b8351925060208401519150604084015190509250925092565b808202811582820484141761066b5761066b611b80565b8181038181111561066b5761066b611b80565b634e487b7160e01b600052603260045260246000fd5b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015611cdd5784516001600160a01b031683529383019391830191600101611cb8565b50506001600160a01b0396909616606085015250505060800152939250505056fea26469706673582212200b2db8382b626c777aff05a8071edecd0b2198cbb788db44aeaaf3543c8fba8e64736f6c6343000813003360806040523480156200001157600080fd5b506040805180820182526012808252714d49584552424f545f4469766964656e647360701b602080840182905284518086019095529184529083015290818160036200005e83826200014b565b5060046200006d82826200014b565b5050600980546001600160a01b031990811633908117909255600c8054821632179055600a805490911690911790555062000217915050565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620000d157607f821691505b602082108103620000f257634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200014657600081815260208120601f850160051c81016020861015620001215750805b601f850160051c820191505b8181101562000142578281556001016200012d565b5050505b505050565b81516001600160401b03811115620001675762000167620000a6565b6200017f81620001788454620000bc565b84620000f8565b602080601f831160018114620001b757600084156200019e5750858301515b600019600386901b1c1916600185901b17855562000142565b600085815260208120601f198616915b82811015620001e857888601518255948401946001909101908401620001c7565b5085821015620002075787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6116a780620002276000396000f3fe6080604052600436106101ba5760003560e01c8063627749e6116100ec578063a457c2d71161008a578063aafd847a11610064578063aafd847a146104ba578063c9e7cc13146104f0578063dd62ed3e14610507578063fbcbc0f11461054d57600080fd5b8063a457c2d71461045a578063a8b9d2401461047a578063a9059cbb1461049a57600080fd5b806385a6b3ae116100c657806385a6b3ae146103e75780638da5cb5b146103fd57806391b89fba1461042557806395d89b411461044557600080fd5b8063627749e6146103865780636a4740021461039c57806370a08231146103b157600080fd5b806327ce0147116101595780633950935111610133578063395093511461030157806340b8405a1461032157806343d726d6146103415780634e7b827f1461035657600080fd5b806327ce0147146102a5578063313ce567146102c557806331e79db0146102e157600080fd5b8063095ea7b311610195578063095ea7b31461021657806318160ddd146102465780631e83409a1461026557806323b872dd1461028557600080fd5b8062788b56146101ce57806303c83302146101e357806306fdde03146101eb57600080fd5b366101c9576101c7610592565b005b600080fd5b3480156101da57600080fd5b506101c7610628565b6101c7610592565b3480156101f757600080fd5b506102006106ed565b60405161020d919061143b565b60405180910390f35b34801561022257600080fd5b5061023661023136600461149e565b61077f565b604051901515815260200161020d565b34801561025257600080fd5b506002545b60405190815260200161020d565b34801561027157600080fd5b506101c76102803660046114ca565b610796565b34801561029157600080fd5b506102366102a03660046114e7565b61080d565b3480156102b157600080fd5b506102576102c03660046114ca565b6108b7565b3480156102d157600080fd5b506040516012815260200161020d565b3480156102ed57600080fd5b506101c76102fc3660046114ca565b610913565b34801561030d57600080fd5b5061023661031c36600461149e565b61098f565b34801561032d57600080fd5b506101c761033c3660046114ca565b6109cb565b34801561034d57600080fd5b506101c7610a67565b34801561036257600080fd5b506102366103713660046114ca565b600b6020526000908152604090205460ff1681565b34801561039257600080fd5b50610257600d5481565b3480156103a857600080fd5b506101c7610ac6565b3480156103bd57600080fd5b506102576103cc3660046114ca565b6001600160a01b031660009081526020819052604090205490565b3480156103f357600080fd5b5061025760085481565b34801561040957600080fd5b506009546040516001600160a01b03909116815260200161020d565b34801561043157600080fd5b506102576104403660046114ca565b610b4c565b34801561045157600080fd5b50610200610b57565b34801561046657600080fd5b5061023661047536600461149e565b610b66565b34801561048657600080fd5b506102576104953660046114ca565b610bff565b3480156104a657600080fd5b506102366104b536600461149e565b610c2b565b3480156104c657600080fd5b506102576104d53660046114ca565b6001600160a01b031660009081526007602052604090205490565b3480156104fc57600080fd5b5061025762278d0081565b34801561051357600080fd5b50610257610522366004611528565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801561055957600080fd5b5061056d6105683660046114ca565b610c38565b604080516001600160a01b03909416845260208401929092529082015260600161020d565b600061059d60025490565b116105a757600080fd5b3415610626576105da6105b960025490565b6105c734600160801b610c58565b6105d19190611577565b60055490610ce1565b600555604080513381523460208201527fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d78454116511910160405180910390a16008546106229034610ce1565b6008555b565b6009546001600160a01b0316331461063f57600080fd5b62278d00600d546106509190611599565b4210156106955760405162461bcd60e51b815260206004820152600e60248201526d185b1c9958591e4818db1bdcd95960921b60448201526064015b60405180910390fd5b604051600090339047908381818185875af1925050503d80600081146106d7576040519150601f19603f3d011682016040523d82523d6000602084013e6106dc565b606091505b50509050806106ea57600080fd5b50565b6060600380546106fc906115ac565b80601f0160208091040260200160405190810160405280929190818152602001828054610728906115ac565b80156107755780601f1061074a57610100808354040283529160200191610775565b820191906000526020600020905b81548152906001019060200180831161075857829003601f168201915b5050505050905090565b600061078c338484610d40565b5060015b92915050565b6009546001600160a01b031633146107ad57600080fd5b600d5415806107cb575062278d00600d546107c89190611599565b42105b6108005760405162461bcd60e51b815260206004820152600660248201526518db1bdcd95960d21b604482015260640161068c565b61080981610e64565b5050565b600061081a848484610fa9565b6001600160a01b03841660009081526001602090815260408083203384529091529020548281101561089f5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b606482015260840161068c565b6108ac8533858403610d40565b506001949350505050565b6001600160a01b03811660009081526006602090815260408083205491839052822054600554600160801b9261090992610904926108fe916108f99190610c58565b610fe8565b90610ff8565b611036565b6107909190611577565b6009546001600160a01b0316331461092a57600080fd5b6001600160a01b0381166000908152600b60205260408120805460ff19166001179055610958908290611049565b6040516001600160a01b038216907fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b2590600090a250565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161078c9185906109c6908690611599565b610d40565b6001600160a01b0381166000908152600b602052604090205460ff16156109ef5750565b600a546040516370a0823160e01b81526001600160a01b0380841660048301526106ea9284929116906370a0823190602401602060405180830381865afa158015610a3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a6291906115e6565b611049565b6009546001600160a01b03163314610a7e57600080fd5b600d5415610ac05760405162461bcd60e51b815260206004820152600f60248201526e18d85b9b9bdd081d185ad9481e595d608a1b604482015260640161068c565b42600d55565b60405162461bcd60e51b815260206004820152604f60248201527f77697468647261774469766964656e642064697361626c65642e20557365207460448201527f68652027636c61696d272066756e6374696f6e206f6e20746865206d61696e2060648201526e3a37b5b2b71031b7b73a3930b1ba1760891b608482015260a40161068c565b600061079082610bff565b6060600480546106fc906115ac565b3360009081526001602090815260408083206001600160a01b038616845290915281205482811015610be85760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161068c565b610bf53385858403610d40565b5060019392505050565b6001600160a01b03811660009081526007602052604081205461079090610c25846108b7565b906110ad565b600061078c338484610fa9565b80600080610c4583610bff565b9150610c50836108b7565b929491935050565b600082600003610c6a57506000610790565b6000610c7683856115ff565b905082610c838583611577565b14610cda5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b606482015260840161068c565b9392505050565b600080610cee8385611599565b905083811015610cda5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640161068c565b6001600160a01b038316610da25760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161068c565b6001600160a01b038216610e035760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161068c565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600080610e7083610bff565b90508015610fa0576001600160a01b038316600090815260076020526040902054610e9b9082610ce1565b6001600160a01b0384166000818152600760209081526040918290209390935580519182529181018390527fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d910160405180910390a16000836001600160a01b031682610bb890604051600060405180830381858888f193505050503d8060008114610f43576040519150601f19603f3d011682016040523d82523d6000602084013e610f48565b606091505b5050905080610f99576001600160a01b038416600090815260076020526040902054610f7490836110ad565b6001600160a01b03909416600090815260076020526040812094909455509192915050565b5092915050565b50600092915050565b60405162461bcd60e51b8152602060048201526014602482015273139bc81d1c985b9cd9995c9cc8185b1b1bddd95960621b604482015260640161068c565b6000818181121561079057600080fd5b6000806110058385611616565b9050600083121580156110185750838112155b8061102d575060008312801561102d57508381125b610cda57600080fd5b60008082121561104557600080fd5b5090565b6001600160a01b0382166000908152602081905260409020548082111561108857600061107683836110ad565b905061108284826110ef565b50505050565b808210156110a857600061109c82846110ad565b90506110828482611153565b505050565b6000610cda83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611197565b6110f982826111d1565b6111336111146108f983600554610c5890919063ffffffff16565b6001600160a01b038416600090815260066020526040902054906112b0565b6001600160a01b0390921660009081526006602052604090209190915550565b61115d82826112ed565b6111336111786108f983600554610c5890919063ffffffff16565b6001600160a01b03841660009081526006602052604090205490610ff8565b600081848411156111bb5760405162461bcd60e51b815260040161068c919061143b565b5060006111c8848661163e565b95945050505050565b6001600160a01b0382166112275760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161068c565b80600260008282546112399190611599565b90915550506001600160a01b03821660009081526020819052604081208054839290611266908490611599565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6000806112bd8385611651565b9050600083121580156112d05750838113155b8061102d575060008312801561102d5750838113610cda57600080fd5b6001600160a01b03821661134d5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b606482015260840161068c565b6001600160a01b038216600090815260208190526040902054818110156113c15760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b606482015260840161068c565b6001600160a01b03831660009081526020819052604081208383039055600280548492906113f090849061163e565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b600060208083528351808285015260005b818110156114685785810183015185820160400152820161144c565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b03811681146106ea57600080fd5b600080604083850312156114b157600080fd5b82356114bc81611489565b946020939093013593505050565b6000602082840312156114dc57600080fd5b8135610cda81611489565b6000806000606084860312156114fc57600080fd5b833561150781611489565b9250602084013561151781611489565b929592945050506040919091013590565b6000806040838503121561153b57600080fd5b823561154681611489565b9150602083013561155681611489565b809150509250929050565b634e487b7160e01b600052601160045260246000fd5b60008261159457634e487b7160e01b600052601260045260246000fd5b500490565b8082018082111561079057610790611561565b600181811c908216806115c057607f821691505b6020821081036115e057634e487b7160e01b600052602260045260246000fd5b50919050565b6000602082840312156115f857600080fd5b5051919050565b808202811582820484141761079057610790611561565b808201828112600083128015821682158216171561163657611636611561565b505092915050565b8181038181111561079057610790611561565b8181036000831280158383131683831282161715610f9957610f9961156156fea26469706673582212203018cac0ecd3e73b5b0766173b8d9c46b2de4f4c428a9923d8b2dc4bf7f7542964736f6c63430008130033

Deployed Bytecode

0x6080604052600436106101c65760003560e01c806362e9ddd4116100f757806395d89b4111610095578063c9567bf911610064578063c9567bf914610537578063dd62ed3e1461054c578063f8b45b0514610592578063f8f2bfce146105a857600080fd5b806395d89b41146104c2578063a1972fc4146104d7578063a457c2d7146104f7578063a9059cbb1461051757600080fd5b806375f0a874116100d157806375f0a8741461042a5780638bcdcbf31461044f5780638da5cb5b146104845780638ea5220f146104a257600080fd5b806362e9ddd4146103be5780636abfe846146103d457806370a08231146103f457600080fd5b80632d03f90011610164578063395093511161013e57806339509351146103495780633f129a981461036957806349bd5a5e146103895780634e71d92d146103a957600080fd5b80632d03f900146102d5578063313ce5671461030d57806335d974051461032957600080fd5b8063098fec39116101a0578063098fec391461025157806318160ddd1461027e57806323b872dd146102935780632740c197146102b357600080fd5b806306fdde03146101d257806308aa2695146101fd578063095ea7b31461022157600080fd5b366101cd57005b600080fd5b3480156101de57600080fd5b506101e76105c8565b6040516101f491906119de565b60405180910390f35b34801561020957600080fd5b5061021360125481565b6040519081526020016101f4565b34801561022d57600080fd5b5061024161023c366004611a41565b61065a565b60405190151581526020016101f4565b34801561025d57600080fd5b5061021361026c366004611a6d565b60116020526000908152604090205481565b34801561028a57600080fd5b50600354610213565b34801561029f57600080fd5b506102416102ae366004611a91565b610671565b3480156102bf57600080fd5b506102d36102ce366004611ad2565b610720565b005b3480156102e157600080fd5b50600f546102f5906001600160a01b031681565b6040516001600160a01b0390911681526020016101f4565b34801561031957600080fd5b50604051601281526020016101f4565b34801561033557600080fd5b506008546102f5906001600160a01b031681565b34801561035557600080fd5b50610241610364366004611a41565b61075c565b34801561037557600080fd5b506102d3610384366004611a6d565b610798565b34801561039557600080fd5b506007546102f5906001600160a01b031681565b3480156103b557600080fd5b506102d36107d1565b3480156103ca57600080fd5b5061021360105481565b3480156103e057600080fd5b506102d36103ef366004611af4565b610830565b34801561040057600080fd5b5061021361040f366004611a6d565b6001600160a01b031660009081526001602052604090205490565b34801561043657600080fd5b50600d546102f59061010090046001600160a01b031681565b34801561045b57600080fd5b5061046f61046a366004611a6d565b610867565b604080519283526020830191909152016101f4565b34801561049057600080fd5b506000546001600160a01b03166102f5565b3480156104ae57600080fd5b50600e546102f5906001600160a01b031681565b3480156104ce57600080fd5b506101e76108e4565b3480156104e357600080fd5b506102d36104f2366004611a6d565b6108f3565b34801561050357600080fd5b50610241610512366004611a41565b610b35565b34801561052357600080fd5b50610241610532366004611a41565b610bce565b34801561054357600080fd5b506102d3610bdb565b34801561055857600080fd5b50610213610567366004611b0d565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b34801561059e57600080fd5b5061021360065481565b3480156105b457600080fd5b506102d36105c3366004611af4565b610fb1565b6060600480546105d790611b46565b80601f016020809104026020016040519081016040528092919081815260200182805461060390611b46565b80156106505780601f1061062557610100808354040283529160200191610650565b820191906000526020600020905b81548152906001019060200180831161063357829003601f168201915b5050505050905090565b6000610667338484611038565b5060015b92915050565b600061067e84848461115c565b6001600160a01b0384166000908152600260209081526040808320338452909152902054828110156107085760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084015b60405180910390fd5b6107158533858403611038565b506001949350505050565b6000546001600160a01b0316331461073757600080fd5b600582111580156107485750818111155b61075157600080fd5b600b91909155600c55565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610667918590610793908690611b96565b611038565b6000546001600160a01b031633146107af57600080fd5b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b600854604051630f41a04d60e11b81523360048201526001600160a01b0390911690631e83409a90602401600060405180830381600087803b15801561081657600080fd5b505af115801561082a573d6000803e3d6000fd5b50505050565b6000546001600160a01b0316331461084757600080fd5b60326009546108569190611ba9565b81111561086257600080fd5b601255565b60085460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839291169063fbcbc0f190602401606060405180830381865afa1580156108b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108d99190611bcb565b909590945092505050565b6060600580546105d790611b46565b6000546001600160a01b0316331461090a57600080fd5b600880546001600160a01b0319166001600160a01b03831690811790915560405163031e79db60e41b8152600481018290526331e79db090602401600060405180830381600087803b15801561095f57600080fd5b505af1158015610973573d6000803e3d6000fd5b505060085460405163031e79db60e41b81523060048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b1580156109bc57600080fd5b505af11580156109d0573d6000803e3d6000fd5b50506008546001600160a01b031691506331e79db090506109f96000546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b158015610a3a57600080fd5b505af1158015610a4e573d6000803e3d6000fd5b505060085460075460405163031e79db60e41b81526001600160a01b039182166004820152911692506331e79db09150602401600060405180830381600087803b158015610a9b57600080fd5b505af1158015610aaf573d6000803e3d6000fd5b505060085460405163031e79db60e41b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d8116600483015290911692506331e79db09150602401600060405180830381600087803b158015610b1a57600080fd5b505af1158015610b2e573d6000803e3d6000fd5b5050505050565b3360009081526002602090815260408083206001600160a01b038616845290915281205482811015610bb75760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016106ff565b610bc43385858403611038565b5060019392505050565b600061066733848461115c565b6000546001600160a01b03163314610bf257600080fd5b60007f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c52573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c769190611c02565b6001600160a01b031663c9c65396307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ce3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d079190611c02565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015610d54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d789190611c02565b30600081815260016020526040902054919250610db6917f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d90611038565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663f305d7194730610e06306001600160a01b031660009081526001602052604090205490565b600080610e1b6000546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af1158015610e83573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610ea89190611c1f565b5050600780546001600160a01b0319166001600160a01b03848116919091179091554360105560085460405163031e79db60e41b81527f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d83166004820152911691506331e79db090602401600060405180830381600087803b158015610f2d57600080fd5b505af1158015610f41573d6000803e3d6000fd5b505060085460405163031e79db60e41b81526001600160a01b03858116600483015290911692506331e79db09150602401600060405180830381600087803b158015610f8c57600080fd5b505af1158015610fa0573d6000803e3d6000fd5b50505050610fae6001610fb1565b50565b6000546001600160a01b03163314610fc857600080fd5b60018110158015610fda575060648111155b6110185760405162461bcd60e51b815260206004820152600f60248201526e1a5b9d985b1a59081c195c98d95b9d608a1b60448201526064016106ff565b6064816009546110289190611c4d565b6110329190611ba9565b60065550565b6001600160a01b03831661109a5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016106ff565b6001600160a01b0382166110fb5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016106ff565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6007546001600160a01b0316611204576001600160a01b03831630148061118a57506001600160a01b038316155b806111a257506000546001600160a01b038481169116145b806111ba57506000546001600160a01b038381169116145b6111f45760405162461bcd60e51b815260206004820152600b60248201526a139bdd081cdd185c9d195960aa1b60448201526064016106ff565b6111ff83838361154e565b505050565b6007546001600160a01b03848116911614801561122a57506001600160a01b0382163014155b801561124457506000546001600160a01b03838116911614155b801561128257507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b0316826001600160a01b031614155b156112ef57600654816112aa846001600160a01b031660009081526001602052604090205490565b6112b49190611b96565b11156112ef5760405162461bcd60e51b815260206004820152600a6024820152691b585e081dd85b1b195d60b21b60448201526064016106ff565b3060009081526001602052604090205460125481111561130e57506012545b6000601254118015611321575060125481145b80156113305750600d5460ff16155b801561134a57506007546001600160a01b03858116911614155b1561138157600d805460ff191660011790556113658161171c565b47801561137557611375816118dc565b50600d805460ff191690555b600060105460046113929190611b96565b43111580156113ae57506007546001600160a01b038681169116145b156113c857833b156113bf57600080fd5b50600a546113d5565b600b54156113d55750600b545b6000811180156113ee57506001600160a01b0385163014155b801561140857506000546001600160a01b03868116911614155b801561144657507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b0316856001600160a01b031614155b1561147e57600060646114598386611c4d565b6114639190611ba9565b905061146f8185611c64565b935061147c86308361154e565b505b61148985858561154e565b60085460405163205c202d60e11b81526001600160a01b038781166004830152909116906340b8405a90602401600060405180830381600087803b1580156114d057600080fd5b505af11580156114e4573d6000803e3d6000fd5b505060085460405163205c202d60e11b81526001600160a01b03888116600483015290911692506340b8405a9150602401600060405180830381600087803b15801561152f57600080fd5b505af1158015611543573d6000803e3d6000fd5b505050505050505050565b6001600160a01b0383166115b25760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016106ff565b6001600160a01b0382166116145760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016106ff565b6001600160a01b0383166000908152600160205260409020548181101561168c5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016106ff565b6001600160a01b038085166000908152600160205260408082208585039055918516815290812080548492906116c3908490611b96565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161170f91815260200190565b60405180910390a361082a565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061175157611751611c77565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117f39190611c02565b8160018151811061180657611806611c77565b60200260200101906001600160a01b031690816001600160a01b031681525050611851307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84611038565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063791ac947906118a6908590600090869030904290600401611c8d565b600060405180830381600087803b1580156118c057600080fd5b505af11580156118d4573d6000803e3d6000fd5b505050505050565b600080600b54116118ee57600061190a565b600b54600c5461190090612710611c4d565b61190a9190611ba9565b9050600061271061191b8385611c4d565b6119259190611ba9565b9050600060026119358386611c64565b61193f9190611ba9565b600d54909150819061195f9061010090046001600160a01b031682611987565b600e54611975906001600160a01b031682611987565b600f54610b2e906001600160a01b0316845b80156119da576000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146118d4576040519150601f19603f3d011682016040523d82523d6000602084013e6118d4565b5050565b600060208083528351808285015260005b81811015611a0b578581018301518582016040015282016119ef565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610fae57600080fd5b60008060408385031215611a5457600080fd5b8235611a5f81611a2c565b946020939093013593505050565b600060208284031215611a7f57600080fd5b8135611a8a81611a2c565b9392505050565b600080600060608486031215611aa657600080fd5b8335611ab181611a2c565b92506020840135611ac181611a2c565b929592945050506040919091013590565b60008060408385031215611ae557600080fd5b50508035926020909101359150565b600060208284031215611b0657600080fd5b5035919050565b60008060408385031215611b2057600080fd5b8235611b2b81611a2c565b91506020830135611b3b81611a2c565b809150509250929050565b600181811c90821680611b5a57607f821691505b602082108103611b7a57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561066b5761066b611b80565b600082611bc657634e487b7160e01b600052601260045260246000fd5b500490565b600080600060608486031215611be057600080fd5b8351611beb81611a2c565b602085015160409095015190969495509392505050565b600060208284031215611c1457600080fd5b8151611a8a81611a2c565b600080600060608486031215611c3457600080fd5b8351925060208401519150604084015190509250925092565b808202811582820484141761066b5761066b611b80565b8181038181111561066b5761066b611b80565b634e487b7160e01b600052603260045260246000fd5b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015611cdd5784516001600160a01b031683529383019391830191600101611cb8565b50506001600160a01b0396909616606085015250505060800152939250505056fea26469706673582212200b2db8382b626c777aff05a8071edecd0b2198cbb788db44aeaaf3543c8fba8e64736f6c63430008130033

Deployed Bytecode Sourcemap

34695:6348:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13067:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35321:37;;;;;;;;;;;;;;;;;;;713:25:1;;;701:2;686:18;35321:37:0;567:177:1;15241:169:0;;;;;;;;;;-1:-1:-1;15241:169:0;;;;;:::i;:::-;;:::i;:::-;;;1370:14:1;;1363:22;1345:41;;1333:2;1318:18;15241:169:0;1205:187:1;35263:48:0;;;;;;;;;;-1:-1:-1;35263:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;14190:108;;;;;;;;;;-1:-1:-1;14278:12:0;;14190:108;;15893:494;;;;;;;;;;-1:-1:-1;15893:494:0;;;;;:::i;:::-;;:::i;36646:198::-;;;;;;;;;;-1:-1:-1;36646:198:0;;;;;:::i;:::-;;:::i;:::-;;35188:24;;;;;;;;;;-1:-1:-1;35188:24:0;;;;-1:-1:-1;;;;;35188:24:0;;;;;;-1:-1:-1;;;;;2527:32:1;;;2509:51;;2497:2;2482:18;35188:24:0;2363:203:1;14031:93:0;;;;;;;;;;-1:-1:-1;14031:93:0;;14114:2;2713:36:1;;2701:2;2686:18;14031:93:0;2571:184:1;34914:31:0;;;;;;;;;;-1:-1:-1;34914:31:0;;;;-1:-1:-1;;;;;34914:31:0;;;16797:215;;;;;;;;;;-1:-1:-1;16797:215:0;;;;;:::i;:::-;;:::i;36109:105::-;;;;;;;;;;-1:-1:-1;36109:105:0;;;;;:::i;:::-;;:::i;34769:28::-;;;;;;;;;;-1:-1:-1;34769:28:0;;;;-1:-1:-1;;;;;34769:28:0;;;37400:66;;;;;;;;;;;;;:::i;35222:31::-;;;;;;;;;;;;;;;;37051:131;;;;;;;;;;-1:-1:-1;37051:131:0;;;;;:::i;:::-;;:::i;14362:127::-;;;;;;;;;;-1:-1:-1;14362:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;14463:18:0;14436:7;14463:18;;;:9;:18;;;;;;;14362:127;35120:30;;;;;;;;;;-1:-1:-1;35120:30:0;;;;;;;-1:-1:-1;;;;;35120:30:0;;;37191:200;;;;;;;;;;-1:-1:-1;37191:200:0;;;;;:::i;:::-;;:::i;:::-;;;;3358:25:1;;;3414:2;3399:18;;3392:34;;;;3331:18;37191:200:0;3184:248:1;23608:87:0;;;;;;;;;;-1:-1:-1;23654:7:0;23681:6;-1:-1:-1;;;;;23681:6:0;23608:87;;35157:24;;;;;;;;;;-1:-1:-1;35157:24:0;;;;-1:-1:-1;;;;;35157:24:0;;;13287:104;;;;;;;;;;;;;:::i;36223:414::-;;;;;;;;;;-1:-1:-1;36223:414:0;;;;;:::i;:::-;;:::i;17516:::-;;;;;;;;;;-1:-1:-1;17516:414:0;;;;;:::i;:::-;;:::i;14703:175::-;;;;;;;;;;-1:-1:-1;14703:175:0;;;;;:::i;:::-;;:::i;37475:706::-;;;;;;;;;;;;;:::i;14942:151::-;;;;;;;;;;-1:-1:-1;14942:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;15058:18:0;;;15031:7;15058:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;14942:151;34738:24;;;;;;;;;;;;;;;;36853:189;;;;;;;;;;-1:-1:-1;36853:189:0;;;;;:::i;:::-;;:::i;13067:100::-;13121:13;13154:5;13147:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13067:100;:::o;15241:169::-;15324:4;15341:39;12078:10;15364:7;15373:6;15341:8;:39::i;:::-;-1:-1:-1;15398:4:0;15241:169;;;;;:::o;15893:494::-;16033:4;16050:36;16060:6;16068:9;16079:6;16050:9;:36::i;:::-;-1:-1:-1;;;;;16127:19:0;;16100:24;16127:19;;;:11;:19;;;;;;;;12078:10;16127:33;;;;;;;;16179:26;;;;16171:79;;;;-1:-1:-1;;;16171:79:0;;4417:2:1;16171:79:0;;;4399:21:1;4456:2;4436:18;;;4429:30;4495:34;4475:18;;;4468:62;-1:-1:-1;;;4546:18:1;;;4539:38;4594:19;;16171:79:0;;;;;;;;;16286:57;16295:6;12078:10;16336:6;16317:16;:25;16286:8;:57::i;:::-;-1:-1:-1;16375:4:0;;15893:494;-1:-1:-1;;;;15893:494:0:o;36646:198::-;23485:6;;-1:-1:-1;;;;;23485:6:0;23495:10;23485:20;23477:29;;;;;;36752:1:::1;36739:9;:14;;:38;;;;;36768:9;36757:7;:20;;36739:38;36731:47;;;::::0;::::1;;36789:8;:20:::0;;;;36820:6:::1;:16:::0;36646:198::o;16797:215::-;12078:10;16885:4;16934:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;16934:34:0;;;;;;;;;;16885:4;;16902:80;;16925:7;;16934:47;;16971:10;;16934:47;:::i;:::-;16902:8;:80::i;36109:105::-;23485:6;;-1:-1:-1;;;;;23485:6:0;23495:10;23485:20;23477:29;;;;;;36184:9:::1;:22:::0;;-1:-1:-1;;;;;;36184:22:0::1;-1:-1:-1::0;;;;;36184:22:0;;;::::1;::::0;;;::::1;::::0;;36109:105::o;37400:66::-;37431:9;;:27;;-1:-1:-1;;;37431:27:0;;37447:10;37431:27;;;2509:51:1;-1:-1:-1;;;;;37431:9:0;;;;:15;;2482:18:1;;37431:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37400:66::o;37051:131::-;23485:6;;-1:-1:-1;;;;;23485:6:0;23495:10;23485:20;23477:29;;;;;;37146:2:::1;37137:6;;:11;;;;:::i;:::-;37128:5;:20;;37120:29;;;::::0;::::1;;37160:6;:14:::0;37051:131::o;37191:200::-;37354:9;;:29;;-1:-1:-1;;;37354:29:0;;-1:-1:-1;;;;;2527:32:1;;;37354:29:0;;;2509:51:1;37246:29:0;;;;37354:9;;;:20;;2482:18:1;;37354:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37312:71;;;;-1:-1:-1;37191:200:0;-1:-1:-1;;;37191:200:0:o;13287:104::-;13343:13;13376:7;13369:14;;;;;:::i;36223:414::-;23485:6;;-1:-1:-1;;;;;23485:6:0;23495:10;23485:20;23477:29;;;;;;36298:9:::1;:47:::0;;-1:-1:-1;;;;;;36298:47:0::1;-1:-1:-1::0;;;;;36298:47:0;::::1;::::0;;::::1;::::0;;;36359:50:::1;::::0;-1:-1:-1;;;36359:50:0;;::::1;::::0;::::1;2509:51:1::0;;;36359:30:0::1;::::0;2482:18:1;;36359:50:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;36420:9:0::1;::::0;:45:::1;::::0;-1:-1:-1;;;36420:45:0;;36459:4:::1;36420:45;::::0;::::1;2509:51:1::0;-1:-1:-1;;;;;36420:9:0;;::::1;::::0;-1:-1:-1;36420:30:0::1;::::0;-1:-1:-1;2482:18:1;;36420:45:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;36476:9:0::1;::::0;-1:-1:-1;;;;;36476:9:0::1;::::0;-1:-1:-1;36476:30:0::1;::::0;-1:-1:-1;36507:7:0::1;23654::::0;23681:6;-1:-1:-1;;;;;23681:6:0;;23608:87;36507:7:::1;36476:39;::::0;-1:-1:-1;;;;;;36476:39:0::1;::::0;;;;;;-1:-1:-1;;;;;2527:32:1;;;36476:39:0::1;::::0;::::1;2509:51:1::0;2482:18;;36476:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;36526:9:0::1;::::0;36557:13:::1;::::0;36526:45:::1;::::0;-1:-1:-1;;;36526:45:0;;-1:-1:-1;;;;;36557:13:0;;::::1;36526:45;::::0;::::1;2509:51:1::0;36526:9:0;::::1;::::0;-1:-1:-1;36526:30:0::1;::::0;-1:-1:-1;2482:18:1;;36526:45:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;36582:9:0::1;::::0;:47:::1;::::0;-1:-1:-1;;;36582:47:0;;-1:-1:-1;;;;;36621:6:0::1;2527:32:1::0;;36582:47:0::1;::::0;::::1;2509:51:1::0;36582:9:0;;::::1;::::0;-1:-1:-1;36582:30:0::1;::::0;-1:-1:-1;2482:18:1;;36582:47:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;36223:414:::0;:::o;17516:::-;12078:10;17609:4;17653:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;17653:34:0;;;;;;;;;;17706:35;;;;17698:85;;;;-1:-1:-1;;;17698:85:0;;5688:2:1;17698:85:0;;;5670:21:1;5727:2;5707:18;;;5700:30;5766:34;5746:18;;;5739:62;-1:-1:-1;;;5817:18:1;;;5810:35;5862:19;;17698:85:0;5486:401:1;17698:85:0;17819:67;12078:10;17842:7;17870:15;17851:16;:34;17819:8;:67::i;:::-;-1:-1:-1;17918:4:0;;17516:414;-1:-1:-1;;;17516:414:0:o;14703:175::-;14789:4;14806:42;12078:10;14830:9;14841:6;14806:9;:42::i;37475:706::-;23485:6;;-1:-1:-1;;;;;23485:6:0;23495:10;23485:20;23477:29;;;;;;37531:12:::1;37564:6;-1:-1:-1::0;;;;;37564:14:0::1;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;37546:46:0::1;;37601:4;37608:6;-1:-1:-1::0;;;;;37608:11:0::1;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37546:76;::::0;-1:-1:-1;;;;;;37546:76:0::1;::::0;;;;;;-1:-1:-1;;;;;6378:15:1;;;37546:76:0::1;::::0;::::1;6360:34:1::0;6430:15;;6410:18;;;6403:43;6295:18;;37546:76:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37650:4;14436:7:::0;14463:18;;;:9;:18;;;;;;37531:91;;-1:-1:-1;37633:66:0::1;::::0;37665:6:::1;::::0;16902:8;:80::i;37633:66::-:1;37710:6;-1:-1:-1::0;;;;;37710:22:0::1;;37754:21;37810:4;37830:24;37848:4;-1:-1:-1::0;;;;;14463:18:0;14436:7;14463:18;;;:9;:18;;;;;;;14362:127;37830:24:::1;37869:1;37885::::0;37901:7:::1;23654::::0;23681:6;-1:-1:-1;;;;;23681:6:0;;23608:87;37901:7:::1;37710:239;::::0;::::1;::::0;;;-1:-1:-1;;;;;;37710:239:0;;;-1:-1:-1;;;;;6816:15:1;;;37710:239:0::1;::::0;::::1;6798:34:1::0;6848:18;;;6841:34;;;;6891:18;;;6884:34;;;;6934:18;;;6927:34;6998:15;;;6977:19;;;6970:44;37923:15:0::1;7030:19:1::0;;;7023:35;6732:19;;37710:239:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;37963:13:0::1;:20:::0;;-1:-1:-1;;;;;;37963:20:0::1;-1:-1:-1::0;;;;;37963:20:0;;::::1;::::0;;;::::1;::::0;;;38013:12:::1;37994:16;:31:::0;38036:9:::1;::::0;:47:::1;::::0;-1:-1:-1;;;38036:47:0;;38075:6:::1;2527:32:1::0;;38036:47:0::1;::::0;::::1;2509:51:1::0;38036:9:0;::::1;::::0;-1:-1:-1;38036:30:0::1;::::0;2482:18:1;;38036:47:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;38094:9:0::1;::::0;:36:::1;::::0;-1:-1:-1;;;38094:36:0;;-1:-1:-1;;;;;2527:32:1;;;38094:36:0::1;::::0;::::1;2509:51:1::0;38094:9:0;;::::1;::::0;-1:-1:-1;38094:30:0::1;::::0;-1:-1:-1;2482:18:1;;38094:36:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;38144:26;38168:1;38144:23;:26::i;:::-;37517:664;37475:706::o:0;36853:189::-;23485:6;;-1:-1:-1;;;;;23485:6:0;23495:10;23485:20;23477:29;;;;;;36950:1:::1;36939:7;:12;;:30;;;;;36966:3;36955:7;:14;;36939:30;36931:58;;;::::0;-1:-1:-1;;;36931:58:0;;7582:2:1;36931:58:0::1;::::0;::::1;7564:21:1::0;7621:2;7601:18;;;7594:30;-1:-1:-1;;;7640:18:1;;;7633:45;7695:18;;36931:58:0::1;7380:339:1::0;36931:58:0::1;37031:3;37021:7;37012:6;;:16;;;;:::i;:::-;:22;;;;:::i;:::-;37000:9;:34:::0;-1:-1:-1;36853:189:0:o;21216:381::-;-1:-1:-1;;;;;21352:19:0;;21344:68;;;;-1:-1:-1;;;21344:68:0;;8099:2:1;21344:68:0;;;8081:21:1;8138:2;8118:18;;;8111:30;8177:34;8157:18;;;8150:62;-1:-1:-1;;;8228:18:1;;;8221:34;8272:19;;21344:68:0;7897:400:1;21344:68:0;-1:-1:-1;;;;;21431:21:0;;21423:68;;;;-1:-1:-1;;;21423:68:0;;8504:2:1;21423:68:0;;;8486:21:1;8543:2;8523:18;;;8516:30;8582:34;8562:18;;;8555:62;-1:-1:-1;;;8633:18:1;;;8626:32;8675:19;;21423:68:0;8302:398:1;21423:68:0;-1:-1:-1;;;;;21505:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;21557:32;;713:25:1;;;21557:32:0;;686:18:1;21557:32:0;;;;;;;21216:381;;;:::o;38190:1795::-;38283:13;;-1:-1:-1;;;;;38283:13:0;38280:231;;-1:-1:-1;;;;;38335:21:0;;38351:4;38335:21;;:43;;-1:-1:-1;;;;;;38360:18:0;;;38335:43;:62;;;-1:-1:-1;23654:7:0;23681:6;-1:-1:-1;;;;;38382:15:0;;;23681:6;;38382:15;38335:62;:79;;;-1:-1:-1;23654:7:0;23681:6;-1:-1:-1;;;;;38401:13:0;;;23681:6;;38401:13;38335:79;38327:103;;;;-1:-1:-1;;;38327:103:0;;8907:2:1;38327:103:0;;;8889:21:1;8946:2;8926:18;;;8919:30;-1:-1:-1;;;8965:18:1;;;8958:41;9016:18;;38327:103:0;8705:335:1;38327:103:0;38445:33;38461:4;38467:2;38471:6;38445:15;:33::i;:::-;38190:1795;;;:::o;38280:231::-;38535:13;;-1:-1:-1;;;;;38527:21:0;;;38535:13;;38527:21;:44;;;;-1:-1:-1;;;;;;38552:19:0;;38566:4;38552:19;;38527:44;:61;;;;-1:-1:-1;23654:7:0;23681:6;-1:-1:-1;;;;;38575:13:0;;;23681:6;;38575:13;;38527:61;:86;;;;;38606:6;-1:-1:-1;;;;;38592:21:0;:2;-1:-1:-1;;;;;38592:21:0;;;38527:86;38524:182;;;38670:9;;38660:6;38638:19;38654:2;-1:-1:-1;;;;;14463:18:0;14436:7;14463:18;;;:9;:18;;;;;;;14362:127;38638:19;:28;;;;:::i;:::-;:41;;38630:64;;;;-1:-1:-1;;;38630:64:0;;9247:2:1;38630:64:0;;;9229:21:1;9286:2;9266:18;;;9259:30;-1:-1:-1;;;9305:18:1;;;9298:40;9355:18;;38630:64:0;9045:334:1;38630:64:0;38758:4;38719:18;14463;;;:9;:18;;;;;;38794:6;;38781:19;;38778:70;;;-1:-1:-1;38830:6:0;;38778:70;38887:1;38878:6;;:10;:47;;;;;38919:6;;38905:10;:20;38878:47;:71;;;;-1:-1:-1;38943:6:0;;;;38942:7;38878:71;:109;;;;-1:-1:-1;38974:13:0;;-1:-1:-1;;;;;38966:21:0;;;38974:13;;38966:21;;38878:109;38861:391;;;39007:6;:13;;-1:-1:-1;;39007:13:0;39016:4;39007:13;;;39038:28;39055:10;39038:16;:28::i;:::-;39102:21;39144:11;;39141:68;;39176:17;39185:7;39176:8;:17::i;:::-;-1:-1:-1;39226:6:0;:14;;-1:-1:-1;;39226:14:0;;;38861:391;39265:11;39309:16;;39328:1;39309:20;;;;:::i;:::-;39293:12;:36;;:61;;;;-1:-1:-1;39341:13:0;;-1:-1:-1;;;;;39333:21:0;;;39341:13;;39333:21;39293:61;39290:219;;;36036:20;;36084:8;39371:24;;;;;;-1:-1:-1;39416:8:0;;39290:219;;;39454:8;;:12;39451:58;;-1:-1:-1;39489:8:0;;39451:58;39545:1;39539:3;:7;:45;;;;-1:-1:-1;;;;;;39563:21:0;;39579:4;39563:21;;39539:45;:77;;;;-1:-1:-1;23654:7:0;23681:6;-1:-1:-1;;;;;39601:15:0;;;23681:6;;39601:15;;39539:77;:117;;;;;39649:6;-1:-1:-1;;;;;39633:23:0;:4;-1:-1:-1;;;;;39633:23:0;;;39539:117;39522:310;;;39683:17;39718:3;39703:12;39712:3;39703:6;:12;:::i;:::-;:18;;;;:::i;:::-;39683:38;-1:-1:-1;39736:19:0;39683:38;39736:19;;:::i;:::-;;;39773:47;39789:4;39803;39810:9;39773:15;:47::i;:::-;39668:164;39522:310;39845:33;39861:4;39867:2;39871:6;39845:15;:33::i;:::-;39892:9;;:38;;-1:-1:-1;;;39892:38:0;;-1:-1:-1;;;;;2527:32:1;;;39892:38:0;;;2509:51:1;39892:9:0;;;;:23;;2482:18:1;;39892:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;39941:9:0;;:36;;-1:-1:-1;;;39941:36:0;;-1:-1:-1;;;;;2527:32:1;;;39941:36:0;;;2509:51:1;39941:9:0;;;;-1:-1:-1;39941:23:0;;-1:-1:-1;2482:18:1;;39941:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38269:1716;;38190:1795;;;:::o;18421:737::-;-1:-1:-1;;;;;18561:20:0;;18553:70;;;;-1:-1:-1;;;18553:70:0;;9943:2:1;18553:70:0;;;9925:21:1;9982:2;9962:18;;;9955:30;10021:34;10001:18;;;9994:62;-1:-1:-1;;;10072:18:1;;;10065:35;10117:19;;18553:70:0;9741:401:1;18553:70:0;-1:-1:-1;;;;;18642:23:0;;18634:71;;;;-1:-1:-1;;;18634:71:0;;10349:2:1;18634:71:0;;;10331:21:1;10388:2;10368:18;;;10361:30;10427:34;10407:18;;;10400:62;-1:-1:-1;;;10478:18:1;;;10471:33;10521:19;;18634:71:0;10147:399:1;18634:71:0;-1:-1:-1;;;;;18804:17:0;;18780:21;18804:17;;;:9;:17;;;;;;18840:23;;;;18832:74;;;;-1:-1:-1;;;18832:74:0;;10753:2:1;18832:74:0;;;10735:21:1;10792:2;10772:18;;;10765:30;10831:34;10811:18;;;10804:62;-1:-1:-1;;;10882:18:1;;;10875:36;10928:19;;18832:74:0;10551:402:1;18832:74:0;-1:-1:-1;;;;;18942:17:0;;;;;;;:9;:17;;;;;;18962:22;;;18942:42;;19006:20;;;;;;;;:30;;18978:6;;18942:17;19006:30;;18978:6;;19006:30;:::i;:::-;;;;;;;;19072:9;-1:-1:-1;;;;;19055:35:0;19064:6;-1:-1:-1;;;;;19055:35:0;;19083:6;19055:35;;;;713:25:1;;701:2;686:18;;567:177;19055:35:0;;;;;;;;19104:46;38190:1795;39994:447;40084:16;;;40098:1;40084:16;;;;;;;;40060:21;;40084:16;;;;;;;;;;-1:-1:-1;40084:16:0;40060:40;;40129:4;40111;40116:1;40111:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;40111:23:0;;;-1:-1:-1;;;;;40111:23:0;;;;;40155:6;-1:-1:-1;;;;;40155:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40145:4;40150:1;40145:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;40145:23:0;;;-1:-1:-1;;;;;40145:23:0;;;;;40179:53;40196:4;40211:6;40220:11;40179:8;:53::i;:::-;40246:187;;-1:-1:-1;;;40246:187:0;;-1:-1:-1;;;;;40246:6:0;:57;;;;:187;;40318:11;;40344:1;;40360:4;;40387;;40407:15;;40246:187;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40049:392;39994:447;:::o;40641:399::-;40694:16;40724:1;40713:8;;:12;:44;;40756:1;40713:44;;;40745:8;;40728:6;;:14;;40737:5;40728:14;:::i;:::-;:25;;;;:::i;:::-;40694:63;-1:-1:-1;40771:13:0;40807:5;40787:17;40694:63;40787:6;:17;:::i;:::-;:25;;;;:::i;:::-;40771:41;-1:-1:-1;40823:19:0;40864:1;40846:14;40771:41;40846:6;:14;:::i;:::-;40845:20;;;;:::i;:::-;40927:15;;40823:42;;-1:-1:-1;40823:42:0;;40917:39;;40927:15;;;-1:-1:-1;;;;;40927:15:0;40823:42;40917:9;:39::i;:::-;40977:9;;40967:27;;-1:-1:-1;;;;;40977:9:0;40988:5;40967:9;:27::i;:::-;41015:9;;41005:27;;-1:-1:-1;;;;;41015:9:0;41026:5;40450:182;40520:9;;40517:108;;40547:12;40564:4;-1:-1:-1;;;;;40564:9:0;40581:5;40564:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40517:108;40450:182;;:::o;14:548:1:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;298:3;483:1;478:2;469:6;458:9;454:22;450:31;443:42;553:2;546;542:7;537:2;529:6;525:15;521:29;510:9;506:45;502:54;494:62;;;;14:548;;;;:::o;749:131::-;-1:-1:-1;;;;;824:31:1;;814:42;;804:70;;870:1;867;860:12;885:315;953:6;961;1014:2;1002:9;993:7;989:23;985:32;982:52;;;1030:1;1027;1020:12;982:52;1069:9;1056:23;1088:31;1113:5;1088:31;:::i;:::-;1138:5;1190:2;1175:18;;;;1162:32;;-1:-1:-1;;;885:315:1:o;1397:247::-;1456:6;1509:2;1497:9;1488:7;1484:23;1480:32;1477:52;;;1525:1;1522;1515:12;1477:52;1564:9;1551:23;1583:31;1608:5;1583:31;:::i;:::-;1633:5;1397:247;-1:-1:-1;;;1397:247:1:o;1649:456::-;1726:6;1734;1742;1795:2;1783:9;1774:7;1770:23;1766:32;1763:52;;;1811:1;1808;1801:12;1763:52;1850:9;1837:23;1869:31;1894:5;1869:31;:::i;:::-;1919:5;-1:-1:-1;1976:2:1;1961:18;;1948:32;1989:33;1948:32;1989:33;:::i;:::-;1649:456;;2041:7;;-1:-1:-1;;;2095:2:1;2080:18;;;;2067:32;;1649:456::o;2110:248::-;2178:6;2186;2239:2;2227:9;2218:7;2214:23;2210:32;2207:52;;;2255:1;2252;2245:12;2207:52;-1:-1:-1;;2278:23:1;;;2348:2;2333:18;;;2320:32;;-1:-1:-1;2110:248:1:o;2999:180::-;3058:6;3111:2;3099:9;3090:7;3086:23;3082:32;3079:52;;;3127:1;3124;3117:12;3079:52;-1:-1:-1;3150:23:1;;2999:180;-1:-1:-1;2999:180:1:o;3437:388::-;3505:6;3513;3566:2;3554:9;3545:7;3541:23;3537:32;3534:52;;;3582:1;3579;3572:12;3534:52;3621:9;3608:23;3640:31;3665:5;3640:31;:::i;:::-;3690:5;-1:-1:-1;3747:2:1;3732:18;;3719:32;3760:33;3719:32;3760:33;:::i;:::-;3812:7;3802:17;;;3437:388;;;;;:::o;3830:380::-;3909:1;3905:12;;;;3952;;;3973:61;;4027:4;4019:6;4015:17;4005:27;;3973:61;4080:2;4072:6;4069:14;4049:18;4046:38;4043:161;;4126:10;4121:3;4117:20;4114:1;4107:31;4161:4;4158:1;4151:15;4189:4;4186:1;4179:15;4043:161;;3830:380;;;:::o;4624:127::-;4685:10;4680:3;4676:20;4673:1;4666:31;4716:4;4713:1;4706:15;4740:4;4737:1;4730:15;4756:125;4821:9;;;4842:10;;;4839:36;;;4855:18;;:::i;4886:217::-;4926:1;4952;4942:132;;4996:10;4991:3;4987:20;4984:1;4977:31;5031:4;5028:1;5021:15;5059:4;5056:1;5049:15;4942:132;-1:-1:-1;5088:9:1;;4886:217::o;5108:373::-;5196:6;5204;5212;5265:2;5253:9;5244:7;5240:23;5236:32;5233:52;;;5281:1;5278;5271:12;5233:52;5313:9;5307:16;5332:31;5357:5;5332:31;:::i;:::-;5427:2;5412:18;;5406:25;5471:2;5456:18;;;5450:25;5382:5;;5406:25;;-1:-1:-1;5450:25:1;5108:373;-1:-1:-1;;;5108:373:1:o;5892:251::-;5962:6;6015:2;6003:9;5994:7;5990:23;5986:32;5983:52;;;6031:1;6028;6021:12;5983:52;6063:9;6057:16;6082:31;6107:5;6082:31;:::i;7069:306::-;7157:6;7165;7173;7226:2;7214:9;7205:7;7201:23;7197:32;7194:52;;;7242:1;7239;7232:12;7194:52;7271:9;7265:16;7255:26;;7321:2;7310:9;7306:18;7300:25;7290:35;;7365:2;7354:9;7350:18;7344:25;7334:35;;7069:306;;;;;:::o;7724:168::-;7797:9;;;7828;;7845:15;;;7839:22;;7825:37;7815:71;;7866:18;;:::i;9384:128::-;9451:9;;;9472:11;;;9469:37;;;9486:18;;:::i;11090:127::-;11151:10;11146:3;11142:20;11139:1;11132:31;11182:4;11179:1;11172:15;11206:4;11203:1;11196:15;11222:980;11484:4;11532:3;11521:9;11517:19;11563:6;11552:9;11545:25;11589:2;11627:6;11622:2;11611:9;11607:18;11600:34;11670:3;11665:2;11654:9;11650:18;11643:31;11694:6;11729;11723:13;11760:6;11752;11745:22;11798:3;11787:9;11783:19;11776:26;;11837:2;11829:6;11825:15;11811:29;;11858:1;11868:195;11882:6;11879:1;11876:13;11868:195;;;11947:13;;-1:-1:-1;;;;;11943:39:1;11931:52;;12038:15;;;;12003:12;;;;11979:1;11897:9;11868:195;;;-1:-1:-1;;;;;;;12119:32:1;;;;12114:2;12099:18;;12092:60;-1:-1:-1;;;12183:3:1;12168:19;12161:35;12080:3;11222:980;-1:-1:-1;;;11222:980:1:o

Swarm Source

ipfs://3018cac0ecd3e73b5b0766173b8d9c46b2de4f4c428a9923d8b2dc4bf7f75429
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.