ETH Price: $2,525.31 (+0.01%)

Token

SpaceApe ($APE)
 

Overview

Max Total Supply

411,353,624.402290542299137449 $APE

Holders

86

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
276,000.000000000006742148 $APE

Value
$0.00
0xda1a473f62bc23eb427d4974401bf931558314ef
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:
SpaceApe

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-10-14
*/

/**
 *Submitted for verification at EtherScan.io on 2069-04-20
 */

/*

   ___|                                \
 \___ \   __ \    _` |   __|   _ \    _ \    __ \    _ \
       |  |   |  (   |  (      __/   ___ \   |   |   __/
 _____/   .__/  \__,_| \___| \___| _/    _\  .__/  \___|
         _|                                 _|

💎💎💎💎💎💎💎💎💎💎💎💎💎💎💎
💎💎💎💎💎💎💎🚀💎💎💎💎💎💎💎
💎💎💎💎💎💎🚀🚀🚀💎💎💎💎💎💎
💎💎💎💎💎🚀🚀🚀🚀🚀💎💎💎💎💎
💎💎💎💎💎🚀🚀🐵🚀🚀💎💎💎💎💎
💎💎💎💎💎🚀🚀🚀🚀🚀💎💎💎💎💎
💎💎💎💎💎🚀🚀🚀🚀🚀💎💎💎💎💎
💎💎💎💎🚀🚀🚀🚀🚀🚀🚀💎💎💎💎
💎💎💎🚀🚀🚀🚀🚀🚀🚀🚀🚀💎💎💎
💎💎💎💎💎💎🚀🚀🚀💎💎💎💎💎💎
💎💎💎💎💎🍌🍌🍌🍌🍌💎💎💎💎💎
💎💎💎💎💎💎🍌🍌🍌💎💎💎💎💎💎
💎💎💎💎💎💎💎🍌💎💎💎💎💎💎💎
💎💎💎💎💎💎💎💎💎💎💎💎💎💎💎

Token Name: SpaceApe
Ticker: $APE
Total Supply: 420,690,420

Decimals: 18

Max Wallet: 2%
Max Sell: 1%

Taxes:
8% on buy -
  - 4% $WORM direct to holders
  - 3% opsMarketing
  - 0.5% direct liquidity injection
  - 0.5% instant burn from supply / existence

2% antidump -
  - 0.5% $WORM direct to holders
  - 0.5% opsMarketing
  - 0.5% direct liquidity injection
  - 0.5% instant burn from supply / existence

🍌 https://SpaceApe.army
🍌 https://linktr.ee/SpaceApeArmy
🍌 https://t.me/SpaceApeArmy
🍌 https://twitter.com/SpaceApeEth
🍌 https://medium.com/@SpaceApeArmy

🐵 Paying homage to https://SpaceWorm.army

*/

// SPDX-License-Identifier: MIT

// Dependency file: contracts\interface\IERC20.sol

pragma solidity 0.8.17;

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

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

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

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

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

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

    /**
     * @dev 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 Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        uint256 c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        if (b > a) return (false, 0);
        return (true, a - b);
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) return (true, 0);
        uint256 c = a * b;
        if (c / a != b) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        if (b == 0) return (false, 0);
        return (true, a / b);
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        if (b == 0) return (false, 0);
        return (true, a % b);
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }

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

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) return 0;
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: division by zero");
        return a / b;
    }

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

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        return a - b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryDiv}.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a % b;
    }
}

abstract contract Context {
    function _msgSender() internal view virtual returns (address payable) {
        return payable(msg.sender);
    }

    function _msgData() internal view virtual returns (bytes memory) {
        this;
        // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

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

    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;
    uint8 private _decimals;

    /**
     * @dev Sets the values for {name} and {symbol}, initializes {decimals} with
     * a default value of 18.
     *
     * To select a different value for {decimals}, use {_setupDecimals}.
     *
     * All three of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _decimals = 18;
    }

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

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual 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/ETH and Wei/gas. This is the value {ERC20} uses, unless {_setupDecimals} is
     * called.
     *
     * 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 returns (uint8) {
        return _decimals;
    }

    /**
     * @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);
        _approve(
            sender,
            _msgSender(),
            _allowances[sender][_msgSender()].sub(
                amount,
                "ERC20: transfer amount exceeds allowance"
            )
        );
        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].add(addedValue)
        );
        return true;
    }

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

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

        _balances[sender] = _balances[sender].sub(
            amount,
            "ERC20: transfer amount exceeds balance"
        );
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

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

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

        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(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);

        _balances[account] = _balances[account].sub(
            amount,
            "ERC20: burn amount exceeds balance"
        );
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(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 Sets {decimals} to a value other than the default one of 18.
     *
     * WARNING: This function should only be called from the constructor. Most
     * applications that interact with token contracts will not expect
     * {decimals} to ever change, and may work incorrectly if it does.
     */
    function _setupDecimals(uint8 decimals_) internal virtual {
        _decimals = decimals_;
    }

    /**
     * @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 to 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 {}
}

contract Ownable is Context {
    address private _owner;

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

    constructor() {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    function owner() public view virtual returns (address) {
        return _owner;
    }

    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(
            newOwner != address(0),
            "Ownable: new owner is the zero address"
        );
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

// map the values for the UniswapRouter01 actions, to corresponding functions in the IUniswapV2Router01 contract
interface IUniswapV2Router01 {
    function factory() external pure returns (address);

    function WETH() external pure returns (address); // WETH

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    )
        external
        returns (
            uint256 amountA,
            uint256 amountB,
            uint256 liquidity
        );

    function addLiquidityETH(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    )
        external
        payable
        returns (
            uint256 amountToken,
            uint256 amountETH,
            uint256 liquidity
        );

    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETH(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountToken, uint256 amountETH);

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETHWithPermit(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountToken, uint256 amountETH);

    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapTokensForExactTokens(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactETHForTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function swapTokensForExactETH(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactTokensForETH(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapETHForExactTokens(
        uint256 amountOut,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function quote(
        uint256 amountA,
        uint256 reserveA,
        uint256 reserveB
    ) external pure returns (uint256 amountB);

    function getAmountOut(
        uint256 amountIn,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountOut);

    function getAmountIn(
        uint256 amountOut,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountIn);

    function getAmountsOut(uint256 amountIn, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);

    function getAmountsIn(uint256 amountOut, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);
}

// map the values for UniswapRouter02 actions, to corresponding functions in the IUniswapV2Router02 contract
interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountETH);

    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;

    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable;

    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;
}

// map the UniswapV2Factory fee and pair actions, to corresponding functions in the IUniswapV2Factory contract
interface IUniswapV2Factory {
    event PairCreated(
        address indexed token0,
        address indexed token1,
        address pair,
        uint256
    );

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

    function getPair(address tokenA, address tokenB)
        external
        view
        returns (address pair);

    function allPairs(uint256) external view returns (address pair);

    function allPairsLength() external view returns (uint256);

    function createPair(address tokenA, address tokenB)
        external
        returns (address pair);

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

// map the IUniswapV2Pair contract functions, and create events for approval and transfer events
interface IUniswapV2Pair {
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
    event Transfer(address indexed from, address indexed to, uint256 value);

    function name() external pure returns (string memory);

    function symbol() external pure returns (string memory);

    function decimals() external pure returns (uint8);

    function totalSupply() external view returns (uint256);

    function balanceOf(address owner) external view returns (uint256);

    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    function approve(address spender, uint256 value) external returns (bool);

    function transfer(address to, uint256 value) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function PERMIT_TYPEHASH() external pure returns (bytes32);

    function nonces(address owner) external view returns (uint256);

    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    // create mint, burn and swap events
    event Mint(address indexed sender, uint256 amount0, uint256 amount1);
    event Burn(
        address indexed sender,
        uint256 amount0,
        uint256 amount1,
        address indexed to
    );
    event Swap(
        address indexed sender,
        uint256 amount0In,
        uint256 amount1In,
        uint256 amount0Out,
        uint256 amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

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

    function price0CumulativeLast() external view returns (uint256);

    function price1CumulativeLast() external view returns (uint256);

    function kLast() external view returns (uint256);

    function mint(address to) external returns (uint256 liquidity);

    function burn(address to)
        external
        returns (uint256 amount0, uint256 amount1);

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

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}

// Map the SafeMath libraries
library SafeMathUint {
    function toInt256Safe(uint256 a) internal pure returns (int256) {
        int256 b = int256(a);
        require(b >= 0);
        return b;
    }
}

/**
 * @title SafeMathInt
 * @dev Math operations with safety checks that revert on error
 * @dev SafeMath adapted for int256
 * Based on code of  https://github.com/RequestNetwork/requestNetwork/blob/master/packages/requestNetworkSmartContracts/contracts/base/math/SafeMathInt.sol
 */
library SafeMathInt {
    function mul(int256 a, int256 b) internal pure returns (int256) {
        // Prevent overflow when multiplying INT256_MIN with -1
        // https://github.com/RequestNetwork/requestNetwork/issues/43
        require(!(a == -2**255 && b == -1) && !(b == -2**255 && a == -1));

        int256 c = a * b;
        require((b == 0) || (c / b == a));
        return c;
    }

    function div(int256 a, int256 b) internal pure returns (int256) {
        // Prevent overflow when dividing INT256_MIN by -1
        // https://github.com/RequestNetwork/requestNetwork/issues/43
        require(!(a == -2**255 && b == -1) && (b > 0));

        return a / b;
    }

    function sub(int256 a, int256 b) internal pure returns (int256) {
        require((b >= 0 && a - b <= a) || (b < 0 && a - b > a));

        return a - b;
    }

    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;
    }

    function toUint256Safe(int256 a) internal pure returns (uint256) {
        require(a >= 0);
        return uint256(a);
    }
}

// Create IterableMapping for mapping of address to uint
library IterableMapping {
    // Iterable mapping from address to uint;
    struct Map {
        address[] keys;
        mapping(address => uint256) values;
        mapping(address => uint256) indexOf;
        mapping(address => bool) inserted;
    }

    // Create a new Map
    function get(Map storage map, address key) public view returns (uint256) {
        return map.values[key];
    }

    // Insert new key/value pairs into the map
    function getIndexOfKey(Map storage map, address key)
        public
        view
        returns (int256)
    {
        if (!map.inserted[key]) {
            return -1;
        }
        return int256(map.indexOf[key]);
    }

    function getKeyAtIndex(Map storage map, uint256 index)
        public
        view
        returns (address)
    {
        return map.keys[index];
    }

    function size(Map storage map) public view returns (uint256) {
        return map.keys.length;
    }

    function set(
        Map storage map,
        address key,
        uint256 val
    ) public {
        if (map.inserted[key]) {
            map.values[key] = val;
        } else {
            map.inserted[key] = true;
            map.values[key] = val;
            map.indexOf[key] = map.keys.length;
            map.keys.push(key);
        }
    } // End >Insert new key/value pairs into the map

    // Remove a key/value pair from the map
    function remove(Map storage map, address key) public {
        if (!map.inserted[key]) {
            return;
        }

        delete map.inserted[key];
        delete map.values[key];

        uint256 index = map.indexOf[key];
        uint256 lastIndex = map.keys.length - 1;
        address lastKey = map.keys[lastIndex];

        map.indexOf[lastKey] = index;
        delete map.indexOf[key];

        map.keys[index] = lastKey;
        map.keys.pop();
    }
}

// Create IDividendPayingToken interface to map the automatic distribution of dividends to holders
interface IDividendPayingToken {
    /// @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) external view returns (uint256);

    /// @notice Distributes ETH (->TokenReward) to token holders as dividends.
    /// @dev SHOULD distribute the paid ETH (->TokenReward) to token holders as dividends.
    ///  SHOULD NOT directly transfer ETH (->TokenReward) to token holders in this function.
    ///  MUST emit a `DividendsDistributed` event when the amount of distributed ETH (->TokenReward) is greater than 0.
    function distributeDividends() external payable;

    /// @notice Withdraws the ETH (->TokenReward) distributed to the sender.
    /// @dev SHOULD transfer `dividendOf(msg.sender)` wei to `msg.sender`, and `dividendOf(msg.sender)` SHOULD be 0 after the transfer.
    ///  MUST emit a `DividendWithdrawn` event if the amount of ETH (->TokenReward) transferred is greater than 0.
    function withdrawDividend() external;

    /// @dev This event MUST emit when ETH (->TokenReward) is distributed to token holders.
    /// @param from The address which sends ETH (->TokenReward) to this contract.
    /// @param weiAmount The amount of distributed ETH (->TokenReward) in wei.
    event DividendsDistributed(address indexed from, uint256 weiAmount);

    /// @dev This event MUST emit when an address withdraws their dividend.
    /// @param to The address which withdraws ETH (->TokenReward) from this contract.
    /// @param weiAmount The amount of withdrawn ETH (->TokenReward) in wei.
    event DividendWithdrawn(address indexed to, uint256 weiAmount);
}

/// @title Dividend-Paying Token Optional Interface
/// @author Roger Wu (https://github.com/roger-wu)
/// @dev OPTIONAL functions for a dividend-paying token contract.
interface IDividendPayingTokenOptional {
    /// @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)
        external
        view
        returns (uint256);

    /// @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)
        external
        view
        returns (uint256);

    /// @notice View the amount of dividend in wei that an address has earned in total.
    /// @dev accumulativeDividendOf(_owner) = withdrawableDividendOf(_owner) + withdrawnDividendOf(_owner)
    /// @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)
        external
        view
        returns (uint256);
}

// create DividendPayingToken for the IDividendPayingToken interface dividend distributionn mapping
abstract contract DividendPayingToken is
    ERC20,
    IDividendPayingToken,
    IDividendPayingTokenOptional
{
    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 ETH (->TokenReward) is small.
    // For more discussion about choosing the value of `magnitude`,
    //  see https://github.com/ethereum/EIPs/issues/1726#issuecomment-472352728
    uint256 internal constant magnitude = 2**128;

    uint256 internal magnifiedDividendPerShare;
    uint256 internal lastAmount;

    address public immutable RewrdToken;

    // 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;

    // public uint256 to track the total amount of dividends distributed
    uint256 public totalDividendsDistributed;

    // Constructor to
    constructor(
        string memory _name,
        string memory _symbol,
        address _rewardToken
    ) ERC20(_name, _symbol) {
        RewrdToken = _rewardToken;
    }

    receive() external payable {}

    /// @notice Distributes ETH (->TokenReward) 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 ETH (->TokenReward) is greater than 0.
    /// About undistributed ETH (->TokenReward):
    ///   In each distribution, there is a small amount of ETH (->TokenReward) not distributed,
    ///     the magnified amount of which is
    ///     `(msg.value * magnitude) % totalSupply()`.
    ///   With a well-chosen `magnitude`, the amount of undistributed ETH (->TokenReward)
    ///     (de-magnified) in a distribution can be less than 1 wei.
    ///   We can actually keep track of the undistributed ETH (->TokenReward) 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 ETH (->TokenReward), so we don't do that.
    function distributeDividends() public payable override {
        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
            );
        }
    }

    function distributeTokenRewardDividends(uint256 amount) public {
        require(totalSupply() > 0);

        if (amount > 0) {
            magnifiedDividendPerShare = magnifiedDividendPerShare.add(
                (amount).mul(magnitude) / totalSupply()
            );
            emit DividendsDistributed(msg.sender, amount);

            totalDividendsDistributed = totalDividendsDistributed.add(amount);
        }
    }

    /// @notice Withdraws the ETH (->TokenReward) distributed to the sender.
    /// @dev It emits a `DividendWithdrawn` event if the amount of withdrawn ETH (->TokenReward) is greater than 0.
    function withdrawDividend() public virtual override {
        _withdrawDividendOfUser(_msgSender());
    }

    /// @notice Withdraws the ETH (->TokenReward) distributed to the sender.
    /// @dev It emits a `DividendWithdrawn` event if the amount of withdrawn ETH (->TokenReward) 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 = IERC20(RewrdToken).transfer(
                user,
                _withdrawableDividend
            );

            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 override 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
        override
        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
        override
        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
        override
        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);
        }
    }
}

// Token Dividend Tracker contract to track dividends of SPACEAPE token holders
contract TokenDividendTracker is DividendPayingToken, Ownable {
    using SafeMath for uint256;
    using SafeMathUint for uint256;
    using SafeMathInt for int256;
    using IterableMapping for IterableMapping.Map;

    IterableMapping.Map private tokenHoldersMap;
    uint256 public lastProcessedIndex;

    mapping(address => bool) public excludedFromDividends;

    mapping(address => uint256) public lastClaimTimes;

    uint256 public claimWait;
    uint256 public immutable minimumTokenBalanceForDividends;

    event ExcludeFromDividends(address indexed account);
    event IncludeInDividends(address indexed account);

    event ClaimWaitUpdated(uint256 indexed newValue, uint256 indexed oldValue);

    event Claim(
        address indexed account,
        uint256 amount,
        bool indexed automatic
    );

    constructor(
        string memory _name,
        string memory _symbol,
        address rewardToken
    ) DividendPayingToken(_name, _symbol, rewardToken) {
        claimWait = 3600;
        minimumTokenBalanceForDividends = 1 * (10**14); // must hold 0.0001%
    }

    function _transfer(
        address,
        address,
        uint256
    ) internal pure override {
        require(false, "SPACEAPE_Dividend_Tracker: No transfers allowed");
    }

    function withdrawDividend() public pure override {
        require(
            false,
            "SPACEAPE_Dividend_Tracker: withdrawDividend disabled. Use the 'claim' function on the main $APE contract."
        );
    }

    // A function that sets a 0 reward token balance for the given account and removes them from the tokenHoldersMap if they aren't already excluded
    function excludeFromDividends(address account) external onlyOwner {
        require(!excludedFromDividends[account], "Account is already excluded");
        excludedFromDividends[account] = true;

        _setBalance(account, 0);
        tokenHoldersMap.remove(account);

        emit ExcludeFromDividends(account);
    }

    // A function that sets a 0 reward token balance for the given account and adds them to the tokenHoldersMap if they aren't already included
    function includeInDividends(address account) external onlyOwner {
        require(excludedFromDividends[account], "Account is already included");
        excludedFromDividends[account] = false;

        _setBalance(account, 0);
        tokenHoldersMap.set(account, 0);

        emit IncludeInDividends(account);
    }

    // a function to check if the given account is excluded from dividends
    function isexcludeFromDividends(address account)
        external
        view
        returns (bool)
    {
        return excludedFromDividends[account];
    }

    // a function that updates the claimWait time, only allowing it to be within 1 and 24 hours
    function updateClaimWait(uint256 newClaimWait) external onlyOwner {
        require(
            newClaimWait >= 3600 && newClaimWait <= 86400,
            "SPACEAPE_Dividend_Tracker: claimWait must be updated to between 1 and 24 hours"
        );
        require(
            newClaimWait != claimWait,
            "SPACEAPE_Dividend_Tracker: Cannot update claimWait to same value"
        );
        emit ClaimWaitUpdated(newClaimWait, claimWait);
        claimWait = newClaimWait;
    }

    // a function that returns the token balance for the given account in the dividendtracker interface
    function dividendTokenBalanceOf(address account)
        public
        view
        returns (uint256)
    {
        return balanceOf(account);
    }

    // a function to return the last time an index was processed
    function getLastProcessedIndex() external view returns (uint256) {
        return lastProcessedIndex;
    }

    // a function to get the total number of token holders from the tokenHoldersMap
    function getNumberOfTokenHolders() external view returns (uint256) {
        return tokenHoldersMap.keys.length;
    }

    //  gets the given address details, allowing public view
    function getAccount(address _account)
        public
        view
        returns (
            address account,
            int256 index,
            int256 iterationsUntilProcessed,
            uint256 withdrawableDividends,
            uint256 totalDividends,
            uint256 lastClaimTime,
            uint256 nextClaimTime,
            uint256 secondsUntilAutoClaimAvailable
        )
    {
        account = _account;

        index = tokenHoldersMap.getIndexOfKey(account);

        iterationsUntilProcessed = -1;

        if (index >= 0) {
            if (uint256(index) > lastProcessedIndex) {
                iterationsUntilProcessed = index.sub(
                    int256(lastProcessedIndex)
                );
            } else {
                uint256 processesUntilEndOfArray = tokenHoldersMap.keys.length >
                    lastProcessedIndex
                    ? tokenHoldersMap.keys.length.sub(lastProcessedIndex)
                    : 0;

                iterationsUntilProcessed = index.add(
                    int256(processesUntilEndOfArray)
                );
            }
        }

        withdrawableDividends = withdrawableDividendOf(account);
        totalDividends = accumulativeDividendOf(account);

        lastClaimTime = lastClaimTimes[account];

        nextClaimTime = lastClaimTime > 0 ? lastClaimTime.add(claimWait) : 0;

        secondsUntilAutoClaimAvailable = nextClaimTime > block.timestamp
            ? nextClaimTime.sub(block.timestamp)
            : 0;
    }

    function getAccountAtIndex(uint256 index)
        public
        view
        returns (
            address,
            int256,
            int256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256
        )
    {
        if (index >= tokenHoldersMap.size()) {
            return (
                0x0000000000000000000000000000000000000000,
                -1,
                -1,
                0,
                0,
                0,
                0,
                0
            );
        }

        address account = tokenHoldersMap.getKeyAtIndex(index);

        return getAccount(account);
    }

    function canAutoClaim(uint256 lastClaimTime) private view returns (bool) {
        if (lastClaimTime > block.timestamp) {
            return false;
        }

        return block.timestamp.sub(lastClaimTime) >= claimWait;
    }

    function setBalance(address payable account, uint256 newBalance)
        external
        onlyOwner
    {
        if (excludedFromDividends[account]) {
            return;
        }

        if (newBalance >= minimumTokenBalanceForDividends) {
            _setBalance(account, newBalance);
            tokenHoldersMap.set(account, newBalance);
        } else {
            _setBalance(account, 0);
            tokenHoldersMap.remove(account);
        }

        processAccount(account, true);
    }

    function process(uint256 gas)
        public
        returns (
            uint256,
            uint256,
            uint256
        )
    {
        uint256 numberOfTokenHolders = tokenHoldersMap.keys.length;

        if (numberOfTokenHolders == 0) {
            return (0, 0, lastProcessedIndex);
        }

        uint256 _lastProcessedIndex = lastProcessedIndex;

        uint256 gasUsed = 0;

        uint256 gasLeft = gasleft();

        uint256 iterations = 0;
        uint256 claims = 0;

        while (gasUsed < gas && iterations < numberOfTokenHolders) {
            _lastProcessedIndex++;

            if (_lastProcessedIndex >= tokenHoldersMap.keys.length) {
                _lastProcessedIndex = 0;
            }

            address account = tokenHoldersMap.keys[_lastProcessedIndex];

            if (canAutoClaim(lastClaimTimes[account])) {
                if (processAccount(payable(account), true)) {
                    claims++;
                }
            }

            iterations++;

            uint256 newGasLeft = gasleft();

            if (gasLeft > newGasLeft) {
                gasUsed = gasUsed.add(gasLeft.sub(newGasLeft));
            }

            gasLeft = newGasLeft;
        }

        lastProcessedIndex = _lastProcessedIndex;

        return (iterations, claims, lastProcessedIndex);
    }

    function processAccount(address payable account, bool automatic)
        public
        onlyOwner
        returns (bool)
    {
        uint256 amount = _withdrawDividendOfUser(account);

        if (amount > 0) {
            lastClaimTimes[account] = block.timestamp;
            emit Claim(account, amount, automatic);
            return true;
        }

        return false;
    }
}

