MATIC Price: $0.724904 (-0.49%)
Gas: 31 GWei
 

Overview

Max Total Supply

1,000,000,000,000,000 MINISHIB

Holders

250

Market

Price

$0.00 @ 0.000000 MATIC

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
PolyNetwork Exploiter
Balance
89,577,990.687149635266189036 MINISHIB

Value
$0.00
0x5dc3603c9d42ff184153a8a9094a73d461663214
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

Contract Source Code Verified (Exact Match)

Contract Name:
COINMINISHIB

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at polygonscan.com on 2021-07-05
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.6.2;

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

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

interface IUniswapV2Pair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint 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 (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint 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 (uint);

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

    event Mint(address indexed sender, uint amount0, uint amount1);
    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    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 (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}

interface IUniswapV2Factory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);

    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(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);

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

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

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

    function get(Map storage map, address key) public view returns (uint) {
        return map.values[key];
    }

    function getIndexOfKey(Map storage map, address key) public view returns (int) {
        if(!map.inserted[key]) {
            return -1;
        }
        return int(map.indexOf[key]);
    }

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



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

    function set(Map storage map, address key, uint 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);
        }
    }

    function remove(Map storage map, address key) public {
        if (!map.inserted[key]) {
            return;
        }

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

        uint index = map.indexOf[key];
        uint 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();
    }
}

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

interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

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

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


contract ERC20 is Context, IERC20, IERC20Metadata {
    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;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) public {
        _name = name_;
        _symbol = symbol_;
    }

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

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

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

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

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

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

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

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

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);
        _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:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

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

        _totalSupply = _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 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 {}
}

interface DividendPayingTokenOptionalInterface {
  /// @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);
}

interface DividendPayingTokenInterface {
  /// @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 ether to token holders as dividends.
  /// @dev SHOULD distribute the paid ether to token holders as dividends.
  ///  SHOULD NOT directly transfer ether to token holders in this function.
  ///  MUST emit a `DividendsDistributed` event when the amount of distributed ether is greater than 0.
  function distributeDividends() external payable;

  /// @notice Withdraws the ether 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 ether transferred is greater than 0.
  function withdrawDividend() external;

  /// @dev This event MUST emit when ether is distributed to token holders.
  /// @param from The address which sends ether to this contract.
  /// @param weiAmount The amount of distributed ether 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 ether from this contract.
  /// @param weiAmount The amount of withdrawn ether in wei.
  event DividendWithdrawn(
    address indexed to,
    uint256 weiAmount
  );
}

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

        return c;
    }

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

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * 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);
        uint256 c = a - b;

        return c;
    }

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

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

        return c;
    }

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

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message 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, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

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

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message 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, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

contract Ownable is Context {
    address private _owner;

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

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

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

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

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

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



library SafeMathInt {
    int256 private constant MIN_INT256 = int256(1) << 255;
    int256 private constant MAX_INT256 = ~(int256(1) << 255);

    /**
     * @dev Multiplies two int256 variables and fails on overflow.
     */
    function mul(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a * b;

        // Detect overflow when multiplying MIN_INT256 with -1
        require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256));
        require((b == 0) || (c / b == a));
        return c;
    }

    /**
     * @dev Division of two int256 variables and fails on overflow.
     */
    function div(int256 a, int256 b) internal pure returns (int256) {
        // Prevent overflow when dividing MIN_INT256 by -1
        require(b != -1 || a != MIN_INT256);

        // Solidity already throws when dividing by 0.
        return a / b;
    }

    /**
     * @dev Subtracts two int256 variables and fails on overflow.
     */
    function sub(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a - b;
        require((b >= 0 && c <= a) || (b < 0 && c > a));
        return c;
    }

    /**
     * @dev Adds two int256 variables and fails on overflow.
     */
    function add(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a + b;
        require((b >= 0 && c >= a) || (b < 0 && c < a));
        return c;
    }

    /**
     * @dev Converts to absolute value, and fails on overflow.
     */
    function abs(int256 a) internal pure returns (int256) {
        require(a != MIN_INT256);
        return a < 0 ? -a : a;
    }


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

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


interface IUniswapV2Router01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

contract DividendPayingToken is ERC20, DividendPayingTokenInterface, DividendPayingTokenOptionalInterface {
  using SafeMath for uint256;
  using SafeMathUint for uint256;
  using SafeMathInt for int256;

  // With `magnitude`, we can properly distribute dividends even if the amount of received ether is small.
  // For more discussion about choosing the value of `magnitude`,
  //  see https://github.com/ethereum/EIPs/issues/1726#issuecomment-472352728
  uint256 constant internal magnitude = 2**128;

  uint256 internal magnifiedDividendPerShare;

  // About dividendCorrection:
  // If the token balance of a `_user` is never changed, the dividend of `_user` can be computed with:
  //   `dividendOf(_user) = dividendPerShare * balanceOf(_user)`.
  // When `balanceOf(_user)` is changed (via minting/burning/transferring tokens),
  //   `dividendOf(_user)` should not be changed,
  //   but the computed value of `dividendPerShare * balanceOf(_user)` is changed.
  // To keep the `dividendOf(_user)` unchanged, we add a correction term:
  //   `dividendOf(_user) = dividendPerShare * balanceOf(_user) + dividendCorrectionOf(_user)`,
  //   where `dividendCorrectionOf(_user)` is updated whenever `balanceOf(_user)` is changed:
  //   `dividendCorrectionOf(_user) = dividendPerShare * (old balanceOf(_user)) - (new balanceOf(_user))`.
  // So now `dividendOf(_user)` returns the same value before and after `balanceOf(_user)` is changed.
  mapping(address => int256) internal magnifiedDividendCorrections;
  mapping(address => uint256) internal withdrawnDividends;

  uint256 public totalDividendsDistributed;

  constructor(string memory _name, string memory _symbol) public ERC20(_name, _symbol) {

  }

  /// @dev Distributes dividends whenever ether is paid to this contract.
  receive() external payable {
    distributeDividends();
  }

  /// @notice Distributes ether to token holders as dividends.
  /// @dev It reverts if the total supply of tokens is 0.
  /// It emits the `DividendsDistributed` event if the amount of received ether is greater than 0.
  /// About undistributed ether:
  ///   In each distribution, there is a small amount of ether not distributed,
  ///     the magnified amount of which is
  ///     `(msg.value * magnitude) % totalSupply()`.
  ///   With a well-chosen `magnitude`, the amount of undistributed ether
  ///     (de-magnified) in a distribution can be less than 1 wei.
  ///   We can actually keep track of the undistributed ether in a distribution
  ///     and try to distribute it in the next distribution,
  ///     but keeping track of such data on-chain costs much more than
  ///     the saved ether, so we don't do that.
  function distributeDividends() public override payable {
    require(totalSupply() > 0);

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

      totalDividendsDistributed = totalDividendsDistributed.add(msg.value);
    }
  }

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

  /// @notice Withdraws the ether distributed to the sender.
  /// @dev It emits a `DividendWithdrawn` event if the amount of withdrawn ether is greater than 0.
  function _withdrawDividendOfUser(address payable user) internal returns (uint256) {
    uint256 _withdrawableDividend = withdrawableDividendOf(user);
    if (_withdrawableDividend > 0) {
      withdrawnDividends[user] = withdrawnDividends[user].add(_withdrawableDividend);
      emit DividendWithdrawn(user, _withdrawableDividend);
      (bool success,) = user.call{value: _withdrawableDividend, gas: 3000}("");

      if(!success) {
        withdrawnDividends[user] = withdrawnDividends[user].sub(_withdrawableDividend);
        return 0;
      }

      return _withdrawableDividend;
    }

    return 0;
  }


  /// @notice View the amount of dividend in wei that an address can withdraw.
  /// @param _owner The address of a token holder.
  /// @return The amount of dividend in wei that `_owner` can withdraw.
  function dividendOf(address _owner) public view 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);
    }
  }
}


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

    IUniswapV2Router02 public uniswapV2Router;
    address public immutable uniswapV2Pair;

    address public bounceFixedSaleWallet;

    bool private swapping;

    MINISHIBDividendTracker public dividendTracker;

    address public liquidityWallet;

    uint256 public maxSellTransactionAmount = 5000 * 10**9 * (10**18);
    uint256 public swapTokensAtAmount = 1000 * 10**9 * (10**18);

    uint256 public immutable MATICRewardsFee;
    uint256 public immutable liquidityFee;
    uint256 public immutable totalFees;

    // sells have fees of 12 and 6 (10 * 1.2 and 5 * 1.2)
    uint256 public immutable sellFeeIncreaseFactor = 120; 

    // use by default 300,000 gas to process auto-claiming dividends
    uint256 public gasForProcessing = 300000;


    /*   Fixed Sale   */

    // timestamp for when purchases on the fixed-sale are available to early participants
    uint256 public fixedSaleStartTimestamp = 1623960000; //June 17, 20:00 UTC, 2021

    // the fixed-sale will be open to the public 10 minutes after fixedSaleStartTimestamp,
    // or after 600 buys, whichever comes first.
    uint256 public immutable fixedSaleEarlyParticipantDuration = 600;
    uint256 public immutable fixedSaleEarlyParticipantBuysThreshold = 600;

    // track number of buys. once this reaches fixedSaleEarlyParticipantBuysThreshold,
    // the fixed-sale will be open to the public even if it's still in the first 10 minutes
    uint256 public numberOfFixedSaleBuys;
    // track who has bought
    mapping (address => bool) public fixedSaleBuyers;

    /******************/



    // timestamp for when the token can be traded freely on PanackeSwap
    uint256 public tradingEnabledTimestamp = 1623967200; //June 17, 22:00 UTC, 2021

    // exlcude from fees and max transaction amount
    mapping (address => bool) private _isExcludedFromFees;

    // addresses that can make transfers before presale is over
    mapping (address => bool) private canTransferBeforeTradingIsEnabled;

    mapping (address => bool) public fixedSaleEarlyParticipants;
    mapping (address => bool) public _isExcludedMaxSellTransactionAmount;

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

    event UpdateDividendTracker(address indexed newAddress, address indexed oldAddress);

    event UpdateUniswapV2Router(address indexed newAddress, address indexed oldAddress);

    event ExcludeFromFees(address indexed account, bool isExcluded);
    event ExcludeMultipleAccountsFromFees(address[] accounts, bool isExcluded);
    event ExcludedMaxSellTransactionAmount(address indexed account, bool isExcluded);

    event FixedSaleEarlyParticipantsAdded(address[] participants);

    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);

    event LiquidityWalletUpdated(address indexed newLiquidityWallet, address indexed oldLiquidityWallet);

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

    event FixedSaleBuy(address indexed account, uint256 indexed amount, bool indexed earlyParticipant, uint256 numberOfBuyers);

    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiqudity
    );

    event SendDividends(
    	uint256 tokensSwapped,
    	uint256 amount
    );

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

    constructor() public ERC20("MINISHIB", "MINISHIB") {
        uint256 _MATICRewardsFee = 5;
        uint256 _liquidityFee = 5;

        MATICRewardsFee = _MATICRewardsFee;
        liquidityFee = _liquidityFee;
        totalFees = _MATICRewardsFee.add(_liquidityFee);


    	dividendTracker = new MINISHIBDividendTracker();

    	liquidityWallet = owner();

    	
    	IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0xa5E0829CaCEd8fFDD4De3c43696c57F7D7A678ff);
         // Create a uniswap pair for this new token
        address _uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());

        uniswapV2Router = _uniswapV2Router;
        uniswapV2Pair = _uniswapV2Pair;

        _setAutomatedMarketMakerPair(_uniswapV2Pair, true);

        address _bounceFixedSaleWallet = 0x4Fc4bFeDc5c82644514fACF716C7F888a0C73cCc;
        bounceFixedSaleWallet = _bounceFixedSaleWallet;

        // exclude from receiving dividends
        dividendTracker.excludeFromDividends(address(dividendTracker));
        dividendTracker.excludeFromDividends(address(this));
        dividendTracker.excludeFromDividends(owner());
        dividendTracker.excludeFromDividends(address(_uniswapV2Router));
        dividendTracker.excludeFromDividends(_bounceFixedSaleWallet);

        // exclude from paying fees or having max transaction amount
        excludeFromFees(liquidityWallet, true);
        excludeFromFees(address(this), true);
        updateMaxSellTransactionAmount(owner(), true);
        updateMaxSellTransactionAmount(address(this), true);
        updateMaxSellTransactionAmount(address(dividendTracker), true);
        updateMaxSellTransactionAmount(address(_uniswapV2Router), true);
        updateMaxSellTransactionAmount(_bounceFixedSaleWallet, true);

        // enable owner and fixed-sale wallet to send tokens before presales are over
        canTransferBeforeTradingIsEnabled[owner()] = true;
        canTransferBeforeTradingIsEnabled[_bounceFixedSaleWallet] = true;

        /*
            _mint is an internal function in ERC20.sol that is only called here,
            and CANNOT be called ever again
        */
        _mint(owner(), 1000000 * 10**9 * (10**18));
    }

    receive() external payable {

  	}

    function updateMaxAmount(uint256 newNum) public onlyOwner {
        require(maxSellTransactionAmount != newNum);
        maxSellTransactionAmount = newNum * (10**18);
    }

    function updateMaxSellTransactionAmount(address updAds, bool isEx) public onlyOwner {
        _isExcludedMaxSellTransactionAmount[updAds] = isEx;
        emit ExcludedMaxSellTransactionAmount(updAds, isEx);
    }

    function updateBounceFixedSaleWallet(address newAddress) public onlyOwner {
        require(newAddress != address(0));

        bounceFixedSaleWallet = payable(newAddress);
        dividendTracker.excludeFromDividends(bounceFixedSaleWallet);
        canTransferBeforeTradingIsEnabled[bounceFixedSaleWallet] = true;
    }

    function updateFixedSaleStartTimestamp(uint256 newTimestamp) public onlyOwner {
        require(newTimestamp != fixedSaleStartTimestamp);
        fixedSaleStartTimestamp = newTimestamp;
    }

    function updateTradingEnabledTimestamp(uint256 newTradingEnabledTimestamp) public onlyOwner {
        require(newTradingEnabledTimestamp != tradingEnabledTimestamp);
        tradingEnabledTimestamp = newTradingEnabledTimestamp;
    }

    function updateDividendTracker(address newAddress) public onlyOwner {
        require(newAddress != address(dividendTracker), "MINISHIB: The dividend tracker already has that address");

        MINISHIBDividendTracker newDividendTracker = MINISHIBDividendTracker(payable(newAddress));

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

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

        emit UpdateDividendTracker(newAddress, address(dividendTracker));

        dividendTracker = newDividendTracker;
    }

    function updateUniswapV2Router(address newAddress) public onlyOwner {
        require(newAddress != address(uniswapV2Router), "MINISHIB: The router already has that address");
        emit UpdateUniswapV2Router(newAddress, address(uniswapV2Router));
        uniswapV2Router = IUniswapV2Router02(newAddress);
    }

    function excludeFromFees(address account, bool excluded) public onlyOwner {
        require(_isExcludedFromFees[account] != excluded, "MINISHIB: Account is already the value of 'excluded'");
        _isExcludedFromFees[account] = excluded;

        emit ExcludeFromFees(account, excluded);
    }

    function excludeMultipleAccountsFromFees(address[] calldata accounts, bool excluded) public onlyOwner {
        for(uint256 i = 0; i < accounts.length; i++) {
            _isExcludedFromFees[accounts[i]] = excluded;
        }

        emit ExcludeMultipleAccountsFromFees(accounts, excluded);
    }

    function addFixedSaleEarlyParticipants(address[] calldata accounts) external onlyOwner {
        for(uint256 i = 0; i < accounts.length; i++) {
            fixedSaleEarlyParticipants[accounts[i]] = true;
        }

        emit FixedSaleEarlyParticipantsAdded(accounts);
    }

    function setAutomatedMarketMakerPair(address pair, bool value) public onlyOwner {
        require(pair != uniswapV2Pair, "MINISHIB: The PancakeSwap pair cannot be removed from automatedMarketMakerPairs");

        _setAutomatedMarketMakerPair(pair, value);
    }

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

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

        emit SetAutomatedMarketMakerPair(pair, value);
    }


    function updateLiquidityWallet(address newLiquidityWallet) public onlyOwner {
        require(newLiquidityWallet != liquidityWallet, "MINISHIB: The liquidity wallet is already this address");
        excludeFromFees(newLiquidityWallet, true);
        emit LiquidityWalletUpdated(newLiquidityWallet, liquidityWallet);
        liquidityWallet = newLiquidityWallet;
    }

    function updateGasForProcessing(uint256 newValue) public onlyOwner {
        require(newValue >= 200000 && newValue <= 500000, "MINISHIB: gasForProcessing must be between 200,000 and 500,000");
        require(newValue != gasForProcessing, "MINISHIB: Cannot update gasForProcessing to same value");
        emit GasForProcessingUpdated(newValue, gasForProcessing);
        gasForProcessing = newValue;
    }

    function updateClaimWait(uint256 claimWait) external onlyOwner {
        dividendTracker.updateClaimWait(claimWait);
    }

    function getClaimWait() external view returns(uint256) {
        return dividendTracker.claimWait();
    }

    function getTotalDividendsDistributed() external view returns (uint256) {
        return dividendTracker.totalDividendsDistributed();
    }

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

    function withdrawableDividendOf(address account) public view returns(uint256) {
    	return dividendTracker.withdrawableDividendOf(account);
  	}

	function dividendTokenBalanceOf(address account) public view returns (uint256) {
		return dividendTracker.balanceOf(account);
	}

    function getAccountDividendsInfo(address account)
        external view returns (
            address,
            int256,
            int256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256) {
        return dividendTracker.getAccount(account);
    }

	function getAccountDividendsInfoAtIndex(uint256 index)
        external view returns (
            address,
            int256,
            int256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256) {
    	return dividendTracker.getAccountAtIndex(index);
    }

	function processDividendTracker(uint256 gas) external {
		(uint256 iterations, uint256 claims, uint256 lastProcessedIndex) = dividendTracker.process(gas);
		emit ProcessedDividendTracker(iterations, claims, lastProcessedIndex, false, gas, tx.origin);
    }

    function claim() external {
		dividendTracker.processAccount(msg.sender, false);
    }

    function getLastProcessedIndex() external view returns(uint256) {
    	return dividendTracker.getLastProcessedIndex();
    }

    function getNumberOfDividendTokenHolders() external view returns(uint256) {
        return dividendTracker.getNumberOfTokenHolders();
    }

    function getTradingIsEnabled() public view returns (bool) {
        return block.timestamp >= tradingEnabledTimestamp;
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        bool tradingIsEnabled = getTradingIsEnabled();

        // only whitelisted addresses can make transfers after the fixed-sale has started
        // and before the public presale is over
        if(!tradingIsEnabled) {
            require(canTransferBeforeTradingIsEnabled[from], "MINISHIB: This account cannot send tokens until trading is enabled");
        }

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

        bool isFixedSaleBuy = from == bounceFixedSaleWallet && to != owner();

        // the fixed-sale can only send tokens to the owner or early participants of the fixed sale in the first 10 minutes,
        // or 600 transactions, whichever is first.
        if(isFixedSaleBuy) {
            require(block.timestamp >= fixedSaleStartTimestamp, "MINISHIB: The fixed-sale has not started yet.");

            bool openToEveryone = block.timestamp.sub(fixedSaleStartTimestamp) >= fixedSaleEarlyParticipantDuration ||
                                  numberOfFixedSaleBuys >= fixedSaleEarlyParticipantBuysThreshold;

            if(!openToEveryone) {
                require(fixedSaleEarlyParticipants[to], "MINISHIB: The fixed-sale is only available to certain participants at the start");
            }

            if(!fixedSaleBuyers[to]) {
                fixedSaleBuyers[to] = true;
                numberOfFixedSaleBuys = numberOfFixedSaleBuys.add(1);
            }

            emit FixedSaleBuy(to, amount, fixedSaleEarlyParticipants[to], numberOfFixedSaleBuys);
        }

        if( 
        	!swapping &&
        	tradingIsEnabled &&
            automatedMarketMakerPairs[to] && // sells only by detecting transfer to automated market maker pair
        	from != address(uniswapV2Router) && //router -> pair is removing liquidity which shouldn't have max
            !_isExcludedFromFees[to] //no max for those excluded from fees
        ) {
            if (!_isExcludedMaxSellTransactionAmount[from]) {
                require(amount <= maxSellTransactionAmount, "Sell transfer amount exceeds the maxSellTransactionAmount.");
            }
        }

		uint256 contractTokenBalance = balanceOf(address(this));
        
        bool canSwap = contractTokenBalance >= swapTokensAtAmount;

        if(
            tradingIsEnabled && 
            canSwap &&
            !swapping &&
            !automatedMarketMakerPairs[from] &&
            from != liquidityWallet &&
            to != liquidityWallet
        ) {
            swapping = true;

            uint256 swapTokens = contractTokenBalance.mul(liquidityFee).div(totalFees);
            swapAndLiquify(swapTokens);

            uint256 sellTokens = balanceOf(address(this));
            swapAndSendDividends(sellTokens);

            swapping = false;
        }


        bool takeFee = !isFixedSaleBuy && tradingIsEnabled && !swapping;

        // if any account belongs to _isExcludedFromFee account then remove the fee
        if(_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
            takeFee = false;
        }

        if(takeFee) {
        	uint256 fees = amount.mul(totalFees).div(100);

            // if sell, multiply by 1.2
            if(automatedMarketMakerPairs[to]) {
                fees = fees.mul(sellFeeIncreaseFactor).div(100);
            }

        	amount = amount.sub(fees);

            super._transfer(from, address(this), fees);
        }

        super._transfer(from, to, amount);

        try dividendTracker.setBalance(payable(from), balanceOf(from)) {} catch {}
        try dividendTracker.setBalance(payable(to), balanceOf(to)) {} catch {}

        if(!swapping) {
	    	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 swapAndLiquify(uint256 tokens) private {
        // split the contract balance into halves
        uint256 half = tokens.div(2);
        uint256 otherHalf = tokens.sub(half);

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

        // swap tokens for ETH
        swapTokensForEth(half); // <- this breaks the ETH -> HATE swap when swap+liquify is triggered

        // how much ETH did we just swap into?
        uint256 newBalance = address(this).balance.sub(initialBalance);

        // add liquidity to uniswap
        addLiquidity(otherHalf, newBalance);
        
        emit SwapAndLiquify(half, newBalance, otherHalf);
    }

    function swapTokensForEth(uint256 tokenAmount) private {

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

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

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

    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // add the liquidity
        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            liquidityWallet,
            block.timestamp
        );
        
    }

    function swapAndSendDividends(uint256 tokens) private {
        swapTokensForEth(tokens);
        uint256 dividends = address(this).balance;
        (bool success,) = address(dividendTracker).call{value: dividends}("");

        if(success) {
   	 		emit SendDividends(tokens, dividends);
        }
    }
}

