ETH Price: $3,293.82 (-2.81%)

Token

BunnyInu (BUNNY)
 

Overview

Max Total Supply

1,000,000,000 BUNNY

Holders

143

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
Uniswap V2: Router 2
Balance
501 BUNNY

Value
$0.00
0x7a250d5630b4cf539739df2c5dacb4c659f2488d
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:
BunnyInu

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
Yes with 1000000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-12-27
*/

/**
 *Submitted for verification at Etherscan.io on 2021-12-27
*/

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

    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 {
        _transferOwnership(address(0));
    }

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

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

////// 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 _mint(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/Address.sol
// OpenZeppelin Contracts v4.4.0 (utils/Address.sol)

/* pragma solidity ^0.8.0; */

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

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

////// src/BunnyInu.sol

/* pragma solidity ^0.8.10; */

/* import {ERC20} from "lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol"; */
/* import {IERC20} from "lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol"; */
/* import {Ownable} from "lib/openzeppelin-contracts/contracts/access/Ownable.sol"; */
/* import {Address} from "lib/openzeppelin-contracts/contracts/utils/Address.sol"; */
/* import {SafeMath} from "lib/openzeppelin-contracts/contracts/utils/math/SafeMath.sol"; */

/* import {IUniswapV2Router02} from "./IUniswapV2Router02.sol"; */
/* import {IUniswapV2Factory} from "./IUniswapV2Factory.sol"; */
/* import {IUniswapV2Pair} from "./IUniswapV2Pair.sol"; */