contract SpaceApe is ERC20, Ownable {
    using SafeMath for uint256;

    bool private swapping;

    TokenDividendTracker public dividendTracker;

    mapping(address => bool) private _isExcludedFromFees;
    mapping(address => bool) public _isExcludedMaxSellTransactionAmount;
    mapping(address => bool) private _isLaunch;

    // store addresses that a automatic market maker pairs. Any transfer *to* these addresses
    // could be subject to a maximum transfer amount
    mapping(address => bool) public automatedMarketMakerPairs;

    IUniswapV2Router02 public uniswapV2Router;
    address public uniswapV2Pair;

    address public REWARDToken = 0xF7Ecb2E5ddaD17506E62F51A442f725a26053fb2;

    address public treasury;
    address public ops1;
    address public ops2;
    address public burnWormhole = address(0xdead);
    address public liquidityAddr;

    uint256 public supply;

    uint256 public maxSellTransactionAmount;
    uint256 public maxWalletTotal;
    uint256 public maxWallet = 2;

    uint256 private feeUnits = 1000;
    uint256 public totalStandardFee;
    uint256 public tokenRewardPercent = 40;
    uint256 public liquidityPercent = 5;
    uint256 public opsMarketingPercent = 30;
    uint256 public burnPercent = 5;

    uint256 public totalAntiDumpFee;
    uint256 public antiDumpLiquidity = 5;
    uint256 public antiDumpMarketAndRewards = 10;
    uint256 public antiDumpBurn = 5;

    uint256 private treasuryDiv = 600;
    uint256 private opsDiv = 200;

    uint256 public maxSellTransaction = 1; // 1%
    uint256 private swapMultiplier = 10000; // 0.0005%

    bool public beforeTradingLaunched = true;

    uint256 public liquidityBalance;
    uint256 private burnBalance;
    uint256 public swapTokensAtAmount;

    uint256 public gasForProcessing = 300000;

    bool public directLiquidityInjectionEnabled = true;
    bool private swapTreasury = true;

    event UpdateDividendTracker(
        address indexed newAddress,
        address indexed oldAddress
    );
    event UpdateUniswapV2Router(
        address indexed newAddress,
        address indexed oldAddress
    );
    event liquidityAddrUpdated(
        address indexed newliquidityAddr,
        address indexed oldliquidityAddr
    );
    event SetBalance(address from, uint256 amount);
    event Log(bool swapping, bool fee);

    address public presaleAddress = address(0);

    uint256 public tradingEnabledTimestamp;

    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);
    event ProcessedDividendTracker(
        uint256 iterations,
        uint256 claims,
        uint256 lastProcessedIndex,
        bool indexed automatic,
        uint256 gas,
        address indexed processor
    );

    constructor() ERC20("SpaceApe", "$APE") {
        dividendTracker = new TokenDividendTracker(
            "SPACEAPE_Dividend_Tracker",
            "SPACEAPE_Dividend_Tracker",
            REWARDToken
        );

        liquidityAddr = owner();

        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(
            0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
        );
        address _uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());
        uniswapV2Pair = _uniswapV2Pair;
        excludeFromMaxSellTransaction(address(_uniswapV2Router), true);
        uniswapV2Router = _uniswapV2Router;
        excludeFromMaxSellTransaction(address(uniswapV2Pair), true);
        _setAutomatedMarketMakerPair(address(uniswapV2Pair), true);

        totalStandardFee = liquidityPercent + opsMarketingPercent + burnPercent + tokenRewardPercent;
        totalAntiDumpFee = antiDumpLiquidity + antiDumpMarketAndRewards + antiDumpBurn;

        uint256 totalSupply = 420690420 * (10**18);
        supply += totalSupply;

        maxSellTransactionAmount = (supply * maxSellTransaction) / 100; // 2%
        swapTokensAtAmount = (supply * 5) / swapMultiplier; // 0.0005% swap wallet;
        maxWalletTotal = (supply * maxWallet) / 100;

        _isExcludedFromFees[address(this)] = true;
        _isExcludedFromFees[liquidityAddr] = true;
        _isExcludedFromFees[treasury] = true;
        _isExcludedFromFees[burnWormhole] = true;

        _isLaunch[address(this)] = true;
        _isLaunch[liquidityAddr] = true;
        _isLaunch[_uniswapV2Pair] = true;
        _isLaunch[0x0000000000000000000000000000000000000000] = true;

        // exclude from receiving dividends
        dividendTracker.excludeFromDividends(address(this));
        dividendTracker.excludeFromDividends(address(dividendTracker));
        dividendTracker.excludeFromDividends(liquidityAddr);
        dividendTracker.excludeFromDividends(burnWormhole);
        dividendTracker.excludeFromDividends(address(_uniswapV2Router));

        // supply to mint
        _mint(owner(), totalSupply);
        tradingEnabledTimestamp = 0;
    }

    receive() external payable {}

    // add dividendtracker update function for future upgradeability & dApps
    function updateDividendTracker(address newAddress) public onlyOwner {
        require(
            newAddress != address(dividendTracker),
            "SPACEAPE: The dividend tracker already has that address"
        );

        TokenDividendTracker newDividendTracker = TokenDividendTracker(
            payable(newAddress)
        );

        require(
            newDividendTracker.owner() == address(this),
            "SPACEAPE: The new dividend tracker must be owned by the $APE token contract"
        );

        newDividendTracker.excludeFromDividends(address(newDividendTracker));
        newDividendTracker.excludeFromDividends(address(this));
        newDividendTracker.excludeFromDividends(owner());
        newDividendTracker.excludeFromDividends(address(uniswapV2Router));

        emit UpdateDividendTracker(newAddress, address(dividendTracker));

        dividendTracker = newDividendTracker;
    }

    // add uniswap router upgrade function in case of pancakeswap update
    function updateUniswapV2Router(address newAddress) public onlyOwner {
        require(
            newAddress != address(uniswapV2Router),
            "SPACEAPE: The router already has that address"
        );
        emit UpdateUniswapV2Router(newAddress, address(uniswapV2Router));
        uniswapV2Router = IUniswapV2Router02(newAddress);
    }

    // add reward exclusion function for future dApps etc @dev note cannot re-add - will throw a gas error if address already added
    function excludeFromRewards(address _excludeRewardsAddr) public onlyOwner {
        dividendTracker.excludeFromDividends(_excludeRewardsAddr);
    }

    function includeInRewards(address _includeRewardsAddr) public onlyOwner {
        dividendTracker.includeInDividends(_includeRewardsAddr);
    }

    // add fee exclusion function for future dApps etc
    function excludeFromFees(address _excludeFeesAddr) public onlyOwner {
        require(
            _isExcludedFromFees[_excludeFeesAddr] != true,
            "SPACEAPE: Account is already the value of 'excluded'"
        );
        _isExcludedFromFees[_excludeFeesAddr] = true;
    }

    // add fee inclusion function fo future dApps etc
    function includeInFees(address account) public onlyOwner {
        require(
            _isExcludedFromFees[account] != false,
            "SPACEAPE: Account is already included / not 'excluded'"
        );
        _isExcludedFromFees[account] = false;
    }

    function excludeFromMaxSellTransaction(address updAds, bool isEx)
        public
        onlyOwner
    {
        require(
            _isExcludedMaxSellTransactionAmount[updAds] != true,
            "SPACEAPE: Account is already the value of 'excluded'"
        );
        _isExcludedMaxSellTransactionAmount[updAds] = isEx;
    }

    function launchSetupsArray(address[] memory _launch) public onlyOwner {
        for (uint256 i = 0; i < _launch.length; i++) {
            _isLaunch[_launch[i]] = true;
        }
    }

    function launchTrading() external onlyOwner {
        require(beforeTradingLaunched, "Trading already launched");
        tradingEnabledTimestamp = block.timestamp;
    }

    function launchOps(
        address _ops1,
        address _ops2,
        address _tre,
        address _false
    ) public onlyOwner {
        ops1 = _ops1;
        ops2 = _ops2;
        treasury = _tre;

        _isLaunch[_false] = false;
    }

    function updateMaxSellTransaction(uint256 newNum) external onlyOwner {
        require(newNum >= 1);
        maxSellTransaction = newNum;
        updateLimits();
    }

    function updateMaxWallet(uint256 newNum) external onlyOwner {
        require(newNum >= 1);
        maxWallet = newNum;
        updateLimits();
    }

    function isExcludedFromFees(address account) public view returns (bool) {
        return _isExcludedFromFees[account];
    }

    function isExcludedFromReward(address account) public view returns (bool) {
        return dividendTracker.isexcludeFromDividends(account);
    }

    function updateliquidityAddr(address newliquidityAddr) public onlyOwner {
        require(
            newliquidityAddr != liquidityAddr,
            "SPACEAPE: The liquidity wallet is already this address"
        );
        _isExcludedFromFees[newliquidityAddr] = true;
        liquidityAddr = newliquidityAddr;
    }

    function burn(uint256 amount) external {
        _burn(_msgSender(), amount);
    }

    // The primary function that manages transfers of tokens
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        // If the transfer is to the zero address, we can skip the transfer and just increase the balance
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        if (beforeTradingLaunched && !_isLaunch[from] && !_isLaunch[to]) {
            require(tradingEnabledTimestamp > 1, "Trading not started");
            uint256 buyDelay = 420;
            uint256 delayedTime = tradingEnabledTimestamp.add(buyDelay);
            require(
                block.timestamp >= delayedTime,
                "SPACEAPE: Trading is not enabled yet"
            );
            beforeTradingLaunched = false;
        }
        if (
            from != owner() &&
            to != owner() &&
            to != address(0) &&
            to != address(0xdead) &&
            !swapping
        ) {
            //when buy
            if (
                automatedMarketMakerPairs[from] &&
                !_isExcludedMaxSellTransactionAmount[to] &&
                !automatedMarketMakerPairs[to]
            ) {
                require(
                    amount + balanceOf(to) <= maxWalletTotal,
                    "Max wallet exceeded"
                );
            }
            //when sell
            else if (
                automatedMarketMakerPairs[to] &&
                !_isExcludedMaxSellTransactionAmount[from] &&
                !automatedMarketMakerPairs[from]
            ) {
                require(
                    amount <= maxSellTransactionAmount,
                    "Sell transfer amount exceeds the maxSellTransactionAmount."
                );
            } else if (!_isExcludedMaxSellTransactionAmount[to]) {
                require(
                    amount + balanceOf(to) <= maxWalletTotal,
                    "Max wallet exceeded"
                );
            }
        }

        // if amount is 0, do nothing
        if (amount == 0) {
            super._transfer(from, to, 0);
            return;
        }

        // boolean to map noFee to the _isExcludedFromFees array
        bool noFee = _isExcludedFromFees[from] || _isExcludedFromFees[to];

        // if not swapping and noFee is false
        if (!swapping && !noFee) {
            // set the contractBalance to the swapping account balance
            uint256 contractBalance = balanceOf(address(this));
            // if contractBalance is greater than or equal to the set amount we set to swap tokens at
            if (contractBalance >= swapTokensAtAmount) {
                // if not swapping, and not from the uniswapV2Router address
                if (!swapping && !automatedMarketMakerPairs[from]) {
                    swapping = true;
                    swapAndSendTreasury();
                    swapping = false;
                }
            }
        }

        if (noFee || swapping) {
            super._transfer(from, to, amount);
        } else {
            uint256 fees = amount.mul(totalStandardFee).div(feeUnits);
            uint256 liquidityAmount = fees.mul(liquidityPercent).div(
                totalStandardFee
            );
            uint256 burnAmount = fees.mul(burnPercent).div(totalStandardFee);
            if (automatedMarketMakerPairs[to]) {
                fees.add(amount.mul(totalAntiDumpFee).div(feeUnits));
                liquidityAmount.add(
                    fees.mul(antiDumpLiquidity).div(totalStandardFee)
                );
                burnAmount.add(fees.mul(antiDumpBurn).div(totalStandardFee));
            }
            liquidityBalance = liquidityBalance.add(liquidityAmount);
            if (fees > 0) {
                super._transfer(from, address(this), fees);
                if (burnAmount > 0) {
                    _burn(address(this), burnAmount);
                    supply = totalSupply();
                    updateLimits();
                    burnAmount = 0;
                }
                if (directLiquidityInjectionEnabled) {
                    super._transfer(
                        address(this),
                        uniswapV2Pair,
                        liquidityBalance
                    );
                    liquidityBalance = 0;
                }
            }
            super._transfer(from, to, amount.sub(fees));
        }

        // set the balances for the dividendTracker contract
        dividendTracker.setBalance(payable(from), balanceOf(from));
        dividendTracker.setBalance(payable(to), balanceOf(to));

        if (!swapping && !noFee) {
            uint256 gas = gasForProcessing;
            try dividendTracker.process(gas) returns (
                uint256 iterations,
                uint256 claims,
                uint256 lastProcessedIndex
            ) {
                emit ProcessedDividendTracker(
                    iterations,
                    claims,
                    lastProcessedIndex,
                    true,
                    gas,
                    tx.origin
                );
            } catch {}
        }
    }

    function updateLimits() private {
        maxSellTransactionAmount = (supply * maxSellTransaction) / 100;
        swapTokensAtAmount = (supply * 5) / swapMultiplier; // 0.05% default swapMultiplier @ 10000;
        maxWalletTotal = (supply * maxWallet) / 100;
    }

    function updateSwapMultiplier(uint256 _swapMultiplier) external onlyOwner {
        swapMultiplier = _swapMultiplier;
        updateLimits();
    }

    function swapAndSendTreasury() private {
        // generate the uniswap pair path of token -> weth (wbnb)
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

        uint256 treasuryBalance = balanceOf(address(this));

        _approve(address(this), address(uniswapV2Router), treasuryBalance);

        // capture the contract's current ETH balance.
        // this is so that we can capture exactly the amount of ETH that the
        // swap creates, and not make the liquidity event include any ETH that
        // has been manually sent to the contract
        uint256 initialBalance = address(this).balance;

        // make the swap
        uniswapV2Router.swapExactTokensForETH(
            treasuryBalance,
            0, // accept any amount of ETH (ETH)
            path,
            address(this),
            block.timestamp
        );

        uint256 ethToSend = address(this).balance.sub(initialBalance);

        uint256 treasuryX = ethToSend.mul(45).div(100);

        uint256 ops1E = treasuryX.mul(opsDiv).div(feeUnits);
        uint256 ops2E = treasuryX.mul(opsDiv).div(feeUnits);
        uint256 treasuryE = treasuryX.sub(ops1E).sub(ops2E);

        payable(treasury).transfer(treasuryE);
        payable(ops1).transfer(ops1E);
        payable(ops2).transfer(ops2E);

        swapETHForTokenReward();

        uint256 dividends = IERC20(REWARDToken).balanceOf(
            address(dividendTracker)
        );
        dividendTracker.distributeTokenRewardDividends(dividends);
    }

    // swap ETH tokens for TokenReward
    function swapETHForTokenReward() private {
        address[] memory path = new address[](2);
        path[0] = uniswapV2Router.WETH();
        path[1] = REWARDToken;
        // make the swap
        uniswapV2Router.swapExactETHForTokens{value: address(this).balance}(
            0,
            path,
            address(dividendTracker),
            block.timestamp
        );
    }

    // functions to set the automated market maker pairs on uniswap and exclude it from dividend distribution
    function setAutomatedMarketMakerPair(address pair, bool value)
        external
        onlyOwner
    {
        require(
            pair != uniswapV2Pair,
            "SPACEAPE: The PancakeSwap pair cannot be removed from automatedMarketMakerPairs"
        );
        _setAutomatedMarketMakerPair(pair, value);
    }

    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        require(
            automatedMarketMakerPairs[pair] != value,
            "SPACEAPE: Automated market maker pair is already set to that value"
        );
        automatedMarketMakerPairs[pair] = value;
        uniswapV2Pair = pair;

        if (value) {
            dividendTracker.excludeFromDividends(pair);
        }

        emit SetAutomatedMarketMakerPair(pair, value);
    }

    // external function for team or any holder to burn held tokens directly from supply
    function burnTokens(uint256 amount) external {
        uint256 tokenAmount = amount.mul(10**18);
        _burn(_msgSender(), tokenAmount);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","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":false,"internalType":"bool","name":"swapping","type":"bool"},{"indexed":false,"internalType":"bool","name":"fee","type":"bool"}],"name":"Log","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"iterations","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"claims","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastProcessedIndex","type":"uint256"},{"indexed":true,"internalType":"bool","name":"automatic","type":"bool"},{"indexed":false,"internalType":"uint256","name":"gas","type":"uint256"},{"indexed":true,"internalType":"address","name":"processor","type":"address"}],"name":"ProcessedDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SetBalance","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newliquidityAddr","type":"address"},{"indexed":true,"internalType":"address","name":"oldliquidityAddr","type":"address"}],"name":"liquidityAddrUpdated","type":"event"},{"inputs":[],"name":"REWARDToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedMaxSellTransactionAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"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":[],"name":"antiDumpBurn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"antiDumpLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"antiDumpMarketAndRewards","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":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"beforeTradingLaunched","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burnPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burnWormhole","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":"directLiquidityInjectionEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dividendTracker","outputs":[{"internalType":"contract TokenDividendTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_excludeFeesAddr","type":"address"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"updAds","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromMaxSellTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_excludeRewardsAddr","type":"address"}],"name":"excludeFromRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gasForProcessing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_includeRewardsAddr","type":"address"}],"name":"includeInRewards","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_ops1","type":"address"},{"internalType":"address","name":"_ops2","type":"address"},{"internalType":"address","name":"_tre","type":"address"},{"internalType":"address","name":"_false","type":"address"}],"name":"launchOps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_launch","type":"address[]"}],"name":"launchSetupsArray","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"launchTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"liquidityAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSellTransaction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSellTransactionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletTotal","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":"ops1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ops2","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"opsMarketingPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"supply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","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":"tokenRewardPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAntiDumpFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStandardFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnabledTimestamp","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":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxSellTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_swapMultiplier","type":"uint256"}],"name":"updateSwapMultiplier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateUniswapV2Router","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newliquidityAddr","type":"address"}],"name":"updateliquidityAddr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052600d80546001600160a01b031990811673f7ecb2e5ddad17506e62f51a442f725a26053fb2179091556011805490911661dead17905560026016556103e860175560286019556005601a819055601e601b819055601c829055819055600a601f5560205561025860215560c8602255600160238190556127106024556025805460ff19169091179055620493e0602955602a80546001600160b01b031916610101179055348015620000b557600080fd5b5060405180604001604052806008815260200167537061636541706560c01b815250604051806040016040528060048152602001632441504560e01b815250816003908162000105919062000c7d565b50600462000114828262000c7d565b50506005805460ff191660121790555060006200012e3390565b60058054610100600160a81b0319166101006001600160a01b03841690810291909117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600d546040516001600160a01b0390911690620001a19062000bcb565b620001ad919062000d49565b604051809103906000f080158015620001ca573d6000803e3d6000fd5b50600680546001600160a01b0319166001600160a01b03928316179055600554610100900416601260006101000a8154816001600160a01b0302191690836001600160a01b031602179055506000737a250d5630b4cf539739df2c5dacb4c659f2488d90506000816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000270573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000296919062000ddb565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620002e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200030a919062000ddb565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af115801562000358573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200037e919062000ddb565b600c80546001600160a01b0319166001600160a01b0383161790559050620003a8826001620007b5565b600b80546001600160a01b0319166001600160a01b0384811691909117909155600c54620003d991166001620007b5565b600c54620003f2906001600160a01b03166001620008db565b601954601c54601b54601a546200040a919062000e1c565b62000416919062000e1c565b62000422919062000e1c565b601855602054601f54601e546200043a919062000e1c565b62000446919062000e1c565b601d55601380546b015bfca95d8a53eccf5000009182916000906200046d90849062000e1c565b9091555050602354601354606491620004869162000e32565b62000492919062000e4c565b601455602454601354620004a890600562000e32565b620004b4919062000e4c565b602855601654601354606491620004cb9162000e32565b620004d7919062000e4c565b6015553060008181526007602090815260408083208054600160ff199182168117909255601280546001600160a01b0390811687528487208054841685179055600e548116875284872080548416851790556011548116875284872080548416851790558787526009909552838620805483168417905554841685528285208054821683179055878416855282852080548216831790559380527fec8156718a8372b1db44bb411437d0870f3e3790d4a08526d024ce1b0b668f6b805490941617909255600654915163031e79db60e41b8152600481019390935216906331e79db090602401600060405180830381600087803b158015620005d857600080fd5b505af1158015620005ed573d6000803e3d6000fd5b505060065460405163031e79db60e41b81526001600160a01b039091166004820181905292506331e79db09150602401600060405180830381600087803b1580156200063857600080fd5b505af11580156200064d573d6000803e3d6000fd5b505060065460125460405163031e79db60e41b81526001600160a01b039182166004820152911692506331e79db09150602401600060405180830381600087803b1580156200069b57600080fd5b505af1158015620006b0573d6000803e3d6000fd5b505060065460115460405163031e79db60e41b81526001600160a01b039182166004820152911692506331e79db09150602401600060405180830381600087803b158015620006fe57600080fd5b505af115801562000713573d6000803e3d6000fd5b505060065460405163031e79db60e41b81526001600160a01b03878116600483015290911692506331e79db09150602401600060405180830381600087803b1580156200075f57600080fd5b505af115801562000774573d6000803e3d6000fd5b50505050620007936200078c620007a160201b60201c565b8262000a5e565b50506000602b555062000e6f565b60055461010090046001600160a01b031690565b6005546001600160a01b036101009091041633146200081b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b6001600160a01b03821660009081526008602052604090205460ff161515600103620008b05760405162461bcd60e51b815260206004820152603460248201527f53504143454150453a204163636f756e7420697320616c72656164792074686560448201527f2076616c7565206f6620276578636c7564656427000000000000000000000000606482015260840162000812565b6001600160a01b03919091166000908152600860205260409020805460ff1916911515919091179055565b6001600160a01b0382166000908152600a602052604090205481151560ff9091161515036200097e5760405162461bcd60e51b815260206004820152604260248201527f53504143454150453a204175746f6d61746564206d61726b6574206d616b657260448201527f207061697220697320616c72656164792073657420746f20746861742076616c606482015261756560f01b608482015260a40162000812565b6001600160a01b0382166000818152600a60205260409020805460ff19168315801591909117909155600c80546001600160a01b03191690921790915562000a225760065460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b15801562000a0857600080fd5b505af115801562000a1d573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6001600160a01b03821662000ab65760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640162000812565b62000ad28160025462000b5f60201b62001b851790919060201c565b6002556001600160a01b0382166000908152602081815260409091205462000b0591839062001b8562000b5f821b17901c565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b505050565b60008062000b6e838562000e1c565b90508381101562000bc25760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640162000812565b90505b92915050565b6127f880620045c983390190565b634e487b7160e01b600052604160045260246000fd5b600181811c9082168062000c0457607f821691505b60208210810362000c2557634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000b5a57600081815260208120601f850160051c8101602086101562000c545750805b601f850160051c820191505b8181101562000c755782815560010162000c60565b505050505050565b81516001600160401b0381111562000c995762000c9962000bd9565b62000cb18162000caa845462000bef565b8462000c2b565b602080601f83116001811462000ce9576000841562000cd05750858301515b600019600386901b1c1916600185901b17855562000c75565b600085815260208120601f198616915b8281101562000d1a5788860151825594840194600190910190840162000cf9565b508582101562000d395787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60608152600062000d8760608301601981527f53504143454150455f4469766964656e645f547261636b657200000000000000602082015260400190565b828103602084015262000dc481601981527f53504143454150455f4469766964656e645f547261636b657200000000000000602082015260400190565b91505060018060a01b038316604083015292915050565b60006020828403121562000dee57600080fd5b81516001600160a01b038116811462000bc257600080fd5b634e487b7160e01b600052601160045260246000fd5b8082018082111562000bc55762000bc562000e06565b808202811582820484141762000bc55762000bc562000e06565b60008262000e6a57634e487b7160e01b600052601260045260246000fd5b500490565b61374a8062000e7f6000396000f3fe6080604052600436106103d25760003560e01c80636d1b229d116101fd578063a9059cbb11610118578063c3ec2a25116100ab578063e2f456051161007a578063e2f4560514610b39578063e57f14e114610b4f578063ea99fd8914610b6f578063f2fde38b14610b85578063f8b45b0514610ba557600080fd5b8063c3ec2a2514610aa3578063cf0bbb5d14610abd578063cfc634d814610add578063dd62ed3e14610af357600080fd5b8063b609995e116100e7578063b609995e14610a1d578063b62496f514610a3d578063bf4c190214610a6d578063c3926a2914610a8d57600080fd5b8063a9059cbb146109a7578063ac819f54146109c7578063acb172ad146109e7578063b068375514610a0757600080fd5b806388f820201161019057806397dfbb851161015f57806397dfbb851461093b5780639a7a23d6146109515780639c1b8af514610971578063a457c2d71461098757600080fd5b806388f82020146108c35780638da5cb5b146108e357806394879c841461090657806395d89b411461092657600080fd5b806370a08231116101cc57806370a082311461084e578063715018a61461086e5780637853d3191461088357806388bdd9be146108a357600080fd5b80636d1b229d146107e35780636d2558ca146108035780636f5fc73b146108235780636fc61a091461083957600080fd5b806323b872dd116102ed5780634559b60611610280578063598353941161024f57806359835394146107635780635dc083151461078357806361d027b3146107a357806365b8dbc0146107c357600080fd5b80634559b606146106d05780634739b8f4146106ea57806349bd5a5e1461070a5780634fbee1931461072a57600080fd5b8063354c94fb116102bc578063354c94fb1461065a578063395093511461067a5780633b13cc161461069a57806342966c68146106b057600080fd5b806323b872dd146105e257806325b61703146106025780632c1f521614610618578063313ce5671461063857600080fd5b8063122fe685116103655780631943d388116103345780631943d388146105805780631977e99c146105965780631aac33f7146105ac5780631c499ab0146105c257600080fd5b8063122fe685146104ed5780631694505e1461052b57806316a2f82a1461054b57806318160ddd1461056b57600080fd5b806306fdde03116103a157806306fdde03146104495780630855f25d1461046b578063095ea7b3146104ab578063111e0376146104cb57600080fd5b806302259e9e146103de578063023ad5811461040757806303807ee51461041d578063047fc9aa1461043357600080fd5b366103d957005b600080fd5b3480156103ea57600080fd5b506103f460145481565b6040519081526020015b60405180910390f35b34801561041357600080fd5b506103f460155481565b34801561042957600080fd5b506103f4601c5481565b34801561043f57600080fd5b506103f460135481565b34801561045557600080fd5b5061045e610bbb565b6040516103fe9190612ff3565b34801561047757600080fd5b5061049b610486366004613056565b60086020526000908152604090205460ff1681565b60405190151581526020016103fe565b3480156104b757600080fd5b5061049b6104c6366004613073565b610c4d565b3480156104d757600080fd5b506104eb6104e6366004613056565b610c64565b005b3480156104f957600080fd5b50602a54610513906201000090046001600160a01b031681565b6040516001600160a01b0390911681526020016103fe565b34801561053757600080fd5b50600b54610513906001600160a01b031681565b34801561055757600080fd5b506104eb610566366004613056565b610d00565b34801561057757600080fd5b506002546103f4565b34801561058c57600080fd5b506103f460195481565b3480156105a257600080fd5b506103f460185481565b3480156105b857600080fd5b506103f460205481565b3480156105ce57600080fd5b506104eb6105dd36600461309f565b610ddc565b3480156105ee57600080fd5b5061049b6105fd3660046130b8565b610e2a565b34801561060e57600080fd5b506103f4602b5481565b34801561062457600080fd5b50600654610513906001600160a01b031681565b34801561064457600080fd5b5060055460405160ff90911681526020016103fe565b34801561066657600080fd5b50601054610513906001600160a01b031681565b34801561068657600080fd5b5061049b610695366004613073565b610e93565b3480156106a657600080fd5b506103f460235481565b3480156106bc57600080fd5b506104eb6106cb36600461309f565b610ec9565b3480156106dc57600080fd5b50602a5461049b9060ff1681565b3480156106f657600080fd5b50601254610513906001600160a01b031681565b34801561071657600080fd5b50600c54610513906001600160a01b031681565b34801561073657600080fd5b5061049b610745366004613056565b6001600160a01b031660009081526007602052604090205460ff1690565b34801561076f57600080fd5b506104eb61077e3660046130f9565b610ed4565b34801561078f57600080fd5b506104eb61079e36600461309f565b610f5d565b3480156107af57600080fd5b50600e54610513906001600160a01b031681565b3480156107cf57600080fd5b506104eb6107de366004613056565b610fa8565b3480156107ef57600080fd5b506104eb6107fe36600461309f565b6110a9565b34801561080f57600080fd5b506104eb61081e36600461309f565b6110cc565b34801561082f57600080fd5b506103f4601d5481565b34801561084557600080fd5b506104eb611109565b34801561085a57600080fd5b506103f4610869366004613056565b611191565b34801561087a57600080fd5b506104eb6111ac565b34801561088f57600080fd5b50600d54610513906001600160a01b031681565b3480156108af57600080fd5b506104eb6108be366004613056565b61122c565b3480156108cf57600080fd5b5061049b6108de366004613056565b6115d2565b3480156108ef57600080fd5b5060055461010090046001600160a01b0316610513565b34801561091257600080fd5b506104eb610921366004613056565b611641565b34801561093257600080fd5b5061045e611725565b34801561094757600080fd5b506103f4601b5481565b34801561095d57600080fd5b506104eb61096c366004613163565b611734565b34801561097d57600080fd5b506103f460295481565b34801561099357600080fd5b5061049b6109a2366004613073565b61180a565b3480156109b357600080fd5b5061049b6109c2366004613073565b611859565b3480156109d357600080fd5b506104eb6109e2366004613163565b611866565b3480156109f357600080fd5b50601154610513906001600160a01b031681565b348015610a1357600080fd5b506103f4601a5481565b348015610a2957600080fd5b506104eb610a38366004613056565b6118fe565b348015610a4957600080fd5b5061049b610a58366004613056565b600a6020526000908152604090205460ff1681565b348015610a7957600080fd5b506104eb610a88366004613207565b611960565b348015610a9957600080fd5b506103f460265481565b348015610aaf57600080fd5b5060255461049b9060ff1681565b348015610ac957600080fd5b50600f54610513906001600160a01b031681565b348015610ae957600080fd5b506103f4601e5481565b348015610aff57600080fd5b506103f4610b0e3660046132a6565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610b4557600080fd5b506103f460285481565b348015610b5b57600080fd5b506104eb610b6a366004613056565b6119f8565b348015610b7b57600080fd5b506103f4601f5481565b348015610b9157600080fd5b506104eb610ba0366004613056565b611a89565b348015610bb157600080fd5b506103f460165481565b606060038054610bca906132d4565b80601f0160208091040260200160405190810160405280929190818152602001828054610bf6906132d4565b8015610c435780601f10610c1857610100808354040283529160200191610c43565b820191906000526020600020905b815481529060010190602001808311610c2657829003601f168201915b5050505050905090565b6000610c5a338484611beb565b5060015b92915050565b6005546001600160a01b03610100909104163314610c9d5760405162461bcd60e51b8152600401610c949061330e565b60405180910390fd5b60065460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db0906024015b600060405180830381600087803b158015610ce557600080fd5b505af1158015610cf9573d6000803e3d6000fd5b5050505050565b6005546001600160a01b03610100909104163314610d305760405162461bcd60e51b8152600401610c949061330e565b6001600160a01b03811660009081526007602052604081205460ff1615159003610dbb5760405162461bcd60e51b815260206004820152603660248201527f53504143454150453a204163636f756e7420697320616c726561647920696e636044820152756c75646564202f206e6f7420276578636c756465642760501b6064820152608401610c94565b6001600160a01b03166000908152600760205260409020805460ff19169055565b6005546001600160a01b03610100909104163314610e0c5760405162461bcd60e51b8152600401610c949061330e565b6001811015610e1a57600080fd5b6016819055610e27611d10565b50565b6000610e37848484611d6e565b610e898433610e84856040518060600160405280602881526020016136c8602891396001600160a01b038a16600090815260016020908152604080832033845290915290205491906125f1565b611beb565b5060019392505050565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610c5a918590610e849086611b85565b610e27335b82612628565b6005546001600160a01b03610100909104163314610f045760405162461bcd60e51b8152600401610c949061330e565b600f80546001600160a01b03199081166001600160a01b039687161790915560108054821694861694909417909355600e805490931691841691909117909155166000908152600960205260409020805460ff19169055565b6005546001600160a01b03610100909104163314610f8d5760405162461bcd60e51b8152600401610c949061330e565b6001811015610f9b57600080fd5b6023819055610e27611d10565b6005546001600160a01b03610100909104163314610fd85760405162461bcd60e51b8152600401610c949061330e565b600b546001600160a01b039081169082160361104c5760405162461bcd60e51b815260206004820152602d60248201527f53504143454150453a2054686520726f7574657220616c72656164792068617360448201526c2074686174206164647265737360981b6064820152608401610c94565b600b546040516001600160a01b03918216918316907f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e90600090a3600b80546001600160a01b0319166001600160a01b0392909216919091179055565b60006110bd82670de0b6b3a7640000612733565b90506110c833610ece565b5050565b6005546001600160a01b036101009091041633146110fc5760405162461bcd60e51b8152600401610c949061330e565b6024819055610e27611d10565b6005546001600160a01b036101009091041633146111395760405162461bcd60e51b8152600401610c949061330e565b60255460ff1661118b5760405162461bcd60e51b815260206004820152601860248201527f54726164696e6720616c7265616479206c61756e6368656400000000000000006044820152606401610c94565b42602b55565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b036101009091041633146111dc5760405162461bcd60e51b8152600401610c949061330e565b60055460405160009161010090046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a360058054610100600160a81b0319169055565b6005546001600160a01b0361010090910416331461125c5760405162461bcd60e51b8152600401610c949061330e565b6006546001600160a01b03908116908216036112e05760405162461bcd60e51b815260206004820152603760248201527f53504143454150453a20546865206469766964656e6420747261636b6572206160448201527f6c726561647920686173207468617420616464726573730000000000000000006064820152608401610c94565b6000819050306001600160a01b0316816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561132d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113519190613343565b6001600160a01b0316146113e15760405162461bcd60e51b815260206004820152604b60248201527f53504143454150453a20546865206e6577206469766964656e6420747261636b60448201527f6572206d757374206265206f776e656420627920746865202441504520746f6b60648201526a195b8818dbdb9d1c9858dd60aa1b608482015260a401610c94565b60405163031e79db60e41b81526001600160a01b03821660048201819052906331e79db090602401600060405180830381600087803b15801561142357600080fd5b505af1158015611437573d6000803e3d6000fd5b505060405163031e79db60e41b81523060048201526001600160a01b03841692506331e79db09150602401600060405180830381600087803b15801561147c57600080fd5b505af1158015611490573d6000803e3d6000fd5b50505050806001600160a01b03166331e79db06114bb6005546001600160a01b036101009091041690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b1580156114fc57600080fd5b505af1158015611510573d6000803e3d6000fd5b5050600b5460405163031e79db60e41b81526001600160a01b03918216600482015290841692506331e79db09150602401600060405180830381600087803b15801561155b57600080fd5b505af115801561156f573d6000803e3d6000fd5b50506006546040516001600160a01b03918216935090851691507f90c7d74461c613da5efa97d90740869367d74ab3aa5837aa4ae9a975f954b7a890600090a3600680546001600160a01b0319166001600160a01b039290921691909117905550565b600654604051634fcdeee760e01b81526001600160a01b0383811660048301526000921690634fcdeee790602401602060405180830381865afa15801561161d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c5e9190613360565b6005546001600160a01b036101009091041633146116715760405162461bcd60e51b8152600401610c949061330e565b6012546001600160a01b03908116908216036116ee5760405162461bcd60e51b815260206004820152603660248201527f53504143454150453a20546865206c69717569646974792077616c6c657420696044820152757320616c72656164792074686973206164647265737360501b6064820152608401610c94565b6001600160a01b03166000818152600760205260409020805460ff19166001179055601280546001600160a01b0319169091179055565b606060048054610bca906132d4565b6005546001600160a01b036101009091041633146117645760405162461bcd60e51b8152600401610c949061330e565b600c546001600160a01b03908116908316036118005760405162461bcd60e51b815260206004820152604f60248201527f53504143454150453a205468652050616e63616b65537761702070616972206360448201527f616e6e6f742062652072656d6f7665642066726f6d206175746f6d617465644d60648201526e61726b65744d616b6572506169727360881b608482015260a401610c94565b6110c882826127b5565b6000610c5a3384610e84856040518060600160405280602581526020016136f0602591393360009081526001602090815260408083206001600160a01b038d16845290915290205491906125f1565b6000610c5a338484611d6e565b6005546001600160a01b036101009091041633146118965760405162461bcd60e51b8152600401610c949061330e565b6001600160a01b03821660009081526008602052604090205460ff1615156001036118d35760405162461bcd60e51b8152600401610c949061337d565b6001600160a01b03919091166000908152600860205260409020805460ff1916911515919091179055565b6005546001600160a01b0361010090910416331461192e5760405162461bcd60e51b8152600401610c949061330e565b60065460405163c0f306ef60e01b81526001600160a01b0383811660048301529091169063c0f306ef90602401610ccb565b6005546001600160a01b036101009091041633146119905760405162461bcd60e51b8152600401610c949061330e565b60005b81518110156110c8576001600960008484815181106119b4576119b46133d1565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055806119f0816133fd565b915050611993565b6005546001600160a01b03610100909104163314611a285760405162461bcd60e51b8152600401610c949061330e565b6001600160a01b03811660009081526007602052604090205460ff161515600103611a655760405162461bcd60e51b8152600401610c949061337d565b6001600160a01b03166000908152600760205260409020805460ff19166001179055565b6005546001600160a01b03610100909104163314611ab95760405162461bcd60e51b8152600401610c949061330e565b6001600160a01b038116611b1e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c94565b6005546040516001600160a01b0380841692610100900416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b600080611b928385613416565b905083811015611be45760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610c94565b9392505050565b6001600160a01b038316611c4d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610c94565b6001600160a01b038216611cae5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610c94565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6064602354601354611d229190613429565b611d2c9190613440565b601455602454601354611d40906005613429565b611d4a9190613440565b602855601654601354606491611d5f91613429565b611d699190613440565b601555565b6001600160a01b038316611d945760405162461bcd60e51b8152600401610c9490613462565b6001600160a01b038216611dba5760405162461bcd60e51b8152600401610c94906134a7565b60255460ff168015611de557506001600160a01b03831660009081526009602052604090205460ff16155b8015611e0a57506001600160a01b03821660009081526009602052604090205460ff16155b15611ed6576001602b5411611e575760405162461bcd60e51b8152602060048201526013602482015272151c98591a5b99c81b9bdd081cdd185c9d1959606a1b6044820152606401610c94565b602b546101a490600090611e6b9083611b85565b905080421015611ec95760405162461bcd60e51b8152602060048201526024808201527f53504143454150453a2054726164696e67206973206e6f7420656e61626c6564604482015263081e595d60e21b6064820152608401610c94565b50506025805460ff191690555b6005546001600160a01b038481166101009092041614801590611f0c57506005546001600160a01b038381166101009092041614155b8015611f2057506001600160a01b03821615155b8015611f3757506001600160a01b03821661dead14155b8015611f4d5750600554600160a81b900460ff16155b15612179576001600160a01b0383166000908152600a602052604090205460ff168015611f9357506001600160a01b03821660009081526008602052604090205460ff16155b8015611fb857506001600160a01b0382166000908152600a602052604090205460ff16155b1561201c57601554611fc983611191565b611fd39083613416565b11156120175760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610c94565b612179565b6001600160a01b0382166000908152600a602052604090205460ff16801561205d57506001600160a01b03831660009081526008602052604090205460ff16155b801561208257506001600160a01b0383166000908152600a602052604090205460ff16155b156120ff576014548111156120175760405162461bcd60e51b815260206004820152603a60248201527f53656c6c207472616e7366657220616d6f756e7420657863656564732074686560448201527f206d617853656c6c5472616e73616374696f6e416d6f756e742e0000000000006064820152608401610c94565b6001600160a01b03821660009081526008602052604090205460ff166121795760155461212b83611191565b6121359083613416565b11156121795760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610c94565b806000036121925761218d83836000612933565b505050565b6001600160a01b03831660009081526007602052604081205460ff16806121d157506001600160a01b03831660009081526007602052604090205460ff165b600554909150600160a81b900460ff161580156121ec575080155b1561226a5760006121fc30611191565b9050602854811061226857600554600160a81b900460ff1615801561223a57506001600160a01b0385166000908152600a602052604090205460ff16155b15612268576005805460ff60a81b1916600160a81b17905561225a612a3c565b6005805460ff60a81b191690555b505b808061227f5750600554600160a81b900460ff165b156122945761228f848484612933565b612415565b60006122b76017546122b16018548661273390919063ffffffff16565b90612dd7565b905060006122d66018546122b1601a548561273390919063ffffffff16565b905060006122f56018546122b1601c548661273390919063ffffffff16565b6001600160a01b0387166000908152600a602052604090205490915060ff161561238c5761233e6123376017546122b1601d548961273390919063ffffffff16565b8490611b85565b5061236461235d6018546122b1601e548761273390919063ffffffff16565b8390611b85565b5061238a6123836018546122b16020548761273390919063ffffffff16565b8290611b85565b505b6026546123999083611b85565b60265582156123fd576123ad873085612933565b80156123cf576123bd3082612628565b6002546013556123cb611d10565b5060005b602a5460ff16156123fd57600c546026546123f79130916001600160a01b0390911690612933565b60006026555b612411878761240c8887612e32565b612933565b5050505b6006546001600160a01b031663e30443bc8561243081611191565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561247657600080fd5b505af115801561248a573d6000803e3d6000fd5b50506006546001600160a01b0316915063e30443bc9050846124ab81611191565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156124f157600080fd5b505af1158015612505573d6000803e3d6000fd5b5050600554600160a81b900460ff16159150508015612522575080155b156125eb576029546006546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c479906024016060604051808303816000875af1925050508015612594575060408051601f3d908101601f19168201909252612591918101906134ea565b60015b15610cf95760408051848152602081018490529081018290526060810185905232906001907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a3505050505b50505050565b600081848411156126155760405162461bcd60e51b8152600401610c949190612ff3565b506126208385613518565b949350505050565b6001600160a01b0382166126885760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610c94565b6126c581604051806060016040528060228152602001613680602291396001600160a01b03851660009081526020819052604090205491906125f1565b6001600160a01b0383166000908152602081905260409020556002546126eb9082612e32565b6002556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b60008260000361274557506000610c5e565b60006127518385613429565b90508261275e8583613440565b14611be45760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610c94565b6001600160a01b0382166000908152600a602052604090205481151560ff9091161515036128565760405162461bcd60e51b815260206004820152604260248201527f53504143454150453a204175746f6d61746564206d61726b6574206d616b657260448201527f207061697220697320616c72656164792073657420746f20746861742076616c606482015261756560f01b608482015260a401610c94565b6001600160a01b0382166000818152600a60205260409020805460ff19168315801591909117909155600c80546001600160a01b0319169092179091556128f75760065460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b1580156128de57600080fd5b505af11580156128f2573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6001600160a01b0383166129595760405162461bcd60e51b8152600401610c9490613462565b6001600160a01b03821661297f5760405162461bcd60e51b8152600401610c94906134a7565b6129bc816040518060600160405280602681526020016136a2602691396001600160a01b03861660009081526020819052604090205491906125f1565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546129eb9082611b85565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101611d03565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612a7157612a716133d1565b6001600160a01b03928316602091820292909201810191909152600b54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612aca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612aee9190613343565b81600181518110612b0157612b016133d1565b60200260200101906001600160a01b031690816001600160a01b0316815250506000612b2c30611191565b600b54909150612b479030906001600160a01b031683611beb565b600b546040516318cbafe560e01b815247916001600160a01b0316906318cbafe590612b8090859060009088903090429060040161356f565b6000604051808303816000875af1158015612b9f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612bc791908101906135ab565b506000612bd44783612e32565b90506000612be860646122b184602d612733565b90506000612c076017546122b16022548561273390919063ffffffff16565b90506000612c266017546122b16022548661273390919063ffffffff16565b90506000612c3e82612c388686612e32565b90612e32565b600e546040519192506001600160a01b03169082156108fc029083906000818181858888f19350505050158015612c79573d6000803e3d6000fd5b50600f546040516001600160a01b039091169084156108fc029085906000818181858888f19350505050158015612cb4573d6000803e3d6000fd5b506010546040516001600160a01b039091169083156108fc029084906000818181858888f19350505050158015612cef573d6000803e3d6000fd5b50612cf8612e8e565b600d546006546040516370a0823160e01b81526001600160a01b03918216600482015260009291909116906370a0823190602401602060405180830381865afa158015612d49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d6d9190613631565b600654604051638ac1f42560e01b8152600481018390529192506001600160a01b031690638ac1f42590602401600060405180830381600087803b158015612db457600080fd5b505af1158015612dc8573d6000803e3d6000fd5b50505050505050505050505050565b6000808211612e285760405162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f0000000000006044820152606401610c94565b611be48284613440565b600082821115612e845760405162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006044820152606401610c94565b611be48284613518565b6040805160028082526060820183526000926020830190803683375050600b54604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015612ef8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f1c9190613343565b81600081518110612f2f57612f2f6133d1565b6001600160a01b039283166020918202929092010152600d54825191169082906001908110612f6057612f606133d1565b6001600160a01b039283166020918202929092010152600b54600654604051637ff36ab560e01b815291831692637ff36ab5924792612fac92600092889290911690429060040161364a565b60006040518083038185885af1158015612fca573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f191682016040526110c891908101906135ab565b600060208083528351808285015260005b8181101561302057858101830151858201604001528201613004565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610e2757600080fd5b60006020828403121561306857600080fd5b8135611be481613041565b6000806040838503121561308657600080fd5b823561309181613041565b946020939093013593505050565b6000602082840312156130b157600080fd5b5035919050565b6000806000606084860312156130cd57600080fd5b83356130d881613041565b925060208401356130e881613041565b929592945050506040919091013590565b6000806000806080858703121561310f57600080fd5b843561311a81613041565b9350602085013561312a81613041565b9250604085013561313a81613041565b9150606085013561314a81613041565b939692955090935050565b8015158114610e2757600080fd5b6000806040838503121561317657600080fd5b823561318181613041565b9150602083013561319181613155565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156131db576131db61319c565b604052919050565b600067ffffffffffffffff8211156131fd576131fd61319c565b5060051b60200190565b6000602080838503121561321a57600080fd5b823567ffffffffffffffff81111561323157600080fd5b8301601f8101851361324257600080fd5b8035613255613250826131e3565b6131b2565b81815260059190911b8201830190838101908783111561327457600080fd5b928401925b8284101561329b57833561328c81613041565b82529284019290840190613279565b979650505050505050565b600080604083850312156132b957600080fd5b82356132c481613041565b9150602083013561319181613041565b600181811c908216806132e857607f821691505b60208210810361330857634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60006020828403121561335557600080fd5b8151611be481613041565b60006020828403121561337257600080fd5b8151611be481613155565b60208082526034908201527f53504143454150453a204163636f756e7420697320616c7265616479207468656040820152732076616c7565206f6620276578636c756465642760601b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001820161340f5761340f6133e7565b5060010190565b80820180821115610c5e57610c5e6133e7565b8082028115828204841417610c5e57610c5e6133e7565b60008261345d57634e487b7160e01b600052601260045260246000fd5b500490565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6000806000606084860312156134ff57600080fd5b8351925060208401519150604084015190509250925092565b81810381811115610c5e57610c5e6133e7565b600081518084526020808501945080840160005b838110156135645781516001600160a01b03168752958201959082019060010161353f565b509495945050505050565b85815284602082015260a06040820152600061358e60a083018661352b565b6001600160a01b0394909416606083015250608001529392505050565b600060208083850312156135be57600080fd5b825167ffffffffffffffff8111156135d557600080fd5b8301601f810185136135e657600080fd5b80516135f4613250826131e3565b81815260059190911b8201830190838101908783111561361357600080fd5b928401925b8284101561329b57835182529284019290840190613618565b60006020828403121561364357600080fd5b5051919050565b848152608060208201526000613663608083018661352b565b6001600160a01b0394909416604083015250606001529291505056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212200de0f0d3b55e188991b9f0ca9fac87845eee79208a6c20c0ee0ab97494cf3a3064736f6c6343000811003360c06040523480156200001157600080fd5b50604051620027f8380380620027f88339810160408190526200003491620001ab565b82828282826003620000478382620002c7565b506004620000568282620002c7565b50506005805460ff19166012179055506001600160a01b031660805250600090506200007f3390565b600b80546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35050610e106013555050655af3107a400060a05262000393565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200010e57600080fd5b81516001600160401b03808211156200012b576200012b620000e6565b604051601f8301601f19908116603f01168101908282118183101715620001565762000156620000e6565b816040528381526020925086838588010111156200017357600080fd5b600091505b8382101562000197578582018301518183018401529082019062000178565b600093810190920192909252949350505050565b600080600060608486031215620001c157600080fd5b83516001600160401b0380821115620001d957600080fd5b620001e787838801620000fc565b94506020860151915080821115620001fe57600080fd5b506200020d86828701620000fc565b604086015190935090506001600160a01b03811681146200022d57600080fd5b809150509250925092565b600181811c908216806200024d57607f821691505b6020821081036200026e57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620002c257600081815260208120601f850160051c810160208610156200029d5750805b601f850160051c820191505b81811015620002be57828155600101620002a9565b5050505b505050565b81516001600160401b03811115620002e357620002e3620000e6565b620002fb81620002f4845462000238565b8462000274565b602080601f8311600181146200033357600084156200031a5750858301515b600019600386901b1c1916600185901b178555620002be565b600085815260208120601f198616915b82811015620003645788860151825594840194600190910190840162000343565b5085821015620003835787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a051612431620003c7600039600081816106ca01526111e20152600081816103db0152611c7f01526124316000f3fe60806040526004361061023f5760003560e01c8063715018a61161012e578063bc4c4b37116100ab578063e7841ec01161006f578063e7841ec014610772578063e98030c714610787578063f2fde38b146107a7578063fbcbc0f1146107c7578063ffb2c479146107e757600080fd5b8063bc4c4b3714610698578063be10b614146106b8578063c0f306ef146106ec578063dd62ed3e1461070c578063e30443bc1461075257600080fd5b806395d89b41116100f257806395d89b41146105ed578063a457c2d714610602578063a8b9d24014610622578063a9059cbb14610642578063aafd847a1461066257600080fd5b8063715018a61461056457806385a6b3ae146105795780638ac1f4251461058f5780638da5cb5b146105af57806391b89fba146105cd57600080fd5b806331e79db0116101bc5780635183d6fd116101805780635183d6fd1461047e5780636843cd84146104e35780636a474002146105035780636f2789ec1461051857806370a082311461052e57600080fd5b806331e79db01461038957806339509351146103a9578063419dbf3b146103c95780634e7b827f146104155780634fcdeee71461044557600080fd5b8063226cfa3d11610203578063226cfa3d146102e457806323b872dd1461031157806327ce0147146103315780633009a60914610351578063313ce5671461036757600080fd5b806303c833021461024b57806306fdde0314610255578063095ea7b31461028057806309bbedde146102b057806318160ddd146102cf57600080fd5b3661024657005b600080fd5b610253610822565b005b34801561026157600080fd5b5061026a6108b5565b6040516102779190612063565b60405180910390f35b34801561028c57600080fd5b506102a061029b3660046120c6565b610947565b6040519015158152602001610277565b3480156102bc57600080fd5b50600c545b604051908152602001610277565b3480156102db57600080fd5b506002546102c1565b3480156102f057600080fd5b506102c16102ff3660046120f2565b60126020526000908152604090205481565b34801561031d57600080fd5b506102a061032c36600461210f565b61095e565b34801561033d57600080fd5b506102c161034c3660046120f2565b6109c7565b34801561035d57600080fd5b506102c160105481565b34801561037357600080fd5b5060055460405160ff9091168152602001610277565b34801561039557600080fd5b506102536103a43660046120f2565b610a23565b3480156103b557600080fd5b506102a06103c43660046120c6565b610b96565b3480156103d557600080fd5b506103fd7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610277565b34801561042157600080fd5b506102a06104303660046120f2565b60116020526000908152604090205460ff1681565b34801561045157600080fd5b506102a06104603660046120f2565b6001600160a01b031660009081526011602052604090205460ff1690565b34801561048a57600080fd5b5061049e610499366004612150565b610bcc565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e082015261010001610277565b3480156104ef57600080fd5b506102c16104fe3660046120f2565b610d20565b34801561050f57600080fd5b50610253610d3e565b34801561052457600080fd5b506102c160135481565b34801561053a57600080fd5b506102c16105493660046120f2565b6001600160a01b031660009081526020819052604090205490565b34801561057057600080fd5b50610253610de4565b34801561058557600080fd5b506102c1600a5481565b34801561059b57600080fd5b506102536105aa366004612150565b610e58565b3480156105bb57600080fd5b50600b546001600160a01b03166103fd565b3480156105d957600080fd5b506102c16105e83660046120f2565b610ed9565b3480156105f957600080fd5b5061026a610ee4565b34801561060e57600080fd5b506102a061061d3660046120c6565b610ef3565b34801561062e57600080fd5b506102c161063d3660046120f2565b610f42565b34801561064e57600080fd5b506102a061065d3660046120c6565b610f6e565b34801561066e57600080fd5b506102c161067d3660046120f2565b6001600160a01b031660009081526009602052604090205490565b3480156106a457600080fd5b506102a06106b3366004612177565b610f7b565b3480156106c457600080fd5b506102c17f000000000000000000000000000000000000000000000000000000000000000081565b3480156106f857600080fd5b506102536107073660046120f2565b611029565b34801561071857600080fd5b506102c16107273660046121b0565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801561075e57600080fd5b5061025361076d3660046120c6565b611196565b34801561077e57600080fd5b506010546102c1565b34801561079357600080fd5b506102536107a2366004612150565b61131e565b3480156107b357600080fd5b506102536107c23660046120f2565b611492565b3480156107d357600080fd5b5061049e6107e23660046120f2565b61157d565b3480156107f357600080fd5b50610807610802366004612150565b6116e6565b60408051938452602084019290925290820152606001610277565b600061082d60025490565b1161083757600080fd5b34156108b35761086a61084960025490565b61085734600160801b611803565b61086191906121f4565b6006549061188c565b60065560405134815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a2600a546108af903461188c565b600a555b565b6060600380546108c490612216565b80601f01602080910402602001604051908101604052809291908181526020018280546108f090612216565b801561093d5780601f106109125761010080835404028352916020019161093d565b820191906000526020600020905b81548152906001019060200180831161092057829003601f168201915b5050505050905090565b60006109543384846118eb565b5060015b92915050565b600061096b848484611a0f565b6109bd84336109b8856040518060600160405280602881526020016123af602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190611a6f565b6118eb565b5060019392505050565b6001600160a01b03811660009081526008602090815260408083205491839052822054600654600160801b92610a1992610a1492610a0e91610a099190611803565b611aa6565b90611ab6565b611af4565b61095891906121f4565b600b546001600160a01b03163314610a565760405162461bcd60e51b8152600401610a4d90612250565b60405180910390fd5b6001600160a01b03811660009081526011602052604090205460ff1615610abf5760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610a4d565b6001600160a01b0381166000908152601160205260408120805460ff19166001179055610aed908290611b07565b60405163131836e760e21b8152600c60048201526001600160a01b0382166024820152730349c2a6db6c3368d7066e3d2b20f395a64ee77d90634c60db9c9060440160006040518083038186803b158015610b4757600080fd5b505af4158015610b5b573d6000803e3d6000fd5b50506040516001600160a01b03841692507fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b259150600090a250565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916109549185906109b8908661188c565b600080600080600080600080600c730349c2a6db6c3368d7066e3d2b20f395a64ee77d63deb3d89690916040518263ffffffff1660e01b8152600401610c1491815260200190565b602060405180830381865af4158015610c31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c559190612285565b8910610c7a575060009650600019955085945086935083925082915081905080610d15565b6040516368d54f3f60e11b8152600c6004820152602481018a9052600090730349c2a6db6c3368d7066e3d2b20f395a64ee77d9063d1aa9e7e90604401602060405180830381865af4158015610cd4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cf8919061229e565b9050610d038161157d565b98509850985098509850985098509850505b919395975091939597565b6001600160a01b038116600090815260208190526040812054610958565b60405162461bcd60e51b815260206004820152606960248201527f53504143454150455f4469766964656e645f547261636b65723a20776974686460448201527f7261774469766964656e642064697361626c65642e205573652074686520276360648201527f6c61696d272066756e6374696f6e206f6e20746865206d61696e20244150452060848201526831b7b73a3930b1ba1760b91b60a482015260c401610a4d565b600b546001600160a01b03163314610e0e5760405162461bcd60e51b8152600401610a4d90612250565b600b546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600b80546001600160a01b0319169055565b6000610e6360025490565b11610e6d57600080fd5b8015610ed657610e8d610e7f60025490565b61085783600160801b611803565b60065560405181815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a2600a54610ed2908261188c565b600a555b50565b600061095882610f42565b6060600480546108c490612216565b600061095433846109b8856040518060600160405280602581526020016123d7602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190611a6f565b6001600160a01b03811660009081526009602052604081205461095890610f68846109c7565b90611b6c565b6000610954338484611a0f565b600b546000906001600160a01b03163314610fa85760405162461bcd60e51b8152600401610a4d90612250565b6000610fb384611bc8565b9050801561101f576001600160a01b038416600081815260126020526040908190204290555184151591907fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf0929061100d9085815260200190565b60405180910390a36001915050610958565b5060009392505050565b600b546001600160a01b031633146110535760405162461bcd60e51b8152600401610a4d90612250565b6001600160a01b03811660009081526011602052604090205460ff166110bb5760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c726561647920696e636c7564656400000000006044820152606401610a4d565b6001600160a01b0381166000908152601160205260408120805460ff191690556110e6908290611b07565b604051632f0ad01760e21b8152600c60048201526001600160a01b038216602482015260006044820152730349c2a6db6c3368d7066e3d2b20f395a64ee77d9063bc2b405c9060640160006040518083038186803b15801561114757600080fd5b505af415801561115b573d6000803e3d6000fd5b50506040516001600160a01b03841692507f40a78dcf8526b72f2eaf598af1c7e49c8d5fc577f6c8f1bed887f3e4dfa289329150600090a250565b600b546001600160a01b031633146111c05760405162461bcd60e51b8152600401610a4d90612250565b6001600160a01b03821660009081526011602052604090205460ff1661131a577f0000000000000000000000000000000000000000000000000000000000000000811061128f576112118282611b07565b604051632f0ad01760e21b8152600c60048201526001600160a01b038316602482015260448101829052730349c2a6db6c3368d7066e3d2b20f395a64ee77d9063bc2b405c9060640160006040518083038186803b15801561127257600080fd5b505af4158015611286573d6000803e3d6000fd5b5050505061130d565b61129a826000611b07565b60405163131836e760e21b8152600c60048201526001600160a01b0383166024820152730349c2a6db6c3368d7066e3d2b20f395a64ee77d90634c60db9c9060440160006040518083038186803b1580156112f457600080fd5b505af4158015611308573d6000803e3d6000fd5b505050505b611318826001610f7b565b505b5050565b600b546001600160a01b031633146113485760405162461bcd60e51b8152600401610a4d90612250565b610e10811015801561135d5750620151808111155b6113e65760405162461bcd60e51b815260206004820152604e60248201527f53504143454150455f4469766964656e645f547261636b65723a20636c61696d60448201527f57616974206d757374206265207570646174656420746f206265747765656e2060648201526d3120616e6420323420686f75727360901b608482015260a401610a4d565b601354810361145f576040805162461bcd60e51b81526020600482015260248101919091527f53504143454150455f4469766964656e645f547261636b65723a2043616e6e6f60448201527f742075706461746520636c61696d5761697420746f2073616d652076616c75656064820152608401610a4d565b60135460405182907f474ea64804364a1e29a4487ddb63c3342a2dd826ccd8acf48825e680a0e6f20f90600090a3601355565b600b546001600160a01b031633146114bc5760405162461bcd60e51b8152600401610a4d90612250565b6001600160a01b0381166115215760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a4d565b600b546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516317e142d160e01b8152600c60048201526001600160a01b03821660248201528190600090819081908190819081908190730349c2a6db6c3368d7066e3d2b20f395a64ee77d906317e142d190604401602060405180830381865af41580156115ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116119190612285565b96506000199550600087126116735760105487111561163f57601054611638908890611d4d565b9550611673565b601054600c5460009110611654576000611663565b601054600c5461166391611b6c565b905061166f8882611ab6565b9650505b61167c88610f42565b9450611687886109c7565b6001600160a01b0389166000908152601260205260409020549094509250826116b15760006116bf565b6013546116bf90849061188c565b91504282116116cf5760006116d9565b6116d98242611b6c565b9050919395975091939597565b600c5460009081908190808203611708575050601054600092508291506117fc565b6010546000805a90506000805b898410801561172357508582105b156117eb5784611732816122bb565b600c549096508610905061174557600094505b6000600c600001868154811061175d5761175d6122d4565b60009182526020808320909101546001600160a01b0316808352601290915260409091205490915061178e90611d99565b156117b15761179e816001610f7b565b156117b157816117ad816122bb565b9250505b826117bb816122bb565b93505060005a9050808511156117e2576117df6117d88683611b6c565b879061188c565b95505b93506117159050565b601085905590975095509193505050505b9193909250565b60008260000361181557506000610958565b600061182183856122ea565b90508261182e85836121f4565b146118855760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610a4d565b9392505050565b6000806118998385612301565b9050838110156118855760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610a4d565b6001600160a01b03831661194d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610a4d565b6001600160a01b0382166119ae5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610a4d565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60405162461bcd60e51b815260206004820152602f60248201527f53504143454150455f4469766964656e645f547261636b65723a204e6f20747260448201526e185b9cd9995c9cc8185b1b1bddd959608a1b6064820152608401610a4d565b60008184841115611a935760405162461bcd60e51b8152600401610a4d9190612063565b50611a9e8385612314565b949350505050565b6000818181121561095857600080fd5b600080611ac38385612327565b905060008312158015611ad65750838112155b80611aeb5750600083128015611aeb57508381125b61188557600080fd5b600080821215611b0357600080fd5b5090565b6001600160a01b03821660009081526020819052604090205480821115611b46576000611b348383611b6c565b9050611b408482611dc0565b50611318565b80821015611318576000611b5a8284611b6c565b9050611b668482611e24565b50505050565b600082821115611bbe5760405162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006044820152606401610a4d565b6118858284612314565b600080611bd483610f42565b90508015611d44576001600160a01b038316600090815260096020526040902054611bff908261188c565b6001600160a01b038416600081815260096020526040908190209290925590517fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d90611c4e9084815260200190565b60405180910390a260405163a9059cbb60e01b81526001600160a01b038481166004830152602482018390526000917f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016020604051808303816000875af1158015611cca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cee919061234f565b905080611d3d576001600160a01b038416600090815260096020526040902054611d189083611b6c565b6001600160a01b03909416600090815260096020526040812094909455509192915050565b5092915050565b50600092915050565b6000808212158015611d68575082611d65838261236c565b13155b80611d865750600082128015611d86575082611d84838261236c565b135b611d8f57600080fd5b611885828461236c565b600042821115611dab57506000919050565b601354611db84284611b6c565b101592915050565b611dca8282611e68565b611e04611de5610a098360065461180390919063ffffffff16565b6001600160a01b03841660009081526008602052604090205490611d4d565b6001600160a01b0390921660009081526008602052604090209190915550565b611e2e8282611f53565b611e04611e49610a098360065461180390919063ffffffff16565b6001600160a01b03841660009081526008602052604090205490611ab6565b6001600160a01b038216611ebe5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610a4d565b611eca60008383611318565b600254611ed7908261188c565b6002556001600160a01b038216600090815260208190526040902054611efd908261188c565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a35050565b6001600160a01b038216611fb35760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610a4d565b611fbf82600083611318565b611ffc8160405180606001604052806022815260200161238d602291396001600160a01b0385166000908152602081905260409020549190611a6f565b6001600160a01b0383166000908152602081905260409020556002546120229082611b6c565b6002556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001611f47565b600060208083528351808285015260005b8181101561209057858101830151858201604001528201612074565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610ed657600080fd5b600080604083850312156120d957600080fd5b82356120e4816120b1565b946020939093013593505050565b60006020828403121561210457600080fd5b8135611885816120b1565b60008060006060848603121561212457600080fd5b833561212f816120b1565b9250602084013561213f816120b1565b929592945050506040919091013590565b60006020828403121561216257600080fd5b5035919050565b8015158114610ed657600080fd5b6000806040838503121561218a57600080fd5b8235612195816120b1565b915060208301356121a581612169565b809150509250929050565b600080604083850312156121c357600080fd5b82356121ce816120b1565b915060208301356121a5816120b1565b634e487b7160e01b600052601160045260246000fd5b60008261221157634e487b7160e01b600052601260045260246000fd5b500490565b600181811c9082168061222a57607f821691505b60208210810361224a57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60006020828403121561229757600080fd5b5051919050565b6000602082840312156122b057600080fd5b8151611885816120b1565b6000600182016122cd576122cd6121de565b5060010190565b634e487b7160e01b600052603260045260246000fd5b8082028115828204841417610958576109586121de565b80820180821115610958576109586121de565b81810381811115610958576109586121de565b8082018281126000831280158216821582161715612347576123476121de565b505092915050565b60006020828403121561236157600080fd5b815161188581612169565b8181036000831280158383131683831282161715611d3d57611d3d6121de56fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212202efe860eb22e6755eb1e44d95bd62d08bbc58a7ff4a2bea8aacbc4b37c0a430764736f6c63430008110033