contract MINISHIBDividendTracker is DividendPayingToken, Ownable {
    using SafeMath 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 ClaimWaitUpdated(uint256 indexed newValue, uint256 indexed oldValue);

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

    constructor() public DividendPayingToken("MINISHIB_Dividend_Tracker", "MINISHIB_Dividend_Tracker") {
    	claimWait = 1800;
        minimumTokenBalanceForDividends = 10 * 10**9 * (10**18); //must hold 10000+ tokens
    }

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

    function withdrawDividend() public override {
        require(false, "MINISHIB_Dividend_Tracker: withdrawDividend disabled. Use the 'claim' function on the main MINISHIB contract.");
    }

    function excludeFromDividends(address account) external onlyOwner {
    	require(!excludedFromDividends[account]);
    	excludedFromDividends[account] = true;

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

    	emit ExcludeFromDividends(account);
    }

    function updateClaimWait(uint256 newClaimWait) external onlyOwner {
        require(newClaimWait >= 1800 && newClaimWait <= 86400, "MINISHIB_Dividend_Tracker: claimWait must be updated to between 1 and 24 hours");
        require(newClaimWait != claimWait, "MINISHIB_Dividend_Tracker: Cannot update claimWait to same value");
        emit ClaimWaitUpdated(newClaimWait, claimWait);
        claimWait = newClaimWait;
    }

    function getLastProcessedIndex() external view returns(uint256) {
    	return lastProcessedIndex;
    }

    function getNumberOfTokenHolders() external view returns(uint256) {
        return tokenHoldersMap.keys.length;
    }



    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 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":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"accounts","type":"address[]"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeMultipleAccountsFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludedMaxSellTransactionAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"bool","name":"earlyParticipant","type":"bool"},{"indexed":false,"internalType":"uint256","name":"numberOfBuyers","type":"uint256"}],"name":"FixedSaleBuy","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"participants","type":"address[]"}],"name":"FixedSaleEarlyParticipantsAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"GasForProcessingUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newLiquidityWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldLiquidityWallet","type":"address"}],"name":"LiquidityWalletUpdated","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":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SendDividends","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":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","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"},{"inputs":[],"name":"MATICRewardsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"accounts","type":"address[]"}],"name":"addFixedSaleEarlyParticipants","outputs":[],"stateMutability":"nonpayable","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":[{"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":"bounceFixedSaleWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"dividendTokenBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dividendTracker","outputs":[{"internalType":"contract MINISHIBDividendTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeMultipleAccountsFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"fixedSaleBuyers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fixedSaleEarlyParticipantBuysThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fixedSaleEarlyParticipantDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"fixedSaleEarlyParticipants","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fixedSaleStartTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gasForProcessing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getAccountDividendsInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getAccountDividendsInfoAtIndex","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getClaimWait","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastProcessedIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfDividendTokenHolders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalDividendsDistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTradingIsEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSellTransactionAmount","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":"numberOfFixedSaleBuys","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gas","type":"uint256"}],"name":"processDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellFeeIncreaseFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","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":"totalFees","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":"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":"updateBounceFixedSaleWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"claimWait","type":"uint256"}],"name":"updateClaimWait","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newTimestamp","type":"uint256"}],"name":"updateFixedSaleStartTimestamp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"updateGasForProcessing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newLiquidityWallet","type":"address"}],"name":"updateLiquidityWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"updAds","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"updateMaxSellTransactionAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newTradingEnabledTimestamp","type":"uint256"}],"name":"updateTradingEnabledTimestamp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateUniswapV2Router","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"withdrawableDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

