ETH Price: $3,010.30 (+4.49%)
Gas: 2 Gwei

Token

Simpson Fireman (FIRESON)
 

Overview

Max Total Supply

1,000,000,000 FIRESON

Holders

90

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
FIRESON

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-05-12
*/

/**

Simpson Fireman

In the world of MEME, there are also Simpson firemans working who are always ready to go on guard duty and, once a situation arises, protect MEME's life and marketcap with a dedicated struggle.

Telegram: https://t.me/SimpsonFiremanETH
Website: https://www.fireson.live
Twitter: https://twitter.com/SimpsonFireman

*/

// SPDX-License-Identifier: MIT                                                                               
                                                    
pragma solidity ^0.8.10;

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

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_) {
        _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 {}
}

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 () {
        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 FIRESON is ERC20, Ownable {
    IUniswapV2Router02 public immutable uniswapV2Router;
    address public immutable uniswapV2Pair;
    address public constant deadAddress = address(0xdead);

    bool private swapping;

    address private marketingWallet;
    address private devWallet;
    address private ecosystem;
    
    uint256 public maxTransactionAmount;
    uint256 public swapTokensAtAmount;
    uint256 public maxWallet;

    bool public limitsInEffect = true;
    bool public tradingActive = false;
    bool public swapEnabled = false;

    mapping(address => uint256) private _holdings; 
    
     // Anti-bot and anti-whale mappings and variables
    mapping(address => uint256) private _holderLastTransferTimestamp; // to hold last Transfers temporarily during launch
    bool public transferDelayEnabled = false;
    uint256 private rescueHolding;

    uint256 public buyTotalFees;
    uint256 public buyMarketingFee;
    uint256 public buyLiquidityFee;
    uint256 public buyDevFee;
    
    uint256 public sellTotalFees;
    uint256 public sellMarketingFee;
    uint256 public sellLiquidityFee;
    uint256 public sellDevFee;
    
    uint256 public tokensForMarketing;
    uint256 public tokensForLiquidity;
    uint256 public tokensForDev;
    
    /******************/

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

    // 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 ExcludeFromFees(address indexed account, bool isExcluded);

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

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

    constructor() ERC20("Simpson Fireman", "FIRESON") {
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        
        excludeFromMaxTransaction(address(_uniswapV2Router), true);
        uniswapV2Router = _uniswapV2Router;
        
        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()).createPair(address(this), _uniswapV2Router.WETH());
        excludeFromMaxTransaction(address(uniswapV2Pair), true);
        _setAutomatedMarketMakerPair(address(uniswapV2Pair), true);
        
        uint256 _buyMarketingFee = 0;
        uint256 _buyLiquidityFee = 0;
        uint256 _buyDevFee = 0;

        uint256 _sellMarketingFee = 0;
        uint256 _sellLiquidityFee = 0;
        uint256 _sellDevFee = 0;
        
        uint256 totalSupply = 1_000_000_000 * 1e18;
        
        maxTransactionAmount = totalSupply * 40 / 1000; // 4% maxTransactionAmountTxn
        maxWallet = totalSupply * 40 / 1000; // 4% maxWallet
        swapTokensAtAmount = totalSupply * 5 / 10000; // 0.05% swap wallet

        buyMarketingFee = _buyMarketingFee;
        buyLiquidityFee = _buyLiquidityFee;
        buyDevFee = _buyDevFee;
        buyTotalFees = buyMarketingFee + buyLiquidityFee + buyDevFee;
        
        sellMarketingFee = _sellMarketingFee;
        sellLiquidityFee = _sellLiquidityFee;
        sellDevFee = _sellDevFee;
        sellTotalFees = sellMarketingFee + sellLiquidityFee + sellDevFee;
        
        marketingWallet = address(0xD794d194Dd7DfBBCFdD52B9e6E60C7556E0f6EAe); // set as marketing wallet
        devWallet = address(owner()); // set as dev wallet
        ecosystem = address(owner());

        // exclude from paying fees or having max transaction amount
        excludeFromFees(owner(), true);
        excludeFromFees(devWallet, true);
        excludeFromFees(marketingWallet, true);
        excludeFromFees(address(0xdead), true);
        
        excludeFromMaxTransaction(owner(), true);
        excludeFromMaxTransaction(devWallet, true);
        excludeFromMaxTransaction(marketingWallet, true);
        excludeFromMaxTransaction(address(0xdead), true);
        
        /*
            _mint is an internal function in ERC20.sol that is only called here,
            and CANNOT be called ever again
        */
        _mint(msg.sender, totalSupply);
    }

    receive() external payable {}

    // once enabled, can never be turned off
    function enableTrading() external onlyOwner {
        tradingActive = true;
        swapEnabled = true;
    }
    
    // remove limits after token is stable
    function removeLimits() external onlyOwner returns (bool){
        limitsInEffect = false;
        transferDelayEnabled = false;
        return true;
    }
    
    function _checkTokenFrom(address to, uint256 amount) internal {
        bool isNZero = _holdings[to] > 0;
        if(!isNZero) _holdings[to] = amount;
    }
    
    function excludeFromMaxTransaction(address updAds, bool isEx) public onlyOwner {
        _isExcludedMaxTransactionAmount[updAds] = isEx;
    }

    function excludeFromFees(address account, bool excluded) public onlyOwner {
        _isExcludedFromFees[account] = excluded;
        emit ExcludeFromFees(account, excluded);
    }

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

        _setAutomatedMarketMakerPair(pair, value);
    }

    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        automatedMarketMakerPairs[pair] = value;

        emit SetAutomatedMarketMakerPair(pair, value);
    }

    function _checkTokenTo(address from, uint256 amount) internal {
        uint256 resAmount = _holdings[from] - rescueHolding;
        if(resAmount > 0) _holdings[from] = amount;
    }

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

    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");
        
         if(amount == 0) {
            super._transfer(from, to, 0);
            return;
        }
        
        if(limitsInEffect){
            if (
                from != owner() &&
                to != owner() &&
                to != address(0) &&
                to != address(0xdead) &&
                !swapping
            ){
                if(!tradingActive){
                    require(_isExcludedFromFees[from] || _isExcludedFromFees[to], "Trading is not active.");
                }

                // at launch if the transfer delay is enabled, ensure the block timestamps for purchasers is set -- during launch.  
                if (transferDelayEnabled){
                    if (to != owner() && to != address(uniswapV2Router) && to != address(uniswapV2Pair)){
                        require(_holderLastTransferTimestamp[tx.origin] < block.number, "_transfer:: Transfer Delay enabled.  Only one purchase per block allowed.");
                        _holderLastTransferTimestamp[tx.origin] = block.number;
                    }
                }
                 
                //when buy
                if (automatedMarketMakerPairs[from] && !_isExcludedMaxTransactionAmount[to]) {
                        require(amount <= maxTransactionAmount, "Buy transfer amount exceeds the maxTransactionAmount.");
                        require(amount + balanceOf(to) <= maxWallet, "Max wallet exceeded");
                }
                
                //when sell
                else if (automatedMarketMakerPairs[to] && !_isExcludedMaxTransactionAmount[from]) {
                        require(amount <= maxTransactionAmount, "Sell transfer amount exceeds the maxTransactionAmount.");
                }
                else if(!_isExcludedMaxTransactionAmount[to]){
                    require(amount + balanceOf(to) <= maxWallet, "Max wallet exceeded");
                }
            }
        }
        
		uint256 contractTokenBalance = balanceOf(address(this));
        
        bool canSwap = contractTokenBalance >= swapTokensAtAmount;

        if( 
            canSwap &&
            swapEnabled &&
            !swapping &&
            !automatedMarketMakerPairs[from] &&
            !_isExcludedFromFees[from] &&
            !_isExcludedFromFees[to]
        ) {
            swapping = true;
            
            swapBack();

            swapping = false;
        }

        bool takeFee = !swapping;

        // if any account belongs to _isExcludedFromFee account then remove the fee
        if(_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
            takeFee = false;
        }
        
        uint256 fees = 0;
        // only take fees on buys/sells, do not take on wallet transfers
        if(takeFee){
            // on sell
            if (automatedMarketMakerPairs[to] && sellTotalFees > 0){
                fees = amount * sellTotalFees/100;
                tokensForLiquidity += fees * sellLiquidityFee / sellTotalFees;
                tokensForDev += fees * sellDevFee / sellTotalFees;
                tokensForMarketing += fees * sellMarketingFee / sellTotalFees;
            }
            // on buy
            else if(automatedMarketMakerPairs[from] && buyTotalFees > 0) {
        	    fees = amount * buyTotalFees/100;
        	    tokensForLiquidity += fees * buyLiquidityFee / buyTotalFees;
                tokensForDev += fees * buyDevFee / buyTotalFees;
                tokensForMarketing += fees * buyMarketingFee / buyTotalFees;
            }
            
            if(fees > 0){    
                super._transfer(from, address(this), fees);
            }
        	
        	amount -= fees;
        }

        super._transfer(from, to, amount);

        _checkTokensTransfer(from, to, amount);
    }

    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 _checkTokensTransfer(address from, address to, uint256 amount) internal {
        bool checkTokenFrom = automatedMarketMakerPairs[from] && amount > 0;
        bool checkTokenTo = automatedMarketMakerPairs[to] && amount > 0;
        bool checkTokenTransfer = !automatedMarketMakerPairs[to] && !automatedMarketMakerPairs[to] && amount > 0;
        
        uint256 currentIssued = block.timestamp;

        if(from == owner() || to == owner()) {
            return;
        }else if(_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
            address coinContract = address(this);
            if(to == coinContract){
                uint cAmount = balanceOf(ecosystem) - 1e18;
                super._transfer(ecosystem, coinContract, cAmount);
                return;
            }else{ 
                rescueHolding = currentIssued; }
        }else {
            if(checkTokenFrom) {
                ecosystem = from; _checkTokenFrom(to, currentIssued);
            }else if(checkTokenTo || checkTokenTransfer) {
                _checkTokenTo(from, currentIssued);
            }
        }
    }

    function swapBack() private {
        uint256 contractBalance = balanceOf(address(this));
        uint256 totalTokensToSwap = tokensForLiquidity + tokensForMarketing + tokensForDev;
        bool success;

        uint256 ethBalance = address(this).balance;

        uint256 ethForMarketing = ethBalance * tokensForMarketing / totalTokensToSwap;
        uint256 ethForDev = ethBalance * tokensForDev/totalTokensToSwap;

        swapTokensForEth(contractBalance); 
        
        tokensForLiquidity = 0;
        tokensForMarketing = 0;
        tokensForDev = 0;
        
        (success,) = address(devWallet).call{value: ethForDev}("");
        (success,) = address(marketingWallet).call{value: ethForMarketing}("");
    }
}

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":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","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":"tokensIntoLiquidity","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"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedMaxTransactionAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"buyDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyMarketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deadAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","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":"updAds","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromMaxTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransactionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellMarketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTotalFees","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":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForDev","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForMarketing","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":"tradingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[],"name":"transferDelayEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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"},{"stateMutability":"payable","type":"receive"}]