contract BunnyInu is Ownable, IERC20 {
    using SafeMath for uint256;

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

    string public constant name_ = "BunnyInu";
    string public constant symbol_ = "BUNNY";
    uint8 public constant decimals_ = 18;
    uint256 public totalSupply_ = 0;
    address public owner_;

    address public constant UNISWAP_ROUTER = address(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
    address public constant DEAD = 0x000000000000000000000000000000000000dEaD;
    address public constant ZERO = 0x0000000000000000000000000000000000000000;
    IUniswapV2Router02 public uniswapV2Router;
    address public uniswapV2Pair;
    bool public mintingDisabled = false;
    bool public antibot = true;
    bool public sellCooldown = false;
    uint public sellCooldownSeconds;
    mapping(address => bool) public blacklist;
    mapping(address => uint256) private _txCounter;
    mapping(address => bool) public automatedMarketMakerPairs;
    mapping(address => bool) private _isExcludedFromFees;
    mapping(address => uint256) private _lastBuyTimestamp;
    address payable public developerWallet;
    address payable public marketingWallet;
    address payable public liquidityWallet;
    uint256 public buyTaxDevelopment;
    uint256 public buyTaxMarketing;
    uint256 public buyTaxLiquidity;
    uint256 public sellTaxDevelopment;
    uint256 public sellTaxMarketing;
    uint256 public sellTaxLiquidity;
    uint256 public maxTransactions;
    uint256 public maxWallet;
    uint256 public swapTokensAtAmount = 100000 * (10**18);
    uint256 public lastSwapTime;
    bool private swapping;

    constructor (
        address payable _developerWallet,
        address payable _marketingWallet,
        address payable _liquidityWallet,
        uint256 _buyTaxDevelopment,
        uint256 _buyTaxMarketing,
        uint256 _buyTaxLiquidity,
        uint256 _sellTaxDevelopment,
        uint256 _sellTaxMarketing,
        uint256 _sellTaxLiquidity,
        uint256 _maxTransactions,
        uint256 _maxWallet,
        uint256 _sellCooldownSeconds
    ) {
        developerWallet = _developerWallet;
        marketingWallet = _marketingWallet;
        liquidityWallet = _liquidityWallet;
        buyTaxDevelopment = _buyTaxDevelopment;
        buyTaxMarketing = _buyTaxMarketing;
        buyTaxLiquidity = _buyTaxLiquidity;
        sellTaxDevelopment = _sellTaxDevelopment;
        sellTaxMarketing = _sellTaxMarketing;
        sellTaxLiquidity = _sellTaxLiquidity;
        maxTransactions = _maxTransactions;
        maxWallet = _maxWallet;
        sellCooldownSeconds = _sellCooldownSeconds;

        owner_ = msg.sender;

        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(UNISWAP_ROUTER);

        address _uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()).createPair(address(this), _uniswapV2Router.WETH());

        uniswapV2Router = _uniswapV2Router;
        uniswapV2Pair = _uniswapV2Pair;

        _setAutomatedMarketMakerPair(_uniswapV2Pair, true);

        _mint(owner_, 1000000000 * 10**18);
        mintingDisabled = true;
    }

    function name() public view virtual returns (string memory) {
        return name_;
    }

    function symbol() public view virtual returns (string memory) {
        return symbol_;
    }

    function decimals() public view virtual returns (uint8) {
        return decimals_;
    }

    function totalSupply() public view virtual override returns (uint256) {
        return totalSupply_;
    }

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

    function balanceOf(
        address account
    ) public view virtual override returns (uint256) {
        return _balances[account];
    }

    function transfer(
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    function allowance(
        address _owner,
        address spender
    ) public view virtual override returns (uint256) {
        return _allowances[_owner][spender];
    }

    function approve(
        address spender,
        uint256 amount
    ) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    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");
        _approve(sender, _msgSender(), currentAllowance - amount);

        return true;
    }

    function increaseAllowance(
        address spender,
        uint256 addedValue
    ) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);
        return true;
    }

    function decreaseAllowance(
        address spender,
        uint256 subtractedValue
    ) public virtual returns (bool) {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        _approve(_msgSender(), spender, currentAllowance - subtractedValue);

        return true;
    }

    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");
        require(blacklist[sender] != true, "This sender is blacklisted");
        require(blacklist[recipient] != true, "This recipient is blacklisted");
        require(_txCounter[sender] < maxTransactions, "This address is at the max TX limit");
        require(recipient == owner() || recipient == uniswapV2Pair || recipient == address(uniswapV2Router) || recipient == developerWallet || recipient == marketingWallet || recipient == liquidityWallet || (_balances[recipient] + amount < totalSupply_ * maxWallet), "This address is at the max wallet limit"); // todo do we really need to check the router
        require(antibot == false || sender == owner_ || recipient == owner_, "Antibot is currently enabled");

        uint256 _maxTxAmount = (totalSupply_ * maxTransactions) / 10000;
        uint256 _maxWallet = (totalSupply_ * maxWallet) / 10000;
        require(
            sender == owner() || sender == uniswapV2Pair || amount <= _maxTxAmount,
            "TX Limit Exceeded"
        );

        if (sender != owner() && recipient != owner() && recipient != address(this) && recipient != address(0) && recipient != uniswapV2Pair) {
            uint256 currentBalance = balanceOf(recipient);
            require(currentBalance + amount <= _maxWallet, "ERC20: transfer puts recipient above max wallet");
        }

        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");

        // todo ensure the following two blocks work as intended
        if (sender == uniswapV2Pair && sellCooldown) {
            require(_lastBuyTimestamp[recipient] > block.timestamp - sellCooldownSeconds || recipient == owner_, "Sell cooldown enabled");
        }

        if (sender != uniswapV2Pair) {
            _lastBuyTimestamp[recipient] = block.timestamp;
        }

        _beforeTokenTransfer(sender, recipient, amount);

        uint256 contractTokenBalance = balanceOf(address(this));
        uint256 contractNativeBalance = address(this).balance;

        bool canSwap = contractTokenBalance >= swapTokensAtAmount;

        if (canSwap && !swapping && !automatedMarketMakerPairs[sender] && sender != address(uniswapV2Router) && sender != owner_ && recipient != owner_) {
            swapping = true;

            bool isBuy = true;

            if (sender == uniswapV2Pair || sender == address(uniswapV2Router) || sender == address(this)) {
                isBuy = false; // todo - test to ensure this works
            }

            _executeSwap(contractTokenBalance, contractNativeBalance, isBuy);

            lastSwapTime = block.timestamp;
            swapping = false;
        }

        bool takeFee = true;

        if (sender == uniswapV2Pair || recipient == uniswapV2Pair) {
            takeFee = true;
        }

        if (_isExcludedFromFees[sender] || _isExcludedFromFees[recipient]) {
            takeFee = false;
        }

        if (swapping) {
            takeFee = false;
        }

        if (sender == owner()) {
            takeFee = false;
        }

        uint totalFee = buyTaxDevelopment + buyTaxMarketing + buyTaxLiquidity;

        if (sender == uniswapV2Pair) {
            totalFee = sellTaxDevelopment + sellTaxMarketing + sellTaxLiquidity;
        }

        _txCounter[sender]++;

        if (takeFee) {
            uint256 fees = (amount * totalFee) / 10000;
            amount -= fees;
            _executeTransfer(sender, address(this), fees);
        }

        _executeTransfer(sender, recipient, amount);
    }

    function _executeTransfer(
        address sender,
        address recipient,
        uint256 amount
    ) private {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");
        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
        _balances[sender] = senderBalance - amount;
        _balances[recipient] += amount;
        emit Transfer(sender, recipient, amount);
    }

    function _mint(
        address account,
        uint256 amount
    ) internal virtual {
        require(!mintingDisabled, "No more tokens can be minted.");
        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);
    }

    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");
        _balances[account] = accountBalance - amount;
        totalSupply_ -= amount;

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

    function _approve(
        address holder,
        address spender,
        uint256 amount
    ) internal virtual {
        require(holder != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

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

    function swapTokensForNative(uint256 tokens) private {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();
        _approve(address(this), address(uniswapV2Router), tokens);
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokens,
            0, // accept any amount of native
            path,
            address(this),
            block.timestamp
        );
    }

    function addLiquidity(uint256 tokens, uint256 native) private {
        _approve(address(this), address(uniswapV2Router), tokens);
        uniswapV2Router.addLiquidityETH{value: native}(
            address(this),
            tokens,
            0,
            0,
            liquidityWallet,
            block.timestamp
        );
    }

    function _executeSwap(
        uint256 tokens,
        uint256 native,
        bool isBuy
    ) private {
        if (tokens <= 0) {
            return;
        }

        uint totalFee = buyTaxDevelopment + buyTaxMarketing + buyTaxLiquidity;

        if (!isBuy) {
            totalFee = sellTaxDevelopment + sellTaxMarketing + sellTaxLiquidity;
        }

        uint swapTokensDevelopment = (tokens * buyTaxDevelopment) / totalFee;
        uint swapTokensMarketing = (tokens * buyTaxMarketing) / totalFee;
        uint tokensForLiquidity = (tokens * buyTaxLiquidity) / totalFee;

        if (!isBuy) {
            swapTokensDevelopment = (tokens * sellTaxDevelopment) / totalFee;
            swapTokensMarketing = (tokens * sellTaxMarketing) / totalFee;
            tokensForLiquidity = (tokens * sellTaxLiquidity) / totalFee;
        }

        uint256 swapTokensLiquidity = tokensForLiquidity / 2;
        uint256 addTokensLiquidity = tokensForLiquidity - swapTokensLiquidity;

        uint256 swapTokensTotal = swapTokensDevelopment + swapTokensMarketing + swapTokensLiquidity;

        uint256 initNativeBal = address(this).balance;
        swapTokensForNative(swapTokensTotal);
        uint256 nativeSwapped = (address(this).balance - initNativeBal) + native;

        uint256 nativeDevelopment = (nativeSwapped * swapTokensDevelopment) / swapTokensTotal;
        uint256 nativeMarketing = (nativeSwapped * swapTokensMarketing) / swapTokensTotal;
        uint256 nativeLiquidity =  nativeSwapped - nativeDevelopment - nativeMarketing;

        if (nativeDevelopment > 0) {
            payable(developerWallet).transfer(nativeDevelopment);
        }

        if (nativeMarketing > 0) {
            payable(marketingWallet).transfer(nativeMarketing);
        }

        if (nativeLiquidity > 0) { // ? is this conditional necessary
            addLiquidity(addTokensLiquidity, nativeLiquidity);
        }
    }

    // Function to receive Ether. msg.data must be empty
    receive() external payable {}

    // Fallback function is called when msg.data is not empty
    fallback() external payable {}

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    function setAutomatedMarketMakerPair(
        address pair,
        bool value
    ) public onlyOwner {
        require(pair != uniswapV2Pair, "AMM pair can not be removed");
        _setAutomatedMarketMakerPair(pair, value);
    }

    function _setAutomatedMarketMakerPair(
        address pair,
        bool value
    ) private {
        require(automatedMarketMakerPairs[pair] != value, "AMM pair must be set to a new value");
        automatedMarketMakerPairs[pair] = value;
    }

    /* Deployer Functions */

    function toggleAntibot(
        bool _antibot
    ) external onlyOwner {
        antibot = !_antibot;
    }

    function toggleSellCooldown(
        bool _sellCooldown
    ) external onlyOwner {
        sellCooldown = !_sellCooldown;
    }

    function adjustSellCooldownSeconds(
        uint256 _sellCooldownSeconds
    ) external onlyOwner {
        sellCooldownSeconds = _sellCooldownSeconds;
    }

    function blacklistAddress(
        address toBlacklist
    ) external onlyOwner {
        blacklist[toBlacklist] = true;
    }

    function whitelistAddress(
        address toWhitelist
    ) external onlyOwner {
        blacklist[toWhitelist] = false;
    }

    function adjustDeveloperWallet(
        address payable _developerWallet
    ) external onlyOwner {
        developerWallet = _developerWallet;
    }

    function adjustMarketingWallet(
        address payable _marketingWallet
    ) external onlyOwner {
        marketingWallet = _marketingWallet;
    }

    function adjustLiquidityWallet(
        address payable _liquidityWallet
    ) external onlyOwner {
        liquidityWallet = _liquidityWallet;
    }

    function adjustBuyTaxDevelopment(
        uint256 _buyTaxDevelopment
    ) external onlyOwner {
        require(_buyTaxDevelopment <= 3333);
        buyTaxDevelopment = _buyTaxDevelopment;
    }

    function adjustBuyTaxMarketing(
        uint256 _buyTaxMarketing
    ) external onlyOwner {
        require(_buyTaxMarketing <= 3333);
        buyTaxMarketing = _buyTaxMarketing;
    }

    function adjustBuyTaxLiquidity(
        uint256 _buyTaxLiquidity
    ) external onlyOwner {
        require(_buyTaxLiquidity <= 3333);
        buyTaxLiquidity = _buyTaxLiquidity;
    }

    function adjustSellTaxDevelopment(
        uint256 _sellTaxDevelopment
    ) external onlyOwner {
        require(_sellTaxDevelopment <= 3333);
        sellTaxDevelopment = _sellTaxDevelopment;
    }

    function adjustSellTaxMarketing(
        uint256 _sellTaxMarketing
    ) external onlyOwner {
        require(_sellTaxMarketing <= 3333);
        sellTaxMarketing = _sellTaxMarketing;
    }

    function adjustSellTaxLiquidity(
        uint256 _sellTaxLiquidity
    ) external onlyOwner {
        require(_sellTaxLiquidity <= 3333);
        sellTaxLiquidity = _sellTaxLiquidity;
    }
    function adjustMaxTransactions(
        uint256 _maxTransactions
    ) external onlyOwner {
        maxTransactions = _maxTransactions;
    }

    function adjustMaxWallet(
        uint256 _maxWallet
    ) external onlyOwner {
        require(_maxWallet <= 10000);
        maxWallet = _maxWallet;
    }

    function adjustUniswapV2Router(
        address _newAddress
    ) external onlyOwner {
        require(_newAddress != address(uniswapV2Router), "The address must point to a new and different router");
        uniswapV2Router = IUniswapV2Router02(_newAddress);
        address _uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(address(this), uniswapV2Router.WETH());
        uniswapV2Pair = _uniswapV2Pair;
    }

    function transferOwnership(
        address _newOwner
    ) public override onlyOwner {
        require(_newOwner != address(0));
        emit OwnershipTransferred(owner_, _newOwner);
        owner_ = _newOwner;
    }

    function renounceOwnership() public override onlyOwner {
        emit OwnershipTransferred(owner_, address(0));
        owner_ = address(0);
    }

    function getAntibot() public view returns(bool) {
        return antibot;
    }

    function getSellCooldown() public view returns(bool) {
        return sellCooldown;
    }

    function getSellCooldownSeconds() public view returns(uint) {
        return sellCooldownSeconds;
    }

    function isBlacklist(
        address _query
    ) public view returns(bool) {
        return blacklist[_query];
    }

    function getDeveloperWallet() public view returns(address) {
        return developerWallet;
    }

    function getMarketingWallet() public view returns(address) {
        return marketingWallet;
    }

    function getLiquidityWallet() public view returns(address) {
        return liquidityWallet;
    }

    function getBuyTaxDevelopment() public view returns(uint) {
        return buyTaxDevelopment;
    }

    function getBuyTaxMarketing() public view returns(uint) {
        return buyTaxMarketing;
    }

    function getBuyTaxLiquidity() public view returns(uint) {
        return buyTaxLiquidity;
    }

    function getSellTaxDevelopment() public view returns(uint) {
        return sellTaxDevelopment;
    }

    function getSellTaxMarketing() public view returns(uint) {
        return sellTaxMarketing;
    }

    function getSellTaxLiquidity() public view returns(uint) {
        return sellTaxLiquidity;
    }

    function getMaxTransactions() public view returns(uint) {
        return maxTransactions;
    }

    function getMaxWallet() public view returns(uint) {
        return maxWallet;
    }

    function getUniswapV2Router() public view returns(IUniswapV2Router02) {
        return uniswapV2Router;
    }

    function getUniswapV2Pair() public view returns(address) {
        return uniswapV2Pair;
    }

    function getOwner() public view returns(address) {
        return owner_;
    }

    function isRenounced() public view returns(bool) {
        if  (owner_ == address(0)) {
            return true;
        } else {
            return false;
        }
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address payable","name":"_developerWallet","type":"address"},{"internalType":"address payable","name":"_marketingWallet","type":"address"},{"internalType":"address payable","name":"_liquidityWallet","type":"address"},{"internalType":"uint256","name":"_buyTaxDevelopment","type":"uint256"},{"internalType":"uint256","name":"_buyTaxMarketing","type":"uint256"},{"internalType":"uint256","name":"_buyTaxLiquidity","type":"uint256"},{"internalType":"uint256","name":"_sellTaxDevelopment","type":"uint256"},{"internalType":"uint256","name":"_sellTaxMarketing","type":"uint256"},{"internalType":"uint256","name":"_sellTaxLiquidity","type":"uint256"},{"internalType":"uint256","name":"_maxTransactions","type":"uint256"},{"internalType":"uint256","name":"_maxWallet","type":"uint256"},{"internalType":"uint256","name":"_sellCooldownSeconds","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","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"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"DEAD","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UNISWAP_ROUTER","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ZERO","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_buyTaxDevelopment","type":"uint256"}],"name":"adjustBuyTaxDevelopment","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_buyTaxLiquidity","type":"uint256"}],"name":"adjustBuyTaxLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_buyTaxMarketing","type":"uint256"}],"name":"adjustBuyTaxMarketing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_developerWallet","type":"address"}],"name":"adjustDeveloperWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_liquidityWallet","type":"address"}],"name":"adjustLiquidityWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_marketingWallet","type":"address"}],"name":"adjustMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxTransactions","type":"uint256"}],"name":"adjustMaxTransactions","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxWallet","type":"uint256"}],"name":"adjustMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_sellCooldownSeconds","type":"uint256"}],"name":"adjustSellCooldownSeconds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_sellTaxDevelopment","type":"uint256"}],"name":"adjustSellTaxDevelopment","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_sellTaxLiquidity","type":"uint256"}],"name":"adjustSellTaxLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_sellTaxMarketing","type":"uint256"}],"name":"adjustSellTaxMarketing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newAddress","type":"address"}],"name":"adjustUniswapV2Router","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":[],"name":"antibot","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[{"internalType":"address","name":"","type":"address"}],"name":"blacklist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"toBlacklist","type":"address"}],"name":"blacklistAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buyTaxDevelopment","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTaxLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTaxMarketing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"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":"developerWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAntibot","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBuyTaxDevelopment","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBuyTaxLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBuyTaxMarketing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDeveloperWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLiquidityWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMarketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxTransactions","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSellCooldown","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSellCooldownSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSellTaxDevelopment","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSellTaxLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSellTaxMarketing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getUniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getUniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_query","type":"address"}],"name":"isBlacklist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRenounced","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastSwapTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransactions","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":"mintingDisabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"owner_","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellCooldown","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellCooldownSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTaxDevelopment","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTaxLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTaxMarketing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol_","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_antibot","type":"bool"}],"name":"toggleAntibot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_sellCooldown","type":"bool"}],"name":"toggleSellCooldown","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply_","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"toWhitelist","type":"address"}],"name":"whitelistAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405260006003556006805462ffffff60a01b1916600160a81b17905569152d02c7e14af68000006018553480156200003957600080fd5b50604051620046a3380380620046a38339810160408190526200005c916200051f565b6200006733620002c9565b600d80546001600160a01b03808f166001600160a01b031992831617909255600e80548e8416908316179055600f8054928d169282169290921790915560108a90556011899055601288905560138790556014869055601585905560168490556017839055600782905560048054909116331781556040805163c45a015560e01b81529051737a250d5630b4cf539739df2c5dacb4c659f2488d92600092849263c45a0155928281019260209291908290030181865afa15801562000130573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001569190620005cd565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001a4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001ca9190620005cd565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af115801562000218573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200023e9190620005cd565b600580546001600160a01b038086166001600160a01b031992831617909255600680549284169290911691909117905590506200027d81600162000319565b600454620002a1906001600160a01b03166b033b2e3c9fd0803ce8000000620003c5565b50506006805460ff60a01b1916600160a01b179055506200061b9a5050505050505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0382166000908152600a602052604090205460ff16151581151514156200039a5760405162461bcd60e51b815260206004820152602360248201527f414d4d2070616972206d7573742062652073657420746f2061206e65772076616044820152626c756560e81b60648201526084015b60405180910390fd5b6001600160a01b03919091166000908152600a60205260409020805460ff1916911515919091179055565b600654600160a01b900460ff1615620004215760405162461bcd60e51b815260206004820152601d60248201527f4e6f206d6f726520746f6b656e732063616e206265206d696e7465642e000000604482015260640162000391565b6001600160a01b038216620004795760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640162000391565b80600360008282546200048d9190620005f4565b90915550506001600160a01b03821660009081526001602052604081208054839290620004bc908490620005f4565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6001600160a01b03811681146200051c57600080fd5b50565b6000806000806000806000806000806000806101808d8f0312156200054357600080fd5b8c51620005508162000506565b60208e0151909c50620005638162000506565b60408e0151909b50620005768162000506565b809a505060608d0151985060808d0151975060a08d0151965060c08d0151955060e08d015194506101008d015193506101208d015192506101408d015191506101608d015190509295989b509295989b509295989b565b600060208284031215620005e057600080fd5b8151620005ed8162000506565b9392505050565b600082198211156200061657634e487b7160e01b600052601160045260246000fd5b500190565b614078806200062b6000396000f3fe6080604052600436106105155760003560e01c806375f0a8741161029a578063c54d885a11610161578063e2f45605116100ca578063f2fde38b11610084578063f785ef721161006c578063f785ef7214611000578063f8b45b0514611015578063f9f92be41461102b57005b8063f2fde38b14610fc0578063f3290d7514610fe057005b8063e7d12341116100b2578063e7d1234114610f6b578063ea4c04b314610f8b578063eb7912fd14610fa057005b8063e2f4560514610f28578063e766307914610f3e57005b8063da9346131161011b578063dfd0831511610103578063dfd0831514610eaa578063e160fcf014610eca578063e2b9e18614610edf57005b8063da93461314610e41578063dd62ed3e14610e5757005b8063d469801611610149578063d469801614610dd7578063d5b3dc3914610e04578063d826492014610e1957005b8063c54d885a14610dac578063d279397014610dc157005b80639b98034711610203578063ab115cc2116101bd578063b27fea74116101a5578063b27fea7414610d3c578063b62496f514610d51578063b79cb2a014610d8157005b8063ab115cc214610cdd578063af17dea614610cf357005b8063a6f1e3f9116101eb578063a6f1e3f914610c87578063a9059cbb14610c9d578063a96c100514610cbd57005b80639b98034714610c47578063a457c2d714610c6757005b806395348e541161025457806397bb52f21161023c57806397bb52f214610bf15780639a7a23d614610c075780639b8cf3b914610c2757005b806395348e5414610b9557806395d89b4114610bab57005b8063893d20e811610282578063893d20e814610b385780638b0d753c14610b635780638da5cb5b14610b3857005b806375f0a87414610aeb57806388d2953d14610b1857005b806321afb5ee116103de5780633acdbc0a116103475780634e0e6d23116103015780635f489269116102e95780635f48926914610a7357806370a0823114610a93578063715018a614610ad657005b80634e0e6d2314610a3e57806358fa63ca14610a5e57005b8063415665851161032f57806341566585146109d1578063464051c0146109f157806349bd5a5e14610a1157005b80633acdbc0a1461099c5780633d410cc7146109bc57005b8063313ce56711610398578063333e99db11610380578063333e99db14610905578063395093511461094b57806339649a281461096b57005b8063313ce567146108cd578063324536eb146108ef57005b806323b872dd116103c657806323b872dd1461086457806324e1c18d14610884578063305c4c801461089a57005b806321afb5ee14610812578063227101b71461084457005b80630dd871571161048057806318160ddd1161043a5780631abfa629116104225780631abfa629146107885780631b2773c2146107b35780631d4e49eb146107e757005b806318160ddd14610746578063185870f91461075b57005b80630fa604e4116104685780630fa604e4146106e45780631171afbf146106f95780631694505e1461071957005b80630dd87157146106b85780630eff6427146106ce57005b806305632e17116104d157806309507bfb116104b957806309507bfb1461065e578063095ea7b3146106735780630a0fd01c146106a357005b806305632e17146105ef57806306fdde031461060f57005b806303fd2a45116104ff57806303fd2a451461058e5780630470d3ac146105a45780630512d120146105cf57005b80623612f51461051e57806271c1751461054257005b3661051c57005b005b34801561052a57600080fd5b506015545b6040519081526020015b60405180910390f35b34801561054e57600080fd5b5060055473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610539565b34801561059a57600080fd5b5061056961dead81565b3480156105b057600080fd5b50600d5473ffffffffffffffffffffffffffffffffffffffff16610569565b3480156105db57600080fd5b5061051c6105ea366004613c4e565b61105b565b3480156105fb57600080fd5b5061051c61060a366004613c4e565b6110f5565b34801561061b57600080fd5b5060408051808201909152600881527f42756e6e79496e7500000000000000000000000000000000000000000000000060208201525b6040516105399190613c67565b34801561066a57600080fd5b5060075461052f565b34801561067f57600080fd5b5061069361068e366004613cff565b61117b565b6040519015158152602001610539565b3480156106af57600080fd5b5060165461052f565b3480156106c457600080fd5b5061052f60195481565b3480156106da57600080fd5b5061052f60075481565b3480156106f057600080fd5b5060175461052f565b34801561070557600080fd5b5061051c610714366004613d2b565b611191565b34801561072557600080fd5b506005546105699073ffffffffffffffffffffffffffffffffffffffff1681565b34801561075257600080fd5b5060035461052f565b34801561076757600080fd5b50600d546105699073ffffffffffffffffffffffffffffffffffffffff1681565b34801561079457600080fd5b5060065473ffffffffffffffffffffffffffffffffffffffff16610569565b3480156107bf57600080fd5b5060065461069390760100000000000000000000000000000000000000000000900460ff1681565b3480156107f357600080fd5b50600e5473ffffffffffffffffffffffffffffffffffffffff16610569565b34801561081e57600080fd5b506006546106939074010000000000000000000000000000000000000000900460ff1681565b34801561085057600080fd5b5061051c61085f366004613d64565b611507565b34801561087057600080fd5b5061069361087f366004613d7f565b6115d0565b34801561089057600080fd5b5061052f60165481565b3480156108a657600080fd5b50600654610693907501000000000000000000000000000000000000000000900460ff1681565b3480156108d957600080fd5b5060125b60405160ff9091168152602001610539565b3480156108fb57600080fd5b5061052f60035481565b34801561091157600080fd5b50610693610920366004613d2b565b73ffffffffffffffffffffffffffffffffffffffff1660009081526008602052604090205460ff1690565b34801561095757600080fd5b50610693610966366004613cff565b6116bd565b34801561097757600080fd5b506006547501000000000000000000000000000000000000000000900460ff16610693565b3480156109a857600080fd5b5061051c6109b7366004613d2b565b611701565b3480156109c857600080fd5b5060105461052f565b3480156109dd57600080fd5b5061051c6109ec366004613d2b565b6117c9565b3480156109fd57600080fd5b5061051c610a0c366004613c4e565b611896565b348015610a1d57600080fd5b506006546105699073ffffffffffffffffffffffffffffffffffffffff1681565b348015610a4a57600080fd5b5061051c610a59366004613d2b565b61191c565b348015610a6a57600080fd5b50610569600081565b348015610a7f57600080fd5b5061051c610a8e366004613c4e565b6119e4565b348015610a9f57600080fd5b5061052f610aae366004613d2b565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205490565b348015610ae257600080fd5b5061051c611a79565b348015610af757600080fd5b50600e546105699073ffffffffffffffffffffffffffffffffffffffff1681565b348015610b2457600080fd5b5061051c610b33366004613c4e565b611b69565b348015610b4457600080fd5b5060045473ffffffffffffffffffffffffffffffffffffffff16610569565b348015610b6f57600080fd5b50600654760100000000000000000000000000000000000000000000900460ff16610693565b348015610ba157600080fd5b5061052f60145481565b348015610bb757600080fd5b5060408051808201909152600581527f42554e4e590000000000000000000000000000000000000000000000000000006020820152610651565b348015610bfd57600080fd5b5061052f60125481565b348015610c1357600080fd5b5061051c610c22366004613dc0565b611bfe565b348015610c3357600080fd5b5061051c610c42366004613c4e565b611d12565b348015610c5357600080fd5b5061051c610c62366004613c4e565b611da7565b348015610c7357600080fd5b50610693610c82366004613cff565b611e3c565b348015610c9357600080fd5b5061052f60155481565b348015610ca957600080fd5b50610693610cb8366004613cff565b611f16565b348015610cc957600080fd5b5061051c610cd8366004613c4e565b611f23565b348015610ce957600080fd5b5061052f60115481565b348015610cff57600080fd5b506106516040518060400160405280600581526020017f42554e4e5900000000000000000000000000000000000000000000000000000081525081565b348015610d4857600080fd5b5060115461052f565b348015610d5d57600080fd5b50610693610d6c366004613d2b565b600a6020526000908152604090205460ff1681565b348015610d8d57600080fd5b50600f5473ffffffffffffffffffffffffffffffffffffffff16610569565b348015610db857600080fd5b5060135461052f565b348015610dcd57600080fd5b5061052f60105481565b348015610de357600080fd5b50600f546105699073ffffffffffffffffffffffffffffffffffffffff1681565b348015610e1057600080fd5b5060145461052f565b348015610e2557600080fd5b50610569737a250d5630b4cf539739df2c5dacb4c659f2488d81565b348015610e4d57600080fd5b5061052f60135481565b348015610e6357600080fd5b5061052f610e72366004613df5565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260026020908152604080832093909416825291909152205490565b348015610eb657600080fd5b5061051c610ec5366004613d64565b611fb8565b348015610ed657600080fd5b50610693612082565b348015610eeb57600080fd5b506106516040518060400160405280600881526020017f42756e6e79496e7500000000000000000000000000000000000000000000000081525081565b348015610f3457600080fd5b5061052f60185481565b348015610f4a57600080fd5b506004546105699073ffffffffffffffffffffffffffffffffffffffff1681565b348015610f7757600080fd5b5061051c610f86366004613c4e565b6120ae565b348015610f9757600080fd5b5060125461052f565b348015610fac57600080fd5b5061051c610fbb366004613d2b565b612143565b348015610fcc57600080fd5b5061051c610fdb366004613d2b565b61220b565b348015610fec57600080fd5b5061051c610ffb366004613d2b565b61233a565b34801561100c57600080fd5b506108dd601281565b34801561102157600080fd5b5061052f60175481565b34801561103757600080fd5b50610693611046366004613d2b565b60086020526000908152604090205460ff1681565b60045473ffffffffffffffffffffffffffffffffffffffff1633146110e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b610d058111156110f057600080fd5b601055565b60045473ffffffffffffffffffffffffffffffffffffffff163314611176576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016110d8565b601655565b600061118833848461240a565b50600192915050565b60045473ffffffffffffffffffffffffffffffffffffffff163314611212576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016110d8565b60055473ffffffffffffffffffffffffffffffffffffffff828116911614156112bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f5468652061646472657373206d75737420706f696e7420746f2061206e65772060448201527f616e6420646966666572656e7420726f7574657200000000000000000000000060648201526084016110d8565b600580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8316908117909155604080517fc45a015500000000000000000000000000000000000000000000000000000000815290516000929163c45a01559160048083019260209291908290030181865afa158015611357573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061137b9190613e2e565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539630600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611404573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114289190613e2e565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff9283166004820152911660248201526044016020604051808303816000875af115801561149a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114be9190613e2e565b600680547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff929092169190911790555050565b60045473ffffffffffffffffffffffffffffffffffffffff163314611588576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016110d8565b600680547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff169115750100000000000000000000000000000000000000000002919091179055565b60006115dd8484846125bd565b73ffffffffffffffffffffffffffffffffffffffff841660009081526002602090815260408083203384529091529020548281101561169e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e636500000000000000000000000000000000000000000000000060648201526084016110d8565b6116b285336116ad8685613e7a565b61240a565b506001949350505050565b33600081815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490916111889185906116ad908690613e91565b60045473ffffffffffffffffffffffffffffffffffffffff163314611782576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016110d8565b600e80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60045473ffffffffffffffffffffffffffffffffffffffff16331461184a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016110d8565b73ffffffffffffffffffffffffffffffffffffffff16600090815260086020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b60045473ffffffffffffffffffffffffffffffffffffffff163314611917576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016110d8565b600755565b60045473ffffffffffffffffffffffffffffffffffffffff16331461199d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016110d8565b600d80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60045473ffffffffffffffffffffffffffffffffffffffff163314611a65576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016110d8565b610d05811115611a7457600080fd5b601355565b60045473ffffffffffffffffffffffffffffffffffffffff163314611afa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016110d8565b60045460405160009173ffffffffffffffffffffffffffffffffffffffff16907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600480547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60045473ffffffffffffffffffffffffffffffffffffffff163314611bea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016110d8565b610d05811115611bf957600080fd5b601555565b60045473ffffffffffffffffffffffffffffffffffffffff163314611c7f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016110d8565b60065473ffffffffffffffffffffffffffffffffffffffff83811691161415611d04576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f414d4d20706169722063616e206e6f742062652072656d6f766564000000000060448201526064016110d8565b611d0e8282613381565b5050565b60045473ffffffffffffffffffffffffffffffffffffffff163314611d93576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016110d8565b612710811115611da257600080fd5b601755565b60045473ffffffffffffffffffffffffffffffffffffffff163314611e28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016110d8565b610d05811115611e3757600080fd5b601455565b33600090815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616845290915281205482811015611efd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016110d8565b611f0c33856116ad8685613e7a565b5060019392505050565b60006111883384846125bd565b60045473ffffffffffffffffffffffffffffffffffffffff163314611fa4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016110d8565b610d05811115611fb357600080fd5b601155565b60045473ffffffffffffffffffffffffffffffffffffffff163314612039576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016110d8565b600680547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff16911576010000000000000000000000000000000000000000000002919091179055565b60045460009073ffffffffffffffffffffffffffffffffffffffff166120a85750600190565b50600090565b60045473ffffffffffffffffffffffffffffffffffffffff16331461212f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016110d8565b610d0581111561213e57600080fd5b601255565b60045473ffffffffffffffffffffffffffffffffffffffff1633146121c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016110d8565b600f80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60045473ffffffffffffffffffffffffffffffffffffffff16331461228c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016110d8565b73ffffffffffffffffffffffffffffffffffffffff81166122ac57600080fd5b60045460405173ffffffffffffffffffffffffffffffffffffffff8084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60045473ffffffffffffffffffffffffffffffffffffffff1633146123bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016110d8565b73ffffffffffffffffffffffffffffffffffffffff16600090815260086020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b73ffffffffffffffffffffffffffffffffffffffff83166124ac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016110d8565b73ffffffffffffffffffffffffffffffffffffffff821661254f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f737300000000000000000000000000000000000000000000000000000000000060648201526084016110d8565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8316612660576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016110d8565b73ffffffffffffffffffffffffffffffffffffffff8216612703576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f657373000000000000000000000000000000000000000000000000000000000060648201526084016110d8565b73ffffffffffffffffffffffffffffffffffffffff831660009081526008602052604090205460ff16151560011415612798576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f546869732073656e64657220697320626c61636b6c697374656400000000000060448201526064016110d8565b73ffffffffffffffffffffffffffffffffffffffff821660009081526008602052604090205460ff1615156001141561282d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f5468697320726563697069656e7420697320626c61636b6c697374656400000060448201526064016110d8565b60165473ffffffffffffffffffffffffffffffffffffffff8416600090815260096020526040902054106128e3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54686973206164647265737320697320617420746865206d6178205458206c6960448201527f6d6974000000000000000000000000000000000000000000000000000000000060648201526084016110d8565b60045473ffffffffffffffffffffffffffffffffffffffff83811691161480612926575060065473ffffffffffffffffffffffffffffffffffffffff8381169116145b8061294b575060055473ffffffffffffffffffffffffffffffffffffffff8381169116145b806129705750600d5473ffffffffffffffffffffffffffffffffffffffff8381169116145b806129955750600e5473ffffffffffffffffffffffffffffffffffffffff8381169116145b806129ba5750600f5473ffffffffffffffffffffffffffffffffffffffff8381169116145b80612a0357506017546003546129d09190613ea9565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260016020526040902054612a01908390613e91565b105b612a8f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f54686973206164647265737320697320617420746865206d61782077616c6c6560448201527f74206c696d69740000000000000000000000000000000000000000000000000060648201526084016110d8565b6006547501000000000000000000000000000000000000000000900460ff161580612ad4575060045473ffffffffffffffffffffffffffffffffffffffff8481169116145b80612af9575060045473ffffffffffffffffffffffffffffffffffffffff8381169116145b612b5f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f416e7469626f742069732063757272656e746c7920656e61626c65640000000060448201526064016110d8565b6000612710601654600354612b749190613ea9565b612b7e9190613ee6565b90506000612710601754600354612b959190613ea9565b612b9f9190613ee6565b9050612bc060045473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480612c13575060065473ffffffffffffffffffffffffffffffffffffffff8681169116145b80612c1e5750818311155b612c84576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f5458204c696d697420457863656564656400000000000000000000000000000060448201526064016110d8565b60045473ffffffffffffffffffffffffffffffffffffffff868116911614801590612cca575060045473ffffffffffffffffffffffffffffffffffffffff858116911614155b8015612cec575073ffffffffffffffffffffffffffffffffffffffff84163014155b8015612d0d575073ffffffffffffffffffffffffffffffffffffffff841615155b8015612d34575060065473ffffffffffffffffffffffffffffffffffffffff858116911614155b15612dfa5773ffffffffffffffffffffffffffffffffffffffff841660009081526001602052604090205481612d6a8583613e91565b1115612df8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f45524332303a207472616e73666572207075747320726563697069656e74206160448201527f626f7665206d61782077616c6c6574000000000000000000000000000000000060648201526084016110d8565b505b73ffffffffffffffffffffffffffffffffffffffff851660009081526001602052604090205483811015612eb0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e6365000000000000000000000000000000000000000000000000000060648201526084016110d8565b60065473ffffffffffffffffffffffffffffffffffffffff8781169116148015612ef65750600654760100000000000000000000000000000000000000000000900460ff165b15612fba57600754612f089042613e7a565b73ffffffffffffffffffffffffffffffffffffffff86166000908152600c60205260409020541180612f54575060045473ffffffffffffffffffffffffffffffffffffffff8681169116145b612fba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f53656c6c20636f6f6c646f776e20656e61626c6564000000000000000000000060448201526064016110d8565b60065473ffffffffffffffffffffffffffffffffffffffff8781169116146130055773ffffffffffffffffffffffffffffffffffffffff85166000908152600c602052604090204290555b3060009081526001602052604090205460185447908210801590819061302e5750601a5460ff16155b8015613060575073ffffffffffffffffffffffffffffffffffffffff89166000908152600a602052604090205460ff16155b8015613087575060055473ffffffffffffffffffffffffffffffffffffffff8a8116911614155b80156130ae575060045473ffffffffffffffffffffffffffffffffffffffff8a8116911614155b80156130d5575060045473ffffffffffffffffffffffffffffffffffffffff898116911614155b156131ad57601a80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915560065473ffffffffffffffffffffffffffffffffffffffff8b81169116148061314b575060055473ffffffffffffffffffffffffffffffffffffffff8b81169116145b8061316b575073ffffffffffffffffffffffffffffffffffffffff8a1630145b15613174575060005b61317f848483613493565b5042601955601a80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555b60065460019073ffffffffffffffffffffffffffffffffffffffff8b8116911614806131f3575060065473ffffffffffffffffffffffffffffffffffffffff8a81169116145b156131fc575060015b73ffffffffffffffffffffffffffffffffffffffff8a166000908152600b602052604090205460ff1680613255575073ffffffffffffffffffffffffffffffffffffffff89166000908152600b602052604090205460ff165b1561325e575060005b601a5460ff161561326d575060005b60045473ffffffffffffffffffffffffffffffffffffffff8b811691161415613294575060005b60006012546011546010546132a99190613e91565b6132b39190613e91565b60065490915073ffffffffffffffffffffffffffffffffffffffff8c8116911614156132f9576015546014546013546132ec9190613e91565b6132f69190613e91565b90505b73ffffffffffffffffffffffffffffffffffffffff8b16600090815260096020526040812080549161332a83613f21565b91905055508115613369576000612710613344838c613ea9565b61334e9190613ee6565b905061335a818b613e7a565b99506133678c30836136f7565b505b6133748b8b8b6136f7565b5050505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600a602052604090205460ff161515811515141561343d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f414d4d2070616972206d7573742062652073657420746f2061206e657720766160448201527f6c7565000000000000000000000000000000000000000000000000000000000060648201526084016110d8565b73ffffffffffffffffffffffffffffffffffffffff919091166000908152600a6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b600083116134a057505050565b60006012546011546010546134b59190613e91565b6134bf9190613e91565b9050816134e6576015546014546013546134d99190613e91565b6134e39190613e91565b90505b600081601054866134f79190613ea9565b6135019190613ee6565b9050600082601154876135149190613ea9565b61351e9190613ee6565b9050600083601254886135319190613ea9565b61353b9190613ee6565b9050846135945783601354886135519190613ea9565b61355b9190613ee6565b9250836014548861356c9190613ea9565b6135769190613ee6565b915083601554886135879190613ea9565b6135919190613ee6565b90505b60006135a1600283613ee6565b905060006135af8284613e7a565b90506000826135be8688613e91565b6135c89190613e91565b9050476135d4826139b4565b60008a6135e18347613e7a565b6135eb9190613e91565b90506000836135fa8a84613ea9565b6136049190613ee6565b90506000846136138a85613ea9565b61361d9190613ee6565b905060008161362c8486613e7a565b6136369190613e7a565b9050821561368757600d5460405173ffffffffffffffffffffffffffffffffffffffff9091169084156108fc029085906000818181858888f19350505050158015613685573d6000803e3d6000fd5b505b81156136d657600e5460405173ffffffffffffffffffffffffffffffffffffffff9091169083156108fc029084906000818181858888f193505050501580156136d4573d6000803e3d6000fd5b505b80156136e6576136e68782613b67565b505050505050505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff831661379a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016110d8565b73ffffffffffffffffffffffffffffffffffffffff821661383d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f657373000000000000000000000000000000000000000000000000000000000060648201526084016110d8565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260016020526040902054818110156138f3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e6365000000000000000000000000000000000000000000000000000060648201526084016110d8565b6138fd8282613e7a565b73ffffffffffffffffffffffffffffffffffffffff8086166000908152600160205260408082209390935590851681529081208054849290613940908490613e91565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516139a691815260200190565b60405180910390a350505050565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106139e9576139e9613f5a565b73ffffffffffffffffffffffffffffffffffffffff928316602091820292909201810191909152600554604080517fad5c46480000000000000000000000000000000000000000000000000000000081529051919093169263ad5c46489260048083019391928290030181865afa158015613a68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a8c9190613e2e565b81600181518110613a9f57613a9f613f5a565b73ffffffffffffffffffffffffffffffffffffffff9283166020918202929092010152600554613ad2913091168461240a565b6005546040517f791ac94700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063791ac94790613b31908590600090869030904290600401613f89565b600060405180830381600087803b158015613b4b57600080fd5b505af1158015613b5f573d6000803e3d6000fd5b505050505050565b600554613b8c90309073ffffffffffffffffffffffffffffffffffffffff168461240a565b600554600f546040517ff305d71900000000000000000000000000000000000000000000000000000000815230600482015260248101859052600060448201819052606482015273ffffffffffffffffffffffffffffffffffffffff91821660848201524260a482015291169063f305d71990839060c40160606040518083038185885af1158015613c22573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190613c479190614014565b5050505050565b600060208284031215613c6057600080fd5b5035919050565b600060208083528351808285015260005b81811015613c9457858101830151858201604001528201613c78565b81811115613ca6576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b73ffffffffffffffffffffffffffffffffffffffff81168114613cfc57600080fd5b50565b60008060408385031215613d1257600080fd5b8235613d1d81613cda565b946020939093013593505050565b600060208284031215613d3d57600080fd5b8135613d4881613cda565b9392505050565b80358015158114613d5f57600080fd5b919050565b600060208284031215613d7657600080fd5b613d4882613d4f565b600080600060608486031215613d9457600080fd5b8335613d9f81613cda565b92506020840135613daf81613cda565b929592945050506040919091013590565b60008060408385031215613dd357600080fd5b8235613dde81613cda565b9150613dec60208401613d4f565b90509250929050565b60008060408385031215613e0857600080fd5b8235613e1381613cda565b91506020830135613e2381613cda565b809150509250929050565b600060208284031215613e4057600080fd5b8151613d4881613cda565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015613e8c57613e8c613e4b565b500390565b60008219821115613ea457613ea4613e4b565b500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613ee157613ee1613e4b565b500290565b600082613f1c577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613f5357613f53613e4b565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015613fe657845173ffffffffffffffffffffffffffffffffffffffff1683529383019391830191600101613fb4565b505073ffffffffffffffffffffffffffffffffffffffff969096166060850152505050608001529392505050565b60008060006060848603121561402957600080fd5b835192506020840151915060408401519050925092509256fea2646970667358221220bfea6e4709869159c81012c609438e640e4b90a032d0b7dd48f94145881c60ea64736f6c634300080a00330000000000000000000000001efad6910885b9e3df294d61da26df5b5f14210600000000000000000000000089098494a5f6ba166f5262ef63c1d4dd0e350b40000000000000000000000000a01ae93e04099163a80df619affa28ec539c5d0000000000000000000000000000000000000000000000000000000000000000c8000000000000000000000000000000000000000000000000000000000000025800000000000000000000000000000000000000000000000000000000000000c800000000000000000000000000000000000000000000000000000000000005dc00000000000000000000000000000000000000000000000000000000000001f400000000000000000000000000000000000000000000000000000000000001f40000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000b4