6101606040526c3f1bdf10116048a59340000000600a556c0c9f2c9cd04674edea40000000600b55607861010052620493e0600c556360cba9c0600d55610258610120819052610140526360cbc5e06010553480156200005e57600080fd5b5060408051808201825260088082526726a4a724a9a424a160c11b602080840182815285518087019096529285528401528151919291620000a29160039162000b4a565b508051620000b890600490602084019062000b4a565b5050506000620000cd620006b660201b60201c565b600580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600560a081905260c081905280620001408180620006ba602090811b620027a617901c565b60e052604051620001519062000bcf565b604051809103906000f0801580156200016e573d6000803e3d6000fd5b50600880546001600160a01b0319166001600160a01b0392909216919091179055620001996200071c565b600960006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600073a5e0829caced8ffdd4de3c43696c57f7d7a678ff90506000816001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156200021457600080fd5b505afa15801562000229573d6000803e3d6000fd5b505050506040513d60208110156200024057600080fd5b5051604080516315ab88c960e31b815290516001600160a01b039283169263c9c653969230929187169163ad5c464891600480820192602092909190829003018186803b1580156200029157600080fd5b505afa158015620002a6573d6000803e3d6000fd5b505050506040513d6020811015620002bd57600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301525160448083019260209291908290030181600087803b1580156200031057600080fd5b505af115801562000325573d6000803e3d6000fd5b505050506040513d60208110156200033c57600080fd5b5051600680546001600160a01b0319166001600160a01b038516179055606081901b6001600160601b03191660805290506200037a8160016200072b565b600780546001600160a01b031916734fc4bfedc5c82644514facf716c7f888a0c73ccc9081179091556008546040805163031e79db60e41b81526001600160a01b039290921660048301819052905190916331e79db091602480830192600092919082900301818387803b158015620003f257600080fd5b505af115801562000407573d6000803e3d6000fd5b50506008546040805163031e79db60e41b815230600482015290516001600160a01b0390921693506331e79db0925060248082019260009290919082900301818387803b1580156200045857600080fd5b505af11580156200046d573d6000803e3d6000fd5b50506008546001600160a01b031691506331e79db090506200048e6200071c565b6040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b158015620004ce57600080fd5b505af1158015620004e3573d6000803e3d6000fd5b50506008546040805163031e79db60e41b81526001600160a01b03888116600483015291519190921693506331e79db09250602480830192600092919082900301818387803b1580156200053657600080fd5b505af11580156200054b573d6000803e3d6000fd5b50506008546040805163031e79db60e41b81526001600160a01b03868116600483015291519190921693506331e79db09250602480830192600092919082900301818387803b1580156200059e57600080fd5b505af1158015620005b3573d6000803e3d6000fd5b5050600954620005d192506001600160a01b0316905060016200085e565b620005de3060016200085e565b620005f4620005ec6200071c565b60016200097a565b620006013060016200097a565b6008546200061a906001600160a01b031660016200097a565b620006278360016200097a565b620006348160016200097a565b600160126000620006446200071c565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff1996871617905590851681526012909252902080549091166001179055620006ab620006966200071c565b6d314dc6448d9338c15b0a0000000062000a36565b505050505062000bf4565b3390565b60008282018381101562000715576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6005546001600160a01b031690565b6001600160a01b03821660009081526015602052604090205460ff16151581151514156200078b5760405162461bcd60e51b815260040180806020018281038252604281526020018062006e2e6042913960600191505060405180910390fd5b6001600160a01b0382166000908152601560205260409020805460ff1916821580159190911790915562000822576008546040805163031e79db60e41b81526001600160a01b038581166004830152915191909216916331e79db091602480830192600092919082900301818387803b1580156200080857600080fd5b505af11580156200081d573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b62000868620006b6565b6005546001600160a01b03908116911614620008ba576040805162461bcd60e51b8152602060048201819052602482015260008051602062006e0e833981519152604482015290519081900360640190fd5b6001600160a01b03821660009081526011602052604090205460ff16151581151514156200091a5760405162461bcd60e51b815260040180806020018281038252603481526020018062006e706034913960400191505060405180910390fd5b6001600160a01b038216600081815260116020908152604091829020805460ff1916851515908117909155825190815291517f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df79281900390910190a25050565b62000984620006b6565b6005546001600160a01b03908116911614620009d6576040805162461bcd60e51b8152602060048201819052602482015260008051602062006e0e833981519152604482015290519081900360640190fd5b6001600160a01b038216600081815260146020908152604091829020805460ff1916851515908117909155825190815291517fa745b79c9942f47d553e54242165de0cc7bed53246fad779598eff0f8b756e6f9281900390910190a25050565b6001600160a01b03821662000a92576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b62000aa06000838362000b45565b62000abc81600254620006ba60201b620027a61790919060201c565b6002556001600160a01b0382166000908152602081815260409091205462000aef918390620027a6620006ba821b17901c565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1062000b8d57805160ff191683800117855562000bbd565b8280016001018555821562000bbd579182015b8281111562000bbd57825182559160200191906001019062000ba0565b5062000bcb92915062000bdd565b5090565b6123e08062004a2e83390190565b5b8082111562000bcb576000815560010162000bde565b60805160601c60a05160c05160e051610100516101205161014051613dc062000c6e600039806114e65280612ac45250806123b85280612a86525080610fac5280612edb525080610f735280612d875280612e88525080611a905280612dac52508061261f5250806111355280611b0c5250613dc06000f3fe6080604052600436106103a65760003560e01c806395d89b41116101e7578063c26663071161010d578063e2f45605116100a0578063f1570d241161006f578063f1570d2414610da5578063f27fd25414610dba578063f2fde38b14610de4578063fa05e42c14610e17576103ad565b8063e2f4560514610d1e578063e37ba8f914610d33578063e7841ec014610d66578063e98030c714610d7b576103ad565b8063d5a66131116100dc578063d5a6613114610ca4578063d6e74f8b14610cb9578063d76629a414610cce578063dd62ed3e14610ce3576103ad565b8063c266630714610bab578063c492f04614610bd5578063cded01d114610c54578063d469801614610c8f576103ad565b8063a521fa9611610185578063b62496f511610154578063b62496f514610ad7578063be12192d14610b0a578063bfa7a86c14610b3d578063c024666814610b70576103ad565b8063a521fa9614610970578063a8b9d240146109ed578063a9059cbb14610a20578063ad56c13c14610a59576103ad565b80639c1b8af5116101c15780639c1b8af5146108e3578063a26579ad146108f8578063a3c4e34a1461090d578063a457c2d714610937576103ad565b806395d89b411461087e57806398118cb4146108935780639a7a23d6146108a8576103ad565b806349bd5a5e116102cc5780636843cd841161026a578063715018a611610239578063715018a6146107f7578063871c128d1461080c57806388bdd9be146108365780638da5cb5b14610869576103ad565b80636843cd8414610752578063700bb1911461078557806370a08231146107af5780637138b011146107e2576103ad565b80634fbee193116102a65780634fbee193146106a457806359564da0146106d757806364b0f6531461070a57806365b8dbc01461071f576103ad565b806349bd5a5e146106655780634d33b1ef1461067a5780634e71d92d1461068f576103ad565b806318160ddd116103445780632c1f5216116103135780632c1f5216146105d757806330bb4cff146105ec578063313ce56714610601578063395093511461062c576103ad565b806318160ddd1461055557806322bd3f7f1461056a57806323b872dd1461057f57806325b61703146105c2576103ad565b8063095ea7b311610380578063095ea7b3146104aa578063106b5da1146104e357806313114a9d1461050f5780631694505e14610524576103ad565b806302259e9e146103b257806306fdde03146103d95780630855f25d14610463576103ad565b366103ad57005b600080fd5b3480156103be57600080fd5b506103c7610e2c565b60408051918252519081900360200190f35b3480156103e557600080fd5b506103ee610e32565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610428578181015183820152602001610410565b50505050905090810190601f1680156104555780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561046f57600080fd5b506104966004803603602081101561048657600080fd5b50356001600160a01b0316610ec8565b604080519115158252519081900360200190f35b3480156104b657600080fd5b50610496600480360360408110156104cd57600080fd5b506001600160a01b038135169060200135610edd565b3480156104ef57600080fd5b5061050d6004803603602081101561050657600080fd5b5035610efb565b005b34801561051b57600080fd5b506103c7610f71565b34801561053057600080fd5b50610539610f95565b604080516001600160a01b039092168252519081900360200190f35b34801561056157600080fd5b506103c7610fa4565b34801561057657600080fd5b506103c7610faa565b34801561058b57600080fd5b50610496600480360360608110156105a257600080fd5b506001600160a01b03813581169160208101359091169060400135610fce565b3480156105ce57600080fd5b506103c7611055565b3480156105e357600080fd5b5061053961105b565b3480156105f857600080fd5b506103c761106a565b34801561060d57600080fd5b506106166110e0565b6040805160ff9092168252519081900360200190f35b34801561063857600080fd5b506104966004803603604081101561064f57600080fd5b506001600160a01b0381351690602001356110e5565b34801561067157600080fd5b50610539611133565b34801561068657600080fd5b50610496611157565b34801561069b57600080fd5b5061050d611160565b3480156106b057600080fd5b50610496600480360360208110156106c757600080fd5b50356001600160a01b03166111e5565b3480156106e357600080fd5b50610496600480360360208110156106fa57600080fd5b50356001600160a01b0316611203565b34801561071657600080fd5b506103c7611218565b34801561072b57600080fd5b5061050d6004803603602081101561074257600080fd5b50356001600160a01b031661125d565b34801561075e57600080fd5b506103c76004803603602081101561077557600080fd5b50356001600160a01b031661135f565b34801561079157600080fd5b5061050d600480360360208110156107a857600080fd5b50356113e2565b3480156107bb57600080fd5b506103c7600480360360208110156107d257600080fd5b50356001600160a01b03166114c9565b3480156107ee57600080fd5b506103c76114e4565b34801561080357600080fd5b5061050d611508565b34801561081857600080fd5b5061050d6004803603602081101561082f57600080fd5b50356115aa565b34801561084257600080fd5b5061050d6004803603602081101561085957600080fd5b50356001600160a01b03166116c7565b34801561087557600080fd5b50610539611a1e565b34801561088a57600080fd5b506103ee611a2d565b34801561089f57600080fd5b506103c7611a8e565b3480156108b457600080fd5b5061050d600480360360408110156108cb57600080fd5b506001600160a01b0381351690602001351515611ab2565b3480156108ef57600080fd5b506103c7611b85565b34801561090457600080fd5b506103c7611b8b565b34801561091957600080fd5b5061050d6004803603602081101561093057600080fd5b5035611bd0565b34801561094357600080fd5b506104966004803603604081101561095a57600080fd5b506001600160a01b038135169060200135611c3c565b34801561097c57600080fd5b5061050d6004803603602081101561099357600080fd5b8101906020810181356401000000008111156109ae57600080fd5b8201836020820111156109c057600080fd5b803590602001918460208302840111640100000000831117156109e257600080fd5b509092509050611ca4565b3480156109f957600080fd5b506103c760048036036020811015610a1057600080fd5b50356001600160a01b0316611dba565b348015610a2c57600080fd5b5061049660048036036040811015610a4357600080fd5b506001600160a01b038135169060200135611e0b565b348015610a6557600080fd5b50610a8c60048036036020811015610a7c57600080fd5b50356001600160a01b0316611e1f565b604080516001600160a01b0390991689526020890197909752878701959095526060870193909352608086019190915260a085015260c084015260e083015251908190036101000190f35b348015610ae357600080fd5b5061049660048036036020811015610afa57600080fd5b50356001600160a01b0316611eff565b348015610b1657600080fd5b5061049660048036036020811015610b2d57600080fd5b50356001600160a01b0316611f14565b348015610b4957600080fd5b5061050d60048036036020811015610b6057600080fd5b50356001600160a01b0316611f29565b348015610b7c57600080fd5b5061050d60048036036040811015610b9357600080fd5b506001600160a01b0381351690602001351515612038565b348015610bb757600080fd5b5061050d60048036036020811015610bce57600080fd5b503561214e565b348015610be157600080fd5b5061050d60048036036040811015610bf857600080fd5b810190602081018135640100000000811115610c1357600080fd5b820183602082011115610c2557600080fd5b80359060200191846020830284011164010000000083111715610c4757600080fd5b91935091503515156121ba565b348015610c6057600080fd5b5061050d60048036036040811015610c7757600080fd5b506001600160a01b03813516906020013515156122da565b348015610c9b57600080fd5b50610539612392565b348015610cb057600080fd5b506103c76123a1565b348015610cc557600080fd5b506105396123a7565b348015610cda57600080fd5b506103c76123b6565b348015610cef57600080fd5b506103c760048036036040811015610d0657600080fd5b506001600160a01b03813581169160200135166123da565b348015610d2a57600080fd5b506103c7612405565b348015610d3f57600080fd5b5061050d60048036036020811015610d5657600080fd5b50356001600160a01b031661240b565b348015610d7257600080fd5b506103c7612518565b348015610d8757600080fd5b5061050d60048036036020811015610d9e57600080fd5b503561255d565b348015610db157600080fd5b506103c761261d565b348015610dc657600080fd5b50610a8c60048036036020811015610ddd57600080fd5b5035612641565b348015610df057600080fd5b5061050d60048036036020811015610e0757600080fd5b50356001600160a01b03166126a7565b348015610e2357600080fd5b506103c76127a0565b600a5481565b60038054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610ebe5780601f10610e9357610100808354040283529160200191610ebe565b820191906000526020600020905b815481529060010190602001808311610ea157829003601f168201915b5050505050905090565b60146020526000908152604090205460ff1681565b6000610ef1610eea612807565b848461280b565b5060015b92915050565b610f03612807565b6005546001600160a01b03908116911614610f53576040805162461bcd60e51b81526020600482018190526024820152600080516020613a85833981519152604482015290519081900360640190fd5b80600a541415610f6257600080fd5b670de0b6b3a764000002600a55565b7f000000000000000000000000000000000000000000000000000000000000000081565b6006546001600160a01b031681565b60025490565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000610fdb8484846128f7565b61104b84610fe7612807565b61104685604051806060016040528060288152602001613a5d602891396001600160a01b038a16600090815260016020526040812090611025612807565b6001600160a01b03168152602081019190915260400160002054919061310b565b61280b565b5060019392505050565b60105481565b6008546001600160a01b031681565b600854604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae916004808301926020929190829003018186803b1580156110af57600080fd5b505afa1580156110c3573d6000803e3d6000fd5b505050506040513d60208110156110d957600080fd5b5051905090565b601290565b6000610ef16110f2612807565b846110468560016000611103612807565b6001600160a01b03908116825260208083019390935260409182016000908120918c1681529252902054906127a6565b7f000000000000000000000000000000000000000000000000000000000000000081565b60105442101590565b6008546040805163bc4c4b3760e01b815233600482015260006024820181905291516001600160a01b039093169263bc4c4b3792604480840193602093929083900390910190829087803b1580156111b757600080fd5b505af11580156111cb573d6000803e3d6000fd5b505050506040513d60208110156111e157600080fd5b5050565b6001600160a01b031660009081526011602052604090205460ff1690565b60136020526000908152604090205460ff1681565b600854604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde916004808301926020929190829003018186803b1580156110af57600080fd5b611265612807565b6005546001600160a01b039081169116146112b5576040805162461bcd60e51b81526020600482018190526024820152600080516020613a85833981519152604482015290519081900360640190fd5b6006546001600160a01b03828116911614156113025760405162461bcd60e51b815260040180806020018281038252602d815260200180613bb9602d913960400191505060405180910390fd5b6006546040516001600160a01b03918216918316907f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e90600090a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b600854604080516370a0823160e01b81526001600160a01b038481166004830152915160009392909216916370a0823191602480820192602092909190829003018186803b1580156113b057600080fd5b505afa1580156113c4573d6000803e3d6000fd5b505050506040513d60208110156113da57600080fd5b505192915050565b600854604080516001624d3b8760e01b03198152600481018490529051600092839283926001600160a01b039092169163ffb2c4799160248082019260609290919082900301818787803b15801561143957600080fd5b505af115801561144d573d6000803e3d6000fd5b505050506040513d606081101561146357600080fd5b5080516020808301516040938401518451848152928301829052828501819052606083018990529351929650945091925032916000917fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989181900360800190a350505050565b6001600160a01b031660009081526020819052604090205490565b7f000000000000000000000000000000000000000000000000000000000000000081565b611510612807565b6005546001600160a01b03908116911614611560576040805162461bcd60e51b81526020600482018190526024820152600080516020613a85833981519152604482015290519081900360640190fd5b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6115b2612807565b6005546001600160a01b03908116911614611602576040805162461bcd60e51b81526020600482018190526024820152600080516020613a85833981519152604482015290519081900360640190fd5b62030d40811015801561161857506207a1208111155b6116535760405162461bcd60e51b815260040180806020018281038252603e8152602001806139a1603e913960400191505060405180910390fd5b600c548114156116945760405162461bcd60e51b8152600401808060200182810382526036815260200180613cfa6036913960400191505060405180910390fd5b600c5460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a3600c55565b6116cf612807565b6005546001600160a01b0390811691161461171f576040805162461bcd60e51b81526020600482018190526024820152600080516020613a85833981519152604482015290519081900360640190fd5b6008546001600160a01b038281169116141561176c5760405162461bcd60e51b8152600401808060200182810382526037815260200180613a056037913960400191505060405180910390fd5b6000819050306001600160a01b0316816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156117b457600080fd5b505afa1580156117c8573d6000803e3d6000fd5b505050506040513d60208110156117de57600080fd5b50516001600160a01b0316146118255760405162461bcd60e51b815260040180806020018281038252604f815260200180613ae7604f913960600191505060405180910390fd5b806001600160a01b03166331e79db0826040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b15801561187457600080fd5b505af1158015611888573d6000803e3d6000fd5b50506040805163031e79db60e41b815230600482015290516001600160a01b03851693506331e79db09250602480830192600092919082900301818387803b1580156118d357600080fd5b505af11580156118e7573d6000803e3d6000fd5b50505050806001600160a01b03166331e79db0611902611a1e565b6040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b15801561194157600080fd5b505af1158015611955573d6000803e3d6000fd5b50506006546040805163031e79db60e41b81526001600160a01b039283166004820152905191851693506331e79db0925060248082019260009290919082900301818387803b1580156119a757600080fd5b505af11580156119bb573d6000803e3d6000fd5b50506008546040516001600160a01b03918216935090851691507f90c7d74461c613da5efa97d90740869367d74ab3aa5837aa4ae9a975f954b7a890600090a3600880546001600160a01b0319166001600160a01b039290921691909117905550565b6005546001600160a01b031690565b60048054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610ebe5780601f10610e9357610100808354040283529160200191610ebe565b7f000000000000000000000000000000000000000000000000000000000000000081565b611aba612807565b6005546001600160a01b03908116911614611b0a576040805162461bcd60e51b81526020600482018190526024820152600080516020613a85833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611b7b5760405162461bcd60e51b815260040180806020018281038252604f815260200180613c87604f913960600191505060405180910390fd5b6111e182826131a2565b600c5481565b60085460408051631bc9e27b60e21b815290516000926001600160a01b031691636f2789ec916004808301926020929190829003018186803b1580156110af57600080fd5b611bd8612807565b6005546001600160a01b03908116911614611c28576040805162461bcd60e51b81526020600482018190526024820152600080516020613a85833981519152604482015290519081900360640190fd5b601054811415611c3757600080fd5b601055565b6000610ef1611c49612807565b8461104685604051806060016040528060258152602001613d666025913960016000611c73612807565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919061310b565b611cac612807565b6005546001600160a01b03908116911614611cfc576040805162461bcd60e51b81526020600482018190526024820152600080516020613a85833981519152604482015290519081900360640190fd5b60005b81811015611d5257600160136000858585818110611d1957fe5b602090810292909201356001600160a01b0316835250810191909152604001600020805460ff1916911515919091179055600101611cff565b507f7cf3c5c4bc7c099ff1d70df0213705f2c444d9e178bb00fd81749896c767c9a8828260405180806020018281038252848482818152602001925060200280828437600083820152604051601f909101601f19169092018290039550909350505050a15050565b600854604080516302a2e74960e61b81526001600160a01b0384811660048301529151600093929092169163a8b9d24091602480820192602092909190829003018186803b1580156113b057600080fd5b6000610ef1611e18612807565b84846128f7565b600080600080600080600080600860009054906101000a90046001600160a01b03166001600160a01b031663fbcbc0f18a6040518263ffffffff1660e01b815260040180826001600160a01b031681526020019150506101006040518083038186803b158015611e8e57600080fd5b505afa158015611ea2573d6000803e3d6000fd5b505050506040513d610100811015611eb957600080fd5b508051602082015160408301516060840151608085015160a086015160c087015160e090970151959e50939c50919a509850965094509092509050919395975091939597565b60156020526000908152604090205460ff1681565b600f6020526000908152604090205460ff1681565b611f31612807565b6005546001600160a01b03908116911614611f81576040805162461bcd60e51b81526020600482018190526024820152600080516020613a85833981519152604482015290519081900360640190fd5b6001600160a01b038116611f9457600080fd5b600780546001600160a01b0319166001600160a01b0383811691909117918290556008546040805163031e79db60e41b81529383166004850152519116916331e79db091602480830192600092919082900301818387803b158015611ff857600080fd5b505af115801561200c573d6000803e3d6000fd5b50506007546001600160a01b03166000908152601260205260409020805460ff19166001179055505050565b612040612807565b6005546001600160a01b03908116911614612090576040805162461bcd60e51b81526020600482018190526024820152600080516020613a85833981519152604482015290519081900360640190fd5b6001600160a01b03821660009081526011602052604090205460ff16151581151514156120ee5760405162461bcd60e51b8152600401808060200182810382526034815260200180613b366034913960400191505060405180910390fd5b6001600160a01b038216600081815260116020908152604091829020805460ff1916851515908117909155825190815291517f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df79281900390910190a25050565b612156612807565b6005546001600160a01b039081169116146121a6576040805162461bcd60e51b81526020600482018190526024820152600080516020613a85833981519152604482015290519081900360640190fd5b600d548114156121b557600080fd5b600d55565b6121c2612807565b6005546001600160a01b03908116911614612212576040805162461bcd60e51b81526020600482018190526024820152600080516020613a85833981519152604482015290519081900360640190fd5b60005b8281101561226757816011600086868581811061222e57fe5b602090810292909201356001600160a01b0316835250810191909152604001600020805460ff1916911515919091179055600101612215565b507f7fdaf542373fa84f4ee8d662c642f44e4c2276a217d7d29e548b6eb29a233b35838383604051808060200183151581526020018281038252858582818152602001925060200280828437600083820152604051601f909101601f1916909201829003965090945050505050a1505050565b6122e2612807565b6005546001600160a01b03908116911614612332576040805162461bcd60e51b81526020600482018190526024820152600080516020613a85833981519152604482015290519081900360640190fd5b6001600160a01b038216600081815260146020908152604091829020805460ff1916851515908117909155825190815291517fa745b79c9942f47d553e54242165de0cc7bed53246fad779598eff0f8b756e6f9281900390910190a25050565b6009546001600160a01b031681565b600d5481565b6007546001600160a01b031681565b7f000000000000000000000000000000000000000000000000000000000000000081565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600b5481565b612413612807565b6005546001600160a01b03908116911614612463576040805162461bcd60e51b81526020600482018190526024820152600080516020613a85833981519152604482015290519081900360640190fd5b6009546001600160a01b03828116911614156124b05760405162461bcd60e51b8152600401808060200182810382526036815260200180613d306036913960400191505060405180910390fd5b6124bb816001612038565b6009546040516001600160a01b03918216918316907f6080503d1da552ae8eb4b7b8a20245d9fabed014180510e7d1a05ea08fdb0f3e90600090a3600980546001600160a01b0319166001600160a01b0392909216919091179055565b6008546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec0916004808301926020929190829003018186803b1580156110af57600080fd5b612565612807565b6005546001600160a01b039081169116146125b5576040805162461bcd60e51b81526020600482018190526024820152600080516020613a85833981519152604482015290519081900360640190fd5b6008546040805163e98030c760e01b81526004810184905290516001600160a01b039092169163e98030c79160248082019260009290919082900301818387803b15801561260257600080fd5b505af1158015612616573d6000803e3d6000fd5b5050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600080600080600080600080600860009054906101000a90046001600160a01b03166001600160a01b0316635183d6fd8a6040518263ffffffff1660e01b8152600401808281526020019150506101006040518083038186803b158015611e8e57600080fd5b6126af612807565b6005546001600160a01b039081169116146126ff576040805162461bcd60e51b81526020600482018190526024820152600080516020613a85833981519152604482015290519081900360640190fd5b6001600160a01b0381166127445760405162461bcd60e51b81526004018080602001828103825260268152602001806139596026913960400191505060405180910390fd5b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b600e5481565b600082820183811015612800576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b3390565b6001600160a01b0383166128505760405162461bcd60e51b8152600401808060200182810382526024815260200180613cd66024913960400191505060405180910390fd5b6001600160a01b0382166128955760405162461bcd60e51b815260040180806020018281038252602281526020018061397f6022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b03831661293c5760405162461bcd60e51b8152600401808060200182810382526025815260200180613c286025913960400191505060405180910390fd5b6001600160a01b0382166129815760405162461bcd60e51b81526004018080602001828103825260238152602001806139096023913960400191505060405180910390fd5b600061298b611157565b9050806129e9576001600160a01b03841660009081526012602052604090205460ff166129e95760405162461bcd60e51b8152600401808060200182810382526042815260200180613be66042913960600191505060405180910390fd5b81612a00576129fa848460006132d0565b50613106565b6007546000906001600160a01b038681169116148015612a395750612a23611a1e565b6001600160a01b0316846001600160a01b031614155b90508015612bfb57600d54421015612a825760405162461bcd60e51b815260040180806020018281038252602d81526020018061392c602d913960400191505060405180910390fd5b60007f0000000000000000000000000000000000000000000000000000000000000000612aba600d544261342b90919063ffffffff16565b101580612ae957507f0000000000000000000000000000000000000000000000000000000000000000600e5410155b905080612b47576001600160a01b03851660009081526013602052604090205460ff16612b475760405162461bcd60e51b815260040180806020018281038252604f815260200180613b6a604f913960600191505060405180910390fd5b6001600160a01b0385166000908152600f602052604090205460ff16612b9d576001600160a01b0385166000908152600f60205260409020805460ff19166001908117909155600e54612b99916127a6565b600e555b6001600160a01b03851660008181526013602090815260409182902054600e548351908152925160ff909116151593889390927ff8f6fae5f115e4ba1a75c2ebafc531ee926bca48b39fc48719d55c7209c8d90f92918290030190a4505b600754600160a01b900460ff16158015612c125750815b8015612c3657506001600160a01b03841660009081526015602052604090205460ff165b8015612c5057506006546001600160a01b03868116911614155b8015612c7557506001600160a01b03841660009081526011602052604090205460ff16155b15612cdb576001600160a01b03851660009081526014602052604090205460ff16612cdb57600a54831115612cdb5760405162461bcd60e51b815260040180806020018281038252603a815260200180613c4d603a913960400191505060405180910390fd5b6000612ce6306114c9565b600b54909150811015838015612cf95750805b8015612d0f5750600754600160a01b900460ff16155b8015612d3457506001600160a01b03871660009081526015602052604090205460ff16155b8015612d4e57506009546001600160a01b03888116911614155b8015612d6857506009546001600160a01b03878116911614155b15612e07576007805460ff60a01b1916600160a01b1790556000612dd67f0000000000000000000000000000000000000000000000000000000000000000612dd0857f000000000000000000000000000000000000000000000000000000000000000061346d565b906134c6565b9050612de181613508565b6000612dec306114c9565b9050612df78161358e565b50506007805460ff60a01b191690555b600083158015612e145750845b8015612e2a5750600754600160a01b900460ff16155b6001600160a01b03891660009081526011602052604090205490915060ff1680612e6c57506001600160a01b03871660009081526011602052604090205460ff165b15612e75575060005b8015612f1b576000612eac6064612dd0897f000000000000000000000000000000000000000000000000000000000000000061346d565b6001600160a01b03891660009081526015602052604090205490915060ff1615612f0257612eff6064612dd0837f000000000000000000000000000000000000000000000000000000000000000061346d565b90505b612f0c878261342b565b9650612f198930836132d0565b505b612f268888886132d0565b6008546001600160a01b031663e30443bc89612f41816114c9565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015612f8757600080fd5b505af1925050508015612f98575060015b506008546001600160a01b031663e30443bc88612fb4816114c9565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015612ffa57600080fd5b505af192505050801561300b575060015b50600754600160a01b900460ff1661310057600c54600854604080516001624d3b8760e01b031981526004810184905290516001600160a01b039092169163ffb2c479916024808201926060929091908290030181600087803b15801561307157600080fd5b505af19250505080156130a557506040513d606081101561309157600080fd5b508051602082015160409092015190919060015b6130ae576130fe565b604080518481526020810184905280820183905260608101869052905132916001917fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989181900360800190a35050505b505b50505050505b505050565b6000818484111561319a5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561315f578181015183820152602001613147565b50505050905090810190601f16801561318c5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6001600160a01b03821660009081526015602052604090205460ff16151581151514156132005760405162461bcd60e51b8152600401808060200182810382526042815260200180613aa56042913960600191505060405180910390fd5b6001600160a01b0382166000908152601560205260409020805460ff19168215801591909117909155613294576008546040805163031e79db60e41b81526001600160a01b038581166004830152915191909216916331e79db091602480830192600092919082900301818387803b15801561327b57600080fd5b505af115801561328f573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6001600160a01b0383166133155760405162461bcd60e51b8152600401808060200182810382526025815260200180613c286025913960400191505060405180910390fd5b6001600160a01b03821661335a5760405162461bcd60e51b81526004018080602001828103825260238152602001806139096023913960400191505060405180910390fd5b613365838383613106565b6133a2816040518060600160405280602681526020016139df602691396001600160a01b038616600090815260208190526040902054919061310b565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546133d190826127a6565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600061280083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061310b565b60008261347c57506000610ef5565b8282028284828161348957fe5b04146128005760405162461bcd60e51b8152600401808060200182810382526021815260200180613a3c6021913960400191505060405180910390fd5b600061280083836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613637565b60006135158260026134c6565b90506000613523838361342b565b90504761352f8361369c565b600061353b478361342b565b9050613547838261384a565b604080518581526020810183905280820185905290517f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619181900360600190a15050505050565b6135978161369c565b60085460405147916000916001600160a01b039091169083908381818185875af1925050503d80600081146135e8576040519150601f19603f3d011682016040523d82523d6000602084013e6135ed565b606091505b50509050801561310657604080518481526020810184905281517f80195cc573b02cc48460cbca6e6e4cc85ddb91959d946e1c3025ea3d87942dc3929181900390910190a1505050565b600081836136865760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561315f578181015183820152602001613147565b50600083858161369257fe5b0495945050505050565b604080516002808252606080830184529260208301908036833701905050905030816000815181106136ca57fe5b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b15801561371e57600080fd5b505afa158015613732573d6000803e3d6000fd5b505050506040513d602081101561374857600080fd5b505181518290600190811061375957fe5b6001600160a01b03928316602091820292909201015260065461377f913091168461280b565b60065460405163791ac94760e01b8152600481018481526000602483018190523060648401819052426084850181905260a060448601908152875160a487015287516001600160a01b039097169663791ac947968a968a9594939092909160c40190602080880191028083838b5b838110156138055781810151838201526020016137ed565b505050509050019650505050505050600060405180830381600087803b15801561382e57600080fd5b505af1158015613842573d6000803e3d6000fd5b505050505050565b6006546138629030906001600160a01b03168461280b565b6006546009546040805163f305d71960e01b81523060048201526024810186905260006044820181905260648201526001600160a01b0392831660848201524260a48201529051919092169163f305d71991849160c48082019260609290919082900301818588803b1580156138d757600080fd5b505af11580156138eb573d6000803e3d6000fd5b50505050506040513d606081101561390257600080fd5b5050505056fe45524332303a207472616e7366657220746f20746865207a65726f20616464726573734d494e49534849423a205468652066697865642d73616c6520686173206e6f742073746172746564207965742e4f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f20616464726573734d494e49534849423a20676173466f7250726f63657373696e67206d757374206265206265747765656e203230302c30303020616e64203530302c30303045524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63654d494e49534849423a20546865206469766964656e6420747261636b657220616c72656164792068617320746861742061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65724d494e49534849423a204175746f6d61746564206d61726b6574206d616b6572207061697220697320616c72656164792073657420746f20746861742076616c75654d494e49534849423a20546865206e6577206469766964656e6420747261636b6572206d757374206265206f776e656420627920746865204d494e495348494220746f6b656e20636f6e74726163744d494e49534849423a204163636f756e7420697320616c7265616479207468652076616c7565206f6620276578636c75646564274d494e49534849423a205468652066697865642d73616c65206973206f6e6c7920617661696c61626c6520746f206365727461696e207061727469636970616e7473206174207468652073746172744d494e49534849423a2054686520726f7574657220616c726561647920686173207468617420616464726573734d494e49534849423a2054686973206163636f756e742063616e6e6f742073656e6420746f6b656e7320756e74696c2074726164696e6720697320656e61626c656445524332303a207472616e736665722066726f6d20746865207a65726f206164647265737353656c6c207472616e7366657220616d6f756e74206578636565647320746865206d617853656c6c5472616e73616374696f6e416d6f756e742e4d494e49534849423a205468652050616e63616b655377617020706169722063616e6e6f742062652072656d6f7665642066726f6d206175746f6d617465644d61726b65744d616b6572506169727345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573734d494e49534849423a2043616e6e6f742075706461746520676173466f7250726f63657373696e6720746f2073616d652076616c75654d494e49534849423a20546865206c69717569646974792077616c6c657420697320616c72656164792074686973206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212206dbad27ab496d8f5542a5f70e7fafd9a17fa19fcc8600ad7f02d1dc946348aaf64736f6c634300060c003360a06040523480156200001157600080fd5b5060408051808201825260198082527f4d494e49534849425f4469766964656e645f547261636b657200000000000000602080840182815285518087019096529285528401528151919291839183916200006e9160039162000109565b5080516200008490600490602084019062000109565b505050505060006200009b6200010560201b60201c565b600980546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506107086011556b204fce5e3e25026110000000608052620001a5565b3390565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200014c57805160ff19168380011785556200017c565b828001600101855582156200017c579182015b828111156200017c5782518255916020019190600101906200015f565b506200018a9291506200018e565b5090565b5b808211156200018a57600081556001016200018f565b60805161221b620001c5600039806111445280611211525061221b6000f3fe6080604052600436106102085760003560e01c8063715018a611610118578063bc4c4b37116100a0578063e7841ec01161006f578063e7841ec0146107d0578063e98030c7146107e5578063f2fde38b1461080f578063fbcbc0f114610842578063ffb2c4791461087557610217565b8063bc4c4b371461070c578063be10b61414610747578063dd62ed3e1461075c578063e30443bc1461079757610217565b806395d89b41116100e757806395d89b411461061f578063a457c2d714610634578063a8b9d2401461066d578063a9059cbb146106a0578063aafd847a146106d957610217565b8063715018a61461059157806385a6b3ae146105a65780638da5cb5b146105bb57806391b89fba146105ec57610217565b80633009a6091161019b5780634e7b827f1161016a5780634e7b827f1461048c5780635183d6fd146104bf5780636a474002146105345780636f2789ec1461054957806370a082311461055e57610217565b80633009a609146103e0578063313ce567146103f557806331e79db014610420578063395093511461045357610217565b806318160ddd116101d757806318160ddd14610322578063226cfa3d1461033757806323b872dd1461036a57806327ce0147146103ad57610217565b806303c833021461021c57806306fdde0314610224578063095ea7b3146102ae57806309bbedde146102fb57610217565b36610217576102156108bd565b005b600080fd5b6102156108bd565b34801561023057600080fd5b5061023961094e565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561027357818101518382015260200161025b565b50505050905090810190601f1680156102a05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156102ba57600080fd5b506102e7600480360360408110156102d157600080fd5b506001600160a01b0381351690602001356109e4565b604080519115158252519081900360200190f35b34801561030757600080fd5b50610310610a02565b60408051918252519081900360200190f35b34801561032e57600080fd5b50610310610a08565b34801561034357600080fd5b506103106004803603602081101561035a57600080fd5b50356001600160a01b0316610a0e565b34801561037657600080fd5b506102e76004803603606081101561038d57600080fd5b506001600160a01b03813581169160208101359091169060400135610a20565b3480156103b957600080fd5b50610310600480360360208110156103d057600080fd5b50356001600160a01b0316610aa7565b3480156103ec57600080fd5b50610310610b06565b34801561040157600080fd5b5061040a610b0c565b6040805160ff9092168252519081900360200190f35b34801561042c57600080fd5b506102156004803603602081101561044357600080fd5b50356001600160a01b0316610b11565b34801561045f57600080fd5b506102e76004803603604081101561047657600080fd5b506001600160a01b038135169060200135610c6d565b34801561049857600080fd5b506102e7600480360360208110156104af57600080fd5b50356001600160a01b0316610cbb565b3480156104cb57600080fd5b506104e9600480360360208110156104e257600080fd5b5035610cd0565b604080516001600160a01b0390991689526020890197909752878701959095526060870193909352608086019190915260a085015260c084015260e083015251908190036101000190f35b34801561054057600080fd5b50610215610e2f565b34801561055557600080fd5b50610310610e66565b34801561056a57600080fd5b506103106004803603602081101561058157600080fd5b50356001600160a01b0316610e6c565b34801561059d57600080fd5b50610215610e87565b3480156105b257600080fd5b50610310610f29565b3480156105c757600080fd5b506105d0610f2f565b604080516001600160a01b039092168252519081900360200190f35b3480156105f857600080fd5b506103106004803603602081101561060f57600080fd5b50356001600160a01b0316610f3e565b34801561062b57600080fd5b50610239610f49565b34801561064057600080fd5b506102e76004803603604081101561065757600080fd5b506001600160a01b038135169060200135610faa565b34801561067957600080fd5b506103106004803603602081101561069057600080fd5b50356001600160a01b0316611012565b3480156106ac57600080fd5b506102e7600480360360408110156106c357600080fd5b506001600160a01b03813516906020013561103e565b3480156106e557600080fd5b50610310600480360360208110156106fc57600080fd5b50356001600160a01b0316611052565b34801561071857600080fd5b506102e76004803603604081101561072f57600080fd5b506001600160a01b038135169060200135151561106d565b34801561075357600080fd5b50610310611142565b34801561076857600080fd5b506103106004803603604081101561077f57600080fd5b506001600160a01b0381358116916020013516611166565b3480156107a357600080fd5b50610215600480360360408110156107ba57600080fd5b506001600160a01b038135169060200135611191565b3480156107dc57600080fd5b5061031061135b565b3480156107f157600080fd5b506102156004803603602081101561080857600080fd5b5035611361565b34801561081b57600080fd5b506102156004803603602081101561083257600080fd5b50356001600160a01b031661147d565b34801561084e57600080fd5b506104e96004803603602081101561086557600080fd5b50356001600160a01b0316611576565b34801561088157600080fd5b5061089f6004803603602081101561089857600080fd5b50356116e9565b60408051938452602084019290925282820152519081900360600190f35b60006108c7610a08565b116108d157600080fd5b341561094c576109026108e2610a08565b6108f034600160801b6117e7565b816108f757fe5b600554919004611847565b60055560408051348152905133917fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d78454116511919081900360200190a26008546109489034611847565b6008555b565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156109da5780601f106109af576101008083540402835291602001916109da565b820191906000526020600020905b8154815290600101906020018083116109bd57829003601f168201915b5050505050905090565b60006109f86109f16118a1565b84846118a5565b5060015b92915050565b600a5490565b60025490565b60106020526000908152604090205481565b6000610a2d848484611991565b610a9d84610a396118a1565b610a9885604051806060016040528060288152602001612134602891396001600160a01b038a16600090815260016020526040812090610a776118a1565b6001600160a01b0316815260208101919091526040016000205491906119c8565b6118a5565b5060019392505050565b6001600160a01b038116600090815260066020526040812054600160801b90610af690610af190610aeb610ae6610add88610e6c565b600554906117e7565b611a5f565b90611a6f565b611aa2565b81610afd57fe5b0490505b919050565b600e5481565b601290565b610b196118a1565b6009546001600160a01b03908116911614610b69576040805162461bcd60e51b8152602060048201819052602482015260008051602061215c833981519152604482015290519081900360640190fd5b6001600160a01b0381166000908152600f602052604090205460ff1615610b8f57600080fd5b6001600160a01b0381166000908152600f60205260408120805460ff19166001179055610bbd908290611ab5565b6040805163131836e760e21b8152600a60048201526001600160a01b03831660248201529051737cffd564afe112d975497025ee8844598840ffc591634c60db9c916044808301926000929190829003018186803b158015610c1e57600080fd5b505af4158015610c32573d6000803e3d6000fd5b50506040516001600160a01b03841692507fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b259150600090a250565b60006109f8610c7a6118a1565b84610a988560016000610c8b6118a1565b6001600160a01b03908116825260208083019390935260409182016000908120918c168152925290205490611847565b600f6020526000908152604090205460ff1681565b600080600080600080600080600a737cffd564afe112d975497025ee8844598840ffc563deb3d89690916040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015610d2e57600080fd5b505af4158015610d42573d6000803e3d6000fd5b505050506040513d6020811015610d5857600080fd5b50518910610d7f575060009650600019955085945086935083925082915081905080610e24565b6000600a737cffd564afe112d975497025ee8844598840ffc563d1aa9e7e90918c6040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b158015610ddb57600080fd5b505af4158015610def573d6000803e3d6000fd5b505050506040513d6020811015610e0557600080fd5b50519050610e1281611576565b98509850985098509850985098509850505b919395975091939597565b60405162461bcd60e51b815260040180806020018281038252606d815260200180611f7f606d913960800191505060405180910390fd5b60115481565b6001600160a01b031660009081526020819052604090205490565b610e8f6118a1565b6009546001600160a01b03908116911614610edf576040805162461bcd60e51b8152602060048201819052602482015260008051602061215c833981519152604482015290519081900360640190fd5b6009546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600980546001600160a01b0319169055565b60085481565b6009546001600160a01b031690565b60006109fc82611012565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156109da5780601f106109af576101008083540402835291602001916109da565b60006109f8610fb76118a1565b84610a98856040518060600160405280602581526020016121c16025913960016000610fe16118a1565b6001600160a01b03908116825260208083019390935260409182016000908120918d168152925290205491906119c8565b6001600160a01b0381166000908152600760205260408120546109fc9061103884610aa7565b90611b0e565b60006109f861104b6118a1565b8484611991565b6001600160a01b031660009081526007602052604090205490565b60006110776118a1565b6009546001600160a01b039081169116146110c7576040805162461bcd60e51b8152602060048201819052602482015260008051602061215c833981519152604482015290519081900360640190fd5b60006110d284611b50565b90508015611138576001600160a01b0384166000818152601060209081526040918290204290558151848152915186151593927fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf09292908290030190a360019150506109fc565b5060009392505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6111996118a1565b6009546001600160a01b039081169116146111e9576040805162461bcd60e51b8152602060048201819052602482015260008051602061215c833981519152604482015290519081900360640190fd5b6001600160a01b0382166000908152600f602052604090205460ff161561120f57611357565b7f000000000000000000000000000000000000000000000000000000000000000081106112c5576112408282611ab5565b60408051632f0ad01760e21b8152600a60048201526001600160a01b0384166024820152604481018390529051737cffd564afe112d975497025ee8844598840ffc59163bc2b405c916064808301926000929190829003018186803b1580156112a857600080fd5b505af41580156112bc573d6000803e3d6000fd5b5050505061134a565b6112d0826000611ab5565b6040805163131836e760e21b8152600a60048201526001600160a01b03841660248201529051737cffd564afe112d975497025ee8844598840ffc591634c60db9c916044808301926000929190829003018186803b15801561133157600080fd5b505af4158015611345573d6000803e3d6000fd5b505050505b61135582600161106d565b505b5050565b600e5490565b6113696118a1565b6009546001600160a01b039081169116146113b9576040805162461bcd60e51b8152602060048201819052602482015260008051602061215c833981519152604482015290519081900360640190fd5b61070881101580156113ce5750620151808111155b6114095760405162461bcd60e51b815260040180806020018281038252604e81526020018061204e604e913960600191505060405180910390fd5b60115481141561144a5760405162461bcd60e51b815260040180806020018281038252604081526020018061200e6040913960400191505060405180910390fd5b60115460405182907f474ea64804364a1e29a4487ddb63c3342a2dd826ccd8acf48825e680a0e6f20f90600090a3601155565b6114856118a1565b6009546001600160a01b039081169116146114d5576040805162461bcd60e51b8152602060048201819052602482015260008051602061215c833981519152604482015290519081900360640190fd5b6001600160a01b03811661151a5760405162461bcd60e51b815260040180806020018281038252602681526020018061209c6026913960400191505060405180910390fd5b6009546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600980546001600160a01b0319166001600160a01b0392909216919091179055565b600080600080600080600080889750600a737cffd564afe112d975497025ee8844598840ffc56317e142d190918a6040518363ffffffff1660e01b815260040180838152602001826001600160a01b031681526020019250505060206040518083038186803b1580156115e857600080fd5b505af41580156115fc573d6000803e3d6000fd5b505050506040513d602081101561161257600080fd5b5051965060001995506000871261167657600e5487111561164257600e5461163b908890611c91565b9550611676565b600e54600a5460009110611657576000611666565b600e54600a5461166691611b0e565b90506116728882611a6f565b9650505b61167f88611012565b945061168a88610aa7565b6001600160a01b0389166000908152601060205260409020549094509250826116b45760006116c2565b6011546116c2908490611847565b91504282116116d25760006116dc565b6116dc8242611b0e565b9050919395975091939597565b600a546000908190819080611709575050600e54600092508291506117e0565b600e546000805a90506000805b898410801561172457508582105b156117cf57600a54600190950194851061173d57600094505b6000600a600001868154811061174f57fe5b60009182526020808320909101546001600160a01b0316808352601090915260409091205490915061178090611cc3565b1561179c5761179081600161106d565b1561179c576001909101905b60019092019160005a9050808511156117c6576117c36117bc8683611b0e565b8790611847565b95505b93506117169050565b600e85905590975095509193505050505b9193909250565b6000826117f6575060006109fc565b8282028284828161180357fe5b04146118405760405162461bcd60e51b81526004018080602001828103825260218152602001806121136021913960400191505060405180910390fd5b9392505050565b600082820183811015611840576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b3390565b6001600160a01b0383166118ea5760405162461bcd60e51b815260040180806020018281038252602481526020018061219d6024913960400191505060405180910390fd5b6001600160a01b03821661192f5760405162461bcd60e51b81526004018080602001828103825260228152602001806120c26022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b60405162461bcd60e51b815260040180806020018281038252602f8152602001806120e4602f913960400191505060405180910390fd5b60008184841115611a575760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611a1c578181015183820152602001611a04565b50505050905090810190601f168015611a495780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600081818112156109fc57600080fd5b6000828201818312801590611a845750838112155b80611a995750600083128015611a9957508381125b61184057600080fd5b600080821215611ab157600080fd5b5090565b6000611ac083610e6c565b905080821115611ae8576000611ad68383611b0e565b9050611ae28482611cea565b50611355565b80821015611355576000611afc8284611b0e565b9050611b088482611d4e565b50505050565b600061184083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506119c8565b600080611b5c83611012565b90508015611c88576001600160a01b038316600090815260076020526040902054611b879082611847565b6001600160a01b038416600081815260076020908152604091829020939093558051848152905191927fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d92918290030190a26040516000906001600160a01b03851690610bb890849084818181858888f193505050503d8060008114611c29576040519150601f19603f3d011682016040523d82523d6000602084013e611c2e565b606091505b5050905080611c80576001600160a01b038416600090815260076020526040902054611c5a9083611b0e565b6001600160a01b0385166000908152600760205260408120919091559250610b01915050565b509050610b01565b50600092915050565b6000818303818312801590611ca65750838113155b80611a995750600083128015611a99575083811361184057600080fd5b600042821115611cd557506000610b01565b601154611ce24284611b0e565b101592915050565b611cf48282611d92565b611d2e611d0f610ae6836005546117e790919063ffffffff16565b6001600160a01b03841660009081526006602052604090205490611c91565b6001600160a01b0390921660009081526006602052604090209190915550565b611d588282611e82565b611d2e611d73610ae6836005546117e790919063ffffffff16565b6001600160a01b03841660009081526006602052604090205490611a6f565b6001600160a01b038216611ded576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b611df960008383611355565b600254611e069082611847565b6002556001600160a01b038216600090815260208190526040902054611e2c9082611847565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6001600160a01b038216611ec75760405162461bcd60e51b815260040180806020018281038252602181526020018061217c6021913960400191505060405180910390fd5b611ed382600083611355565b611f1081604051806060016040528060228152602001611fec602291396001600160a01b03851660009081526020819052604090205491906119c8565b6001600160a01b038316600090815260208190526040902055600254611f369082611b0e565b6002556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a3505056fe4d494e49534849425f4469766964656e645f547261636b65723a2077697468647261774469766964656e642064697361626c65642e20557365207468652027636c61696d272066756e6374696f6e206f6e20746865206d61696e204d494e495348494220636f6e74726163742e45524332303a206275726e20616d6f756e7420657863656564732062616c616e63654d494e49534849425f4469766964656e645f547261636b65723a2043616e6e6f742075706461746520636c61696d5761697420746f2073616d652076616c75654d494e49534849425f4469766964656e645f547261636b65723a20636c61696d57616974206d757374206265207570646174656420746f206265747765656e203120616e6420323420686f7572734f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f20616464726573734d494e49534849425f4469766964656e645f547261636b65723a204e6f207472616e736665727320616c6c6f776564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657245524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122070e88175e1a3db988cd20f5a7e8260bb313a27b3131cce941c8a972aa0c3661864736f6c634300060c00334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65724d494e49534849423a204175746f6d61746564206d61726b6574206d616b6572207061697220697320616c72656164792073657420746f20746861742076616c75654d494e49534849423a204163636f756e7420697320616c7265616479207468652076616c7565206f6620276578636c7564656427

