ETH Price: $3,337.04 (-2.39%)

Token

DUCK (DUCK)
 

Overview

Max Total Supply

100,000,000 DUCK

Holders

131

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0.000000008628528949 DUCK

Value
$0.00
0x850289de443b332676377cb4115036a057850e4a
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:
DUCK

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-08-01
*/

/**
 *Submitted for verification at Etherscan.io on 2023-07-27
*/

// SPDX-License-Identifier: MIT LICENSE
/**

DUCK | $DUCK

🌐 DUCK LINKS 🌐

🔗 WEBSITE ~ https://www.ercduck.com/ 
🔗 TWITTER ~ https://twitter.com/ETHereumDuck
🔗 TELEGRAM ~ https://t.me/EthereumDuck

**/
pragma solidity ^0.8.8;

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

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

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

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

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

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

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

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

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

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

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

contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

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

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

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

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

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(
        address spender,
        uint256 amount
    ) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

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

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

        return true;
    }

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

        _beforeTokenTransfer(from, to, amount);

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

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

interface IERC20Permit {
    /**
     * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
     * given ``owner``'s signed approval.
     *
     * IMPORTANT: The same issues {IERC20-approve} has related to transaction
     * ordering also apply here.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `deadline` must be a timestamp in the future.
     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
     * over the EIP712-formatted function arguments.
     * - the signature must use ``owner``'s current nonce (see {nonces}).
     *
     * For more information on the signature format, see the
     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
     * section].
     */
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    /**
     * @dev Returns the current nonce for `owner`. This value must be
     * included whenever a signature is generated for {permit}.
     *
     * Every successful call to {permit} increases ``owner``'s nonce by one. This
     * prevents a signature from being used multiple times.
     */
    function nonces(address owner) external view returns (uint256);

    /**
     * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
     */
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}

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

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

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

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

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

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

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