Deployed Bytecode

0x6080604052600436106105155760003560e01c806375f0a8741161029a578063c54d885a11610161578063e2f45605116100ca578063f2fde38b11610084578063f785ef721161006c578063f785ef7214611000578063f8b45b0514611015578063f9f92be41461102b57005b8063f2fde38b14610fc0578063f3290d7514610fe057005b8063e7d12341116100b2578063e7d1234114610f6b578063ea4c04b314610f8b578063eb7912fd14610fa057005b8063e2f4560514610f28578063e766307914610f3e57005b8063da9346131161011b578063dfd0831511610103578063dfd0831514610eaa578063e160fcf014610eca578063e2b9e18614610edf57005b8063da93461314610e41578063dd62ed3e14610e5757005b8063d469801611610149578063d469801614610dd7578063d5b3dc3914610e04578063d826492014610e1957005b8063c54d885a14610dac578063d279397014610dc157005b80639b98034711610203578063ab115cc2116101bd578063b27fea74116101a5578063b27fea7414610d3c578063b62496f514610d51578063b79cb2a014610d8157005b8063ab115cc214610cdd578063af17dea614610cf357005b8063a6f1e3f9116101eb578063a6f1e3f914610c87578063a9059cbb14610c9d578063a96c100514610cbd57005b80639b98034714610c47578063a457c2d714610c6757005b806395348e541161025457806397bb52f21161023c57806397bb52f214610bf15780639a7a23d614610c075780639b8cf3b914610c2757005b806395348e5414610b9557806395d89b4114610bab57005b8063893d20e811610282578063893d20e814610b385780638b0d753c14610b635780638da5cb5b14610b3857005b806375f0a87414610aeb57806388d2953d14610b1857005b806321afb5ee116103de5780633acdbc0a116103475780634e0e6d23116103015780635f489269116102e95780635f48926914610a7357806370a0823114610a93578063715018a614610ad657005b80634e0e6d2314610a3e57806358fa63ca14610a5e57005b8063415665851161032f57806341566585146109d1578063464051c0146109f157806349bd5a5e14610a1157005b80633acdbc0a1461099c5780633d410cc7146109bc57005b8063313ce56711610398578063333e99db11610380578063333e99db14610905578063395093511461094b57806339649a281461096b57005b8063313ce567146108cd578063324536eb146108ef57005b806323b872dd116103c657806323b872dd1461086457806324e1c18d14610884578063305c4c801461089a57005b806321afb5ee14610812578063227101b71461084457005b80630dd871571161048057806318160ddd1161043a5780631abfa629116104225780631abfa629146107885780631b2773c2146107b35780631d4e49eb146107e757005b806318160ddd14610746578063185870f91461075b57005b80630fa604e4116104685780630fa604e4146106e45780631171afbf146106f95780631694505e1461071957005b80630dd87157146106b85780630eff6427146106ce57005b806305632e17116104d157806309507bfb116104b957806309507bfb1461065e578063095ea7b3146106735780630a0fd01c146106a357005b806305632e17146105ef57806306fdde031461060f57005b806303fd2a45116104ff57806303fd2a451461058e5780630470d3ac146105a45780630512d120146105cf57005b80623612f51461051e57806271c1751461054257005b3661051c57005b005b34801561052a57600080fd5b506015545b6040519081526020015b60405180910390f35b34801561054e57600080fd5b5060055473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610539565b34801561059a57600080fd5b5061056961dead81565b3480156105b057600080fd5b50600d5473ffffffffffffffffffffffffffffffffffffffff16610569565b3480156105db57600080fd5b5061051c6105ea366004613c4e565b61105b565b3480156105fb57600080fd5b5061051c61060a366004613c4e565b6110f5565b34801561061b57600080fd5b5060408051808201909152600881527f42756e6e79496e7500000000000000000000000000000000000000000000000060208201525b6040516105399190613c67565b34801561066a57600080fd5b5060075461052f565b34801561067f57600080fd5b5061069361068e366004613cff565b61117b565b6040519015158152602001610539565b3480156106af57600080fd5b5060165461052f565b3480156106c457600080fd5b5061052f60195481565b3480156106da57600080fd5b5061052f60075481565b3480156106f057600080fd5b5060175461052f565b34801561070557600080fd5b5061051c610714366004613d2b565b611191565b34801561072557600080fd5b506005546105699073ffffffffffffffffffffffffffffffffffffffff1681565b34801561075257600080fd5b5060035461052f565b34801561076757600080fd5b50600d546105699073ffffffffffffffffffffffffffffffffffffffff1681565b34801561079457600080fd5b5060065473ffffffffffffffffffffffffffffffffffffffff16610569565b3480156107bf57600080fd5b5060065461069390760100000000000000000000000000000000000000000000900460ff1681565b3480156107f357600080fd5b50600e5473ffffffffffffffffffffffffffffffffffffffff16610569565b34801561081e57600080fd5b506006546106939074010000000000000000000000000000000000000000900460ff1681565b34801561085057600080fd5b5061051c61085f366004613d64565b611507565b34801561087057600080fd5b5061069361087f366004613d7f565b6115d0565b34801561089057600080fd5b5061052f60165481565b3480156108a657600080fd5b50600654610693907501000000000000000000000000000000000000000000900460ff1681565b3480156108d957600080fd5b5060125b60405160ff9091168152602001610539565b3480156108fb57600080fd5b5061052f60035481565b34801561091157600080fd5b50610693610920366004613d2b565b73ffffffffffffffffffffffffffffffffffffffff1660009081526008602052604090205460ff1690565b34801561095757600080fd5b50610693610966366004613cff565b6116bd565b34801561097757600080fd5b506006547501000000000000000000000000000000000000000000900460ff16610693565b3480156109a857600080fd5b5061051c6109b7366004613d2b565b611701565b3480156109c857600080fd5b5060105461052f565b3480156109dd57600080fd5b5061051c6109ec366004613d2b565b6117c9565b3480156109fd57600080fd5b5061051c610a0c366004613c4e565b611896565b348015610a1d57600080fd5b506006546105699073ffffffffffffffffffffffffffffffffffffffff1681565b348015610a4a57600080fd5b5061051c610a59366004613d2b565b61191c565b348015610a6a57600080fd5b50610569600081565b348015610a7f57600080fd5b5061051c610a8e366004613c4e565b6119e4565b348015610a9f57600080fd5b5061052f610aae366004613d2b565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205490565b348015610ae257600080fd5b5061051c611a79565b348015610af757600080fd5b50600e546105699073ffffffffffffffffffffffffffffffffffffffff1681565b348015610b2457600080fd5b5061051c610b33366004613c4e565b611b69565b348015610b4457600080fd5b5060045473ffffffffffffffffffffffffffffffffffffffff16610569565b348015610b6f57600080fd5b50600654760100000000000000000000000000000000000000000000900460ff16610693565b348015610ba157600080fd5b5061052f60145481565b348015610bb757600080fd5b5060408051808201909152600581527f42554e4e590000000000000000000000000000000000000000000000000000006020820152610651565b348015610bfd57600080fd5b5061052f60125481565b348015610c1357600080fd5b5061051c610c22366004613dc0565b611bfe565b348015610c3357600080fd5b5061051c610c42366004613c4e565b611d12565b348015610c5357600080fd5b5061051c610c62366004613c4e565b611da7565b348015610c7357600080fd5b50610693610c82366004613cff565b611e3c565b348015610c9357600080fd5b5061052f60155481565b348015610ca957600080fd5b50610693610cb8366004613cff565b611f16565b348015610cc957600080fd5b5061051c610cd8366004613c4e565b611f23565b348015610ce957600080fd5b5061052f60115481565b348015610cff57600080fd5b506106516040518060400160405280600581526020017f42554e4e5900000000000000000000000000000000000000000000000000000081525081565b348015610d4857600080fd5b5060115461052f565b348015610d5d57600080fd5b50610693610d6c366004613d2b565b600a6020526000908152604090205460ff1681565b348015610d8d57600080fd5b50600f5473ffffffffffffffffffffffffffffffffffffffff16610569565b348015610db857600080fd5b5060135461052f565b348015610dcd57600080fd5b5061052f60105481565b348015610de357600080fd5b50600f546105699073ffffffffffffffffffffffffffffffffffffffff1681565b348015610e1057600080fd5b5060145461052f565b348015610e2557600080fd5b50610569737a250d5630b4cf539739df2c5dacb4c659f2488d81565b348015610e4d57600080fd5b5061052f60135481565b348015610e6357600080fd5b5061052f610e72366004613df5565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260026020908152604080832093909416825291909152205490565b348015610eb657600080fd5b5061051c610ec5366004613d64565b611fb8565b348015610ed657600080fd5b50610693612082565b348015610eeb57600080fd5b506106516040518060400160405280600881526020017f42756e6e79496e7500000000000000000000000000000000000000000000000081525081565b348015610f3457600080fd5b5061052f60185481565b348015610f4a57600080fd5b506004546105699073ffffffffffffffffffffffffffffffffffffffff1681565b348015610f7757600080fd5b5061051c610f86366004613c4e565b6120ae565b348015610f9757600080fd5b5060125461052f565b348015610fac57600080fd5b5061051c610fbb366004613d2b565b612143565b348015610fcc57600080fd5b5061051c610fdb366004613d2b565b61220b565b348015610fec57600080fd5b5061051c610ffb366004613d2b565b61233a565b34801561100c57600080fd5b506108dd601281565b34801561102157600080fd5b5061052f60175481565b34801561103757600080fd5b50610693611046366004613d2b565b60086020526000908152604090205460ff1681565b60045473ffffffffffffffffffffffffffffffffffffffff1633146110e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b610d058111156110f057600080fd5b601055565b60045473ffffffffffffffffffffffffffffffffffffffff163314611176576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016110d8565b601655565b600061118833848461240a565b50600192915050565b60045473ffffffffffffffffffffffffffffffffffffffff163314611212576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016110d8565b60055473ffffffffffffffffffffffffffffffffffffffff828116911614156112bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f5468652061646472657373206d75737420706f696e7420746f2061206e65772060448201527f616e6420646966666572656e7420726f7574657200000000000000000000000060648201526084016110d8565b600580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8316908117909155604080517fc45a015500000000000000000000000000000000000000000000000000000000815290516000929163c45a01559160048083019260209291908290030181865afa158015611357573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061137b9190613e2e565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539630600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611404573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114289190613e2e565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff9283166004820152911660248201526044016020604051808303816000875af115801561149a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114be9190613e2e565b600680547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff929092169190911790555050565b60045473ffffffffffffffffffffffffffffffffffffffff163314611588576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016110d8565b600680547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff169115750100000000000000000000000000000000000000000002919091179055565b60006115dd8484846125bd565b73ffffffffffffffffffffffffffffffffffffffff841660009081526002602090815260408083203384529091529020548281101561169e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e636500000000000000000000000000000000000000000000000060648201526084016110d8565b6116b285336116ad8685613e7a565b61240a565b506001949350505050565b33600081815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490916111889185906116ad908690613e91565b60045473ffffffffffffffffffffffffffffffffffffffff163314611782576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016110d8565b600e80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60045473ffffffffffffffffffffffffffffffffffffffff16331461184a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016110d8565b73ffffffffffffffffffffffffffffffffffffffff16600090815260086020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b60045473ffffffffffffffffffffffffffffffffffffffff163314611917576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016110d8565b600755565b60045473ffffffffffffffffffffffffffffffffffffffff16331461199d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016110d8565b600d80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60045473ffffffffffffffffffffffffffffffffffffffff163314611a65576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016110d8565b610d05811115611a7457600080fd5b601355565b60045473ffffffffffffffffffffffffffffffffffffffff163314611afa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016110d8565b60045460405160009173ffffffffffffffffffffffffffffffffffffffff16907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600480547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60045473ffffffffffffffffffffffffffffffffffffffff163314611bea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016110d8565b610d05811115611bf957600080fd5b601555565b60045473ffffffffffffffffffffffffffffffffffffffff163314611c7f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016110d8565b60065473ffffffffffffffffffffffffffffffffffffffff83811691161415611d04576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f414d4d20706169722063616e206e6f742062652072656d6f766564000000000060448201526064016110d8565b611d0e8282613381565b5050565b60045473ffffffffffffffffffffffffffffffffffffffff163314611d93576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016110d8565b612710811115611da257600080fd5b601755565b60045473ffffffffffffffffffffffffffffffffffffffff163314611e28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016110d8565b610d05811115611e3757600080fd5b601455565b33600090815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616845290915281205482811015611efd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016110d8565b611f0c33856116ad8685613e7a565b5060019392505050565b60006111883384846125bd565b60045473ffffffffffffffffffffffffffffffffffffffff163314611fa4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016110d8565b610d05811115611fb357600080fd5b601155565b60045473ffffffffffffffffffffffffffffffffffffffff163314612039576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016110d8565b600680547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff16911576010000000000000000000000000000000000000000000002919091179055565b60045460009073ffffffffffffffffffffffffffffffffffffffff166120a85750600190565b50600090565b60045473ffffffffffffffffffffffffffffffffffffffff16331461212f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016110d8565b610d0581111561213e57600080fd5b601255565b60045473ffffffffffffffffffffffffffffffffffffffff1633146121c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016110d8565b600f80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60045473ffffffffffffffffffffffffffffffffffffffff16331461228c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016110d8565b73ffffffffffffffffffffffffffffffffffffffff81166122ac57600080fd5b60045460405173ffffffffffffffffffffffffffffffffffffffff8084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60045473ffffffffffffffffffffffffffffffffffffffff1633146123bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016110d8565b73ffffffffffffffffffffffffffffffffffffffff16600090815260086020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b73ffffffffffffffffffffffffffffffffffffffff83166124ac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016110d8565b73ffffffffffffffffffffffffffffffffffffffff821661254f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f737300000000000000000000000000000000000000000000000000000000000060648201526084016110d8565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8316612660576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016110d8565b73ffffffffffffffffffffffffffffffffffffffff8216612703576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f657373000000000000000000000000000000000000000000000000000000000060648201526084016110d8565b73ffffffffffffffffffffffffffffffffffffffff831660009081526008602052604090205460ff16151560011415612798576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f546869732073656e64657220697320626c61636b6c697374656400000000000060448201526064016110d8565b73ffffffffffffffffffffffffffffffffffffffff821660009081526008602052604090205460ff1615156001141561282d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f5468697320726563697069656e7420697320626c61636b6c697374656400000060448201526064016110d8565b60165473ffffffffffffffffffffffffffffffffffffffff8416600090815260096020526040902054106128e3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54686973206164647265737320697320617420746865206d6178205458206c6960448201527f6d6974000000000000000000000000000000000000000000000000000000000060648201526084016110d8565b60045473ffffffffffffffffffffffffffffffffffffffff83811691161480612926575060065473ffffffffffffffffffffffffffffffffffffffff8381169116145b8061294b575060055473ffffffffffffffffffffffffffffffffffffffff8381169116145b806129705750600d5473ffffffffffffffffffffffffffffffffffffffff8381169116145b806129955750600e5473ffffffffffffffffffffffffffffffffffffffff8381169116145b806129ba5750600f5473ffffffffffffffffffffffffffffffffffffffff8381169116145b80612a0357506017546003546129d09190613ea9565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260016020526040902054612a01908390613e91565b105b612a8f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f54686973206164647265737320697320617420746865206d61782077616c6c6560448201527f74206c696d69740000000000000000000000000000000000000000000000000060648201526084016110d8565b6006547501000000000000000000000000000000000000000000900460ff161580612ad4575060045473ffffffffffffffffffffffffffffffffffffffff8481169116145b80612af9575060045473ffffffffffffffffffffffffffffffffffffffff8381169116145b612b5f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f416e7469626f742069732063757272656e746c7920656e61626c65640000000060448201526064016110d8565b6000612710601654600354612b749190613ea9565b612b7e9190613ee6565b90506000612710601754600354612b959190613ea9565b612b9f9190613ee6565b9050612bc060045473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480612c13575060065473ffffffffffffffffffffffffffffffffffffffff8681169116145b80612c1e5750818311155b612c84576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f5458204c696d697420457863656564656400000000000000000000000000000060448201526064016110d8565b60045473ffffffffffffffffffffffffffffffffffffffff868116911614801590612cca575060045473ffffffffffffffffffffffffffffffffffffffff858116911614155b8015612cec575073ffffffffffffffffffffffffffffffffffffffff84163014155b8015612d0d575073ffffffffffffffffffffffffffffffffffffffff841615155b8015612d34575060065473ffffffffffffffffffffffffffffffffffffffff858116911614155b15612dfa5773ffffffffffffffffffffffffffffffffffffffff841660009081526001602052604090205481612d6a8583613e91565b1115612df8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f45524332303a207472616e73666572207075747320726563697069656e74206160448201527f626f7665206d61782077616c6c6574000000000000000000000000000000000060648201526084016110d8565b505b73ffffffffffffffffffffffffffffffffffffffff851660009081526001602052604090205483811015612eb0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e6365000000000000000000000000000000000000000000000000000060648201526084016110d8565b60065473ffffffffffffffffffffffffffffffffffffffff8781169116148015612ef65750600654760100000000000000000000000000000000000000000000900460ff165b15612fba57600754612f089042613e7a565b73ffffffffffffffffffffffffffffffffffffffff86166000908152600c60205260409020541180612f54575060045473ffffffffffffffffffffffffffffffffffffffff8681169116145b612fba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f53656c6c20636f6f6c646f776e20656e61626c6564000000000000000000000060448201526064016110d8565b60065473ffffffffffffffffffffffffffffffffffffffff8781169116146130055773ffffffffffffffffffffffffffffffffffffffff85166000908152600c602052604090204290555b3060009081526001602052604090205460185447908210801590819061302e5750601a5460ff16155b8015613060575073ffffffffffffffffffffffffffffffffffffffff89166000908152600a602052604090205460ff16155b8015613087575060055473ffffffffffffffffffffffffffffffffffffffff8a8116911614155b80156130ae575060045473ffffffffffffffffffffffffffffffffffffffff8a8116911614155b80156130d5575060045473ffffffffffffffffffffffffffffffffffffffff898116911614155b156131ad57601a80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915560065473ffffffffffffffffffffffffffffffffffffffff8b81169116148061314b575060055473ffffffffffffffffffffffffffffffffffffffff8b81169116145b8061316b575073ffffffffffffffffffffffffffffffffffffffff8a1630145b15613174575060005b61317f848483613493565b5042601955601a80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555b60065460019073ffffffffffffffffffffffffffffffffffffffff8b8116911614806131f3575060065473ffffffffffffffffffffffffffffffffffffffff8a81169116145b156131fc575060015b73ffffffffffffffffffffffffffffffffffffffff8a166000908152600b602052604090205460ff1680613255575073ffffffffffffffffffffffffffffffffffffffff89166000908152600b602052604090205460ff165b1561325e575060005b601a5460ff161561326d575060005b60045473ffffffffffffffffffffffffffffffffffffffff8b811691161415613294575060005b60006012546011546010546132a99190613e91565b6132b39190613e91565b60065490915073ffffffffffffffffffffffffffffffffffffffff8c8116911614156132f9576015546014546013546132ec9190613e91565b6132f69190613e91565b90505b73ffffffffffffffffffffffffffffffffffffffff8b16600090815260096020526040812080549161332a83613f21565b91905055508115613369576000612710613344838c613ea9565b61334e9190613ee6565b905061335a818b613e7a565b99506133678c30836136f7565b505b6133748b8b8b6136f7565b5050505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600a602052604090205460ff161515811515141561343d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f414d4d2070616972206d7573742062652073657420746f2061206e657720766160448201527f6c7565000000000000000000000000000000000000000000000000000000000060648201526084016110d8565b73ffffffffffffffffffffffffffffffffffffffff919091166000908152600a6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b600083116134a057505050565b60006012546011546010546134b59190613e91565b6134bf9190613e91565b9050816134e6576015546014546013546134d99190613e91565b6134e39190613e91565b90505b600081601054866134f79190613ea9565b6135019190613ee6565b9050600082601154876135149190613ea9565b61351e9190613ee6565b9050600083601254886135319190613ea9565b61353b9190613ee6565b9050846135945783601354886135519190613ea9565b61355b9190613ee6565b9250836014548861356c9190613ea9565b6135769190613ee6565b915083601554886135879190613ea9565b6135919190613ee6565b90505b60006135a1600283613ee6565b905060006135af8284613e7a565b90506000826135be8688613e91565b6135c89190613e91565b9050476135d4826139b4565b60008a6135e18347613e7a565b6135eb9190613e91565b90506000836135fa8a84613ea9565b6136049190613ee6565b90506000846136138a85613ea9565b61361d9190613ee6565b905060008161362c8486613e7a565b6136369190613e7a565b9050821561368757600d5460405173ffffffffffffffffffffffffffffffffffffffff9091169084156108fc029085906000818181858888f19350505050158015613685573d6000803e3d6000fd5b505b81156136d657600e5460405173ffffffffffffffffffffffffffffffffffffffff9091169083156108fc029084906000818181858888f193505050501580156136d4573d6000803e3d6000fd5b505b80156136e6576136e68782613b67565b505050505050505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff831661379a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016110d8565b73ffffffffffffffffffffffffffffffffffffffff821661383d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f657373000000000000000000000000000000000000000000000000000000000060648201526084016110d8565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260016020526040902054818110156138f3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e6365000000000000000000000000000000000000000000000000000060648201526084016110d8565b6138fd8282613e7a565b73ffffffffffffffffffffffffffffffffffffffff8086166000908152600160205260408082209390935590851681529081208054849290613940908490613e91565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516139a691815260200190565b60405180910390a350505050565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106139e9576139e9613f5a565b73ffffffffffffffffffffffffffffffffffffffff928316602091820292909201810191909152600554604080517fad5c46480000000000000000000000000000000000000000000000000000000081529051919093169263ad5c46489260048083019391928290030181865afa158015613a68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a8c9190613e2e565b81600181518110613a9f57613a9f613f5a565b73ffffffffffffffffffffffffffffffffffffffff9283166020918202929092010152600554613ad2913091168461240a565b6005546040517f791ac94700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063791ac94790613b31908590600090869030904290600401613f89565b600060405180830381600087803b158015613b4b57600080fd5b505af1158015613b5f573d6000803e3d6000fd5b505050505050565b600554613b8c90309073ffffffffffffffffffffffffffffffffffffffff168461240a565b600554600f546040517ff305d71900000000000000000000000000000000000000000000000000000000815230600482015260248101859052600060448201819052606482015273ffffffffffffffffffffffffffffffffffffffff91821660848201524260a482015291169063f305d71990839060c40160606040518083038185885af1158015613c22573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190613c479190614014565b5050505050565b600060208284031215613c6057600080fd5b5035919050565b600060208083528351808285015260005b81811015613c9457858101830151858201604001528201613c78565b81811115613ca6576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b73ffffffffffffffffffffffffffffffffffffffff81168114613cfc57600080fd5b50565b60008060408385031215613d1257600080fd5b8235613d1d81613cda565b946020939093013593505050565b600060208284031215613d3d57600080fd5b8135613d4881613cda565b9392505050565b80358015158114613d5f57600080fd5b919050565b600060208284031215613d7657600080fd5b613d4882613d4f565b600080600060608486031215613d9457600080fd5b8335613d9f81613cda565b92506020840135613daf81613cda565b929592945050506040919091013590565b60008060408385031215613dd357600080fd5b8235613dde81613cda565b9150613dec60208401613d4f565b90509250929050565b60008060408385031215613e0857600080fd5b8235613e1381613cda565b91506020830135613e2381613cda565b809150509250929050565b600060208284031215613e4057600080fd5b8151613d4881613cda565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015613e8c57613e8c613e4b565b500390565b60008219821115613ea457613ea4613e4b565b500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613ee157613ee1613e4b565b500290565b600082613f1c577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613f5357613f53613e4b565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015613fe657845173ffffffffffffffffffffffffffffffffffffffff1683529383019391830191600101613fb4565b505073ffffffffffffffffffffffffffffffffffffffff969096166060850152505050608001529392505050565b60008060006060848603121561402957600080fd5b835192506020840151915060408401519050925092509256fea2646970667358221220bfea6e4709869159c81012c609438e640e4b90a032d0b7dd48f94145881c60ea64736f6c634300080a0033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000001efad6910885b9e3df294d61da26df5b5f14210600000000000000000000000089098494a5f6ba166f5262ef63c1d4dd0e350b40000000000000000000000000a01ae93e04099163a80df619affa28ec539c5d0000000000000000000000000000000000000000000000000000000000000000c8000000000000000000000000000000000000000000000000000000000000025800000000000000000000000000000000000000000000000000000000000000c800000000000000000000000000000000000000000000000000000000000005dc00000000000000000000000000000000000000000000000000000000000001f400000000000000000000000000000000000000000000000000000000000001f40000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000b4