Deployed Bytecode

0x6080604052600436106103a65760003560e01c806395d89b41116101e7578063c26663071161010d578063e2f45605116100a0578063f1570d241161006f578063f1570d2414610da5578063f27fd25414610dba578063f2fde38b14610de4578063fa05e42c14610e17576103ad565b8063e2f4560514610d1e578063e37ba8f914610d33578063e7841ec014610d66578063e98030c714610d7b576103ad565b8063d5a66131116100dc578063d5a6613114610ca4578063d6e74f8b14610cb9578063d76629a414610cce578063dd62ed3e14610ce3576103ad565b8063c266630714610bab578063c492f04614610bd5578063cded01d114610c54578063d469801614610c8f576103ad565b8063a521fa9611610185578063b62496f511610154578063b62496f514610ad7578063be12192d14610b0a578063bfa7a86c14610b3d578063c024666814610b70576103ad565b8063a521fa9614610970578063a8b9d240146109ed578063a9059cbb14610a20578063ad56c13c14610a59576103ad565b80639c1b8af5116101c15780639c1b8af5146108e3578063a26579ad146108f8578063a3c4e34a1461090d578063a457c2d714610937576103ad565b806395d89b411461087e57806398118cb4146108935780639a7a23d6146108a8576103ad565b806349bd5a5e116102cc5780636843cd841161026a578063715018a611610239578063715018a6146107f7578063871c128d1461080c57806388bdd9be146108365780638da5cb5b14610869576103ad565b80636843cd8414610752578063700bb1911461078557806370a08231146107af5780637138b011146107e2576103ad565b80634fbee193116102a65780634fbee193146106a457806359564da0146106d757806364b0f6531461070a57806365b8dbc01461071f576103ad565b806349bd5a5e146106655780634d33b1ef1461067a5780634e71d92d1461068f576103ad565b806318160ddd116103445780632c1f5216116103135780632c1f5216146105d757806330bb4cff146105ec578063313ce56714610601578063395093511461062c576103ad565b806318160ddd1461055557806322bd3f7f1461056a57806323b872dd1461057f57806325b61703146105c2576103ad565b8063095ea7b311610380578063095ea7b3146104aa578063106b5da1146104e357806313114a9d1461050f5780631694505e14610524576103ad565b806302259e9e146103b257806306fdde03146103d95780630855f25d14610463576103ad565b366103ad57005b600080fd5b3480156103be57600080fd5b506103c7610e2c565b60408051918252519081900360200190f35b3480156103e557600080fd5b506103ee610e32565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610428578181015183820152602001610410565b50505050905090810190601f1680156104555780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561046f57600080fd5b506104966004803603602081101561048657600080fd5b50356001600160a01b0316610ec8565b604080519115158252519081900360200190f35b3480156104b657600080fd5b50610496600480360360408110156104cd57600080fd5b506001600160a01b038135169060200135610edd565b3480156104ef57600080fd5b5061050d6004803603602081101561050657600080fd5b5035610efb565b005b34801561051b57600080fd5b506103c7610f71565b34801561053057600080fd5b50610539610f95565b604080516001600160a01b039092168252519081900360200190f35b34801561056157600080fd5b506103c7610fa4565b34801561057657600080fd5b506103c7610faa565b34801561058b57600080fd5b50610496600480360360608110156105a257600080fd5b506001600160a01b03813581169160208101359091169060400135610fce565b3480156105ce57600080fd5b506103c7611055565b3480156105e357600080fd5b5061053961105b565b3480156105f857600080fd5b506103c761106a565b34801561060d57600080fd5b506106166110e0565b6040805160ff9092168252519081900360200190f35b34801561063857600080fd5b506104966004803603604081101561064f57600080fd5b506001600160a01b0381351690602001356110e5565b34801561067157600080fd5b50610539611133565b34801561068657600080fd5b50610496611157565b34801561069b57600080fd5b5061050d611160565b3480156106b057600080fd5b50610496600480360360208110156106c757600080fd5b50356001600160a01b03166111e5565b3480156106e357600080fd5b50610496600480360360208110156106fa57600080fd5b50356001600160a01b0316611203565b34801561071657600080fd5b506103c7611218565b34801561072b57600080fd5b5061050d6004803603602081101561074257600080fd5b50356001600160a01b031661125d565b34801561075e57600080fd5b506103c76004803603602081101561077557600080fd5b50356001600160a01b031661135f565b34801561079157600080fd5b5061050d600480360360208110156107a857600080fd5b50356113e2565b3480156107bb57600080fd5b506103c7600480360360208110156107d257600080fd5b50356001600160a01b03166114c9565b3480156107ee57600080fd5b506103c76114e4565b34801561080357600080fd5b5061050d611508565b34801561081857600080fd5b5061050d6004803603602081101561082f57600080fd5b50356115aa565b34801561084257600080fd5b5061050d6004803603602081101561085957600080fd5b50356001600160a01b03166116c7565b34801561087557600080fd5b50610539611a1e565b34801561088a57600080fd5b506103ee611a2d565b34801561089f57600080fd5b506103c7611a8e565b3480156108b457600080fd5b5061050d600480360360408110156108cb57600080fd5b506001600160a01b0381351690602001351515611ab2565b3480156108ef57600080fd5b506103c7611b85565b34801561090457600080fd5b506103c7611b8b565b34801561091957600080fd5b5061050d6004803603602081101561093057600080fd5b5035611bd0565b34801561094357600080fd5b506104966004803603604081101561095a57600080fd5b506001600160a01b038135169060200135611c3c565b34801561097c57600080fd5b5061050d6004803603602081101561099357600080fd5b8101906020810181356401000000008111156109ae57600080fd5b8201836020820111156109c057600080fd5b803590602001918460208302840111640100000000831117156109e257600080fd5b509092509050611ca4565b3480156109f957600080fd5b506103c760048036036020811015610a1057600080fd5b50356001600160a01b0316611dba565b348015610a2c57600080fd5b5061049660048036036040811015610a4357600080fd5b506001600160a01b038135169060200135611e0b565b348015610a6557600080fd5b50610a8c60048036036020811015610a7c57600080fd5b50356001600160a01b0316611e1f565b604080516001600160a01b0390991689526020890197909752878701959095526060870193909352608086019190915260a085015260c084015260e083015251908190036101000190f35b348015610ae357600080fd5b5061049660048036036020811015610afa57600080fd5b50356001600160a01b0316611eff565b348015610b1657600080fd5b5061049660048036036020811015610b2d57600080fd5b50356001600160a01b0316611f14565b348015610b4957600080fd5b5061050d60048036036020811015610b6057600080fd5b50356001600160a01b0316611f29565b348015610b7c57600080fd5b5061050d60048036036040811015610b9357600080fd5b506001600160a01b0381351690602001351515612038565b348015610bb757600080fd5b5061050d60048036036020811015610bce57600080fd5b503561214e565b348015610be157600080fd5b5061050d60048036036040811015610bf857600080fd5b810190602081018135640100000000811115610c1357600080fd5b820183602082011115610c2557600080fd5b80359060200191846020830284011164010000000083111715610c4757600080fd5b91935091503515156121ba565b348015610c6057600080fd5b5061050d60048036036040811015610c7757600080fd5b506001600160a01b03813516906020013515156122da565b348015610c9b57600080fd5b50610539612392565b348015610cb057600080fd5b506103c76123a1565b348015610cc557600080fd5b506105396123a7565b348015610cda57600080fd5b506103c76123b6565b348015610cef57600080fd5b506103c760048036036040811015610d0657600080fd5b506001600160a01b03813581169160200135166123da565b348015610d2a57600080fd5b506103c7612405565b348015610d3f57600080fd5b5061050d60048036036020811015610d5657600080fd5b50356001600160a01b031661240b565b348015610d7257600080fd5b506103c7612518565b348015610d8757600080fd5b5061050d60048036036020811015610d9e57600080fd5b503561255d565b348015610db157600080fd5b506103c761261d565b348015610dc657600080fd5b50610a8c60048036036020811015610ddd57600080fd5b5035612641565b348015610df057600080fd5b5061050d60048036036020811015610e0757600080fd5b50356001600160a01b03166126a7565b348015610e2357600080fd5b506103c76127a0565b600a5481565b60038054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610ebe5780601f10610e9357610100808354040283529160200191610ebe565b820191906000526020600020905b815481529060010190602001808311610ea157829003601f168201915b5050505050905090565b60146020526000908152604090205460ff1681565b6000610ef1610eea612807565b848461280b565b5060015b92915050565b610f03612807565b6005546001600160a01b03908116911614610f53576040805162461bcd60e51b81526020600482018190526024820152600080516020613a85833981519152604482015290519081900360640190fd5b80600a541415610f6257600080fd5b670de0b6b3a764000002600a55565b7f000000000000000000000000000000000000000000000000000000000000000a81565b6006546001600160a01b031681565b60025490565b7f000000000000000000000000000000000000000000000000000000000000007881565b6000610fdb8484846128f7565b61104b84610fe7612807565b61104685604051806060016040528060288152602001613a5d602891396001600160a01b038a16600090815260016020526040812090611025612807565b6001600160a01b03168152602081019190915260400160002054919061310b565b61280b565b5060019392505050565b60105481565b6008546001600160a01b031681565b600854604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae916004808301926020929190829003018186803b1580156110af57600080fd5b505afa1580156110c3573d6000803e3d6000fd5b505050506040513d60208110156110d957600080fd5b5051905090565b601290565b6000610ef16110f2612807565b846110468560016000611103612807565b6001600160a01b03908116825260208083019390935260409182016000908120918c1681529252902054906127a6565b7f0000000000000000000000009a7b0789dc5e1f09e1fc2305f686017267e60ba681565b60105442101590565b6008546040805163bc4c4b3760e01b815233600482015260006024820181905291516001600160a01b039093169263bc4c4b3792604480840193602093929083900390910190829087803b1580156111b757600080fd5b505af11580156111cb573d6000803e3d6000fd5b505050506040513d60208110156111e157600080fd5b5050565b6001600160a01b031660009081526011602052604090205460ff1690565b60136020526000908152604090205460ff1681565b600854604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde916004808301926020929190829003018186803b1580156110af57600080fd5b611265612807565b6005546001600160a01b039081169116146112b5576040805162461bcd60e51b81526020600482018190526024820152600080516020613a85833981519152604482015290519081900360640190fd5b6006546001600160a01b03828116911614156113025760405162461bcd60e51b815260040180806020018281038252602d815260200180613bb9602d913960400191505060405180910390fd5b6006546040516001600160a01b03918216918316907f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e90600090a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b600854604080516370a0823160e01b81526001600160a01b038481166004830152915160009392909216916370a0823191602480820192602092909190829003018186803b1580156113b057600080fd5b505afa1580156113c4573d6000803e3d6000fd5b505050506040513d60208110156113da57600080fd5b505192915050565b600854604080516001624d3b8760e01b03198152600481018490529051600092839283926001600160a01b039092169163ffb2c4799160248082019260609290919082900301818787803b15801561143957600080fd5b505af115801561144d573d6000803e3d6000fd5b505050506040513d606081101561146357600080fd5b5080516020808301516040938401518451848152928301829052828501819052606083018990529351929650945091925032916000917fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989181900360800190a350505050565b6001600160a01b031660009081526020819052604090205490565b7f000000000000000000000000000000000000000000000000000000000000025881565b611510612807565b6005546001600160a01b03908116911614611560576040805162461bcd60e51b81526020600482018190526024820152600080516020613a85833981519152604482015290519081900360640190fd5b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6115b2612807565b6005546001600160a01b03908116911614611602576040805162461bcd60e51b81526020600482018190526024820152600080516020613a85833981519152604482015290519081900360640190fd5b62030d40811015801561161857506207a1208111155b6116535760405162461bcd60e51b815260040180806020018281038252603e8152602001806139a1603e913960400191505060405180910390fd5b600c548114156116945760405162461bcd60e51b8152600401808060200182810382526036815260200180613cfa6036913960400191505060405180910390fd5b600c5460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a3600c55565b6116cf612807565b6005546001600160a01b0390811691161461171f576040805162461bcd60e51b81526020600482018190526024820152600080516020613a85833981519152604482015290519081900360640190fd5b6008546001600160a01b038281169116141561176c5760405162461bcd60e51b8152600401808060200182810382526037815260200180613a056037913960400191505060405180910390fd5b6000819050306001600160a01b0316816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156117b457600080fd5b505afa1580156117c8573d6000803e3d6000fd5b505050506040513d60208110156117de57600080fd5b50516001600160a01b0316146118255760405162461bcd60e51b815260040180806020018281038252604f815260200180613ae7604f913960600191505060405180910390fd5b806001600160a01b03166331e79db0826040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b15801561187457600080fd5b505af1158015611888573d6000803e3d6000fd5b50506040805163031e79db60e41b815230600482015290516001600160a01b03851693506331e79db09250602480830192600092919082900301818387803b1580156118d357600080fd5b505af11580156118e7573d6000803e3d6000fd5b50505050806001600160a01b03166331e79db0611902611a1e565b6040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b15801561194157600080fd5b505af1158015611955573d6000803e3d6000fd5b50506006546040805163031e79db60e41b81526001600160a01b039283166004820152905191851693506331e79db0925060248082019260009290919082900301818387803b1580156119a757600080fd5b505af11580156119bb573d6000803e3d6000fd5b50506008546040516001600160a01b03918216935090851691507f90c7d74461c613da5efa97d90740869367d74ab3aa5837aa4ae9a975f954b7a890600090a3600880546001600160a01b0319166001600160a01b039290921691909117905550565b6005546001600160a01b031690565b60048054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610ebe5780601f10610e9357610100808354040283529160200191610ebe565b7f000000000000000000000000000000000000000000000000000000000000000581565b611aba612807565b6005546001600160a01b03908116911614611b0a576040805162461bcd60e51b81526020600482018190526024820152600080516020613a85833981519152604482015290519081900360640190fd5b7f0000000000000000000000009a7b0789dc5e1f09e1fc2305f686017267e60ba66001600160a01b0316826001600160a01b03161415611b7b5760405162461bcd60e51b815260040180806020018281038252604f815260200180613c87604f913960600191505060405180910390fd5b6111e182826131a2565b600c5481565b60085460408051631bc9e27b60e21b815290516000926001600160a01b031691636f2789ec916004808301926020929190829003018186803b1580156110af57600080fd5b611bd8612807565b6005546001600160a01b03908116911614611c28576040805162461bcd60e51b81526020600482018190526024820152600080516020613a85833981519152604482015290519081900360640190fd5b601054811415611c3757600080fd5b601055565b6000610ef1611c49612807565b8461104685604051806060016040528060258152602001613d666025913960016000611c73612807565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919061310b565b611cac612807565b6005546001600160a01b03908116911614611cfc576040805162461bcd60e51b81526020600482018190526024820152600080516020613a85833981519152604482015290519081900360640190fd5b60005b81811015611d5257600160136000858585818110611d1957fe5b602090810292909201356001600160a01b0316835250810191909152604001600020805460ff1916911515919091179055600101611cff565b507f7cf3c5c4bc7c099ff1d70df0213705f2c444d9e178bb00fd81749896c767c9a8828260405180806020018281038252848482818152602001925060200280828437600083820152604051601f909101601f19169092018290039550909350505050a15050565b600854604080516302a2e74960e61b81526001600160a01b0384811660048301529151600093929092169163a8b9d24091602480820192602092909190829003018186803b1580156113b057600080fd5b6000610ef1611e18612807565b84846128f7565b600080600080600080600080600860009054906101000a90046001600160a01b03166001600160a01b031663fbcbc0f18a6040518263ffffffff1660e01b815260040180826001600160a01b031681526020019150506101006040518083038186803b158015611e8e57600080fd5b505afa158015611ea2573d6000803e3d6000fd5b505050506040513d610100811015611eb957600080fd5b508051602082015160408301516060840151608085015160a086015160c087015160e090970151959e50939c50919a509850965094509092509050919395975091939597565b60156020526000908152604090205460ff1681565b600f6020526000908152604090205460ff1681565b611f31612807565b6005546001600160a01b03908116911614611f81576040805162461bcd60e51b81526020600482018190526024820152600080516020613a85833981519152604482015290519081900360640190fd5b6001600160a01b038116611f9457600080fd5b600780546001600160a01b0319166001600160a01b0383811691909117918290556008546040805163031e79db60e41b81529383166004850152519116916331e79db091602480830192600092919082900301818387803b158015611ff857600080fd5b505af115801561200c573d6000803e3d6000fd5b50506007546001600160a01b03166000908152601260205260409020805460ff19166001179055505050565b612040612807565b6005546001600160a01b03908116911614612090576040805162461bcd60e51b81526020600482018190526024820152600080516020613a85833981519152604482015290519081900360640190fd5b6001600160a01b03821660009081526011602052604090205460ff16151581151514156120ee5760405162461bcd60e51b8152600401808060200182810382526034815260200180613b366034913960400191505060405180910390fd5b6001600160a01b038216600081815260116020908152604091829020805460ff1916851515908117909155825190815291517f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df79281900390910190a25050565b612156612807565b6005546001600160a01b039081169116146121a6576040805162461bcd60e51b81526020600482018190526024820152600080516020613a85833981519152604482015290519081900360640190fd5b600d548114156121b557600080fd5b600d55565b6121c2612807565b6005546001600160a01b03908116911614612212576040805162461bcd60e51b81526020600482018190526024820152600080516020613a85833981519152604482015290519081900360640190fd5b60005b8281101561226757816011600086868581811061222e57fe5b602090810292909201356001600160a01b0316835250810191909152604001600020805460ff1916911515919091179055600101612215565b507f7fdaf542373fa84f4ee8d662c642f44e4c2276a217d7d29e548b6eb29a233b35838383604051808060200183151581526020018281038252858582818152602001925060200280828437600083820152604051601f909101601f1916909201829003965090945050505050a1505050565b6122e2612807565b6005546001600160a01b03908116911614612332576040805162461bcd60e51b81526020600482018190526024820152600080516020613a85833981519152604482015290519081900360640190fd5b6001600160a01b038216600081815260146020908152604091829020805460ff1916851515908117909155825190815291517fa745b79c9942f47d553e54242165de0cc7bed53246fad779598eff0f8b756e6f9281900390910190a25050565b6009546001600160a01b031681565b600d5481565b6007546001600160a01b031681565b7f000000000000000000000000000000000000000000000000000000000000025881565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600b5481565b612413612807565b6005546001600160a01b03908116911614612463576040805162461bcd60e51b81526020600482018190526024820152600080516020613a85833981519152604482015290519081900360640190fd5b6009546001600160a01b03828116911614156124b05760405162461bcd60e51b8152600401808060200182810382526036815260200180613d306036913960400191505060405180910390fd5b6124bb816001612038565b6009546040516001600160a01b03918216918316907f6080503d1da552ae8eb4b7b8a20245d9fabed014180510e7d1a05ea08fdb0f3e90600090a3600980546001600160a01b0319166001600160a01b0392909216919091179055565b6008546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec0916004808301926020929190829003018186803b1580156110af57600080fd5b612565612807565b6005546001600160a01b039081169116146125b5576040805162461bcd60e51b81526020600482018190526024820152600080516020613a85833981519152604482015290519081900360640190fd5b6008546040805163e98030c760e01b81526004810184905290516001600160a01b039092169163e98030c79160248082019260009290919082900301818387803b15801561260257600080fd5b505af1158015612616573d6000803e3d6000fd5b5050505050565b7f000000000000000000000000000000000000000000000000000000000000000581565b600080600080600080600080600860009054906101000a90046001600160a01b03166001600160a01b0316635183d6fd8a6040518263ffffffff1660e01b8152600401808281526020019150506101006040518083038186803b158015611e8e57600080fd5b6126af612807565b6005546001600160a01b039081169116146126ff576040805162461bcd60e51b81526020600482018190526024820152600080516020613a85833981519152604482015290519081900360640190fd5b6001600160a01b0381166127445760405162461bcd60e51b81526004018080602001828103825260268152602001806139596026913960400191505060405180910390fd5b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b600e5481565b600082820183811015612800576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b3390565b6001600160a01b0383166128505760405162461bcd60e51b8152600401808060200182810382526024815260200180613cd66024913960400191505060405180910390fd5b6001600160a01b0382166128955760405162461bcd60e51b815260040180806020018281038252602281526020018061397f6022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b03831661293c5760405162461bcd60e51b8152600401808060200182810382526025815260200180613c286025913960400191505060405180910390fd5b6001600160a01b0382166129815760405162461bcd60e51b81526004018080602001828103825260238152602001806139096023913960400191505060405180910390fd5b600061298b611157565b9050806129e9576001600160a01b03841660009081526012602052604090205460ff166129e95760405162461bcd60e51b8152600401808060200182810382526042815260200180613be66042913960600191505060405180910390fd5b81612a00576129fa848460006132d0565b50613106565b6007546000906001600160a01b038681169116148015612a395750612a23611a1e565b6001600160a01b0316846001600160a01b031614155b90508015612bfb57600d54421015612a825760405162461bcd60e51b815260040180806020018281038252602d81526020018061392c602d913960400191505060405180910390fd5b60007f0000000000000000000000000000000000000000000000000000000000000258612aba600d544261342b90919063ffffffff16565b101580612ae957507f0000000000000000000000000000000000000000000000000000000000000258600e5410155b905080612b47576001600160a01b03851660009081526013602052604090205460ff16612b475760405162461bcd60e51b815260040180806020018281038252604f815260200180613b6a604f913960600191505060405180910390fd5b6001600160a01b0385166000908152600f602052604090205460ff16612b9d576001600160a01b0385166000908152600f60205260409020805460ff19166001908117909155600e54612b99916127a6565b600e555b6001600160a01b03851660008181526013602090815260409182902054600e548351908152925160ff909116151593889390927ff8f6fae5f115e4ba1a75c2ebafc531ee926bca48b39fc48719d55c7209c8d90f92918290030190a4505b600754600160a01b900460ff16158015612c125750815b8015612c3657506001600160a01b03841660009081526015602052604090205460ff165b8015612c5057506006546001600160a01b03868116911614155b8015612c7557506001600160a01b03841660009081526011602052604090205460ff16155b15612cdb576001600160a01b03851660009081526014602052604090205460ff16612cdb57600a54831115612cdb5760405162461bcd60e51b815260040180806020018281038252603a815260200180613c4d603a913960400191505060405180910390fd5b6000612ce6306114c9565b600b54909150811015838015612cf95750805b8015612d0f5750600754600160a01b900460ff16155b8015612d3457506001600160a01b03871660009081526015602052604090205460ff16155b8015612d4e57506009546001600160a01b03888116911614155b8015612d6857506009546001600160a01b03878116911614155b15612e07576007805460ff60a01b1916600160a01b1790556000612dd67f000000000000000000000000000000000000000000000000000000000000000a612dd0857f000000000000000000000000000000000000000000000000000000000000000561346d565b906134c6565b9050612de181613508565b6000612dec306114c9565b9050612df78161358e565b50506007805460ff60a01b191690555b600083158015612e145750845b8015612e2a5750600754600160a01b900460ff16155b6001600160a01b03891660009081526011602052604090205490915060ff1680612e6c57506001600160a01b03871660009081526011602052604090205460ff165b15612e75575060005b8015612f1b576000612eac6064612dd0897f000000000000000000000000000000000000000000000000000000000000000a61346d565b6001600160a01b03891660009081526015602052604090205490915060ff1615612f0257612eff6064612dd0837f000000000000000000000000000000000000000000000000000000000000007861346d565b90505b612f0c878261342b565b9650612f198930836132d0565b505b612f268888886132d0565b6008546001600160a01b031663e30443bc89612f41816114c9565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015612f8757600080fd5b505af1925050508015612f98575060015b506008546001600160a01b031663e30443bc88612fb4816114c9565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015612ffa57600080fd5b505af192505050801561300b575060015b50600754600160a01b900460ff1661310057600c54600854604080516001624d3b8760e01b031981526004810184905290516001600160a01b039092169163ffb2c479916024808201926060929091908290030181600087803b15801561307157600080fd5b505af19250505080156130a557506040513d606081101561309157600080fd5b508051602082015160409092015190919060015b6130ae576130fe565b604080518481526020810184905280820183905260608101869052905132916001917fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989181900360800190a35050505b505b50505050505b505050565b6000818484111561319a5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561315f578181015183820152602001613147565b50505050905090810190601f16801561318c5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6001600160a01b03821660009081526015602052604090205460ff16151581151514156132005760405162461bcd60e51b8152600401808060200182810382526042815260200180613aa56042913960600191505060405180910390fd5b6001600160a01b0382166000908152601560205260409020805460ff19168215801591909117909155613294576008546040805163031e79db60e41b81526001600160a01b038581166004830152915191909216916331e79db091602480830192600092919082900301818387803b15801561327b57600080fd5b505af115801561328f573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6001600160a01b0383166133155760405162461bcd60e51b8152600401808060200182810382526025815260200180613c286025913960400191505060405180910390fd5b6001600160a01b03821661335a5760405162461bcd60e51b81526004018080602001828103825260238152602001806139096023913960400191505060405180910390fd5b613365838383613106565b6133a2816040518060600160405280602681526020016139df602691396001600160a01b038616600090815260208190526040902054919061310b565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546133d190826127a6565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600061280083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061310b565b60008261347c57506000610ef5565b8282028284828161348957fe5b04146128005760405162461bcd60e51b8152600401808060200182810382526021815260200180613a3c6021913960400191505060405180910390fd5b600061280083836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613637565b60006135158260026134c6565b90506000613523838361342b565b90504761352f8361369c565b600061353b478361342b565b9050613547838261384a565b604080518581526020810183905280820185905290517f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619181900360600190a15050505050565b6135978161369c565b60085460405147916000916001600160a01b039091169083908381818185875af1925050503d80600081146135e8576040519150601f19603f3d011682016040523d82523d6000602084013e6135ed565b606091505b50509050801561310657604080518481526020810184905281517f80195cc573b02cc48460cbca6e6e4cc85ddb91959d946e1c3025ea3d87942dc3929181900390910190a1505050565b600081836136865760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561315f578181015183820152602001613147565b50600083858161369257fe5b0495945050505050565b604080516002808252606080830184529260208301908036833701905050905030816000815181106136ca57fe5b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b15801561371e57600080fd5b505afa158015613732573d6000803e3d6000fd5b505050506040513d602081101561374857600080fd5b505181518290600190811061375957fe5b6001600160a01b03928316602091820292909201015260065461377f913091168461280b565b60065460405163791ac94760e01b8152600481018481526000602483018190523060648401819052426084850181905260a060448601908152875160a487015287516001600160a01b039097169663791ac947968a968a9594939092909160c40190602080880191028083838b5b838110156138055781810151838201526020016137ed565b505050509050019650505050505050600060405180830381600087803b15801561382e57600080fd5b505af1158015613842573d6000803e3d6000fd5b505050505050565b6006546138629030906001600160a01b03168461280b565b6006546009546040805163f305d71960e01b81523060048201526024810186905260006044820181905260648201526001600160a01b0392831660848201524260a48201529051919092169163f305d71991849160c48082019260609290919082900301818588803b1580156138d757600080fd5b505af11580156138eb573d6000803e3d6000fd5b50505050506040513d606081101561390257600080fd5b5050505056fe45524332303a207472616e7366657220746f20746865207a65726f20616464726573734d494e49534849423a205468652066697865642d73616c6520686173206e6f742073746172746564207965742e4f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f20616464726573734d494e49534849423a20676173466f7250726f63657373696e67206d757374206265206265747765656e203230302c30303020616e64203530302c30303045524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63654d494e49534849423a20546865206469766964656e6420747261636b657220616c72656164792068617320746861742061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65724d494e49534849423a204175746f6d61746564206d61726b6574206d616b6572207061697220697320616c72656164792073657420746f20746861742076616c75654d494e49534849423a20546865206e6577206469766964656e6420747261636b6572206d757374206265206f776e656420627920746865204d494e495348494220746f6b656e20636f6e74726163744d494e49534849423a204163636f756e7420697320616c7265616479207468652076616c7565206f6620276578636c75646564274d494e49534849423a205468652066697865642d73616c65206973206f6e6c7920617661696c61626c6520746f206365727461696e207061727469636970616e7473206174207468652073746172744d494e49534849423a2054686520726f7574657220616c726561647920686173207468617420616464726573734d494e49534849423a2054686973206163636f756e742063616e6e6f742073656e6420746f6b656e7320756e74696c2074726164696e6720697320656e61626c656445524332303a207472616e736665722066726f6d20746865207a65726f206164647265737353656c6c207472616e7366657220616d6f756e74206578636565647320746865206d617853656c6c5472616e73616374696f6e416d6f756e742e4d494e49534849423a205468652050616e63616b655377617020706169722063616e6e6f742062652072656d6f7665642066726f6d206175746f6d617465644d61726b65744d616b6572506169727345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573734d494e49534849423a2043616e6e6f742075706461746520676173466f7250726f63657373696e6720746f2073616d652076616c75654d494e49534849423a20546865206c69717569646974792077616c6c657420697320616c72656164792074686973206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212206dbad27ab496d8f5542a5f70e7fafd9a17fa19fcc8600ad7f02d1dc946348aaf64736f6c634300060c0033