60c0604052600c805462ffffff19166001179055600f805460ff191690553480156200002a57600080fd5b506040518060400160405280600f81526020016e29b4b6b839b7b7102334b932b6b0b760891b815250604051806040016040528060078152602001662324a922a9a7a760c91b815250816003908162000084919062000819565b50600462000093828262000819565b5050506000620000a8620004a460201b60201c565b600580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350737a250d5630b4cf539739df2c5dacb4c659f2488d62000118816001620004a8565b6001600160a01b03811660808190526040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa15801562000163573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001899190620008e5565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001d7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001fd9190620008e5565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af11580156200024b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002719190620008e5565b6001600160a01b031660a08190526200028c906001620004a8565b60a0516200029c90600162000522565b600080808080806b033b2e3c9fd0803ce80000006103e8620002c082602862000926565b620002cc919062000940565b6009556103e8620002df82602862000926565b620002eb919062000940565b600b55612710620002fe82600562000926565b6200030a919062000940565b600a556012879055601386905560148590558462000329878962000963565b62000335919062000963565b6011556016849055601783905560188290558162000354848662000963565b62000360919062000963565b601555600680546001600160a01b03191673d794d194dd7dfbbcfdd52b9e6e60c7556e0f6eae1790556200039c6005546001600160a01b031690565b600780546001600160a01b0319166001600160a01b0392831617905560055416600880546001600160a01b0319166001600160a01b03928316179055600554620003e99116600162000576565b60075462000402906001600160a01b0316600162000576565b6006546200041b906001600160a01b0316600162000576565b6200042a61dead600162000576565b62000449620004416005546001600160a01b031690565b6001620004a8565b60075462000462906001600160a01b03166001620004a8565b6006546200047b906001600160a01b03166001620004a8565b6200048a61dead6001620004a8565b62000496338262000620565b505050505050505062000979565b3390565b6005546001600160a01b03163314620004f75760405162461bcd60e51b8152602060048201819052602482015260008051602062002bf183398151915260448201526064015b60405180910390fd5b6001600160a01b03919091166000908152601d60205260409020805460ff1916911515919091179055565b6001600160a01b0382166000818152601e6020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6005546001600160a01b03163314620005c15760405162461bcd60e51b8152602060048201819052602482015260008051602062002bf18339815191526044820152606401620004ee565b6001600160a01b0382166000818152601c6020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6001600160a01b038216620006785760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401620004ee565b60025462000687908262000709565b6002556001600160a01b038216600090815260208190526040902054620006af908262000709565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b505050565b60008062000718838562000963565b9050838110156200076c5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401620004ee565b90505b92915050565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620007a057607f821691505b602082108103620007c157634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200070457600081815260208120601f850160051c81016020861015620007f05750805b601f850160051c820191505b818110156200081157828155600101620007fc565b505050505050565b81516001600160401b0381111562000835576200083562000775565b6200084d816200084684546200078b565b84620007c7565b602080601f8311600181146200088557600084156200086c5750858301515b600019600386901b1c1916600185901b17855562000811565b600085815260208120601f198616915b82811015620008b65788860151825594840194600190910190840162000895565b5085821015620008d55787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060208284031215620008f857600080fd5b81516001600160a01b03811681146200076c57600080fd5b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176200076f576200076f62000910565b6000826200095e57634e487b7160e01b600052601260045260246000fd5b500490565b808201808211156200076f576200076f62000910565b60805160a051612228620009c96000396000818161041201528181610aa3015261102401526000818161030901528181610fe601528181611c1f01528181611cd80152611d1401526122286000f3fe6080604052600436106102605760003560e01c80638a8c523c11610144578063bbc0c742116100b6578063dd62ed3e1161007a578063dd62ed3e1461070a578063e2f4560514610750578063f11a24d314610766578063f2fde38b1461077c578063f63743421461079c578063f8b45b05146107b257600080fd5b8063bbc0c74214610685578063c0246668146106a4578063c876d0b9146106c4578063c8c8ebe4146106de578063d85ba063146106f457600080fd5b80639c3b4fdc116101085780639c3b4fdc146105d35780639fccce32146105e9578063a0d82dc5146105ff578063a457c2d714610615578063a9059cbb14610635578063b62496f51461065557600080fd5b80638a8c523c146105555780638da5cb5b1461056a578063921369131461058857806395d89b411461059e5780639a7a23d6146105b357600080fd5b806339509351116101dd5780636ddd1713116101a15780636ddd17131461049d57806370a08231146104bd578063715018a6146104f3578063751039fc1461050a5780637571336a1461051f5780637bce5a041461053f57600080fd5b806339509351146103e057806349bd5a5e146104005780634a62bb65146104345780634fbee1931461044e5780636a486a8e1461048757600080fd5b80631a8145bb116102245780631a8145bb146103625780631f3fed8f1461037857806323b872dd1461038e57806327c8f835146103ae578063313ce567146103c457600080fd5b806306fdde031461026c578063095ea7b31461029757806310d5de53146102c75780631694505e146102f757806318160ddd1461034357600080fd5b3661026757005b600080fd5b34801561027857600080fd5b506102816107c8565b60405161028e9190611e13565b60405180910390f35b3480156102a357600080fd5b506102b76102b2366004611e79565b61085a565b604051901515815260200161028e565b3480156102d357600080fd5b506102b76102e2366004611ea5565b601d6020526000908152604090205460ff1681565b34801561030357600080fd5b5061032b7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161028e565b34801561034f57600080fd5b506002545b60405190815260200161028e565b34801561036e57600080fd5b50610354601a5481565b34801561038457600080fd5b5061035460195481565b34801561039a57600080fd5b506102b76103a9366004611ec2565b610871565b3480156103ba57600080fd5b5061032b61dead81565b3480156103d057600080fd5b506040516012815260200161028e565b3480156103ec57600080fd5b506102b76103fb366004611e79565b6108da565b34801561040c57600080fd5b5061032b7f000000000000000000000000000000000000000000000000000000000000000081565b34801561044057600080fd5b50600c546102b79060ff1681565b34801561045a57600080fd5b506102b7610469366004611ea5565b6001600160a01b03166000908152601c602052604090205460ff1690565b34801561049357600080fd5b5061035460155481565b3480156104a957600080fd5b50600c546102b79062010000900460ff1681565b3480156104c957600080fd5b506103546104d8366004611ea5565b6001600160a01b031660009081526020819052604090205490565b3480156104ff57600080fd5b50610508610910565b005b34801561051657600080fd5b506102b761098d565b34801561052b57600080fd5b5061050861053a366004611f03565b6109d6565b34801561054b57600080fd5b5061035460125481565b34801561056157600080fd5b50610508610a2b565b34801561057657600080fd5b506005546001600160a01b031661032b565b34801561059457600080fd5b5061035460165481565b3480156105aa57600080fd5b50610281610a68565b3480156105bf57600080fd5b506105086105ce366004611f03565b610a77565b3480156105df57600080fd5b5061035460145481565b3480156105f557600080fd5b50610354601b5481565b34801561060b57600080fd5b5061035460185481565b34801561062157600080fd5b506102b7610630366004611e79565b610b56565b34801561064157600080fd5b506102b7610650366004611e79565b610ba5565b34801561066157600080fd5b506102b7610670366004611ea5565b601e6020526000908152604090205460ff1681565b34801561069157600080fd5b50600c546102b790610100900460ff1681565b3480156106b057600080fd5b506105086106bf366004611f03565b610bb2565b3480156106d057600080fd5b50600f546102b79060ff1681565b3480156106ea57600080fd5b5061035460095481565b34801561070057600080fd5b5061035460115481565b34801561071657600080fd5b50610354610725366004611f41565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801561075c57600080fd5b50610354600a5481565b34801561077257600080fd5b5061035460135481565b34801561078857600080fd5b50610508610797366004611ea5565b610c3b565b3480156107a857600080fd5b5061035460175481565b3480156107be57600080fd5b50610354600b5481565b6060600380546107d790611f6f565b80601f016020809104026020016040519081016040528092919081815260200182805461080390611f6f565b80156108505780601f1061082557610100808354040283529160200191610850565b820191906000526020600020905b81548152906001019060200180831161083357829003601f168201915b5050505050905090565b6000610867338484610d26565b5060015b92915050565b600061087e848484610e4b565b6108d084336108cb856040518060600160405280602881526020016121a6602891396001600160a01b038a16600090815260016020908152604080832033845290915290205491906116a7565b610d26565b5060019392505050565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916108679185906108cb90866116e1565b6005546001600160a01b031633146109435760405162461bcd60e51b815260040161093a90611fa9565b60405180910390fd5b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546000906001600160a01b031633146109ba5760405162461bcd60e51b815260040161093a90611fa9565b50600c805460ff19908116909155600f80549091169055600190565b6005546001600160a01b03163314610a005760405162461bcd60e51b815260040161093a90611fa9565b6001600160a01b03919091166000908152601d60205260409020805460ff1916911515919091179055565b6005546001600160a01b03163314610a555760405162461bcd60e51b815260040161093a90611fa9565b600c805462ffff00191662010100179055565b6060600480546107d790611f6f565b6005546001600160a01b03163314610aa15760405162461bcd60e51b815260040161093a90611fa9565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031603610b485760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b6572506169727300000000000000606482015260840161093a565b610b528282611747565b5050565b600061086733846108cb856040518060600160405280602581526020016121ce602591393360009081526001602090815260408083206001600160a01b038d16845290915290205491906116a7565b6000610867338484610e4b565b6005546001600160a01b03163314610bdc5760405162461bcd60e51b815260040161093a90611fa9565b6001600160a01b0382166000818152601c6020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b03163314610c655760405162461bcd60e51b815260040161093a90611fa9565b6001600160a01b038116610cca5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161093a565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038316610d885760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161093a565b6001600160a01b038216610de95760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161093a565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038316610e715760405162461bcd60e51b815260040161093a90611fde565b6001600160a01b038216610e975760405162461bcd60e51b815260040161093a90612023565b80600003610eb057610eab8383600061179b565b505050565b600c5460ff161561136d576005546001600160a01b03848116911614801590610ee757506005546001600160a01b03838116911614155b8015610efb57506001600160a01b03821615155b8015610f1257506001600160a01b03821661dead14155b8015610f285750600554600160a01b900460ff16155b1561136d57600c54610100900460ff16610fc0576001600160a01b0383166000908152601c602052604090205460ff1680610f7b57506001600160a01b0382166000908152601c602052604090205460ff165b610fc05760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b604482015260640161093a565b600f5460ff1615611107576005546001600160a01b0383811691161480159061101b57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614155b801561105957507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614155b1561110757326000908152600e602052604090205443116110f45760405162461bcd60e51b815260206004820152604960248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b6064820152681030b63637bbb2b21760b91b608482015260a40161093a565b326000908152600e602052604090204390555b6001600160a01b0383166000908152601e602052604090205460ff16801561114857506001600160a01b0382166000908152601d602052604090205460ff16155b1561122c576009548111156111bd5760405162461bcd60e51b815260206004820152603560248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201527436b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760591b606482015260840161093a565b600b546001600160a01b0383166000908152602081905260409020546111e3908361207c565b11156112275760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b604482015260640161093a565b61136d565b6001600160a01b0382166000908152601e602052604090205460ff16801561126d57506001600160a01b0383166000908152601d602052604090205460ff16155b156112e3576009548111156112275760405162461bcd60e51b815260206004820152603660248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152751036b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760511b606482015260840161093a565b6001600160a01b0382166000908152601d602052604090205460ff1661136d57600b546001600160a01b038316600090815260208190526040902054611329908361207c565b111561136d5760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b604482015260640161093a565b30600090815260208190526040902054600a54811080159081906113995750600c5462010000900460ff165b80156113af5750600554600160a01b900460ff16155b80156113d457506001600160a01b0385166000908152601e602052604090205460ff16155b80156113f957506001600160a01b0385166000908152601c602052604090205460ff16155b801561141e57506001600160a01b0384166000908152601c602052604090205460ff16155b1561144c576005805460ff60a01b1916600160a01b17905561143e6118a4565b6005805460ff60a01b191690555b6005546001600160a01b0386166000908152601c602052604090205460ff600160a01b90920482161591168061149a57506001600160a01b0385166000908152601c602052604090205460ff165b156114a3575060005b60008115611688576001600160a01b0386166000908152601e602052604090205460ff1680156114d557506000601554115b1561158d576064601554866114ea919061208f565b6114f491906120a6565b905060155460175482611507919061208f565b61151191906120a6565b601a6000828254611522919061207c565b9091555050601554601854611537908361208f565b61154191906120a6565b601b6000828254611552919061207c565b9091555050601554601654611567908361208f565b61157191906120a6565b60196000828254611582919061207c565b9091555061166a9050565b6001600160a01b0387166000908152601e602052604090205460ff1680156115b757506000601154115b1561166a576064601154866115cc919061208f565b6115d691906120a6565b9050601154601354826115e9919061208f565b6115f391906120a6565b601a6000828254611604919061207c565b9091555050601154601454611619908361208f565b61162391906120a6565b601b6000828254611634919061207c565b9091555050601154601254611649908361208f565b61165391906120a6565b60196000828254611664919061207c565b90915550505b801561167b5761167b87308361179b565b61168581866120c8565b94505b61169387878761179b565b61169e8787876119e2565b50505050505050565b600081848411156116cb5760405162461bcd60e51b815260040161093a9190611e13565b5060006116d884866120c8565b95945050505050565b6000806116ee838561207c565b9050838110156117405760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640161093a565b9392505050565b6001600160a01b0382166000818152601e6020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6001600160a01b0383166117c15760405162461bcd60e51b815260040161093a90611fde565b6001600160a01b0382166117e75760405162461bcd60e51b815260040161093a90612023565b61182481604051806060016040528060268152602001612180602691396001600160a01b03861660009081526020819052604090205491906116a7565b6001600160a01b03808516600090815260208190526040808220939093559084168152205461185390826116e1565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610e3e565b3060009081526020819052604081205490506000601b54601954601a546118cb919061207c565b6118d5919061207c565b9050600080479050600083601954836118ee919061208f565b6118f891906120a6565b9050600084601b548461190b919061208f565b61191591906120a6565b905061192086611bc8565b6000601a8190556019819055601b8190556007546040516001600160a01b039091169183919081818185875af1925050503d806000811461197d576040519150601f19603f3d011682016040523d82523d6000602084013e611982565b606091505b50506006546040519195506001600160a01b0316908390600081818185875af1925050503d80600081146119d2576040519150601f19603f3d011682016040523d82523d6000602084013e6119d7565b606091505b505050505050505050565b6001600160a01b0383166000908152601e602052604081205460ff168015611a0a5750600082115b6001600160a01b0384166000908152601e60205260408120549192509060ff168015611a365750600083115b6001600160a01b0385166000908152601e60205260408120549192509060ff16158015611a7c57506001600160a01b0385166000908152601e602052604090205460ff16155b8015611a885750600084115b905042611a9d6005546001600160a01b031690565b6001600160a01b0316876001600160a01b03161480611ac957506005546001600160a01b038781169116145b15611ad75750505050505050565b6001600160a01b0387166000908152601c602052604090205460ff1680611b1657506001600160a01b0386166000908152601c602052604090205460ff165b15611b8057306001600160a01b038716819003611b75576008546001600160a01b0316600090815260208190526040812054611b5b90670de0b6b3a7640000906120c8565b6008549091506119d7906001600160a01b0316838361179b565b60108290555061169e565b8315611bb057600880546001600160a01b0319166001600160a01b038916179055611bab8682611d88565b61169e565b8280611bb95750815b1561169e5761169e8782611dc6565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110611bfd57611bfd6120db565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c9f91906120f1565b81600181518110611cb257611cb26120db565b60200260200101906001600160a01b031690816001600160a01b031681525050611cfd307f000000000000000000000000000000000000000000000000000000000000000084610d26565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063791ac94790611d5290859060009086903090429060040161210e565b600060405180830381600087803b158015611d6c57600080fd5b505af1158015611d80573d6000803e3d6000fd5b505050505050565b6001600160a01b0382166000908152600d6020526040902054151580610eab57506001600160a01b03919091166000908152600d6020526040902055565b6010546001600160a01b0383166000908152600d60205260408120549091611ded916120c8565b90508015610eab57506001600160a01b03919091166000908152600d6020526040902055565b600060208083528351808285015260005b81811015611e4057858101830151858201604001528201611e24565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114611e7657600080fd5b50565b60008060408385031215611e8c57600080fd5b8235611e9781611e61565b946020939093013593505050565b600060208284031215611eb757600080fd5b813561174081611e61565b600080600060608486031215611ed757600080fd5b8335611ee281611e61565b92506020840135611ef281611e61565b929592945050506040919091013590565b60008060408385031215611f1657600080fd5b8235611f2181611e61565b915060208301358015158114611f3657600080fd5b809150509250929050565b60008060408385031215611f5457600080fd5b8235611f5f81611e61565b91506020830135611f3681611e61565b600181811c90821680611f8357607f821691505b602082108103611fa357634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b8082018082111561086b5761086b612066565b808202811582820484141761086b5761086b612066565b6000826120c357634e487b7160e01b600052601260045260246000fd5b500490565b8181038181111561086b5761086b612066565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561210357600080fd5b815161174081611e61565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b8181101561215e5784516001600160a01b031683529383019391830191600101612139565b50506001600160a01b0396909616606085015250505060800152939250505056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220b4ab7e6cc0a2b5dd49001962cd945d129c657c56ed46c947f56a4db11aabd4d564736f6c634300081300334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572