-----Decoded View---------------
Arg [0] : _developerWallet (address): 0x1EFaD6910885B9e3Df294D61DA26DF5B5F142106
Arg [1] : _marketingWallet (address): 0x89098494A5f6ba166f5262EF63c1D4dd0e350b40
Arg [2] : _liquidityWallet (address): 0xa01aE93E04099163a80DF619AfFA28ec539C5d00
Arg [3] : _buyTaxDevelopment (uint256): 200
Arg [4] : _buyTaxMarketing (uint256): 600
Arg [5] : _buyTaxLiquidity (uint256): 200
Arg [6] : _sellTaxDevelopment (uint256): 1500
Arg [7] : _sellTaxMarketing (uint256): 500
Arg [8] : _sellTaxLiquidity (uint256): 500
Arg [9] : _maxTransactions (uint256): 100
Arg [10] : _maxWallet (uint256): 100
Arg [11] : _sellCooldownSeconds (uint256): 180

-----Encoded View---------------
12 Constructor Arguments found :
Arg [0] : 0000000000000000000000001efad6910885b9e3df294d61da26df5b5f142106
Arg [1] : 00000000000000000000000089098494a5f6ba166f5262ef63c1d4dd0e350b40
Arg [2] : 000000000000000000000000a01ae93e04099163a80df619affa28ec539c5d00
Arg [3] : 00000000000000000000000000000000000000000000000000000000000000c8
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000258
Arg [5] : 00000000000000000000000000000000000000000000000000000000000000c8
Arg [6] : 00000000000000000000000000000000000000000000000000000000000005dc
Arg [7] : 00000000000000000000000000000000000000000000000000000000000001f4
Arg [8] : 00000000000000000000000000000000000000000000000000000000000001f4
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000064
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000064
Arg [11] : 00000000000000000000000000000000000000000000000000000000000000b4


