ETH Price: $3,319.88 (+1.85%)
Gas: 2 Gwei

Token

BITZOMBIES (ZOMBIT)
 

Overview

Max Total Supply

31,000,000,000,000 ZOMBIT

Holders

21

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
297,904,637,776.503913288362311752 ZOMBIT

Value
$0.00
0xd55fED6066871F1C174f0c43ce0E85987C990EB1
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:
Zombit

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-10-31
*/

/*

    Halloween movement for people that love crypto, bitcoin and zombies.

    [ Telegram ]        https://t.me/+dFOisNIph8MyOGU0
    [ X ]               https://twitter.com/bitzombies2023

*/


// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

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

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

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

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

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

    /**
     * @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 a - b;
    }

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

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

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

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

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * 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) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

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

// File: @openzeppelin/contracts/utils/Context.sol


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

// File: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract 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() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        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 {
        _transferOwnership(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");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

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

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

// File: @openzeppelin/contracts/token/ERC20/ERC20.sol


// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;




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

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

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

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

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, 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}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, 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}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

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

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

        return true;
    }

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

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
            // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
            // decrementing then incrementing.
            _balances[to] += amount;
        }

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

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

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

        _totalSupply += amount;
        unchecked {
            // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
            _balances[account] += amount;
        }
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

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

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

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
            // Overflow not possible: amount <= accountBalance <= totalSupply.
            _totalSupply -= amount;
        }

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

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

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

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

pragma solidity 0.8.10;


interface IUniswapV2Pair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

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

    function initialize(address, address) external;
}


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

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);

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

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

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


library 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 Zombit is ERC20, Ownable  {
    using SafeMath for uint256;

    IUniswapV2Router02 public immutable uniswapV2Router;
    address public immutable uniswapV2Pair;
    address public constant deadAddress = address(0xdead);

    bool private swapping;

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

    bool public limitsInEffect = true;
    bool public tradingActive = false; // go live after adding LP
    bool public swapEnabled = false;
    
     // Anti-bot and anti-whale mappings and variables
    mapping(address => uint256) private _holderLastTransferTimestamp; // to hold last Transfers temporarily during launch
    bool public transferDelayEnabled = true;

    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 sellBotFees;
    
    uint256 public tokensForMarketing;
    uint256 public tokensForLiquidity;
    uint256 public tokensForDev;

    bool public whitelistEnabled = false;
    
    /******************/

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

    mapping(address => bool) public whitelist;
    mapping(address => bool) public bots;

    uint256 public botCount;
    uint256 public maxBotCount;

    // 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 UpdateUniswapV2Router(address indexed newAddress, address indexed oldAddress);

    event ExcludeFromFees(address indexed account, bool isExcluded);

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

    event marketingWalletUpdated(address indexed newWallet, address indexed oldWallet);
    
    event devWalletUpdated(address indexed newWallet, address indexed oldWallet);

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

    constructor() ERC20("BITZOMBIES", "ZOMBIT") {
        
        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 = 1;
        uint256 _buyLiquidityFee = 0;
        uint256 _buyDevFee = 1;

        uint256 _sellMarketingFee = 0;
        uint256 _sellLiquidityFee = 1;
        uint256 _sellDevFee = 1;

        uint256 _sellBotFee = 2;
        
        uint256 totalSupply = 31_000_000_000_000 * 1e18;
        
        //  Maximum tx size and wallet size
        maxTransactionAmount = totalSupply * 1 / 100;
        maxWallet = totalSupply * 1 / 100;

        swapTokensAtAmount = totalSupply * 1 / 10000;

        buyMarketingFee = _buyMarketingFee;
        buyLiquidityFee = _buyLiquidityFee;
        buyDevFee = _buyDevFee;
        buyTotalFees = buyMarketingFee + buyLiquidityFee + buyDevFee;

        maxBotCount = 20;
        
        sellMarketingFee = _sellMarketingFee;
        sellLiquidityFee = _sellLiquidityFee;
        sellDevFee = _sellDevFee;
        sellTotalFees = sellMarketingFee + sellLiquidityFee + sellDevFee;
        sellBotFees = sellTotalFees + _sellBotFee;
        
        marketingWallet = address(owner()); // set as marketing wallet
        devWallet = address(owner()); // set as dev wallet

        // exclude from paying fees or having max transaction amount
        excludeFromFees(owner(), true);
        excludeFromFees(address(this), true);
        excludeFromFees(address(0xdead), true);
        
        excludeFromMaxTransaction(owner(), true);
        excludeFromMaxTransaction(address(this), 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 {

    }

    function setWhitelist(address[] calldata _addresses, bool _isWhitelisting) external onlyOwner {
        for (uint i=0; i<_addresses.length; i++) {
            whitelist[_addresses[i]] = _isWhitelisting;
            excludeFromFees(_addresses[i], true);
        }
    }

    function updateWhitelistEnabled(bool _isWhitelisting) external onlyOwner {
        whitelistEnabled = _isWhitelisting;
    }

    // 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;
        return true;
    }
    
    // disable Transfer delay - cannot be reenabled
    function disableTransferDelay() external onlyOwner returns (bool){
        transferDelayEnabled = false;
        return true;
    }
    
     // change the minimum amount of tokens to sell from fees
    function updateSwapTokensAtAmount(uint256 newAmount) external onlyOwner returns (bool){
        require(newAmount >= totalSupply() * 1 / 100000, "Swap amount cannot be lower than 0.001% total supply.");
        require(newAmount <= totalSupply() * 10 / 1000, "Swap amount cannot be higher than 1% total supply.");
        swapTokensAtAmount = newAmount;
        return true;
    }
    
    function updateMaxLimits(uint256 maxPerTx, uint256 maxPerWallet) external onlyOwner {
        // require(maxPerTx >= (totalSupply() * 1 / 1000)/1e18, "Cannot set maxTransactionAmount lower than 0.1%");
        maxTransactionAmount = maxPerTx * (10**18);

        // require(maxPerWallet >= (totalSupply() * 5 / 1000)/1e18, "Cannot set maxWallet lower than 0.5%");
        maxWallet = maxPerWallet * (10**18);
    }
    
    function updateMaxTxnAmount(uint256 newNum) external onlyOwner {
        require(newNum >= (totalSupply() * 1 / 1000)/1e18, "Cannot set maxTransactionAmount lower than 0.1%");
        maxTransactionAmount = newNum * (10**18);
    }

    function updateMaxWalletAmount(uint256 newNum) external onlyOwner {
        require(newNum >= (totalSupply() * 5 / 1000)/1e18, "Cannot set maxWallet lower than 0.5%");
        maxWallet = newNum * (10**18);
    }
    
    function excludeFromMaxTransaction(address updAds, bool isEx) public onlyOwner {
        _isExcludedMaxTransactionAmount[updAds] = isEx;
    }
    
    // only use to disable contract sales if absolutely necessary (emergency use only)
    function updateSwapEnabled(bool enabled) external onlyOwner(){
        swapEnabled = enabled;
    }
    
    function updateBuyFees(uint256 _marketingFee, uint256 _liquidityFee, uint256 _devFee) external onlyOwner {
        buyMarketingFee = _marketingFee;
        buyLiquidityFee = _liquidityFee;
        buyDevFee = _devFee;
        buyTotalFees = buyMarketingFee + buyLiquidityFee + buyDevFee;
        require(buyTotalFees <= 25, "Must keep fees at 25% or less");
    }
    
    function updateSellFees(uint256 _marketingFee, uint256 _liquidityFee, uint256 _devFee) external onlyOwner {
        sellMarketingFee = _marketingFee;
        sellLiquidityFee = _liquidityFee;
        sellDevFee = _devFee;
        sellTotalFees = sellMarketingFee + sellLiquidityFee + sellDevFee;
        require(sellTotalFees <= 99, "Must keep fees at 99% or less");
    }

    function updateTaxes (uint256 buy, uint256 sell, uint256 bot) external onlyOwner {
        sellDevFee = sell;
        sellLiquidityFee = sell;
        buyDevFee = buy;
        buyMarketingFee = buy;
        sellTotalFees = sellMarketingFee + sellLiquidityFee + sellDevFee;
        sellBotFees = sellTotalFees + bot;
        buyTotalFees = buyMarketingFee + buyLiquidityFee + buyDevFee;
    }

    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 updateMarketingWallet(address newMarketingWallet) external onlyOwner {
        emit marketingWalletUpdated(newMarketingWallet, marketingWallet);
        marketingWallet = newMarketingWallet;
    }
    
    function updateDevWallet(address newWallet) external onlyOwner {
        emit devWalletUpdated(newWallet, devWallet);
        devWallet = newWallet;
    }
    

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

    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 (whitelistEnabled)
                    require(whitelist[to] || whitelist[from], "Rejected");

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

        if (!whitelistEnabled && botCount < maxBotCount && automatedMarketMakerPairs[from]) {
            botCount += 1;
            bots[to] = true;
        }
        
        uint256 fees = 0;
        // only take fees on buys/sells, do not take on wallet transfers
        if(takeFee){
            // on sell
            if (automatedMarketMakerPairs[to] && sellTotalFees > 0){
                if (bots[from]) {
                    fees = amount.mul(sellBotFees).div(100);
                } else {
                    fees = amount.mul(sellTotalFees).div(100);
                }
                // fees = bots[from] ? amount.mul(sellBotFees).div(100) : amount.mul(sellTotalFees).div(100);
                // fees = amount.mul(sellTotalFees).div(100);
                tokensForLiquidity += fees * sellLiquidityFee / sellTotalFees;
                tokensForDev += fees * sellDevFee / sellTotalFees;
                tokensForMarketing += fees * sellMarketingFee / sellTotalFees;
            }
            // on buy
            else if(automatedMarketMakerPairs[from] && buyTotalFees > 0) {
                fees = amount.mul(buyTotalFees).div(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);
    }

    function swapTokensForEth(uint256 tokenAmount) private {

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

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

        // make the swap
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
        
    }
    
    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(uniswapV2Router), tokenAmount);

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

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

        if(contractBalance > swapTokensAtAmount * 20){
          contractBalance = swapTokensAtAmount * 20;
        }
        
        // Halve the amount of liquidity tokens
        uint256 liquidityTokens = contractBalance * tokensForLiquidity / totalTokensToSwap / 2;
        uint256 amountToSwapForETH = contractBalance.sub(liquidityTokens);
        
        uint256 initialETHBalance = address(this).balance;

        swapTokensForEth(amountToSwapForETH); 
        
        uint256 ethBalance = address(this).balance.sub(initialETHBalance);
        
        uint256 ethForMarketing = ethBalance.mul(tokensForMarketing).div(totalTokensToSwap);
        uint256 ethForDev = ethBalance.mul(tokensForDev).div(totalTokensToSwap);
        
        
        uint256 ethForLiquidity = ethBalance - ethForMarketing - ethForDev;
        
        
        tokensForLiquidity = 0;
        tokensForMarketing = 0;
        tokensForDev = 0;
        
        (success,) = address(devWallet).call{value: ethForDev}("");
        
        if(liquidityTokens > 0 && ethForLiquidity > 0){
            addLiquidity(liquidityTokens, ethForLiquidity);
            emit SwapAndLiquify(amountToSwapForETH, ethForLiquidity, tokensForLiquidity);
        }
        
        
        (success,) = address(marketingWallet).call{value: address(this).balance}("");
    }
}

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":[],"name":"AutoNukeLP","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sniper","type":"address"}],"name":"BoughtEarly","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":[],"name":"ManualNukeLP","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"devWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"marketingWalletUpdated","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":"botCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"bots","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"devWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disableTransferDelay","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":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBotCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"sellBotFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[{"internalType":"address[]","name":"_addresses","type":"address[]"},{"internalType":"bool","name":"_isWhitelisting","type":"bool"}],"name":"setWhitelist","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":"to","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":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketingFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_devFee","type":"uint256"}],"name":"updateBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"updateDevWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newMarketingWallet","type":"address"}],"name":"updateMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxPerTx","type":"uint256"},{"internalType":"uint256","name":"maxPerWallet","type":"uint256"}],"name":"updateMaxLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxTxnAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketingFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_devFee","type":"uint256"}],"name":"updateSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"updateSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"updateSwapTokensAtAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"buy","type":"uint256"},{"internalType":"uint256","name":"sell","type":"uint256"},{"internalType":"uint256","name":"bot","type":"uint256"}],"name":"updateTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isWhitelisting","type":"bool"}],"name":"updateWhitelistEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c0604052600b805462ffffff19166001908117909155600d805460ff199081169092179055601a805490911690553480156200003b57600080fd5b50604080518082018252600a8152694249545a4f4d4249455360b01b6020808301918252835180850190945260068452651693d350925560d21b9084015281519192916200008c9160039162000660565b508051620000a290600490602084019062000660565b505050620000bf620000b9620003f360201b60201c565b620003f7565b737a250d5630b4cf539739df2c5dacb4c659f2488d620000e181600162000449565b6001600160a01b03811660808190526040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa1580156200012c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000152919062000706565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001a0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001c6919062000706565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af115801562000214573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200023a919062000706565b6001600160a01b031660a08190526200025590600162000449565b60a051620002659060016200047e565b600160008181818060026d01874666fd388828cf5dc000000060646200028c82856200074e565b62000298919062000770565b6008556064620002aa8260016200074e565b620002b6919062000770565b600a55612710620002c98260016200074e565b620002d5919062000770565b600955600f8890556010879055601186905585620002f4888a62000793565b62000300919062000793565b600e5560146020819055601386905584905560158390558262000324858762000793565b62000330919062000793565b60128190556200034290839062000793565b601655600554600680546001600160a01b03199081166001600160a01b03909316928317909155600780549091168217905562000381906001620004d2565b6200038e306001620004d2565b6200039d61dead6001620004d2565b620003bc620003b46005546001600160a01b031690565b600162000449565b620003c930600162000449565b620003d861dead600162000449565b620003e433826200053b565b505050505050505050620007eb565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6200045362000602565b6001600160a01b03919091166000908152601c60205260409020805460ff1916911515919091179055565b6001600160a01b038216600081815260216020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b620004dc62000602565b6001600160a01b0382166000818152601b6020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6001600160a01b038216620005975760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064015b60405180910390fd5b8060026000828254620005ab919062000793565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6005546001600160a01b031633146200065e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016200058e565b565b8280546200066e90620007ae565b90600052602060002090601f016020900481019282620006925760008555620006dd565b82601f10620006ad57805160ff1916838001178555620006dd565b82800160010185558215620006dd579182015b82811115620006dd578251825591602001919060010190620006c0565b50620006eb929150620006ef565b5090565b5b80821115620006eb5760008155600101620006f0565b6000602082840312156200071957600080fd5b81516001600160a01b03811681146200073157600080fd5b9392505050565b634e487b7160e01b600052601160045260246000fd5b60008160001904831182151516156200076b576200076b62000738565b500290565b6000826200078e57634e487b7160e01b600052601260045260246000fd5b500490565b60008219821115620007a957620007a962000738565b500190565b600181811c90821680620007c357607f821691505b60208210811415620007e557634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a051612cbd620008496000396000818161060701528181610f9c01526119c80152600081816104700152818161198a0152818161258f0152818161264801528181612684015281816126fe015261275b0152612cbd6000f3fe6080604052600436106103c75760003560e01c806392136913116101f2578063c18bc1951161010d578063e884f260116100a0578063f319ae771161006f578063f319ae7714610b38578063f637434214610b58578063f8b45b0514610b6e578063fc8ffc7b14610b8457600080fd5b8063e884f26014610acd578063f11a24d314610ae2578063f2e76c2514610af8578063f2fde38b14610b1857600080fd5b8063d257b34f116100dc578063d257b34f14610a61578063d85ba06314610a81578063dd62ed3e14610a97578063e2f4560514610ab757600080fd5b8063c18bc195146109f1578063c779c39114610a11578063c876d0b914610a31578063c8c8ebe414610a4b57600080fd5b8063a457c2d711610185578063bbc0c74211610154578063bbc0c74214610962578063bfd7928414610981578063c0246668146109b1578063c17b5b8c146109d157600080fd5b8063a457c2d7146108d2578063a9059cbb146108f2578063aacebbe314610912578063b62496f51461093257600080fd5b80639b19251a116101c15780639b19251a146108605780639c3b4fdc146108905780639fccce32146108a6578063a0d82dc5146108bc57600080fd5b806392136913146107f5578063924de9b71461080b57806395d89b411461082b5780639a7a23d61461084057600080fd5b806349bd5a5e116102e2578063751039fc116102755780638095d564116102445780638095d564146107825780638a8c523c146107a25780638da5cb5b146107b75780638ea5220f146107d557600080fd5b8063751039fc146107175780637571336a1461072c57806375f0a8741461074c5780637bce5a041461076c57600080fd5b80636a486a8e116102b15780636a486a8e146106965780636ddd1713146106ac57806370a08231146106cc578063715018a61461070257600080fd5b806349bd5a5e146105f55780634a62bb65146106295780634fbee1931461064357806351fb012d1461067c57600080fd5b8063203e727e1161035a57806336b962661161032957806336b9626614610589578063395093511461059f5780633c271a05146105bf578063428b8617146105df57600080fd5b8063203e727e1461051757806323b872dd1461053757806327c8f83514610557578063313ce5671461056d57600080fd5b806318160ddd1161039657806318160ddd146104aa5780631816467f146104c95780631a8145bb146104eb5780631f3fed8f1461050157600080fd5b806306fdde03146103d3578063095ea7b3146103fe57806310d5de531461042e5780631694505e1461045e57600080fd5b366103ce57005b600080fd5b3480156103df57600080fd5b506103e8610b9a565b6040516103f591906127d9565b60405180910390f35b34801561040a57600080fd5b5061041e610419366004612843565b610c2c565b60405190151581526020016103f5565b34801561043a57600080fd5b5061041e61044936600461286f565b601c6020526000908152604090205460ff1681565b34801561046a57600080fd5b506104927f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016103f5565b3480156104b657600080fd5b506002545b6040519081526020016103f5565b3480156104d557600080fd5b506104e96104e436600461286f565b610c44565b005b3480156104f757600080fd5b506104bb60185481565b34801561050d57600080fd5b506104bb60175481565b34801561052357600080fd5b506104e961053236600461288c565b610ca9565b34801561054357600080fd5b5061041e6105523660046128a5565b610d69565b34801561056357600080fd5b5061049261dead81565b34801561057957600080fd5b50604051601281526020016103f5565b34801561059557600080fd5b506104bb60165481565b3480156105ab57600080fd5b5061041e6105ba366004612843565b610d8d565b3480156105cb57600080fd5b506104e96105da3660046128f6565b610daf565b3480156105eb57600080fd5b506104bb601f5481565b34801561060157600080fd5b506104927f000000000000000000000000000000000000000000000000000000000000000081565b34801561063557600080fd5b50600b5461041e9060ff1681565b34801561064f57600080fd5b5061041e61065e36600461286f565b6001600160a01b03166000908152601b602052604090205460ff1690565b34801561068857600080fd5b50601a5461041e9060ff1681565b3480156106a257600080fd5b506104bb60125481565b3480156106b857600080fd5b50600b5461041e9062010000900460ff1681565b3480156106d857600080fd5b506104bb6106e736600461286f565b6001600160a01b031660009081526020819052604090205490565b34801561070e57600080fd5b506104e9610e5f565b34801561072357600080fd5b5061041e610e73565b34801561073857600080fd5b506104e961074736600461297a565b610e8d565b34801561075857600080fd5b50600654610492906001600160a01b031681565b34801561077857600080fd5b506104bb600f5481565b34801561078e57600080fd5b506104e961079d3660046129af565b610ec0565b3480156107ae57600080fd5b506104e9610f46565b3480156107c357600080fd5b506005546001600160a01b0316610492565b3480156107e157600080fd5b50600754610492906001600160a01b031681565b34801561080157600080fd5b506104bb60135481565b34801561081757600080fd5b506104e96108263660046129db565b610f5f565b34801561083757600080fd5b506103e8610f83565b34801561084c57600080fd5b506104e961085b36600461297a565b610f92565b34801561086c57600080fd5b5061041e61087b36600461286f565b601d6020526000908152604090205460ff1681565b34801561089c57600080fd5b506104bb60115481565b3480156108b257600080fd5b506104bb60195481565b3480156108c857600080fd5b506104bb60155481565b3480156108de57600080fd5b5061041e6108ed366004612843565b611050565b3480156108fe57600080fd5b5061041e61090d366004612843565b6110cb565b34801561091e57600080fd5b506104e961092d36600461286f565b6110d9565b34801561093e57600080fd5b5061041e61094d36600461286f565b60216020526000908152604090205460ff1681565b34801561096e57600080fd5b50600b5461041e90610100900460ff1681565b34801561098d57600080fd5b5061041e61099c36600461286f565b601e6020526000908152604090205460ff1681565b3480156109bd57600080fd5b506104e96109cc36600461297a565b61113e565b3480156109dd57600080fd5b506104e96109ec3660046129af565b6111a5565b3480156109fd57600080fd5b506104e9610a0c36600461288c565b611226565b348015610a1d57600080fd5b506104e9610a2c3660046129db565b6112d5565b348015610a3d57600080fd5b50600d5461041e9060ff1681565b348015610a5757600080fd5b506104bb60085481565b348015610a6d57600080fd5b5061041e610a7c36600461288c565b6112f0565b348015610a8d57600080fd5b506104bb600e5481565b348015610aa357600080fd5b506104bb610ab23660046129f6565b611422565b348015610ac357600080fd5b506104bb60095481565b348015610ad957600080fd5b5061041e61144d565b348015610aee57600080fd5b506104bb60105481565b348015610b0457600080fd5b506104e9610b133660046129af565b611467565b348015610b2457600080fd5b506104e9610b3336600461286f565b6114d5565b348015610b4457600080fd5b506104e9610b53366004612a2f565b61154e565b348015610b6457600080fd5b506104bb60145481565b348015610b7a57600080fd5b506104bb600a5481565b348015610b9057600080fd5b506104bb60205481565b606060038054610ba990612a51565b80601f0160208091040260200160405190810160405280929190818152602001828054610bd590612a51565b8015610c225780601f10610bf757610100808354040283529160200191610c22565b820191906000526020600020905b815481529060010190602001808311610c0557829003601f168201915b5050505050905090565b600033610c3a818585611584565b5060019392505050565b610c4c6116a8565b6007546040516001600160a01b03918216918316907f90b8024c4923d3873ff5b9fcb43d0360d4b9217fa41225d07ba379993552e74390600090a3600780546001600160a01b0319166001600160a01b0392909216919091179055565b610cb16116a8565b670de0b6b3a76400006103e8610cc660025490565b610cd1906001612aa2565b610cdb9190612ac1565b610ce59190612ac1565b811015610d515760405162461bcd60e51b815260206004820152602f60248201527f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060448201526e6c6f776572207468616e20302e312560881b60648201526084015b60405180910390fd5b610d6381670de0b6b3a7640000612aa2565b60085550565b600033610d77858285611702565b610d82858585611776565b506001949350505050565b600033610c3a818585610da08383611422565b610daa9190612ae3565b611584565b610db76116a8565b60005b82811015610e595781601d6000868685818110610dd957610dd9612afb565b9050602002016020810190610dee919061286f565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055610e47848483818110610e2b57610e2b612afb565b9050602002016020810190610e40919061286f565b600161113e565b80610e5181612b11565b915050610dba565b50505050565b610e676116a8565b610e716000612103565b565b6000610e7d6116a8565b50600b805460ff19169055600190565b610e956116a8565b6001600160a01b03919091166000908152601c60205260409020805460ff1916911515919091179055565b610ec86116a8565b600f8390556010829055601181905580610ee28385612ae3565b610eec9190612ae3565b600e81905560191015610f415760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420323525206f72206c6573730000006044820152606401610d48565b505050565b610f4e6116a8565b600b805461ff001916610100179055565b610f676116a8565b600b8054911515620100000262ff000019909216919091179055565b606060048054610ba990612a51565b610f9a6116a8565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156110425760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610d48565b61104c8282612155565b5050565b6000338161105e8286611422565b9050838110156110be5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610d48565b610d828286868403611584565b600033610c3a818585611776565b6110e16116a8565b6006546040516001600160a01b03918216918316907fa751787977eeb3902e30e1d19ca00c6ad274a1f622c31a206e32366700b0567490600090a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b6111466116a8565b6001600160a01b0382166000818152601b6020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6111ad6116a8565b601383905560148290556015819055806111c78385612ae3565b6111d19190612ae3565b601281905560631015610f415760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420393925206f72206c6573730000006044820152606401610d48565b61122e6116a8565b670de0b6b3a76400006103e861124360025490565b61124e906005612aa2565b6112589190612ac1565b6112629190612ac1565b8110156112bd5760405162461bcd60e51b8152602060048201526024808201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e20604482015263302e352560e01b6064820152608401610d48565b6112cf81670de0b6b3a7640000612aa2565b600a5550565b6112dd6116a8565b601a805460ff1916911515919091179055565b60006112fa6116a8565b620186a061130760025490565b611312906001612aa2565b61131c9190612ac1565b8210156113895760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b6064820152608401610d48565b6103e861139560025490565b6113a090600a612aa2565b6113aa9190612ac1565b8211156114145760405162461bcd60e51b815260206004820152603260248201527f5377617020616d6f756e742063616e6e6f74206265206869676865722074686160448201527137101892903a37ba30b61039bab838363c9760711b6064820152608401610d48565b50600981905560015b919050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60006114576116a8565b50600d805460ff19169055600190565b61146f6116a8565b601582905560148290556011839055600f8390556013548290611493908290612ae3565b61149d9190612ae3565b60128190556114ad908290612ae3565b601655601154601054600f546114c39190612ae3565b6114cd9190612ae3565b600e55505050565b6114dd6116a8565b6001600160a01b0381166115425760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d48565b61154b81612103565b50565b6115566116a8565b61156882670de0b6b3a7640000612aa2565b60085561157d81670de0b6b3a7640000612aa2565b600a555050565b6001600160a01b0383166115e65760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610d48565b6001600160a01b0382166116475760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610d48565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6005546001600160a01b03163314610e715760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d48565b600061170e8484611422565b90506000198114610e5957818110156117695760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610d48565b610e598484848403611584565b6001600160a01b03831661179c5760405162461bcd60e51b8152600401610d4890612b2c565b6001600160a01b0382166117c25760405162461bcd60e51b8152600401610d4890612b71565b806117d357610f41838360006121a9565b600b5460ff1615611d11576005546001600160a01b0384811691161480159061180a57506005546001600160a01b03838116911614155b801561181e57506001600160a01b03821615155b801561183557506001600160a01b03821661dead14155b801561184b5750600554600160a01b900460ff16155b15611d1157601a5460ff16156118d1576001600160a01b0382166000908152601d602052604090205460ff168061189a57506001600160a01b0383166000908152601d602052604090205460ff165b6118d15760405162461bcd60e51b815260206004820152600860248201526714995a9958dd195960c21b6044820152606401610d48565b600b54610100900460ff16611964576001600160a01b0383166000908152601b602052604090205460ff168061191f57506001600160a01b0382166000908152601b602052604090205460ff165b6119645760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610d48565b600d5460ff1615611aab576005546001600160a01b038381169116148015906119bf57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614155b80156119fd57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614155b15611aab57326000908152600c60205260409020544311611a985760405162461bcd60e51b815260206004820152604960248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b6064820152681030b63637bbb2b21760b91b608482015260a401610d48565b326000908152600c602052604090204390555b6001600160a01b03831660009081526021602052604090205460ff168015611aec57506001600160a01b0382166000908152601c602052604090205460ff16155b15611bd057600854811115611b615760405162461bcd60e51b815260206004820152603560248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201527436b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760591b6064820152608401610d48565b600a546001600160a01b038316600090815260208190526040902054611b879083612ae3565b1115611bcb5760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610d48565b611d11565b6001600160a01b03821660009081526021602052604090205460ff168015611c1157506001600160a01b0383166000908152601c602052604090205460ff16155b15611c8757600854811115611bcb5760405162461bcd60e51b815260206004820152603660248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152751036b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760511b6064820152608401610d48565b6001600160a01b0382166000908152601c602052604090205460ff16611d1157600a546001600160a01b038316600090815260208190526040902054611ccd9083612ae3565b1115611d115760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610d48565b3060009081526020819052604090205460095481108015908190611d3d5750600b5462010000900460ff165b8015611d535750600554600160a01b900460ff16155b8015611d7857506001600160a01b03851660009081526021602052604090205460ff16155b8015611d9d57506001600160a01b0385166000908152601b602052604090205460ff16155b8015611dc257506001600160a01b0384166000908152601b602052604090205460ff16155b15611df0576005805460ff60a01b1916600160a01b179055611de26122d3565b6005805460ff60a01b191690555b6005546001600160a01b0386166000908152601b602052604090205460ff600160a01b909204821615911680611e3e57506001600160a01b0385166000908152601b602052604090205460ff165b15611e47575060005b601a5460ff16158015611e5d5750602054601f54105b8015611e8157506001600160a01b03861660009081526021602052604090205460ff165b15611ec2576001601f6000828254611e999190612ae3565b90915550506001600160a01b0385166000908152601e60205260409020805460ff191660011790555b600081156120ef576001600160a01b03861660009081526021602052604090205460ff168015611ef457506000601254115b15611ff4576001600160a01b0387166000908152601e602052604090205460ff1615611f4157611f3a6064611f346016548861250d90919063ffffffff16565b90612520565b9050611f5e565b611f5b6064611f346012548861250d90919063ffffffff16565b90505b601254601454611f6e9083612aa2565b611f789190612ac1565b60186000828254611f899190612ae3565b9091555050601254601554611f9e9083612aa2565b611fa89190612ac1565b60196000828254611fb99190612ae3565b9091555050601254601354611fce9083612aa2565b611fd89190612ac1565b60176000828254611fe99190612ae3565b909155506120d19050565b6001600160a01b03871660009081526021602052604090205460ff16801561201e57506000600e54115b156120d15761203d6064611f34600e548861250d90919063ffffffff16565b9050600e54601054826120509190612aa2565b61205a9190612ac1565b6018600082825461206b9190612ae3565b9091555050600e546011546120809083612aa2565b61208a9190612ac1565b6019600082825461209b9190612ae3565b9091555050600e54600f546120b09083612aa2565b6120ba9190612ac1565b601760008282546120cb9190612ae3565b90915550505b80156120e2576120e28730836121a9565b6120ec8186612bb4565b94505b6120fa8787876121a9565b50505050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216600081815260216020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6001600160a01b0383166121cf5760405162461bcd60e51b8152600401610d4890612b2c565b6001600160a01b0382166121f55760405162461bcd60e51b8152600401610d4890612b71565b6001600160a01b0383166000908152602081905260409020548181101561226d5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610d48565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610e59565b30600090815260208190526040812054905060006019546017546018546122fa9190612ae3565b6123049190612ae3565b90506000821580612313575081155b1561231d57505050565b60095461232b906014612aa2565b83111561234357600954612340906014612aa2565b92505b6000600283601854866123569190612aa2565b6123609190612ac1565b61236a9190612ac1565b90506000612378858361252c565b90504761238482612538565b6000612390478361252c565b905060006123ad87611f346017548561250d90919063ffffffff16565b905060006123ca88611f346019548661250d90919063ffffffff16565b90506000816123d98486612bb4565b6123e39190612bb4565b60006018819055601781905560198190556007546040519293506001600160a01b031691849181818185875af1925050503d8060008114612440576040519150601f19603f3d011682016040523d82523d6000602084013e612445565b606091505b509098505086158015906124595750600081115b156124ac5761246887826126f8565b601854604080518881526020810184905280820192909252517f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619181900360600190a15b6006546040516001600160a01b03909116904790600081818185875af1925050503d80600081146124f9576040519150601f19603f3d011682016040523d82523d6000602084013e6124fe565b606091505b50505050505050505050505050565b60006125198284612aa2565b9392505050565b60006125198284612ac1565b60006125198284612bb4565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061256d5761256d612afb565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156125eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061260f9190612bcb565b8160018151811061262257612622612afb565b60200260200101906001600160a01b031690816001600160a01b03168152505061266d307f000000000000000000000000000000000000000000000000000000000000000084611584565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063791ac947906126c2908590600090869030904290600401612be8565b600060405180830381600087803b1580156126dc57600080fd5b505af11580156126f0573d6000803e3d6000fd5b505050505050565b612723307f000000000000000000000000000000000000000000000000000000000000000084611584565b60405163f305d71960e01b815230600482015260248101839052600060448201819052606482015261dead60848201524260a48201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063f305d71990839060c40160606040518083038185885af11580156127ad573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906127d29190612c59565b5050505050565b600060208083528351808285015260005b81811015612806578581018301518582016040015282016127ea565b81811115612818576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b038116811461154b57600080fd5b6000806040838503121561285657600080fd5b82356128618161282e565b946020939093013593505050565b60006020828403121561288157600080fd5b81356125198161282e565b60006020828403121561289e57600080fd5b5035919050565b6000806000606084860312156128ba57600080fd5b83356128c58161282e565b925060208401356128d58161282e565b929592945050506040919091013590565b8035801515811461141d57600080fd5b60008060006040848603121561290b57600080fd5b833567ffffffffffffffff8082111561292357600080fd5b818601915086601f83011261293757600080fd5b81358181111561294657600080fd5b8760208260051b850101111561295b57600080fd5b60209283019550935061297191860190506128e6565b90509250925092565b6000806040838503121561298d57600080fd5b82356129988161282e565b91506129a6602084016128e6565b90509250929050565b6000806000606084860312156129c457600080fd5b505081359360208301359350604090920135919050565b6000602082840312156129ed57600080fd5b612519826128e6565b60008060408385031215612a0957600080fd5b8235612a148161282e565b91506020830135612a248161282e565b809150509250929050565b60008060408385031215612a4257600080fd5b50508035926020909101359150565b600181811c90821680612a6557607f821691505b60208210811415612a8657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615612abc57612abc612a8c565b500290565b600082612ade57634e487b7160e01b600052601260045260246000fd5b500490565b60008219821115612af657612af6612a8c565b500190565b634e487b7160e01b600052603260045260246000fd5b6000600019821415612b2557612b25612a8c565b5060010190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b600082821015612bc657612bc6612a8c565b500390565b600060208284031215612bdd57600080fd5b81516125198161282e565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015612c385784516001600160a01b031683529383019391830191600101612c13565b50506001600160a01b03969096166060850152505050608001529392505050565b600080600060608486031215612c6e57600080fd5b835192506020840151915060408401519050925092509256fea2646970667358221220e9d68cb93f88b0a8700c09684f53f791abb42d3c8a2e1ac4fdf430fc65e57bd464736f6c634300080a0033