interface IUniswapV2Router {
    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 removeLiquidity(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountA, uint256 amountB);

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

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETHWithPermit(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountToken, uint256 amountETH);

    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapTokensForExactTokens(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactETHForTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function swapTokensForExactETH(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactTokensForETH(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapETHForExactTokens(
        uint256 amountOut,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function quote(
        uint256 amountA,
        uint256 reserveA,
        uint256 reserveB
    ) external pure returns (uint256 amountB);

    function getAmountOut(
        uint256 amountIn,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountOut);

    function getAmountIn(
        uint256 amountOut,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountIn);

    function getAmountsOut(
        uint256 amountIn,
        address[] calldata path
    ) external view returns (uint256[] memory amounts);

    function getAmountsIn(
        uint256 amountOut,
        address[] calldata path
    ) external view returns (uint256[] memory amounts);

    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountETH);

    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountETH);

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

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
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 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
            functionCallWithValue(
                target,
                data,
                0,
                "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"
        );
        (bool success, bytes memory returndata) = target.call{value: value}(
            data
        );
        return
            verifyCallResultFromTarget(
                target,
                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) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return
            verifyCallResultFromTarget(
                target,
                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) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return
            verifyCallResultFromTarget(
                target,
                success,
                returndata,
                errorMessage
            );
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or 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 {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(
        bytes memory returndata,
        string memory errorMessage
    ) private pure {
        // 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
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}

library SafeERC20 {
    using Address for address;

    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        _callOptionalReturn(
            token,
            abi.encodeWithSelector(token.transfer.selector, to, value)
        );
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(
            token,
            abi.encodeWithSelector(token.transferFrom.selector, from, to, value)
        );
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(
            token,
            abi.encodeWithSelector(token.approve.selector, spender, value)
        );
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(
            token,
            abi.encodeWithSelector(
                token.approve.selector,
                spender,
                newAllowance
            )
        );
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(
                oldAllowance >= value,
                "SafeERC20: decreased allowance below zero"
            );
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(
                token,
                abi.encodeWithSelector(
                    token.approve.selector,
                    spender,
                    newAllowance
                )
            );
        }
    }

    function safePermit(
        IERC20Permit token,
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal {
        uint256 nonceBefore = token.nonces(owner);
        token.permit(owner, spender, value, deadline, v, r, s);
        uint256 nonceAfter = token.nonces(owner);
        require(
            nonceAfter == nonceBefore + 1,
            "SafeERC20: permit did not succeed"
        );
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(
            data,
            "SafeERC20: low-level call failed"
        );
        if (returndata.length > 0) {
            // Return data is optional
            require(
                abi.decode(returndata, (bool)),
                "SafeERC20: ERC20 operation did not succeed"
            );
        }
    }
}

contract DUCK is ERC20, Ownable {
    using SafeERC20 for IERC20;

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

    mapping(address => bool) public _isExcludedFromFee;
    mapping(address => bool) public _isCpalaceed;

    uint8 private _decimals = 18;
    uint256 private _tTotal = 100000000 * 10 ** _decimals;

    uint256 private buyMarketFee = 1;
    uint256 private sellMarketFee = 1;

    IUniswapV2Router public immutable uniswapV2Router =
        IUniswapV2Router(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
    address public uniswapV2Pair;

    mapping(address => bool) public swapPairList;

    bool inSwapAndMarket;
    bool public swapAndMarketEnabled = true;
    bool public tradeEnabled = false;
    
    uint256 public launchedAt = 0;

    uint256 public numTokensSellToMarket =
        200000 * 10 ** _decimals;

    address public _market = 0x0781D0d9f0E59A92f7A1331efC7e9D9AE8c46CeE;

    event SwapAndMarketEnabledUpdated(bool enabled);

    constructor() ERC20("DUCK", "DUCK") {
        //exclude owner and this contract from fee
        _isExcludedFromFee[owner()] = true;
        _isExcludedFromFee[address(this)] = true;
        _isExcludedFromFee[_market] = true;

        _mint(_msgSender(), _tTotal);
    }

    function initializePair(address _uniswapV2Pair) external onlyOwner {
        uniswapV2Pair = _uniswapV2Pair;
        swapPairList[uniswapV2Pair] = true;
    }

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

    function cpalaceAddressArray(
        address[] calldata account,
        bool value
    ) external onlyOwner {
        for (uint256 i = 0; i < account.length; i++) {
            _isCpalaceed[account[i]] = value;
        }
    }

    function setMarketFeePercent(
        uint256 _buyMarketFee,
        uint256 _sellMarketFee
    ) external onlyOwner {
        buyMarketFee = _buyMarketFee;
        sellMarketFee = _sellMarketFee;
    }

    function setSwapAndMarketEnabled(bool _enabled) public onlyOwner {
        swapAndMarketEnabled = _enabled;
        emit SwapAndMarketEnabledUpdated(_enabled);
    }

    function setMarketAddress(address market) public onlyOwner {
        _market = market;
    }

    function setUniswapV2Pair(address _uniswapV2Pair) public onlyOwner {
        uniswapV2Pair = _uniswapV2Pair;
    }

    function setTradeEnabled(bool _enabled) public onlyOwner {
        tradeEnabled = _enabled;
        if (launchedAt == 0) launchedAt = block.number;
    }

    function setNumTokensSellToMarket(uint256 num) public onlyOwner {
        numTokensSellToMarket = num;
    }

    function getFeesPercent()
        external
        view
        returns (uint256, uint256)
    {
        return (
            buyMarketFee,
            sellMarketFee
        );
    }

    //to recieve ETH from uniswapV2Router when swaping
    receive() external payable {}

    function transfer(
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        return _tokenTransfer(_msgSender(), to, amount);
    }

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(sender, spender, amount);
        return _tokenTransfer(sender, recipient, amount);
    }

    function _tokenTransfer(
        address from,
        address to,
        uint256 amount
    ) private returns (bool) {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");
        require(!_isCpalaceed[from], "cpalace address");

        if (
            !tradeEnabled &&
            (!_isExcludedFromFee[from] && !_isExcludedFromFee[to])
        ) {
            revert("Can't transfer now");
        }

        // is the token balance of this contract address over the min number of
        // tokens that we need to initiate a swap + liquidity lock?
        // also, don't get caught in a circular liquidity event.
        // also, don't swap & liquify if sender is uniswap pair.
        uint256 contractTokenBalance = balanceOf(address(this));

        bool overMinTokenBalance = contractTokenBalance >=
            numTokensSellToMarket;
        if (
            overMinTokenBalance &&
            !inSwapAndMarket &&
            !swapPairList[from] &&
            !_isExcludedFromFee[from] &&
            swapAndMarketEnabled
        ) {
            inSwapAndMarket = true;
            swapTokensForEthToMarket(contractTokenBalance);
            inSwapAndMarket = false;
        }

        //indicates if fee should be deducted from transfer
        bool takeFee = true;

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

        if (takeFee) {
            uint256 fees;
            uint256 MFee;
            if (swapPairList[from]) {
                MFee = (amount * buyMarketFee) / 100;
            }
            if (swapPairList[to]) {
                MFee = (amount * sellMarketFee) / 100;
            }
            fees = MFee;

            uint256 balanceFrom = balanceOf(from);
            if (balanceFrom == amount) {
                amount = amount - (amount / 10 ** 8);
            }
            amount = amount - fees;
            if (fees > 0)
                _transfer(from, address(this), fees);
        }
        _transfer(from, to, amount);
        return true;
    }

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

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

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

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapAndMarketEnabledUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isCpalaceed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_market","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"account","type":"address[]"},{"internalType":"bool","name":"value","type":"bool"}],"name":"cpalaceAddressArray","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeMultipleAccountsFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getFeesPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"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":"_uniswapV2Pair","type":"address"}],"name":"initializePair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"launchedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numTokensSellToMarket","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"internalType":"address","name":"market","type":"address"}],"name":"setMarketAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_buyMarketFee","type":"uint256"},{"internalType":"uint256","name":"_sellMarketFee","type":"uint256"}],"name":"setMarketFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"setNumTokensSellToMarket","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapAndMarketEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setTradeEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_uniswapV2Pair","type":"address"}],"name":"setUniswapV2Pair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndMarketEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"swapPairList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradeEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"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 IUniswapV2Router","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a06040526012600a60006101000a81548160ff021916908360ff160217905550600a60009054906101000a900460ff16600a6200003e91906200078f565b6305f5e1006200004f9190620007e0565b600b556001600c556001600d55737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff168152506001601060016101000a81548160ff0219169083151502179055506000601060026101000a81548160ff0219169083151502179055506000601155600a60009054906101000a900460ff16600a620000fc91906200078f565b62030d406200010c9190620007e0565b601255730781d0d9f0e59a92f7a1331efc7e9d9ae8c46cee601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200017157600080fd5b506040518060400160405280600481526020017f4455434b000000000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f4455434b000000000000000000000000000000000000000000000000000000008152508160039081620001ef919062000a9b565b50806004908162000201919062000a9b565b50505062000224620002186200038660201b60201c565b6200038e60201b60201c565b6001600860006200023a6200045460201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600860003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160086000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555062000380620003716200038660201b60201c565b600b546200047e60201b60201c565b62000c6e565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620004f0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004e79062000be3565b60405180910390fd5b6200050460008383620005eb60201b60201c565b806002600082825462000518919062000c05565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620005cb919062000c51565b60405180910390a3620005e760008383620005f060201b60201c565b5050565b505050565b505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008160011c9050919050565b6000808291508390505b600185111562000683578086048111156200065b576200065a620005f5565b5b60018516156200066b5780820291505b80810290506200067b8562000624565b94506200063b565b94509492505050565b6000826200069e576001905062000771565b81620006ae576000905062000771565b8160018114620006c75760028114620006d25762000708565b600191505062000771565b60ff841115620006e757620006e6620005f5565b5b8360020a915084821115620007015762000700620005f5565b5b5062000771565b5060208310610133831016604e8410600b8410161715620007425782820a9050838111156200073c576200073b620005f5565b5b62000771565b62000751848484600162000631565b925090508184048111156200076b576200076a620005f5565b5b81810290505b9392505050565b6000819050919050565b600060ff82169050919050565b60006200079c8262000778565b9150620007a98362000782565b9250620007d87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846200068c565b905092915050565b6000620007ed8262000778565b9150620007fa8362000778565b92508282026200080a8162000778565b91508282048414831517620008245762000823620005f5565b5b5092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620008ad57607f821691505b602082108103620008c357620008c262000865565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200092d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620008ee565b620009398683620008ee565b95508019841693508086168417925050509392505050565b6000819050919050565b60006200097c62000976620009708462000778565b62000951565b62000778565b9050919050565b6000819050919050565b62000998836200095b565b620009b0620009a78262000983565b848454620008fb565b825550505050565b600090565b620009c7620009b8565b620009d48184846200098d565b505050565b5b81811015620009fc57620009f0600082620009bd565b600181019050620009da565b5050565b601f82111562000a4b5762000a1581620008c9565b62000a2084620008de565b8101602085101562000a30578190505b62000a4862000a3f85620008de565b830182620009d9565b50505b505050565b600082821c905092915050565b600062000a706000198460080262000a50565b1980831691505092915050565b600062000a8b838362000a5d565b9150826002028217905092915050565b62000aa6826200082b565b67ffffffffffffffff81111562000ac25762000ac162000836565b5b62000ace825462000894565b62000adb82828562000a00565b600060209050601f83116001811462000b13576000841562000afe578287015190505b62000b0a858262000a7d565b86555062000b7a565b601f19841662000b2386620008c9565b60005b8281101562000b4d5784890151825560018201915060208501945060208101905062000b26565b8683101562000b6d578489015162000b69601f89168262000a5d565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600062000bcb601f8362000b82565b915062000bd88262000b93565b602082019050919050565b6000602082019050818103600083015262000bfe8162000bbc565b9050919050565b600062000c128262000778565b915062000c1f8362000778565b925082820190508082111562000c3a5762000c39620005f5565b5b92915050565b62000c4b8162000778565b82525050565b600060208201905062000c68600083018462000c40565b92915050565b608051612eb362000c9f600039600081816109c201528181611aea01528181611bcb0152611bf20152612eb36000f3fe6080604052600436106101fd5760003560e01c8063715018a61161010d578063a45b154a116100a0578063da95b32e1161006f578063da95b32e14610757578063dd62ed3e14610794578063eb462a96146107d1578063f2fde38b146107fa578063fae926121461082357610204565b8063a45b154a14610699578063a9059cbb146106c4578063bf56b37114610701578063d621e8131461072c57610204565b806395d89b41116100dc57806395d89b41146105dd578063988cf80114610608578063a29a608914610633578063a457c2d71461065c57610204565b8063715018a614610535578063768dc7101461054c5780637d315a2e146105895780638da5cb5b146105b257610204565b8063313ce567116101905780633c34ff631161015f5780633c34ff6314610439578063402fae581461047657806349bd5a5e146104a15780635e7f6718146104cc57806370a08231146104f857610204565b8063313ce5671461037f5780633690fe40146103aa57806339509351146103d35780633bec2bf31461041057610204565b80631694505e116101cc5780631694505e146102c357806318160ddd146102ee57806323b872dd146103195780632a55fc2a1461035657610204565b806306fdde03146102095780630850935f14610234578063095ea7b31461025d578063128f72c31461029a57610204565b3661020457005b600080fd5b34801561021557600080fd5b5061021e61084c565b60405161022b9190611fba565b60405180910390f35b34801561024057600080fd5b5061025b60048036038101906102569190612083565b6108de565b005b34801561026957600080fd5b50610284600480360381019061027f9190612177565b61098b565b60405161029191906121c6565b60405180910390f35b3480156102a657600080fd5b506102c160048036038101906102bc91906121e1565b6109ae565b005b3480156102cf57600080fd5b506102d86109c0565b6040516102e5919061226d565b60405180910390f35b3480156102fa57600080fd5b506103036109e4565b6040516103109190612297565b60405180910390f35b34801561032557600080fd5b50610340600480360381019061033b91906122b2565b6109ee565b60405161034d91906121c6565b60405180910390f35b34801561036257600080fd5b5061037d60048036038101906103789190612305565b610a1b565b005b34801561038b57600080fd5b50610394610ae1565b6040516103a1919061234e565b60405180910390f35b3480156103b657600080fd5b506103d160048036038101906103cc9190612369565b610aea565b005b3480156103df57600080fd5b506103fa60048036038101906103f59190612177565b610b46565b60405161040791906121c6565b60405180910390f35b34801561041c57600080fd5b5061043760048036038101906104329190612369565b610b7d565b005b34801561044557600080fd5b50610460600480360381019061045b9190612305565b610bb4565b60405161046d91906121c6565b60405180910390f35b34801561048257600080fd5b5061048b610bd4565b6040516104989190612297565b60405180910390f35b3480156104ad57600080fd5b506104b6610bda565b6040516104c391906123a5565b60405180910390f35b3480156104d857600080fd5b506104e1610c00565b6040516104ef9291906123c0565b60405180910390f35b34801561050457600080fd5b5061051f600480360381019061051a9190612305565b610c11565b60405161052c9190612297565b60405180910390f35b34801561054157600080fd5b5061054a610c59565b005b34801561055857600080fd5b50610573600480360381019061056e9190612305565b610c6d565b60405161058091906121c6565b60405180910390f35b34801561059557600080fd5b506105b060048036038101906105ab91906123e9565b610c8d565b005b3480156105be57600080fd5b506105c7610ca7565b6040516105d491906123a5565b60405180910390f35b3480156105e957600080fd5b506105f2610cd1565b6040516105ff9190611fba565b60405180910390f35b34801561061457600080fd5b5061061d610d63565b60405161062a91906123a5565b60405180910390f35b34801561063f57600080fd5b5061065a60048036038101906106559190612305565b610d89565b005b34801561066857600080fd5b50610683600480360381019061067e9190612177565b610dd5565b60405161069091906121c6565b60405180910390f35b3480156106a557600080fd5b506106ae610e4c565b6040516106bb91906121c6565b60405180910390f35b3480156106d057600080fd5b506106eb60048036038101906106e69190612177565b610e5f565b6040516106f891906121c6565b60405180910390f35b34801561070d57600080fd5b50610716610e7b565b6040516107239190612297565b60405180910390f35b34801561073857600080fd5b50610741610e81565b60405161074e91906121c6565b60405180910390f35b34801561076357600080fd5b5061077e60048036038101906107799190612305565b610e94565b60405161078b91906121c6565b60405180910390f35b3480156107a057600080fd5b506107bb60048036038101906107b69190612429565b610eb4565b6040516107c89190612297565b60405180910390f35b3480156107dd57600080fd5b506107f860048036038101906107f39190612083565b610f3b565b005b34801561080657600080fd5b50610821600480360381019061081c9190612305565b610fe8565b005b34801561082f57600080fd5b5061084a60048036038101906108459190612305565b61106b565b005b60606003805461085b90612498565b80601f016020809104026020016040519081016040528092919081815260200182805461088790612498565b80156108d45780601f106108a9576101008083540402835291602001916108d4565b820191906000526020600020905b8154815290600101906020018083116108b757829003601f168201915b5050505050905090565b6108e66110b7565b60005b8383905081101561098557816008600086868581811061090c5761090b6124c9565b5b90506020020160208101906109219190612305565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550808061097d90612527565b9150506108e9565b50505050565b600080610996611135565b90506109a381858561113d565b600191505092915050565b6109b66110b7565b8060128190555050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600254905090565b6000806109f9611135565b9050610a06858285611306565b610a11858585611392565b9150509392505050565b610a236110b7565b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600f6000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60006012905090565b610af26110b7565b80601060016101000a81548160ff0219169083151502179055507f67cbe9d16793e5cd880dafc6b9ad4a568545d35aa475a92dc80ded5dba51547481604051610b3b91906121c6565b60405180910390a150565b600080610b51611135565b9050610b72818585610b638589610eb4565b610b6d919061256f565b61113d565b600191505092915050565b610b856110b7565b80601060026101000a81548160ff021916908315150217905550600060115403610bb157436011819055505b50565b600f6020528060005260406000206000915054906101000a900460ff1681565b60125481565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600c54600d54915091509091565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610c616110b7565b610c6b6000611985565b565b60086020528060005260406000206000915054906101000a900460ff1681565b610c956110b7565b81600c8190555080600d819055505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610ce090612498565b80601f0160208091040260200160405190810160405280929190818152602001828054610d0c90612498565b8015610d595780601f10610d2e57610100808354040283529160200191610d59565b820191906000526020600020905b815481529060010190602001808311610d3c57829003601f168201915b5050505050905090565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610d916110b7565b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080610de0611135565b90506000610dee8286610eb4565b905083811015610e33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2a90612615565b60405180910390fd5b610e40828686840361113d565b60019250505092915050565b601060019054906101000a900460ff1681565b6000610e73610e6c611135565b8484611392565b905092915050565b60115481565b601060029054906101000a900460ff1681565b60096020528060005260406000206000915054906101000a900460ff1681565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610f436110b7565b60005b83839050811015610fe2578160096000868685818110610f6957610f686124c9565b5b9050602002016020810190610f7e9190612305565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610fda90612527565b915050610f46565b50505050565b610ff06110b7565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361105f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611056906126a7565b60405180910390fd5b61106881611985565b50565b6110736110b7565b80601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6110bf611135565b73ffffffffffffffffffffffffffffffffffffffff166110dd610ca7565b73ffffffffffffffffffffffffffffffffffffffff1614611133576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112a90612713565b60405180910390fd5b565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036111ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a3906127a5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361121b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121290612837565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516112f99190612297565b60405180910390a3505050565b60006113128484610eb4565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461138c578181101561137e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611375906128a3565b60405180910390fd5b61138b848484840361113d565b5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611402576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f990612935565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611471576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611468906129c7565b60405180910390fd5b600082116114b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ab90612a59565b60405180910390fd5b600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611541576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153890612ac5565b60405180910390fd5b601060029054906101000a900460ff161580156115fe5750600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156115fd5750600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b5b1561163e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163590612b31565b60405180910390fd5b600061164930610c11565b90506000601254821015905080801561166f5750601060009054906101000a900460ff16155b80156116c55750600f60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b801561171b5750600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156117335750601060019054906101000a900460ff165b15611778576001601060006101000a81548160ff02191690831515021790555061175c82611a4b565b6000601060006101000a81548160ff0219169083151502179055505b600060019050600860008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168061181f5750600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1561182957600090505b801561196c57600080600f60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156118a1576064600c54886118949190612b51565b61189e9190612bc2565b90505b600f60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611910576064600d54886119039190612b51565b61190d9190612bc2565b90505b809150600061191e8a610c11565b9050878103611945576305f5e100886119379190612bc2565b886119429190612bf3565b97505b82886119519190612bf3565b97506000831115611968576119678a3085611caa565b5b5050505b611977878787611caa565b600193505050509392505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000600267ffffffffffffffff811115611a6857611a67612c27565b5b604051908082528060200260200182016040528015611a965781602001602082028036833780820191505090505b5090503081600081518110611aae57611aad6124c9565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b779190612c6b565b81600181518110611b8b57611b8a6124c9565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050611bf0307f00000000000000000000000000000000000000000000000000000000000000008461113d565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663791ac94783600084601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518663ffffffff1660e01b8152600401611c74959493929190612d91565b600060405180830381600087803b158015611c8e57600080fd5b505af1158015611ca2573d6000803e3d6000fd5b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611d19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1090612935565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611d88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7f906129c7565b60405180910390fd5b611d93838383611f20565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611e19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1090612e5d565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611f079190612297565b60405180910390a3611f1a848484611f25565b50505050565b505050565b505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611f64578082015181840152602081019050611f49565b60008484015250505050565b6000601f19601f8301169050919050565b6000611f8c82611f2a565b611f968185611f35565b9350611fa6818560208601611f46565b611faf81611f70565b840191505092915050565b60006020820190508181036000830152611fd48184611f81565b905092915050565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f84011261200b5761200a611fe6565b5b8235905067ffffffffffffffff81111561202857612027611feb565b5b60208301915083602082028301111561204457612043611ff0565b5b9250929050565b60008115159050919050565b6120608161204b565b811461206b57600080fd5b50565b60008135905061207d81612057565b92915050565b60008060006040848603121561209c5761209b611fdc565b5b600084013567ffffffffffffffff8111156120ba576120b9611fe1565b5b6120c686828701611ff5565b935093505060206120d98682870161206e565b9150509250925092565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061210e826120e3565b9050919050565b61211e81612103565b811461212957600080fd5b50565b60008135905061213b81612115565b92915050565b6000819050919050565b61215481612141565b811461215f57600080fd5b50565b6000813590506121718161214b565b92915050565b6000806040838503121561218e5761218d611fdc565b5b600061219c8582860161212c565b92505060206121ad85828601612162565b9150509250929050565b6121c08161204b565b82525050565b60006020820190506121db60008301846121b7565b92915050565b6000602082840312156121f7576121f6611fdc565b5b600061220584828501612162565b91505092915050565b6000819050919050565b600061223361222e612229846120e3565b61220e565b6120e3565b9050919050565b600061224582612218565b9050919050565b60006122578261223a565b9050919050565b6122678161224c565b82525050565b6000602082019050612282600083018461225e565b92915050565b61229181612141565b82525050565b60006020820190506122ac6000830184612288565b92915050565b6000806000606084860312156122cb576122ca611fdc565b5b60006122d98682870161212c565b93505060206122ea8682870161212c565b92505060406122fb86828701612162565b9150509250925092565b60006020828403121561231b5761231a611fdc565b5b60006123298482850161212c565b91505092915050565b600060ff82169050919050565b61234881612332565b82525050565b6000602082019050612363600083018461233f565b92915050565b60006020828403121561237f5761237e611fdc565b5b600061238d8482850161206e565b91505092915050565b61239f81612103565b82525050565b60006020820190506123ba6000830184612396565b92915050565b60006040820190506123d56000830185612288565b6123e26020830184612288565b9392505050565b60008060408385031215612400576123ff611fdc565b5b600061240e85828601612162565b925050602061241f85828601612162565b9150509250929050565b600080604083850312156124405761243f611fdc565b5b600061244e8582860161212c565b925050602061245f8582860161212c565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806124b057607f821691505b6020821081036124c3576124c2612469565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061253282612141565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612564576125636124f8565b5b600182019050919050565b600061257a82612141565b915061258583612141565b925082820190508082111561259d5761259c6124f8565b5b92915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006125ff602583611f35565b915061260a826125a3565b604082019050919050565b6000602082019050818103600083015261262e816125f2565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612691602683611f35565b915061269c82612635565b604082019050919050565b600060208201905081810360008301526126c081612684565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006126fd602083611f35565b9150612708826126c7565b602082019050919050565b6000602082019050818103600083015261272c816126f0565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061278f602483611f35565b915061279a82612733565b604082019050919050565b600060208201905081810360008301526127be81612782565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000612821602283611f35565b915061282c826127c5565b604082019050919050565b6000602082019050818103600083015261285081612814565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b600061288d601d83611f35565b915061289882612857565b602082019050919050565b600060208201905081810360008301526128bc81612880565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061291f602583611f35565b915061292a826128c3565b604082019050919050565b6000602082019050818103600083015261294e81612912565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006129b1602383611f35565b91506129bc82612955565b604082019050919050565b600060208201905081810360008301526129e0816129a4565b9050919050565b7f5472616e7366657220616d6f756e74206d75737420626520677265617465722060008201527f7468616e207a65726f0000000000000000000000000000000000000000000000602082015250565b6000612a43602983611f35565b9150612a4e826129e7565b604082019050919050565b60006020820190508181036000830152612a7281612a36565b9050919050565b7f6370616c61636520616464726573730000000000000000000000000000000000600082015250565b6000612aaf600f83611f35565b9150612aba82612a79565b602082019050919050565b60006020820190508181036000830152612ade81612aa2565b9050919050565b7f43616e2774207472616e73666572206e6f770000000000000000000000000000600082015250565b6000612b1b601283611f35565b9150612b2682612ae5565b602082019050919050565b60006020820190508181036000830152612b4a81612b0e565b9050919050565b6000612b5c82612141565b9150612b6783612141565b9250828202612b7581612141565b91508282048414831517612b8c57612b8b6124f8565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612bcd82612141565b9150612bd883612141565b925082612be857612be7612b93565b5b828204905092915050565b6000612bfe82612141565b9150612c0983612141565b9250828203905081811115612c2157612c206124f8565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600081519050612c6581612115565b92915050565b600060208284031215612c8157612c80611fdc565b5b6000612c8f84828501612c56565b91505092915050565b6000819050919050565b6000612cbd612cb8612cb384612c98565b61220e565b612141565b9050919050565b612ccd81612ca2565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612d0881612103565b82525050565b6000612d1a8383612cff565b60208301905092915050565b6000602082019050919050565b6000612d3e82612cd3565b612d488185612cde565b9350612d5383612cef565b8060005b83811015612d84578151612d6b8882612d0e565b9750612d7683612d26565b925050600181019050612d57565b5085935050505092915050565b600060a082019050612da66000830188612288565b612db36020830187612cc4565b8181036040830152612dc58186612d33565b9050612dd46060830185612396565b612de16080830184612288565b9695505050505050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000612e47602683611f35565b9150612e5282612deb565b604082019050919050565b60006020820190508181036000830152612e7681612e3a565b905091905056fea26469706673582212203a0c3291afc7f56fe26bc2a448d34fa6488fc93ef64789bad095ecc73fb13e9564736f6c63430008120033