Library Used


Deployed Bytecode Sourcemap

41724:19958:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42070:65;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;9101:100;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43907:68;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43907:68:0;-1:-1:-1;;;;;43907:68:0;;:::i;:::-;;;;;;;;;;;;;;;;;;11268:169;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;11268:169:0;;;;;;;;:::i;47896:175::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47896:175:0;;:::i;:::-;;42301:34;;;;;;;;;;;;;:::i;41806:41::-;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;41806:41:0;;;;;;;;;;;;;;10221:108;;;;;;;;;;;;;:::i;42403:52::-;;;;;;;;;;;;;:::i;11919:355::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;11919:355:0;;;;;;;;;;;;;;;;;:::i;43498:51::-;;;;;;;;;;;;;:::i;41976:46::-;;;;;;;;;;;;;:::i;52917:141::-;;;;;;;;;;;;;:::i;10063:93::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;12683:218;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;12683:218:0;;;;;;;;:::i;41854:38::-;;;;;;;;;;;;;:::i;54788:126::-;;;;;;;;;;;;;:::i;54409:88::-;;;;;;;;;;;;;:::i;53066:125::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53066:125:0;-1:-1:-1;;;;;53066:125:0;;:::i;43841:59::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43841:59:0;-1:-1:-1;;;;;43841:59:0;;:::i;54639:141::-;;;;;;;;;;;;;:::i;49940:317::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49940:317:0;-1:-1:-1;;;;;49940:317:0;;:::i;53351:130::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53351:130:0;-1:-1:-1;;;;;53351:130:0;;:::i;54142:259::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54142:259:0;;:::i;10392:127::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10392:127:0;-1:-1:-1;;;;;10392:127:0;;:::i;43005:69::-;;;;;;;;;;;;;:::i;26240:148::-;;;;;;;;;;;;;:::i;52249:412::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52249:412:0;;:::i;49082:850::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49082:850:0;-1:-1:-1;;;;;49082:850:0;;:::i;25598:79::-;;;;;;;;;;;;;:::i;9320:104::-;;;;;;;;;;;;;:::i;42257:37::-;;;;;;;;;;;;;:::i;51175:266::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;51175:266:0;;;;;;;;;;:::i;42535:40::-;;;;;;;;;;;;;:::i;52801:108::-;;;;;;;;;;;;;:::i;48838:236::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48838:236:0;;:::i;13404:269::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;13404:269:0;;;;;;;;:::i;50885:282::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50885:282:0;;-1:-1:-1;50885:282:0;-1:-1:-1;50885:282:0;:::i;53199:147::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53199:147:0;-1:-1:-1;;;;;53199:147:0;;:::i;10732:175::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;10732:175:0;;;;;;;;:::i;53489:318::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53489:318:0;-1:-1:-1;;;;;53489:318:0;;:::i;:::-;;;;-1:-1:-1;;;;;53489:318:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44133:58;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44133:58:0;-1:-1:-1;;;;;44133:58:0;;:::i;43336:48::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43336:48:0;-1:-1:-1;;;;;43336:48:0;;:::i;48302:326::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48302:326:0;-1:-1:-1;;;;;48302:326:0;;:::i;50265:300::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;50265:300:0;;;;;;;;;;:::i;48636:194::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48636:194:0;;:::i;50573:304::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50573:304:0;-1:-1:-1;50573:304:0;;;;:::i;48079:215::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;48079:215:0;;;;;;;;;;:::i;42031:30::-;;;;;;;;;;;;;:::i;42705:51::-;;;;;;;;;;;;;:::i;41901:36::-;;;;;;;;;;;;;:::i;42934:64::-;;;;;;;;;;;;;:::i;10970:151::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;10970:151:0;;;;;;;;;;:::i;42142:59::-;;;;;;;;;;;;;:::i;51868:373::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51868:373:0;-1:-1:-1;;;;;51868:373:0;;:::i;54505:126::-;;;;;;;;;;;;;:::i;52669:124::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52669:124:0;;:::i;42210:40::-;;;;;;;;;;;;;:::i;53812:325::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53812:325:0;;:::i;26543:244::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26543:244:0;-1:-1:-1;;;;;26543:244:0;;:::i;43264:36::-;;;;;;;;;;;;;:::i;42070:65::-;;;;:::o;9101:100::-;9188:5;9181:12;;;;;;;;-1:-1:-1;;9181:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9155:13;;9181:12;;9188:5;;9181:12;;9188:5;9181:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9101:100;:::o;43907:68::-;;;;;;;;;;;;;;;:::o;11268:169::-;11351:4;11368:39;11377:12;:10;:12::i;:::-;11391:7;11400:6;11368:8;:39::i;:::-;-1:-1:-1;11425:4:0;11268:169;;;;;:::o;47896:175::-;25820:12;:10;:12::i;:::-;25810:6;;-1:-1:-1;;;;;25810:6:0;;;:22;;;25802:67;;;;;-1:-1:-1;;;25802:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;25802:67:0;;;;;;;;;;;;;;;48001:6:::1;47973:24;;:34;;47965:43;;;::::0;::::1;;48056:6;48046:17;48019:24;:44:::0;47896:175::o;42301:34::-;;;:::o;41806:41::-;;;-1:-1:-1;;;;;41806:41:0;;:::o;10221:108::-;10309:12;;10221:108;:::o;42403:52::-;;;:::o;11919:355::-;12059:4;12076:36;12086:6;12094:9;12105:6;12076:9;:36::i;:::-;12123:121;12132:6;12140:12;:10;:12::i;:::-;12154:89;12192:6;12154:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12154:19:0;;;;;;:11;:19;;;;;;12174:12;:10;:12::i;:::-;-1:-1:-1;;;;;12154:33:0;;;;;;;;;;;;-1:-1:-1;12154:33:0;;;:89;:37;:89::i;:::-;12123:8;:121::i;:::-;-1:-1:-1;12262:4:0;11919:355;;;;;:::o;43498:51::-;;;;:::o;41976:46::-;;;-1:-1:-1;;;;;41976:46:0;;:::o;52917:141::-;53007:15;;:43;;;-1:-1:-1;;;53007:43:0;;;;52980:7;;-1:-1:-1;;;;;53007:15:0;;:41;;:43;;;;;;;;;;;;;;:15;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53007:43:0;;-1:-1:-1;52917:141:0;:::o;10063:93::-;10146:2;10063:93;:::o;12683:218::-;12771:4;12788:83;12797:12;:10;:12::i;:::-;12811:7;12820:50;12859:10;12820:11;:25;12832:12;:10;:12::i;:::-;-1:-1:-1;;;;;12820:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;12820:25:0;;;:34;;;;;;;;;;;:38;:50::i;41854:38::-;;;:::o;54788:126::-;54883:23;;54864:15;:42;;54788:126;:::o;54409:88::-;54440:15;;:49;;;-1:-1:-1;;;54440:49:0;;54471:10;54440:49;;;;:15;:49;;;;;;;;-1:-1:-1;;;;;54440:15:0;;;;:30;;:49;;;;;;;;;;;;;;;;;;:15;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;54409:88:0:o;53066:125::-;-1:-1:-1;;;;;53155:28:0;53131:4;53155:28;;;:19;:28;;;;;;;;;53066:125::o;43841:59::-;;;;;;;;;;;;;;;:::o;54639:141::-;54731:15;;:41;;;-1:-1:-1;;;54731:41:0;;;;54704:7;;-1:-1:-1;;;;;54731:15:0;;:39;;:41;;;;;;;;;;;;;;:15;:41;;;;;;;;;;49940:317;25820:12;:10;:12::i;:::-;25810:6;;-1:-1:-1;;;;;25810:6:0;;;:22;;;25802:67;;;;;-1:-1:-1;;;25802:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;25802:67:0;;;;;;;;;;;;;;;50049:15:::1;::::0;-1:-1:-1;;;;;50027:38:0;;::::1;50049:15:::0;::::1;50027:38;;50019:96;;;;-1:-1:-1::0;;;50019:96:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50173:15;::::0;50131:59:::1;::::0;-1:-1:-1;;;;;50173:15:0;;::::1;::::0;50131:59;::::1;::::0;::::1;::::0;50173:15:::1;::::0;50131:59:::1;50201:15;:48:::0;;-1:-1:-1;;;;;;50201:48:0::1;-1:-1:-1::0;;;;;50201:48:0;;;::::1;::::0;;;::::1;::::0;;49940:317::o;53351:130::-;53442:15;;:34;;;-1:-1:-1;;;53442:34:0;;-1:-1:-1;;;;;53442:34:0;;;;;;;;;53421:7;;53442:15;;;;;:25;;:34;;;;;;;;;;;;;;;:15;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53442:34:0;;53351:130;-1:-1:-1;;53351:130:0:o;54142:259::-;54268:15;;:28;;;-1:-1:-1;;;;;;54268:28:0;;;;;;;;;;54202:18;;;;;;-1:-1:-1;;;;;54268:15:0;;;;:23;;:28;;;;;;;;;;;;;;;54202:18;54268:15;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54268:28:0;;;;;;;;;;;;54306:87;;;;;;;;;;;;;;;;;54268:28;54306:87;;;;;;;54268:28;;-1:-1:-1;54268:28:0;-1:-1:-1;54268:28:0;;-1:-1:-1;54383:9:0;;54371:5;;54306:87;;;;;;;;;54142:259;;;;:::o;10392:127::-;-1:-1:-1;;;;;10493:18:0;10466:7;10493:18;;;;;;;;;;;;10392:127::o;43005:69::-;;;:::o;26240:148::-;25820:12;:10;:12::i;:::-;25810:6;;-1:-1:-1;;;;;25810:6:0;;;:22;;;25802:67;;;;;-1:-1:-1;;;25802:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;25802:67:0;;;;;;;;;;;;;;;26331:6:::1;::::0;26310:40:::1;::::0;26347:1:::1;::::0;-1:-1:-1;;;;;26331:6:0::1;::::0;26310:40:::1;::::0;26347:1;;26310:40:::1;26361:6;:19:::0;;-1:-1:-1;;;;;;26361:19:0::1;::::0;;26240:148::o;52249:412::-;25820:12;:10;:12::i;:::-;25810:6;;-1:-1:-1;;;;;25810:6:0;;;:22;;;25802:67;;;;;-1:-1:-1;;;25802:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;25802:67:0;;;;;;;;;;;;;;;52347:6:::1;52335:8;:18;;:40;;;;;52369:6;52357:8;:18;;52335:40;52327:115;;;;-1:-1:-1::0;;;52327:115:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52473:16;;52461:8;:28;;52453:95;;;;-1:-1:-1::0;;;52453:95:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52598:16;::::0;52564:51:::1;::::0;52588:8;;52564:51:::1;::::0;;;::::1;52626:16;:27:::0;52249:412::o;49082:850::-;25820:12;:10;:12::i;:::-;25810:6;;-1:-1:-1;;;;;25810:6:0;;;:22;;;25802:67;;;;;-1:-1:-1;;;25802:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;25802:67:0;;;;;;;;;;;;;;;49191:15:::1;::::0;-1:-1:-1;;;;;49169:38:0;;::::1;49191:15:::0;::::1;49169:38;;49161:106;;;;-1:-1:-1::0;;;49161:106:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49280:42;49357:10;49280:89;;49428:4;-1:-1:-1::0;;;;;49390:43:0::1;:18;-1:-1:-1::0;;;;;49390:24:0::1;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;49390:26:0;-1:-1:-1;;;;;49390:43:0::1;;49382:135;;;;-1:-1:-1::0;;;49382:135:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49530:18;-1:-1:-1::0;;;;;49530:39:0::1;;49578:18;49530:68;;;;;;;;;;;;;-1:-1:-1::0;;;;;49530:68:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;49609:54:0::1;::::0;;-1:-1:-1;;;49609:54:0;;49657:4:::1;49609:54;::::0;::::1;::::0;;;-1:-1:-1;;;;;49609:39:0;::::1;::::0;-1:-1:-1;49609:39:0::1;::::0;-1:-1:-1;49609:54:0;;;;;-1:-1:-1;;49609:54:0;;;;;;;-1:-1:-1;49609:39:0;:54;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;49674:18;-1:-1:-1::0;;;;;49674:39:0::1;;49714:7;:5;:7::i;:::-;49674:48;;;;;;;;;;;;;-1:-1:-1::0;;;;;49674:48:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;49781:15:0::1;::::0;49733:65:::1;::::0;;-1:-1:-1;;;49733:65:0;;-1:-1:-1;;;;;49781:15:0;;::::1;49733:65;::::0;::::1;::::0;;;:39;;::::1;::::0;-1:-1:-1;49733:39:0::1;::::0;-1:-1:-1;49733:65:0;;;;;49781:15:::1;::::0;49733:65;;;;;;;;49781:15;49733:39;:65;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;49858:15:0::1;::::0;49816:59:::1;::::0;-1:-1:-1;;;;;49858:15:0;;::::1;::::0;-1:-1:-1;49816:59:0;;::::1;::::0;-1:-1:-1;49816:59:0::1;::::0;49858:15:::1;::::0;49816:59:::1;49888:15;:36:::0;;-1:-1:-1;;;;;;49888:36:0::1;-1:-1:-1::0;;;;;49888:36:0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;49082:850:0:o;25598:79::-;25663:6;;-1:-1:-1;;;;;25663:6:0;25598:79;:::o;9320:104::-;9409:7;9402:14;;;;;;;;-1:-1:-1;;9402:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9376:13;;9402:14;;9409:7;;9402:14;;9409:7;9402:14;;;;;;;;;;;;;;;;;;;;;;;;42257:37;;;:::o;51175:266::-;25820:12;:10;:12::i;:::-;25810:6;;-1:-1:-1;;;;;25810:6:0;;;:22;;;25802:67;;;;;-1:-1:-1;;;25802:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;25802:67:0;;;;;;;;;;;;;;;51282:13:::1;-1:-1:-1::0;;;;;51274:21:0::1;:4;-1:-1:-1::0;;;;;51274:21:0::1;;;51266:113;;;;-1:-1:-1::0;;;51266:113:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51392:41;51421:4;51427:5;51392:28;:41::i;42535:40::-:0;;;;:::o;52801:108::-;52874:15;;:27;;;-1:-1:-1;;;52874:27:0;;;;52847:7;;-1:-1:-1;;;;;52874:15:0;;:25;;:27;;;;;;;;;;;;;;:15;:27;;;;;;;;;;48838:236;25820:12;:10;:12::i;:::-;25810:6;;-1:-1:-1;;;;;25810:6:0;;;:22;;;25802:67;;;;;-1:-1:-1;;;25802:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;25802:67:0;;;;;;;;;;;;;;;48979:23:::1;;48949:26;:53;;48941:62;;;::::0;::::1;;49014:23;:52:::0;48838:236::o;13404:269::-;13497:4;13514:129;13523:12;:10;:12::i;:::-;13537:7;13546:96;13585:15;13546:96;;;;;;;;;;;;;;;;;:11;:25;13558:12;:10;:12::i;:::-;-1:-1:-1;;;;;13546:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;13546:25:0;;;:34;;;;;;;;;;;:96;:38;:96::i;50885:282::-;25820:12;:10;:12::i;:::-;25810:6;;-1:-1:-1;;;;;25810:6:0;;;:22;;;25802:67;;;;;-1:-1:-1;;;25802:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;25802:67:0;;;;;;;;;;;;;;;50987:9:::1;50983:118;51002:19:::0;;::::1;50983:118;;;51085:4;51043:26;:39;51070:8;;51079:1;51070:11;;;;;;;;::::0;;::::1;::::0;;;::::1;;-1:-1:-1::0;;;;;51070:11:0::1;51043:39:::0;;-1:-1:-1;51043:39:0;::::1;::::0;;;;;;-1:-1:-1;51043:39:0;:46;;-1:-1:-1;;51043:46:0::1;::::0;::::1;;::::0;;;::::1;::::0;;-1:-1:-1;51023:3:0::1;50983:118;;;;51118:41;51150:8;;51118:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;-1:-1:-1::0;;51118:41:0::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;51118:41:0;;-1:-1:-1;;;;51118:41:0::1;50885:282:::0;;:::o;53199:147::-;53292:15;;:47;;;-1:-1:-1;;;53292:47:0;;-1:-1:-1;;;;;53292:47:0;;;;;;;;;53268:7;;53292:15;;;;;:38;;:47;;;;;;;;;;;;;;;:15;:47;;;;;;;;;;10732:175;10818:4;10835:42;10845:12;:10;:12::i;:::-;10859:9;10870:6;10835:9;:42::i;53489:318::-;53585:7;53607:6;53628;53649:7;53671;53693;53715;53737;53764:15;;;;;;;;;-1:-1:-1;;;;;53764:15:0;-1:-1:-1;;;;;53764:26:0;;53791:7;53764:35;;;;;;;;;;;;;-1:-1:-1;;;;;53764:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53764:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53764:35:0;;-1:-1:-1;53764:35:0;;-1:-1:-1;53764:35:0;-1:-1:-1;53764:35:0;-1:-1:-1;53764:35:0;-1:-1:-1;53764:35:0;;-1:-1:-1;53764:35:0;-1:-1:-1;53489:318:0;;;;;;;;;:::o;44133:58::-;;;;;;;;;;;;;;;:::o;43336:48::-;;;;;;;;;;;;;;;:::o;48302:326::-;25820:12;:10;:12::i;:::-;25810:6;;-1:-1:-1;;;;;25810:6:0;;;:22;;;25802:67;;;;;-1:-1:-1;;;25802:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;25802:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;48395:24:0;::::1;48387:33;;;::::0;::::1;;48433:21;:43:::0;;-1:-1:-1;;;;;;48433:43:0::1;-1:-1:-1::0;;;;;48433:43:0;;::::1;::::0;;;::::1;::::0;;;;48487:15:::1;::::0;:59:::1;::::0;;-1:-1:-1;;;48487:59:0;;48524:21;;::::1;48487:59;::::0;::::1;::::0;;:15;::::1;::::0;:36:::1;::::0;:59;;;;;-1:-1:-1;;48487:59:0;;;;;;;-1:-1:-1;48487:15:0;:59;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;48591:21:0::1;::::0;-1:-1:-1;;;;;48591:21:0::1;48557:56;::::0;;;:33:::1;:56;::::0;;;;:63;;-1:-1:-1;;48557:63:0::1;48616:4;48557:63;::::0;;-1:-1:-1;;;48302:326:0:o;50265:300::-;25820:12;:10;:12::i;:::-;25810:6;;-1:-1:-1;;;;;25810:6:0;;;:22;;;25802:67;;;;;-1:-1:-1;;;25802:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;25802:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;50358:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;::::1;;:40;;::::0;::::1;;;;50350:105;;;;-1:-1:-1::0;;;50350:105:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;50466:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;50466:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;50523:34;;;;;;;::::1;::::0;;;;;;;;::::1;50265:300:::0;;:::o;48636:194::-;25820:12;:10;:12::i;:::-;25810:6;;-1:-1:-1;;;;;25810:6:0;;;:22;;;25802:67;;;;;-1:-1:-1;;;25802:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;25802:67:0;;;;;;;;;;;;;;;48749:23:::1;;48733:12;:39;;48725:48;;;::::0;::::1;;48784:23;:38:::0;48636:194::o;50573:304::-;25820:12;:10;:12::i;:::-;25810:6;;-1:-1:-1;;;;;25810:6:0;;;:22;;;25802:67;;;;;-1:-1:-1;;;25802:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;25802:67:0;;;;;;;;;;;;;;;50690:9:::1;50686:115;50705:19:::0;;::::1;50686:115;;;50781:8;50746:19;:32;50766:8;;50775:1;50766:11;;;;;;;;::::0;;::::1;::::0;;;::::1;;-1:-1:-1::0;;;;;50766:11:0::1;50746:32:::0;;-1:-1:-1;50746:32:0;::::1;::::0;;;;;;-1:-1:-1;50746:32:0;:43;;-1:-1:-1;;50746:43:0::1;::::0;::::1;;::::0;;;::::1;::::0;;-1:-1:-1;50726:3:0::1;50686:115;;;;50818:51;50850:8;;50860;50818:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;-1:-1:-1::0;;50818:51:0::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;50818:51:0;;-1:-1:-1;;;;;50818:51:0::1;50573:304:::0;;;:::o;48079:215::-;25820:12;:10;:12::i;:::-;25810:6;;-1:-1:-1;;;;;25810:6:0;;;:22;;;25802:67;;;;;-1:-1:-1;;;25802:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;25802:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;48174:43:0;::::1;;::::0;;;:35:::1;:43;::::0;;;;;;;;:50;;-1:-1:-1;;48174:50:0::1;::::0;::::1;;::::0;;::::1;::::0;;;48240:46;;;;;;;::::1;::::0;;;;;;;;::::1;48079:215:::0;;:::o;42031:30::-;;;-1:-1:-1;;;;;42031:30:0;;:::o;42705:51::-;;;;:::o;41901:36::-;;;-1:-1:-1;;;;;41901:36:0;;:::o;42934:64::-;;;:::o;10970:151::-;-1:-1:-1;;;;;11086:18:0;;;11059:7;11086:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;10970:151::o;42142:59::-;;;;:::o;51868:373::-;25820:12;:10;:12::i;:::-;25810:6;;-1:-1:-1;;;;;25810:6:0;;;:22;;;25802:67;;;;;-1:-1:-1;;;25802:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;25802:67:0;;;;;;;;;;;;;;;51985:15:::1;::::0;-1:-1:-1;;;;;51963:37:0;;::::1;51985:15:::0;::::1;51963:37;;51955:104;;;;-1:-1:-1::0;;;51955:104:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52070:41;52086:18;52106:4;52070:15;:41::i;:::-;52170:15;::::0;52127:59:::1;::::0;-1:-1:-1;;;;;52170:15:0;;::::1;::::0;52127:59;::::1;::::0;::::1;::::0;52170:15:::1;::::0;52127:59:::1;52197:15;:36:::0;;-1:-1:-1;;;;;;52197:36:0::1;-1:-1:-1::0;;;;;52197:36:0;;;::::1;::::0;;;::::1;::::0;;51868:373::o;54505:126::-;54584:15;;:39;;;-1:-1:-1;;;54584:39:0;;;;54560:7;;-1:-1:-1;;;;;54584:15:0;;:37;;:39;;;;;;;;;;;;;;:15;:39;;;;;;;;;;52669:124;25820:12;:10;:12::i;:::-;25810:6;;-1:-1:-1;;;;;25810:6:0;;;:22;;;25802:67;;;;;-1:-1:-1;;;25802:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;25802:67:0;;;;;;;;;;;;;;;52743:15:::1;::::0;:42:::1;::::0;;-1:-1:-1;;;52743:42:0;;::::1;::::0;::::1;::::0;;;;;-1:-1:-1;;;;;52743:15:0;;::::1;::::0;:31:::1;::::0;:42;;;;;:15:::1;::::0;:42;;;;;;;;:15;;:42;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;52669:124:::0;:::o;42210:40::-;;;:::o;53812:325::-;53913:7;53935:6;53956;53977:7;53999;54021;54043;54065;54089:15;;;;;;;;;-1:-1:-1;;;;;54089:15:0;-1:-1:-1;;;;;54089:33:0;;54123:5;54089:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26543:244;25820:12;:10;:12::i;:::-;25810:6;;-1:-1:-1;;;;;25810:6:0;;;:22;;;25802:67;;;;;-1:-1:-1;;;25802:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;25802:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;26632:22:0;::::1;26624:73;;;;-1:-1:-1::0;;;26624:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26734:6;::::0;26713:38:::1;::::0;-1:-1:-1;;;;;26713:38:0;;::::1;::::0;26734:6:::1;::::0;26713:38:::1;::::0;26734:6:::1;::::0;26713:38:::1;26762:6;:17:::0;;-1:-1:-1;;;;;;26762:17:0::1;-1:-1:-1::0;;;;;26762:17:0;;;::::1;::::0;;;::::1;::::0;;26543:244::o;43264:36::-;;;;:::o;20639:181::-;20697:7;20729:5;;;20753:6;;;;20745:46;;;;;-1:-1:-1;;;20745:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;20811:1;20639:181;-1:-1:-1;;;20639:181:0:o;95:98::-;175:10;95:98;:::o;16590:380::-;-1:-1:-1;;;;;16726:19:0;;16718:68;;;;-1:-1:-1;;;16718:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16805:21:0;;16797:68;;;;-1:-1:-1;;;16797:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16878:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;16930:32;;;;;;;;;;;;;;;;;16590:380;;;:::o;54922:4330::-;-1:-1:-1;;;;;55054:18:0;;55046:68;;;;-1:-1:-1;;;55046:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;55133:16:0;;55125:64;;;;-1:-1:-1;;;55125:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55202:21;55226;:19;:21::i;:::-;55202:45;;55405:16;55401:167;;-1:-1:-1;;;;;55446:39:0;;;;;;:33;:39;;;;;;;;55438:118;;;;-1:-1:-1;;;55438:118:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55583:11;55580:92;;55611:28;55627:4;55633:2;55637:1;55611:15;:28::i;:::-;55654:7;;;55580:92;55714:21;;55684:19;;-1:-1:-1;;;;;55706:29:0;;;55714:21;;55706:29;:46;;;;;55745:7;:5;:7::i;:::-;-1:-1:-1;;;;;55739:13:0;:2;-1:-1:-1;;;;;55739:13:0;;;55706:46;55684:68;;55947:14;55944:835;;;56005:23;;55986:15;:42;;55978:100;;;;-1:-1:-1;;;55978:100:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56095:19;56165:33;56117:44;56137:23;;56117:15;:19;;:44;;;;:::i;:::-;:81;;:183;;;;56262:38;56237:21;;:63;;56117:183;56095:205;;56321:14;56317:177;;-1:-1:-1;;;;;56364:30:0;;;;;;:26;:30;;;;;;;;56356:122;;;;-1:-1:-1;;;56356:122:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;56514:19:0;;;;;;:15;:19;;;;;;;;56510:157;;-1:-1:-1;;;;;56554:19:0;;;;;;:15;:19;;;;;:26;;-1:-1:-1;;56554:26:0;56576:4;56554:26;;;;;;56623:21;;:28;;:25;:28::i;:::-;56599:21;:52;56510:157;-1:-1:-1;;;;;56713:30:0;;;;;;:26;:30;;;;;;;;;;56745:21;;56688:79;;;;;;;56713:30;;;;56688:79;;;56705:6;;56713:30;;56688:79;;;;;;;;;55944:835;;56807:8;;-1:-1:-1;;;56807:8:0;;;;56806:9;:39;;;;;56829:16;56806:39;:85;;;;-1:-1:-1;;;;;;56862:29:0;;;;;;:25;:29;;;;;;;;56806:85;:198;;;;-1:-1:-1;56988:15:0;;-1:-1:-1;;;;;56972:32:0;;;56988:15;;56972:32;;56806:198;:303;;;;-1:-1:-1;;;;;;57086:23:0;;;;;;:19;:23;;;;;;;;57085:24;56806:303;56791:582;;;-1:-1:-1;;;;;57179:41:0;;;;;;:35;:41;;;;;;;;57174:188;;57259:24;;57249:6;:34;;57241:105;;;;-1:-1:-1;;;57241:105:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57379:28;57410:24;57428:4;57410:9;:24::i;:::-;57494:18;;57379:55;;-1:-1:-1;57470:42:0;;;57542:16;:41;;;;;57576:7;57542:41;:67;;;;-1:-1:-1;57601:8:0;;-1:-1:-1;;;57601:8:0;;;;57600:9;57542:67;:116;;;;-1:-1:-1;;;;;;57627:31:0;;;;;;:25;:31;;;;;;;;57626:32;57542:116;:156;;;;-1:-1:-1;57683:15:0;;-1:-1:-1;;;;;57675:23:0;;;57683:15;;57675:23;;57542:156;:194;;;;-1:-1:-1;57721:15:0;;-1:-1:-1;;;;;57715:21:0;;;57721:15;;57715:21;;57542:194;57525:539;;;57763:8;:15;;-1:-1:-1;;;;57763:15:0;-1:-1:-1;;;57763:15:0;;;;57816:53;57859:9;57816:38;:20;57841:12;57816:24;:38::i;:::-;:42;;:53::i;:::-;57795:74;;57884:26;57899:10;57884:14;:26::i;:::-;57927:18;57948:24;57966:4;57948:9;:24::i;:::-;57927:45;;57987:32;58008:10;57987:20;:32::i;:::-;-1:-1:-1;;58036:8:0;:16;;-1:-1:-1;;;;58036:16:0;;;57525:539;58078:12;58094:14;58093:15;:35;;;;;58112:16;58093:35;:48;;;;-1:-1:-1;58133:8:0;;-1:-1:-1;;;58133:8:0;;;;58132:9;58093:48;-1:-1:-1;;;;;58242:25:0;;;;;;:19;:25;;;;;;58078:63;;-1:-1:-1;58242:25:0;;;:52;;-1:-1:-1;;;;;;58271:23:0;;;;;;:19;:23;;;;;;;;58242:52;58239:99;;;-1:-1:-1;58321:5:0;58239:99;58353:7;58350:352;;;58374:12;58389:30;58415:3;58389:21;:6;58400:9;58389:10;:21::i;:30::-;-1:-1:-1;;;;;58480:29:0;;;;;;:25;:29;;;;;;58374:45;;-1:-1:-1;58480:29:0;;58477:116;;;58537:40;58573:3;58537:31;:4;58546:21;58537:8;:31::i;:40::-;58530:47;;58477:116;58615:16;:6;58626:4;58615:10;:16::i;:::-;58606:25;;58648:42;58664:4;58678;58685;58648:15;:42::i;:::-;58350:352;;58714:33;58730:4;58736:2;58740:6;58714:15;:33::i;:::-;58764:15;;-1:-1:-1;;;;;58764:15:0;:26;58799:4;58806:15;58799:4;58806:9;:15::i;:::-;58764:58;;;;;;;;;;;;;-1:-1:-1;;;;;58764:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58760:74;58848:15;;-1:-1:-1;;;;;58848:15:0;:26;58883:2;58888:13;58883:2;58888:9;:13::i;:::-;58848:54;;;;;;;;;;;;;-1:-1:-1;;;;;58848:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58844:70;58930:8;;-1:-1:-1;;;58930:8:0;;;;58926:319;;58963:16;;58994:15;;:28;;;-1:-1:-1;;;;;;58994:28:0;;;;;;;;;;-1:-1:-1;;;;;58994:15:0;;;;:23;;:28;;;;;;;;;;;;;;;58949:11;58994:15;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58994:28:0;;;;;;;;;;;;;;;;58990:244;;;;;59111:86;;;;;;;;;;;;;;;;;;;;;;;;;;59187:9;;59176:4;;59111:86;;;;;;;;;59023:184;;;58990:244;58926:319;;54922:4330;;;;;;;;;:::o;21542:192::-;21628:7;21664:12;21656:6;;;;21648:29;;;;-1:-1:-1;;;21648:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;21700:5:0;;;21542:192::o;51449:409::-;-1:-1:-1;;;;;51540:31:0;;;;;;:25;:31;;;;;;;;:40;;;;;;;51532:119;;;;-1:-1:-1;;;51532:119:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;51662:31:0;;;;;;:25;:31;;;;;:39;;-1:-1:-1;;51662:39:0;;;;;;;;;;;;51714:79;;51739:15;;:42;;;-1:-1:-1;;;51739:42:0;;-1:-1:-1;;;;;51739:42:0;;;;;;;;;:15;;;;;:36;;:42;;;;;:15;;:42;;;;;;;:15;;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51714:79;51810:40;;;;;;-1:-1:-1;;;;;51810:40:0;;;;;;;;51449:409;;:::o;14163:573::-;-1:-1:-1;;;;;14303:20:0;;14295:70;;;;-1:-1:-1;;;14295:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14384:23:0;;14376:71;;;;-1:-1:-1;;;14376:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14460:47;14481:6;14489:9;14500:6;14460:20;:47::i;:::-;14540:71;14562:6;14540:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14540:17:0;;:9;:17;;;;;;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;14520:17:0;;;:9;:17;;;;;;;;;;;:91;;;;14645:20;;;;;;;:32;;14670:6;14645:24;:32::i;:::-;-1:-1:-1;;;;;14622:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;14693:35;;;;;;;14622:20;;14693:35;;;;;;;;;;;;;14163:573;;;:::o;21103:136::-;21161:7;21188:43;21192:1;21195;21188:43;;;;;;;;;;;;;;;;;:3;:43::i;21993:471::-;22051:7;22296:6;22292:47;;-1:-1:-1;22326:1:0;22319:8;;22292:47;22363:5;;;22367:1;22363;:5;:1;22387:5;;;;;:10;22379:56;;;;-1:-1:-1;;;22379:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22940:132;22998:7;23025:39;23029:1;23032;23025:39;;;;;;;;;;;;;;;;;:3;:39::i;59260:931::-;59370:12;59385:13;:6;59396:1;59385:10;:13::i;:::-;59370:28;-1:-1:-1;59409:17:0;59429:16;:6;59370:28;59429:10;:16::i;:::-;59409:36;-1:-1:-1;59748:21:0;59814:22;59831:4;59814:16;:22::i;:::-;59967:18;59988:41;:21;60014:14;59988:25;:41::i;:::-;59967:62;;60079:35;60092:9;60103:10;60079:12;:35::i;:::-;60140:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59260:931;;;;;:::o;61367:312::-;61432:24;61449:6;61432:16;:24::i;:::-;61545:15;;61537:51;;61487:21;;61467:17;;-1:-1:-1;;;;;61545:15:0;;;;61487:21;;61467:17;61537:51;61467:17;61537:51;61487:21;61545:15;61537:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61519:69;;;61604:7;61601:71;;;61628:32;;;;;;;;;;;;;;;;;;;;;;;;;61367:312;;;:::o;23568:278::-;23654:7;23689:12;23682:5;23674:28;;;;-1:-1:-1;;;23674:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23713:9;23729:1;23725;:5;;;;;;;23568:278;-1:-1:-1;;;;;23568:278:0:o;60199:611::-;60361:16;;;60375:1;60361:16;;;60337:21;60361:16;;;;;60337:21;60361:16;;;;;;;;;;-1:-1:-1;60361:16:0;60337:40;;60406:4;60388;60393:1;60388:7;;;;;;;;-1:-1:-1;;;;;60388:23:0;;;:7;;;;;;;;;;:23;;;;60432:15;;:22;;;-1:-1:-1;;;60432:22:0;;;;:15;;;;;:20;;:22;;;;;60388:7;;60432:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60432:22:0;60422:7;;:4;;60427:1;;60422:7;;;;;;-1:-1:-1;;;;;60422:32:0;;;:7;;;;;;;;;:32;60499:15;;60467:62;;60484:4;;60499:15;60517:11;60467:8;:62::i;:::-;60568:15;;:224;;-1:-1:-1;;;60568:224:0;;;;;;;;:15;:224;;;;;;60746:4;60568:224;;;;;;60766:15;60568:224;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;60568:15:0;;;;:66;;60649:11;;60719:4;;60746;60766:15;60568:224;;;;;;;;;;;;;;;;:15;:224;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60199:611;;:::o;60818:541::-;61008:15;;60976:62;;60993:4;;-1:-1:-1;;;;;61008:15:0;61026:11;60976:8;:62::i;:::-;61081:15;;61285;;61081:260;;;-1:-1:-1;;;61081:260:0;;61153:4;61081:260;;;;;;;;;;:15;:260;;;;;;;;;;-1:-1:-1;;;;;61285:15:0;;;61081:260;;;;61315:15;61081:260;;;;;;:15;;;;;:31;;61120:9;;61081:260;;;;;;;;;;;;;;;61120:9;61081:15;:260;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;60818:541:0:o

Swarm Source

ipfs://70e88175e1a3db988cd20f5a7e8260bb313a27b3131cce941c8a972aa0c36618
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.