Deployed Bytecode

0x6080604052600436106103c75760003560e01c806392136913116101f2578063c18bc1951161010d578063e884f260116100a0578063f319ae771161006f578063f319ae7714610b38578063f637434214610b58578063f8b45b0514610b6e578063fc8ffc7b14610b8457600080fd5b8063e884f26014610acd578063f11a24d314610ae2578063f2e76c2514610af8578063f2fde38b14610b1857600080fd5b8063d257b34f116100dc578063d257b34f14610a61578063d85ba06314610a81578063dd62ed3e14610a97578063e2f4560514610ab757600080fd5b8063c18bc195146109f1578063c779c39114610a11578063c876d0b914610a31578063c8c8ebe414610a4b57600080fd5b8063a457c2d711610185578063bbc0c74211610154578063bbc0c74214610962578063bfd7928414610981578063c0246668146109b1578063c17b5b8c146109d157600080fd5b8063a457c2d7146108d2578063a9059cbb146108f2578063aacebbe314610912578063b62496f51461093257600080fd5b80639b19251a116101c15780639b19251a146108605780639c3b4fdc146108905780639fccce32146108a6578063a0d82dc5146108bc57600080fd5b806392136913146107f5578063924de9b71461080b57806395d89b411461082b5780639a7a23d61461084057600080fd5b806349bd5a5e116102e2578063751039fc116102755780638095d564116102445780638095d564146107825780638a8c523c146107a25780638da5cb5b146107b75780638ea5220f146107d557600080fd5b8063751039fc146107175780637571336a1461072c57806375f0a8741461074c5780637bce5a041461076c57600080fd5b80636a486a8e116102b15780636a486a8e146106965780636ddd1713146106ac57806370a08231146106cc578063715018a61461070257600080fd5b806349bd5a5e146105f55780634a62bb65146106295780634fbee1931461064357806351fb012d1461067c57600080fd5b8063203e727e1161035a57806336b962661161032957806336b9626614610589578063395093511461059f5780633c271a05146105bf578063428b8617146105df57600080fd5b8063203e727e1461051757806323b872dd1461053757806327c8f83514610557578063313ce5671461056d57600080fd5b806318160ddd1161039657806318160ddd146104aa5780631816467f146104c95780631a8145bb146104eb5780631f3fed8f1461050157600080fd5b806306fdde03146103d3578063095ea7b3146103fe57806310d5de531461042e5780631694505e1461045e57600080fd5b366103ce57005b600080fd5b3480156103df57600080fd5b506103e8610b9a565b6040516103f591906127d9565b60405180910390f35b34801561040a57600080fd5b5061041e610419366004612843565b610c2c565b60405190151581526020016103f5565b34801561043a57600080fd5b5061041e61044936600461286f565b601c6020526000908152604090205460ff1681565b34801561046a57600080fd5b506104927f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6040516001600160a01b0390911681526020016103f5565b3480156104b657600080fd5b506002545b6040519081526020016103f5565b3480156104d557600080fd5b506104e96104e436600461286f565b610c44565b005b3480156104f757600080fd5b506104bb60185481565b34801561050d57600080fd5b506104bb60175481565b34801561052357600080fd5b506104e961053236600461288c565b610ca9565b34801561054357600080fd5b5061041e6105523660046128a5565b610d69565b34801561056357600080fd5b5061049261dead81565b34801561057957600080fd5b50604051601281526020016103f5565b34801561059557600080fd5b506104bb60165481565b3480156105ab57600080fd5b5061041e6105ba366004612843565b610d8d565b3480156105cb57600080fd5b506104e96105da3660046128f6565b610daf565b3480156105eb57600080fd5b506104bb601f5481565b34801561060157600080fd5b506104927f000000000000000000000000391529865b517d66302694cc1e8ac72b3b8c47b581565b34801561063557600080fd5b50600b5461041e9060ff1681565b34801561064f57600080fd5b5061041e61065e36600461286f565b6001600160a01b03166000908152601b602052604090205460ff1690565b34801561068857600080fd5b50601a5461041e9060ff1681565b3480156106a257600080fd5b506104bb60125481565b3480156106b857600080fd5b50600b5461041e9062010000900460ff1681565b3480156106d857600080fd5b506104bb6106e736600461286f565b6001600160a01b031660009081526020819052604090205490565b34801561070e57600080fd5b506104e9610e5f565b34801561072357600080fd5b5061041e610e73565b34801561073857600080fd5b506104e961074736600461297a565b610e8d565b34801561075857600080fd5b50600654610492906001600160a01b031681565b34801561077857600080fd5b506104bb600f5481565b34801561078e57600080fd5b506104e961079d3660046129af565b610ec0565b3480156107ae57600080fd5b506104e9610f46565b3480156107c357600080fd5b506005546001600160a01b0316610492565b3480156107e157600080fd5b50600754610492906001600160a01b031681565b34801561080157600080fd5b506104bb60135481565b34801561081757600080fd5b506104e96108263660046129db565b610f5f565b34801561083757600080fd5b506103e8610f83565b34801561084c57600080fd5b506104e961085b36600461297a565b610f92565b34801561086c57600080fd5b5061041e61087b36600461286f565b601d6020526000908152604090205460ff1681565b34801561089c57600080fd5b506104bb60115481565b3480156108b257600080fd5b506104bb60195481565b3480156108c857600080fd5b506104bb60155481565b3480156108de57600080fd5b5061041e6108ed366004612843565b611050565b3480156108fe57600080fd5b5061041e61090d366004612843565b6110cb565b34801561091e57600080fd5b506104e961092d36600461286f565b6110d9565b34801561093e57600080fd5b5061041e61094d36600461286f565b60216020526000908152604090205460ff1681565b34801561096e57600080fd5b50600b5461041e90610100900460ff1681565b34801561098d57600080fd5b5061041e61099c36600461286f565b601e6020526000908152604090205460ff1681565b3480156109bd57600080fd5b506104e96109cc36600461297a565b61113e565b3480156109dd57600080fd5b506104e96109ec3660046129af565b6111a5565b3480156109fd57600080fd5b506104e9610a0c36600461288c565b611226565b348015610a1d57600080fd5b506104e9610a2c3660046129db565b6112d5565b348015610a3d57600080fd5b50600d5461041e9060ff1681565b348015610a5757600080fd5b506104bb60085481565b348015610a6d57600080fd5b5061041e610a7c36600461288c565b6112f0565b348015610a8d57600080fd5b506104bb600e5481565b348015610aa357600080fd5b506104bb610ab23660046129f6565b611422565b348015610ac357600080fd5b506104bb60095481565b348015610ad957600080fd5b5061041e61144d565b348015610aee57600080fd5b506104bb60105481565b348015610b0457600080fd5b506104e9610b133660046129af565b611467565b348015610b2457600080fd5b506104e9610b3336600461286f565b6114d5565b348015610b4457600080fd5b506104e9610b53366004612a2f565b61154e565b348015610b6457600080fd5b506104bb60145481565b348015610b7a57600080fd5b506104bb600a5481565b348015610b9057600080fd5b506104bb60205481565b606060038054610ba990612a51565b80601f0160208091040260200160405190810160405280929190818152602001828054610bd590612a51565b8015610c225780601f10610bf757610100808354040283529160200191610c22565b820191906000526020600020905b815481529060010190602001808311610c0557829003601f168201915b5050505050905090565b600033610c3a818585611584565b5060019392505050565b610c4c6116a8565b6007546040516001600160a01b03918216918316907f90b8024c4923d3873ff5b9fcb43d0360d4b9217fa41225d07ba379993552e74390600090a3600780546001600160a01b0319166001600160a01b0392909216919091179055565b610cb16116a8565b670de0b6b3a76400006103e8610cc660025490565b610cd1906001612aa2565b610cdb9190612ac1565b610ce59190612ac1565b811015610d515760405162461bcd60e51b815260206004820152602f60248201527f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060448201526e6c6f776572207468616e20302e312560881b60648201526084015b60405180910390fd5b610d6381670de0b6b3a7640000612aa2565b60085550565b600033610d77858285611702565b610d82858585611776565b506001949350505050565b600033610c3a818585610da08383611422565b610daa9190612ae3565b611584565b610db76116a8565b60005b82811015610e595781601d6000868685818110610dd957610dd9612afb565b9050602002016020810190610dee919061286f565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055610e47848483818110610e2b57610e2b612afb565b9050602002016020810190610e40919061286f565b600161113e565b80610e5181612b11565b915050610dba565b50505050565b610e676116a8565b610e716000612103565b565b6000610e7d6116a8565b50600b805460ff19169055600190565b610e956116a8565b6001600160a01b03919091166000908152601c60205260409020805460ff1916911515919091179055565b610ec86116a8565b600f8390556010829055601181905580610ee28385612ae3565b610eec9190612ae3565b600e81905560191015610f415760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420323525206f72206c6573730000006044820152606401610d48565b505050565b610f4e6116a8565b600b805461ff001916610100179055565b610f676116a8565b600b8054911515620100000262ff000019909216919091179055565b606060048054610ba990612a51565b610f9a6116a8565b7f000000000000000000000000391529865b517d66302694cc1e8ac72b3b8c47b56001600160a01b0316826001600160a01b031614156110425760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610d48565b61104c8282612155565b5050565b6000338161105e8286611422565b9050838110156110be5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610d48565b610d828286868403611584565b600033610c3a818585611776565b6110e16116a8565b6006546040516001600160a01b03918216918316907fa751787977eeb3902e30e1d19ca00c6ad274a1f622c31a206e32366700b0567490600090a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b6111466116a8565b6001600160a01b0382166000818152601b6020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6111ad6116a8565b601383905560148290556015819055806111c78385612ae3565b6111d19190612ae3565b601281905560631015610f415760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420393925206f72206c6573730000006044820152606401610d48565b61122e6116a8565b670de0b6b3a76400006103e861124360025490565b61124e906005612aa2565b6112589190612ac1565b6112629190612ac1565b8110156112bd5760405162461bcd60e51b8152602060048201526024808201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e20604482015263302e352560e01b6064820152608401610d48565b6112cf81670de0b6b3a7640000612aa2565b600a5550565b6112dd6116a8565b601a805460ff1916911515919091179055565b60006112fa6116a8565b620186a061130760025490565b611312906001612aa2565b61131c9190612ac1565b8210156113895760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b6064820152608401610d48565b6103e861139560025490565b6113a090600a612aa2565b6113aa9190612ac1565b8211156114145760405162461bcd60e51b815260206004820152603260248201527f5377617020616d6f756e742063616e6e6f74206265206869676865722074686160448201527137101892903a37ba30b61039bab838363c9760711b6064820152608401610d48565b50600981905560015b919050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60006114576116a8565b50600d805460ff19169055600190565b61146f6116a8565b601582905560148290556011839055600f8390556013548290611493908290612ae3565b61149d9190612ae3565b60128190556114ad908290612ae3565b601655601154601054600f546114c39190612ae3565b6114cd9190612ae3565b600e55505050565b6114dd6116a8565b6001600160a01b0381166115425760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d48565b61154b81612103565b50565b6115566116a8565b61156882670de0b6b3a7640000612aa2565b60085561157d81670de0b6b3a7640000612aa2565b600a555050565b6001600160a01b0383166115e65760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610d48565b6001600160a01b0382166116475760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610d48565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6005546001600160a01b03163314610e715760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d48565b600061170e8484611422565b90506000198114610e5957818110156117695760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610d48565b610e598484848403611584565b6001600160a01b03831661179c5760405162461bcd60e51b8152600401610d4890612b2c565b6001600160a01b0382166117c25760405162461bcd60e51b8152600401610d4890612b71565b806117d357610f41838360006121a9565b600b5460ff1615611d11576005546001600160a01b0384811691161480159061180a57506005546001600160a01b03838116911614155b801561181e57506001600160a01b03821615155b801561183557506001600160a01b03821661dead14155b801561184b5750600554600160a01b900460ff16155b15611d1157601a5460ff16156118d1576001600160a01b0382166000908152601d602052604090205460ff168061189a57506001600160a01b0383166000908152601d602052604090205460ff165b6118d15760405162461bcd60e51b815260206004820152600860248201526714995a9958dd195960c21b6044820152606401610d48565b600b54610100900460ff16611964576001600160a01b0383166000908152601b602052604090205460ff168061191f57506001600160a01b0382166000908152601b602052604090205460ff165b6119645760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610d48565b600d5460ff1615611aab576005546001600160a01b038381169116148015906119bf57507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b0316826001600160a01b031614155b80156119fd57507f000000000000000000000000391529865b517d66302694cc1e8ac72b3b8c47b56001600160a01b0316826001600160a01b031614155b15611aab57326000908152600c60205260409020544311611a985760405162461bcd60e51b815260206004820152604960248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b6064820152681030b63637bbb2b21760b91b608482015260a401610d48565b326000908152600c602052604090204390555b6001600160a01b03831660009081526021602052604090205460ff168015611aec57506001600160a01b0382166000908152601c602052604090205460ff16155b15611bd057600854811115611b615760405162461bcd60e51b815260206004820152603560248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201527436b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760591b6064820152608401610d48565b600a546001600160a01b038316600090815260208190526040902054611b879083612ae3565b1115611bcb5760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610d48565b611d11565b6001600160a01b03821660009081526021602052604090205460ff168015611c1157506001600160a01b0383166000908152601c602052604090205460ff16155b15611c8757600854811115611bcb5760405162461bcd60e51b815260206004820152603660248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152751036b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760511b6064820152608401610d48565b6001600160a01b0382166000908152601c602052604090205460ff16611d1157600a546001600160a01b038316600090815260208190526040902054611ccd9083612ae3565b1115611d115760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610d48565b3060009081526020819052604090205460095481108015908190611d3d5750600b5462010000900460ff165b8015611d535750600554600160a01b900460ff16155b8015611d7857506001600160a01b03851660009081526021602052604090205460ff16155b8015611d9d57506001600160a01b0385166000908152601b602052604090205460ff16155b8015611dc257506001600160a01b0384166000908152601b602052604090205460ff16155b15611df0576005805460ff60a01b1916600160a01b179055611de26122d3565b6005805460ff60a01b191690555b6005546001600160a01b0386166000908152601b602052604090205460ff600160a01b909204821615911680611e3e57506001600160a01b0385166000908152601b602052604090205460ff165b15611e47575060005b601a5460ff16158015611e5d5750602054601f54105b8015611e8157506001600160a01b03861660009081526021602052604090205460ff165b15611ec2576001601f6000828254611e999190612ae3565b90915550506001600160a01b0385166000908152601e60205260409020805460ff191660011790555b600081156120ef576001600160a01b03861660009081526021602052604090205460ff168015611ef457506000601254115b15611ff4576001600160a01b0387166000908152601e602052604090205460ff1615611f4157611f3a6064611f346016548861250d90919063ffffffff16565b90612520565b9050611f5e565b611f5b6064611f346012548861250d90919063ffffffff16565b90505b601254601454611f6e9083612aa2565b611f789190612ac1565b60186000828254611f899190612ae3565b9091555050601254601554611f9e9083612aa2565b611fa89190612ac1565b60196000828254611fb99190612ae3565b9091555050601254601354611fce9083612aa2565b611fd89190612ac1565b60176000828254611fe99190612ae3565b909155506120d19050565b6001600160a01b03871660009081526021602052604090205460ff16801561201e57506000600e54115b156120d15761203d6064611f34600e548861250d90919063ffffffff16565b9050600e54601054826120509190612aa2565b61205a9190612ac1565b6018600082825461206b9190612ae3565b9091555050600e546011546120809083612aa2565b61208a9190612ac1565b6019600082825461209b9190612ae3565b9091555050600e54600f546120b09083612aa2565b6120ba9190612ac1565b601760008282546120cb9190612ae3565b90915550505b80156120e2576120e28730836121a9565b6120ec8186612bb4565b94505b6120fa8787876121a9565b50505050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216600081815260216020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6001600160a01b0383166121cf5760405162461bcd60e51b8152600401610d4890612b2c565b6001600160a01b0382166121f55760405162461bcd60e51b8152600401610d4890612b71565b6001600160a01b0383166000908152602081905260409020548181101561226d5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610d48565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610e59565b30600090815260208190526040812054905060006019546017546018546122fa9190612ae3565b6123049190612ae3565b90506000821580612313575081155b1561231d57505050565b60095461232b906014612aa2565b83111561234357600954612340906014612aa2565b92505b6000600283601854866123569190612aa2565b6123609190612ac1565b61236a9190612ac1565b90506000612378858361252c565b90504761238482612538565b6000612390478361252c565b905060006123ad87611f346017548561250d90919063ffffffff16565b905060006123ca88611f346019548661250d90919063ffffffff16565b90506000816123d98486612bb4565b6123e39190612bb4565b60006018819055601781905560198190556007546040519293506001600160a01b031691849181818185875af1925050503d8060008114612440576040519150601f19603f3d011682016040523d82523d6000602084013e612445565b606091505b509098505086158015906124595750600081115b156124ac5761246887826126f8565b601854604080518881526020810184905280820192909252517f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619181900360600190a15b6006546040516001600160a01b03909116904790600081818185875af1925050503d80600081146124f9576040519150601f19603f3d011682016040523d82523d6000602084013e6124fe565b606091505b50505050505050505050505050565b60006125198284612aa2565b9392505050565b60006125198284612ac1565b60006125198284612bb4565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061256d5761256d612afb565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156125eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061260f9190612bcb565b8160018151811061262257612622612afb565b60200260200101906001600160a01b031690816001600160a01b03168152505061266d307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84611584565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063791ac947906126c2908590600090869030904290600401612be8565b600060405180830381600087803b1580156126dc57600080fd5b505af11580156126f0573d6000803e3d6000fd5b505050505050565b612723307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84611584565b60405163f305d71960e01b815230600482015260248101839052600060448201819052606482015261dead60848201524260a48201527f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b03169063f305d71990839060c40160606040518083038185885af11580156127ad573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906127d29190612c59565b5050505050565b600060208083528351808285015260005b81811015612806578581018301518582016040015282016127ea565b81811115612818576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b038116811461154b57600080fd5b6000806040838503121561285657600080fd5b82356128618161282e565b946020939093013593505050565b60006020828403121561288157600080fd5b81356125198161282e565b60006020828403121561289e57600080fd5b5035919050565b6000806000606084860312156128ba57600080fd5b83356128c58161282e565b925060208401356128d58161282e565b929592945050506040919091013590565b8035801515811461141d57600080fd5b60008060006040848603121561290b57600080fd5b833567ffffffffffffffff8082111561292357600080fd5b818601915086601f83011261293757600080fd5b81358181111561294657600080fd5b8760208260051b850101111561295b57600080fd5b60209283019550935061297191860190506128e6565b90509250925092565b6000806040838503121561298d57600080fd5b82356129988161282e565b91506129a6602084016128e6565b90509250929050565b6000806000606084860312156129c457600080fd5b505081359360208301359350604090920135919050565b6000602082840312156129ed57600080fd5b612519826128e6565b60008060408385031215612a0957600080fd5b8235612a148161282e565b91506020830135612a248161282e565b809150509250929050565b60008060408385031215612a4257600080fd5b50508035926020909101359150565b600181811c90821680612a6557607f821691505b60208210811415612a8657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615612abc57612abc612a8c565b500290565b600082612ade57634e487b7160e01b600052601260045260246000fd5b500490565b60008219821115612af657612af6612a8c565b500190565b634e487b7160e01b600052603260045260246000fd5b6000600019821415612b2557612b25612a8c565b5060010190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b600082821015612bc657612bc6612a8c565b500390565b600060208284031215612bdd57600080fd5b81516125198161282e565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015612c385784516001600160a01b031683529383019391830191600101612c13565b50506001600160a01b03969096166060850152505050608001529392505050565b600080600060608486031215612c6e57600080fd5b835192506020840151915060408401519050925092509256fea2646970667358221220e9d68cb93f88b0a8700c09684f53f791abb42d3c8a2e1ac4fdf430fc65e57bd464736f6c634300080a0033