Deployed Bytecode

0x6080604052600436106101fd5760003560e01c8063715018a61161010d578063a45b154a116100a0578063da95b32e1161006f578063da95b32e14610757578063dd62ed3e14610794578063eb462a96146107d1578063f2fde38b146107fa578063fae926121461082357610204565b8063a45b154a14610699578063a9059cbb146106c4578063bf56b37114610701578063d621e8131461072c57610204565b806395d89b41116100dc57806395d89b41146105dd578063988cf80114610608578063a29a608914610633578063a457c2d71461065c57610204565b8063715018a614610535578063768dc7101461054c5780637d315a2e146105895780638da5cb5b146105b257610204565b8063313ce567116101905780633c34ff631161015f5780633c34ff6314610439578063402fae581461047657806349bd5a5e146104a15780635e7f6718146104cc57806370a08231146104f857610204565b8063313ce5671461037f5780633690fe40146103aa57806339509351146103d35780633bec2bf31461041057610204565b80631694505e116101cc5780631694505e146102c357806318160ddd146102ee57806323b872dd146103195780632a55fc2a1461035657610204565b806306fdde03146102095780630850935f14610234578063095ea7b31461025d578063128f72c31461029a57610204565b3661020457005b600080fd5b34801561021557600080fd5b5061021e61084c565b60405161022b9190611fba565b60405180910390f35b34801561024057600080fd5b5061025b60048036038101906102569190612083565b6108de565b005b34801561026957600080fd5b50610284600480360381019061027f9190612177565b61098b565b60405161029191906121c6565b60405180910390f35b3480156102a657600080fd5b506102c160048036038101906102bc91906121e1565b6109ae565b005b3480156102cf57600080fd5b506102d86109c0565b6040516102e5919061226d565b60405180910390f35b3480156102fa57600080fd5b506103036109e4565b6040516103109190612297565b60405180910390f35b34801561032557600080fd5b50610340600480360381019061033b91906122b2565b6109ee565b60405161034d91906121c6565b60405180910390f35b34801561036257600080fd5b5061037d60048036038101906103789190612305565b610a1b565b005b34801561038b57600080fd5b50610394610ae1565b6040516103a1919061234e565b60405180910390f35b3480156103b657600080fd5b506103d160048036038101906103cc9190612369565b610aea565b005b3480156103df57600080fd5b506103fa60048036038101906103f59190612177565b610b46565b60405161040791906121c6565b60405180910390f35b34801561041c57600080fd5b5061043760048036038101906104329190612369565b610b7d565b005b34801561044557600080fd5b50610460600480360381019061045b9190612305565b610bb4565b60405161046d91906121c6565b60405180910390f35b34801561048257600080fd5b5061048b610bd4565b6040516104989190612297565b60405180910390f35b3480156104ad57600080fd5b506104b6610bda565b6040516104c391906123a5565b60405180910390f35b3480156104d857600080fd5b506104e1610c00565b6040516104ef9291906123c0565b60405180910390f35b34801561050457600080fd5b5061051f600480360381019061051a9190612305565b610c11565b60405161052c9190612297565b60405180910390f35b34801561054157600080fd5b5061054a610c59565b005b34801561055857600080fd5b50610573600480360381019061056e9190612305565b610c6d565b60405161058091906121c6565b60405180910390f35b34801561059557600080fd5b506105b060048036038101906105ab91906123e9565b610c8d565b005b3480156105be57600080fd5b506105c7610ca7565b6040516105d491906123a5565b60405180910390f35b3480156105e957600080fd5b506105f2610cd1565b6040516105ff9190611fba565b60405180910390f35b34801561061457600080fd5b5061061d610d63565b60405161062a91906123a5565b60405180910390f35b34801561063f57600080fd5b5061065a60048036038101906106559190612305565b610d89565b005b34801561066857600080fd5b50610683600480360381019061067e9190612177565b610dd5565b60405161069091906121c6565b60405180910390f35b3480156106a557600080fd5b506106ae610e4c565b6040516106bb91906121c6565b60405180910390f35b3480156106d057600080fd5b506106eb60048036038101906106e69190612177565b610e5f565b6040516106f891906121c6565b60405180910390f35b34801561070d57600080fd5b50610716610e7b565b6040516107239190612297565b60405180910390f35b34801561073857600080fd5b50610741610e81565b60405161074e91906121c6565b60405180910390f35b34801561076357600080fd5b5061077e60048036038101906107799190612305565b610e94565b60405161078b91906121c6565b60405180910390f35b3480156107a057600080fd5b506107bb60048036038101906107b69190612429565b610eb4565b6040516107c89190612297565b60405180910390f35b3480156107dd57600080fd5b506107f860048036038101906107f39190612083565b610f3b565b005b34801561080657600080fd5b50610821600480360381019061081c9190612305565b610fe8565b005b34801561082f57600080fd5b5061084a60048036038101906108459190612305565b61106b565b005b60606003805461085b90612498565b80601f016020809104026020016040519081016040528092919081815260200182805461088790612498565b80156108d45780601f106108a9576101008083540402835291602001916108d4565b820191906000526020600020905b8154815290600101906020018083116108b757829003601f168201915b5050505050905090565b6108e66110b7565b60005b8383905081101561098557816008600086868581811061090c5761090b6124c9565b5b90506020020160208101906109219190612305565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550808061097d90612527565b9150506108e9565b50505050565b600080610996611135565b90506109a381858561113d565b600191505092915050565b6109b66110b7565b8060128190555050565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6000600254905090565b6000806109f9611135565b9050610a06858285611306565b610a11858585611392565b9150509392505050565b610a236110b7565b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600f6000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60006012905090565b610af26110b7565b80601060016101000a81548160ff0219169083151502179055507f67cbe9d16793e5cd880dafc6b9ad4a568545d35aa475a92dc80ded5dba51547481604051610b3b91906121c6565b60405180910390a150565b600080610b51611135565b9050610b72818585610b638589610eb4565b610b6d919061256f565b61113d565b600191505092915050565b610b856110b7565b80601060026101000a81548160ff021916908315150217905550600060115403610bb157436011819055505b50565b600f6020528060005260406000206000915054906101000a900460ff1681565b60125481565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600c54600d54915091509091565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610c616110b7565b610c6b6000611985565b565b60086020528060005260406000206000915054906101000a900460ff1681565b610c956110b7565b81600c8190555080600d819055505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610ce090612498565b80601f0160208091040260200160405190810160405280929190818152602001828054610d0c90612498565b8015610d595780601f10610d2e57610100808354040283529160200191610d59565b820191906000526020600020905b815481529060010190602001808311610d3c57829003601f168201915b5050505050905090565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610d916110b7565b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080610de0611135565b90506000610dee8286610eb4565b905083811015610e33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2a90612615565b60405180910390fd5b610e40828686840361113d565b60019250505092915050565b601060019054906101000a900460ff1681565b6000610e73610e6c611135565b8484611392565b905092915050565b60115481565b601060029054906101000a900460ff1681565b60096020528060005260406000206000915054906101000a900460ff1681565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610f436110b7565b60005b83839050811015610fe2578160096000868685818110610f6957610f686124c9565b5b9050602002016020810190610f7e9190612305565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610fda90612527565b915050610f46565b50505050565b610ff06110b7565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361105f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611056906126a7565b60405180910390fd5b61106881611985565b50565b6110736110b7565b80601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6110bf611135565b73ffffffffffffffffffffffffffffffffffffffff166110dd610ca7565b73ffffffffffffffffffffffffffffffffffffffff1614611133576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112a90612713565b60405180910390fd5b565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036111ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a3906127a5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361121b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121290612837565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516112f99190612297565b60405180910390a3505050565b60006113128484610eb4565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461138c578181101561137e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611375906128a3565b60405180910390fd5b61138b848484840361113d565b5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611402576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f990612935565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611471576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611468906129c7565b60405180910390fd5b600082116114b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ab90612a59565b60405180910390fd5b600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611541576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153890612ac5565b60405180910390fd5b601060029054906101000a900460ff161580156115fe5750600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156115fd5750600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b5b1561163e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163590612b31565b60405180910390fd5b600061164930610c11565b90506000601254821015905080801561166f5750601060009054906101000a900460ff16155b80156116c55750600f60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b801561171b5750600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156117335750601060019054906101000a900460ff165b15611778576001601060006101000a81548160ff02191690831515021790555061175c82611a4b565b6000601060006101000a81548160ff0219169083151502179055505b600060019050600860008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168061181f5750600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1561182957600090505b801561196c57600080600f60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156118a1576064600c54886118949190612b51565b61189e9190612bc2565b90505b600f60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611910576064600d54886119039190612b51565b61190d9190612bc2565b90505b809150600061191e8a610c11565b9050878103611945576305f5e100886119379190612bc2565b886119429190612bf3565b97505b82886119519190612bf3565b97506000831115611968576119678a3085611caa565b5b5050505b611977878787611caa565b600193505050509392505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000600267ffffffffffffffff811115611a6857611a67612c27565b5b604051908082528060200260200182016040528015611a965781602001602082028036833780820191505090505b5090503081600081518110611aae57611aad6124c9565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b779190612c6b565b81600181518110611b8b57611b8a6124c9565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050611bf0307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d8461113d565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663791ac94783600084601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518663ffffffff1660e01b8152600401611c74959493929190612d91565b600060405180830381600087803b158015611c8e57600080fd5b505af1158015611ca2573d6000803e3d6000fd5b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611d19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1090612935565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611d88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7f906129c7565b60405180910390fd5b611d93838383611f20565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611e19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1090612e5d565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611f079190612297565b60405180910390a3611f1a848484611f25565b50505050565b505050565b505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611f64578082015181840152602081019050611f49565b60008484015250505050565b6000601f19601f8301169050919050565b6000611f8c82611f2a565b611f968185611f35565b9350611fa6818560208601611f46565b611faf81611f70565b840191505092915050565b60006020820190508181036000830152611fd48184611f81565b905092915050565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f84011261200b5761200a611fe6565b5b8235905067ffffffffffffffff81111561202857612027611feb565b5b60208301915083602082028301111561204457612043611ff0565b5b9250929050565b60008115159050919050565b6120608161204b565b811461206b57600080fd5b50565b60008135905061207d81612057565b92915050565b60008060006040848603121561209c5761209b611fdc565b5b600084013567ffffffffffffffff8111156120ba576120b9611fe1565b5b6120c686828701611ff5565b935093505060206120d98682870161206e565b9150509250925092565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061210e826120e3565b9050919050565b61211e81612103565b811461212957600080fd5b50565b60008135905061213b81612115565b92915050565b6000819050919050565b61215481612141565b811461215f57600080fd5b50565b6000813590506121718161214b565b92915050565b6000806040838503121561218e5761218d611fdc565b5b600061219c8582860161212c565b92505060206121ad85828601612162565b9150509250929050565b6121c08161204b565b82525050565b60006020820190506121db60008301846121b7565b92915050565b6000602082840312156121f7576121f6611fdc565b5b600061220584828501612162565b91505092915050565b6000819050919050565b600061223361222e612229846120e3565b61220e565b6120e3565b9050919050565b600061224582612218565b9050919050565b60006122578261223a565b9050919050565b6122678161224c565b82525050565b6000602082019050612282600083018461225e565b92915050565b61229181612141565b82525050565b60006020820190506122ac6000830184612288565b92915050565b6000806000606084860312156122cb576122ca611fdc565b5b60006122d98682870161212c565b93505060206122ea8682870161212c565b92505060406122fb86828701612162565b9150509250925092565b60006020828403121561231b5761231a611fdc565b5b60006123298482850161212c565b91505092915050565b600060ff82169050919050565b61234881612332565b82525050565b6000602082019050612363600083018461233f565b92915050565b60006020828403121561237f5761237e611fdc565b5b600061238d8482850161206e565b91505092915050565b61239f81612103565b82525050565b60006020820190506123ba6000830184612396565b92915050565b60006040820190506123d56000830185612288565b6123e26020830184612288565b9392505050565b60008060408385031215612400576123ff611fdc565b5b600061240e85828601612162565b925050602061241f85828601612162565b9150509250929050565b600080604083850312156124405761243f611fdc565b5b600061244e8582860161212c565b925050602061245f8582860161212c565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806124b057607f821691505b6020821081036124c3576124c2612469565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061253282612141565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612564576125636124f8565b5b600182019050919050565b600061257a82612141565b915061258583612141565b925082820190508082111561259d5761259c6124f8565b5b92915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006125ff602583611f35565b915061260a826125a3565b604082019050919050565b6000602082019050818103600083015261262e816125f2565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612691602683611f35565b915061269c82612635565b604082019050919050565b600060208201905081810360008301526126c081612684565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006126fd602083611f35565b9150612708826126c7565b602082019050919050565b6000602082019050818103600083015261272c816126f0565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061278f602483611f35565b915061279a82612733565b604082019050919050565b600060208201905081810360008301526127be81612782565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000612821602283611f35565b915061282c826127c5565b604082019050919050565b6000602082019050818103600083015261285081612814565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b600061288d601d83611f35565b915061289882612857565b602082019050919050565b600060208201905081810360008301526128bc81612880565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061291f602583611f35565b915061292a826128c3565b604082019050919050565b6000602082019050818103600083015261294e81612912565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006129b1602383611f35565b91506129bc82612955565b604082019050919050565b600060208201905081810360008301526129e0816129a4565b9050919050565b7f5472616e7366657220616d6f756e74206d75737420626520677265617465722060008201527f7468616e207a65726f0000000000000000000000000000000000000000000000602082015250565b6000612a43602983611f35565b9150612a4e826129e7565b604082019050919050565b60006020820190508181036000830152612a7281612a36565b9050919050565b7f6370616c61636520616464726573730000000000000000000000000000000000600082015250565b6000612aaf600f83611f35565b9150612aba82612a79565b602082019050919050565b60006020820190508181036000830152612ade81612aa2565b9050919050565b7f43616e2774207472616e73666572206e6f770000000000000000000000000000600082015250565b6000612b1b601283611f35565b9150612b2682612ae5565b602082019050919050565b60006020820190508181036000830152612b4a81612b0e565b9050919050565b6000612b5c82612141565b9150612b6783612141565b9250828202612b7581612141565b91508282048414831517612b8c57612b8b6124f8565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612bcd82612141565b9150612bd883612141565b925082612be857612be7612b93565b5b828204905092915050565b6000612bfe82612141565b9150612c0983612141565b9250828203905081811115612c2157612c206124f8565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600081519050612c6581612115565b92915050565b600060208284031215612c8157612c80611fdc565b5b6000612c8f84828501612c56565b91505092915050565b6000819050919050565b6000612cbd612cb8612cb384612c98565b61220e565b612141565b9050919050565b612ccd81612ca2565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612d0881612103565b82525050565b6000612d1a8383612cff565b60208301905092915050565b6000602082019050919050565b6000612d3e82612cd3565b612d488185612cde565b9350612d5383612cef565b8060005b83811015612d84578151612d6b8882612d0e565b9750612d7683612d26565b925050600181019050612d57565b5085935050505092915050565b600060a082019050612da66000830188612288565b612db36020830187612cc4565b8181036040830152612dc58186612d33565b9050612dd46060830185612396565b612de16080830184612288565b9695505050505050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000612e47602683611f35565b9150612e5282612deb565b604082019050919050565b60006020820190508181036000830152612e7681612e3a565b905091905056fea26469706673582212203a0c3291afc7f56fe26bc2a448d34fa6488fc93ef64789bad095ecc73fb13e9564736f6c63430008120033