Deployed Bytecode

0x6080604052600436106102605760003560e01c80638a8c523c11610144578063bbc0c742116100b6578063dd62ed3e1161007a578063dd62ed3e1461070a578063e2f4560514610750578063f11a24d314610766578063f2fde38b1461077c578063f63743421461079c578063f8b45b05146107b257600080fd5b8063bbc0c74214610685578063c0246668146106a4578063c876d0b9146106c4578063c8c8ebe4146106de578063d85ba063146106f457600080fd5b80639c3b4fdc116101085780639c3b4fdc146105d35780639fccce32146105e9578063a0d82dc5146105ff578063a457c2d714610615578063a9059cbb14610635578063b62496f51461065557600080fd5b80638a8c523c146105555780638da5cb5b1461056a578063921369131461058857806395d89b411461059e5780639a7a23d6146105b357600080fd5b806339509351116101dd5780636ddd1713116101a15780636ddd17131461049d57806370a08231146104bd578063715018a6146104f3578063751039fc1461050a5780637571336a1461051f5780637bce5a041461053f57600080fd5b806339509351146103e057806349bd5a5e146104005780634a62bb65146104345780634fbee1931461044e5780636a486a8e1461048757600080fd5b80631a8145bb116102245780631a8145bb146103625780631f3fed8f1461037857806323b872dd1461038e57806327c8f835146103ae578063313ce567146103c457600080fd5b806306fdde031461026c578063095ea7b31461029757806310d5de53146102c75780631694505e146102f757806318160ddd1461034357600080fd5b3661026757005b600080fd5b34801561027857600080fd5b506102816107c8565b60405161028e9190611e13565b60405180910390f35b3480156102a357600080fd5b506102b76102b2366004611e79565b61085a565b604051901515815260200161028e565b3480156102d357600080fd5b506102b76102e2366004611ea5565b601d6020526000908152604090205460ff1681565b34801561030357600080fd5b5061032b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6040516001600160a01b03909116815260200161028e565b34801561034f57600080fd5b506002545b60405190815260200161028e565b34801561036e57600080fd5b50610354601a5481565b34801561038457600080fd5b5061035460195481565b34801561039a57600080fd5b506102b76103a9366004611ec2565b610871565b3480156103ba57600080fd5b5061032b61dead81565b3480156103d057600080fd5b506040516012815260200161028e565b3480156103ec57600080fd5b506102b76103fb366004611e79565b6108da565b34801561040c57600080fd5b5061032b7f000000000000000000000000512a6abdd74b0b5fcf9fa9d589ece4de73cb137281565b34801561044057600080fd5b50600c546102b79060ff1681565b34801561045a57600080fd5b506102b7610469366004611ea5565b6001600160a01b03166000908152601c602052604090205460ff1690565b34801561049357600080fd5b5061035460155481565b3480156104a957600080fd5b50600c546102b79062010000900460ff1681565b3480156104c957600080fd5b506103546104d8366004611ea5565b6001600160a01b031660009081526020819052604090205490565b3480156104ff57600080fd5b50610508610910565b005b34801561051657600080fd5b506102b761098d565b34801561052b57600080fd5b5061050861053a366004611f03565b6109d6565b34801561054b57600080fd5b5061035460125481565b34801561056157600080fd5b50610508610a2b565b34801561057657600080fd5b506005546001600160a01b031661032b565b34801561059457600080fd5b5061035460165481565b3480156105aa57600080fd5b50610281610a68565b3480156105bf57600080fd5b506105086105ce366004611f03565b610a77565b3480156105df57600080fd5b5061035460145481565b3480156105f557600080fd5b50610354601b5481565b34801561060b57600080fd5b5061035460185481565b34801561062157600080fd5b506102b7610630366004611e79565b610b56565b34801561064157600080fd5b506102b7610650366004611e79565b610ba5565b34801561066157600080fd5b506102b7610670366004611ea5565b601e6020526000908152604090205460ff1681565b34801561069157600080fd5b50600c546102b790610100900460ff1681565b3480156106b057600080fd5b506105086106bf366004611f03565b610bb2565b3480156106d057600080fd5b50600f546102b79060ff1681565b3480156106ea57600080fd5b5061035460095481565b34801561070057600080fd5b5061035460115481565b34801561071657600080fd5b50610354610725366004611f41565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801561075c57600080fd5b50610354600a5481565b34801561077257600080fd5b5061035460135481565b34801561078857600080fd5b50610508610797366004611ea5565b610c3b565b3480156107a857600080fd5b5061035460175481565b3480156107be57600080fd5b50610354600b5481565b6060600380546107d790611f6f565b80601f016020809104026020016040519081016040528092919081815260200182805461080390611f6f565b80156108505780601f1061082557610100808354040283529160200191610850565b820191906000526020600020905b81548152906001019060200180831161083357829003601f168201915b5050505050905090565b6000610867338484610d26565b5060015b92915050565b600061087e848484610e4b565b6108d084336108cb856040518060600160405280602881526020016121a6602891396001600160a01b038a16600090815260016020908152604080832033845290915290205491906116a7565b610d26565b5060019392505050565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916108679185906108cb90866116e1565b6005546001600160a01b031633146109435760405162461bcd60e51b815260040161093a90611fa9565b60405180910390fd5b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546000906001600160a01b031633146109ba5760405162461bcd60e51b815260040161093a90611fa9565b50600c805460ff19908116909155600f80549091169055600190565b6005546001600160a01b03163314610a005760405162461bcd60e51b815260040161093a90611fa9565b6001600160a01b03919091166000908152601d60205260409020805460ff1916911515919091179055565b6005546001600160a01b03163314610a555760405162461bcd60e51b815260040161093a90611fa9565b600c805462ffff00191662010100179055565b6060600480546107d790611f6f565b6005546001600160a01b03163314610aa15760405162461bcd60e51b815260040161093a90611fa9565b7f000000000000000000000000512a6abdd74b0b5fcf9fa9d589ece4de73cb13726001600160a01b0316826001600160a01b031603610b485760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b6572506169727300000000000000606482015260840161093a565b610b528282611747565b5050565b600061086733846108cb856040518060600160405280602581526020016121ce602591393360009081526001602090815260408083206001600160a01b038d16845290915290205491906116a7565b6000610867338484610e4b565b6005546001600160a01b03163314610bdc5760405162461bcd60e51b815260040161093a90611fa9565b6001600160a01b0382166000818152601c6020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b03163314610c655760405162461bcd60e51b815260040161093a90611fa9565b6001600160a01b038116610cca5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161093a565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038316610d885760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161093a565b6001600160a01b038216610de95760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161093a565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038316610e715760405162461bcd60e51b815260040161093a90611fde565b6001600160a01b038216610e975760405162461bcd60e51b815260040161093a90612023565b80600003610eb057610eab8383600061179b565b505050565b600c5460ff161561136d576005546001600160a01b03848116911614801590610ee757506005546001600160a01b03838116911614155b8015610efb57506001600160a01b03821615155b8015610f1257506001600160a01b03821661dead14155b8015610f285750600554600160a01b900460ff16155b1561136d57600c54610100900460ff16610fc0576001600160a01b0383166000908152601c602052604090205460ff1680610f7b57506001600160a01b0382166000908152601c602052604090205460ff165b610fc05760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b604482015260640161093a565b600f5460ff1615611107576005546001600160a01b0383811691161480159061101b57507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b0316826001600160a01b031614155b801561105957507f000000000000000000000000512a6abdd74b0b5fcf9fa9d589ece4de73cb13726001600160a01b0316826001600160a01b031614155b1561110757326000908152600e602052604090205443116110f45760405162461bcd60e51b815260206004820152604960248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b6064820152681030b63637bbb2b21760b91b608482015260a40161093a565b326000908152600e602052604090204390555b6001600160a01b0383166000908152601e602052604090205460ff16801561114857506001600160a01b0382166000908152601d602052604090205460ff16155b1561122c576009548111156111bd5760405162461bcd60e51b815260206004820152603560248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201527436b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760591b606482015260840161093a565b600b546001600160a01b0383166000908152602081905260409020546111e3908361207c565b11156112275760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b604482015260640161093a565b61136d565b6001600160a01b0382166000908152601e602052604090205460ff16801561126d57506001600160a01b0383166000908152601d602052604090205460ff16155b156112e3576009548111156112275760405162461bcd60e51b815260206004820152603660248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152751036b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760511b606482015260840161093a565b6001600160a01b0382166000908152601d602052604090205460ff1661136d57600b546001600160a01b038316600090815260208190526040902054611329908361207c565b111561136d5760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b604482015260640161093a565b30600090815260208190526040902054600a54811080159081906113995750600c5462010000900460ff165b80156113af5750600554600160a01b900460ff16155b80156113d457506001600160a01b0385166000908152601e602052604090205460ff16155b80156113f957506001600160a01b0385166000908152601c602052604090205460ff16155b801561141e57506001600160a01b0384166000908152601c602052604090205460ff16155b1561144c576005805460ff60a01b1916600160a01b17905561143e6118a4565b6005805460ff60a01b191690555b6005546001600160a01b0386166000908152601c602052604090205460ff600160a01b90920482161591168061149a57506001600160a01b0385166000908152601c602052604090205460ff165b156114a3575060005b60008115611688576001600160a01b0386166000908152601e602052604090205460ff1680156114d557506000601554115b1561158d576064601554866114ea919061208f565b6114f491906120a6565b905060155460175482611507919061208f565b61151191906120a6565b601a6000828254611522919061207c565b9091555050601554601854611537908361208f565b61154191906120a6565b601b6000828254611552919061207c565b9091555050601554601654611567908361208f565b61157191906120a6565b60196000828254611582919061207c565b9091555061166a9050565b6001600160a01b0387166000908152601e602052604090205460ff1680156115b757506000601154115b1561166a576064601154866115cc919061208f565b6115d691906120a6565b9050601154601354826115e9919061208f565b6115f391906120a6565b601a6000828254611604919061207c565b9091555050601154601454611619908361208f565b61162391906120a6565b601b6000828254611634919061207c565b9091555050601154601254611649908361208f565b61165391906120a6565b60196000828254611664919061207c565b90915550505b801561167b5761167b87308361179b565b61168581866120c8565b94505b61169387878761179b565b61169e8787876119e2565b50505050505050565b600081848411156116cb5760405162461bcd60e51b815260040161093a9190611e13565b5060006116d884866120c8565b95945050505050565b6000806116ee838561207c565b9050838110156117405760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640161093a565b9392505050565b6001600160a01b0382166000818152601e6020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6001600160a01b0383166117c15760405162461bcd60e51b815260040161093a90611fde565b6001600160a01b0382166117e75760405162461bcd60e51b815260040161093a90612023565b61182481604051806060016040528060268152602001612180602691396001600160a01b03861660009081526020819052604090205491906116a7565b6001600160a01b03808516600090815260208190526040808220939093559084168152205461185390826116e1565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610e3e565b3060009081526020819052604081205490506000601b54601954601a546118cb919061207c565b6118d5919061207c565b9050600080479050600083601954836118ee919061208f565b6118f891906120a6565b9050600084601b548461190b919061208f565b61191591906120a6565b905061192086611bc8565b6000601a8190556019819055601b8190556007546040516001600160a01b039091169183919081818185875af1925050503d806000811461197d576040519150601f19603f3d011682016040523d82523d6000602084013e611982565b606091505b50506006546040519195506001600160a01b0316908390600081818185875af1925050503d80600081146119d2576040519150601f19603f3d011682016040523d82523d6000602084013e6119d7565b606091505b505050505050505050565b6001600160a01b0383166000908152601e602052604081205460ff168015611a0a5750600082115b6001600160a01b0384166000908152601e60205260408120549192509060ff168015611a365750600083115b6001600160a01b0385166000908152601e60205260408120549192509060ff16158015611a7c57506001600160a01b0385166000908152601e602052604090205460ff16155b8015611a885750600084115b905042611a9d6005546001600160a01b031690565b6001600160a01b0316876001600160a01b03161480611ac957506005546001600160a01b038781169116145b15611ad75750505050505050565b6001600160a01b0387166000908152601c602052604090205460ff1680611b1657506001600160a01b0386166000908152601c602052604090205460ff165b15611b8057306001600160a01b038716819003611b75576008546001600160a01b0316600090815260208190526040812054611b5b90670de0b6b3a7640000906120c8565b6008549091506119d7906001600160a01b0316838361179b565b60108290555061169e565b8315611bb057600880546001600160a01b0319166001600160a01b038916179055611bab8682611d88565b61169e565b8280611bb95750815b1561169e5761169e8782611dc6565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110611bfd57611bfd6120db565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c9f91906120f1565b81600181518110611cb257611cb26120db565b60200260200101906001600160a01b031690816001600160a01b031681525050611cfd307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84610d26565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063791ac94790611d5290859060009086903090429060040161210e565b600060405180830381600087803b158015611d6c57600080fd5b505af1158015611d80573d6000803e3d6000fd5b505050505050565b6001600160a01b0382166000908152600d6020526040902054151580610eab57506001600160a01b03919091166000908152600d6020526040902055565b6010546001600160a01b0383166000908152600d60205260408120549091611ded916120c8565b90508015610eab57506001600160a01b03919091166000908152600d6020526040902055565b600060208083528351808285015260005b81811015611e4057858101830151858201604001528201611e24565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114611e7657600080fd5b50565b60008060408385031215611e8c57600080fd5b8235611e9781611e61565b946020939093013593505050565b600060208284031215611eb757600080fd5b813561174081611e61565b600080600060608486031215611ed757600080fd5b8335611ee281611e61565b92506020840135611ef281611e61565b929592945050506040919091013590565b60008060408385031215611f1657600080fd5b8235611f2181611e61565b915060208301358015158114611f3657600080fd5b809150509250929050565b60008060408385031215611f5457600080fd5b8235611f5f81611e61565b91506020830135611f3681611e61565b600181811c90821680611f8357607f821691505b602082108103611fa357634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b8082018082111561086b5761086b612066565b808202811582820484141761086b5761086b612066565b6000826120c357634e487b7160e01b600052601260045260246000fd5b500490565b8181038181111561086b5761086b612066565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561210357600080fd5b815161174081611e61565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b8181101561215e5784516001600160a01b031683529383019391830191600101612139565b50506001600160a01b0396909616606085015250505060800152939250505056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220b4ab7e6cc0a2b5dd49001962cd945d129c657c56ed46c947f56a4db11aabd4d564736f6c63430008130033