Deployed Bytecode

0x6080604052600436106103d25760003560e01c80636d1b229d116101fd578063a9059cbb11610118578063c3ec2a25116100ab578063e2f456051161007a578063e2f4560514610b39578063e57f14e114610b4f578063ea99fd8914610b6f578063f2fde38b14610b85578063f8b45b0514610ba557600080fd5b8063c3ec2a2514610aa3578063cf0bbb5d14610abd578063cfc634d814610add578063dd62ed3e14610af357600080fd5b8063b609995e116100e7578063b609995e14610a1d578063b62496f514610a3d578063bf4c190214610a6d578063c3926a2914610a8d57600080fd5b8063a9059cbb146109a7578063ac819f54146109c7578063acb172ad146109e7578063b068375514610a0757600080fd5b806388f820201161019057806397dfbb851161015f57806397dfbb851461093b5780639a7a23d6146109515780639c1b8af514610971578063a457c2d71461098757600080fd5b806388f82020146108c35780638da5cb5b146108e357806394879c841461090657806395d89b411461092657600080fd5b806370a08231116101cc57806370a082311461084e578063715018a61461086e5780637853d3191461088357806388bdd9be146108a357600080fd5b80636d1b229d146107e35780636d2558ca146108035780636f5fc73b146108235780636fc61a091461083957600080fd5b806323b872dd116102ed5780634559b60611610280578063598353941161024f57806359835394146107635780635dc083151461078357806361d027b3146107a357806365b8dbc0146107c357600080fd5b80634559b606146106d05780634739b8f4146106ea57806349bd5a5e1461070a5780634fbee1931461072a57600080fd5b8063354c94fb116102bc578063354c94fb1461065a578063395093511461067a5780633b13cc161461069a57806342966c68146106b057600080fd5b806323b872dd146105e257806325b61703146106025780632c1f521614610618578063313ce5671461063857600080fd5b8063122fe685116103655780631943d388116103345780631943d388146105805780631977e99c146105965780631aac33f7146105ac5780631c499ab0146105c257600080fd5b8063122fe685146104ed5780631694505e1461052b57806316a2f82a1461054b57806318160ddd1461056b57600080fd5b806306fdde03116103a157806306fdde03146104495780630855f25d1461046b578063095ea7b3146104ab578063111e0376146104cb57600080fd5b806302259e9e146103de578063023ad5811461040757806303807ee51461041d578063047fc9aa1461043357600080fd5b366103d957005b600080fd5b3480156103ea57600080fd5b506103f460145481565b6040519081526020015b60405180910390f35b34801561041357600080fd5b506103f460155481565b34801561042957600080fd5b506103f4601c5481565b34801561043f57600080fd5b506103f460135481565b34801561045557600080fd5b5061045e610bbb565b6040516103fe9190612ff3565b34801561047757600080fd5b5061049b610486366004613056565b60086020526000908152604090205460ff1681565b60405190151581526020016103fe565b3480156104b757600080fd5b5061049b6104c6366004613073565b610c4d565b3480156104d757600080fd5b506104eb6104e6366004613056565b610c64565b005b3480156104f957600080fd5b50602a54610513906201000090046001600160a01b031681565b6040516001600160a01b0390911681526020016103fe565b34801561053757600080fd5b50600b54610513906001600160a01b031681565b34801561055757600080fd5b506104eb610566366004613056565b610d00565b34801561057757600080fd5b506002546103f4565b34801561058c57600080fd5b506103f460195481565b3480156105a257600080fd5b506103f460185481565b3480156105b857600080fd5b506103f460205481565b3480156105ce57600080fd5b506104eb6105dd36600461309f565b610ddc565b3480156105ee57600080fd5b5061049b6105fd3660046130b8565b610e2a565b34801561060e57600080fd5b506103f4602b5481565b34801561062457600080fd5b50600654610513906001600160a01b031681565b34801561064457600080fd5b5060055460405160ff90911681526020016103fe565b34801561066657600080fd5b50601054610513906001600160a01b031681565b34801561068657600080fd5b5061049b610695366004613073565b610e93565b3480156106a657600080fd5b506103f460235481565b3480156106bc57600080fd5b506104eb6106cb36600461309f565b610ec9565b3480156106dc57600080fd5b50602a5461049b9060ff1681565b3480156106f657600080fd5b50601254610513906001600160a01b031681565b34801561071657600080fd5b50600c54610513906001600160a01b031681565b34801561073657600080fd5b5061049b610745366004613056565b6001600160a01b031660009081526007602052604090205460ff1690565b34801561076f57600080fd5b506104eb61077e3660046130f9565b610ed4565b34801561078f57600080fd5b506104eb61079e36600461309f565b610f5d565b3480156107af57600080fd5b50600e54610513906001600160a01b031681565b3480156107cf57600080fd5b506104eb6107de366004613056565b610fa8565b3480156107ef57600080fd5b506104eb6107fe36600461309f565b6110a9565b34801561080f57600080fd5b506104eb61081e36600461309f565b6110cc565b34801561082f57600080fd5b506103f4601d5481565b34801561084557600080fd5b506104eb611109565b34801561085a57600080fd5b506103f4610869366004613056565b611191565b34801561087a57600080fd5b506104eb6111ac565b34801561088f57600080fd5b50600d54610513906001600160a01b031681565b3480156108af57600080fd5b506104eb6108be366004613056565b61122c565b3480156108cf57600080fd5b5061049b6108de366004613056565b6115d2565b3480156108ef57600080fd5b5060055461010090046001600160a01b0316610513565b34801561091257600080fd5b506104eb610921366004613056565b611641565b34801561093257600080fd5b5061045e611725565b34801561094757600080fd5b506103f4601b5481565b34801561095d57600080fd5b506104eb61096c366004613163565b611734565b34801561097d57600080fd5b506103f460295481565b34801561099357600080fd5b5061049b6109a2366004613073565b61180a565b3480156109b357600080fd5b5061049b6109c2366004613073565b611859565b3480156109d357600080fd5b506104eb6109e2366004613163565b611866565b3480156109f357600080fd5b50601154610513906001600160a01b031681565b348015610a1357600080fd5b506103f4601a5481565b348015610a2957600080fd5b506104eb610a38366004613056565b6118fe565b348015610a4957600080fd5b5061049b610a58366004613056565b600a6020526000908152604090205460ff1681565b348015610a7957600080fd5b506104eb610a88366004613207565b611960565b348015610a9957600080fd5b506103f460265481565b348015610aaf57600080fd5b5060255461049b9060ff1681565b348015610ac957600080fd5b50600f54610513906001600160a01b031681565b348015610ae957600080fd5b506103f4601e5481565b348015610aff57600080fd5b506103f4610b0e3660046132a6565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610b4557600080fd5b506103f460285481565b348015610b5b57600080fd5b506104eb610b6a366004613056565b6119f8565b348015610b7b57600080fd5b506103f4601f5481565b348015610b9157600080fd5b506104eb610ba0366004613056565b611a89565b348015610bb157600080fd5b506103f460165481565b606060038054610bca906132d4565b80601f0160208091040260200160405190810160405280929190818152602001828054610bf6906132d4565b8015610c435780601f10610c1857610100808354040283529160200191610c43565b820191906000526020600020905b815481529060010190602001808311610c2657829003601f168201915b5050505050905090565b6000610c5a338484611beb565b5060015b92915050565b6005546001600160a01b03610100909104163314610c9d5760405162461bcd60e51b8152600401610c949061330e565b60405180910390fd5b60065460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db0906024015b600060405180830381600087803b158015610ce557600080fd5b505af1158015610cf9573d6000803e3d6000fd5b5050505050565b6005546001600160a01b03610100909104163314610d305760405162461bcd60e51b8152600401610c949061330e565b6001600160a01b03811660009081526007602052604081205460ff1615159003610dbb5760405162461bcd60e51b815260206004820152603660248201527f53504143454150453a204163636f756e7420697320616c726561647920696e636044820152756c75646564202f206e6f7420276578636c756465642760501b6064820152608401610c94565b6001600160a01b03166000908152600760205260409020805460ff19169055565b6005546001600160a01b03610100909104163314610e0c5760405162461bcd60e51b8152600401610c949061330e565b6001811015610e1a57600080fd5b6016819055610e27611d10565b50565b6000610e37848484611d6e565b610e898433610e84856040518060600160405280602881526020016136c8602891396001600160a01b038a16600090815260016020908152604080832033845290915290205491906125f1565b611beb565b5060019392505050565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610c5a918590610e849086611b85565b610e27335b82612628565b6005546001600160a01b03610100909104163314610f045760405162461bcd60e51b8152600401610c949061330e565b600f80546001600160a01b03199081166001600160a01b039687161790915560108054821694861694909417909355600e805490931691841691909117909155166000908152600960205260409020805460ff19169055565b6005546001600160a01b03610100909104163314610f8d5760405162461bcd60e51b8152600401610c949061330e565b6001811015610f9b57600080fd5b6023819055610e27611d10565b6005546001600160a01b03610100909104163314610fd85760405162461bcd60e51b8152600401610c949061330e565b600b546001600160a01b039081169082160361104c5760405162461bcd60e51b815260206004820152602d60248201527f53504143454150453a2054686520726f7574657220616c72656164792068617360448201526c2074686174206164647265737360981b6064820152608401610c94565b600b546040516001600160a01b03918216918316907f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e90600090a3600b80546001600160a01b0319166001600160a01b0392909216919091179055565b60006110bd82670de0b6b3a7640000612733565b90506110c833610ece565b5050565b6005546001600160a01b036101009091041633146110fc5760405162461bcd60e51b8152600401610c949061330e565b6024819055610e27611d10565b6005546001600160a01b036101009091041633146111395760405162461bcd60e51b8152600401610c949061330e565b60255460ff1661118b5760405162461bcd60e51b815260206004820152601860248201527f54726164696e6720616c7265616479206c61756e6368656400000000000000006044820152606401610c94565b42602b55565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b036101009091041633146111dc5760405162461bcd60e51b8152600401610c949061330e565b60055460405160009161010090046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a360058054610100600160a81b0319169055565b6005546001600160a01b0361010090910416331461125c5760405162461bcd60e51b8152600401610c949061330e565b6006546001600160a01b03908116908216036112e05760405162461bcd60e51b815260206004820152603760248201527f53504143454150453a20546865206469766964656e6420747261636b6572206160448201527f6c726561647920686173207468617420616464726573730000000000000000006064820152608401610c94565b6000819050306001600160a01b0316816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561132d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113519190613343565b6001600160a01b0316146113e15760405162461bcd60e51b815260206004820152604b60248201527f53504143454150453a20546865206e6577206469766964656e6420747261636b60448201527f6572206d757374206265206f776e656420627920746865202441504520746f6b60648201526a195b8818dbdb9d1c9858dd60aa1b608482015260a401610c94565b60405163031e79db60e41b81526001600160a01b03821660048201819052906331e79db090602401600060405180830381600087803b15801561142357600080fd5b505af1158015611437573d6000803e3d6000fd5b505060405163031e79db60e41b81523060048201526001600160a01b03841692506331e79db09150602401600060405180830381600087803b15801561147c57600080fd5b505af1158015611490573d6000803e3d6000fd5b50505050806001600160a01b03166331e79db06114bb6005546001600160a01b036101009091041690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b1580156114fc57600080fd5b505af1158015611510573d6000803e3d6000fd5b5050600b5460405163031e79db60e41b81526001600160a01b03918216600482015290841692506331e79db09150602401600060405180830381600087803b15801561155b57600080fd5b505af115801561156f573d6000803e3d6000fd5b50506006546040516001600160a01b03918216935090851691507f90c7d74461c613da5efa97d90740869367d74ab3aa5837aa4ae9a975f954b7a890600090a3600680546001600160a01b0319166001600160a01b039290921691909117905550565b600654604051634fcdeee760e01b81526001600160a01b0383811660048301526000921690634fcdeee790602401602060405180830381865afa15801561161d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c5e9190613360565b6005546001600160a01b036101009091041633146116715760405162461bcd60e51b8152600401610c949061330e565b6012546001600160a01b03908116908216036116ee5760405162461bcd60e51b815260206004820152603660248201527f53504143454150453a20546865206c69717569646974792077616c6c657420696044820152757320616c72656164792074686973206164647265737360501b6064820152608401610c94565b6001600160a01b03166000818152600760205260409020805460ff19166001179055601280546001600160a01b0319169091179055565b606060048054610bca906132d4565b6005546001600160a01b036101009091041633146117645760405162461bcd60e51b8152600401610c949061330e565b600c546001600160a01b03908116908316036118005760405162461bcd60e51b815260206004820152604f60248201527f53504143454150453a205468652050616e63616b65537761702070616972206360448201527f616e6e6f742062652072656d6f7665642066726f6d206175746f6d617465644d60648201526e61726b65744d616b6572506169727360881b608482015260a401610c94565b6110c882826127b5565b6000610c5a3384610e84856040518060600160405280602581526020016136f0602591393360009081526001602090815260408083206001600160a01b038d16845290915290205491906125f1565b6000610c5a338484611d6e565b6005546001600160a01b036101009091041633146118965760405162461bcd60e51b8152600401610c949061330e565b6001600160a01b03821660009081526008602052604090205460ff1615156001036118d35760405162461bcd60e51b8152600401610c949061337d565b6001600160a01b03919091166000908152600860205260409020805460ff1916911515919091179055565b6005546001600160a01b0361010090910416331461192e5760405162461bcd60e51b8152600401610c949061330e565b60065460405163c0f306ef60e01b81526001600160a01b0383811660048301529091169063c0f306ef90602401610ccb565b6005546001600160a01b036101009091041633146119905760405162461bcd60e51b8152600401610c949061330e565b60005b81518110156110c8576001600960008484815181106119b4576119b46133d1565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055806119f0816133fd565b915050611993565b6005546001600160a01b03610100909104163314611a285760405162461bcd60e51b8152600401610c949061330e565b6001600160a01b03811660009081526007602052604090205460ff161515600103611a655760405162461bcd60e51b8152600401610c949061337d565b6001600160a01b03166000908152600760205260409020805460ff19166001179055565b6005546001600160a01b03610100909104163314611ab95760405162461bcd60e51b8152600401610c949061330e565b6001600160a01b038116611b1e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c94565b6005546040516001600160a01b0380841692610100900416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b600080611b928385613416565b905083811015611be45760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610c94565b9392505050565b6001600160a01b038316611c4d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610c94565b6001600160a01b038216611cae5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610c94565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6064602354601354611d229190613429565b611d2c9190613440565b601455602454601354611d40906005613429565b611d4a9190613440565b602855601654601354606491611d5f91613429565b611d699190613440565b601555565b6001600160a01b038316611d945760405162461bcd60e51b8152600401610c9490613462565b6001600160a01b038216611dba5760405162461bcd60e51b8152600401610c94906134a7565b60255460ff168015611de557506001600160a01b03831660009081526009602052604090205460ff16155b8015611e0a57506001600160a01b03821660009081526009602052604090205460ff16155b15611ed6576001602b5411611e575760405162461bcd60e51b8152602060048201526013602482015272151c98591a5b99c81b9bdd081cdd185c9d1959606a1b6044820152606401610c94565b602b546101a490600090611e6b9083611b85565b905080421015611ec95760405162461bcd60e51b8152602060048201526024808201527f53504143454150453a2054726164696e67206973206e6f7420656e61626c6564604482015263081e595d60e21b6064820152608401610c94565b50506025805460ff191690555b6005546001600160a01b038481166101009092041614801590611f0c57506005546001600160a01b038381166101009092041614155b8015611f2057506001600160a01b03821615155b8015611f3757506001600160a01b03821661dead14155b8015611f4d5750600554600160a81b900460ff16155b15612179576001600160a01b0383166000908152600a602052604090205460ff168015611f9357506001600160a01b03821660009081526008602052604090205460ff16155b8015611fb857506001600160a01b0382166000908152600a602052604090205460ff16155b1561201c57601554611fc983611191565b611fd39083613416565b11156120175760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610c94565b612179565b6001600160a01b0382166000908152600a602052604090205460ff16801561205d57506001600160a01b03831660009081526008602052604090205460ff16155b801561208257506001600160a01b0383166000908152600a602052604090205460ff16155b156120ff576014548111156120175760405162461bcd60e51b815260206004820152603a60248201527f53656c6c207472616e7366657220616d6f756e7420657863656564732074686560448201527f206d617853656c6c5472616e73616374696f6e416d6f756e742e0000000000006064820152608401610c94565b6001600160a01b03821660009081526008602052604090205460ff166121795760155461212b83611191565b6121359083613416565b11156121795760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610c94565b806000036121925761218d83836000612933565b505050565b6001600160a01b03831660009081526007602052604081205460ff16806121d157506001600160a01b03831660009081526007602052604090205460ff165b600554909150600160a81b900460ff161580156121ec575080155b1561226a5760006121fc30611191565b9050602854811061226857600554600160a81b900460ff1615801561223a57506001600160a01b0385166000908152600a602052604090205460ff16155b15612268576005805460ff60a81b1916600160a81b17905561225a612a3c565b6005805460ff60a81b191690555b505b808061227f5750600554600160a81b900460ff165b156122945761228f848484612933565b612415565b60006122b76017546122b16018548661273390919063ffffffff16565b90612dd7565b905060006122d66018546122b1601a548561273390919063ffffffff16565b905060006122f56018546122b1601c548661273390919063ffffffff16565b6001600160a01b0387166000908152600a602052604090205490915060ff161561238c5761233e6123376017546122b1601d548961273390919063ffffffff16565b8490611b85565b5061236461235d6018546122b1601e548761273390919063ffffffff16565b8390611b85565b5061238a6123836018546122b16020548761273390919063ffffffff16565b8290611b85565b505b6026546123999083611b85565b60265582156123fd576123ad873085612933565b80156123cf576123bd3082612628565b6002546013556123cb611d10565b5060005b602a5460ff16156123fd57600c546026546123f79130916001600160a01b0390911690612933565b60006026555b612411878761240c8887612e32565b612933565b5050505b6006546001600160a01b031663e30443bc8561243081611191565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561247657600080fd5b505af115801561248a573d6000803e3d6000fd5b50506006546001600160a01b0316915063e30443bc9050846124ab81611191565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156124f157600080fd5b505af1158015612505573d6000803e3d6000fd5b5050600554600160a81b900460ff16159150508015612522575080155b156125eb576029546006546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c479906024016060604051808303816000875af1925050508015612594575060408051601f3d908101601f19168201909252612591918101906134ea565b60015b15610cf95760408051848152602081018490529081018290526060810185905232906001907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a3505050505b50505050565b600081848411156126155760405162461bcd60e51b8152600401610c949190612ff3565b506126208385613518565b949350505050565b6001600160a01b0382166126885760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610c94565b6126c581604051806060016040528060228152602001613680602291396001600160a01b03851660009081526020819052604090205491906125f1565b6001600160a01b0383166000908152602081905260409020556002546126eb9082612e32565b6002556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b60008260000361274557506000610c5e565b60006127518385613429565b90508261275e8583613440565b14611be45760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610c94565b6001600160a01b0382166000908152600a602052604090205481151560ff9091161515036128565760405162461bcd60e51b815260206004820152604260248201527f53504143454150453a204175746f6d61746564206d61726b6574206d616b657260448201527f207061697220697320616c72656164792073657420746f20746861742076616c606482015261756560f01b608482015260a401610c94565b6001600160a01b0382166000818152600a60205260409020805460ff19168315801591909117909155600c80546001600160a01b0319169092179091556128f75760065460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b1580156128de57600080fd5b505af11580156128f2573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6001600160a01b0383166129595760405162461bcd60e51b8152600401610c9490613462565b6001600160a01b03821661297f5760405162461bcd60e51b8152600401610c94906134a7565b6129bc816040518060600160405280602681526020016136a2602691396001600160a01b03861660009081526020819052604090205491906125f1565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546129eb9082611b85565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101611d03565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612a7157612a716133d1565b6001600160a01b03928316602091820292909201810191909152600b54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612aca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612aee9190613343565b81600181518110612b0157612b016133d1565b60200260200101906001600160a01b031690816001600160a01b0316815250506000612b2c30611191565b600b54909150612b479030906001600160a01b031683611beb565b600b546040516318cbafe560e01b815247916001600160a01b0316906318cbafe590612b8090859060009088903090429060040161356f565b6000604051808303816000875af1158015612b9f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612bc791908101906135ab565b506000612bd44783612e32565b90506000612be860646122b184602d612733565b90506000612c076017546122b16022548561273390919063ffffffff16565b90506000612c266017546122b16022548661273390919063ffffffff16565b90506000612c3e82612c388686612e32565b90612e32565b600e546040519192506001600160a01b03169082156108fc029083906000818181858888f19350505050158015612c79573d6000803e3d6000fd5b50600f546040516001600160a01b039091169084156108fc029085906000818181858888f19350505050158015612cb4573d6000803e3d6000fd5b506010546040516001600160a01b039091169083156108fc029084906000818181858888f19350505050158015612cef573d6000803e3d6000fd5b50612cf8612e8e565b600d546006546040516370a0823160e01b81526001600160a01b03918216600482015260009291909116906370a0823190602401602060405180830381865afa158015612d49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d6d9190613631565b600654604051638ac1f42560e01b8152600481018390529192506001600160a01b031690638ac1f42590602401600060405180830381600087803b158015612db457600080fd5b505af1158015612dc8573d6000803e3d6000fd5b50505050505050505050505050565b6000808211612e285760405162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f0000000000006044820152606401610c94565b611be48284613440565b600082821115612e845760405162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006044820152606401610c94565b611be48284613518565b6040805160028082526060820183526000926020830190803683375050600b54604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015612ef8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f1c9190613343565b81600081518110612f2f57612f2f6133d1565b6001600160a01b039283166020918202929092010152600d54825191169082906001908110612f6057612f606133d1565b6001600160a01b039283166020918202929092010152600b54600654604051637ff36ab560e01b815291831692637ff36ab5924792612fac92600092889290911690429060040161364a565b60006040518083038185885af1158015612fca573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f191682016040526110c891908101906135ab565b600060208083528351808285015260005b8181101561302057858101830151858201604001528201613004565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610e2757600080fd5b60006020828403121561306857600080fd5b8135611be481613041565b6000806040838503121561308657600080fd5b823561309181613041565b946020939093013593505050565b6000602082840312156130b157600080fd5b5035919050565b6000806000606084860312156130cd57600080fd5b83356130d881613041565b925060208401356130e881613041565b929592945050506040919091013590565b6000806000806080858703121561310f57600080fd5b843561311a81613041565b9350602085013561312a81613041565b9250604085013561313a81613041565b9150606085013561314a81613041565b939692955090935050565b8015158114610e2757600080fd5b6000806040838503121561317657600080fd5b823561318181613041565b9150602083013561319181613155565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156131db576131db61319c565b604052919050565b600067ffffffffffffffff8211156131fd576131fd61319c565b5060051b60200190565b6000602080838503121561321a57600080fd5b823567ffffffffffffffff81111561323157600080fd5b8301601f8101851361324257600080fd5b8035613255613250826131e3565b6131b2565b81815260059190911b8201830190838101908783111561327457600080fd5b928401925b8284101561329b57833561328c81613041565b82529284019290840190613279565b979650505050505050565b600080604083850312156132b957600080fd5b82356132c481613041565b9150602083013561319181613041565b600181811c908216806132e857607f821691505b60208210810361330857634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60006020828403121561335557600080fd5b8151611be481613041565b60006020828403121561337257600080fd5b8151611be481613155565b60208082526034908201527f53504143454150453a204163636f756e7420697320616c7265616479207468656040820152732076616c7565206f6620276578636c756465642760601b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001820161340f5761340f6133e7565b5060010190565b80820180821115610c5e57610c5e6133e7565b8082028115828204841417610c5e57610c5e6133e7565b60008261345d57634e487b7160e01b600052601260045260246000fd5b500490565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6000806000606084860312156134ff57600080fd5b8351925060208401519150604084015190509250925092565b81810381811115610c5e57610c5e6133e7565b600081518084526020808501945080840160005b838110156135645781516001600160a01b03168752958201959082019060010161353f565b509495945050505050565b85815284602082015260a06040820152600061358e60a083018661352b565b6001600160a01b0394909416606083015250608001529392505050565b600060208083850312156135be57600080fd5b825167ffffffffffffffff8111156135d557600080fd5b8301601f810185136135e657600080fd5b80516135f4613250826131e3565b81815260059190911b8201830190838101908783111561361357600080fd5b928401925b8284101561329b57835182529284019290840190613618565b60006020828403121561364357600080fd5b5051919050565b848152608060208201526000613663608083018661352b565b6001600160a01b0394909416604083015250606001529291505056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212200de0f0d3b55e188991b9f0ca9fac87845eee79208a6c20c0ee0ab97494cf3a3064736f6c63430008110033