Deployed Bytecode Sourcemap

37642:17569:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16496:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18847:201;;;;;;;;;;-1:-1:-1;18847:201:0;;;;;:::i;:::-;;:::i;:::-;;;1237:14:1;;1230:22;1212:41;;1200:2;1185:18;18847:201:0;1072:187:1;39114:64:0;;;;;;;;;;-1:-1:-1;39114:64:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;37719:51;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1707:32:1;;;1689:51;;1677:2;1662:18;37719:51:0;1516:230:1;17616:108:0;;;;;;;;;;-1:-1:-1;17704:12:0;;17616:108;;;1897:25:1;;;1885:2;1870:18;17616:108:0;1751:177:1;47293:157:0;;;;;;;;;;-1:-1:-1;47293:157:0;;;;;:::i;:::-;;:::i;:::-;;38848:33;;;;;;;;;;;;;;;;38808;;;;;;;;;;;;;;;;44435:234;;;;;;;;;;-1:-1:-1;44435:234:0;;;;;:::i;:::-;;:::i;19628:295::-;;;;;;;;;;-1:-1:-1;19628:295:0;;;;;:::i;:::-;;:::i;37822:53::-;;;;;;;;;;;;37868:6;37822:53;;17458:93;;;;;;;;;;-1:-1:-1;17458:93:0;;17541:2;2929:36:1;;2917:2;2902:18;17458:93:0;2787:184:1;38769:26:0;;;;;;;;;;;;;;;;20332:238;;;;;;;;;;-1:-1:-1;20332:238:0;;;;;:::i;:::-;;:::i;42580:273::-;;;;;;;;;;-1:-1:-1;42580:273:0;;;;;:::i;:::-;;:::i;39280:23::-;;;;;;;;;;;;;;;;37777:38;;;;;;;;;;;;;;;38103:33;;;;;;;;;;-1:-1:-1;38103:33:0;;;;;;;;47464:125;;;;;;;;;;-1:-1:-1;47464:125:0;;;;;:::i;:::-;-1:-1:-1;;;;;47553:28:0;47529:4;47553:28;;;:19;:28;;;;;;;;;47464:125;38924:36;;;;;;;;;;-1:-1:-1;38924:36:0;;;;;;;;38626:28;;;;;;;;;;;;;;;;38210:31;;;;;;;;;;-1:-1:-1;38210:31:0;;;;;;;;;;;17787:127;;;;;;;;;;-1:-1:-1;17787:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;17888:18:0;17861:7;17888:18;;;;;;;;;;;;17787:127;9921:103;;;;;;;;;;;;;:::i;43212:120::-;;;;;;;;;;;;;:::i;44904:144::-;;;;;;;;;;-1:-1:-1;44904:144:0;;;;;:::i;:::-;;:::i;37914:30::-;;;;;;;;;;-1:-1:-1;37914:30:0;;;;-1:-1:-1;;;;;37914:30:0;;;38515;;;;;;;;;;;;;;;;45261:369;;;;;;;;;;-1:-1:-1;45261:369:0;;;;;:::i;:::-;;:::i;43041:115::-;;;;;;;;;;;;;:::i;9273:87::-;;;;;;;;;;-1:-1:-1;9346:6:0;;-1:-1:-1;;;;;9346:6:0;9273:87;;37951:24;;;;;;;;;;-1:-1:-1;37951:24:0;;;;-1:-1:-1;;;;;37951:24:0;;;38661:31;;;;;;;;;;;;;;;;45148:101;;;;;;;;;;-1:-1:-1;45148:101:0;;;;;:::i;:::-;;:::i;16715:104::-;;;;;;;;;;;;;:::i;46625:244::-;;;;;;;;;;-1:-1:-1;46625:244:0;;;;;:::i;:::-;;:::i;39187:41::-;;;;;;;;;;-1:-1:-1;39187:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;38589:24;;;;;;;;;;;;;;;;38888:27;;;;;;;;;;;;;;;;38737:25;;;;;;;;;;;;;;;;21073:436;;;;;;;;;;-1:-1:-1;21073:436:0;;;;;:::i;:::-;;:::i;18120:193::-;;;;;;;;;;-1:-1:-1;18120:193:0;;;;;:::i;:::-;;:::i;47073:208::-;;;;;;;;;;-1:-1:-1;47073:208:0;;;;;:::i;:::-;;:::i;39494:58::-;;;;;;;;;;-1:-1:-1;39494:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;38143:33;;;;;;;;;;-1:-1:-1;38143:33:0;;;;;;;;;;;39235:36;;;;;;;;;;-1:-1:-1;39235:36:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;46435:182;;;;;;;;;;-1:-1:-1;46435:182:0;;;;;:::i;:::-;;:::i;45642:378::-;;;;;;;;;;-1:-1:-1;45642:378:0;;;;;:::i;:::-;;:::i;44677:215::-;;;;;;;;;;-1:-1:-1;44677:215:0;;;;;:::i;:::-;;:::i;42861:126::-;;;;;;;;;;-1:-1:-1;42861:126:0;;;;;:::i;:::-;;:::i;38433:39::-;;;;;;;;;;-1:-1:-1;38433:39:0;;;;;;;;37988:35;;;;;;;;;;;;;;;;43606:385;;;;;;;;;;-1:-1:-1;43606:385:0;;;;;:::i;:::-;;:::i;38481:27::-;;;;;;;;;;;;;;;;18376:151;;;;;;;;;;-1:-1:-1;18376:151:0;;;;;:::i;:::-;;:::i;38030:33::-;;;;;;;;;;;;;;;;43397:134;;;;;;;;;;;;;:::i;38552:30::-;;;;;;;;;;;;;;;;46028:399;;;;;;;;;;-1:-1:-1;46028:399:0;;;;;:::i;:::-;;:::i;10179:201::-;;;;;;;;;;-1:-1:-1;10179:201:0;;;;;:::i;:::-;;:::i;44003:420::-;;;;;;;;;;-1:-1:-1;44003:420:0;;;;;:::i;:::-;;:::i;38699:31::-;;;;;;;;;;;;;;;;38070:24;;;;;;;;;;;;;;;;39310:26;;;;;;;;;;;;;;;;16496:100;16550:13;16583:5;16576:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16496:100;:::o;18847:201::-;18930:4;7904:10;18986:32;7904:10;19002:7;19011:6;18986:8;:32::i;:::-;-1:-1:-1;19036:4:0;;18847:201;-1:-1:-1;;;18847:201:0:o;47293:157::-;9159:13;:11;:13::i;:::-;47400:9:::1;::::0;47372:38:::1;::::0;-1:-1:-1;;;;;47400:9:0;;::::1;::::0;47372:38;::::1;::::0;::::1;::::0;47400:9:::1;::::0;47372:38:::1;47421:9;:21:::0;;-1:-1:-1;;;;;;47421:21:0::1;-1:-1:-1::0;;;;;47421:21:0;;;::::1;::::0;;;::::1;::::0;;47293:157::o;44435:234::-;9159:13;:11;:13::i;:::-;44554:4:::1;44548;44528:13;17704:12:::0;;;17616:108;44528:13:::1;:17;::::0;44544:1:::1;44528:17;:::i;:::-;:24;;;;:::i;:::-;44527:31;;;;:::i;:::-;44517:6;:41;;44509:101;;;::::0;-1:-1:-1;;;44509:101:0;;6421:2:1;44509:101:0::1;::::0;::::1;6403:21:1::0;6460:2;6440:18;;;6433:30;6499:34;6479:18;;;6472:62;-1:-1:-1;;;6550:18:1;;;6543:45;6605:19;;44509:101:0::1;;;;;;;;;44644:17;:6:::0;44654::::1;44644:17;:::i;:::-;44621:20;:40:::0;-1:-1:-1;44435:234:0:o;19628:295::-;19759:4;7904:10;19817:38;19833:4;7904:10;19848:6;19817:15;:38::i;:::-;19866:27;19876:4;19882:2;19886:6;19866:9;:27::i;:::-;-1:-1:-1;19911:4:0;;19628:295;-1:-1:-1;;;;19628:295:0:o;20332:238::-;20420:4;7904:10;20476:64;7904:10;20492:7;20529:10;20501:25;7904:10;20492:7;20501:9;:25::i;:::-;:38;;;;:::i;:::-;20476:8;:64::i;42580:273::-;9159:13;:11;:13::i;:::-;42690:6:::1;42685:161;42700:19:::0;;::::1;42685:161;;;42768:15;42741:9;:24;42751:10;;42762:1;42751:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;42741:24:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;42741:24:0;:42;;-1:-1:-1;;42741:42:0::1;::::0;::::1;;::::0;;;::::1;::::0;;42798:36:::1;42814:10:::0;;42825:1;42814:13;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;42829:4;42798:15;:36::i;:::-;42721:3:::0;::::1;::::0;::::1;:::i;:::-;;;;42685:161;;;;42580:273:::0;;;:::o;9921:103::-;9159:13;:11;:13::i;:::-;9986:30:::1;10013:1;9986:18;:30::i;:::-;9921:103::o:0;43212:120::-;43264:4;9159:13;:11;:13::i;:::-;-1:-1:-1;43280:14:0::1;:22:::0;;-1:-1:-1;;43280:22:0::1;::::0;;;43212:120;:::o;44904:144::-;9159:13;:11;:13::i;:::-;-1:-1:-1;;;;;44994:39:0;;;::::1;;::::0;;;:31:::1;:39;::::0;;;;:46;;-1:-1:-1;;44994:46:0::1;::::0;::::1;;::::0;;;::::1;::::0;;44904:144::o;45261:369::-;9159:13;:11;:13::i;:::-;45377:15:::1;:31:::0;;;45419:15:::1;:31:::0;;;45461:9:::1;:19:::0;;;45473:7;45506:33:::1;45437:13:::0;45395;45506:33:::1;:::i;:::-;:45;;;;:::i;:::-;45491:12;:60:::0;;;45586:2:::1;-1:-1:-1::0;45570:18:0::1;45562:60;;;::::0;-1:-1:-1;;;45562:60:0;;7242:2:1;45562:60:0::1;::::0;::::1;7224:21:1::0;7281:2;7261:18;;;7254:30;7320:31;7300:18;;;7293:59;7369:18;;45562:60:0::1;7040:353:1::0;45562:60:0::1;45261:369:::0;;;:::o;43041:115::-;9159:13;:11;:13::i;:::-;43096::::1;:20:::0;;-1:-1:-1;;43096:20:0::1;;;::::0;;43041:115::o;45148:101::-;9159:13;:11;:13::i;:::-;45220:11:::1;:21:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;45220:21:0;;::::1;::::0;;;::::1;::::0;;45148:101::o;16715:104::-;16771:13;16804:7;16797:14;;;;;:::i;46625:244::-;9159:13;:11;:13::i;:::-;46732::::1;-1:-1:-1::0;;;;;46724:21:0::1;:4;-1:-1:-1::0;;;;;46724:21:0::1;;;46716:91;;;::::0;-1:-1:-1;;;46716:91:0;;7600:2:1;46716:91:0::1;::::0;::::1;7582:21:1::0;7639:2;7619:18;;;7612:30;7678:34;7658:18;;;7651:62;7749:27;7729:18;;;7722:55;7794:19;;46716:91:0::1;7398:421:1::0;46716:91:0::1;46820:41;46849:4;46855:5;46820:28;:41::i;:::-;46625:244:::0;;:::o;21073:436::-;21166:4;7904:10;21166:4;21249:25;7904:10;21266:7;21249:9;:25::i;:::-;21222:52;;21313:15;21293:16;:35;;21285:85;;;;-1:-1:-1;;;21285:85:0;;8026:2:1;21285:85:0;;;8008:21:1;8065:2;8045:18;;;8038:30;8104:34;8084:18;;;8077:62;-1:-1:-1;;;8155:18:1;;;8148:35;8200:19;;21285:85:0;7824:401:1;21285:85:0;21406:60;21415:5;21422:7;21450:15;21431:16;:34;21406:8;:60::i;18120:193::-;18199:4;7904:10;18255:28;7904:10;18272:2;18276:6;18255:9;:28::i;47073:208::-;9159:13;:11;:13::i;:::-;47210:15:::1;::::0;47167:59:::1;::::0;-1:-1:-1;;;;;47210:15:0;;::::1;::::0;47167:59;::::1;::::0;::::1;::::0;47210:15:::1;::::0;47167:59:::1;47237:15;:36:::0;;-1:-1:-1;;;;;;47237:36:0::1;-1:-1:-1::0;;;;;47237:36:0;;;::::1;::::0;;;::::1;::::0;;47073:208::o;46435:182::-;9159:13;:11;:13::i;:::-;-1:-1:-1;;;;;46520:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;46520:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;46575:34;;1212:41:1;;;46575:34:0::1;::::0;1185:18:1;46575:34:0::1;;;;;;;46435:182:::0;;:::o;45642:378::-;9159:13;:11;:13::i;:::-;45759:16:::1;:32:::0;;;45802:16:::1;:32:::0;;;45845:10:::1;:20:::0;;;45858:7;45892:35:::1;45821:13:::0;45778;45892:35:::1;:::i;:::-;:48;;;;:::i;:::-;45876:13;:64:::0;;;45976:2:::1;-1:-1:-1::0;45959:19:0::1;45951:61;;;::::0;-1:-1:-1;;;45951:61:0;;8432:2:1;45951:61:0::1;::::0;::::1;8414:21:1::0;8471:2;8451:18;;;8444:30;8510:31;8490:18;;;8483:59;8559:18;;45951:61:0::1;8230:353:1::0;44677:215:0;9159:13;:11;:13::i;:::-;44799:4:::1;44793;44773:13;17704:12:::0;;;17616:108;44773:13:::1;:17;::::0;44789:1:::1;44773:17;:::i;:::-;:24;;;;:::i;:::-;44772:31;;;;:::i;:::-;44762:6;:41;;44754:90;;;::::0;-1:-1:-1;;;44754:90:0;;8790:2:1;44754:90:0::1;::::0;::::1;8772:21:1::0;8829:2;8809:18;;;8802:30;8868:34;8848:18;;;8841:62;-1:-1:-1;;;8919:18:1;;;8912:34;8963:19;;44754:90:0::1;8588:400:1::0;44754:90:0::1;44867:17;:6:::0;44877::::1;44867:17;:::i;:::-;44855:9;:29:::0;-1:-1:-1;44677:215:0:o;42861:126::-;9159:13;:11;:13::i;:::-;42945:16:::1;:34:::0;;-1:-1:-1;;42945:34:0::1;::::0;::::1;;::::0;;;::::1;::::0;;42861:126::o;43606:385::-;43687:4;9159:13;:11;:13::i;:::-;43744:6:::1;43724:13;17704:12:::0;;;17616:108;43724:13:::1;:17;::::0;43740:1:::1;43724:17;:::i;:::-;:26;;;;:::i;:::-;43711:9;:39;;43703:105;;;::::0;-1:-1:-1;;;43703:105:0;;9195:2:1;43703:105:0::1;::::0;::::1;9177:21:1::0;9234:2;9214:18;;;9207:30;9273:34;9253:18;;;9246:62;-1:-1:-1;;;9324:18:1;;;9317:51;9385:19;;43703:105:0::1;8993:417:1::0;43703:105:0::1;43861:4;43840:13;17704:12:::0;;;17616:108;43840:13:::1;:18;::::0;43856:2:::1;43840:18;:::i;:::-;:25;;;;:::i;:::-;43827:9;:38;;43819:101;;;::::0;-1:-1:-1;;;43819:101:0;;9617:2:1;43819:101:0::1;::::0;::::1;9599:21:1::0;9656:2;9636:18;;;9629:30;9695:34;9675:18;;;9668:62;-1:-1:-1;;;9746:18:1;;;9739:48;9804:19;;43819:101:0::1;9415:414:1::0;43819:101:0::1;-1:-1:-1::0;43931:18:0::1;:30:::0;;;43979:4:::1;9183:1;43606:385:::0;;;:::o;18376:151::-;-1:-1:-1;;;;;18492:18:0;;;18465:7;18492:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;18376:151::o;43397:134::-;43457:4;9159:13;:11;:13::i;:::-;-1:-1:-1;43473:20:0::1;:28:::0;;-1:-1:-1;;43473:28:0::1;::::0;;;43397:134;:::o;46028:399::-;9159:13;:11;:13::i;:::-;46120:10:::1;:17:::0;;;46148:16:::1;:23:::0;;;46182:9:::1;:15:::0;;;46208::::1;:21:::0;;;46256:16:::1;::::0;46133:4;;46256:35:::1;::::0;46133:4;;46256:35:::1;:::i;:::-;:48;;;;:::i;:::-;46240:13;:64:::0;;;46329:19:::1;::::0;46345:3;;46329:19:::1;:::i;:::-;46315:11;:33:::0;46410:9:::1;::::0;46392:15:::1;::::0;46374::::1;::::0;:33:::1;::::0;46392:15;46374:33:::1;:::i;:::-;:45;;;;:::i;:::-;46359:12;:60:::0;-1:-1:-1;;;46028:399:0:o;10179:201::-;9159:13;:11;:13::i;:::-;-1:-1:-1;;;;;10268:22:0;::::1;10260:73;;;::::0;-1:-1:-1;;;10260:73:0;;10036:2:1;10260:73:0::1;::::0;::::1;10018:21:1::0;10075:2;10055:18;;;10048:30;10114:34;10094:18;;;10087:62;-1:-1:-1;;;10165:18:1;;;10158:36;10211:19;;10260:73:0::1;9834:402:1::0;10260:73:0::1;10344:28;10363:8;10344:18;:28::i;:::-;10179:201:::0;:::o;44003:420::-;9159:13;:11;:13::i;:::-;44238:19:::1;:8:::0;44250:6:::1;44238:19;:::i;:::-;44215:20;:42:::0;44392:23:::1;:12:::0;44408:6:::1;44392:23;:::i;:::-;44380:9;:35:::0;-1:-1:-1;;44003:420:0:o;25100:380::-;-1:-1:-1;;;;;25236:19:0;;25228:68;;;;-1:-1:-1;;;25228:68:0;;10443:2:1;25228:68:0;;;10425:21:1;10482:2;10462:18;;;10455:30;10521:34;10501:18;;;10494:62;-1:-1:-1;;;10572:18:1;;;10565:34;10616:19;;25228:68:0;10241:400:1;25228:68:0;-1:-1:-1;;;;;25315:21:0;;25307:68;;;;-1:-1:-1;;;25307:68:0;;10848:2:1;25307:68:0;;;10830:21:1;10887:2;10867:18;;;10860:30;10926:34;10906:18;;;10899:62;-1:-1:-1;;;10977:18:1;;;10970:32;11019:19;;25307:68:0;10646:398:1;25307:68:0;-1:-1:-1;;;;;25388:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;25440:32;;1897:25:1;;;25440:32:0;;1870:18:1;25440:32:0;;;;;;;25100:380;;;:::o;9438:132::-;9346:6;;-1:-1:-1;;;;;9346:6:0;7904:10;9502:23;9494:68;;;;-1:-1:-1;;;9494:68:0;;11251:2:1;9494:68:0;;;11233:21:1;;;11270:18;;;11263:30;11329:34;11309:18;;;11302:62;11381:18;;9494:68:0;11049:356:1;25771:453:0;25906:24;25933:25;25943:5;25950:7;25933:9;:25::i;:::-;25906:52;;-1:-1:-1;;25973:16:0;:37;25969:248;;26055:6;26035:16;:26;;26027:68;;;;-1:-1:-1;;;26027:68:0;;11612:2:1;26027:68:0;;;11594:21:1;11651:2;11631:18;;;11624:30;11690:31;11670:18;;;11663:59;11739:18;;26027:68:0;11410:353:1;26027:68:0;26139:51;26148:5;26155:7;26183:6;26164:16;:25;26139:8;:51::i;47651:4745::-;-1:-1:-1;;;;;47783:18:0;;47775:68;;;;-1:-1:-1;;;47775:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;47862:16:0;;47854:64;;;;-1:-1:-1;;;47854:64:0;;;;;;;:::i;:::-;47943:11;47940:92;;47971:28;47987:4;47993:2;47997:1;47971:15;:28::i;47940:92::-;48055:14;;;;48052:1958;;;9346:6;;-1:-1:-1;;;;;48107:15:0;;;9346:6;;48107:15;;;;:49;;-1:-1:-1;9346:6:0;;-1:-1:-1;;;;;48143:13:0;;;9346:6;;48143:13;;48107:49;:86;;;;-1:-1:-1;;;;;;48177:16:0;;;;48107:86;:128;;;;-1:-1:-1;;;;;;48214:21:0;;48228:6;48214:21;;48107:128;:158;;;;-1:-1:-1;48257:8:0;;-1:-1:-1;;;48257:8:0;;;;48256:9;48107:158;48085:1914;;;48303:16;;;;48299:96;;;-1:-1:-1;;;;;48350:13:0;;;;;;:9;:13;;;;;;;;;:32;;-1:-1:-1;;;;;;48367:15:0;;;;;;:9;:15;;;;;;;;48350:32;48342:53;;;;-1:-1:-1;;;48342:53:0;;12780:2:1;48342:53:0;;;12762:21:1;12819:1;12799:18;;;12792:29;-1:-1:-1;;;12837:18:1;;;12830:38;12885:18;;48342:53:0;12578:331:1;48342:53:0;48420:13;;;;;;;48416:148;;-1:-1:-1;;;;;48465:25:0;;;;;;:19;:25;;;;;;;;;:52;;-1:-1:-1;;;;;;48494:23:0;;;;;;:19;:23;;;;;;;;48465:52;48457:87;;;;-1:-1:-1;;;48457:87:0;;13116:2:1;48457:87:0;;;13098:21:1;13155:2;13135:18;;;13128:30;-1:-1:-1;;;13174:18:1;;;13167:52;13236:18;;48457:87:0;12914:346:1;48457:87:0;48722:20;;;;48718:423;;;9346:6;;-1:-1:-1;;;;;48770:13:0;;;9346:6;;48770:13;;;;:47;;;48801:15;-1:-1:-1;;;;;48787:30:0;:2;-1:-1:-1;;;;;48787:30:0;;;48770:47;:79;;;;;48835:13;-1:-1:-1;;;;;48821:28:0;:2;-1:-1:-1;;;;;48821:28:0;;;48770:79;48766:356;;;48914:9;48885:39;;;;:28;:39;;;;;;48927:12;-1:-1:-1;48877:140:0;;;;-1:-1:-1;;;48877:140:0;;13467:2:1;48877:140:0;;;13449:21:1;13506:2;13486:18;;;13479:30;13545:34;13525:18;;;13518:62;13616:34;13596:18;;;13589:62;-1:-1:-1;;;13667:19:1;;;13660:40;13717:19;;48877:140:0;13265:477:1;48877:140:0;49073:9;49044:39;;;;:28;:39;;;;;49086:12;49044:54;;48766:356;-1:-1:-1;;;;;49210:31:0;;;;;;:25;:31;;;;;;;;:71;;;;-1:-1:-1;;;;;;49246:35:0;;;;;;:31;:35;;;;;;;;49245:36;49210:71;49206:778;;;49328:20;;49318:6;:30;;49310:96;;;;-1:-1:-1;;;49310:96:0;;13949:2:1;49310:96:0;;;13931:21:1;13988:2;13968:18;;;13961:30;14027:34;14007:18;;;14000:62;-1:-1:-1;;;14078:18:1;;;14071:51;14139:19;;49310:96:0;13747:417:1;49310:96:0;49467:9;;-1:-1:-1;;;;;17888:18:0;;17861:7;17888:18;;;;;;;;;;;49441:22;;:6;:22;:::i;:::-;:35;;49433:67;;;;-1:-1:-1;;;49433:67:0;;14371:2:1;49433:67:0;;;14353:21:1;14410:2;14390:18;;;14383:30;-1:-1:-1;;;14429:18:1;;;14422:49;14488:18;;49433:67:0;14169:343:1;49433:67:0;49206:778;;;-1:-1:-1;;;;;49594:29:0;;;;;;:25;:29;;;;;;;;:71;;;;-1:-1:-1;;;;;;49628:37:0;;;;;;:31;:37;;;;;;;;49627:38;49594:71;49590:394;;;49712:20;;49702:6;:30;;49694:97;;;;-1:-1:-1;;;49694:97:0;;14719:2:1;49694:97:0;;;14701:21:1;14758:2;14738:18;;;14731:30;14797:34;14777:18;;;14770:62;-1:-1:-1;;;14848:18:1;;;14841:52;14910:19;;49694:97:0;14517:418:1;49590:394:0;-1:-1:-1;;;;;49838:35:0;;;;;;:31;:35;;;;;;;;49834:150;;49931:9;;-1:-1:-1;;;;;17888:18:0;;17861:7;17888:18;;;;;;;;;;;49905:22;;:6;:22;:::i;:::-;:35;;49897:67;;;;-1:-1:-1;;;49897:67:0;;14371:2:1;49897:67:0;;;14353:21:1;14410:2;14390:18;;;14383:30;-1:-1:-1;;;14429:18:1;;;14422:49;14488:18;;49897:67:0;14169:343:1;49897:67:0;50089:4;50040:28;17888:18;;;;;;;;;;;50155;;50131:42;;;;;;;50204:35;;-1:-1:-1;50228:11:0;;;;;;;50204:35;:61;;;;-1:-1:-1;50257:8:0;;-1:-1:-1;;;50257:8:0;;;;50256:9;50204:61;:110;;;;-1:-1:-1;;;;;;50283:31:0;;;;;;:25;:31;;;;;;;;50282:32;50204:110;:153;;;;-1:-1:-1;;;;;;50332:25:0;;;;;;:19;:25;;;;;;;;50331:26;50204:153;:194;;;;-1:-1:-1;;;;;;50375:23:0;;;;;;:19;:23;;;;;;;;50374:24;50204:194;50186:338;;;50425:8;:15;;-1:-1:-1;;;;50425:15:0;-1:-1:-1;;;50425:15:0;;;50469:10;:8;:10::i;:::-;50496:8;:16;;-1:-1:-1;;;;50496:16:0;;;50186:338;50552:8;;-1:-1:-1;;;;;50661:25:0;;50536:12;50661:25;;;:19;:25;;;;;;50552:8;-1:-1:-1;;;50552:8:0;;;;;50551:9;;50661:25;;:52;;-1:-1:-1;;;;;;50690:23:0;;;;;;:19;:23;;;;;;;;50661:52;50658:99;;;-1:-1:-1;50740:5:0;50658:99;50774:16;;;;50773:17;:43;;;;;50805:11;;50794:8;;:22;50773:43;:78;;;;-1:-1:-1;;;;;;50820:31:0;;;;;;:25;:31;;;;;;;;50773:78;50769:154;;;50880:1;50868:8;;:13;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;50896:8:0;;;;;;:4;:8;;;;;:15;;-1:-1:-1;;50896:15:0;50907:4;50896:15;;;50769:154;50943:12;51047:7;51044:1299;;;-1:-1:-1;;;;;51098:29:0;;;;;;:25;:29;;;;;;;;:50;;;;;51147:1;51131:13;;:17;51098:50;51094:1074;;;-1:-1:-1;;;;;51172:10:0;;;;;;:4;:10;;;;;;;;51168:188;;;51214:32;51242:3;51214:23;51225:11;;51214:6;:10;;:23;;;;:::i;:::-;:27;;:32::i;:::-;51207:39;;51168:188;;;51302:34;51332:3;51302:25;51313:13;;51302:6;:10;;:25;;;;:::i;:34::-;51295:41;;51168:188;51596:13;;51577:16;;51570:23;;:4;:23;:::i;:::-;:39;;;;:::i;:::-;51548:18;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;;51664:13:0;;51651:10;;51644:17;;:4;:17;:::i;:::-;:33;;;;:::i;:::-;51628:12;;:49;;;;;;;:::i;:::-;;;;-1:-1:-1;;51744:13:0;;51725:16;;51718:23;;:4;:23;:::i;:::-;:39;;;;:::i;:::-;51696:18;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;51094:1074:0;;-1:-1:-1;51094:1074:0;;-1:-1:-1;;;;;51818:31:0;;;;;;:25;:31;;;;;;;;:51;;;;;51868:1;51853:12;;:16;51818:51;51815:353;;;51897:33;51926:3;51897:24;51908:12;;51897:6;:10;;:24;;;;:::i;:33::-;51890:40;;51996:12;;51978:15;;51971:4;:22;;;;:::i;:::-;:37;;;;:::i;:::-;51949:18;;:59;;;;;;;:::i;:::-;;;;-1:-1:-1;;52062:12:0;;52050:9;;52043:16;;:4;:16;:::i;:::-;:31;;;;:::i;:::-;52027:12;;:47;;;;;;;:::i;:::-;;;;-1:-1:-1;;52140:12:0;;52122:15;;52115:22;;:4;:22;:::i;:::-;:37;;;;:::i;:::-;52093:18;;:59;;;;;;;:::i;:::-;;;;-1:-1:-1;;51815:353:0;52199:8;;52196:93;;52231:42;52247:4;52261;52268;52231:15;:42::i;:::-;52317:14;52327:4;52317:14;;:::i;:::-;;;51044:1299;52355:33;52371:4;52377:2;52381:6;52355:15;:33::i;:::-;47764:4632;;;;47651:4745;;;:::o;10540:191::-;10633:6;;;-1:-1:-1;;;;;10650:17:0;;;-1:-1:-1;;;;;;10650:17:0;;;;;;;10683:40;;10633:6;;;10650:17;10633:6;;10683:40;;10614:16;;10683:40;10603:128;10540:191;:::o;46877:188::-;-1:-1:-1;;;;;46960:31:0;;;;;;:25;:31;;;;;;:39;;-1:-1:-1;;46960:39:0;;;;;;;;;;47017:40;;46960:39;;:31;47017:40;;;46877:188;;:::o;21979:840::-;-1:-1:-1;;;;;22110:18:0;;22102:68;;;;-1:-1:-1;;;22102:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22189:16:0;;22181:64;;;;-1:-1:-1;;;22181:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22331:15:0;;22309:19;22331:15;;;;;;;;;;;22365:21;;;;22357:72;;;;-1:-1:-1;;;22357:72:0;;15272:2:1;22357:72:0;;;15254:21:1;15311:2;15291:18;;;15284:30;15350:34;15330:18;;;15323:62;-1:-1:-1;;;15401:18:1;;;15394:36;15447:19;;22357:72:0;15070:402:1;22357:72:0;-1:-1:-1;;;;;22465:15:0;;;:9;:15;;;;;;;;;;;22483:20;;;22465:38;;22683:13;;;;;;;;;;:23;;;;;;22735:26;;1897:25:1;;;22683:13:0;;22735:26;;1870:18:1;22735:26:0;;;;;;;22774:37;45261:369;53542:1666;53625:4;53581:23;17888:18;;;;;;;;;;;53581:50;;53642:25;53712:12;;53691:18;;53670;;:39;;;;:::i;:::-;:54;;;;:::i;:::-;53642:82;-1:-1:-1;53735:12:0;53771:20;;;:46;;-1:-1:-1;53795:22:0;;53771:46;53768:60;;;53820:7;;;53542:1666::o;53768:60::-;53861:18;;:23;;53882:2;53861:23;:::i;:::-;53843:15;:41;53840:111;;;53916:18;;:23;;53937:2;53916:23;:::i;:::-;53898:41;;53840:111;54020:23;54105:1;54085:17;54064:18;;54046:15;:36;;;;:::i;:::-;:56;;;;:::i;:::-;:60;;;;:::i;:::-;54020:86;-1:-1:-1;54117:26:0;54146:36;:15;54020:86;54146:19;:36::i;:::-;54117:65;-1:-1:-1;54231:21:0;54265:36;54117:65;54265:16;:36::i;:::-;54323:18;54344:44;:21;54370:17;54344:25;:44::i;:::-;54323:65;;54409:23;54435:57;54474:17;54435:34;54450:18;;54435:10;:14;;:34;;;;:::i;:57::-;54409:83;;54503:17;54523:51;54556:17;54523:28;54538:12;;54523:10;:14;;:28;;;;:::i;:51::-;54503:71;-1:-1:-1;54605:23:0;54503:71;54631:28;54644:15;54631:10;:28;:::i;:::-;:40;;;;:::i;:::-;54723:1;54702:18;:22;;;54735:18;:22;;;54768:12;:16;;;54826:9;;54818:45;;54605:66;;-1:-1:-1;;;;;;54826:9:0;;54849;;54818:45;54723:1;54818:45;54849:9;54826;54818:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54805:58:0;;-1:-1:-1;;54887:19:0;;;;;:42;;;54928:1;54910:15;:19;54887:42;54884:210;;;54945:46;54958:15;54975;54945:12;:46::i;:::-;55063:18;;55011:71;;;15889:25:1;;;15945:2;15930:18;;15923:34;;;15973:18;;;15966:34;;;;55011:71:0;;;;;;15877:2:1;55011:71:0;;;54884:210;55145:15;;55137:63;;-1:-1:-1;;;;;55145:15:0;;;;55174:21;;55137:63;;;;55174:21;55145:15;55137:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;53542:1666:0:o;3718:98::-;3776:7;3803:5;3807:1;3803;:5;:::i;:::-;3796:12;3718:98;-1:-1:-1;;;3718:98:0:o;4117:::-;4175:7;4202:5;4206:1;4202;:5;:::i;3361:98::-;3419:7;3446:5;3450:1;3446;:5;:::i;52404:601::-;52556:16;;;52570:1;52556:16;;;;;;;;52532:21;;52556:16;;;;;;;;;;-1:-1:-1;52556:16:0;52532:40;;52601:4;52583;52588:1;52583:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;52583:23:0;;;-1:-1:-1;;;;;52583:23:0;;;;;52627:15;-1:-1:-1;;;;;52627:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52617:4;52622:1;52617:7;;;;;;;;:::i;:::-;;;;;;:32;-1:-1:-1;;;;;52617:32:0;;;-1:-1:-1;;;;;52617:32:0;;;;;52662:62;52679:4;52694:15;52712:11;52662:8;:62::i;:::-;52763:224;;-1:-1:-1;;;52763:224:0;;-1:-1:-1;;;;;52763:15:0;:66;;;;:224;;52844:11;;52870:1;;52914:4;;52941;;52961:15;;52763:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52459:546;52404:601;:::o;53017:517::-;53165:62;53182:4;53197:15;53215:11;53165:8;:62::i;:::-;53270:256;;-1:-1:-1;;;53270:256:0;;53342:4;53270:256;;;17725:34:1;17775:18;;;17768:34;;;53388:1:0;17818:18:1;;;17811:34;;;17861:18;;;17854:34;37868:6:0;17904:19:1;;;17897:44;53500:15:0;17957:19:1;;;17950:35;53270:15:0;-1:-1:-1;;;;;53270:31:0;;;;53309:9;;17659:19:1;;53270:256:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;53017:517;;:::o;14:597: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;;;452:6;449:1;446:13;443:91;;;522:1;517:2;508:6;497:9;493:22;489:31;482:42;443:91;-1:-1:-1;595:2:1;574:15;-1:-1:-1;;570:29:1;555:45;;;;602:2;551:54;;14:597;-1:-1:-1;;;14:597:1:o;616:131::-;-1:-1:-1;;;;;691:31:1;;681:42;;671:70;;737:1;734;727:12;752:315;820:6;828;881:2;869:9;860:7;856:23;852:32;849:52;;;897:1;894;887:12;849:52;936:9;923:23;955:31;980:5;955:31;:::i;:::-;1005:5;1057:2;1042:18;;;;1029:32;;-1:-1:-1;;;752:315:1:o;1264:247::-;1323:6;1376:2;1364:9;1355:7;1351:23;1347:32;1344:52;;;1392:1;1389;1382:12;1344:52;1431:9;1418:23;1450:31;1475:5;1450:31;:::i;1933:180::-;1992:6;2045:2;2033:9;2024:7;2020:23;2016:32;2013:52;;;2061:1;2058;2051:12;2013:52;-1:-1:-1;2084:23:1;;1933:180;-1:-1:-1;1933:180:1:o;2118:456::-;2195:6;2203;2211;2264:2;2252:9;2243:7;2239:23;2235:32;2232:52;;;2280:1;2277;2270:12;2232:52;2319:9;2306:23;2338:31;2363:5;2338:31;:::i;:::-;2388:5;-1:-1:-1;2445:2:1;2430:18;;2417:32;2458:33;2417:32;2458:33;:::i;:::-;2118:456;;2510:7;;-1:-1:-1;;;2564:2:1;2549:18;;;;2536:32;;2118:456::o;2976:160::-;3041:20;;3097:13;;3090:21;3080:32;;3070:60;;3126:1;3123;3116:12;3141:689;3233:6;3241;3249;3302:2;3290:9;3281:7;3277:23;3273:32;3270:52;;;3318:1;3315;3308:12;3270:52;3358:9;3345:23;3387:18;3428:2;3420:6;3417:14;3414:34;;;3444:1;3441;3434:12;3414:34;3482:6;3471:9;3467:22;3457:32;;3527:7;3520:4;3516:2;3512:13;3508:27;3498:55;;3549:1;3546;3539:12;3498:55;3589:2;3576:16;3615:2;3607:6;3604:14;3601:34;;;3631:1;3628;3621:12;3601:34;3686:7;3679:4;3669:6;3666:1;3662:14;3658:2;3654:23;3650:34;3647:47;3644:67;;;3707:1;3704;3697:12;3644:67;3738:4;3730:13;;;;-1:-1:-1;3762:6:1;-1:-1:-1;3787:37:1;;3803:20;;;-1:-1:-1;3787:37:1;:::i;:::-;3777:47;;3141:689;;;;;:::o;3835:315::-;3900:6;3908;3961:2;3949:9;3940:7;3936:23;3932:32;3929:52;;;3977:1;3974;3967:12;3929:52;4016:9;4003:23;4035:31;4060:5;4035:31;:::i;:::-;4085:5;-1:-1:-1;4109:35:1;4140:2;4125:18;;4109:35;:::i;:::-;4099:45;;3835:315;;;;;:::o;4155:316::-;4232:6;4240;4248;4301:2;4289:9;4280:7;4276:23;4272:32;4269:52;;;4317:1;4314;4307:12;4269:52;-1:-1:-1;;4340:23:1;;;4410:2;4395:18;;4382:32;;-1:-1:-1;4461:2:1;4446:18;;;4433:32;;4155:316;-1:-1:-1;4155:316:1:o;4476:180::-;4532:6;4585:2;4573:9;4564:7;4560:23;4556:32;4553:52;;;4601:1;4598;4591:12;4553:52;4624:26;4640:9;4624:26;:::i;4661:388::-;4729:6;4737;4790:2;4778:9;4769:7;4765:23;4761:32;4758:52;;;4806:1;4803;4796:12;4758:52;4845:9;4832:23;4864:31;4889:5;4864:31;:::i;:::-;4914:5;-1:-1:-1;4971:2:1;4956:18;;4943:32;4984:33;4943:32;4984:33;:::i;:::-;5036:7;5026:17;;;4661:388;;;;;:::o;5054:248::-;5122:6;5130;5183:2;5171:9;5162:7;5158:23;5154:32;5151:52;;;5199:1;5196;5189:12;5151:52;-1:-1:-1;;5222:23:1;;;5292:2;5277:18;;;5264:32;;-1:-1:-1;5054:248:1:o;5307:380::-;5386:1;5382:12;;;;5429;;;5450:61;;5504:4;5496:6;5492:17;5482:27;;5450:61;5557:2;5549:6;5546:14;5526:18;5523:38;5520:161;;;5603:10;5598:3;5594:20;5591:1;5584:31;5638:4;5635:1;5628:15;5666:4;5663:1;5656:15;5520:161;;5307:380;;;:::o;5692:127::-;5753:10;5748:3;5744:20;5741:1;5734:31;5784:4;5781:1;5774:15;5808:4;5805:1;5798:15;5824:168;5864:7;5930:1;5926;5922:6;5918:14;5915:1;5912:21;5907:1;5900:9;5893:17;5889:45;5886:71;;;5937:18;;:::i;:::-;-1:-1:-1;5977:9:1;;5824:168::o;5997:217::-;6037:1;6063;6053:132;;6107:10;6102:3;6098:20;6095:1;6088:31;6142:4;6139:1;6132:15;6170:4;6167:1;6160:15;6053:132;-1:-1:-1;6199:9:1;;5997:217::o;6635:128::-;6675:3;6706:1;6702:6;6699:1;6696:13;6693:39;;;6712:18;;:::i;:::-;-1:-1:-1;6748:9:1;;6635:128::o;6768:127::-;6829:10;6824:3;6820:20;6817:1;6810:31;6860:4;6857:1;6850:15;6884:4;6881:1;6874:15;6900:135;6939:3;-1:-1:-1;;6960:17:1;;6957:43;;;6980:18;;:::i;:::-;-1:-1:-1;7027:1:1;7016:13;;6900:135::o;11768:401::-;11970:2;11952:21;;;12009:2;11989:18;;;11982:30;12048:34;12043:2;12028:18;;12021:62;-1:-1:-1;;;12114:2:1;12099:18;;12092:35;12159:3;12144:19;;11768:401::o;12174:399::-;12376:2;12358:21;;;12415:2;12395:18;;;12388:30;12454:34;12449:2;12434:18;;12427:62;-1:-1:-1;;;12520:2:1;12505:18;;12498:33;12563:3;12548:19;;12174:399::o;14940:125::-;14980:4;15008:1;15005;15002:8;14999:34;;;15013:18;;:::i;:::-;-1:-1:-1;15050:9:1;;14940:125::o;16143:251::-;16213:6;16266:2;16254:9;16245:7;16241:23;16237:32;16234:52;;;16282:1;16279;16272:12;16234:52;16314:9;16308:16;16333:31;16358:5;16333:31;:::i;16399:980::-;16661:4;16709:3;16698:9;16694:19;16740:6;16729:9;16722:25;16766:2;16804:6;16799:2;16788:9;16784:18;16777:34;16847:3;16842:2;16831:9;16827:18;16820:31;16871:6;16906;16900:13;16937:6;16929;16922:22;16975:3;16964:9;16960:19;16953:26;;17014:2;17006:6;17002:15;16988:29;;17035:1;17045:195;17059:6;17056:1;17053:13;17045:195;;;17124:13;;-1:-1:-1;;;;;17120:39:1;17108:52;;17215:15;;;;17180:12;;;;17156:1;17074:9;17045:195;;;-1:-1:-1;;;;;;;17296:32:1;;;;17291:2;17276:18;;17269:60;-1:-1:-1;;;17360:3:1;17345:19;17338:35;17257:3;16399:980;-1:-1:-1;;;16399:980:1:o;17996:306::-;18084:6;18092;18100;18153:2;18141:9;18132:7;18128:23;18124:32;18121:52;;;18169:1;18166;18159:12;18121:52;18198:9;18192:16;18182:26;;18248:2;18237:9;18233:18;18227:25;18217:35;;18292:2;18281:9;18277:18;18271:25;18261:35;;17996:306;;;;;:::o

Swarm Source

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