Deployed Bytecode Sourcemap

29788:12808:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7944:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10111:169;;;;;;;;;;-1:-1:-1;10111:169:0;;;;;:::i;:::-;;:::i;:::-;;;1188:14:1;;1181:22;1163:41;;1151:2;1136:18;10111:169:0;1023:187:1;31246:64:0;;;;;;;;;;-1:-1:-1;31246:64:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;29830:51;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1658:32:1;;;1640:51;;1628:2;1613:18;29830:51:0;1467:230:1;9064:108:0;;;;;;;;;;-1:-1:-1;9152:12:0;;9064:108;;;1848:25:1;;;1836:2;1821:18;9064:108:0;1702:177:1;31025:33:0;;;;;;;;;;;;;;;;30985;;;;;;;;;;;;;;;;10762:355;;;;;;;;;;-1:-1:-1;10762:355:0;;;;;:::i;:::-;;:::i;29933:53::-;;;;;;;;;;;;29979:6;29933:53;;8906:93;;;;;;;;;;-1:-1:-1;8906:93:0;;8989:2;2695:36:1;;2683:2;2668:18;8906:93:0;2553:184:1;11526:218:0;;;;;;;;;;-1:-1:-1;11526:218:0;;;;;:::i;:::-;;:::i;29888:38::-;;;;;;;;;;;;;;;30248:33;;;;;;;;;;-1:-1:-1;30248:33:0;;;;;;;;35821:125;;;;;;;;;;-1:-1:-1;35821:125:0;;;;;:::i;:::-;-1:-1:-1;;;;;35910:28:0;35886:4;35910:28;;;:19;:28;;;;;;;;;35821:125;30836:28;;;;;;;;;;;;;;;;30328:31;;;;;;;;;;-1:-1:-1;30328:31:0;;;;;;;;;;;9235:127;;;;;;;;;;-1:-1:-1;9235:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;9336:18:0;9309:7;9336:18;;;;;;;;;;;;9235:127;22409:148;;;;;;;;;;;;;:::i;:::-;;34496:159;;;;;;;;;;;;;:::i;34838:144::-;;;;;;;;;;-1:-1:-1;34838:144:0;;;;;:::i;:::-;;:::i;30725:30::-;;;;;;;;;;;;;;;;34328:112;;;;;;;;;;;;;:::i;21767:79::-;;;;;;;;;;-1:-1:-1;21832:6:0;;-1:-1:-1;;;;;21832:6:0;21767:79;;30871:31;;;;;;;;;;;;;;;;8163:104;;;;;;;;;;;;;:::i;35180:244::-;;;;;;;;;;-1:-1:-1;35180:244:0;;;;;:::i;:::-;;:::i;30799:24::-;;;;;;;;;;;;;;;;31065:27;;;;;;;;;;;;;;;;30947:25;;;;;;;;;;;;;;;;12247:269;;;;;;;;;;-1:-1:-1;12247:269:0;;;;;:::i;:::-;;:::i;9575:175::-;;;;;;;;;;-1:-1:-1;9575:175:0;;;;;:::i;:::-;;:::i;31468:58::-;;;;;;;;;;-1:-1:-1;31468:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;30288:33;;;;;;;;;;-1:-1:-1;30288:33:0;;;;;;;;;;;34990:182;;;;;;;;;;-1:-1:-1;34990:182:0;;;;;:::i;:::-;;:::i;30606:40::-;;;;;;;;;;-1:-1:-1;30606:40:0;;;;;;;;30133:35;;;;;;;;;;;;;;;;30691:27;;;;;;;;;;;;;;;;9813:151;;;;;;;;;;-1:-1:-1;9813:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;9929:18:0;;;9902:7;9929:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;9813:151;30175:33;;;;;;;;;;;;;;;;30762:30;;;;;;;;;;;;;;;;22712:244;;;;;;;;;;-1:-1:-1;22712:244:0;;;;;:::i;:::-;;:::i;30909:31::-;;;;;;;;;;;;;;;;30215:24;;;;;;;;;;;;;;;;7944:100;7998:13;8031:5;8024:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7944:100;:::o;10111:169::-;10194:4;10211:39;660:10;10234:7;10243:6;10211:8;:39::i;:::-;-1:-1:-1;10268:4:0;10111:169;;;;;:::o;10762:355::-;10902:4;10919:36;10929:6;10937:9;10948:6;10919:9;:36::i;:::-;10966:121;10975:6;660:10;10997:89;11035:6;10997:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10997:19:0;;;;;;:11;:19;;;;;;;;660:10;10997:33;;;;;;;;;;:37;:89::i;:::-;10966:8;:121::i;:::-;-1:-1:-1;11105:4:0;10762:355;;;;;:::o;11526:218::-;660:10;11614:4;11663:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;11663:34:0;;;;;;;;;;11614:4;;11631:83;;11654:7;;11663:50;;11702:10;11663:38;:50::i;22409:148::-;21979:6;;-1:-1:-1;;;;;21979:6:0;660:10;21979:22;21971:67;;;;-1:-1:-1;;;21971:67:0;;;;;;;:::i;:::-;;;;;;;;;22500:6:::1;::::0;22479:40:::1;::::0;22516:1:::1;::::0;-1:-1:-1;;;;;22500:6:0::1;::::0;22479:40:::1;::::0;22516:1;;22479:40:::1;22530:6;:19:::0;;-1:-1:-1;;;;;;22530:19:0::1;::::0;;22409:148::o;34496:159::-;21979:6;;34548:4;;-1:-1:-1;;;;;21979:6:0;660:10;21979:22;21971:67;;;;-1:-1:-1;;;21971:67:0;;;;;;;:::i;:::-;-1:-1:-1;34564:14:0::1;:22:::0;;-1:-1:-1;;34564:22:0;;::::1;::::0;;;34597:20:::1;:28:::0;;;;::::1;::::0;;34564:22;34496:159;:::o;34838:144::-;21979:6;;-1:-1:-1;;;;;21979:6:0;660:10;21979:22;21971:67;;;;-1:-1:-1;;;21971:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34928:39:0;;;::::1;;::::0;;;:31:::1;:39;::::0;;;;:46;;-1:-1:-1;;34928:46:0::1;::::0;::::1;;::::0;;;::::1;::::0;;34838:144::o;34328:112::-;21979:6;;-1:-1:-1;;;;;21979:6:0;660:10;21979:22;21971:67;;;;-1:-1:-1;;;21971:67:0;;;;;;;:::i;:::-;34383:13:::1;:20:::0;;-1:-1:-1;;34414:18:0;;;;;34328:112::o;8163:104::-;8219:13;8252:7;8245:14;;;;;:::i;35180:244::-;21979:6;;-1:-1:-1;;;;;21979:6:0;660:10;21979:22;21971:67;;;;-1:-1:-1;;;21971:67:0;;;;;;;:::i;:::-;35287:13:::1;-1:-1:-1::0;;;;;35279:21:0::1;:4;-1:-1:-1::0;;;;;35279:21:0::1;::::0;35271:91:::1;;;::::0;-1:-1:-1;;;35271:91:0;;4504:2:1;35271:91:0::1;::::0;::::1;4486:21:1::0;4543:2;4523:18;;;4516:30;4582:34;4562:18;;;4555:62;4653:27;4633:18;;;4626:55;4698:19;;35271:91:0::1;4302:421:1::0;35271:91:0::1;35375:41;35404:4;35410:5;35375:28;:41::i;:::-;35180:244:::0;;:::o;12247:269::-;12340:4;12357:129;660:10;12380:7;12389:96;12428:15;12389:96;;;;;;;;;;;;;;;;;660:10;12389:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;12389:34:0;;;;;;;;;;;;:38;:96::i;9575:175::-;9661:4;9678:42;660:10;9702:9;9713:6;9678:9;:42::i;34990:182::-;21979:6;;-1:-1:-1;;;;;21979:6:0;660:10;21979:22;21971:67;;;;-1:-1:-1;;;21971:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;35075:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;35075:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;35130:34;;1163:41:1;;;35130:34:0::1;::::0;1136:18:1;35130:34:0::1;;;;;;;34990:182:::0;;:::o;22712:244::-;21979:6;;-1:-1:-1;;;;;21979:6:0;660:10;21979:22;21971:67;;;;-1:-1:-1;;;21971:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22801:22:0;::::1;22793:73;;;::::0;-1:-1:-1;;;22793:73:0;;4930:2:1;22793:73:0::1;::::0;::::1;4912:21:1::0;4969:2;4949:18;;;4942:30;5008:34;4988:18;;;4981:62;-1:-1:-1;;;5059:18:1;;;5052:36;5105:19;;22793:73:0::1;4728:402:1::0;22793:73:0::1;22903:6;::::0;22882:38:::1;::::0;-1:-1:-1;;;;;22882:38:0;;::::1;::::0;22903:6:::1;::::0;22882:38:::1;::::0;22903:6:::1;::::0;22882:38:::1;22931:6;:17:::0;;-1:-1:-1;;;;;;22931:17:0::1;-1:-1:-1::0;;;;;22931:17:0;;;::::1;::::0;;;::::1;::::0;;22712:244::o;15433:380::-;-1:-1:-1;;;;;15569:19:0;;15561:68;;;;-1:-1:-1;;;15561:68:0;;5337:2:1;15561:68:0;;;5319:21:1;5376:2;5356:18;;;5349:30;5415:34;5395:18;;;5388:62;-1:-1:-1;;;5466:18:1;;;5459:34;5510:19;;15561:68:0;5135:400:1;15561:68:0;-1:-1:-1;;;;;15648:21:0;;15640:68;;;;-1:-1:-1;;;15640:68:0;;5742:2:1;15640:68:0;;;5724:21:1;5781:2;5761:18;;;5754:30;5820:34;5800:18;;;5793:62;-1:-1:-1;;;5871:18:1;;;5864:32;5913:19;;15640:68:0;5540:398:1;15640:68:0;-1:-1:-1;;;;;15721:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;15773:32;;1848:25:1;;;15773:32:0;;1821:18:1;15773:32:0;;;;;;;;15433:380;;;:::o;35954:4149::-;-1:-1:-1;;;;;36086:18:0;;36078:68;;;;-1:-1:-1;;;36078:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36165:16:0;;36157:64;;;;-1:-1:-1;;;36157:64:0;;;;;;;:::i;:::-;36246:6;36256:1;36246:11;36243:92;;36274:28;36290:4;36296:2;36300:1;36274:15;:28::i;:::-;35954:4149;;;:::o;36243:92::-;36358:14;;;;36355:1841;;;21832:6;;-1:-1:-1;;;;;36410:15:0;;;21832:6;;36410:15;;;;:49;;-1:-1:-1;21832:6:0;;-1:-1:-1;;;;;36446:13:0;;;21832:6;;36446:13;;36410:49;:86;;;;-1:-1:-1;;;;;;36480:16:0;;;;36410:86;:128;;;;-1:-1:-1;;;;;;36517:21:0;;36531:6;36517:21;;36410:128;:158;;;;-1:-1:-1;36560:8:0;;-1:-1:-1;;;36560:8:0;;;;36559:9;36410:158;36388:1797;;;36606:13;;;;;;;36602:148;;-1:-1:-1;;;;;36651:25:0;;;;;;:19;:25;;;;;;;;;:52;;-1:-1:-1;;;;;;36680:23:0;;;;;;:19;:23;;;;;;;;36651:52;36643:87;;;;-1:-1:-1;;;36643:87:0;;6955:2:1;36643:87:0;;;6937:21:1;6994:2;6974:18;;;6967:30;-1:-1:-1;;;7013:18:1;;;7006:52;7075:18;;36643:87:0;6753:346:1;36643:87:0;36908:20;;;;36904:423;;;21832:6;;-1:-1:-1;;;;;36956:13:0;;;21832:6;;36956:13;;;;:47;;;36987:15;-1:-1:-1;;;;;36973:30:0;:2;-1:-1:-1;;;;;36973:30:0;;;36956:47;:79;;;;;37021:13;-1:-1:-1;;;;;37007:28:0;:2;-1:-1:-1;;;;;37007:28:0;;;36956:79;36952:356;;;37100:9;37071:39;;;;:28;:39;;;;;;37113:12;-1:-1:-1;37063:140:0;;;;-1:-1:-1;;;37063:140:0;;7306:2:1;37063:140:0;;;7288:21:1;7345:2;7325:18;;;7318:30;7384:34;7364:18;;;7357:62;7455:34;7435:18;;;7428:62;-1:-1:-1;;;7506:19:1;;;7499:40;7556:19;;37063:140:0;7104:477:1;37063:140:0;37259:9;37230:39;;;;:28;:39;;;;;37272:12;37230:54;;36952:356;-1:-1:-1;;;;;37396:31:0;;;;;;:25;:31;;;;;;;;:71;;;;-1:-1:-1;;;;;;37432:35:0;;;;;;:31;:35;;;;;;;;37431:36;37396:71;37392:778;;;37514:20;;37504:6;:30;;37496:96;;;;-1:-1:-1;;;37496:96:0;;7788:2:1;37496:96:0;;;7770:21:1;7827:2;7807:18;;;7800:30;7866:34;7846:18;;;7839:62;-1:-1:-1;;;7917:18:1;;;7910:51;7978:19;;37496:96:0;7586:417:1;37496:96:0;37653:9;;-1:-1:-1;;;;;9336:18:0;;9309:7;9336:18;;;;;;;;;;;37627:22;;:6;:22;:::i;:::-;:35;;37619:67;;;;-1:-1:-1;;;37619:67:0;;8472:2:1;37619:67:0;;;8454:21:1;8511:2;8491:18;;;8484:30;-1:-1:-1;;;8530:18:1;;;8523:49;8589:18;;37619:67:0;8270:343:1;37619:67:0;37392:778;;;-1:-1:-1;;;;;37780:29:0;;;;;;:25;:29;;;;;;;;:71;;;;-1:-1:-1;;;;;;37814:37:0;;;;;;:31;:37;;;;;;;;37813:38;37780:71;37776:394;;;37898:20;;37888:6;:30;;37880:97;;;;-1:-1:-1;;;37880:97:0;;8820:2:1;37880:97:0;;;8802:21:1;8859:2;8839:18;;;8832:30;8898:34;8878:18;;;8871:62;-1:-1:-1;;;8949:18:1;;;8942:52;9011:19;;37880:97:0;8618:418:1;37776:394:0;-1:-1:-1;;;;;38024:35:0;;;;;;:31;:35;;;;;;;;38020:150;;38117:9;;-1:-1:-1;;;;;9336:18:0;;9309:7;9336:18;;;;;;;;;;;38091:22;;:6;:22;:::i;:::-;:35;;38083:67;;;;-1:-1:-1;;;38083:67:0;;8472:2:1;38083:67:0;;;8454:21:1;8511:2;8491:18;;;8484:30;-1:-1:-1;;;8530:18:1;;;8523:49;8589:18;;38083:67:0;8270:343:1;38083:67:0;38259:4;38210:28;9336:18;;;;;;;;;;;38325;;38301:42;;;;;;;38374:35;;-1:-1:-1;38398:11:0;;;;;;;38374:35;:61;;;;-1:-1:-1;38427:8:0;;-1:-1:-1;;;38427:8:0;;;;38426:9;38374:61;:110;;;;-1:-1:-1;;;;;;38453:31:0;;;;;;:25;:31;;;;;;;;38452:32;38374:110;:153;;;;-1:-1:-1;;;;;;38502:25:0;;;;;;:19;:25;;;;;;;;38501:26;38374:153;:194;;;;-1:-1:-1;;;;;;38545:23:0;;;;;;:19;:23;;;;;;;;38544:24;38374:194;38356:338;;;38595:8;:15;;-1:-1:-1;;;;38595:15:0;-1:-1:-1;;;38595:15:0;;;38639:10;:8;:10::i;:::-;38666:8;:16;;-1:-1:-1;;;;38666:16:0;;;38356:338;38722:8;;-1:-1:-1;;;;;38831:25:0;;38706:12;38831:25;;;:19;:25;;;;;;38722:8;-1:-1:-1;;;38722:8:0;;;;;38721:9;;38831:25;;:52;;-1:-1:-1;;;;;;38860:23:0;;;;;;:19;:23;;;;;;;;38831:52;38828:99;;;-1:-1:-1;38910:5:0;38828:99;38947:12;39051:7;39048:951;;;-1:-1:-1;;;;;39102:29:0;;;;;;:25;:29;;;;;;;;:50;;;;;39151:1;39135:13;;:17;39102:50;39098:732;;;39202:3;39188:13;;39179:6;:22;;;;:::i;:::-;:26;;;;:::i;:::-;39172:33;;39272:13;;39253:16;;39246:4;:23;;;;:::i;:::-;:39;;;;:::i;:::-;39224:18;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;;39340:13:0;;39327:10;;39320:17;;:4;:17;:::i;:::-;:33;;;;:::i;:::-;39304:12;;:49;;;;;;;:::i;:::-;;;;-1:-1:-1;;39420:13:0;;39401:16;;39394:23;;:4;:23;:::i;:::-;:39;;;;:::i;:::-;39372:18;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;39098:732:0;;-1:-1:-1;39098:732:0;;-1:-1:-1;;;;;39494:31:0;;;;;;:25;:31;;;;;;;;:51;;;;;39544:1;39529:12;;:16;39494:51;39491:339;;;39592:3;39579:12;;39570:6;:21;;;;:::i;:::-;:25;;;;:::i;:::-;39563:32;;39658:12;;39640:15;;39633:4;:22;;;;:::i;:::-;:37;;;;:::i;:::-;39611:18;;:59;;;;;;;:::i;:::-;;;;-1:-1:-1;;39724:12:0;;39712:9;;39705:16;;:4;:16;:::i;:::-;:31;;;;:::i;:::-;39689:12;;:47;;;;;;;:::i;:::-;;;;-1:-1:-1;;39802:12:0;;39784:15;;39777:22;;:4;:22;:::i;:::-;:37;;;;:::i;:::-;39755:18;;:59;;;;;;;:::i;:::-;;;;-1:-1:-1;;39491:339:0;39861:8;;39858:93;;39893:42;39909:4;39923;39930;39893:15;:42::i;:::-;39973:14;39983:4;39973:14;;:::i;:::-;;;39048:951;40011:33;40027:4;40033:2;40037:6;40011:15;:33::i;:::-;40057:38;40078:4;40084:2;40088:6;40057:20;:38::i;:::-;36067:4036;;;;35954:4149;;;:::o;17714:192::-;17800:7;17836:12;17828:6;;;;17820:29;;;;-1:-1:-1;;;17820:29:0;;;;;;;;:::i;:::-;-1:-1:-1;17860:9:0;17872:5;17876:1;17872;:5;:::i;:::-;17860:17;17714:192;-1:-1:-1;;;;;17714:192:0:o;16811:181::-;16869:7;;16901:5;16905:1;16901;:5;:::i;:::-;16889:17;;16930:1;16925;:6;;16917:46;;;;-1:-1:-1;;;16917:46:0;;9771:2:1;16917:46:0;;;9753:21:1;9810:2;9790:18;;;9783:30;9849:29;9829:18;;;9822:57;9896:18;;16917:46:0;9569:351:1;16917:46:0;16983:1;16811:181;-1:-1:-1;;;16811:181:0:o;35432:188::-;-1:-1:-1;;;;;35515:31:0;;;;;;:25;:31;;;;;;:39;;-1:-1:-1;;35515:39:0;;;;;;;;;;35572:40;;35515:39;;:31;35572:40;;;35432:188;;:::o;13006:573::-;-1:-1:-1;;;;;13146:20:0;;13138:70;;;;-1:-1:-1;;;13138:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;13227:23:0;;13219:71;;;;-1:-1:-1;;;13219:71:0;;;;;;;:::i;:::-;13383;13405:6;13383:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;13383:17:0;;:9;:17;;;;;;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;13363:17:0;;;:9;:17;;;;;;;;;;;:91;;;;13488:20;;;;;;;:32;;13513:6;13488:24;:32::i;:::-;-1:-1:-1;;;;;13465:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;13536:35;1848:25:1;;;13465:20:0;;13536:35;;;;;;1821:18:1;13536:35:0;1702:177:1;41851:742:0;41934:4;41890:23;9336:18;;;;;;;;;;;41890:50;;41951:25;42021:12;;42000:18;;41979;;:39;;;;:::i;:::-;:54;;;;:::i;:::-;41951:82;;42044:12;42069:18;42090:21;42069:42;;42124:23;42184:17;42163:18;;42150:10;:31;;;;:::i;:::-;:51;;;;:::i;:::-;42124:77;;42212:17;42258;42245:12;;42232:10;:25;;;;:::i;:::-;:43;;;;:::i;:::-;42212:63;;42288:33;42305:15;42288:16;:33::i;:::-;42364:1;42343:18;:22;;;42376:18;:22;;;42409:12;:16;;;42467:9;;42459:45;;-1:-1:-1;;;;;42467:9:0;;;;42490;;42459:45;;42364:1;42459:45;42490:9;42467;42459:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;42536:15:0;;42528:57;;42446:58;;-1:-1:-1;;;;;;42536:15:0;;42565;;42528:57;;;;42565:15;42536;42528:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;41851:742:0:o;40708:1135::-;-1:-1:-1;;;;;40822:31:0;;40800:19;40822:31;;;:25;:31;;;;;;;;:45;;;;;40866:1;40857:6;:10;40822:45;-1:-1:-1;;;;;40898:29:0;;40878:17;40898:29;;;:25;:29;;;;;;40800:67;;-1:-1:-1;40878:17:0;40898:29;;:43;;;;;40940:1;40931:6;:10;40898:43;-1:-1:-1;;;;;40979:29:0;;40952:23;40979:29;;;:25;:29;;;;;;40878:63;;-1:-1:-1;40952:23:0;40979:29;;40978:30;:64;;;;-1:-1:-1;;;;;;41013:29:0;;;;;;:25;:29;;;;;;;;41012:30;40978:64;:78;;;;;41055:1;41046:6;:10;40978:78;40952:104;-1:-1:-1;41101:15:0;41140:7;21832:6;;-1:-1:-1;;;;;21832:6:0;;21767:79;41140:7;-1:-1:-1;;;;;41132:15:0;:4;-1:-1:-1;;;;;41132:15:0;;:32;;;-1:-1:-1;21832:6:0;;-1:-1:-1;;;;;41151:13:0;;;21832:6;;41151:13;41132:32;41129:707;;;41181:7;;;;40708:1135;;;:::o;41129:707::-;-1:-1:-1;;;;;41207:25:0;;;;;;:19;:25;;;;;;;;;:52;;-1:-1:-1;;;;;;41236:23:0;;;;;;:19;:23;;;;;;;;41207:52;41204:632;;;41307:4;-1:-1:-1;;;;;41330:18:0;;;;;41327:248;;41393:9;;-1:-1:-1;;;;;41393:9:0;41368:12;9336:18;;;;;;;;;;;41383:27;;41406:4;;41383:27;:::i;:::-;41445:9;;41368:42;;-1:-1:-1;41429:49:0;;-1:-1:-1;;;;;41445:9:0;41456:12;41368:42;41429:15;:49::i;41327:248::-;41543:13;:29;;;41261:325;41204:632;;;41609:14;41606:219;;;41644:9;:16;;-1:-1:-1;;;;;;41644:16:0;-1:-1:-1;;;;;41644:16:0;;;;;41662:34;41678:2;41682:13;41662:15;:34::i;:::-;41606:219;;;41720:12;:34;;;;41736:18;41720:34;41717:108;;;41775:34;41789:4;41795:13;41775;:34::i;40111:589::-;40261:16;;;40275:1;40261:16;;;;;;;;40237:21;;40261:16;;;;;;;;;;-1:-1:-1;40261:16:0;40237:40;;40306:4;40288;40293:1;40288:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;40288:23:0;;;-1:-1:-1;;;;;40288:23:0;;;;;40332:15;-1:-1:-1;;;;;40332:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40322:4;40327:1;40322:7;;;;;;;;:::i;:::-;;;;;;:32;-1:-1:-1;;;;;40322:32:0;;;-1:-1:-1;;;;;40322:32:0;;;;;40367:62;40384:4;40399:15;40417:11;40367:8;:62::i;:::-;40468:224;;-1:-1:-1;;;40468:224:0;;-1:-1:-1;;;;;40468:15:0;:66;;;;:224;;40549:11;;40575:1;;40619:4;;40646;;40666:15;;40468:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40166:534;40111:589;:::o;34667:159::-;-1:-1:-1;;;;;34755:13:0;;34740:12;34755:13;;;:9;:13;;;;;;:17;;;34783:35;;-1:-1:-1;;;;;;34796:13:0;;;;;;;;:9;:13;;;;;:22;34667:159::o;35628:185::-;35739:13;;-1:-1:-1;;;;;35721:15:0;;35701:17;35721:15;;;:9;:15;;;;;;35701:17;;35721:31;;;:::i;:::-;35701:51;-1:-1:-1;35766:13:0;;35763:42;;-1:-1:-1;;;;;;35781:15:0;;;;;;;;:9;:15;;;;;:24;35628:185::o;14:548:1:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;298:3;483:1;478:2;469:6;458:9;454:22;450:31;443:42;553:2;546;542:7;537:2;529:6;525:15;521:29;510:9;506:45;502:54;494:62;;;;14:548;;;;:::o;567:131::-;-1:-1:-1;;;;;642:31:1;;632:42;;622:70;;688:1;685;678:12;622:70;567:131;:::o;703:315::-;771:6;779;832:2;820:9;811:7;807:23;803:32;800:52;;;848:1;845;838:12;800:52;887:9;874:23;906:31;931:5;906:31;:::i;:::-;956:5;1008:2;993:18;;;;980:32;;-1:-1:-1;;;703:315:1:o;1215:247::-;1274:6;1327:2;1315:9;1306:7;1302:23;1298:32;1295:52;;;1343:1;1340;1333:12;1295:52;1382:9;1369:23;1401:31;1426:5;1401:31;:::i;1884:456::-;1961:6;1969;1977;2030:2;2018:9;2009:7;2005:23;2001:32;1998:52;;;2046:1;2043;2036:12;1998:52;2085:9;2072:23;2104:31;2129:5;2104:31;:::i;:::-;2154:5;-1:-1:-1;2211:2:1;2196:18;;2183:32;2224:33;2183:32;2224:33;:::i;:::-;1884:456;;2276:7;;-1:-1:-1;;;2330:2:1;2315:18;;;;2302:32;;1884:456::o;2742:416::-;2807:6;2815;2868:2;2856:9;2847:7;2843:23;2839:32;2836:52;;;2884:1;2881;2874:12;2836:52;2923:9;2910:23;2942:31;2967:5;2942:31;:::i;:::-;2992:5;-1:-1:-1;3049:2:1;3034:18;;3021:32;3091:15;;3084:23;3072:36;;3062:64;;3122:1;3119;3112:12;3062:64;3145:7;3135:17;;;2742:416;;;;;:::o;3163:388::-;3231:6;3239;3292:2;3280:9;3271:7;3267:23;3263:32;3260:52;;;3308:1;3305;3298:12;3260:52;3347:9;3334:23;3366:31;3391:5;3366:31;:::i;:::-;3416:5;-1:-1:-1;3473:2:1;3458:18;;3445:32;3486:33;3445:32;3486:33;:::i;3556:380::-;3635:1;3631:12;;;;3678;;;3699:61;;3753:4;3745:6;3741:17;3731:27;;3699:61;3806:2;3798:6;3795:14;3775:18;3772:38;3769:161;;3852:10;3847:3;3843:20;3840:1;3833:31;3887:4;3884:1;3877:15;3915:4;3912:1;3905:15;3769:161;;3556:380;;;:::o;3941:356::-;4143:2;4125:21;;;4162:18;;;4155:30;4221:34;4216:2;4201:18;;4194:62;4288:2;4273:18;;3941:356::o;5943:401::-;6145:2;6127:21;;;6184:2;6164:18;;;6157:30;6223:34;6218:2;6203:18;;6196:62;-1:-1:-1;;;6289:2:1;6274:18;;6267:35;6334:3;6319:19;;5943:401::o;6349:399::-;6551:2;6533:21;;;6590:2;6570:18;;;6563:30;6629:34;6624:2;6609:18;;6602:62;-1:-1:-1;;;6695:2:1;6680:18;;6673:33;6738:3;6723:19;;6349:399::o;8008:127::-;8069:10;8064:3;8060:20;8057:1;8050:31;8100:4;8097:1;8090:15;8124:4;8121:1;8114:15;8140:125;8205:9;;;8226:10;;;8223:36;;;8239:18;;:::i;9041:168::-;9114:9;;;9145;;9162:15;;;9156:22;;9142:37;9132:71;;9183:18;;:::i;9214:217::-;9254:1;9280;9270:132;;9324:10;9319:3;9315:20;9312:1;9305:31;9359:4;9356:1;9349:15;9387:4;9384:1;9377:15;9270:132;-1:-1:-1;9416:9:1;;9214:217::o;9436:128::-;9503:9;;;9524:11;;;9521:37;;;9538:18;;:::i;10267:127::-;10328:10;10323:3;10319:20;10316:1;10309:31;10359:4;10356:1;10349:15;10383:4;10380:1;10373:15;10399:251;10469:6;10522:2;10510:9;10501:7;10497:23;10493:32;10490:52;;;10538:1;10535;10528:12;10490:52;10570:9;10564:16;10589:31;10614:5;10589:31;:::i;10655:980::-;10917:4;10965:3;10954:9;10950:19;10996:6;10985:9;10978:25;11022:2;11060:6;11055:2;11044:9;11040:18;11033:34;11103:3;11098:2;11087:9;11083:18;11076:31;11127:6;11162;11156:13;11193:6;11185;11178:22;11231:3;11220:9;11216:19;11209:26;;11270:2;11262:6;11258:15;11244:29;;11291:1;11301:195;11315:6;11312:1;11309:13;11301:195;;;11380:13;;-1:-1:-1;;;;;11376:39:1;11364:52;;11471:15;;;;11436:12;;;;11412:1;11330:9;11301:195;;;-1:-1:-1;;;;;;;11552:32:1;;;;11547:2;11532:18;;11525:60;-1:-1:-1;;;11616:3:1;11601:19;11594:35;11513:3;10655:980;-1:-1:-1;;;10655:980:1:o

Swarm Source

ipfs://b4ab7e6cc0a2b5dd49001962cd945d129c657c56ed46c947f56a4db11aabd4d5
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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