Libraries Used


Deployed Bytecode Sourcemap

61042:18779:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61967:39;;;;;;;;;;;;;;;;;;;160:25:1;;;148:2;133:18;61967:39:0;;;;;;;;62013:29;;;;;;;;;;;;;;;;62295:30;;;;;;;;;;;;;;;;61937:21;;;;;;;;;;;;;;;;14835:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;61261:67::-;;;;;;;;;;-1:-1:-1;61261:67:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1302:14:1;;1295:22;1277:41;;1265:2;1250:18;61261:67:0;1137:187:1;17130:210:0;;;;;;;;;;-1:-1:-1;17130:210:0;;;;;:::i;:::-;;:::i;67727:150::-;;;;;;;;;;-1:-1:-1;67727:150:0;;;;;:::i;:::-;;:::i;:::-;;63453:42;;;;;;;;;;-1:-1:-1;63453:42:0;;;;;;;-1:-1:-1;;;;;63453:42:0;;;;;;-1:-1:-1;;;;;1813:32:1;;;1795:51;;1783:2;1768:18;63453:42:0;1649:203:1;61601:41:0;;;;;;;;;;-1:-1:-1;61601:41:0;;;;-1:-1:-1;;;;;61601:41:0;;;68447:264;;;;;;;;;;-1:-1:-1;68447:264:0;;;;;:::i;:::-;;:::i;15942:108::-;;;;;;;;;;-1:-1:-1;16030:12:0;;15942:108;;62162:38;;;;;;;;;;;;;;;;62124:31;;;;;;;;;;;;;;;;62466;;;;;;;;;;;;;;;;69887:153;;;;;;;;;;-1:-1:-1;69887:153:0;;;;;:::i;:::-;;:::i;17822:454::-;;;;;;;;;;-1:-1:-1;17822:454:0;;;;;:::i;:::-;;:::i;63504:38::-;;;;;;;;;;;;;;;;61150:43;;;;;;;;;;-1:-1:-1;61150:43:0;;;;-1:-1:-1;;;;;61150:43:0;;;15786:91;;;;;;;;;;-1:-1:-1;15860:9:0;;15786:91;;15860:9;;;;3125:36:1;;3113:2;3098:18;15786:91:0;2983:184:1;61822:19:0;;;;;;;;;;-1:-1:-1;61822:19:0;;;;-1:-1:-1;;;;;61822:19:0;;;18685:300;;;;;;;;;;-1:-1:-1;18685:300:0;;;;;:::i;:::-;;:::i;62583:37::-;;;;;;;;;;;;;;;;70671:85;;;;;;;;;;-1:-1:-1;70671:85:0;;;;;:::i;:::-;;:::i;62903:50::-;;;;;;;;;;-1:-1:-1;62903:50:0;;;;;;;;61900:28;;;;;;;;;;-1:-1:-1;61900:28:0;;;;-1:-1:-1;;;;;61900:28:0;;;61649;;;;;;;;;;-1:-1:-1;61649:28:0;;;;-1:-1:-1;;;;;61649:28:0;;;70048:126;;;;;;;;;;-1:-1:-1;70048:126:0;;;;;:::i;:::-;-1:-1:-1;;;;;70138:28:0;70114:4;70138:28;;;:19;:28;;;;;;;;;70048:126;69443:257;;;;;;;;;;-1:-1:-1;69443:257:0;;;;;:::i;:::-;;:::i;69708:171::-;;;;;;;;;;-1:-1:-1;69708:171:0;;;;;:::i;:::-;;:::i;61766:23::-;;;;;;;;;;-1:-1:-1;61766:23:0;;;;-1:-1:-1;;;;;61766:23:0;;;67232:354;;;;;;;;;;-1:-1:-1;67232:354:0;;;;;:::i;:::-;;:::i;79671:147::-;;;;;;;;;;-1:-1:-1;79671:147:0;;;;;:::i;:::-;;:::i;76423:150::-;;;;;;;;;;-1:-1:-1;76423:150:0;;;;;:::i;:::-;;:::i;62334:31::-;;;;;;;;;;;;;;;;69262:173;;;;;;;;;;;;;:::i;16113:177::-;;;;;;;;;;-1:-1:-1;16113:177:0;;;;;:::i;:::-;;:::i;24986:148::-;;;;;;;;;;;;;:::i;61686:71::-;;;;;;;;;;-1:-1:-1;61686:71:0;;;;-1:-1:-1;;;;;61686:71:0;;;66212:938;;;;;;;;;;-1:-1:-1;66212:938:0;;;;;:::i;:::-;;:::i;70182:147::-;;;;;;;;;;-1:-1:-1;70182:147:0;;;;;:::i;:::-;;:::i;24763:87::-;;;;;;;;;;-1:-1:-1;24836:6:0;;;;;-1:-1:-1;;;;;24836:6:0;24763:87;;70337:326;;;;;;;;;;-1:-1:-1;70337:326:0;;;;;:::i;:::-;;:::i;15045:95::-;;;;;;;;;;;;;:::i;62249:39::-;;;;;;;;;;;;;;;;78761:326;;;;;;;;;;-1:-1:-1;78761:326:0;;;;;:::i;:::-;;:::i;62854:40::-;;;;;;;;;;;;;;;;19488:400;;;;;;;;;;-1:-1:-1;19488:400:0;;;;;:::i;:::-;;:::i;16503:216::-;;;;;;;;;;-1:-1:-1;16503:216:0;;;;;:::i;:::-;;:::i;68719:339::-;;;;;;;;;;-1:-1:-1;68719:339:0;;;;;:::i;:::-;;:::i;61848:45::-;;;;;;;;;;-1:-1:-1;61848:45:0;;;;-1:-1:-1;;;;;61848:45:0;;;62207:35;;;;;;;;;;;;;;;;67885:146;;;;;;;;;;-1:-1:-1;67885:146:0;;;;;:::i;:::-;;:::i;61535:57::-;;;;;;;;;;-1:-1:-1;61535:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;69066:188;;;;;;;;;;-1:-1:-1;69066:188:0;;;;;:::i;:::-;;:::i;62740:31::-;;;;;;;;;;;;;;;;62691:40;;;;;;;;;;-1:-1:-1;62691:40:0;;;;;;;;61796:19;;;;;;;;;;-1:-1:-1;61796:19:0;;;;-1:-1:-1;;;;;61796:19:0;;;62372:36;;;;;;;;;;;;;;;;16782:201;;;;;;;;;;-1:-1:-1;16782:201:0;;;;;:::i;:::-;-1:-1:-1;;;;;16948:18:0;;;16916:7;16948:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;16782:201;62812:33;;;;;;;;;;;;;;;;68095:289;;;;;;;;;;-1:-1:-1;68095:289:0;;;;;:::i;:::-;;:::i;62415:44::-;;;;;;;;;;;;;;;;25142:281;;;;;;;;;;-1:-1:-1;25142:281:0;;;;;:::i;:::-;;:::i;62049:28::-;;;;;;;;;;;;;;;;14835:91;14880:13;14913:5;14906:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14835:91;:::o;17130:210::-;17249:4;17271:39;12505:10;17294:7;17303:6;17271:8;:39::i;:::-;-1:-1:-1;17328:4:0;17130:210;;;;;:::o;67727:150::-;24836:6;;-1:-1:-1;;;;;24836:6:0;;;;;12505:10;24898:23;24890:68;;;;-1:-1:-1;;;24890:68:0;;;;;;;:::i;:::-;;;;;;;;;67812:15:::1;::::0;:57:::1;::::0;-1:-1:-1;;;67812:57:0;;-1:-1:-1;;;;;1813:32:1;;;67812:57:0::1;::::0;::::1;1795:51:1::0;67812:15:0;;::::1;::::0;:36:::1;::::0;1768:18:1;;67812:57:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;67727:150:::0;:::o;68447:264::-;24836:6;;-1:-1:-1;;;;;24836:6:0;;;;;12505:10;24898:23;24890:68;;;;-1:-1:-1;;;24890:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;68537:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;::::1;;:37;;::::0;;68515:141:::1;;;::::0;-1:-1:-1;;;68515:141:0;;7270:2:1;68515:141:0::1;::::0;::::1;7252:21:1::0;7309:2;7289:18;;;7282:30;7348:34;7328:18;;;7321:62;-1:-1:-1;;;7399:18:1;;;7392:52;7461:19;;68515:141:0::1;7068:418:1::0;68515:141:0::1;-1:-1:-1::0;;;;;68667:28:0::1;68698:5;68667:28:::0;;;:19:::1;:28;::::0;;;;:36;;-1:-1:-1;;68667:36:0::1;::::0;;68447:264::o;69887:153::-;24836:6;;-1:-1:-1;;;;;24836:6:0;;;;;12505:10;24898:23;24890:68;;;;-1:-1:-1;;;24890:68:0;;;;;;;:::i;:::-;69976:1:::1;69966:6;:11;;69958:20;;;::::0;::::1;;69989:9;:18:::0;;;70018:14:::1;:12;:14::i;:::-;69887:153:::0;:::o;17822:454::-;17962:4;17979:36;17989:6;17997:9;18008:6;17979:9;:36::i;:::-;18026:220;18049:6;12505:10;18097:138;18153:6;18097:138;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18097:19:0;;;;;;:11;:19;;;;;;;;12505:10;18097:33;;;;;;;;;;:37;:138::i;:::-;18026:8;:220::i;:::-;-1:-1:-1;18264:4:0;17822:454;;;;;:::o;18685:300::-;12505:10;18800:4;18894:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;18894:34:0;;;;;;;;;;18800:4;;18822:133;;18872:7;;18894:50;;18933:10;18894:38;:50::i;70671:85::-;70721:27;12505:10;70727:12;70741:6;70721:5;:27::i;69443:257::-;24836:6;;-1:-1:-1;;;;;24836:6:0;;;;;12505:10;24898:23;24890:68;;;;-1:-1:-1;;;24890:68:0;;;;;;;:::i;:::-;69593:4:::1;:12:::0;;-1:-1:-1;;;;;;69593:12:0;;::::1;-1:-1:-1::0;;;;;69593:12:0;;::::1;;::::0;;;69616:4:::1;:12:::0;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;69639:8:::1;:15:::0;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;69667:17:::1;-1:-1:-1::0;69667:17:0;;;:9:::1;:17;::::0;;;;:25;;-1:-1:-1;;69667:25:0::1;::::0;;69443:257::o;69708:171::-;24836:6;;-1:-1:-1;;;;;24836:6:0;;;;;12505:10;24898:23;24890:68;;;;-1:-1:-1;;;24890:68:0;;;;;;;:::i;:::-;69806:1:::1;69796:6;:11;;69788:20;;;::::0;::::1;;69819:18;:27:::0;;;69857:14:::1;:12;:14::i;67232:354::-:0;24836:6;;-1:-1:-1;;;;;24836:6:0;;;;;12505:10;24898:23;24890:68;;;;-1:-1:-1;;;24890:68:0;;;;;;;:::i;:::-;67355:15:::1;::::0;-1:-1:-1;;;;;67355:15:0;;::::1;67333:38:::0;;::::1;::::0;67311:133:::1;;;::::0;-1:-1:-1;;;67311:133:0;;7693:2:1;67311:133:0::1;::::0;::::1;7675:21:1::0;7732:2;7712:18;;;7705:30;7771:34;7751:18;;;7744:62;-1:-1:-1;;;7822:18:1;;;7815:43;7875:19;;67311:133:0::1;7491:409:1::0;67311:133:0::1;67502:15;::::0;67460:59:::1;::::0;-1:-1:-1;;;;;67502:15:0;;::::1;::::0;67460:59;::::1;::::0;::::1;::::0;67502:15:::1;::::0;67460:59:::1;67530:15;:48:::0;;-1:-1:-1;;;;;;67530:48:0::1;-1:-1:-1::0;;;;;67530:48:0;;;::::1;::::0;;;::::1;::::0;;67232:354::o;79671:147::-;79727:19;79749:18;:6;79760;79749:10;:18::i;:::-;79727:40;-1:-1:-1;79778:32:0;12505:10;79784:12;12409:115;79778:32;79716:102;79671:147;:::o;76423:150::-;24836:6;;-1:-1:-1;;;;;24836:6:0;;;;;12505:10;24898:23;24890:68;;;;-1:-1:-1;;;24890:68:0;;;;;;;:::i;:::-;76508:14:::1;:32:::0;;;76551:14:::1;:12;:14::i;69262:173::-:0;24836:6;;-1:-1:-1;;;;;24836:6:0;;;;;12505:10;24898:23;24890:68;;;;-1:-1:-1;;;24890:68:0;;;;;;;:::i;:::-;69325:21:::1;::::0;::::1;;69317:58;;;::::0;-1:-1:-1;;;69317:58:0;;8107:2:1;69317:58:0::1;::::0;::::1;8089:21:1::0;8146:2;8126:18;;;8119:30;8185:26;8165:18;;;8158:54;8229:18;;69317:58:0::1;7905:348:1::0;69317:58:0::1;69412:15;69386:23;:41:::0;69262:173::o;16113:177::-;-1:-1:-1;;;;;16264:18:0;16232:7;16264:18;;;;;;;;;;;;16113:177::o;24986:148::-;24836:6;;-1:-1:-1;;;;;24836:6:0;;;;;12505:10;24898:23;24890:68;;;;-1:-1:-1;;;24890:68:0;;;;;;;:::i;:::-;25077:6:::1;::::0;25056:40:::1;::::0;25093:1:::1;::::0;25077:6:::1;::::0;::::1;-1:-1:-1::0;;;;;25077:6:0::1;::::0;25056:40:::1;::::0;25093:1;;25056:40:::1;25107:6;:19:::0;;-1:-1:-1;;;;;;25107:19:0::1;::::0;;24986:148::o;66212:938::-;24836:6;;-1:-1:-1;;;;;24836:6:0;;;;;12505:10;24898:23;24890:68;;;;-1:-1:-1;;;24890:68:0;;;;;;;:::i;:::-;66335:15:::1;::::0;-1:-1:-1;;;;;66335:15:0;;::::1;66313:38:::0;;::::1;::::0;66291:143:::1;;;::::0;-1:-1:-1;;;66291:143:0;;8460:2:1;66291:143:0::1;::::0;::::1;8442:21:1::0;8499:2;8479:18;;;8472:30;8538:34;8518:18;;;8511:62;8609:25;8589:18;;;8582:53;8652:19;;66291:143:0::1;8258:419:1::0;66291:143:0::1;66447:39;66532:10;66447:107;;66627:4;-1:-1:-1::0;;;;;66589:43:0::1;:18;-1:-1:-1::0;;;;;66589:24:0::1;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;66589:43:0::1;;66567:168;;;::::0;-1:-1:-1;;;66567:168:0;;9140:2:1;66567:168:0::1;::::0;::::1;9122:21:1::0;9179:2;9159:18;;;9152:30;9218:34;9198:18;;;9191:62;9289:34;9269:18;;;9262:62;-1:-1:-1;;;9340:19:1;;;9333:42;9392:19;;66567:168:0::1;8938:479:1::0;66567:168:0::1;66748:68;::::0;-1:-1:-1;;;66748:68:0;;-1:-1:-1;;;;;66748:39:0;::::1;:68;::::0;::::1;1795:51:1::0;;;66748:39:0;::::1;::::0;1768:18:1;;66748:68:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;66827:54:0::1;::::0;-1:-1:-1;;;66827:54:0;;66875:4:::1;66827:54;::::0;::::1;1795:51:1::0;-1:-1:-1;;;;;66827:39:0;::::1;::::0;-1:-1:-1;66827:39:0::1;::::0;-1:-1:-1;1768:18:1;;66827:54:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;66892:18;-1:-1:-1::0;;;;;66892:39:0::1;;66932:7;24836:6:::0;;-1:-1:-1;;;;;24836:6:0;;;;;;24763:87;66932:7:::1;66892:48;::::0;-1:-1:-1;;;;;;66892:48:0::1;::::0;;;;;;-1:-1:-1;;;;;1813:32:1;;;66892:48:0::1;::::0;::::1;1795:51:1::0;1768:18;;66892:48:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;66999:15:0::1;::::0;66951:65:::1;::::0;-1:-1:-1;;;66951:65:0;;-1:-1:-1;;;;;66999:15:0;;::::1;66951:65;::::0;::::1;1795:51:1::0;66951:39:0;;::::1;::::0;-1:-1:-1;66951:39:0::1;::::0;-1:-1:-1;1768:18:1;;66951:65:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;67076:15:0::1;::::0;67034:59:::1;::::0;-1:-1:-1;;;;;67076:15:0;;::::1;::::0;-1:-1:-1;67034:59:0;;::::1;::::0;-1:-1:-1;67034:59:0::1;::::0;67076:15:::1;::::0;67034:59:::1;67106:15;:36:::0;;-1:-1:-1;;;;;;67106:36:0::1;-1:-1:-1::0;;;;;67106:36:0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;66212:938:0:o;70182:147::-;70274:15;;:47;;-1:-1:-1;;;70274:47:0;;-1:-1:-1;;;;;1813:32:1;;;70274:47:0;;;1795:51:1;70250:4:0;;70274:15;;:38;;1768:18:1;;70274:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;70337:326::-;24836:6;;-1:-1:-1;;;;;24836:6:0;;;;;12505:10;24898:23;24890:68;;;;-1:-1:-1;;;24890:68:0;;;;;;;:::i;:::-;70462:13:::1;::::0;-1:-1:-1;;;;;70462:13:0;;::::1;70442:33:::0;;::::1;::::0;70420:137:::1;;;::::0;-1:-1:-1;;;70420:137:0;;9874:2:1;70420:137:0::1;::::0;::::1;9856:21:1::0;9913:2;9893:18;;;9886:30;9952:34;9932:18;;;9925:62;-1:-1:-1;;;10003:18:1;;;9996:52;10065:19;;70420:137:0::1;9672:418:1::0;70420:137:0::1;-1:-1:-1::0;;;;;70568:37:0::1;;::::0;;;:19:::1;:37;::::0;;;;:44;;-1:-1:-1;;70568:44:0::1;70608:4;70568:44;::::0;;70623:13:::1;:32:::0;;-1:-1:-1;;;;;;70623:32:0::1;::::0;;::::1;::::0;;70337:326::o;15045:95::-;15092:13;15125:7;15118:14;;;;;:::i;78761:326::-;24836:6;;-1:-1:-1;;;;;24836:6:0;;;;;12505:10;24898:23;24890:68;;;;-1:-1:-1;;;24890:68:0;;;;;;;:::i;:::-;78907:13:::1;::::0;-1:-1:-1;;;;;78907:13:0;;::::1;78899:21:::0;;::::1;::::0;78877:150:::1;;;::::0;-1:-1:-1;;;78877:150:0;;10297:2:1;78877:150:0::1;::::0;::::1;10279:21:1::0;10336:2;10316:18;;;10309:30;10375:34;10355:18;;;10348:62;10446:34;10426:18;;;10419:62;-1:-1:-1;;;10497:19:1;;;10490:46;10553:19;;78877:150:0::1;10095:483:1::0;78877:150:0::1;79038:41;79067:4;79073:5;79038:28;:41::i;19488:400::-:0;19608:4;19630:228;12505:10;19680:7;19702:145;19759:15;19702:145;;;;;;;;;;;;;;;;;12505:10;19702:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;19702:34:0;;;;;;;;;;;;:38;:145::i;16503:216::-;16625:4;16647:42;12505:10;16671:9;16682:6;16647:9;:42::i;68719:339::-;24836:6;;-1:-1:-1;;;;;24836:6:0;;;;;12505:10;24898:23;24890:68;;;;-1:-1:-1;;;24890:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;68858:43:0;::::1;;::::0;;;:35:::1;:43;::::0;;;;;::::1;;:51;;:43:::0;:51;68836:153:::1;;;;-1:-1:-1::0;;;68836:153:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;69000:43:0;;;::::1;;::::0;;;:35:::1;:43;::::0;;;;:50;;-1:-1:-1;;69000:50:0::1;::::0;::::1;;::::0;;;::::1;::::0;;68719:339::o;67885:146::-;24836:6;;-1:-1:-1;;;;;24836:6:0;;;;;12505:10;24898:23;24890:68;;;;-1:-1:-1;;;24890:68:0;;;;;;;:::i;:::-;67968:15:::1;::::0;:55:::1;::::0;-1:-1:-1;;;67968:55:0;;-1:-1:-1;;;;;1813:32:1;;;67968:55:0::1;::::0;::::1;1795:51:1::0;67968:15:0;;::::1;::::0;:34:::1;::::0;1768:18:1;;67968:55:0::1;1649:203:1::0;69066:188:0;24836:6;;-1:-1:-1;;;;;24836:6:0;;;;;12505:10;24898:23;24890:68;;;;-1:-1:-1;;;24890:68:0;;;;;;;:::i;:::-;69152:9:::1;69147:100;69171:7;:14;69167:1;:18;69147:100;;;69231:4;69207:9;:21;69217:7;69225:1;69217:10;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;69207:21:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;69207:21:0;:28;;-1:-1:-1;;69207:28:0::1;::::0;::::1;;::::0;;;::::1;::::0;;69187:3;::::1;::::0;::::1;:::i;:::-;;;;69147:100;;68095:289:::0;24836:6;;-1:-1:-1;;;;;24836:6:0;;;;;12505:10;24898:23;24890:68;;;;-1:-1:-1;;;24890:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;68196:37:0;::::1;;::::0;;;:19:::1;:37;::::0;;;;;::::1;;:45;;:37:::0;:45;68174:147:::1;;;;-1:-1:-1::0;;;68174:147:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;68332:37:0::1;;::::0;;;:19:::1;:37;::::0;;;;:44;;-1:-1:-1;;68332:44:0::1;68372:4;68332:44;::::0;;68095:289::o;25142:281::-;24836:6;;-1:-1:-1;;;;;24836:6:0;;;;;12505:10;24898:23;24890:68;;;;-1:-1:-1;;;24890:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;25245:22:0;::::1;25223:110;;;::::0;-1:-1:-1;;;25223:110:0;;11610:2:1;25223:110:0::1;::::0;::::1;11592:21:1::0;11649:2;11629:18;;;11622:30;11688:34;11668:18;;;11661:62;-1:-1:-1;;;11739:18:1;;;11732:36;11785:19;;25223:110:0::1;11408:402:1::0;25223:110:0::1;25370:6;::::0;25349:38:::1;::::0;-1:-1:-1;;;;;25349:38:0;;::::1;::::0;25370:6:::1;::::0;::::1;;::::0;25349:38:::1;::::0;;;::::1;25398:6;:17:::0;;-1:-1:-1;;;;;25398:17:0;;::::1;;;-1:-1:-1::0;;;;;;25398:17:0;;::::1;::::0;;;::::1;::::0;;25142:281::o;7607:179::-;7665:7;;7697:5;7701:1;7697;:5;:::i;:::-;7685:17;;7726:1;7721;:6;;7713:46;;;;-1:-1:-1;;;7713:46:0;;12147:2:1;7713:46:0;;;12129:21:1;12186:2;12166:18;;;12159:30;12225:29;12205:18;;;12198:57;12272:18;;7713:46:0;11945:351:1;7713:46:0;7777:1;7607:179;-1:-1:-1;;;7607:179:0:o;22874:380::-;-1:-1:-1;;;;;23010:19:0;;23002:68;;;;-1:-1:-1;;;23002:68:0;;12503:2:1;23002:68:0;;;12485:21:1;12542:2;12522:18;;;12515:30;12581:34;12561:18;;;12554:62;-1:-1:-1;;;12632:18:1;;;12625:34;12676:19;;23002:68:0;12301:400:1;23002:68:0;-1:-1:-1;;;;;23089:21:0;;23081:68;;;;-1:-1:-1;;;23081:68:0;;12908:2:1;23081:68:0;;;12890:21:1;12947:2;12927:18;;;12920:30;12986:34;12966:18;;;12959:62;-1:-1:-1;;;13037:18:1;;;13030:32;13079:19;;23081:68:0;12706:398:1;23081:68:0;-1:-1:-1;;;;;23162:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;23214:32;;160:25:1;;;23214:32:0;;133:18:1;23214:32:0;;;;;;;;22874:380;;;:::o;76146:269::-;76248:3;76226:18;;76217:6;;:27;;;;:::i;:::-;76216:35;;;;:::i;:::-;76189:24;:62;76298:14;;76284:6;;:10;;76293:1;76284:10;:::i;:::-;76283:29;;;;:::i;:::-;76262:18;:50;76391:9;;76382:6;;76404:3;;76382:18;;;:::i;:::-;76381:26;;;;:::i;:::-;76364:14;:43;76146:269::o;70826:5312::-;-1:-1:-1;;;;;71065:18:0;;71057:68;;;;-1:-1:-1;;;71057:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;71144:16:0;;71136:64;;;;-1:-1:-1;;;71136:64:0;;;;;;;:::i;:::-;71217:21;;;;:41;;;;-1:-1:-1;;;;;;71243:15:0;;;;;;:9;:15;;;;;;;;71242:16;71217:41;:59;;;;-1:-1:-1;;;;;;71263:13:0;;;;;;:9;:13;;;;;;;;71262:14;71217:59;71213:449;;;71327:1;71301:23;;:27;71293:59;;;;-1:-1:-1;;;71293:59:0;;14516:2:1;71293:59:0;;;14498:21:1;14555:2;14535:18;;;14528:30;-1:-1:-1;;;14574:18:1;;;14567:49;14633:18;;71293:59:0;14314:343:1;71293:59:0;71426:23;;71386:3;;71367:16;;71426:37;;71386:3;71426:27;:37::i;:::-;71404:59;;71523:11;71504:15;:30;;71478:128;;;;-1:-1:-1;;;71478:128:0;;14864:2:1;71478:128:0;;;14846:21:1;14903:2;14883:18;;;14876:30;14942:34;14922:18;;;14915:62;-1:-1:-1;;;14993:18:1;;;14986:34;15037:19;;71478:128:0;14662:400:1;71478:128:0;-1:-1:-1;;71621:21:0;:29;;-1:-1:-1;;71621:29:0;;;71213:449;24836:6;;-1:-1:-1;;;;;71690:15:0;;;24836:6;;;;;71690:15;;;;:45;;-1:-1:-1;24836:6:0;;-1:-1:-1;;;;;71722:13:0;;;24836:6;;;;;71722:13;;71690:45;:78;;;;-1:-1:-1;;;;;;71752:16:0;;;;71690:78;:116;;;;-1:-1:-1;;;;;;71785:21:0;;71799:6;71785:21;;71690:116;:142;;;;-1:-1:-1;71824:8:0;;-1:-1:-1;;;71824:8:0;;;;71823:9;71690:142;71672:1219;;;-1:-1:-1;;;;;71905:31:0;;;;;;:25;:31;;;;;;;;:92;;;;-1:-1:-1;;;;;;71958:39:0;;;;;;:35;:39;;;;;;;;71957:40;71905:92;:143;;;;-1:-1:-1;;;;;;72019:29:0;;;;;;:25;:29;;;;;;;;72018:30;71905:143;71883:997;;;72139:14;;72122:13;72132:2;72122:9;:13::i;:::-;72113:22;;:6;:22;:::i;:::-;:40;;72083:133;;;;-1:-1:-1;;;72083:133:0;;15269:2:1;72083:133:0;;;15251:21:1;15308:2;15288:18;;;15281:30;-1:-1:-1;;;15327:18:1;;;15320:49;15386:18;;72083:133:0;15067:343:1;72083:133:0;71883:997;;;-1:-1:-1;;;;;72298:29:0;;;;;;:25;:29;;;;;;;;:92;;;;-1:-1:-1;;;;;;72349:41:0;;;;;;:35;:41;;;;;;;;72348:42;72298:92;:145;;;;-1:-1:-1;;;;;;72412:31:0;;;;;;:25;:31;;;;;;;;72411:32;72298:145;72276:604;;;72518:24;;72508:6;:34;;72478:166;;;;-1:-1:-1;;;72478:166:0;;15617:2:1;72478:166:0;;;15599:21:1;15656:2;15636:18;;;15629:30;15695:34;15675:18;;;15668:62;15766:28;15746:18;;;15739:56;15812:19;;72478:166:0;15415:422:1;72276:604:0;-1:-1:-1;;;;;72671:39:0;;;;;;:35;:39;;;;;;;;72666:214;;72787:14;;72770:13;72780:2;72770:9;:13::i;:::-;72761:22;;:6;:22;:::i;:::-;:40;;72731:133;;;;-1:-1:-1;;;72731:133:0;;15269:2:1;72731:133:0;;;15251:21:1;15308:2;15288:18;;;15281:30;-1:-1:-1;;;15327:18:1;;;15320:49;15386:18;;72731:133:0;15067:343:1;72731:133:0;72946:6;72956:1;72946:11;72942:93;;72974:28;72990:4;72996:2;73000:1;72974:15;:28::i;:::-;70826:5312;;;:::o;72942:93::-;-1:-1:-1;;;;;73126:25:0;;73113:10;73126:25;;;:19;:25;;;;;;;;;:52;;-1:-1:-1;;;;;;73155:23:0;;;;;;:19;:23;;;;;;;;73126:52;73243:8;;73113:65;;-1:-1:-1;;;;73243:8:0;;;;73242:9;:19;;;;;73256:5;73255:6;73242:19;73238:638;;;73350:23;73376:24;73394:4;73376:9;:24::i;:::-;73350:50;;73541:18;;73522:15;:37;73518:347;;73663:8;;-1:-1:-1;;;73663:8:0;;;;73662:9;:45;;;;-1:-1:-1;;;;;;73676:31:0;;;;;;:25;:31;;;;;;;;73675:32;73662:45;73658:192;;;73732:8;:15;;-1:-1:-1;;;;73732:15:0;-1:-1:-1;;;73732:15:0;;;73770:21;:19;:21::i;:::-;73814:8;:16;;-1:-1:-1;;;;73814:16:0;;;73658:192;73263:613;73238:638;73892:5;:17;;;-1:-1:-1;73901:8:0;;-1:-1:-1;;;73901:8:0;;;;73892:17;73888:1485;;;73926:33;73942:4;73948:2;73952:6;73926:15;:33::i;:::-;73888:1485;;;73992:12;74007:42;74040:8;;74007:28;74018:16;;74007:6;:10;;:28;;;;:::i;:::-;:32;;:42::i;:::-;73992:57;;74064:23;74090:80;74139:16;;74090:26;74099:16;;74090:4;:8;;:26;;;;:::i;:80::-;74064:106;;74185:18;74206:43;74232:16;;74206:21;74215:11;;74206:4;:8;;:21;;;;:::i;:43::-;-1:-1:-1;;;;;74268:29:0;;;;;;:25;:29;;;;;;74185:64;;-1:-1:-1;74268:29:0;;74264:330;;;74318:52;74327:42;74360:8;;74327:28;74338:16;;74327:6;:10;;:28;;;;:::i;:42::-;74318:4;;:8;:52::i;:::-;;74389:110;74431:49;74463:16;;74431:27;74440:17;;74431:4;:8;;:27;;;;:::i;:49::-;74389:15;;:19;:110::i;:::-;;74518:60;74533:44;74560:16;;74533:22;74542:12;;74533:4;:8;;:22;;;;:::i;:44::-;74518:10;;:14;:60::i;:::-;;74264:330;74627:16;;:37;;74648:15;74627:20;:37::i;:::-;74608:16;:56;74683:8;;74679:625;;74712:42;74728:4;74742;74749;74712:15;:42::i;:::-;74777:14;;74773:214;;74816:32;74830:4;74837:10;74816:5;:32::i;:::-;16030:12;;74871:6;:22;74916:14;:12;:14::i;:::-;-1:-1:-1;74966:1:0;74773:214;75009:31;;;;75005:284;;;75147:13;;75187:16;;75065:161;;75115:4;;-1:-1:-1;;;;;75147:13:0;;;;75065:15;:161::i;:::-;75268:1;75249:16;:20;75005:284;75318:43;75334:4;75340:2;75344:16;:6;75355:4;75344:10;:16::i;:::-;75318:15;:43::i;:::-;73977:1396;;;73888:1485;75447:15;;-1:-1:-1;;;;;75447:15:0;:26;75482:4;75489:15;75482:4;75489:9;:15::i;:::-;75447:58;;-1:-1:-1;;;;;;75447:58:0;;;;;;;-1:-1:-1;;;;;16050:32:1;;;75447:58:0;;;16032:51:1;16099:18;;;16092:34;16005:18;;75447:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;75516:15:0;;-1:-1:-1;;;;;75516:15:0;;-1:-1:-1;75516:26:0;;-1:-1:-1;75551:2:0;75556:13;75551:2;75556:9;:13::i;:::-;75516:54;;-1:-1:-1;;;;;;75516:54:0;;;;;;;-1:-1:-1;;;;;16050:32:1;;;75516:54:0;;;16032:51:1;16099:18;;;16092:34;16005:18;;75516:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;75588:8:0;;-1:-1:-1;;;75588:8:0;;;;75587:9;;-1:-1:-1;;75587:19:0;;;;;75601:5;75600:6;75587:19;75583:548;;;75637:16;;75672:15;;:28;;-1:-1:-1;;;;;;75672:28:0;;;;;160:25:1;;;-1:-1:-1;;;;;75672:15:0;;;;:23;;133:18:1;;75672:28:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;75672:28:0;;;;;;;;-1:-1:-1;;75672:28:0;;;;;;;;;;;;:::i;:::-;;;75668:452;;;75864:231;;;16679:25:1;;;16735:2;16720:18;;16713:34;;;16763:18;;;16756:34;;;16821:2;16806:18;;16799:34;;;76067:9:0;;76014:4;;75864:231;;16666:3:1;16651:19;75864:231:0;;;;;;;75701:410;;;75608:523;75583:548;70939:5199;70826:5312;;;:::o;10434:200::-;10554:7;10590:12;10582:6;;;;10574:29;;;;-1:-1:-1;;;10574:29:0;;;;;;;;:::i;:::-;-1:-1:-1;10621:5:0;10625:1;10621;:5;:::i;:::-;10614:12;10434:200;-1:-1:-1;;;;10434:200:0:o;21981:455::-;-1:-1:-1;;;;;22065:21:0;;22057:67;;;;-1:-1:-1;;;22057:67:0;;17179:2:1;22057:67:0;;;17161:21:1;17218:2;17198:18;;;17191:30;17257:34;17237:18;;;17230:62;-1:-1:-1;;;17308:18:1;;;17301:31;17349:19;;22057:67:0;16977:397:1;22057:67:0;22220:105;22257:6;22220:105;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22220:18:0;;:9;:18;;;;;;;;;;;;:105;:22;:105::i;:::-;-1:-1:-1;;;;;22199:18:0;;:9;:18;;;;;;;;;;:126;22351:12;;:24;;22368:6;22351:16;:24::i;:::-;22336:12;:39;22391:37;;160:25:1;;;22417:1:0;;-1:-1:-1;;;;;22391:37:0;;;;;148:2:1;133:18;22391:37:0;;;;;;;21981:455;;:::o;8486:220::-;8544:7;8568:1;8573;8568:6;8564:20;;-1:-1:-1;8583:1:0;8576:8;;8564:20;8595:9;8607:5;8611:1;8607;:5;:::i;:::-;8595:17;-1:-1:-1;8640:1:0;8631:5;8635:1;8595:17;8631:5;:::i;:::-;:10;8623:56;;;;-1:-1:-1;;;8623:56:0;;17581:2:1;8623:56:0;;;17563:21:1;17620:2;17600:18;;;17593:30;17659:34;17639:18;;;17632:62;-1:-1:-1;;;17710:18:1;;;17703:31;17751:19;;8623:56:0;17379:397:1;79095:478:0;-1:-1:-1;;;;;79200:31:0;;;;;;:25;:31;;;;;;:40;;;:31;;;;:40;;;79178:156;;;;-1:-1:-1;;;79178:156:0;;17983:2:1;79178:156:0;;;17965:21:1;18022:2;18002:18;;;17995:30;18061:34;18041:18;;;18034:62;18132:34;18112:18;;;18105:62;-1:-1:-1;;;18183:19:1;;;18176:33;18226:19;;79178:156:0;17781:470:1;79178:156:0;-1:-1:-1;;;;;79345:31:0;;;;;;:25;:31;;;;;:39;;-1:-1:-1;;79345:39:0;;;;;;;;;;;;79395:13;:20;;-1:-1:-1;;;;;;79395:20:0;;;;;;;79428:80;;79454:15;;:42;;-1:-1:-1;;;79454:42:0;;-1:-1:-1;;;;;1813:32:1;;;79454:42:0;;;1795:51:1;79454:15:0;;;;:36;;1768:18:1;;79454:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79428:80;79525:40;;;;;;-1:-1:-1;;;;;79525:40:0;;;;;;;;79095:478;;:::o;20378:610::-;-1:-1:-1;;;;;20518:20:0;;20510:70;;;;-1:-1:-1;;;20510:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;20599:23:0;;20591:71;;;;-1:-1:-1;;;20591:71:0;;;;;;;:::i;:::-;20755:108;20791:6;20755:108;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20755:17:0;;:9;:17;;;;;;;;;;;;:108;:21;:108::i;:::-;-1:-1:-1;;;;;20735:17:0;;;:9;:17;;;;;;;;;;;:128;;;;20897:20;;;;;;;:32;;20922:6;20897:24;:32::i;:::-;-1:-1:-1;;;;;20874:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;20945:35;160:25:1;;;20874:20:0;;20945:35;;;;;;133:18:1;20945:35:0;14:177:1;76581:1619:0;76722:16;;;76736:1;76722:16;;;;;;;;76698:21;;76722:16;;;;;;;;;;-1:-1:-1;76722:16:0;76698:40;;76767:4;76749;76754:1;76749:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;76749:23:0;;;:7;;;;;;;;;;:23;;;;76793:15;;:22;;;-1:-1:-1;;;76793:22:0;;;;:15;;;;;:20;;:22;;;;;76749:7;;76793:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;76783:4;76788:1;76783:7;;;;;;;;:::i;:::-;;;;;;:32;-1:-1:-1;;;;;76783:32:0;;;-1:-1:-1;;;;;76783:32:0;;;;;76828:23;76854:24;76872:4;76854:9;:24::i;:::-;76923:15;;76828:50;;-1:-1:-1;76891:66:0;;76908:4;;-1:-1:-1;;;;;76923:15:0;76828:50;76891:8;:66::i;:::-;77320:15;;:205;;-1:-1:-1;;;77320:205:0;;77260:21;;-1:-1:-1;;;;;77320:15:0;;:37;;:205;;77372:15;;77235:22;;77452:4;;77479;;77499:15;;77320:205;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;77320:205:0;;;;;;;;;;;;:::i;:::-;-1:-1:-1;77538:17:0;77558:41;:21;77584:14;77558:25;:41::i;:::-;77538:61;-1:-1:-1;77612:17:0;77632:26;77654:3;77632:17;77538:61;77646:2;77632:13;:17::i;:26::-;77612:46;;77671:13;77687:35;77713:8;;77687:21;77701:6;;77687:9;:13;;:21;;;;:::i;:35::-;77671:51;;77733:13;77749:35;77775:8;;77749:21;77763:6;;77749:9;:13;;:21;;;;:::i;:35::-;77733:51;-1:-1:-1;77795:17:0;77815:31;77733:51;77815:20;:9;77829:5;77815:13;:20::i;:::-;:24;;:31::i;:::-;77867:8;;77859:37;;77795:51;;-1:-1:-1;;;;;;77867:8:0;;77859:37;;;;;77795:51;;77867:8;77859:37;77867:8;77859:37;77795:51;77867:8;77859:37;;;;;;;;;;;;;;;;;;;;-1:-1:-1;77915:4:0;;77907:29;;-1:-1:-1;;;;;77915:4:0;;;;77907:29;;;;;77930:5;;77915:4;77907:29;77915:4;77907:29;77930:5;77915:4;77907:29;;;;;;;;;;;;;;;;;;;;-1:-1:-1;77955:4:0;;77947:29;;-1:-1:-1;;;;;77955:4:0;;;;77947:29;;;;;77970:5;;77955:4;77947:29;77955:4;77947:29;77970:5;77955:4;77947:29;;;;;;;;;;;;;;;;;;;;;77989:23;:21;:23::i;:::-;78052:11;;78097:15;;78045:79;;-1:-1:-1;;;78045:79:0;;-1:-1:-1;;;;;78097:15:0;;;78045:79;;;1795:51:1;78025:17:0;;78052:11;;;;;78045:29;;1768:18:1;;78045:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;78135:15;;:57;;-1:-1:-1;;;78135:57:0;;;;;160:25:1;;;78025:99:0;;-1:-1:-1;;;;;;78135:15:0;;:46;;133:18:1;;78135:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76620:1580;;;;;;;;;76581:1619::o;9184:153::-;9242:7;9274:1;9270;:5;9262:44;;;;-1:-1:-1;;;9262:44:0;;20586:2:1;9262:44:0;;;20568:21:1;20625:2;20605:18;;;20598:30;20664:28;20644:18;;;20637:56;20710:18;;9262:44:0;20384:350:1;9262:44:0;9324:5;9328:1;9324;:5;:::i;8069:158::-;8127:7;8160:1;8155;:6;;8147:49;;;;-1:-1:-1;;;8147:49:0;;20941:2:1;8147:49:0;;;20923:21:1;20980:2;20960:18;;;20953:30;21019:32;20999:18;;;20992:60;21069:18;;8147:49:0;20739:354:1;8147:49:0;8214:5;8218:1;8214;:5;:::i;78248:394::-;78324:16;;;78338:1;78324:16;;;;;;;;78300:21;;78324:16;;;;;;;;-1:-1:-1;;78361:15:0;;:22;;;-1:-1:-1;;;78361:22:0;;;;78300:40;;-1:-1:-1;;;;;;78361:15:0;;;;:20;;-1:-1:-1;78361:22:0;;;;;;;;;;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;78351:4;78356:1;78351:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;78351:32:0;;;:7;;;;;;;;;:32;78404:11;;78394:7;;78404:11;;;78394:4;;78404:11;;78394:7;;;;;;:::i;:::-;-1:-1:-1;;;;;78394:21:0;;;:7;;;;;;;;;:21;78452:15;;78577;;78452:182;;-1:-1:-1;;;78452:182:0;;:15;;;;:37;;78497:21;;78452:182;;:15;;78550:4;;78577:15;;;;78608;;78452:182;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;78452:182:0;;;;;;;;;;;;:::i;196:548:1:-;308:4;337:2;366;355:9;348:21;398:6;392:13;441:6;436:2;425:9;421:18;414:34;466:1;476:140;490:6;487:1;484:13;476:140;;;585:14;;;581:23;;575:30;551:17;;;570:2;547:26;540:66;505:10;;476:140;;;480:3;665:1;660:2;651:6;640:9;636:22;632:31;625:42;735:2;728;724:7;719:2;711:6;707:15;703:29;692:9;688:45;684:54;676:62;;;;196:548;;;;:::o;749:131::-;-1:-1:-1;;;;;824:31:1;;814:42;;804:70;;870:1;867;860:12;885:247;944:6;997:2;985:9;976:7;972:23;968:32;965:52;;;1013:1;1010;1003:12;965:52;1052:9;1039:23;1071:31;1096:5;1071:31;:::i;1329:315::-;1397:6;1405;1458:2;1446:9;1437:7;1433:23;1429:32;1426:52;;;1474:1;1471;1464:12;1426:52;1513:9;1500:23;1532:31;1557:5;1532:31;:::i;:::-;1582:5;1634:2;1619:18;;;;1606:32;;-1:-1:-1;;;1329:315:1:o;2092:180::-;2151:6;2204:2;2192:9;2183:7;2179:23;2175:32;2172:52;;;2220:1;2217;2210:12;2172:52;-1:-1:-1;2243:23:1;;2092:180;-1:-1:-1;2092:180:1:o;2277:456::-;2354:6;2362;2370;2423:2;2411:9;2402:7;2398:23;2394:32;2391:52;;;2439:1;2436;2429:12;2391:52;2478:9;2465:23;2497:31;2522:5;2497:31;:::i;:::-;2547:5;-1:-1:-1;2604:2:1;2589:18;;2576:32;2617:33;2576:32;2617:33;:::i;:::-;2277:456;;2669:7;;-1:-1:-1;;;2723:2:1;2708:18;;;;2695:32;;2277:456::o;3172:671::-;3258:6;3266;3274;3282;3335:3;3323:9;3314:7;3310:23;3306:33;3303:53;;;3352:1;3349;3342:12;3303:53;3391:9;3378:23;3410:31;3435:5;3410:31;:::i;:::-;3460:5;-1:-1:-1;3517:2:1;3502:18;;3489:32;3530:33;3489:32;3530:33;:::i;:::-;3582:7;-1:-1:-1;3641:2:1;3626:18;;3613:32;3654:33;3613:32;3654:33;:::i;:::-;3706:7;-1:-1:-1;3765:2:1;3750:18;;3737:32;3778:33;3737:32;3778:33;:::i;:::-;3172:671;;;;-1:-1:-1;3172:671:1;;-1:-1:-1;;3172:671:1:o;3848:118::-;3934:5;3927:13;3920:21;3913:5;3910:32;3900:60;;3956:1;3953;3946:12;3971:382;4036:6;4044;4097:2;4085:9;4076:7;4072:23;4068:32;4065:52;;;4113:1;4110;4103:12;4065:52;4152:9;4139:23;4171:31;4196:5;4171:31;:::i;:::-;4221:5;-1:-1:-1;4278:2:1;4263:18;;4250:32;4291:30;4250:32;4291:30;:::i;:::-;4340:7;4330:17;;;3971:382;;;;;:::o;4358:127::-;4419:10;4414:3;4410:20;4407:1;4400:31;4450:4;4447:1;4440:15;4474:4;4471:1;4464:15;4490:275;4561:2;4555:9;4626:2;4607:13;;-1:-1:-1;;4603:27:1;4591:40;;4661:18;4646:34;;4682:22;;;4643:62;4640:88;;;4708:18;;:::i;:::-;4744:2;4737:22;4490:275;;-1:-1:-1;4490:275:1:o;4770:183::-;4830:4;4863:18;4855:6;4852:30;4849:56;;;4885:18;;:::i;:::-;-1:-1:-1;4930:1:1;4926:14;4942:4;4922:25;;4770:183::o;4958:966::-;5042:6;5073:2;5116;5104:9;5095:7;5091:23;5087:32;5084:52;;;5132:1;5129;5122:12;5084:52;5172:9;5159:23;5205:18;5197:6;5194:30;5191:50;;;5237:1;5234;5227:12;5191:50;5260:22;;5313:4;5305:13;;5301:27;-1:-1:-1;5291:55:1;;5342:1;5339;5332:12;5291:55;5378:2;5365:16;5401:60;5417:43;5457:2;5417:43;:::i;:::-;5401:60;:::i;:::-;5495:15;;;5577:1;5573:10;;;;5565:19;;5561:28;;;5526:12;;;;5601:19;;;5598:39;;;5633:1;5630;5623:12;5598:39;5657:11;;;;5677:217;5693:6;5688:3;5685:15;5677:217;;;5773:3;5760:17;5790:31;5815:5;5790:31;:::i;:::-;5834:18;;5710:12;;;;5872;;;;5677:217;;;5913:5;4958:966;-1:-1:-1;;;;;;;4958:966:1:o;5929:388::-;5997:6;6005;6058:2;6046:9;6037:7;6033:23;6029:32;6026:52;;;6074:1;6071;6064:12;6026:52;6113:9;6100:23;6132:31;6157:5;6132:31;:::i;:::-;6182:5;-1:-1:-1;6239:2:1;6224:18;;6211:32;6252:33;6211:32;6252:33;:::i;6322:380::-;6401:1;6397:12;;;;6444;;;6465:61;;6519:4;6511:6;6507:17;6497:27;;6465:61;6572:2;6564:6;6561:14;6541:18;6538:38;6535:161;;6618:10;6613:3;6609:20;6606:1;6599:31;6653:4;6650:1;6643:15;6681:4;6678:1;6671:15;6535:161;;6322:380;;;:::o;6707:356::-;6909:2;6891:21;;;6928:18;;;6921:30;6987:34;6982:2;6967:18;;6960:62;7054:2;7039:18;;6707:356::o;8682:251::-;8752:6;8805:2;8793:9;8784:7;8780:23;8776:32;8773:52;;;8821:1;8818;8811:12;8773:52;8853:9;8847:16;8872:31;8897:5;8872:31;:::i;9422:245::-;9489:6;9542:2;9530:9;9521:7;9517:23;9513:32;9510:52;;;9558:1;9555;9548:12;9510:52;9590:9;9584:16;9609:28;9631:5;9609:28;:::i;10583:416::-;10785:2;10767:21;;;10824:2;10804:18;;;10797:30;10863:34;10858:2;10843:18;;10836:62;-1:-1:-1;;;10929:2:1;10914:18;;10907:50;10989:3;10974:19;;10583:416::o;11004:127::-;11065:10;11060:3;11056:20;11053:1;11046:31;11096:4;11093:1;11086:15;11120:4;11117:1;11110:15;11136:127;11197:10;11192:3;11188:20;11185:1;11178:31;11228:4;11225:1;11218:15;11252:4;11249:1;11242:15;11268:135;11307:3;11328:17;;;11325:43;;11348:18;;:::i;:::-;-1:-1:-1;11395:1:1;11384:13;;11268:135::o;11815:125::-;11880:9;;;11901:10;;;11898:36;;;11914:18;;:::i;13109:168::-;13182:9;;;13213;;13230:15;;;13224:22;;13210:37;13200:71;;13251:18;;:::i;13282:217::-;13322:1;13348;13338:132;;13392:10;13387:3;13383:20;13380:1;13373:31;13427:4;13424:1;13417:15;13455:4;13452:1;13445:15;13338:132;-1:-1:-1;13484:9:1;;13282:217::o;13504:401::-;13706:2;13688:21;;;13745:2;13725:18;;;13718:30;13784:34;13779:2;13764:18;;13757:62;-1:-1:-1;;;13850:2:1;13835:18;;13828:35;13895:3;13880:19;;13504:401::o;13910:399::-;14112:2;14094:21;;;14151:2;14131:18;;;14124:30;14190:34;14185:2;14170:18;;14163:62;-1:-1:-1;;;14256:2:1;14241:18;;14234:33;14299:3;14284:19;;13910:399::o;16137:306::-;16225:6;16233;16241;16294:2;16282:9;16273:7;16269:23;16265:32;16262:52;;;16310:1;16307;16300:12;16262:52;16339:9;16333:16;16323:26;;16389:2;16378:9;16374:18;16368:25;16358:35;;16433:2;16422:9;16418:18;16412:25;16402:35;;16137:306;;;;;:::o;16844:128::-;16911:9;;;16932:11;;;16929:37;;;16946:18;;:::i;18256:461::-;18309:3;18347:5;18341:12;18374:6;18369:3;18362:19;18400:4;18429:2;18424:3;18420:12;18413:19;;18466:2;18459:5;18455:14;18487:1;18497:195;18511:6;18508:1;18505:13;18497:195;;;18576:13;;-1:-1:-1;;;;;18572:39:1;18560:52;;18632:12;;;;18667:15;;;;18608:1;18526:9;18497:195;;;-1:-1:-1;18708:3:1;;18256:461;-1:-1:-1;;;;;18256:461:1:o;18722:582::-;19021:6;19010:9;19003:25;19064:6;19059:2;19048:9;19044:18;19037:34;19107:3;19102:2;19091:9;19087:18;19080:31;18984:4;19128:57;19180:3;19169:9;19165:19;19157:6;19128:57;:::i;:::-;-1:-1:-1;;;;;19221:32:1;;;;19216:2;19201:18;;19194:60;-1:-1:-1;19285:3:1;19270:19;19263:35;19120:65;18722:582;-1:-1:-1;;;18722:582:1:o;19309:881::-;19404:6;19435:2;19478;19466:9;19457:7;19453:23;19449:32;19446:52;;;19494:1;19491;19484:12;19446:52;19527:9;19521:16;19560:18;19552:6;19549:30;19546:50;;;19592:1;19589;19582:12;19546:50;19615:22;;19668:4;19660:13;;19656:27;-1:-1:-1;19646:55:1;;19697:1;19694;19687:12;19646:55;19726:2;19720:9;19749:60;19765:43;19805:2;19765:43;:::i;19749:60::-;19843:15;;;19925:1;19921:10;;;;19913:19;;19909:28;;;19874:12;;;;19949:19;;;19946:39;;;19981:1;19978;19971:12;19946:39;20005:11;;;;20025:135;20041:6;20036:3;20033:15;20025:135;;;20107:10;;20095:23;;20058:12;;;;20138;;;;20025:135;;20195:184;20265:6;20318:2;20306:9;20297:7;20293:23;20289:32;20286:52;;;20334:1;20331;20324:12;20286:52;-1:-1:-1;20357:16:1;;20195:184;-1:-1:-1;20195:184:1:o;21098:510::-;21369:6;21358:9;21351:25;21412:3;21407:2;21396:9;21392:18;21385:31;21332:4;21433:57;21485:3;21474:9;21470:19;21462:6;21433:57;:::i;:::-;-1:-1:-1;;;;;21526:32:1;;;;21521:2;21506:18;;21499:60;-1:-1:-1;21590:2:1;21575:18;21568:34;21425:65;21098:510;-1:-1:-1;;21098:510:1:o

Swarm Source

ipfs://2efe860eb22e6755eb1e44d95bd62d08bbc58a7ff4a2bea8aacbc4b37c0a4307
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.