Deployed Bytecode Sourcemap

40957:20854:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61012:99;;;;;;;;;;-1:-1:-1;61087:16:0;;61012:99;;;160:25:1;;;148:2;133:18;61012:99:0;;;;;;;;61317:111;;;;;;;;;;-1:-1:-1;61405:15:0;;;;61317:111;;;399:42:1;387:55;;;369:74;;357:2;342:18;61317:111:0;196:253:1;41469:73:0;;;;;;;;;;;;41500:42;41469:73;;60151:100;;;;;;;;;;-1:-1:-1;60228:15:0;;;;60151:100;;57347:199;;;;;;;;;;-1:-1:-1;57347:199:0;;;;;:::i;:::-;;:::i;58562:145::-;;;;;;;;;;-1:-1:-1;58562:145:0;;;;;:::i;:::-;;:::i;44221:91::-;;;;;;;;;;-1:-1:-1;44299:5:0;;;;;;;;;;;;;;;;;44221:91;;;;;;;:::i;59908:105::-;;;;;;;;;;-1:-1:-1;59986:19:0;;59908:105;;45287:194;;;;;;;;;;-1:-1:-1;45287:194:0;;;;;:::i;:::-;;:::i;:::-;;;2175:14:1;;2168:22;2150:41;;2138:2;2123:18;45287:194:0;2010:187:1;61119:97:0;;;;;;;;;;-1:-1:-1;61193:15:0;;61119:97;;42640:27;;;;;;;;;;;;;;;;41826:31;;;;;;;;;;;;;;;;61224:85;;;;;;;;;;-1:-1:-1;61292:9:0;;61224:85;;58883:441;;;;;;;;;;-1:-1:-1;58883:441:0;;;;;:::i;:::-;;:::i;41629:41::-;;;;;;;;;;-1:-1:-1;41629:41:0;;;;;;;;44522:108;;;;;;;;;;-1:-1:-1;44610:12:0;;44522:108;;42148:38;;;;;;;;;;-1:-1:-1;42148:38:0;;;;;;;;61436:96;;;;;;;;;;-1:-1:-1;61511:13:0;;;;61436:96;;41787:32;;;;;;;;;;-1:-1:-1;41787:32:0;;;;;;;;;;;60259:100;;;;;;;;;;-1:-1:-1;60336:15:0;;;;60259:100;;41712:35;;;;;;;;;;-1:-1:-1;41712:35:0;;;;;;;;;;;56160:111;;;;;;;;;;-1:-1:-1;56160:111:0;;;;;:::i;:::-;;:::i;45489:456::-;;;;;;;;;;-1:-1:-1;45489:456:0;;;;;:::i;:::-;;:::i;42512:30::-;;;;;;;;;;;;;;;;41754:26;;;;;;;;;;-1:-1:-1;41754:26:0;;;;;;;;;;;44423:91;;;;;;;;;;-1:-1:-1;41293:2:0;44423:91;;;3684:4:1;3672:17;;;3654:36;;3642:2;3627:18;44423:91:0;3512:184:1;41302:31:0;;;;;;;;;;;;;;;;60021:122;;;;;;;;;;-1:-1:-1;60021:122:0;;;;;:::i;:::-;60118:17;;60094:4;60118:17;;;:9;:17;;;;;;;;;60021:122;45953:240;;;;;;;;;;-1:-1:-1;45953:240:0;;;;;:::i;:::-;;:::i;59720:81::-;;;;;;;;;;-1:-1:-1;59786:7:0;;;;;;;59720:81;;57025:153;;;;;;;;;;-1:-1:-1;57025:153:0;;;;;:::i;:::-;;:::i;60475:101::-;;;;;;;;;;-1:-1:-1;60551:17:0;;60475:101;;56725:131;;;;;;;;;;-1:-1:-1;56725:131:0;;;;;:::i;:::-;;:::i;56418:161::-;;;;;;;;;;-1:-1:-1;56418:161:0;;;;;:::i;:::-;;:::i;41677:28::-;;;;;;;;;;-1:-1:-1;41677:28:0;;;;;;;;56864:153;;;;;;;;;;-1:-1:-1;56864:153:0;;;;;:::i;:::-;;:::i;41549:73::-;;;;;;;;;;;;41580:42;41549:73;;57948:204;;;;;;;;;;-1:-1:-1;57948:204:0;;;;;:::i;:::-;;:::i;44742:143::-;;;;;;;;;;-1:-1:-1;44742:143:0;;;;;:::i;:::-;44859:18;;44832:7;44859:18;;;:9;:18;;;;;;;44742:143;59563:149;;;;;;;;;;;;;:::i;42193:38::-;;;;;;;;;;-1:-1:-1;42193:38:0;;;;;;;;58362:194;;;;;;;;;;-1:-1:-1;58362:194:0;;;;;:::i;:::-;;:::i;61540:81::-;;;;;;;;;;-1:-1:-1;61607:6:0;;;;61540:81;;59809:91;;;;;;;;;;-1:-1:-1;59880:12:0;;;;;;;59809:91;;42436:31;;;;;;;;;;;;;;;;44320:95;;;;;;;;;;-1:-1:-1;44400:7:0;;;;;;;;;;;;;;;;;44320:95;;42359:30;;;;;;;;;;;;;;;;55621:237;;;;;;;;;;-1:-1:-1;55621:237:0;;;;;:::i;:::-;;:::i;58715:160::-;;;;;;;;;;-1:-1:-1;58715:160:0;;;;;:::i;:::-;;:::i;58160:194::-;;;;;;;;;;-1:-1:-1;58160:194:0;;;;;:::i;:::-;;:::i;46201:402::-;;;;;;;;;;-1:-1:-1;46201:402:0;;;;;:::i;:::-;;:::i;42474:31::-;;;;;;;;;;;;;;;;44893:200;;;;;;;;;;-1:-1:-1;44893:200:0;;;;;:::i;:::-;;:::i;57554:189::-;;;;;;;;;;-1:-1:-1;57554:189:0;;;;;:::i;:::-;;:::i;42322:30::-;;;;;;;;;;;;;;;;41212:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60584:97;;;;;;;;;;-1:-1:-1;60658:15:0;;60584:97;;41965:57;;;;;;;;;;-1:-1:-1;41965:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;60367:100;;;;;;;;;;-1:-1:-1;60444:15:0;;;;60367:100;;60794:103;;;;;;;;;;-1:-1:-1;60871:18:0;;60794:103;;42283:32;;;;;;;;;;;;;;;;42238:38;;;;;;;;;;-1:-1:-1;42238:38:0;;;;;;;;60905:99;;;;;;;;;;-1:-1:-1;60980:16:0;;60905:99;;41370:92;;;;;;;;;;;;41419:42;41370:92;;42396:33;;;;;;;;;;;;;;;;45101:178;;;;;;;;;;-1:-1:-1;45101:178:0;;;;;:::i;:::-;45243:19;;;;45216:7;45243:19;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;45101:178;56279:131;;;;;;;;;;-1:-1:-1;56279:131:0;;;;;:::i;:::-;;:::i;61629:177::-;;;;;;;;;;;;;:::i;41164:41::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42580:53;;;;;;;;;;;;;;;;41340:21;;;;;;;;;;-1:-1:-1;41340:21:0;;;;;;;;57751:189;;;;;;;;;;-1:-1:-1;57751:189:0;;;;;:::i;:::-;;:::i;60689:97::-;;;;;;;;;;-1:-1:-1;60763:15:0;;60689:97;;57186:153;;;;;;;;;;-1:-1:-1;57186:153:0;;;;;:::i;:::-;;:::i;59332:223::-;;;;;;;;;;-1:-1:-1;59332:223:0;;;;;:::i;:::-;;:::i;56587:130::-;;;;;;;;;;-1:-1:-1;56587:130:0;;;;;:::i;:::-;;:::i;41259:36::-;;;;;;;;;;;;41293:2;41259:36;;42549:24;;;;;;;;;;;;;;;;41864:41;;;;;;;;;;-1:-1:-1;41864:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;57347:199;61607:6;;2310:23;61607:6;843:10;2310:23;2302:68;;;;;;;4876:2:1;2302:68:0;;;4858:21:1;;;4895:18;;;4888:30;4954:34;4934:18;;;4927:62;5006:18;;2302:68:0;;;;;;;;;57484:4:::1;57462:18;:26;;57454:35;;;::::0;::::1;;57500:17;:38:::0;57347:199::o;58562:145::-;61607:6;;2310:23;61607:6;843:10;2310:23;2302:68;;;;;;;4876:2:1;2302:68:0;;;4858:21:1;;;4895:18;;;4888:30;4954:34;4934:18;;;4927:62;5006:18;;2302:68:0;4674:356:1;2302:68:0;58665:15:::1;:34:::0;58562:145::o;45287:194::-;45395:4;45412:39;843:10;45435:7;45444:6;45412:8;:39::i;:::-;-1:-1:-1;45469:4:0;45287:194;;;;:::o;58883:441::-;61607:6;;2310:23;61607:6;843:10;2310:23;2302:68;;;;;;;4876:2:1;2302:68:0;;;4858:21:1;;;4895:18;;;4888:30;4954:34;4934:18;;;4927:62;5006:18;;2302:68:0;4674:356:1;2302:68:0;59012:15:::1;::::0;::::1;58989:39:::0;;::::1;59012:15:::0;::::1;58989:39;;58981:104;;;::::0;::::1;::::0;;5237:2:1;58981:104:0::1;::::0;::::1;5219:21:1::0;5276:2;5256:18;;;5249:30;5315:34;5295:18;;;5288:62;5386:22;5366:18;;;5359:50;5426:19;;58981:104:0::1;5035:416:1::0;58981:104:0::1;59096:15;:49:::0;;;::::1;;::::0;::::1;::::0;;::::1;::::0;;;59199:25:::1;::::0;;;;;;;-1:-1:-1;;59096:49:0;59199:23:::1;::::0;:25:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;59096:49;59199:25:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59181:55;;;59245:4;59252:15;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59181:94;::::0;;::::1;::::0;;;;;;5896:42:1;5965:15;;;59181:94:0::1;::::0;::::1;5947:34:1::0;6017:15;;5997:18;;;5990:43;5859:18;;59181:94:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59286:13;:30:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;58883:441:0:o;56160:111::-;61607:6;;2310:23;61607:6;843:10;2310:23;2302:68;;;;;;;4876:2:1;2302:68:0;;;4858:21:1;;;4895:18;;;4888:30;4954:34;4934:18;;;4927:62;5006:18;;2302:68:0;4674:356:1;2302:68:0;56244:7:::1;:19:::0;;;::::1;56254:9:::0;::::1;56244:19:::0;::::1;::::0;;;::::1;::::0;;56160:111::o;45489:456::-;45629:4;45646:36;45656:6;45664:9;45675:6;45646:9;:36::i;:::-;45722:19;;;45695:24;45722:19;;;:11;:19;;;;;;;;843:10;45722:33;;;;;;;;45774:26;;;;45766:79;;;;;;;6246:2:1;45766:79:0;;;6228:21:1;6285:2;6265:18;;;6258:30;6324:34;6304:18;;;6297:62;6395:10;6375:18;;;6368:38;6423:19;;45766:79:0;6044:404:1;45766:79:0;45856:57;45865:6;843:10;45887:25;45906:6;45887:16;:25;:::i;:::-;45856:8;:57::i;:::-;-1:-1:-1;45933:4:0;;45489:456;-1:-1:-1;;;;45489:456:0:o;45953:240::-;843:10;46066:4;46115:25;;;:11;:25;;;;;;;;;:34;;;;;;;;;;46066:4;;46083:80;;46106:7;;46115:47;;46152:10;;46115:47;:::i;57025:153::-;61607:6;;2310:23;61607:6;843:10;2310:23;2302:68;;;;;;;4876:2:1;2302:68:0;;;4858:21:1;;;4895:18;;;4888:30;4954:34;4934:18;;;4927:62;5006:18;;2302:68:0;4674:356:1;2302:68:0;57136:15:::1;:34:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;57025:153::o;56725:131::-;61607:6;;2310:23;61607:6;843:10;2310:23;2302:68;;;;;;;4876:2:1;2302:68:0;;;4858:21:1;;;4895:18;;;4888:30;4954:34;4934:18;;;4927:62;5006:18;;2302:68:0;4674:356:1;2302:68:0;56818:22:::1;;56843:5;56818:22:::0;;;:9:::1;:22;::::0;;;;:30;;;::::1;::::0;;56725:131::o;56418:161::-;61607:6;;2310:23;61607:6;843:10;2310:23;2302:68;;;;;;;4876:2:1;2302:68:0;;;4858:21:1;;;4895:18;;;4888:30;4954:34;4934:18;;;4927:62;5006:18;;2302:68:0;4674:356:1;2302:68:0;56529:19:::1;:42:::0;56418:161::o;56864:153::-;61607:6;;2310:23;61607:6;843:10;2310:23;2302:68;;;;;;;4876:2:1;2302:68:0;;;4858:21:1;;;4895:18;;;4888:30;4954:34;4934:18;;;4927:62;5006:18;;2302:68:0;4674:356:1;2302:68:0;56975:15:::1;:34:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;56864:153::o;57948:204::-;61607:6;;2310:23;61607:6;843:10;2310:23;2302:68;;;;;;;4876:2:1;2302:68:0;;;4858:21:1;;;4895:18;;;4888:30;4954:34;4934:18;;;4927:62;5006:18;;2302:68:0;4674:356:1;2302:68:0;58088:4:::1;58065:19;:27;;58057:36;;;::::0;::::1;;58104:18;:40:::0;57948:204::o;59563:149::-;61607:6;;2310:23;61607:6;843:10;2310:23;2302:68;;;;;;;4876:2:1;2302:68:0;;;4858:21:1;;;4895:18;;;4888:30;4954:34;4934:18;;;4927:62;5006:18;;2302:68:0;4674:356:1;2302:68:0;59655:6:::1;::::0;59634:40:::1;::::0;59671:1:::1;::::0;59634:40:::1;59655:6;::::0;59634:40:::1;::::0;59671:1;;59634:40:::1;59685:6;:19:::0;;;::::1;::::0;;59563:149::o;58362:194::-;61607:6;;2310:23;61607:6;843:10;2310:23;2302:68;;;;;;;4876:2:1;2302:68:0;;;4858:21:1;;;4895:18;;;4888:30;4954:34;4934:18;;;4927:62;5006:18;;2302:68:0;4674:356:1;2302:68:0;58496:4:::1;58475:17;:25;;58467:34;;;::::0;::::1;;58512:16;:36:::0;58362:194::o;55621:237::-;61607:6;;2310:23;61607:6;843:10;2310:23;2302:68;;;;;;;4876:2:1;2302:68:0;;;4858:21:1;;;4895:18;;;4888:30;4954:34;4934:18;;;4927:62;5006:18;;2302:68:0;4674:356:1;2302:68:0;55753:13:::1;::::0;::::1;55745:21:::0;;::::1;55753:13:::0;::::1;55745:21;;55737:61;;;::::0;::::1;::::0;;7107:2:1;55737:61:0::1;::::0;::::1;7089:21:1::0;7146:2;7126:18;;;7119:30;7185:29;7165:18;;;7158:57;7232:18;;55737:61:0::1;6905:351:1::0;55737:61:0::1;55809:41;55838:4;55844:5;55809:28;:41::i;:::-;55621:237:::0;;:::o;58715:160::-;61607:6;;2310:23;61607:6;843:10;2310:23;2302:68;;;;;;;4876:2:1;2302:68:0;;;4858:21:1;;;4895:18;;;4888:30;4954:34;4934:18;;;4927:62;5006:18;;2302:68:0;4674:356:1;2302:68:0;58828:5:::1;58814:10;:19;;58806:28;;;::::0;::::1;;58845:9;:22:::0;58715:160::o;58160:194::-;61607:6;;2310:23;61607:6;843:10;2310:23;2302:68;;;;;;;4876:2:1;2302:68:0;;;4858:21:1;;;4895:18;;;4888:30;4954:34;4934:18;;;4927:62;5006:18;;2302:68:0;4674:356:1;2302:68:0;58294:4:::1;58273:17;:25;;58265:34;;;::::0;::::1;;58310:16;:36:::0;58160:194::o;46201:402::-;843:10;46319:4;46363:25;;;:11;:25;;;;;;;;;:34;;;;;;;;;;46416:35;;;;46408:85;;;;;;;7463:2:1;46408:85:0;;;7445:21:1;7502:2;7482:18;;;7475:30;7541:34;7521:18;;;7514:62;7612:7;7592:18;;;7585:35;7637:19;;46408:85:0;7261:401:1;46408:85:0;46504:67;843:10;46527:7;46536:34;46555:15;46536:16;:34;:::i;46504:67::-;-1:-1:-1;46591:4:0;;46201:402;-1:-1:-1;;;46201:402:0:o;44893:200::-;45004:4;45021:42;843:10;45045:9;45056:6;45021:9;:42::i;57554:189::-;61607:6;;2310:23;61607:6;843:10;2310:23;2302:68;;;;;;;4876:2:1;2302:68:0;;;4858:21:1;;;4895:18;;;4888:30;4954:34;4934:18;;;4927:62;5006:18;;2302:68:0;4674:356:1;2302:68:0;57685:4:::1;57665:16;:24;;57657:33;;;::::0;::::1;;57701:15;:34:::0;57554:189::o;56279:131::-;61607:6;;2310:23;61607:6;843:10;2310:23;2302:68;;;;;;;4876:2:1;2302:68:0;;;4858:21:1;;;4895:18;;;4888:30;4954:34;4934:18;;;4927:62;5006:18;;2302:68:0;4674:356:1;2302:68:0;56373:12:::1;:29:::0;;;::::1;56388:14:::0;::::1;56373:29:::0;::::1;::::0;;;::::1;::::0;;56279:131::o;61629:177::-;61694:6;;61672:4;;61694:20;:6;61689:110;;-1:-1:-1;61738:4:0;;61629:177::o;61689:110::-;-1:-1:-1;61782:5:0;;61629:177::o;57751:189::-;61607:6;;2310:23;61607:6;843:10;2310:23;2302:68;;;;;;;4876:2:1;2302:68:0;;;4858:21:1;;;4895:18;;;4888:30;4954:34;4934:18;;;4927:62;5006:18;;2302:68:0;4674:356:1;2302:68:0;57882:4:::1;57862:16;:24;;57854:33;;;::::0;::::1;;57898:15;:34:::0;57751:189::o;57186:153::-;61607:6;;2310:23;61607:6;843:10;2310:23;2302:68;;;;;;;4876:2:1;2302:68:0;;;4858:21:1;;;4895:18;;;4888:30;4954:34;4934:18;;;4927:62;5006:18;;2302:68:0;4674:356:1;2302:68:0;57297:15:::1;:34:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;57186:153::o;59332:223::-;61607:6;;2310:23;61607:6;843:10;2310:23;2302:68;;;;;;;4876:2:1;2302:68:0;;;4858:21:1;;;4895:18;;;4888:30;4954:34;4934:18;;;4927:62;5006:18;;2302:68:0;4674:356:1;2302:68:0;59439:23:::1;::::0;::::1;59431:32;;;::::0;::::1;;59500:6;::::0;59479:39:::1;::::0;::::1;::::0;;::::1;::::0;59500:6:::1;::::0;59479:39:::1;::::0;59500:6:::1;::::0;59479:39:::1;59529:6;:18:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;59332:223::o;56587:130::-;61607:6;;2310:23;61607:6;843:10;2310:23;2302:68;;;;;;;4876:2:1;2302:68:0;;;4858:21:1;;;4895:18;;;4888:30;4954:34;4934:18;;;4927:62;5006:18;;2302:68:0;4674:356:1;2302:68:0;56680:22:::1;;;::::0;;;:9:::1;:22;::::0;;;;:29;;;::::1;56705:4;56680:29;::::0;;56587:130::o;52073:384::-;52210:20;;;52202:69;;;;;;;7869:2:1;52202:69:0;;;7851:21:1;7908:2;7888:18;;;7881:30;7947:34;7927:18;;;7920:62;8018:6;7998:18;;;7991:34;8042:19;;52202:69:0;7667:400:1;52202:69:0;52290:21;;;52282:68;;;;;;;8274:2:1;52282:68:0;;;8256:21:1;8313:2;8293:18;;;8286:30;8352:34;8332:18;;;8325:62;8423:4;8403:18;;;8396:32;8445:19;;52282:68:0;8072:398:1;52282:68:0;52363:19;;;;;;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;:37;;;52416:33;;160:25:1;;;52416:33:0;;133:18:1;52416:33:0;;;;;;;52073:384;;;:::o;46611:3907::-;46751:20;;;46743:70;;;;;;;8677:2:1;46743:70:0;;;8659:21:1;8716:2;8696:18;;;8689:30;8755:34;8735:18;;;8728:62;8826:7;8806:18;;;8799:35;8851:19;;46743:70:0;8475:401:1;46743:70:0;46832:23;;;46824:71;;;;;;;9083:2:1;46824:71:0;;;9065:21:1;9122:2;9102:18;;;9095:30;9161:34;9141:18;;;9134:62;9232:5;9212:18;;;9205:33;9255:19;;46824:71:0;8881:399:1;46824:71:0;46914:17;;;;;;;:9;:17;;;;;;;;:25;;:17;:25;;46906:64;;;;;;;9487:2:1;46906:64:0;;;9469:21:1;9526:2;9506:18;;;9499:30;9565:28;9545:18;;;9538:56;9611:18;;46906:64:0;9285:350:1;46906:64:0;46989:20;;;;;;;:9;:20;;;;;;;;:28;;:20;:28;;46981:70;;;;;;;9842:2:1;46981:70:0;;;9824:21:1;9881:2;9861:18;;;9854:30;9920:31;9900:18;;;9893:59;9969:18;;46981:70:0;9640:353:1;46981:70:0;47091:15;;47070:18;;;;;;;:10;:18;;;;;;:36;47062:84;;;;;;;10200:2:1;47062:84:0;;;10182:21:1;10239:2;10219:18;;;10212:30;10278:34;10258:18;;;10251:62;10349:5;10329:18;;;10322:33;10372:19;;47062:84:0;9998:399:1;47062:84:0;61607:6;;;47165:20;;;61607:6;;47165:20;;:50;;-1:-1:-1;47202:13:0;;;47189:26;;;47202:13;;47189:26;47165:50;:91;;;-1:-1:-1;47240:15:0;;;47219:37;;;47240:15;;47219:37;47165:91;:123;;;-1:-1:-1;47273:15:0;;;47260:28;;;47273:15;;47260:28;47165:123;:155;;;-1:-1:-1;47305:15:0;;;47292:28;;;47305:15;;47292:28;47165:155;:187;;;-1:-1:-1;47337:15:0;;;47324:28;;;47337:15;;47324:28;47165:187;:249;;;;47404:9;;47389:12;;:24;;;;:::i;:::-;47357:20;;;;;;;:9;:20;;;;;;:29;;47380:6;;47357:29;:::i;:::-;:56;47165:249;47157:301;;;;;;;10837:2:1;47157:301:0;;;10819:21:1;10876:2;10856:18;;;10849:30;10915:34;10895:18;;;10888:62;10986:9;10966:18;;;10959:37;11013:19;;47157:301:0;10635:403:1;47157:301:0;47523:7;;;;;;;:16;;:36;;-1:-1:-1;47553:6:0;;;47543:16;;;47553:6;;47543:16;47523:36;:59;;;-1:-1:-1;47576:6:0;;;47563:19;;;47576:6;;47563:19;47523:59;47515:100;;;;;;;11245:2:1;47515:100:0;;;11227:21:1;11284:2;11264:18;;;11257:30;11323;11303:18;;;11296:58;11371:18;;47515:100:0;11043:352:1;47515:100:0;47628:20;47686:5;47667:15;;47652:12;;:30;;;;:::i;:::-;47651:40;;;;:::i;:::-;47628:63;;47702:18;47752:5;47739:9;;47724:12;;:24;;;;:::i;:::-;47723:34;;;;:::i;:::-;47702:55;;47800:7;61607:6;;;;;61540:81;47800:7;47790:17;;:6;:17;;;:44;;;-1:-1:-1;47821:13:0;;;47811:23;;;47821:13;;47811:23;47790:44;:70;;;;47848:12;47838:6;:22;;47790:70;47768:137;;;;;;;11881:2:1;47768:137:0;;;11863:21:1;11920:2;11900:18;;;11893:30;11959:19;11939:18;;;11932:47;11996:18;;47768:137:0;11679:341:1;47768:137:0;61607:6;;;47922:17;;;61607:6;;47922:17;;;;:41;;-1:-1:-1;61607:6:0;;;47943:20;;;61607:6;;47943:20;;47922:41;:71;;;;-1:-1:-1;47967:26:0;;;47988:4;47967:26;;47922:71;:98;;;;-1:-1:-1;47997:23:0;;;;;47922:98;:128;;;;-1:-1:-1;48037:13:0;;;48024:26;;;48037:13;;48024:26;;47922:128;47918:318;;;44859:18;;;48067:22;44859:18;;;:9;:18;;;;;;48162:10;48135:23;48152:6;44859:18;48135:23;:::i;:::-;:37;;48127:97;;;;;;;12227:2:1;48127:97:0;;;12209:21:1;12266:2;12246:18;;;12239:30;12305:34;12285:18;;;12278:62;12376:17;12356:18;;;12349:45;12411:19;;48127:97:0;12025:411:1;48127:97:0;48052:184;47918:318;48272:17;;;48248:21;48272:17;;;:9;:17;;;;;;48308:23;;;;48300:74;;;;;;;12643:2:1;48300:74:0;;;12625:21:1;12682:2;12662:18;;;12655:30;12721:34;12701:18;;;12694:62;12792:8;12772:18;;;12765:36;12818:19;;48300:74:0;12441:402:1;48300:74:0;48467:13;;;48457:23;;;48467:13;;48457:23;:39;;;;-1:-1:-1;48484:12:0;;;;;;;48457:39;48453:197;;;48570:19;;48552:37;;:15;:37;:::i;:::-;48521:28;;;;;;;:17;:28;;;;;;:68;;:91;;-1:-1:-1;48606:6:0;;;48593:19;;;48606:6;;48593:19;48521:91;48513:125;;;;;;;13050:2:1;48513:125:0;;;13032:21:1;13089:2;13069:18;;;13062:30;13128:23;13108:18;;;13101:51;13169:18;;48513:125:0;12848:345:1;48513:125:0;48676:13;;;48666:23;;;48676:13;;48666:23;48662:102;;48706:28;;;;;;;:17;:28;;;;;48737:15;48706:46;;48662:102;48885:4;48836:28;44859:18;;;:9;:18;;;;;;49007;;48934:21;;48983:42;;;;;;;49042:20;;-1:-1:-1;49054:8:0;;;;49053:9;49042:20;:58;;;;-1:-1:-1;49067:33:0;;;;;;;:25;:33;;;;;;;;49066:34;49042:58;:96;;;;-1:-1:-1;49122:15:0;;;49104:34;;;49122:15;;49104:34;;49042:96;:116;;;;-1:-1:-1;49152:6:0;;;49142:16;;;49152:6;;49142:16;;49042:116;:139;;;;-1:-1:-1;49175:6:0;;;49162:19;;;49175:6;;49162:19;;49042:139;49038:574;;;49198:8;:15;;;;49209:4;49198:15;;;;;;49278:13;;;49268:23;;;49278:13;;49268:23;;:61;;-1:-1:-1;49313:15:0;;;49295:34;;;49313:15;;49295:34;49268:61;:88;;;-1:-1:-1;49333:23:0;;;49351:4;49333:23;49268:88;49264:178;;;-1:-1:-1;49385:5:0;49264:178;49458:64;49471:20;49493:21;49516:5;49458:12;:64::i;:::-;-1:-1:-1;49554:15:0;49539:12;:30;49584:8;:16;;;;;;49038:574;49670:13;;49639:4;;49670:13;49660:23;;;49670:13;;49660:23;;:53;;-1:-1:-1;49700:13:0;;;49687:26;;;49700:13;;49687:26;49660:53;49656:100;;;-1:-1:-1;49740:4:0;49656:100;49772:27;;;;;;;:19;:27;;;;;;;;;:61;;-1:-1:-1;49803:30:0;;;;;;;:19;:30;;;;;;;;49772:61;49768:109;;;-1:-1:-1;49860:5:0;49768:109;49893:8;;;;49889:56;;;-1:-1:-1;49928:5:0;49889:56;61607:6;;;49961:17;;;61607:6;;49961:17;49957:65;;;-1:-1:-1;50005:5:0;49957:65;50034:13;50088:15;;50070;;50050:17;;:35;;;;:::i;:::-;:53;;;;:::i;:::-;50130:13;;50034:69;;-1:-1:-1;50130:13:0;50120:23;;;50130:13;;50120:23;50116:123;;;50211:16;;50192;;50171:18;;:37;;;;:::i;:::-;:56;;;;:::i;:::-;50160:67;;50116:123;50251:18;;;;;;;:10;:18;;;;;:20;;;;;;:::i;:::-;;;;;;50288:7;50284:171;;;50312:12;50349:5;50328:17;50337:8;50328:6;:17;:::i;:::-;50327:27;;;;:::i;:::-;50312:42;-1:-1:-1;50369:14:0;50312:42;50369:14;;:::i;:::-;;;50398:45;50415:6;50431:4;50438;50398:16;:45::i;:::-;50297:158;50284:171;50467:43;50484:6;50492:9;50503:6;50467:16;:43::i;:::-;46732:3786;;;;;;;;46611:3907;;;:::o;55866:254::-;55982:31;;;;;;;:25;:31;;;;;;;;:40;;;;;;;55974:88;;;;;;;13600:2:1;55974:88:0;;;13582:21:1;13639:2;13619:18;;;13612:30;13678:34;13658:18;;;13651:62;13749:5;13729:18;;;13722:33;13772:19;;55974:88:0;13398:399:1;55974:88:0;56073:31;;;;;;;;;:25;:31;;;;;:39;;;;;;;;;;;;;55866:254::o;53318:1966::-;53451:1;53441:6;:11;53437:50;;53318:1966;;;:::o;53437:50::-;53499:13;53553:15;;53535;;53515:17;;:35;;;;:::i;:::-;:53;;;;:::i;:::-;53499:69;;53586:5;53581:106;;53659:16;;53640;;53619:18;;:37;;;;:::i;:::-;:56;;;;:::i;:::-;53608:67;;53581:106;53699:26;53759:8;53738:17;;53729:6;:26;;;;:::i;:::-;53728:39;;;;:::i;:::-;53699:68;;53778:24;53834:8;53815:15;;53806:6;:24;;;;:::i;:::-;53805:37;;;;:::i;:::-;53778:64;;53853:23;53908:8;53889:15;;53880:6;:24;;;;:::i;:::-;53879:37;;;;:::i;:::-;53853:63;;53934:5;53929:252;;54012:8;53990:18;;53981:6;:27;;;;:::i;:::-;53980:40;;;;:::i;:::-;53956:64;;54087:8;54067:16;;54058:6;:25;;;;:::i;:::-;54057:38;;;;:::i;:::-;54035:60;;54161:8;54141:16;;54132:6;:25;;;;:::i;:::-;54131:38;;;;:::i;:::-;54110:59;;53929:252;54193:27;54223:22;54244:1;54223:18;:22;:::i;:::-;54193:52;-1:-1:-1;54256:26:0;54285:40;54193:52;54285:18;:40;:::i;:::-;54256:69;-1:-1:-1;54338:23:0;54410:19;54364:43;54388:19;54364:21;:43;:::i;:::-;:65;;;;:::i;:::-;54338:91;-1:-1:-1;54466:21:0;54498:36;54338:91;54498:19;:36::i;:::-;54545:21;54611:6;54570:37;54594:13;54570:21;:37;:::i;:::-;54569:48;;;;:::i;:::-;54545:72;-1:-1:-1;54630:25:0;54700:15;54659:37;54675:21;54545:72;54659:37;:::i;:::-;54658:57;;;;:::i;:::-;54630:85;-1:-1:-1;54726:23:0;54792:15;54753:35;54769:19;54753:13;:35;:::i;:::-;54752:55;;;;:::i;:::-;54726:81;-1:-1:-1;54818:23:0;54726:81;54845:33;54861:17;54845:13;:33;:::i;:::-;:51;;;;:::i;:::-;54818:78;-1:-1:-1;54913:21:0;;54909:106;;54959:15;;54951:52;;54959:15;;;;;54951:52;;;;;54985:17;;54959:15;54951:52;54959:15;54951:52;54985:17;54959:15;54951:52;;;;;;;;;;;;;;;;;;;;;54909:106;55031:19;;55027:102;;55075:15;;55067:50;;55075:15;;;;;55067:50;;;;;55101:15;;55075;55067:50;55075:15;55067:50;55101:15;55075;55067:50;;;;;;;;;;;;;;;;;;;;;55027:102;55145:19;;55141:136;;55216:49;55229:18;55249:15;55216:12;:49::i;:::-;53426:1858;;;;;;;;;;;;53318:1966;;;:::o;50526:572::-;50664:20;;;50656:70;;;;;;;8677:2:1;50656:70:0;;;8659:21:1;8716:2;8696:18;;;8689:30;8755:34;8735:18;;;8728:62;8826:7;8806:18;;;8799:35;8851:19;;50656:70:0;8475:401:1;50656:70:0;50745:23;;;50737:71;;;;;;;9083:2:1;50737:71:0;;;9065:21:1;9122:2;9102:18;;;9095:30;9161:34;9141:18;;;9134:62;9232:5;9212:18;;;9205:33;9255:19;;50737:71:0;8881:399:1;50737:71:0;50843:17;;;50819:21;50843:17;;;:9;:17;;;;;;50879:23;;;;50871:74;;;;;;;12643:2:1;50871:74:0;;;12625:21:1;12682:2;12662:18;;;12655:30;12721:34;12701:18;;;12694:62;12792:8;12772:18;;;12765:36;12818:19;;50871:74:0;12441:402:1;50871:74:0;50976:22;50992:6;50976:13;:22;:::i;:::-;50956:17;;;;;;;;:9;:17;;;;;;:42;;;;51009:20;;;;;;;;:30;;51033:6;;50956:17;51009:30;;51033:6;;51009:30;:::i;:::-;;;;;;;;51072:9;51055:35;;51064:6;51055:35;;;51083:6;51055:35;;;;160:25:1;;148:2;133:18;;14:177;51055:35:0;;;;;;;;50645:453;50526:572;;;:::o;52465:490::-;52553:16;;;52567:1;52553:16;;;;;;;;52529:21;;52553:16;;;;;;;;;;-1:-1:-1;52553:16:0;52529:40;;52598:4;52580;52585:1;52580:7;;;;;;;;:::i;:::-;:23;;;;:7;;;;;;;;;;:23;;;;52624:15;;:22;;;;;;;;:15;;;;;:20;;:22;;;;;52580:7;;52624:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52614:4;52619:1;52614:7;;;;;;;;:::i;:::-;:32;;;;:7;;;;;;;;;:32;52689:15;;52657:57;;52674:4;;52689:15;52707:6;52657:8;:57::i;:::-;52725:15;;:222;;;;;:15;;;;;:66;;:222;;52806:6;;52725:15;;52874:4;;52901;;52921:15;;52725:222;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52518:437;52465:490;:::o;52963:347::-;53068:15;;53036:57;;53053:4;;53068:15;;53086:6;53036:8;:57::i;:::-;53104:15;;53246;;53104:198;;;;;53173:4;53104:198;;;15583:34:1;15633:18;;;15626:34;;;53104:15:0;15676:18:1;;;15669:34;;;15719:18;;;15712:34;53104:15:0;53246;;;15762:19:1;;;15755:44;53276:15:0;15815:19:1;;;15808:35;53104:15:0;;;:31;;53143:6;;15494:19:1;;53104:198:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;52963:347;;:::o;685:180:1:-;744:6;797:2;785:9;776:7;772:23;768:32;765:52;;;813:1;810;803:12;765:52;-1:-1:-1;836:23:1;;685:180;-1:-1:-1;685:180:1:o;870:656::-;982:4;1011:2;1040;1029:9;1022:21;1072:6;1066:13;1115:6;1110:2;1099:9;1095:18;1088:34;1140:1;1150:140;1164:6;1161:1;1158:13;1150:140;;;1259:14;;;1255:23;;1249:30;1225:17;;;1244:2;1221:26;1214:66;1179:10;;1150:140;;;1308:6;1305:1;1302:13;1299:91;;;1378:1;1373:2;1364:6;1353:9;1349:22;1345:31;1338:42;1299:91;-1:-1:-1;1442:2:1;1430:15;1447:66;1426:88;1411:104;;;;1517:2;1407:113;;870:656;-1:-1:-1;;;870:656:1:o;1531:154::-;1617:42;1610:5;1606:54;1599:5;1596:65;1586:93;;1675:1;1672;1665:12;1586:93;1531:154;:::o;1690:315::-;1758:6;1766;1819:2;1807:9;1798:7;1794:23;1790:32;1787:52;;;1835:1;1832;1825:12;1787:52;1874:9;1861:23;1893:31;1918:5;1893:31;:::i;:::-;1943:5;1995:2;1980:18;;;;1967:32;;-1:-1:-1;;;1690:315:1:o;2202:247::-;2261:6;2314:2;2302:9;2293:7;2289:23;2285:32;2282:52;;;2330:1;2327;2320:12;2282:52;2369:9;2356:23;2388:31;2413:5;2388:31;:::i;:::-;2438:5;2202:247;-1:-1:-1;;;2202:247:1:o;2701:160::-;2766:20;;2822:13;;2815:21;2805:32;;2795:60;;2851:1;2848;2841:12;2795:60;2701:160;;;:::o;2866:180::-;2922:6;2975:2;2963:9;2954:7;2950:23;2946:32;2943:52;;;2991:1;2988;2981:12;2943:52;3014:26;3030:9;3014:26;:::i;3051:456::-;3128:6;3136;3144;3197:2;3185:9;3176:7;3172:23;3168:32;3165:52;;;3213:1;3210;3203:12;3165:52;3252:9;3239:23;3271:31;3296:5;3271:31;:::i;:::-;3321:5;-1:-1:-1;3378:2:1;3363:18;;3350:32;3391:33;3350:32;3391:33;:::i;:::-;3051:456;;3443:7;;-1:-1:-1;;;3497:2:1;3482:18;;;;3469:32;;3051:456::o;3961:315::-;4026:6;4034;4087:2;4075:9;4066:7;4062:23;4058:32;4055:52;;;4103:1;4100;4093:12;4055:52;4142:9;4129:23;4161:31;4186:5;4161:31;:::i;:::-;4211:5;-1:-1:-1;4235:35:1;4266:2;4251:18;;4235:35;:::i;:::-;4225:45;;3961:315;;;;;:::o;4281:388::-;4349:6;4357;4410:2;4398:9;4389:7;4385:23;4381:32;4378:52;;;4426:1;4423;4416:12;4378:52;4465:9;4452:23;4484:31;4509:5;4484:31;:::i;:::-;4534:5;-1:-1:-1;4591:2:1;4576:18;;4563:32;4604:33;4563:32;4604:33;:::i;:::-;4656:7;4646:17;;;4281:388;;;;;:::o;5456:251::-;5526:6;5579:2;5567:9;5558:7;5554:23;5550:32;5547:52;;;5595:1;5592;5585:12;5547:52;5627:9;5621:16;5646:31;5671:5;5646:31;:::i;6453:184::-;6505:77;6502:1;6495:88;6602:4;6599:1;6592:15;6626:4;6623:1;6616:15;6642:125;6682:4;6710:1;6707;6704:8;6701:34;;;6715:18;;:::i;:::-;-1:-1:-1;6752:9:1;;6642:125::o;6772:128::-;6812:3;6843:1;6839:6;6836:1;6833:13;6830:39;;;6849:18;;:::i;:::-;-1:-1:-1;6885:9:1;;6772:128::o;10402:228::-;10442:7;10568:1;10500:66;10496:74;10493:1;10490:81;10485:1;10478:9;10471:17;10467:105;10464:131;;;10575:18;;:::i;:::-;-1:-1:-1;10615:9:1;;10402:228::o;11400:274::-;11440:1;11466;11456:189;;11501:77;11498:1;11491:88;11602:4;11599:1;11592:15;11630:4;11627:1;11620:15;11456:189;-1:-1:-1;11659:9:1;;11400:274::o;13198:195::-;13237:3;13268:66;13261:5;13258:77;13255:103;;;13338:18;;:::i;:::-;-1:-1:-1;13385:1:1;13374:13;;13198:195::o;13991:184::-;14043:77;14040:1;14033:88;14140:4;14137:1;14130:15;14164:4;14161:1;14154:15;14180:1026;14442:4;14490:3;14479:9;14475:19;14521:6;14510:9;14503:25;14547:2;14585:6;14580:2;14569:9;14565:18;14558:34;14628:3;14623:2;14612:9;14608:18;14601:31;14652:6;14687;14681:13;14718:6;14710;14703:22;14756:3;14745:9;14741:19;14734:26;;14795:2;14787:6;14783:15;14769:29;;14816:1;14826:218;14840:6;14837:1;14834:13;14826:218;;;14905:13;;14920:42;14901:62;14889:75;;15019:15;;;;14984:12;;;;14862:1;14855:9;14826:218;;;-1:-1:-1;;15112:42:1;15100:55;;;;15095:2;15080:18;;15073:83;-1:-1:-1;;;15187:3:1;15172:19;15165:35;15061:3;14180:1026;-1:-1:-1;;;14180:1026:1:o;15854:306::-;15942:6;15950;15958;16011:2;15999:9;15990:7;15986:23;15982:32;15979:52;;;16027:1;16024;16017:12;15979:52;16056:9;16050:16;16040:26;;16106:2;16095:9;16091:18;16085:25;16075:35;;16150:2;16139:9;16135:18;16129:25;16119:35;;15854:306;;;;;:::o

Swarm Source

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