Deployed Bytecode Sourcemap

40870:6703:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4478:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42402:259;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6895:226;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43694:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41360:121;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5598:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44288:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42233:161;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5440:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43128:168;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8405:263;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43530:156;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41525:44;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41734:72;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41488:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43812:191;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;5769:143;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19361:103;;;;;;;;;;;;;:::i;:::-;;41072:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42912:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18713:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4697:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41815:67;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43406:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9171:498;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41605:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44104:176;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41696:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41651:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41129:44;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6399:176;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42669:235;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19619:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43304:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4478:100;4532:13;4565:5;4558:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4478:100;:::o;42402:259::-;18599:13;:11;:13::i;:::-;42544:9:::1;42539:115;42563:8;;:15;;42559:1;:19;42539:115;;;42634:8;42600:18;:31;42619:8;;42628:1;42619:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;42600:31;;;;;;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;42580:3;;;;;:::i;:::-;;;;42539:115;;;;42402:259:::0;;;:::o;6895:226::-;7003:4;7020:13;7036:12;:10;:12::i;:::-;7020:28;;7059:32;7068:5;7075:7;7084:6;7059:8;:32::i;:::-;7109:4;7102:11;;;6895:226;;;;:::o;43694:110::-;18599:13;:11;:13::i;:::-;43793:3:::1;43769:21;:27;;;;43694:110:::0;:::o;41360:121::-;;;:::o;5598:108::-;5659:7;5686:12;;5679:19;;5598:108;:::o;44288:305::-;44428:4;44445:15;44463:12;:10;:12::i;:::-;44445:30;;44486:40;44502:6;44510:7;44519:6;44486:15;:40::i;:::-;44544:41;44559:6;44567:9;44578:6;44544:14;:41::i;:::-;44537:48;;;44288:305;;;;;:::o;42233:161::-;18599:13;:11;:13::i;:::-;42327:14:::1;42311:13;;:30;;;;;;;;;;;;;;;;;;42382:4;42352:12;:27;42365:13;;;;;;;;;;;42352:27;;;;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;42233:161:::0;:::o;5440:93::-;5498:5;5523:2;5516:9;;5440:93;:::o;43128:168::-;18599:13;:11;:13::i;:::-;43227:8:::1;43204:20;;:31;;;;;;;;;;;;;;;;;;43251:37;43279:8;43251:37;;;;;;:::i;:::-;;;;;;;;43128:168:::0;:::o;8405:263::-;8518:4;8535:13;8551:12;:10;:12::i;:::-;8535:28;;8574:64;8583:5;8590:7;8627:10;8599:25;8609:5;8616:7;8599:9;:25::i;:::-;:38;;;;:::i;:::-;8574:8;:64::i;:::-;8656:4;8649:11;;;8405:263;;;;:::o;43530:156::-;18599:13;:11;:13::i;:::-;43613:8:::1;43598:12;;:23;;;;;;;;;;;;;;;;;;43650:1;43636:10;;:15:::0;43632:46:::1;;43666:12;43653:10;:25;;;;43632:46;43530:156:::0;:::o;41525:44::-;;;;;;;;;;;;;;;;;;;;;;:::o;41734:72::-;;;;:::o;41488:28::-;;;;;;;;;;;;;:::o;43812:191::-;43888:7;43897;43944:12;;43971:13;;43922:73;;;;43812:191;;:::o;5769:143::-;5859:7;5886:9;:18;5896:7;5886:18;;;;;;;;;;;;;;;;5879:25;;5769:143;;;:::o;19361:103::-;18599:13;:11;:13::i;:::-;19426:30:::1;19453:1;19426:18;:30::i;:::-;19361:103::o:0;41072:50::-;;;;;;;;;;;;;;;;;;;;;;:::o;42912:208::-;18599:13;:11;:13::i;:::-;43058::::1;43043:12;:28;;;;43098:14;43082:13;:30;;;;42912:208:::0;;:::o;18713:87::-;18759:7;18786:6;;;;;;;;;;;18779:13;;18713:87;:::o;4697:104::-;4753:13;4786:7;4779:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4697:104;:::o;41815:67::-;;;;;;;;;;;;;:::o;43406:116::-;18599:13;:11;:13::i;:::-;43500:14:::1;43484:13;;:30;;;;;;;;;;;;;;;;;;43406:116:::0;:::o;9171:498::-;9289:4;9306:13;9322:12;:10;:12::i;:::-;9306:28;;9345:24;9372:25;9382:5;9389:7;9372:9;:25::i;:::-;9345:52;;9450:15;9430:16;:35;;9408:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;9566:60;9575:5;9582:7;9610:15;9591:16;:34;9566:8;:60::i;:::-;9657:4;9650:11;;;;9171:498;;;;:::o;41605:39::-;;;;;;;;;;;;;:::o;44104:176::-;44208:4;44232:40;44247:12;:10;:12::i;:::-;44261:2;44265:6;44232:14;:40::i;:::-;44225:47;;44104:176;;;;:::o;41696:29::-;;;;:::o;41651:32::-;;;;;;;;;;;;;:::o;41129:44::-;;;;;;;;;;;;;;;;;;;;;;:::o;6399:176::-;6513:7;6540:11;:18;6552:5;6540:18;;;;;;;;;;;;;;;:27;6559:7;6540:27;;;;;;;;;;;;;;;;6533:34;;6399:176;;;;:::o;42669:235::-;18599:13;:11;:13::i;:::-;42798:9:::1;42793:104;42817:7;;:14;;42813:1;:18;42793:104;;;42880:5;42853:12;:24;42866:7;;42874:1;42866:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;42853:24;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;42833:3;;;;;:::i;:::-;;;;42793:104;;;;42669:235:::0;;;:::o;19619:238::-;18599:13;:11;:13::i;:::-;19742:1:::1;19722:22;;:8;:22;;::::0;19700:110:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;19821:28;19840:8;19821:18;:28::i;:::-;19619:238:::0;:::o;43304:94::-;18599:13;:11;:13::i;:::-;43384:6:::1;43374:7;;:16;;;;;;;;;;;;;;;;;;43304:94:::0;:::o;18878:132::-;18953:12;:10;:12::i;:::-;18942:23;;:7;:5;:7::i;:::-;:23;;;18934:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;18878:132::o;3484:98::-;3537:7;3564:10;3557:17;;3484:98;:::o;13297:380::-;13450:1;13433:19;;:5;:19;;;13425:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;13531:1;13512:21;;:7;:21;;;13504:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;13615:6;13585:11;:18;13597:5;13585:18;;;;;;;;;;;;;;;:27;13604:7;13585:27;;;;;;;;;;;;;;;:36;;;;13653:7;13637:32;;13646:5;13637:32;;;13662:6;13637:32;;;;;;:::i;:::-;;;;;;;;13297:380;;;:::o;13968:502::-;14103:24;14130:25;14140:5;14147:7;14130:9;:25::i;:::-;14103:52;;14190:17;14170:16;:37;14166:297;;14270:6;14250:16;:26;;14224:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;14385:51;14394:5;14401:7;14429:6;14410:16;:25;14385:8;:51::i;:::-;14166:297;14092:378;13968:502;;;:::o;44601:2368::-;44718:4;44759:1;44743:18;;:4;:18;;;44735:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44836:1;44822:16;;:2;:16;;;44814:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;44906:1;44897:6;:10;44889:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;44973:12;:18;44986:4;44973:18;;;;;;;;;;;;;;;;;;;;;;;;;44972:19;44964:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;45043:12;;;;;;;;;;;45042:13;:84;;;;;45074:18;:24;45093:4;45074:24;;;;;;;;;;;;;;;;;;;;;;;;;45073:25;:52;;;;;45103:18;:22;45122:2;45103:22;;;;;;;;;;;;;;;;;;;;;;;;;45102:23;45073:52;45042:84;45024:169;;;45153:28;;;;;;;;;;:::i;:::-;;;;;;;;45024:169;45487:28;45518:24;45536:4;45518:9;:24::i;:::-;45487:55;;45555:24;45619:21;;45582:20;:58;;45555:85;;45669:19;:52;;;;;45706:15;;;;;;;;;;;45705:16;45669:52;:88;;;;;45739:12;:18;45752:4;45739:18;;;;;;;;;;;;;;;;;;;;;;;;;45738:19;45669:88;:130;;;;;45775:18;:24;45794:4;45775:24;;;;;;;;;;;;;;;;;;;;;;;;;45774:25;45669:130;:167;;;;;45816:20;;;;;;;;;;;45669:167;45651:345;;;45881:4;45863:15;;:22;;;;;;;;;;;;;;;;;;45900:46;45925:20;45900:24;:46::i;:::-;45979:5;45961:15;;:23;;;;;;;;;;;;;;;;;;45651:345;46069:12;46084:4;46069:19;;46189:18;:24;46208:4;46189:24;;;;;;;;;;;;;;;;;;;;;;;;;:50;;;;46217:18;:22;46236:2;46217:22;;;;;;;;;;;;;;;;;;;;;;;;;46189:50;46185:98;;;46266:5;46256:15;;46185:98;46299:7;46295:607;;;46323:12;46350;46381;:18;46394:4;46381:18;;;;;;;;;;;;;;;;;;;;;;;;;46377:95;;;46453:3;46437:12;;46428:6;:21;;;;:::i;:::-;46427:29;;;;:::i;:::-;46420:36;;46377:95;46490:12;:16;46503:2;46490:16;;;;;;;;;;;;;;;;;;;;;;;;;46486:94;;;46561:3;46544:13;;46535:6;:22;;;;:::i;:::-;46534:30;;;;:::i;:::-;46527:37;;46486:94;46601:4;46594:11;;46622:19;46644:15;46654:4;46644:9;:15::i;:::-;46622:37;;46693:6;46678:11;:21;46674:98;;46748:7;46739:6;:16;;;;:::i;:::-;46729:6;:27;;;;:::i;:::-;46720:36;;46674:98;46804:4;46795:6;:13;;;;:::i;:::-;46786:22;;46834:1;46827:4;:8;46823:67;;;46854:36;46864:4;46878;46885;46854:9;:36::i;:::-;46823:67;46308:594;;;46295:607;46912:27;46922:4;46928:2;46932:6;46912:9;:27::i;:::-;46957:4;46950:11;;;;;44601:2368;;;;;:::o;20017:191::-;20091:16;20110:6;;;;;;;;;;;20091:25;;20136:8;20127:6;;:17;;;;;;;;;;;;;;;;;;20191:8;20160:40;;20181:8;20160:40;;;;;;;;;;;;20080:128;20017:191;:::o;46977:591::-;47111:21;47149:1;47135:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47111:40;;47180:4;47162;47167:1;47162:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;47206:15;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47196:4;47201:1;47196:7;;;;;;;;:::i;:::-;;;;;;;:32;;;;;;;;;;;47241:62;47258:4;47273:15;47291:11;47241:8;:62::i;:::-;47342:15;:66;;;47423:11;47449:1;47493:4;47512:7;;;;;;;;;;;47534:15;47342:218;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47040:528;46977:591;:::o;10139:877::-;10286:1;10270:18;;:4;:18;;;10262:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10363:1;10349:16;;:2;:16;;;10341:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;10418:38;10439:4;10445:2;10449:6;10418:20;:38::i;:::-;10469:19;10491:9;:15;10501:4;10491:15;;;;;;;;;;;;;;;;10469:37;;10554:6;10539:11;:21;;10517:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;10694:6;10680:11;:20;10662:9;:15;10672:4;10662:15;;;;;;;;;;;;;;;:38;;;;10897:6;10880:9;:13;10890:2;10880:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;10947:2;10932:26;;10941:4;10932:26;;;10951:6;10932:26;;;;;;:::i;:::-;;;;;;;;10971:37;10991:4;10997:2;11001:6;10971:19;:37::i;:::-;10251:765;10139:877;;;:::o;15070:125::-;;;;:::o;15799:124::-;;;;:::o;7:99:1:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:246::-;368:1;378:113;392:6;389:1;386:13;378:113;;;477:1;472:3;468:11;462:18;458:1;453:3;449:11;442:39;414:2;411:1;407:10;402:15;;378:113;;;525:1;516:6;511:3;507:16;500:27;349:184;287:246;;;:::o;539:102::-;580:6;631:2;627:7;622:2;615:5;611:14;607:28;597:38;;539:102;;;:::o;647:377::-;735:3;763:39;796:5;763:39;:::i;:::-;818:71;882:6;877:3;818:71;:::i;:::-;811:78;;898:65;956:6;951:3;944:4;937:5;933:16;898:65;:::i;:::-;988:29;1010:6;988:29;:::i;:::-;983:3;979:39;972:46;;739:285;647:377;;;;:::o;1030:313::-;1143:4;1181:2;1170:9;1166:18;1158:26;;1230:9;1224:4;1220:20;1216:1;1205:9;1201:17;1194:47;1258:78;1331:4;1322:6;1258:78;:::i;:::-;1250:86;;1030:313;;;;:::o;1430:117::-;1539:1;1536;1529:12;1553:117;1662:1;1659;1652:12;1676:117;1785:1;1782;1775:12;1799:117;1908:1;1905;1898:12;1922:117;2031:1;2028;2021:12;2062:568;2135:8;2145:6;2195:3;2188:4;2180:6;2176:17;2172:27;2162:122;;2203:79;;:::i;:::-;2162:122;2316:6;2303:20;2293:30;;2346:18;2338:6;2335:30;2332:117;;;2368:79;;:::i;:::-;2332:117;2482:4;2474:6;2470:17;2458:29;;2536:3;2528:4;2520:6;2516:17;2506:8;2502:32;2499:41;2496:128;;;2543:79;;:::i;:::-;2496:128;2062:568;;;;;:::o;2636:90::-;2670:7;2713:5;2706:13;2699:21;2688:32;;2636:90;;;:::o;2732:116::-;2802:21;2817:5;2802:21;:::i;:::-;2795:5;2792:32;2782:60;;2838:1;2835;2828:12;2782:60;2732:116;:::o;2854:133::-;2897:5;2935:6;2922:20;2913:29;;2951:30;2975:5;2951:30;:::i;:::-;2854:133;;;;:::o;2993:698::-;3085:6;3093;3101;3150:2;3138:9;3129:7;3125:23;3121:32;3118:119;;;3156:79;;:::i;:::-;3118:119;3304:1;3293:9;3289:17;3276:31;3334:18;3326:6;3323:30;3320:117;;;3356:79;;:::i;:::-;3320:117;3469:80;3541:7;3532:6;3521:9;3517:22;3469:80;:::i;:::-;3451:98;;;;3247:312;3598:2;3624:50;3666:7;3657:6;3646:9;3642:22;3624:50;:::i;:::-;3614:60;;3569:115;2993:698;;;;;:::o;3697:126::-;3734:7;3774:42;3767:5;3763:54;3752:65;;3697:126;;;:::o;3829:96::-;3866:7;3895:24;3913:5;3895:24;:::i;:::-;3884:35;;3829:96;;;:::o;3931:122::-;4004:24;4022:5;4004:24;:::i;:::-;3997:5;3994:35;3984:63;;4043:1;4040;4033:12;3984:63;3931:122;:::o;4059:139::-;4105:5;4143:6;4130:20;4121:29;;4159:33;4186:5;4159:33;:::i;:::-;4059:139;;;;:::o;4204:77::-;4241:7;4270:5;4259:16;;4204:77;;;:::o;4287:122::-;4360:24;4378:5;4360:24;:::i;:::-;4353:5;4350:35;4340:63;;4399:1;4396;4389:12;4340:63;4287:122;:::o;4415:139::-;4461:5;4499:6;4486:20;4477:29;;4515:33;4542:5;4515:33;:::i;:::-;4415:139;;;;:::o;4560:474::-;4628:6;4636;4685:2;4673:9;4664:7;4660:23;4656:32;4653:119;;;4691:79;;:::i;:::-;4653:119;4811:1;4836:53;4881:7;4872:6;4861:9;4857:22;4836:53;:::i;:::-;4826:63;;4782:117;4938:2;4964:53;5009:7;5000:6;4989:9;4985:22;4964:53;:::i;:::-;4954:63;;4909:118;4560:474;;;;;:::o;5040:109::-;5121:21;5136:5;5121:21;:::i;:::-;5116:3;5109:34;5040:109;;:::o;5155:210::-;5242:4;5280:2;5269:9;5265:18;5257:26;;5293:65;5355:1;5344:9;5340:17;5331:6;5293:65;:::i;:::-;5155:210;;;;:::o;5371:329::-;5430:6;5479:2;5467:9;5458:7;5454:23;5450:32;5447:119;;;5485:79;;:::i;:::-;5447:119;5605:1;5630:53;5675:7;5666:6;5655:9;5651:22;5630:53;:::i;:::-;5620:63;;5576:117;5371:329;;;;:::o;5706:60::-;5734:3;5755:5;5748:12;;5706:60;;;:::o;5772:142::-;5822:9;5855:53;5873:34;5882:24;5900:5;5882:24;:::i;:::-;5873:34;:::i;:::-;5855:53;:::i;:::-;5842:66;;5772:142;;;:::o;5920:126::-;5970:9;6003:37;6034:5;6003:37;:::i;:::-;5990:50;;5920:126;;;:::o;6052:151::-;6127:9;6160:37;6191:5;6160:37;:::i;:::-;6147:50;;6052:151;;;:::o;6209:181::-;6321:62;6377:5;6321:62;:::i;:::-;6316:3;6309:75;6209:181;;:::o;6396:272::-;6514:4;6552:2;6541:9;6537:18;6529:26;;6565:96;6658:1;6647:9;6643:17;6634:6;6565:96;:::i;:::-;6396:272;;;;:::o;6674:118::-;6761:24;6779:5;6761:24;:::i;:::-;6756:3;6749:37;6674:118;;:::o;6798:222::-;6891:4;6929:2;6918:9;6914:18;6906:26;;6942:71;7010:1;6999:9;6995:17;6986:6;6942:71;:::i;:::-;6798:222;;;;:::o;7026:619::-;7103:6;7111;7119;7168:2;7156:9;7147:7;7143:23;7139:32;7136:119;;;7174:79;;:::i;:::-;7136:119;7294:1;7319:53;7364:7;7355:6;7344:9;7340:22;7319:53;:::i;:::-;7309:63;;7265:117;7421:2;7447:53;7492:7;7483:6;7472:9;7468:22;7447:53;:::i;:::-;7437:63;;7392:118;7549:2;7575:53;7620:7;7611:6;7600:9;7596:22;7575:53;:::i;:::-;7565:63;;7520:118;7026:619;;;;;:::o;7651:329::-;7710:6;7759:2;7747:9;7738:7;7734:23;7730:32;7727:119;;;7765:79;;:::i;:::-;7727:119;7885:1;7910:53;7955:7;7946:6;7935:9;7931:22;7910:53;:::i;:::-;7900:63;;7856:117;7651:329;;;;:::o;7986:86::-;8021:7;8061:4;8054:5;8050:16;8039:27;;7986:86;;;:::o;8078:112::-;8161:22;8177:5;8161:22;:::i;:::-;8156:3;8149:35;8078:112;;:::o;8196:214::-;8285:4;8323:2;8312:9;8308:18;8300:26;;8336:67;8400:1;8389:9;8385:17;8376:6;8336:67;:::i;:::-;8196:214;;;;:::o;8416:323::-;8472:6;8521:2;8509:9;8500:7;8496:23;8492:32;8489:119;;;8527:79;;:::i;:::-;8489:119;8647:1;8672:50;8714:7;8705:6;8694:9;8690:22;8672:50;:::i;:::-;8662:60;;8618:114;8416:323;;;;:::o;8745:118::-;8832:24;8850:5;8832:24;:::i;:::-;8827:3;8820:37;8745:118;;:::o;8869:222::-;8962:4;9000:2;8989:9;8985:18;8977:26;;9013:71;9081:1;9070:9;9066:17;9057:6;9013:71;:::i;:::-;8869:222;;;;:::o;9097:332::-;9218:4;9256:2;9245:9;9241:18;9233:26;;9269:71;9337:1;9326:9;9322:17;9313:6;9269:71;:::i;:::-;9350:72;9418:2;9407:9;9403:18;9394:6;9350:72;:::i;:::-;9097:332;;;;;:::o;9435:474::-;9503:6;9511;9560:2;9548:9;9539:7;9535:23;9531:32;9528:119;;;9566:79;;:::i;:::-;9528:119;9686:1;9711:53;9756:7;9747:6;9736:9;9732:22;9711:53;:::i;:::-;9701:63;;9657:117;9813:2;9839:53;9884:7;9875:6;9864:9;9860:22;9839:53;:::i;:::-;9829:63;;9784:118;9435:474;;;;;:::o;9915:::-;9983:6;9991;10040:2;10028:9;10019:7;10015:23;10011:32;10008:119;;;10046:79;;:::i;:::-;10008:119;10166:1;10191:53;10236:7;10227:6;10216:9;10212:22;10191:53;:::i;:::-;10181:63;;10137:117;10293:2;10319:53;10364:7;10355:6;10344:9;10340:22;10319:53;:::i;:::-;10309:63;;10264:118;9915:474;;;;;:::o;10395:180::-;10443:77;10440:1;10433:88;10540:4;10537:1;10530:15;10564:4;10561:1;10554:15;10581:320;10625:6;10662:1;10656:4;10652:12;10642:22;;10709:1;10703:4;10699:12;10730:18;10720:81;;10786:4;10778:6;10774:17;10764:27;;10720:81;10848:2;10840:6;10837:14;10817:18;10814:38;10811:84;;10867:18;;:::i;:::-;10811:84;10632:269;10581:320;;;:::o;10907:180::-;10955:77;10952:1;10945:88;11052:4;11049:1;11042:15;11076:4;11073:1;11066:15;11093:180;11141:77;11138:1;11131:88;11238:4;11235:1;11228:15;11262:4;11259:1;11252:15;11279:233;11318:3;11341:24;11359:5;11341:24;:::i;:::-;11332:33;;11387:66;11380:5;11377:77;11374:103;;11457:18;;:::i;:::-;11374:103;11504:1;11497:5;11493:13;11486:20;;11279:233;;;:::o;11518:191::-;11558:3;11577:20;11595:1;11577:20;:::i;:::-;11572:25;;11611:20;11629:1;11611:20;:::i;:::-;11606:25;;11654:1;11651;11647:9;11640:16;;11675:3;11672:1;11669:10;11666:36;;;11682:18;;:::i;:::-;11666:36;11518:191;;;;:::o;11715:224::-;11855:34;11851:1;11843:6;11839:14;11832:58;11924:7;11919:2;11911:6;11907:15;11900:32;11715:224;:::o;11945:366::-;12087:3;12108:67;12172:2;12167:3;12108:67;:::i;:::-;12101:74;;12184:93;12273:3;12184:93;:::i;:::-;12302:2;12297:3;12293:12;12286:19;;11945:366;;;:::o;12317:419::-;12483:4;12521:2;12510:9;12506:18;12498:26;;12570:9;12564:4;12560:20;12556:1;12545:9;12541:17;12534:47;12598:131;12724:4;12598:131;:::i;:::-;12590:139;;12317:419;;;:::o;12742:225::-;12882:34;12878:1;12870:6;12866:14;12859:58;12951:8;12946:2;12938:6;12934:15;12927:33;12742:225;:::o;12973:366::-;13115:3;13136:67;13200:2;13195:3;13136:67;:::i;:::-;13129:74;;13212:93;13301:3;13212:93;:::i;:::-;13330:2;13325:3;13321:12;13314:19;;12973:366;;;:::o;13345:419::-;13511:4;13549:2;13538:9;13534:18;13526:26;;13598:9;13592:4;13588:20;13584:1;13573:9;13569:17;13562:47;13626:131;13752:4;13626:131;:::i;:::-;13618:139;;13345:419;;;:::o;13770:182::-;13910:34;13906:1;13898:6;13894:14;13887:58;13770:182;:::o;13958:366::-;14100:3;14121:67;14185:2;14180:3;14121:67;:::i;:::-;14114:74;;14197:93;14286:3;14197:93;:::i;:::-;14315:2;14310:3;14306:12;14299:19;;13958:366;;;:::o;14330:419::-;14496:4;14534:2;14523:9;14519:18;14511:26;;14583:9;14577:4;14573:20;14569:1;14558:9;14554:17;14547:47;14611:131;14737:4;14611:131;:::i;:::-;14603:139;;14330:419;;;:::o;14755:223::-;14895:34;14891:1;14883:6;14879:14;14872:58;14964:6;14959:2;14951:6;14947:15;14940:31;14755:223;:::o;14984:366::-;15126:3;15147:67;15211:2;15206:3;15147:67;:::i;:::-;15140:74;;15223:93;15312:3;15223:93;:::i;:::-;15341:2;15336:3;15332:12;15325:19;;14984:366;;;:::o;15356:419::-;15522:4;15560:2;15549:9;15545:18;15537:26;;15609:9;15603:4;15599:20;15595:1;15584:9;15580:17;15573:47;15637:131;15763:4;15637:131;:::i;:::-;15629:139;;15356:419;;;:::o;15781:221::-;15921:34;15917:1;15909:6;15905:14;15898:58;15990:4;15985:2;15977:6;15973:15;15966:29;15781:221;:::o;16008:366::-;16150:3;16171:67;16235:2;16230:3;16171:67;:::i;:::-;16164:74;;16247:93;16336:3;16247:93;:::i;:::-;16365:2;16360:3;16356:12;16349:19;;16008:366;;;:::o;16380:419::-;16546:4;16584:2;16573:9;16569:18;16561:26;;16633:9;16627:4;16623:20;16619:1;16608:9;16604:17;16597:47;16661:131;16787:4;16661:131;:::i;:::-;16653:139;;16380:419;;;:::o;16805:179::-;16945:31;16941:1;16933:6;16929:14;16922:55;16805:179;:::o;16990:366::-;17132:3;17153:67;17217:2;17212:3;17153:67;:::i;:::-;17146:74;;17229:93;17318:3;17229:93;:::i;:::-;17347:2;17342:3;17338:12;17331:19;;16990:366;;;:::o;17362:419::-;17528:4;17566:2;17555:9;17551:18;17543:26;;17615:9;17609:4;17605:20;17601:1;17590:9;17586:17;17579:47;17643:131;17769:4;17643:131;:::i;:::-;17635:139;;17362:419;;;:::o;17787:224::-;17927:34;17923:1;17915:6;17911:14;17904:58;17996:7;17991:2;17983:6;17979:15;17972:32;17787:224;:::o;18017:366::-;18159:3;18180:67;18244:2;18239:3;18180:67;:::i;:::-;18173:74;;18256:93;18345:3;18256:93;:::i;:::-;18374:2;18369:3;18365:12;18358:19;;18017:366;;;:::o;18389:419::-;18555:4;18593:2;18582:9;18578:18;18570:26;;18642:9;18636:4;18632:20;18628:1;18617:9;18613:17;18606:47;18670:131;18796:4;18670:131;:::i;:::-;18662:139;;18389:419;;;:::o;18814:222::-;18954:34;18950:1;18942:6;18938:14;18931:58;19023:5;19018:2;19010:6;19006:15;18999:30;18814:222;:::o;19042:366::-;19184:3;19205:67;19269:2;19264:3;19205:67;:::i;:::-;19198:74;;19281:93;19370:3;19281:93;:::i;:::-;19399:2;19394:3;19390:12;19383:19;;19042:366;;;:::o;19414:419::-;19580:4;19618:2;19607:9;19603:18;19595:26;;19667:9;19661:4;19657:20;19653:1;19642:9;19638:17;19631:47;19695:131;19821:4;19695:131;:::i;:::-;19687:139;;19414:419;;;:::o;19839:228::-;19979:34;19975:1;19967:6;19963:14;19956:58;20048:11;20043:2;20035:6;20031:15;20024:36;19839:228;:::o;20073:366::-;20215:3;20236:67;20300:2;20295:3;20236:67;:::i;:::-;20229:74;;20312:93;20401:3;20312:93;:::i;:::-;20430:2;20425:3;20421:12;20414:19;;20073:366;;;:::o;20445:419::-;20611:4;20649:2;20638:9;20634:18;20626:26;;20698:9;20692:4;20688:20;20684:1;20673:9;20669:17;20662:47;20726:131;20852:4;20726:131;:::i;:::-;20718:139;;20445:419;;;:::o;20870:165::-;21010:17;21006:1;20998:6;20994:14;20987:41;20870:165;:::o;21041:366::-;21183:3;21204:67;21268:2;21263:3;21204:67;:::i;:::-;21197:74;;21280:93;21369:3;21280:93;:::i;:::-;21398:2;21393:3;21389:12;21382:19;;21041:366;;;:::o;21413:419::-;21579:4;21617:2;21606:9;21602:18;21594:26;;21666:9;21660:4;21656:20;21652:1;21641:9;21637:17;21630:47;21694:131;21820:4;21694:131;:::i;:::-;21686:139;;21413:419;;;:::o;21838:168::-;21978:20;21974:1;21966:6;21962:14;21955:44;21838:168;:::o;22012:366::-;22154:3;22175:67;22239:2;22234:3;22175:67;:::i;:::-;22168:74;;22251:93;22340:3;22251:93;:::i;:::-;22369:2;22364:3;22360:12;22353:19;;22012:366;;;:::o;22384:419::-;22550:4;22588:2;22577:9;22573:18;22565:26;;22637:9;22631:4;22627:20;22623:1;22612:9;22608:17;22601:47;22665:131;22791:4;22665:131;:::i;:::-;22657:139;;22384:419;;;:::o;22809:410::-;22849:7;22872:20;22890:1;22872:20;:::i;:::-;22867:25;;22906:20;22924:1;22906:20;:::i;:::-;22901:25;;22961:1;22958;22954:9;22983:30;23001:11;22983:30;:::i;:::-;22972:41;;23162:1;23153:7;23149:15;23146:1;23143:22;23123:1;23116:9;23096:83;23073:139;;23192:18;;:::i;:::-;23073:139;22857:362;22809:410;;;;:::o;23225:180::-;23273:77;23270:1;23263:88;23370:4;23367:1;23360:15;23394:4;23391:1;23384:15;23411:185;23451:1;23468:20;23486:1;23468:20;:::i;:::-;23463:25;;23502:20;23520:1;23502:20;:::i;:::-;23497:25;;23541:1;23531:35;;23546:18;;:::i;:::-;23531:35;23588:1;23585;23581:9;23576:14;;23411:185;;;;:::o;23602:194::-;23642:4;23662:20;23680:1;23662:20;:::i;:::-;23657:25;;23696:20;23714:1;23696:20;:::i;:::-;23691:25;;23740:1;23737;23733:9;23725:17;;23764:1;23758:4;23755:11;23752:37;;;23769:18;;:::i;:::-;23752:37;23602:194;;;;:::o;23802:180::-;23850:77;23847:1;23840:88;23947:4;23944:1;23937:15;23971:4;23968:1;23961:15;23988:143;24045:5;24076:6;24070:13;24061:22;;24092:33;24119:5;24092:33;:::i;:::-;23988:143;;;;:::o;24137:351::-;24207:6;24256:2;24244:9;24235:7;24231:23;24227:32;24224:119;;;24262:79;;:::i;:::-;24224:119;24382:1;24407:64;24463:7;24454:6;24443:9;24439:22;24407:64;:::i;:::-;24397:74;;24353:128;24137:351;;;;:::o;24494:85::-;24539:7;24568:5;24557:16;;24494:85;;;:::o;24585:158::-;24643:9;24676:61;24694:42;24703:32;24729:5;24703:32;:::i;:::-;24694:42;:::i;:::-;24676:61;:::i;:::-;24663:74;;24585:158;;;:::o;24749:147::-;24844:45;24883:5;24844:45;:::i;:::-;24839:3;24832:58;24749:147;;:::o;24902:114::-;24969:6;25003:5;24997:12;24987:22;;24902:114;;;:::o;25022:184::-;25121:11;25155:6;25150:3;25143:19;25195:4;25190:3;25186:14;25171:29;;25022:184;;;;:::o;25212:132::-;25279:4;25302:3;25294:11;;25332:4;25327:3;25323:14;25315:22;;25212:132;;;:::o;25350:108::-;25427:24;25445:5;25427:24;:::i;:::-;25422:3;25415:37;25350:108;;:::o;25464:179::-;25533:10;25554:46;25596:3;25588:6;25554:46;:::i;:::-;25632:4;25627:3;25623:14;25609:28;;25464:179;;;;:::o;25649:113::-;25719:4;25751;25746:3;25742:14;25734:22;;25649:113;;;:::o;25798:732::-;25917:3;25946:54;25994:5;25946:54;:::i;:::-;26016:86;26095:6;26090:3;26016:86;:::i;:::-;26009:93;;26126:56;26176:5;26126:56;:::i;:::-;26205:7;26236:1;26221:284;26246:6;26243:1;26240:13;26221:284;;;26322:6;26316:13;26349:63;26408:3;26393:13;26349:63;:::i;:::-;26342:70;;26435:60;26488:6;26435:60;:::i;:::-;26425:70;;26281:224;26268:1;26265;26261:9;26256:14;;26221:284;;;26225:14;26521:3;26514:10;;25922:608;;;25798:732;;;;:::o;26536:831::-;26799:4;26837:3;26826:9;26822:19;26814:27;;26851:71;26919:1;26908:9;26904:17;26895:6;26851:71;:::i;:::-;26932:80;27008:2;26997:9;26993:18;26984:6;26932:80;:::i;:::-;27059:9;27053:4;27049:20;27044:2;27033:9;27029:18;27022:48;27087:108;27190:4;27181:6;27087:108;:::i;:::-;27079:116;;27205:72;27273:2;27262:9;27258:18;27249:6;27205:72;:::i;:::-;27287:73;27355:3;27344:9;27340:19;27331:6;27287:73;:::i;:::-;26536:831;;;;;;;;:::o;27373:225::-;27513:34;27509:1;27501:6;27497:14;27490:58;27582:8;27577:2;27569:6;27565:15;27558:33;27373:225;:::o;27604:366::-;27746:3;27767:67;27831:2;27826:3;27767:67;:::i;:::-;27760:74;;27843:93;27932:3;27843:93;:::i;:::-;27961:2;27956:3;27952:12;27945:19;;27604:366;;;:::o;27976:419::-;28142:4;28180:2;28169:9;28165:18;28157:26;;28229:9;28223:4;28219:20;28215:1;28204:9;28200:17;28193:47;28257:131;28383:4;28257:131;:::i;:::-;28249:139;;27976:419;;;:::o

Swarm Source

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