ETH Price: $3,348.10 (+2.61%)
 

Overview

Max Total Supply

10,000,000 DTM

Holders

29

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
findpeacewithinyourself.eth
Balance
2.779269403903713702 DTM

Value
$0.00
0xc8cb66adeaedc87a0764d23f8313da970da4bc2b
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:
DumbMoney

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-09-26
*/

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     *
     * Furthermore, `isContract` will also return true if the target contract within
     * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,
     * which only has an effect at the end of a transaction.
     * ====
     *
     * [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://consensys.net/diligence/blog/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.8.0/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);
        }
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;




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

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * 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 default value returned by this function, unless
     * it's 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 {}
}

// File: @openzeppelin/contracts/utils/math/SafeMath.sol


// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

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

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

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

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

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

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

// File: contracts/DumbMoney.sol


pragma solidity ^0.8.18;

// import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";






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

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

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

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

    function allPairsLength() external view returns (uint);

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

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

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

    function WETH() external pure returns (address);

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

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

    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);

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

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

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

    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}
/*
1% burn for each buy and sell transaction.
1% allocated to marketing for each buy and sell transaction.
1% contributed back to liquidity for each buy and sell transaction.
1% Reflection 

Token Details:
Token Name: Dumbmoney
Token Symbol: DTM
Total Supply: 10,000,000

*/
contract DumbMoney is Context, IERC20, Ownable {
    using SafeMath for uint256;
    using Address for address;

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

    mapping(address => bool) private _isExcludedFromFee;
    mapping(address => bool) private _isExcluded;
    address[] private _excluded;

    uint256 private constant MAX = ~uint256(0);
    uint256 public _tTotal = 10000000 * 10 ** 18;
    uint256 private _rTotal = (MAX - (MAX % _tTotal));
    uint256 private _tFeeTotal;

    string public constant _symbol = "DTM";
    string public constant _name = "Dumbmoney";
    uint8 public _decimals = 18;

    uint256 public _tokenHolderPercentage = 100; //expressed in multiple of 100s
    uint256 private _previousTokenHolderPercentage = _tokenHolderPercentage;

    uint256 public _liquidityFee = 100; //expressed in multiple of 100s
    uint256 private _previousLiquidityFee = _liquidityFee;

    uint256 public _burnFee = 100; //expressed in multiple of 100s
    uint256 private _previousBurnFee = _burnFee;

    uint256 public _marketingPercentage = 100; //expressed in multiple of 100s
    uint256 private _previousMarketingPercentage = _marketingPercentage;
    address public marketingWallet;

    // IuniswapRouter02 public immutable uniswapRouter;
    IUniswapV2Router02 public uniswapRouter;
    address public uniswapPair;

    bool inSwapAndLiquify;
    bool public swapAndLiquifyEnabled = false;

    uint256 private numTokensSellToAddToLiquidity = 1000000 * 10 ** 18;

    event MinTokensBeforeSwapUpdated(uint256 minTokensBeforeSwap);
    event SwapAndLiquifyEnabledUpdated(bool enabled);
    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiqudity
    );

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

    constructor(address _marketingWallet) {
        marketingWallet = _marketingWallet;
        _rOwned[_msgSender()] = _rTotal;
        uniswapRouter = IUniswapV2Router02(
            0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D 
        );

        // Create a uniswapPair pair for this new token
        uniswapPair = IUniswapV2Factory(uniswapRouter.factory()).createPair(
            address(this),
            uniswapRouter.WETH()
        );

        //exclude owner and this contract from fee
        _isExcludedFromFee[owner()] = true;
        _isExcludedFromFee[address(this)] = true;

        emit Transfer(address(0), _msgSender(), _tTotal);
    }

    function name() public pure returns (string memory) {
        return _name;
    }

    function symbol() public pure returns (string memory) {
        return _symbol;
    }

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

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

    function balanceOf(address account) public view override returns (uint256) {
        if (_isExcluded[account]) return _tOwned[account];
        return tokenFromReflection(_rOwned[account]);
    }

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

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

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

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(
            sender,
            _msgSender(),
            _allowances[sender][_msgSender()].sub(
                amount,
                "ERC20: transfer amount exceeds allowance"
            )
        );
        return true;
    }

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

    function decreaseAllowance(
        address spender,
        uint256 subtractedValue
    ) public virtual returns (bool) {
        _approve(
            _msgSender(),
            spender,
            _allowances[_msgSender()][spender].sub(
                subtractedValue,
                "ERC20: decreased allowance below zero"
            )
        );
        return true;
    }

    function isExcludedFromReward(address account) public view returns (bool) {
        return _isExcluded[account];
    }

    function isExcludedFromFee(address account) public view returns (bool) {
        return _isExcludedFromFee[account];
    }

    function totalFees() public view returns (uint256) {
        return _tFeeTotal;
    }

    function setMarketingFeePercent(
        uint256 newMarketingFee
    ) external onlyOwner {
        _marketingPercentage = newMarketingFee;
    }

    function setTokenHolderPercent(
        uint256 tokenHolderPercentage
    ) external onlyOwner {
        _tokenHolderPercentage = tokenHolderPercentage;
    }

    function setLiquidityFeePercent(uint256 liquidityFee) external onlyOwner {
        _liquidityFee = liquidityFee;
    }

    function setBurnFeePercent(uint256 burnFee) external onlyOwner {
        _burnFee = burnFee;
    }

    function deliver(uint256 tAmount) public {
        address sender = _msgSender();
        require(
            !_isExcluded[sender],
            "Excluded addresses cannot call this function"
        );
        (uint256 rAmount, , , , , ) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rTotal = _rTotal.sub(rAmount);
        _tFeeTotal = _tFeeTotal.add(tAmount);
    }

    function reflectionFromToken(
        uint256 tAmount,
        bool deductTransferFee
    ) public view returns (uint256) {
        require(tAmount <= _tTotal, "Amount must be less than supply");
        if (!deductTransferFee) {
            (uint256 rAmount, , , , , ) = _getValues(tAmount);
            return rAmount;
        } else {
            (, uint256 rTransferAmount, , , , ) = _getValues(tAmount);
            return rTransferAmount;
        }
    }

    function tokenFromReflection(
        uint256 rAmount
    ) public view returns (uint256) {
        require(
            rAmount <= _rTotal,
            "Amount must be less than total reflections"
        );
        uint256 currentRate = _getRate();
        return rAmount.div(currentRate);
    }

    function excludeFromReward(address account) public onlyOwner {
        require(
            account != 0x10ED43C718714eb63d5aA57B78B54704E256024E,
            "We can not exclude Pancake router."
        );
        require(!_isExcluded[account], "Account is already excluded");
        if (_rOwned[account] > 0) {
            _tOwned[account] = tokenFromReflection(_rOwned[account]);
        }
        _isExcluded[account] = true;
        _excluded.push(account);
    }

    function includeInReward(address account) external onlyOwner {
        require(_isExcluded[account], "Account is already excluded");
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_excluded[i] == account) {
                _excluded[i] = _excluded[_excluded.length - 1];
                _tOwned[account] = 0;
                _isExcluded[account] = false;
                _excluded.pop();
                break;
            }
        }
    }

    function _transferBothExcluded(
        address sender,
        address recipient,
        uint256 tAmount
    ) private {
        (
            uint256 rAmount,
            uint256 rTransferAmount,
            uint256 rFee,
            uint256 tTransferAmount,
            uint256 tFee,
            uint256 tLiquidity
        ) = _getValues(tAmount);
        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _takeLiquidity(tLiquidity);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

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

    function _reflectFee(uint256 rFee, uint256 tFee) private {
        _rTotal = _rTotal.sub(rFee);
        _tFeeTotal = _tFeeTotal.add(tFee);
    }

    function _getValues(
        uint256 tAmount
    )
        private
        view
        returns (uint256, uint256, uint256, uint256, uint256, uint256)
    {
        (
            uint256 tTransferAmount,
            uint256 tFee,
            uint256 tLiquidity
        ) = _getTValues(tAmount);
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(
            tAmount,
            tFee,
            tLiquidity,
            _getRate()
        );
        return (
            rAmount,
            rTransferAmount,
            rFee,
            tTransferAmount,
            tFee,
            tLiquidity
        );
    }

    function _getTValues(
        uint256 tAmount
    ) private view returns (uint256, uint256, uint256) {
        uint256 tFee = calculateHolderPercentage(tAmount);
        uint256 tLiquidity = calculateLiquidityFee(tAmount);
        uint256 tTransferAmount = tAmount.sub(tFee).sub(tLiquidity);
        return (tTransferAmount, tFee, tLiquidity);
    }

    function _getRValues(
        uint256 tAmount,
        uint256 tFee,
        uint256 tLiquidity,
        uint256 currentRate
    ) private pure returns (uint256, uint256, uint256) {
        uint256 rAmount = tAmount.mul(currentRate);
        uint256 rFee = tFee.mul(currentRate);
        uint256 rLiquidity = tLiquidity.mul(currentRate);
        uint256 rTransferAmount = rAmount.sub(rFee).sub(rLiquidity);
        return (rAmount, rTransferAmount, rFee);
    }

    function _getRate() private view returns (uint256) {
        (uint256 rSupply, uint256 tSupply) = _getCurrentSupply();
        return rSupply.div(tSupply);
    }

    function _getCurrentSupply() private view returns (uint256, uint256) {
        uint256 rSupply = _rTotal;
        uint256 tSupply = _tTotal;
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (
                _rOwned[_excluded[i]] > rSupply ||
                _tOwned[_excluded[i]] > tSupply
            ) return (_rTotal, _tTotal);
            rSupply = rSupply.sub(_rOwned[_excluded[i]]);
            tSupply = tSupply.sub(_tOwned[_excluded[i]]);
        }
        if (rSupply < _rTotal.div(_tTotal)) return (_rTotal, _tTotal);
        return (rSupply, tSupply);
    }

    function _takeLiquidity(uint256 tLiquidity) private {
        uint256 currentRate = _getRate();
        uint256 rLiquidity = tLiquidity.mul(currentRate);
        _rOwned[address(this)] = _rOwned[address(this)].add(rLiquidity);
        if (_isExcluded[address(this)])
            _tOwned[address(this)] = _tOwned[address(this)].add(tLiquidity);
    }

    function calculateHolderPercentage(
        uint256 _amount
    ) private view returns (uint256) {
        return _amount.mul(_tokenHolderPercentage).div(10 ** 4);
    }

    function calculateLiquidityFee(
        uint256 _amount
    ) private view returns (uint256) {
        return _amount.mul(_liquidityFee).div(10 ** 4);
    }

    function removeAllFee() private {
        _tokenHolderPercentage = 0;
        _liquidityFee = 0;
        _burnFee = 0;
        _marketingPercentage = 0;
    }

    function restoreAllFee() private {
        _tokenHolderPercentage = _previousTokenHolderPercentage;
        _liquidityFee = _previousLiquidityFee;
        _burnFee = _previousBurnFee;
        _marketingPercentage = _previousMarketingPercentage;
    }

    function _approve(address owner, address spender, uint256 amount) private {
        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);
    }

    function _transfer(address from, address to, uint256 amount) private {
        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");

        // 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 >=
            numTokensSellToAddToLiquidity;
        if (
            overMinTokenBalance &&
            !inSwapAndLiquify &&
            from != uniswapPair &&
            swapAndLiquifyEnabled
        ) {
            contractTokenBalance = numTokensSellToAddToLiquidity;
            //add liquidity
            swapAndLiquify(contractTokenBalance);
        }

        //transfer amount, it will take tax, burn, liquidity fee
        _tokenTransfer(from, to, amount);
    }

    function swapAndLiquify(uint256 contractTokenBalance) private lockTheSwap {
        // split the contract balance into halves
        uint256 half = contractTokenBalance.div(2);
        uint256 otherHalf = contractTokenBalance.sub(half);

        // capture the contract's current ETH balance.
        // this is so that we can capture exactly the amount of ETH that the
        // swap creates, and not make the liquidity event include any ETH that
        // has been manually sent to the contract
        uint256 initialBalance = address(this).balance;

        // swap tokens for ETH
        swapTokensForEth(half); // <- this breaks the ETH -> HATE swap when swap+liquify is triggered

        // how much ETH did we just swap into?
        uint256 newBalance = address(this).balance.sub(initialBalance);

        // add liquidity to uniswap
        addLiquidity(otherHalf, newBalance);

        emit SwapAndLiquify(half, newBalance, otherHalf);
    }

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

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

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

    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(uniswapRouter), tokenAmount);

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

    //this method is responsible for taking all fee, if takeFee is true
    function _tokenTransfer(
        address sender,
        address recipient,
        uint256 amount
    ) private {
        if (_isExcludedFromFee[sender] || _isExcludedFromFee[recipient]) {
            removeAllFee();
        }
        //Calculate burn amount and marketingPercentage amount
        uint256 burnAmt = amount.mul(_burnFee).div(10000);
        uint256 marketingAmt = amount.mul(_marketingPercentage).div(10000);

        if (_isExcluded[sender] && !_isExcluded[recipient]) {
            _transferFromExcluded(
                sender,
                recipient,
                (amount.sub(burnAmt).sub(marketingAmt))
            );
        } else if (!_isExcluded[sender] && _isExcluded[recipient]) {
            _transferToExcluded(
                sender,
                recipient,
                (amount.sub(burnAmt).sub(marketingAmt))
            );
        } else if (!_isExcluded[sender] && !_isExcluded[recipient]) {
            _transferStandard(
                sender,
                recipient,
                (amount.sub(burnAmt).sub(marketingAmt))
            );
        } else if (_isExcluded[sender] && _isExcluded[recipient]) {
            _transferBothExcluded(
                sender,
                recipient,
                (amount.sub(burnAmt).sub(marketingAmt))
            );
        } else {
            _transferStandard(
                sender,
                recipient,
                (amount.sub(burnAmt).sub(marketingAmt))
            );
        }

        //Temporarily remove fees to transfer to burn address and marketing wallet
        _tokenHolderPercentage = 0;
        _liquidityFee = 0;

        //Send transfers to burn and marketing wallet
        _transferStandard(sender, address(0), burnAmt);
        _transferStandard(sender, marketingWallet, marketingAmt);

        //Restore tax and liquidity fees
        _tokenHolderPercentage = _previousTokenHolderPercentage;
        _liquidityFee = _previousLiquidityFee;

        if (_isExcludedFromFee[sender] || _isExcludedFromFee[recipient])
            restoreAllFee();
    }

    function _transferStandard(
        address sender,
        address recipient,
        uint256 tAmount
    ) private {
        (
            uint256 rAmount,
            uint256 rTransferAmount,
            uint256 rFee,
            uint256 tTransferAmount,
            uint256 tFee,
            uint256 tLiquidity
        ) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _takeLiquidity(tLiquidity);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferToExcluded(
        address sender,
        address recipient,
        uint256 tAmount
    ) private {
        (
            uint256 rAmount,
            uint256 rTransferAmount,
            uint256 rFee,
            uint256 tTransferAmount,
            uint256 tFee,
            uint256 tLiquidity
        ) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _takeLiquidity(tLiquidity);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferFromExcluded(
        address sender,
        address recipient,
        uint256 tAmount
    ) private {
        (
            uint256 rAmount,
            uint256 rTransferAmount,
            uint256 rFee,
            uint256 tTransferAmount,
            uint256 tFee,
            uint256 tLiquidity
        ) = _getValues(tAmount);
        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _takeLiquidity(tLiquidity);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function excludeFromFee(address account) public onlyOwner {
        _isExcludedFromFee[account] = true;
    }

    function includeInFee(address account) public onlyOwner {
        _isExcludedFromFee[account] = false;
    }

    function setmarketingWallet(address newWallet) external onlyOwner {
        marketingWallet = newWallet;
    }

    function setSwapAndLiquifyEnabled(bool _enabled) public onlyOwner {
        swapAndLiquifyEnabled = _enabled;
        emit SwapAndLiquifyEnabledUpdated(_enabled);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_marketingWallet","type":"address"}],"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":false,"internalType":"uint256","name":"minTokensBeforeSwap","type":"uint256"}],"name":"MinTokensBeforeSwapUpdated","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":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapAndLiquifyEnabledUpdated","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":[],"name":"_burnFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_liquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_marketingPercentage","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":"_symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_tTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_tokenHolderPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[],"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":"uint256","name":"tAmount","type":"uint256"}],"name":"deliver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"},{"internalType":"bool","name":"deductTransferFee","type":"bool"}],"name":"reflectionFromToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"burnFee","type":"uint256"}],"name":"setBurnFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"liquidityFee","type":"uint256"}],"name":"setLiquidityFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMarketingFee","type":"uint256"}],"name":"setMarketingFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenHolderPercentage","type":"uint256"}],"name":"setTokenHolderPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"setmarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapRouter","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526a084595161401484a0000006007556007546000196200002591906200063b565b600019620000349190620006a2565b6008556012600a60006101000a81548160ff021916908360ff1602179055506064600b55600b54600c556064600d55600d54600e556064600f55600f54601055606460115560115460125560006015806101000a81548160ff02191690831515021790555069d3c21bcecceda1000000601655348015620000b457600080fd5b506040516200522b3803806200522b8339818101604052810190620000da919062000747565b620000fa620000ee6200050d60201b60201c565b6200051560201b60201c565b80601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060085460016000620001526200050d60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550737a250d5630b4cf539739df2c5dacb4c659f2488d601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000253573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000279919062000747565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539630601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000303573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000329919062000747565b6040518363ffffffff1660e01b8152600401620003489291906200078a565b6020604051808303816000875af115801562000368573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200038e919062000747565b601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160046000620003e4620005d960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506200049d6200050d60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600754604051620004fe9190620007c8565b60405180910390a350620007e5565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000620006488262000602565b9150620006558362000602565b9250826200066857620006676200060c565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620006af8262000602565b9150620006bc8362000602565b9250828203905081811115620006d757620006d662000673565b5b92915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200070f82620006e2565b9050919050565b620007218162000702565b81146200072d57600080fd5b50565b600081519050620007418162000716565b92915050565b60006020828403121562000760576200075f620006dd565b5b6000620007708482850162000730565b91505092915050565b620007848162000702565b82525050565b6000604082019050620007a1600083018562000779565b620007b0602083018462000779565b9392505050565b620007c28162000602565b82525050565b6000602082019050620007df6000830184620007b7565b92915050565b614a3680620007f56000396000f3fe6080604052600436106102555760003560e01c8063715018a611610139578063a9059cbb116100b6578063c816841b1161007a578063c816841b146108fb578063cea2695814610926578063d28d88521461094f578063dd62ed3e1461097a578063ea2f0b37146109b7578063f2fde38b146109e05761025c565b8063a9059cbb14610814578063af465a2714610851578063b09f12661461087c578063c0b0fda2146108a7578063c49b9a80146108d25761025c565b80638da5cb5b116100fd5780638da5cb5b1461072f5780638ee88c531461075a57806395d89b41146107835780639ef340ea146107ae578063a457c2d7146107d75761025c565b8063715018a61461065a578063735de9f71461067157806375f0a8741461069c578063762c3915146106c757806388f82020146106f25761025c565b806339509351116101d25780634a74bb02116101965780634a74bb021461053657806352390c02146105615780635342acb41461058a57806359f26ff6146105c75780636bc87c3a146105f257806370a082311461061d5761025c565b806339509351146104415780633bd5d1731461047e578063437823ec146104a75780634549b039146104d0578063457c194c1461050d5761025c565b806323b872dd1161021957806323b872dd146103485780632d83811914610385578063313ce567146103c257806332424aa3146103ed5780633685d419146104185761025c565b806306fdde0314610261578063095ea7b31461028c57806313114a9d146102c957806318160ddd146102f4578063224611731461031f5761025c565b3661025c57005b600080fd5b34801561026d57600080fd5b50610276610a09565b6040516102839190613aee565b60405180910390f35b34801561029857600080fd5b506102b360048036038101906102ae9190613ba9565b610a46565b6040516102c09190613c04565b60405180910390f35b3480156102d557600080fd5b506102de610a64565b6040516102eb9190613c2e565b60405180910390f35b34801561030057600080fd5b50610309610a6e565b6040516103169190613c2e565b60405180910390f35b34801561032b57600080fd5b5061034660048036038101906103419190613c49565b610a78565b005b34801561035457600080fd5b5061036f600480360381019061036a9190613c76565b610ac4565b60405161037c9190613c04565b60405180910390f35b34801561039157600080fd5b506103ac60048036038101906103a79190613cc9565b610b9d565b6040516103b99190613c2e565b60405180910390f35b3480156103ce57600080fd5b506103d7610c0b565b6040516103e49190613d12565b60405180910390f35b3480156103f957600080fd5b50610402610c22565b60405161040f9190613d12565b60405180910390f35b34801561042457600080fd5b5061043f600480360381019061043a9190613c49565b610c35565b005b34801561044d57600080fd5b5061046860048036038101906104639190613ba9565b610ef6565b6040516104759190613c04565b60405180910390f35b34801561048a57600080fd5b506104a560048036038101906104a09190613cc9565b610fa9565b005b3480156104b357600080fd5b506104ce60048036038101906104c99190613c49565b611124565b005b3480156104dc57600080fd5b506104f760048036038101906104f29190613d59565b611187565b6040516105049190613c2e565b60405180910390f35b34801561051957600080fd5b50610534600480360381019061052f9190613cc9565b61120b565b005b34801561054257600080fd5b5061054b61121d565b6040516105589190613c04565b60405180910390f35b34801561056d57600080fd5b5061058860048036038101906105839190613c49565b61122e565b005b34801561059657600080fd5b506105b160048036038101906105ac9190613c49565b6114d7565b6040516105be9190613c04565b60405180910390f35b3480156105d357600080fd5b506105dc61152d565b6040516105e99190613c2e565b60405180910390f35b3480156105fe57600080fd5b50610607611533565b6040516106149190613c2e565b60405180910390f35b34801561062957600080fd5b50610644600480360381019061063f9190613c49565b611539565b6040516106519190613c2e565b60405180910390f35b34801561066657600080fd5b5061066f611624565b005b34801561067d57600080fd5b50610686611638565b6040516106939190613df8565b60405180910390f35b3480156106a857600080fd5b506106b161165e565b6040516106be9190613e22565b60405180910390f35b3480156106d357600080fd5b506106dc611684565b6040516106e99190613c2e565b60405180910390f35b3480156106fe57600080fd5b5061071960048036038101906107149190613c49565b61168a565b6040516107269190613c04565b60405180910390f35b34801561073b57600080fd5b506107446116e0565b6040516107519190613e22565b60405180910390f35b34801561076657600080fd5b50610781600480360381019061077c9190613cc9565b611709565b005b34801561078f57600080fd5b5061079861171b565b6040516107a59190613aee565b60405180910390f35b3480156107ba57600080fd5b506107d560048036038101906107d09190613cc9565b611758565b005b3480156107e357600080fd5b506107fe60048036038101906107f99190613ba9565b61176a565b60405161080b9190613c04565b60405180910390f35b34801561082057600080fd5b5061083b60048036038101906108369190613ba9565b611837565b6040516108489190613c04565b60405180910390f35b34801561085d57600080fd5b50610866611855565b6040516108739190613c2e565b60405180910390f35b34801561088857600080fd5b5061089161185b565b60405161089e9190613aee565b60405180910390f35b3480156108b357600080fd5b506108bc611894565b6040516108c99190613c2e565b60405180910390f35b3480156108de57600080fd5b506108f960048036038101906108f49190613e3d565b61189a565b005b34801561090757600080fd5b506109106118f5565b60405161091d9190613e22565b60405180910390f35b34801561093257600080fd5b5061094d60048036038101906109489190613cc9565b61191b565b005b34801561095b57600080fd5b5061096461192d565b6040516109719190613aee565b60405180910390f35b34801561098657600080fd5b506109a1600480360381019061099c9190613e6a565b611966565b6040516109ae9190613c2e565b60405180910390f35b3480156109c357600080fd5b506109de60048036038101906109d99190613c49565b6119ed565b005b3480156109ec57600080fd5b50610a076004803603810190610a029190613c49565b611a50565b005b60606040518060400160405280600981526020017f44756d626d6f6e65790000000000000000000000000000000000000000000000815250905090565b6000610a5a610a53611ad3565b8484611adb565b6001905092915050565b6000600954905090565b6000600754905090565b610a80611ca4565b80601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000610ad1848484611d22565b610b9284610add611ad3565b610b8d856040518060600160405280602881526020016149b460289139600360008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610b43611ad3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611f0a9092919063ffffffff16565b611adb565b600190509392505050565b6000600854821115610be4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bdb90613f1c565b60405180910390fd5b6000610bee611f5f565b9050610c038184611f8a90919063ffffffff16565b915050919050565b6000600a60009054906101000a900460ff16905090565b600a60009054906101000a900460ff1681565b610c3d611ca4565b600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610cc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc090613f88565b60405180910390fd5b60005b600680549050811015610ef2578173ffffffffffffffffffffffffffffffffffffffff1660068281548110610d0457610d03613fa8565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610edf5760066001600680549050610d5e9190614006565b81548110610d6f57610d6e613fa8565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660068281548110610dae57610dad613fa8565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506006805480610ea557610ea461403a565b5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690559055610ef2565b8080610eea90614069565b915050610ccc565b5050565b6000610f9f610f03611ad3565b84610f9a8560036000610f14611ad3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611fa090919063ffffffff16565b611adb565b6001905092915050565b6000610fb3611ad3565b9050600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611042576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103990614123565b60405180910390fd5b600061104d83611fb6565b505050505090506110a681600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461201290919063ffffffff16565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506110fe8160085461201290919063ffffffff16565b60088190555061111983600954611fa090919063ffffffff16565b600981905550505050565b61112c611ca4565b6001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60006007548311156111ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c59061418f565b60405180910390fd5b816111ee5760006111de84611fb6565b5050505050905080915050611205565b60006111f984611fb6565b50505050915050809150505b92915050565b611213611ca4565b8060118190555050565b60158054906101000a900460ff1681565b611236611ca4565b7310ed43c718714eb63d5aa57b78b54704e256024e73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036112b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112af90614221565b60405180910390fd5b600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611345576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133c90613f88565b60405180910390fd5b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115611419576113d5600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b9d565b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b6001600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506006819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b600b5481565b600d5481565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156115d457600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905061161f565b61161c600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b9d565b90505b919050565b61162c611ca4565b6116366000612028565b565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60115481565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611711611ca4565b80600d8190555050565b60606040518060400160405280600381526020017f44544d0000000000000000000000000000000000000000000000000000000000815250905090565b611760611ca4565b80600b8190555050565b600061182d611777611ad3565b84611828856040518060600160405280602581526020016149dc60259139600360006117a1611ad3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611f0a9092919063ffffffff16565b611adb565b6001905092915050565b600061184b611844611ad3565b8484611d22565b6001905092915050565b60075481565b6040518060400160405280600381526020017f44544d000000000000000000000000000000000000000000000000000000000081525081565b600f5481565b6118a2611ca4565b806015806101000a81548160ff0219169083151502179055507f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc159816040516118ea9190613c04565b60405180910390a150565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611923611ca4565b80600f8190555050565b6040518060400160405280600981526020017f44756d626d6f6e6579000000000000000000000000000000000000000000000081525081565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6119f5611ca4565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b611a58611ca4565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611ac7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abe906142b3565b60405180910390fd5b611ad081612028565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611b4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4190614345565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611bb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb0906143d7565b60405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611c979190613c2e565b60405180910390a3505050565b611cac611ad3565b73ffffffffffffffffffffffffffffffffffffffff16611cca6116e0565b73ffffffffffffffffffffffffffffffffffffffff1614611d20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1790614443565b60405180910390fd5b565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611d91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d88906144d5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611e00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df790614567565b60405180910390fd5b60008111611e43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3a906145f9565b60405180910390fd5b6000611e4e30611539565b905060006016548210159050808015611e745750601560149054906101000a900460ff16155b8015611ece5750601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b8015611ee4575060158054906101000a900460ff165b15611ef8576016549150611ef7826120ec565b5b611f038585856121c2565b5050505050565b6000838311158290611f52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f499190613aee565b60405180910390fd5b5082840390509392505050565b6000806000611f6c61277f565b91509150611f838183611f8a90919063ffffffff16565b9250505090565b60008183611f989190614648565b905092915050565b60008183611fae9190614679565b905092915050565b6000806000806000806000806000611fcd8a612a32565b9250925092506000806000611feb8d8686611fe6611f5f565b612a8c565b9250925092508282828888889b509b509b509b509b509b5050505050505091939550919395565b600081836120209190614006565b905092915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001601560146101000a81548160ff021916908315150217905550600061211d600283611f8a90919063ffffffff16565b90506000612134828461201290919063ffffffff16565b9050600047905061214483612b15565b6000612159824761201290919063ffffffff16565b90506121658382612d58565b7f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb561848285604051612198939291906146ad565b60405180910390a1505050506000601560146101000a81548160ff02191690831515021790555050565b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806122635750600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1561227157612270612e3d565b5b600061229c61271061228e600f5485612e5f90919063ffffffff16565b611f8a90919063ffffffff16565b905060006122c96127106122bb60115486612e5f90919063ffffffff16565b611f8a90919063ffffffff16565b9050600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561236e5750600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156123a7576123a2858561239d8461238f878961201290919063ffffffff16565b61201290919063ffffffff16565b612e75565b61266e565b600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615801561244a5750600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156124835761247e85856124798461246b878961201290919063ffffffff16565b61201290919063ffffffff16565b6130d5565b61266d565b600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156125275750600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156125605761255b858561255684612548878961201290919063ffffffff16565b61201290919063ffffffff16565b613335565b61266c565b600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156126025750600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1561263b57612636858561263184612623878961201290919063ffffffff16565b61201290919063ffffffff16565b613500565b61266b565b61266a858561266584612657878961201290919063ffffffff16565b61201290919063ffffffff16565b613335565b5b5b5b5b6000600b819055506000600d8190555061268a85600084613335565b6126b785601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683613335565b600c54600b81905550600e54600d81905550600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168061276a5750600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15612778576127776137f5565b5b5050505050565b600080600060085490506000600754905060005b6006805490508110156129f5578260016000600684815481106127b9576127b8613fa8565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411806128a7575081600260006006848154811061283f5761283e613fa8565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054115b156128be5760085460075494509450505050612a2e565b61294e60016000600684815481106128d9576128d8613fa8565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548461201290919063ffffffff16565b92506129e0600260006006848154811061296b5761296a613fa8565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548361201290919063ffffffff16565b915080806129ed90614069565b915050612793565b50612a0d600754600854611f8a90919063ffffffff16565b821015612a2557600854600754935093505050612a2e565b81819350935050505b9091565b600080600080612a418561381b565b90506000612a4e8661384d565b90506000612a7782612a69858a61201290919063ffffffff16565b61201290919063ffffffff16565b90508083839550955095505050509193909250565b600080600080612aa58589612e5f90919063ffffffff16565b90506000612abc8689612e5f90919063ffffffff16565b90506000612ad38789612e5f90919063ffffffff16565b90506000612afc82612aee858761201290919063ffffffff16565b61201290919063ffffffff16565b9050838184965096509650505050509450945094915050565b6000600267ffffffffffffffff811115612b3257612b316146e4565b5b604051908082528060200260200182016040528015612b605781602001602082028036833780820191505090505b5090503081600081518110612b7857612b77613fa8565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c439190614728565b81600181518110612c5757612c56613fa8565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050612cbe30601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684611adb565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b8152600401612d2295949392919061484e565b600060405180830381600087803b158015612d3c57600080fd5b505af1158015612d50573d6000803e3d6000fd5b505050505050565b612d8530601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684611adb565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d719823085600080612dd16116e0565b426040518863ffffffff1660e01b8152600401612df3969594939291906148a8565b60606040518083038185885af1158015612e11573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612e36919061491e565b5050505050565b6000600b819055506000600d819055506000600f819055506000601181905550565b60008183612e6d9190614971565b905092915050565b600080600080600080612e8787611fb6565b955095509550955095509550612ee587600260008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461201290919063ffffffff16565b600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612f7a86600160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461201290919063ffffffff16565b600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061300f85600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611fa090919063ffffffff16565b600160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061305b8161387f565b6130658483613a24565b8773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516130c29190613c2e565b60405180910390a3505050505050505050565b6000806000806000806130e787611fb6565b95509550955095509550955061314586600160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461201290919063ffffffff16565b600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506131da83600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611fa090919063ffffffff16565b600260008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061326f85600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611fa090919063ffffffff16565b600160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506132bb8161387f565b6132c58483613a24565b8773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516133229190613c2e565b60405180910390a3505050505050505050565b60008060008060008061334787611fb6565b9550955095509550955095506133a586600160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461201290919063ffffffff16565b600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061343a85600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611fa090919063ffffffff16565b600160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506134868161387f565b6134908483613a24565b8773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516134ed9190613c2e565b60405180910390a3505050505050505050565b60008060008060008061351287611fb6565b95509550955095509550955061357087600260008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461201290919063ffffffff16565b600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061360586600160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461201290919063ffffffff16565b600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061369a83600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611fa090919063ffffffff16565b600260008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061372f85600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611fa090919063ffffffff16565b600160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061377b8161387f565b6137858483613a24565b8773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516137e29190613c2e565b60405180910390a3505050505050505050565b600c54600b81905550600e54600d81905550601054600f81905550601254601181905550565b6000613846612710613838600b5485612e5f90919063ffffffff16565b611f8a90919063ffffffff16565b9050919050565b600061387861271061386a600d5485612e5f90919063ffffffff16565b611f8a90919063ffffffff16565b9050919050565b6000613889611f5f565b905060006138a08284612e5f90919063ffffffff16565b90506138f481600160003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611fa090919063ffffffff16565b600160003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600560003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615613a1f576139db83600260003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611fa090919063ffffffff16565b600260003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b505050565b613a398260085461201290919063ffffffff16565b600881905550613a5481600954611fa090919063ffffffff16565b6009819055505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613a98578082015181840152602081019050613a7d565b60008484015250505050565b6000601f19601f8301169050919050565b6000613ac082613a5e565b613aca8185613a69565b9350613ada818560208601613a7a565b613ae381613aa4565b840191505092915050565b60006020820190508181036000830152613b088184613ab5565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613b4082613b15565b9050919050565b613b5081613b35565b8114613b5b57600080fd5b50565b600081359050613b6d81613b47565b92915050565b6000819050919050565b613b8681613b73565b8114613b9157600080fd5b50565b600081359050613ba381613b7d565b92915050565b60008060408385031215613bc057613bbf613b10565b5b6000613bce85828601613b5e565b9250506020613bdf85828601613b94565b9150509250929050565b60008115159050919050565b613bfe81613be9565b82525050565b6000602082019050613c196000830184613bf5565b92915050565b613c2881613b73565b82525050565b6000602082019050613c436000830184613c1f565b92915050565b600060208284031215613c5f57613c5e613b10565b5b6000613c6d84828501613b5e565b91505092915050565b600080600060608486031215613c8f57613c8e613b10565b5b6000613c9d86828701613b5e565b9350506020613cae86828701613b5e565b9250506040613cbf86828701613b94565b9150509250925092565b600060208284031215613cdf57613cde613b10565b5b6000613ced84828501613b94565b91505092915050565b600060ff82169050919050565b613d0c81613cf6565b82525050565b6000602082019050613d276000830184613d03565b92915050565b613d3681613be9565b8114613d4157600080fd5b50565b600081359050613d5381613d2d565b92915050565b60008060408385031215613d7057613d6f613b10565b5b6000613d7e85828601613b94565b9250506020613d8f85828601613d44565b9150509250929050565b6000819050919050565b6000613dbe613db9613db484613b15565b613d99565b613b15565b9050919050565b6000613dd082613da3565b9050919050565b6000613de282613dc5565b9050919050565b613df281613dd7565b82525050565b6000602082019050613e0d6000830184613de9565b92915050565b613e1c81613b35565b82525050565b6000602082019050613e376000830184613e13565b92915050565b600060208284031215613e5357613e52613b10565b5b6000613e6184828501613d44565b91505092915050565b60008060408385031215613e8157613e80613b10565b5b6000613e8f85828601613b5e565b9250506020613ea085828601613b5e565b9150509250929050565b7f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260008201527f65666c656374696f6e7300000000000000000000000000000000000000000000602082015250565b6000613f06602a83613a69565b9150613f1182613eaa565b604082019050919050565b60006020820190508181036000830152613f3581613ef9565b9050919050565b7f4163636f756e7420697320616c7265616479206578636c756465640000000000600082015250565b6000613f72601b83613a69565b9150613f7d82613f3c565b602082019050919050565b60006020820190508181036000830152613fa181613f65565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061401182613b73565b915061401c83613b73565b925082820390508181111561403457614033613fd7565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600061407482613b73565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036140a6576140a5613fd7565b5b600182019050919050565b7f4578636c75646564206164647265737365732063616e6e6f742063616c6c207460008201527f6869732066756e6374696f6e0000000000000000000000000000000000000000602082015250565b600061410d602c83613a69565b9150614118826140b1565b604082019050919050565b6000602082019050818103600083015261413c81614100565b9050919050565b7f416d6f756e74206d757374206265206c657373207468616e20737570706c7900600082015250565b6000614179601f83613a69565b915061418482614143565b602082019050919050565b600060208201905081810360008301526141a88161416c565b9050919050565b7f57652063616e206e6f74206578636c7564652050616e63616b6520726f75746560008201527f722e000000000000000000000000000000000000000000000000000000000000602082015250565b600061420b602283613a69565b9150614216826141af565b604082019050919050565b6000602082019050818103600083015261423a816141fe565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061429d602683613a69565b91506142a882614241565b604082019050919050565b600060208201905081810360008301526142cc81614290565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061432f602483613a69565b915061433a826142d3565b604082019050919050565b6000602082019050818103600083015261435e81614322565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006143c1602283613a69565b91506143cc82614365565b604082019050919050565b600060208201905081810360008301526143f0816143b4565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061442d602083613a69565b9150614438826143f7565b602082019050919050565b6000602082019050818103600083015261445c81614420565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006144bf602583613a69565b91506144ca82614463565b604082019050919050565b600060208201905081810360008301526144ee816144b2565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000614551602383613a69565b915061455c826144f5565b604082019050919050565b6000602082019050818103600083015261458081614544565b9050919050565b7f5472616e7366657220616d6f756e74206d75737420626520677265617465722060008201527f7468616e207a65726f0000000000000000000000000000000000000000000000602082015250565b60006145e3602983613a69565b91506145ee82614587565b604082019050919050565b60006020820190508181036000830152614612816145d6565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061465382613b73565b915061465e83613b73565b92508261466e5761466d614619565b5b828204905092915050565b600061468482613b73565b915061468f83613b73565b92508282019050808211156146a7576146a6613fd7565b5b92915050565b60006060820190506146c26000830186613c1f565b6146cf6020830185613c1f565b6146dc6040830184613c1f565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60008151905061472281613b47565b92915050565b60006020828403121561473e5761473d613b10565b5b600061474c84828501614713565b91505092915050565b6000819050919050565b600061477a61477561477084614755565b613d99565b613b73565b9050919050565b61478a8161475f565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6147c581613b35565b82525050565b60006147d783836147bc565b60208301905092915050565b6000602082019050919050565b60006147fb82614790565b614805818561479b565b9350614810836147ac565b8060005b8381101561484157815161482888826147cb565b9750614833836147e3565b925050600181019050614814565b5085935050505092915050565b600060a0820190506148636000830188613c1f565b6148706020830187614781565b818103604083015261488281866147f0565b90506148916060830185613e13565b61489e6080830184613c1f565b9695505050505050565b600060c0820190506148bd6000830189613e13565b6148ca6020830188613c1f565b6148d76040830187614781565b6148e46060830186614781565b6148f16080830185613e13565b6148fe60a0830184613c1f565b979650505050505050565b60008151905061491881613b7d565b92915050565b60008060006060848603121561493757614936613b10565b5b600061494586828701614909565b935050602061495686828701614909565b925050604061496786828701614909565b9150509250925092565b600061497c82613b73565b915061498783613b73565b925082820261499581613b73565b915082820484148315176149ac576149ab613fd7565b5b509291505056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212207528416058bde7f09ad04b23dd91072bd6898af9c60f4b3202465c9f552a0bd564736f6c63430008120033000000000000000000000000d497bc9dbf4839a8a262faa19e87eb48267c5087

Deployed Bytecode

0x6080604052600436106102555760003560e01c8063715018a611610139578063a9059cbb116100b6578063c816841b1161007a578063c816841b146108fb578063cea2695814610926578063d28d88521461094f578063dd62ed3e1461097a578063ea2f0b37146109b7578063f2fde38b146109e05761025c565b8063a9059cbb14610814578063af465a2714610851578063b09f12661461087c578063c0b0fda2146108a7578063c49b9a80146108d25761025c565b80638da5cb5b116100fd5780638da5cb5b1461072f5780638ee88c531461075a57806395d89b41146107835780639ef340ea146107ae578063a457c2d7146107d75761025c565b8063715018a61461065a578063735de9f71461067157806375f0a8741461069c578063762c3915146106c757806388f82020146106f25761025c565b806339509351116101d25780634a74bb02116101965780634a74bb021461053657806352390c02146105615780635342acb41461058a57806359f26ff6146105c75780636bc87c3a146105f257806370a082311461061d5761025c565b806339509351146104415780633bd5d1731461047e578063437823ec146104a75780634549b039146104d0578063457c194c1461050d5761025c565b806323b872dd1161021957806323b872dd146103485780632d83811914610385578063313ce567146103c257806332424aa3146103ed5780633685d419146104185761025c565b806306fdde0314610261578063095ea7b31461028c57806313114a9d146102c957806318160ddd146102f4578063224611731461031f5761025c565b3661025c57005b600080fd5b34801561026d57600080fd5b50610276610a09565b6040516102839190613aee565b60405180910390f35b34801561029857600080fd5b506102b360048036038101906102ae9190613ba9565b610a46565b6040516102c09190613c04565b60405180910390f35b3480156102d557600080fd5b506102de610a64565b6040516102eb9190613c2e565b60405180910390f35b34801561030057600080fd5b50610309610a6e565b6040516103169190613c2e565b60405180910390f35b34801561032b57600080fd5b5061034660048036038101906103419190613c49565b610a78565b005b34801561035457600080fd5b5061036f600480360381019061036a9190613c76565b610ac4565b60405161037c9190613c04565b60405180910390f35b34801561039157600080fd5b506103ac60048036038101906103a79190613cc9565b610b9d565b6040516103b99190613c2e565b60405180910390f35b3480156103ce57600080fd5b506103d7610c0b565b6040516103e49190613d12565b60405180910390f35b3480156103f957600080fd5b50610402610c22565b60405161040f9190613d12565b60405180910390f35b34801561042457600080fd5b5061043f600480360381019061043a9190613c49565b610c35565b005b34801561044d57600080fd5b5061046860048036038101906104639190613ba9565b610ef6565b6040516104759190613c04565b60405180910390f35b34801561048a57600080fd5b506104a560048036038101906104a09190613cc9565b610fa9565b005b3480156104b357600080fd5b506104ce60048036038101906104c99190613c49565b611124565b005b3480156104dc57600080fd5b506104f760048036038101906104f29190613d59565b611187565b6040516105049190613c2e565b60405180910390f35b34801561051957600080fd5b50610534600480360381019061052f9190613cc9565b61120b565b005b34801561054257600080fd5b5061054b61121d565b6040516105589190613c04565b60405180910390f35b34801561056d57600080fd5b5061058860048036038101906105839190613c49565b61122e565b005b34801561059657600080fd5b506105b160048036038101906105ac9190613c49565b6114d7565b6040516105be9190613c04565b60405180910390f35b3480156105d357600080fd5b506105dc61152d565b6040516105e99190613c2e565b60405180910390f35b3480156105fe57600080fd5b50610607611533565b6040516106149190613c2e565b60405180910390f35b34801561062957600080fd5b50610644600480360381019061063f9190613c49565b611539565b6040516106519190613c2e565b60405180910390f35b34801561066657600080fd5b5061066f611624565b005b34801561067d57600080fd5b50610686611638565b6040516106939190613df8565b60405180910390f35b3480156106a857600080fd5b506106b161165e565b6040516106be9190613e22565b60405180910390f35b3480156106d357600080fd5b506106dc611684565b6040516106e99190613c2e565b60405180910390f35b3480156106fe57600080fd5b5061071960048036038101906107149190613c49565b61168a565b6040516107269190613c04565b60405180910390f35b34801561073b57600080fd5b506107446116e0565b6040516107519190613e22565b60405180910390f35b34801561076657600080fd5b50610781600480360381019061077c9190613cc9565b611709565b005b34801561078f57600080fd5b5061079861171b565b6040516107a59190613aee565b60405180910390f35b3480156107ba57600080fd5b506107d560048036038101906107d09190613cc9565b611758565b005b3480156107e357600080fd5b506107fe60048036038101906107f99190613ba9565b61176a565b60405161080b9190613c04565b60405180910390f35b34801561082057600080fd5b5061083b60048036038101906108369190613ba9565b611837565b6040516108489190613c04565b60405180910390f35b34801561085d57600080fd5b50610866611855565b6040516108739190613c2e565b60405180910390f35b34801561088857600080fd5b5061089161185b565b60405161089e9190613aee565b60405180910390f35b3480156108b357600080fd5b506108bc611894565b6040516108c99190613c2e565b60405180910390f35b3480156108de57600080fd5b506108f960048036038101906108f49190613e3d565b61189a565b005b34801561090757600080fd5b506109106118f5565b60405161091d9190613e22565b60405180910390f35b34801561093257600080fd5b5061094d60048036038101906109489190613cc9565b61191b565b005b34801561095b57600080fd5b5061096461192d565b6040516109719190613aee565b60405180910390f35b34801561098657600080fd5b506109a1600480360381019061099c9190613e6a565b611966565b6040516109ae9190613c2e565b60405180910390f35b3480156109c357600080fd5b506109de60048036038101906109d99190613c49565b6119ed565b005b3480156109ec57600080fd5b50610a076004803603810190610a029190613c49565b611a50565b005b60606040518060400160405280600981526020017f44756d626d6f6e65790000000000000000000000000000000000000000000000815250905090565b6000610a5a610a53611ad3565b8484611adb565b6001905092915050565b6000600954905090565b6000600754905090565b610a80611ca4565b80601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000610ad1848484611d22565b610b9284610add611ad3565b610b8d856040518060600160405280602881526020016149b460289139600360008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610b43611ad3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611f0a9092919063ffffffff16565b611adb565b600190509392505050565b6000600854821115610be4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bdb90613f1c565b60405180910390fd5b6000610bee611f5f565b9050610c038184611f8a90919063ffffffff16565b915050919050565b6000600a60009054906101000a900460ff16905090565b600a60009054906101000a900460ff1681565b610c3d611ca4565b600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610cc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc090613f88565b60405180910390fd5b60005b600680549050811015610ef2578173ffffffffffffffffffffffffffffffffffffffff1660068281548110610d0457610d03613fa8565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610edf5760066001600680549050610d5e9190614006565b81548110610d6f57610d6e613fa8565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660068281548110610dae57610dad613fa8565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506006805480610ea557610ea461403a565b5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690559055610ef2565b8080610eea90614069565b915050610ccc565b5050565b6000610f9f610f03611ad3565b84610f9a8560036000610f14611ad3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611fa090919063ffffffff16565b611adb565b6001905092915050565b6000610fb3611ad3565b9050600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611042576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103990614123565b60405180910390fd5b600061104d83611fb6565b505050505090506110a681600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461201290919063ffffffff16565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506110fe8160085461201290919063ffffffff16565b60088190555061111983600954611fa090919063ffffffff16565b600981905550505050565b61112c611ca4565b6001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60006007548311156111ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c59061418f565b60405180910390fd5b816111ee5760006111de84611fb6565b5050505050905080915050611205565b60006111f984611fb6565b50505050915050809150505b92915050565b611213611ca4565b8060118190555050565b60158054906101000a900460ff1681565b611236611ca4565b7310ed43c718714eb63d5aa57b78b54704e256024e73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036112b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112af90614221565b60405180910390fd5b600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611345576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133c90613f88565b60405180910390fd5b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115611419576113d5600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b9d565b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b6001600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506006819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b600b5481565b600d5481565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156115d457600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905061161f565b61161c600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b9d565b90505b919050565b61162c611ca4565b6116366000612028565b565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60115481565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611711611ca4565b80600d8190555050565b60606040518060400160405280600381526020017f44544d0000000000000000000000000000000000000000000000000000000000815250905090565b611760611ca4565b80600b8190555050565b600061182d611777611ad3565b84611828856040518060600160405280602581526020016149dc60259139600360006117a1611ad3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611f0a9092919063ffffffff16565b611adb565b6001905092915050565b600061184b611844611ad3565b8484611d22565b6001905092915050565b60075481565b6040518060400160405280600381526020017f44544d000000000000000000000000000000000000000000000000000000000081525081565b600f5481565b6118a2611ca4565b806015806101000a81548160ff0219169083151502179055507f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc159816040516118ea9190613c04565b60405180910390a150565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611923611ca4565b80600f8190555050565b6040518060400160405280600981526020017f44756d626d6f6e6579000000000000000000000000000000000000000000000081525081565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6119f5611ca4565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b611a58611ca4565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611ac7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abe906142b3565b60405180910390fd5b611ad081612028565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611b4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4190614345565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611bb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb0906143d7565b60405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611c979190613c2e565b60405180910390a3505050565b611cac611ad3565b73ffffffffffffffffffffffffffffffffffffffff16611cca6116e0565b73ffffffffffffffffffffffffffffffffffffffff1614611d20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1790614443565b60405180910390fd5b565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611d91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d88906144d5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611e00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df790614567565b60405180910390fd5b60008111611e43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3a906145f9565b60405180910390fd5b6000611e4e30611539565b905060006016548210159050808015611e745750601560149054906101000a900460ff16155b8015611ece5750601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b8015611ee4575060158054906101000a900460ff165b15611ef8576016549150611ef7826120ec565b5b611f038585856121c2565b5050505050565b6000838311158290611f52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f499190613aee565b60405180910390fd5b5082840390509392505050565b6000806000611f6c61277f565b91509150611f838183611f8a90919063ffffffff16565b9250505090565b60008183611f989190614648565b905092915050565b60008183611fae9190614679565b905092915050565b6000806000806000806000806000611fcd8a612a32565b9250925092506000806000611feb8d8686611fe6611f5f565b612a8c565b9250925092508282828888889b509b509b509b509b509b5050505050505091939550919395565b600081836120209190614006565b905092915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001601560146101000a81548160ff021916908315150217905550600061211d600283611f8a90919063ffffffff16565b90506000612134828461201290919063ffffffff16565b9050600047905061214483612b15565b6000612159824761201290919063ffffffff16565b90506121658382612d58565b7f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb561848285604051612198939291906146ad565b60405180910390a1505050506000601560146101000a81548160ff02191690831515021790555050565b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806122635750600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1561227157612270612e3d565b5b600061229c61271061228e600f5485612e5f90919063ffffffff16565b611f8a90919063ffffffff16565b905060006122c96127106122bb60115486612e5f90919063ffffffff16565b611f8a90919063ffffffff16565b9050600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561236e5750600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156123a7576123a2858561239d8461238f878961201290919063ffffffff16565b61201290919063ffffffff16565b612e75565b61266e565b600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615801561244a5750600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156124835761247e85856124798461246b878961201290919063ffffffff16565b61201290919063ffffffff16565b6130d5565b61266d565b600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156125275750600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156125605761255b858561255684612548878961201290919063ffffffff16565b61201290919063ffffffff16565b613335565b61266c565b600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156126025750600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1561263b57612636858561263184612623878961201290919063ffffffff16565b61201290919063ffffffff16565b613500565b61266b565b61266a858561266584612657878961201290919063ffffffff16565b61201290919063ffffffff16565b613335565b5b5b5b5b6000600b819055506000600d8190555061268a85600084613335565b6126b785601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683613335565b600c54600b81905550600e54600d81905550600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168061276a5750600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15612778576127776137f5565b5b5050505050565b600080600060085490506000600754905060005b6006805490508110156129f5578260016000600684815481106127b9576127b8613fa8565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411806128a7575081600260006006848154811061283f5761283e613fa8565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054115b156128be5760085460075494509450505050612a2e565b61294e60016000600684815481106128d9576128d8613fa8565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548461201290919063ffffffff16565b92506129e0600260006006848154811061296b5761296a613fa8565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548361201290919063ffffffff16565b915080806129ed90614069565b915050612793565b50612a0d600754600854611f8a90919063ffffffff16565b821015612a2557600854600754935093505050612a2e565b81819350935050505b9091565b600080600080612a418561381b565b90506000612a4e8661384d565b90506000612a7782612a69858a61201290919063ffffffff16565b61201290919063ffffffff16565b90508083839550955095505050509193909250565b600080600080612aa58589612e5f90919063ffffffff16565b90506000612abc8689612e5f90919063ffffffff16565b90506000612ad38789612e5f90919063ffffffff16565b90506000612afc82612aee858761201290919063ffffffff16565b61201290919063ffffffff16565b9050838184965096509650505050509450945094915050565b6000600267ffffffffffffffff811115612b3257612b316146e4565b5b604051908082528060200260200182016040528015612b605781602001602082028036833780820191505090505b5090503081600081518110612b7857612b77613fa8565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c439190614728565b81600181518110612c5757612c56613fa8565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050612cbe30601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684611adb565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b8152600401612d2295949392919061484e565b600060405180830381600087803b158015612d3c57600080fd5b505af1158015612d50573d6000803e3d6000fd5b505050505050565b612d8530601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684611adb565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d719823085600080612dd16116e0565b426040518863ffffffff1660e01b8152600401612df3969594939291906148a8565b60606040518083038185885af1158015612e11573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612e36919061491e565b5050505050565b6000600b819055506000600d819055506000600f819055506000601181905550565b60008183612e6d9190614971565b905092915050565b600080600080600080612e8787611fb6565b955095509550955095509550612ee587600260008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461201290919063ffffffff16565b600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612f7a86600160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461201290919063ffffffff16565b600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061300f85600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611fa090919063ffffffff16565b600160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061305b8161387f565b6130658483613a24565b8773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516130c29190613c2e565b60405180910390a3505050505050505050565b6000806000806000806130e787611fb6565b95509550955095509550955061314586600160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461201290919063ffffffff16565b600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506131da83600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611fa090919063ffffffff16565b600260008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061326f85600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611fa090919063ffffffff16565b600160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506132bb8161387f565b6132c58483613a24565b8773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516133229190613c2e565b60405180910390a3505050505050505050565b60008060008060008061334787611fb6565b9550955095509550955095506133a586600160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461201290919063ffffffff16565b600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061343a85600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611fa090919063ffffffff16565b600160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506134868161387f565b6134908483613a24565b8773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516134ed9190613c2e565b60405180910390a3505050505050505050565b60008060008060008061351287611fb6565b95509550955095509550955061357087600260008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461201290919063ffffffff16565b600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061360586600160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461201290919063ffffffff16565b600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061369a83600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611fa090919063ffffffff16565b600260008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061372f85600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611fa090919063ffffffff16565b600160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061377b8161387f565b6137858483613a24565b8773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516137e29190613c2e565b60405180910390a3505050505050505050565b600c54600b81905550600e54600d81905550601054600f81905550601254601181905550565b6000613846612710613838600b5485612e5f90919063ffffffff16565b611f8a90919063ffffffff16565b9050919050565b600061387861271061386a600d5485612e5f90919063ffffffff16565b611f8a90919063ffffffff16565b9050919050565b6000613889611f5f565b905060006138a08284612e5f90919063ffffffff16565b90506138f481600160003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611fa090919063ffffffff16565b600160003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600560003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615613a1f576139db83600260003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611fa090919063ffffffff16565b600260003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b505050565b613a398260085461201290919063ffffffff16565b600881905550613a5481600954611fa090919063ffffffff16565b6009819055505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613a98578082015181840152602081019050613a7d565b60008484015250505050565b6000601f19601f8301169050919050565b6000613ac082613a5e565b613aca8185613a69565b9350613ada818560208601613a7a565b613ae381613aa4565b840191505092915050565b60006020820190508181036000830152613b088184613ab5565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613b4082613b15565b9050919050565b613b5081613b35565b8114613b5b57600080fd5b50565b600081359050613b6d81613b47565b92915050565b6000819050919050565b613b8681613b73565b8114613b9157600080fd5b50565b600081359050613ba381613b7d565b92915050565b60008060408385031215613bc057613bbf613b10565b5b6000613bce85828601613b5e565b9250506020613bdf85828601613b94565b9150509250929050565b60008115159050919050565b613bfe81613be9565b82525050565b6000602082019050613c196000830184613bf5565b92915050565b613c2881613b73565b82525050565b6000602082019050613c436000830184613c1f565b92915050565b600060208284031215613c5f57613c5e613b10565b5b6000613c6d84828501613b5e565b91505092915050565b600080600060608486031215613c8f57613c8e613b10565b5b6000613c9d86828701613b5e565b9350506020613cae86828701613b5e565b9250506040613cbf86828701613b94565b9150509250925092565b600060208284031215613cdf57613cde613b10565b5b6000613ced84828501613b94565b91505092915050565b600060ff82169050919050565b613d0c81613cf6565b82525050565b6000602082019050613d276000830184613d03565b92915050565b613d3681613be9565b8114613d4157600080fd5b50565b600081359050613d5381613d2d565b92915050565b60008060408385031215613d7057613d6f613b10565b5b6000613d7e85828601613b94565b9250506020613d8f85828601613d44565b9150509250929050565b6000819050919050565b6000613dbe613db9613db484613b15565b613d99565b613b15565b9050919050565b6000613dd082613da3565b9050919050565b6000613de282613dc5565b9050919050565b613df281613dd7565b82525050565b6000602082019050613e0d6000830184613de9565b92915050565b613e1c81613b35565b82525050565b6000602082019050613e376000830184613e13565b92915050565b600060208284031215613e5357613e52613b10565b5b6000613e6184828501613d44565b91505092915050565b60008060408385031215613e8157613e80613b10565b5b6000613e8f85828601613b5e565b9250506020613ea085828601613b5e565b9150509250929050565b7f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260008201527f65666c656374696f6e7300000000000000000000000000000000000000000000602082015250565b6000613f06602a83613a69565b9150613f1182613eaa565b604082019050919050565b60006020820190508181036000830152613f3581613ef9565b9050919050565b7f4163636f756e7420697320616c7265616479206578636c756465640000000000600082015250565b6000613f72601b83613a69565b9150613f7d82613f3c565b602082019050919050565b60006020820190508181036000830152613fa181613f65565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061401182613b73565b915061401c83613b73565b925082820390508181111561403457614033613fd7565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600061407482613b73565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036140a6576140a5613fd7565b5b600182019050919050565b7f4578636c75646564206164647265737365732063616e6e6f742063616c6c207460008201527f6869732066756e6374696f6e0000000000000000000000000000000000000000602082015250565b600061410d602c83613a69565b9150614118826140b1565b604082019050919050565b6000602082019050818103600083015261413c81614100565b9050919050565b7f416d6f756e74206d757374206265206c657373207468616e20737570706c7900600082015250565b6000614179601f83613a69565b915061418482614143565b602082019050919050565b600060208201905081810360008301526141a88161416c565b9050919050565b7f57652063616e206e6f74206578636c7564652050616e63616b6520726f75746560008201527f722e000000000000000000000000000000000000000000000000000000000000602082015250565b600061420b602283613a69565b9150614216826141af565b604082019050919050565b6000602082019050818103600083015261423a816141fe565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061429d602683613a69565b91506142a882614241565b604082019050919050565b600060208201905081810360008301526142cc81614290565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061432f602483613a69565b915061433a826142d3565b604082019050919050565b6000602082019050818103600083015261435e81614322565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006143c1602283613a69565b91506143cc82614365565b604082019050919050565b600060208201905081810360008301526143f0816143b4565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061442d602083613a69565b9150614438826143f7565b602082019050919050565b6000602082019050818103600083015261445c81614420565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006144bf602583613a69565b91506144ca82614463565b604082019050919050565b600060208201905081810360008301526144ee816144b2565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000614551602383613a69565b915061455c826144f5565b604082019050919050565b6000602082019050818103600083015261458081614544565b9050919050565b7f5472616e7366657220616d6f756e74206d75737420626520677265617465722060008201527f7468616e207a65726f0000000000000000000000000000000000000000000000602082015250565b60006145e3602983613a69565b91506145ee82614587565b604082019050919050565b60006020820190508181036000830152614612816145d6565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061465382613b73565b915061465e83613b73565b92508261466e5761466d614619565b5b828204905092915050565b600061468482613b73565b915061468f83613b73565b92508282019050808211156146a7576146a6613fd7565b5b92915050565b60006060820190506146c26000830186613c1f565b6146cf6020830185613c1f565b6146dc6040830184613c1f565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60008151905061472281613b47565b92915050565b60006020828403121561473e5761473d613b10565b5b600061474c84828501614713565b91505092915050565b6000819050919050565b600061477a61477561477084614755565b613d99565b613b73565b9050919050565b61478a8161475f565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6147c581613b35565b82525050565b60006147d783836147bc565b60208301905092915050565b6000602082019050919050565b60006147fb82614790565b614805818561479b565b9350614810836147ac565b8060005b8381101561484157815161482888826147cb565b9750614833836147e3565b925050600181019050614814565b5085935050505092915050565b600060a0820190506148636000830188613c1f565b6148706020830187614781565b818103604083015261488281866147f0565b90506148916060830185613e13565b61489e6080830184613c1f565b9695505050505050565b600060c0820190506148bd6000830189613e13565b6148ca6020830188613c1f565b6148d76040830187614781565b6148e46060830186614781565b6148f16080830185613e13565b6148fe60a0830184613c1f565b979650505050505050565b60008151905061491881613b7d565b92915050565b60008060006060848603121561493757614936613b10565b5b600061494586828701614909565b935050602061495686828701614909565b925050604061496786828701614909565b9150509250925092565b600061497c82613b73565b915061498783613b73565b925082820261499581613b73565b915082820484148315176149ac576149ab613fd7565b5b509291505056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212207528416058bde7f09ad04b23dd91072bd6898af9c60f4b3202465c9f552a0bd564736f6c63430008120033

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

000000000000000000000000d497bc9dbf4839a8a262faa19e87eb48267c5087

-----Decoded View---------------
Arg [0] : _marketingWallet (address): 0xD497BC9DBf4839A8A262FaA19E87eB48267c5087

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000d497bc9dbf4839a8a262faa19e87eb48267c5087


Deployed Bytecode Sourcemap

43301:21036:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46020:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46982:186;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48592:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46297:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64043:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47176:446;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50157:306;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46206:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44028:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50959:477;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47630:293;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49250:419;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63806:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49677:472;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48687:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44840:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50471:480;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48460:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44064:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44226:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46400:198;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12379:103;;;;;;;;;;;;;:::i;:::-;;44731:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44635:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44481:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48332:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11738:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49014:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46111:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48844:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47931:393;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46606:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43792:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43934:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44361:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64163:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44777:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49142:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43979:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46806:168;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63925:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12637:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46020:83;46057:13;46090:5;;;;;;;;;;;;;;;;;46083:12;;46020:83;:::o;46982:186::-;47082:4;47099:39;47108:12;:10;:12::i;:::-;47122:7;47131:6;47099:8;:39::i;:::-;47156:4;47149:11;;46982:186;;;;:::o;48592:87::-;48634:7;48661:10;;48654:17;;48592:87;:::o;46297:95::-;46350:7;46377;;46370:14;;46297:95;:::o;64043:112::-;11624:13;:11;:13::i;:::-;64138:9:::1;64120:15;;:27;;;;;;;;;;;;;;;;;;64043:112:::0;:::o;47176:446::-;47308:4;47325:36;47335:6;47343:9;47354:6;47325:9;:36::i;:::-;47372:220;47395:6;47416:12;:10;:12::i;:::-;47443:138;47499:6;47443:138;;;;;;;;;;;;;;;;;:11;:19;47455:6;47443:19;;;;;;;;;;;;;;;:33;47463:12;:10;:12::i;:::-;47443:33;;;;;;;;;;;;;;;;:37;;:138;;;;;:::i;:::-;47372:8;:220::i;:::-;47610:4;47603:11;;47176:446;;;;;:::o;50157:306::-;50240:7;50293;;50282;:18;;50260:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;50381:19;50403:10;:8;:10::i;:::-;50381:32;;50431:24;50443:11;50431:7;:11;;:24;;;;:::i;:::-;50424:31;;;50157:306;;;:::o;46206:83::-;46247:5;46272:9;;;;;;;;;;;46265:16;;46206:83;:::o;44028:27::-;;;;;;;;;;;;;:::o;50959:477::-;11624:13;:11;:13::i;:::-;51039:11:::1;:20;51051:7;51039:20;;;;;;;;;;;;;;;;;;;;;;;;;51031:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;51107:9;51102:327;51126:9;:16;;;;51122:1;:20;51102:327;;;51184:7;51168:23;;:9;51178:1;51168:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:23;;::::0;51164:254:::1;;51227:9;51256:1;51237:9;:16;;;;:20;;;;:::i;:::-;51227:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;51212:9;51222:1;51212:12;;;;;;;;:::i;:::-;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;51296:1;51277:7;:16;51285:7;51277:16;;;;;;;;;;;;;;;:20;;;;51339:5;51316:11;:20;51328:7;51316:20;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;51363:9;:15;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;51397:5;;51164:254;51144:3;;;;;:::i;:::-;;;;51102:327;;;;50959:477:::0;:::o;47630:293::-;47743:4;47760:133;47783:12;:10;:12::i;:::-;47810:7;47832:50;47871:10;47832:11;:25;47844:12;:10;:12::i;:::-;47832:25;;;;;;;;;;;;;;;:34;47858:7;47832:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;47760:8;:133::i;:::-;47911:4;47904:11;;47630:293;;;;:::o;49250:419::-;49302:14;49319:12;:10;:12::i;:::-;49302:29;;49365:11;:19;49377:6;49365:19;;;;;;;;;;;;;;;;;;;;;;;;;49364:20;49342:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;49468:15;49497:19;49508:7;49497:10;:19::i;:::-;49467:49;;;;;;;49545:28;49565:7;49545;:15;49553:6;49545:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;49527:7;:15;49535:6;49527:15;;;;;;;;;;;;;;;:46;;;;49594:20;49606:7;49594;;:11;;:20;;;;:::i;:::-;49584:7;:30;;;;49638:23;49653:7;49638:10;;:14;;:23;;;;:::i;:::-;49625:10;:36;;;;49291:378;;49250:419;:::o;63806:111::-;11624:13;:11;:13::i;:::-;63905:4:::1;63875:18;:27;63894:7;63875:27;;;;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;63806:111:::0;:::o;49677:472::-;49793:7;49832;;49821;:18;;49813:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;49891:17;49886:256;;49926:15;49955:19;49966:7;49955:10;:19::i;:::-;49925:49;;;;;;;49996:7;49989:14;;;;;49886:256;50039:23;50074:19;50085:7;50074:10;:19::i;:::-;50036:57;;;;;;;50115:15;50108:22;;;49677:472;;;;;:::o;48687:149::-;11624:13;:11;:13::i;:::-;48813:15:::1;48790:20;:38;;;;48687:149:::0;:::o;44840:41::-;;;;;;;;;;;;:::o;50471:480::-;11624:13;:11;:13::i;:::-;50576:42:::1;50565:53;;:7;:53;;::::0;50543:137:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;50700:11;:20;50712:7;50700:20;;;;;;;;;;;;;;;;;;;;;;;;;50699:21;50691:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;50786:1;50767:7;:16;50775:7;50767:16;;;;;;;;;;;;;;;;:20;50763:109;;;50823:37;50843:7;:16;50851:7;50843:16;;;;;;;;;;;;;;;;50823:19;:37::i;:::-;50804:7;:16;50812:7;50804:16;;;;;;;;;;;;;;;:56;;;;50763:109;50905:4;50882:11;:20;50894:7;50882:20;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;50920:9;50935:7;50920:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50471:480:::0;:::o;48460:124::-;48525:4;48549:18;:27;48568:7;48549:27;;;;;;;;;;;;;;;;;;;;;;;;;48542:34;;48460:124;;;:::o;44064:43::-;;;;:::o;44226:34::-;;;;:::o;46400:198::-;46466:7;46490:11;:20;46502:7;46490:20;;;;;;;;;;;;;;;;;;;;;;;;;46486:49;;;46519:7;:16;46527:7;46519:16;;;;;;;;;;;;;;;;46512:23;;;;46486:49;46553:37;46573:7;:16;46581:7;46573:16;;;;;;;;;;;;;;;;46553:19;:37::i;:::-;46546:44;;46400:198;;;;:::o;12379:103::-;11624:13;:11;:13::i;:::-;12444:30:::1;12471:1;12444:18;:30::i;:::-;12379:103::o:0;44731:39::-;;;;;;;;;;;;;:::o;44635:30::-;;;;;;;;;;;;;:::o;44481:41::-;;;;:::o;48332:120::-;48400:4;48424:11;:20;48436:7;48424:20;;;;;;;;;;;;;;;;;;;;;;;;;48417:27;;48332:120;;;:::o;11738:87::-;11784:7;11811:6;;;;;;;;;;;11804:13;;11738:87;:::o;49014:120::-;11624:13;:11;:13::i;:::-;49114:12:::1;49098:13;:28;;;;49014:120:::0;:::o;46111:87::-;46150:13;46183:7;;;;;;;;;;;;;;;;;46176:14;;46111:87;:::o;48844:162::-;11624:13;:11;:13::i;:::-;48977:21:::1;48952:22;:46;;;;48844:162:::0;:::o;47931:393::-;48049:4;48066:228;48089:12;:10;:12::i;:::-;48116:7;48138:145;48195:15;48138:145;;;;;;;;;;;;;;;;;:11;:25;48150:12;:10;:12::i;:::-;48138:25;;;;;;;;;;;;;;;:34;48164:7;48138:34;;;;;;;;;;;;;;;;:38;;:145;;;;;:::i;:::-;48066:8;:228::i;:::-;48312:4;48305:11;;47931:393;;;;:::o;46606:192::-;46709:4;46726:42;46736:12;:10;:12::i;:::-;46750:9;46761:6;46726:9;:42::i;:::-;46786:4;46779:11;;46606:192;;;;:::o;43792:44::-;;;;:::o;43934:38::-;;;;;;;;;;;;;;;;;;;:::o;44361:29::-;;;;:::o;64163:171::-;11624:13;:11;:13::i;:::-;64264:8:::1;64240:21;::::0;:32:::1;;;;;;;;;;;;;;;;;;64288:38;64317:8;64288:38;;;;;;:::i;:::-;;;;;;;;64163:171:::0;:::o;44777:26::-;;;;;;;;;;;;;:::o;49142:100::-;11624:13;:11;:13::i;:::-;49227:7:::1;49216:8;:18;;;;49142:100:::0;:::o;43979:42::-;;;;;;;;;;;;;;;;;;;:::o;46806:168::-;46912:7;46939:11;:18;46951:5;46939:18;;;;;;;;;;;;;;;:27;46958:7;46939:27;;;;;;;;;;;;;;;;46932:34;;46806:168;;;;:::o;63925:110::-;11624:13;:11;:13::i;:::-;64022:5:::1;63992:18;:27;64011:7;63992:27;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;63925:110:::0;:::o;12637:201::-;11624:13;:11;:13::i;:::-;12746:1:::1;12726:22;;:8;:22;;::::0;12718:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;12802:28;12821:8;12802:18;:28::i;:::-;12637:201:::0;:::o;10289:98::-;10342:7;10369:10;10362:17;;10289:98;:::o;55907:337::-;56017:1;56000:19;;:5;:19;;;55992:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56098:1;56079:21;;:7;:21;;;56071:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56182:6;56152:11;:18;56164:5;56152:18;;;;;;;;;;;;;;;:27;56171:7;56152:27;;;;;;;;;;;;;;;:36;;;;56220:7;56204:32;;56213:5;56204:32;;;56229:6;56204:32;;;;;;:::i;:::-;;;;;;;;55907:337;;;:::o;11903:132::-;11978:12;:10;:12::i;:::-;11967:23;;:7;:5;:7::i;:::-;:23;;;11959:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;11903:132::o;56252:1197::-;56356:1;56340:18;;:4;:18;;;56332:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56433:1;56419:16;;:2;:16;;;56411:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;56503:1;56494:6;:10;56486:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;56845:28;56876:24;56894:4;56876:9;:24::i;:::-;56845:55;;56911:24;56975:29;;56938:20;:66;;56911:93;;57033:19;:53;;;;;57070:16;;;;;;;;;;;57069:17;57033:53;:89;;;;;57111:11;;;;;;;;;;;57103:19;;:4;:19;;;;57033:89;:127;;;;;57139:21;;;;;;;;;;57033:127;57015:316;;;57210:29;;57187:52;;57283:36;57298:20;57283:14;:36::i;:::-;57015:316;57409:32;57424:4;57430:2;57434:6;57409:14;:32::i;:::-;56321:1128;;56252:1197;;;:::o;35072:206::-;35158:7;35216:1;35211;:6;;35219:12;35203:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;35258:1;35254;:5;35247:12;;35072:206;;;;;:::o;53976:164::-;54018:7;54039:15;54056;54075:19;:17;:19::i;:::-;54038:56;;;;54112:20;54124:7;54112;:11;;:20;;;;:::i;:::-;54105:27;;;;53976:164;:::o;33930:98::-;33988:7;34019:1;34015;:5;;;;:::i;:::-;34008:12;;33930:98;;;;:::o;32793:::-;32851:7;32882:1;32878;:5;;;;:::i;:::-;32871:12;;32793:98;;;;:::o;52455:669::-;52557:7;52566;52575;52584;52593;52602;52642:23;52680:12;52707:18;52739:20;52751:7;52739:11;:20::i;:::-;52627:132;;;;;;52771:15;52788:23;52813:12;52829:113;52855:7;52877:4;52896:10;52921;:8;:10::i;:::-;52829:11;:113::i;:::-;52770:172;;;;;;52975:7;52997:15;53027:4;53046:15;53076:4;53095:10;52953:163;;;;;;;;;;;;;;;;;;52455:669;;;;;;;:::o;33174:98::-;33232:7;33263:1;33259;:5;;;;:::i;:::-;33252:12;;33174:98;;;;:::o;12998:191::-;13072:16;13091:6;;;;;;;;;;;13072:25;;13117:8;13108:6;;:17;;;;;;;;;;;;;;;;;;13172:8;13141:40;;13162:8;13141:40;;;;;;;;;;;;13061:128;12998:191;:::o;57457:977::-;45276:4;45257:16;;:23;;;;;;;;;;;;;;;;;;57593:12:::1;57608:27;57633:1;57608:20;:24;;:27;;;;:::i;:::-;57593:42;;57646:17;57666:30;57691:4;57666:20;:24;;:30;;;;:::i;:::-;57646:50;;57974:22;57999:21;57974:46;;58065:22;58082:4;58065:16;:22::i;:::-;58218:18;58239:41;58265:14;58239:21;:25;;:41;;;;:::i;:::-;58218:62;;58330:35;58343:9;58354:10;58330:12;:35::i;:::-;58383:43;58398:4;58404:10;58416:9;58383:43;;;;;;;;:::i;:::-;;;;;;;;57531:903;;;;45322:5:::0;45303:16;;:24;;;;;;;;;;;;;;;;;;57457:977;:::o;59623:2142::-;59755:18;:26;59774:6;59755:26;;;;;;;;;;;;;;;;;;;;;;;;;:59;;;;59785:18;:29;59804:9;59785:29;;;;;;;;;;;;;;;;;;;;;;;;;59755:59;59751:106;;;59831:14;:12;:14::i;:::-;59751:106;59931:15;59949:31;59974:5;59949:20;59960:8;;59949:6;:10;;:20;;;;:::i;:::-;:24;;:31;;;;:::i;:::-;59931:49;;59991:20;60014:43;60051:5;60014:32;60025:20;;60014:6;:10;;:32;;;;:::i;:::-;:36;;:43;;;;:::i;:::-;59991:66;;60074:11;:19;60086:6;60074:19;;;;;;;;;;;;;;;;;;;;;;;;;:46;;;;;60098:11;:22;60110:9;60098:22;;;;;;;;;;;;;;;;;;;;;;;;;60097:23;60074:46;60070:1092;;;60137:147;60177:6;60202:9;60231:37;60255:12;60231:19;60242:7;60231:6;:10;;:19;;;;:::i;:::-;:23;;:37;;;;:::i;:::-;60137:21;:147::i;:::-;60070:1092;;;60307:11;:19;60319:6;60307:19;;;;;;;;;;;;;;;;;;;;;;;;;60306:20;:46;;;;;60330:11;:22;60342:9;60330:22;;;;;;;;;;;;;;;;;;;;;;;;;60306:46;60302:860;;;60369:145;60407:6;60432:9;60461:37;60485:12;60461:19;60472:7;60461:6;:10;;:19;;;;:::i;:::-;:23;;:37;;;;:::i;:::-;60369:19;:145::i;:::-;60302:860;;;60537:11;:19;60549:6;60537:19;;;;;;;;;;;;;;;;;;;;;;;;;60536:20;:47;;;;;60561:11;:22;60573:9;60561:22;;;;;;;;;;;;;;;;;;;;;;;;;60560:23;60536:47;60532:630;;;60600:143;60636:6;60661:9;60690:37;60714:12;60690:19;60701:7;60690:6;:10;;:19;;;;:::i;:::-;:23;;:37;;;;:::i;:::-;60600:17;:143::i;:::-;60532:630;;;60765:11;:19;60777:6;60765:19;;;;;;;;;;;;;;;;;;;;;;;;;:45;;;;;60788:11;:22;60800:9;60788:22;;;;;;;;;;;;;;;;;;;;;;;;;60765:45;60761:401;;;60827:147;60867:6;60892:9;60921:37;60945:12;60921:19;60932:7;60921:6;:10;;:19;;;;:::i;:::-;:23;;:37;;;;:::i;:::-;60827:21;:147::i;:::-;60761:401;;;61007:143;61043:6;61068:9;61097:37;61121:12;61097:19;61108:7;61097:6;:10;;:19;;;;:::i;:::-;:23;;:37;;;;:::i;:::-;61007:17;:143::i;:::-;60761:401;60532:630;60302:860;60070:1092;61283:1;61258:22;:26;;;;61311:1;61295:13;:17;;;;61380:46;61398:6;61414:1;61418:7;61380:17;:46::i;:::-;61437:56;61455:6;61463:15;;;;;;;;;;;61480:12;61437:17;:56::i;:::-;61573:30;;61548:22;:55;;;;61630:21;;61614:13;:37;;;;61668:18;:26;61687:6;61668:26;;;;;;;;;;;;;;;;;;;;;;;;;:59;;;;61698:18;:29;61717:9;61698:29;;;;;;;;;;;;;;;;;;;;;;;;;61668:59;61664:93;;;61742:15;:13;:15::i;:::-;61664:93;59740:2025;;59623:2142;;;:::o;54148:605::-;54199:7;54208;54228:15;54246:7;;54228:25;;54264:15;54282:7;;54264:25;;54305:9;54300:338;54324:9;:16;;;;54320:1;:20;54300:338;;;54408:7;54384;:21;54392:9;54402:1;54392:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;54384:21;;;;;;;;;;;;;;;;:31;:83;;;;54460:7;54436;:21;54444:9;54454:1;54444:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;54436:21;;;;;;;;;;;;;;;;:31;54384:83;54362:146;;;54491:7;;54500;;54483:25;;;;;;;;;54362:146;54533:34;54545:7;:21;54553:9;54563:1;54553:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;54545:21;;;;;;;;;;;;;;;;54533:7;:11;;:34;;;;:::i;:::-;54523:44;;54592:34;54604:7;:21;54612:9;54622:1;54612:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;54604:21;;;;;;;;;;;;;;;;54592:7;:11;;:34;;;;:::i;:::-;54582:44;;54342:3;;;;;:::i;:::-;;;;54300:338;;;;54662:20;54674:7;;54662;;:11;;:20;;;;:::i;:::-;54652:7;:30;54648:61;;;54692:7;;54701;;54684:25;;;;;;;;54648:61;54728:7;54737;54720:25;;;;;;54148:605;;;:::o;53132:356::-;53208:7;53217;53226;53246:12;53261:34;53287:7;53261:25;:34::i;:::-;53246:49;;53306:18;53327:30;53349:7;53327:21;:30::i;:::-;53306:51;;53368:23;53394:33;53416:10;53394:17;53406:4;53394:7;:11;;:17;;;;:::i;:::-;:21;;:33;;;;:::i;:::-;53368:59;;53446:15;53463:4;53469:10;53438:42;;;;;;;;;53132:356;;;;;:::o;53496:472::-;53654:7;53663;53672;53692:15;53710:24;53722:11;53710:7;:11;;:24;;;;:::i;:::-;53692:42;;53745:12;53760:21;53769:11;53760:4;:8;;:21;;;;:::i;:::-;53745:36;;53792:18;53813:27;53828:11;53813:10;:14;;:27;;;;:::i;:::-;53792:48;;53851:23;53877:33;53899:10;53877:17;53889:4;53877:7;:11;;:17;;;;:::i;:::-;:21;;:33;;;;:::i;:::-;53851:59;;53929:7;53938:15;53955:4;53921:39;;;;;;;;;;53496:472;;;;;;;;:::o;58442:583::-;58568:21;58606:1;58592:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58568:40;;58637:4;58619;58624:1;58619:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;58663:13;;;;;;;;;;;:18;;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58653:4;58658:1;58653:7;;;;;;;;:::i;:::-;;;;;;;:30;;;;;;;;;;;58696:60;58713:4;58728:13;;;;;;;;;;;58744:11;58696:8;:60::i;:::-;58795:13;;;;;;;;;;;:64;;;58874:11;58900:1;58944:4;58971;58991:15;58795:222;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58497:528;58442:583;:::o;59033:509::-;59181:60;59198:4;59213:13;;;;;;;;;;;59229:11;59181:8;:60::i;:::-;59284:13;;;;;;;;;;;:29;;;59321:9;59354:4;59374:11;59400:1;59443;59486:7;:5;:7::i;:::-;59508:15;59284:250;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;59033:509;;:::o;55473:163::-;55541:1;55516:22;:26;;;;55569:1;55553:13;:17;;;;55592:1;55581:8;:12;;;;55627:1;55604:20;:24;;;;55473:163::o;33531:98::-;33589:7;33620:1;33616;:5;;;;:::i;:::-;33609:12;;33531:98;;;;:::o;63112:686::-;63263:15;63293:23;63331:12;63358:23;63396:12;63423:18;63455:19;63466:7;63455:10;:19::i;:::-;63248:226;;;;;;;;;;;;63503:28;63523:7;63503;:15;63511:6;63503:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;63485:7;:15;63493:6;63485:15;;;;;;;;;;;;;;;:46;;;;63560:28;63580:7;63560;:15;63568:6;63560:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;63542:7;:15;63550:6;63542:15;;;;;;;;;;;;;;;:46;;;;63620:39;63643:15;63620:7;:18;63628:9;63620:18;;;;;;;;;;;;;;;;:22;;:39;;;;:::i;:::-;63599:7;:18;63607:9;63599:18;;;;;;;;;;;;;;;:60;;;;63670:26;63685:10;63670:14;:26::i;:::-;63707:23;63719:4;63725;63707:11;:23::i;:::-;63763:9;63746:44;;63755:6;63746:44;;;63774:15;63746:44;;;;;;:::i;:::-;;;;;;;;63237:561;;;;;;63112:686;;;:::o;62406:698::-;62555:15;62585:23;62623:12;62650:23;62688:12;62715:18;62747:19;62758:7;62747:10;:19::i;:::-;62540:226;;;;;;;;;;;;62795:28;62815:7;62795;:15;62803:6;62795:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;62777:7;:15;62785:6;62777:15;;;;;;;;;;;;;;;:46;;;;62855:39;62878:15;62855:7;:18;62863:9;62855:18;;;;;;;;;;;;;;;;:22;;:39;;;;:::i;:::-;62834:7;:18;62842:9;62834:18;;;;;;;;;;;;;;;:60;;;;62926:39;62949:15;62926:7;:18;62934:9;62926:18;;;;;;;;;;;;;;;;:22;;:39;;;;:::i;:::-;62905:7;:18;62913:9;62905:18;;;;;;;;;;;;;;;:60;;;;62976:26;62991:10;62976:14;:26::i;:::-;63013:23;63025:4;63031;63013:11;:23::i;:::-;63069:9;63052:44;;63061:6;63052:44;;;63080:15;63052:44;;;;;;:::i;:::-;;;;;;;;62529:575;;;;;;62406:698;;;:::o;61773:625::-;61920:15;61950:23;61988:12;62015:23;62053:12;62080:18;62112:19;62123:7;62112:10;:19::i;:::-;61905:226;;;;;;;;;;;;62160:28;62180:7;62160;:15;62168:6;62160:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;62142:7;:15;62150:6;62142:15;;;;;;;;;;;;;;;:46;;;;62220:39;62243:15;62220:7;:18;62228:9;62220:18;;;;;;;;;;;;;;;;:22;;:39;;;;:::i;:::-;62199:7;:18;62207:9;62199:18;;;;;;;;;;;;;;;:60;;;;62270:26;62285:10;62270:14;:26::i;:::-;62307:23;62319:4;62325;62307:11;:23::i;:::-;62363:9;62346:44;;62355:6;62346:44;;;62374:15;62346:44;;;;;;:::i;:::-;;;;;;;;61894:504;;;;;;61773:625;;;:::o;51444:757::-;51595:15;51625:23;51663:12;51690:23;51728:12;51755:18;51787:19;51798:7;51787:10;:19::i;:::-;51580:226;;;;;;;;;;;;51835:28;51855:7;51835;:15;51843:6;51835:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;51817:7;:15;51825:6;51817:15;;;;;;;;;;;;;;;:46;;;;51892:28;51912:7;51892;:15;51900:6;51892:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;51874:7;:15;51882:6;51874:15;;;;;;;;;;;;;;;:46;;;;51952:39;51975:15;51952:7;:18;51960:9;51952:18;;;;;;;;;;;;;;;;:22;;:39;;;;:::i;:::-;51931:7;:18;51939:9;51931:18;;;;;;;;;;;;;;;:60;;;;52023:39;52046:15;52023:7;:18;52031:9;52023:18;;;;;;;;;;;;;;;;:22;;:39;;;;:::i;:::-;52002:7;:18;52010:9;52002:18;;;;;;;;;;;;;;;:60;;;;52073:26;52088:10;52073:14;:26::i;:::-;52110:23;52122:4;52128;52110:11;:23::i;:::-;52166:9;52149:44;;52158:6;52149:44;;;52177:15;52149:44;;;;;;:::i;:::-;;;;;;;;51569:632;;;;;;51444:757;;;:::o;55644:255::-;55713:30;;55688:22;:55;;;;55770:21;;55754:13;:37;;;;55813:16;;55802:8;:27;;;;55863:28;;55840:20;:51;;;;55644:255::o;55124:173::-;55214:7;55241:48;55281:7;55241:35;55253:22;;55241:7;:11;;:35;;;;:::i;:::-;:39;;:48;;;;:::i;:::-;55234:55;;55124:173;;;:::o;55305:160::-;55391:7;55418:39;55449:7;55418:26;55430:13;;55418:7;:11;;:26;;;;:::i;:::-;:30;;:39;;;;:::i;:::-;55411:46;;55305:160;;;:::o;54761:355::-;54824:19;54846:10;:8;:10::i;:::-;54824:32;;54867:18;54888:27;54903:11;54888:10;:14;;:27;;;;:::i;:::-;54867:48;;54951:38;54978:10;54951:7;:22;54967:4;54951:22;;;;;;;;;;;;;;;;:26;;:38;;;;:::i;:::-;54926:7;:22;54942:4;54926:22;;;;;;;;;;;;;;;:63;;;;55004:11;:26;55024:4;55004:26;;;;;;;;;;;;;;;;;;;;;;;;;55000:108;;;55070:38;55097:10;55070:7;:22;55086:4;55070:22;;;;;;;;;;;;;;;;:26;;:38;;;;:::i;:::-;55045:7;:22;55061:4;55045:22;;;;;;;;;;;;;;;:63;;;;55000:108;54813:303;;54761:355;:::o;52300:147::-;52378:17;52390:4;52378:7;;:11;;:17;;;;:::i;:::-;52368:7;:27;;;;52419:20;52434:4;52419:10;;:14;;:20;;;;:::i;:::-;52406:10;:33;;;;52300:147;;:::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;1676:126;1713:7;1753:42;1746:5;1742:54;1731:65;;1676:126;;;:::o;1808:96::-;1845:7;1874:24;1892:5;1874:24;:::i;:::-;1863:35;;1808:96;;;:::o;1910:122::-;1983:24;2001:5;1983:24;:::i;:::-;1976:5;1973:35;1963:63;;2022:1;2019;2012:12;1963:63;1910:122;:::o;2038:139::-;2084:5;2122:6;2109:20;2100:29;;2138:33;2165:5;2138:33;:::i;:::-;2038:139;;;;:::o;2183:77::-;2220:7;2249:5;2238:16;;2183:77;;;:::o;2266:122::-;2339:24;2357:5;2339:24;:::i;:::-;2332:5;2329:35;2319:63;;2378:1;2375;2368:12;2319:63;2266:122;:::o;2394:139::-;2440:5;2478:6;2465:20;2456:29;;2494:33;2521:5;2494:33;:::i;:::-;2394:139;;;;:::o;2539:474::-;2607:6;2615;2664:2;2652:9;2643:7;2639:23;2635:32;2632:119;;;2670:79;;:::i;:::-;2632:119;2790:1;2815:53;2860:7;2851:6;2840:9;2836:22;2815:53;:::i;:::-;2805:63;;2761:117;2917:2;2943:53;2988:7;2979:6;2968:9;2964:22;2943:53;:::i;:::-;2933:63;;2888:118;2539:474;;;;;:::o;3019:90::-;3053:7;3096:5;3089:13;3082:21;3071:32;;3019:90;;;:::o;3115:109::-;3196:21;3211:5;3196:21;:::i;:::-;3191:3;3184:34;3115:109;;:::o;3230:210::-;3317:4;3355:2;3344:9;3340:18;3332:26;;3368:65;3430:1;3419:9;3415:17;3406:6;3368:65;:::i;:::-;3230:210;;;;:::o;3446:118::-;3533:24;3551:5;3533:24;:::i;:::-;3528:3;3521:37;3446:118;;:::o;3570:222::-;3663:4;3701:2;3690:9;3686:18;3678:26;;3714:71;3782:1;3771:9;3767:17;3758:6;3714:71;:::i;:::-;3570:222;;;;:::o;3798:329::-;3857:6;3906:2;3894:9;3885:7;3881:23;3877:32;3874:119;;;3912:79;;:::i;:::-;3874:119;4032:1;4057:53;4102:7;4093:6;4082:9;4078:22;4057:53;:::i;:::-;4047:63;;4003:117;3798:329;;;;:::o;4133:619::-;4210:6;4218;4226;4275:2;4263:9;4254:7;4250:23;4246:32;4243:119;;;4281:79;;:::i;:::-;4243:119;4401:1;4426:53;4471:7;4462:6;4451:9;4447:22;4426:53;:::i;:::-;4416:63;;4372:117;4528:2;4554:53;4599:7;4590:6;4579:9;4575:22;4554:53;:::i;:::-;4544:63;;4499:118;4656:2;4682:53;4727:7;4718:6;4707:9;4703:22;4682:53;:::i;:::-;4672:63;;4627:118;4133:619;;;;;:::o;4758:329::-;4817:6;4866:2;4854:9;4845:7;4841:23;4837:32;4834:119;;;4872:79;;:::i;:::-;4834:119;4992:1;5017:53;5062:7;5053:6;5042:9;5038:22;5017:53;:::i;:::-;5007:63;;4963:117;4758:329;;;;:::o;5093:86::-;5128:7;5168:4;5161:5;5157:16;5146:27;;5093:86;;;:::o;5185:112::-;5268:22;5284:5;5268:22;:::i;:::-;5263:3;5256:35;5185:112;;:::o;5303:214::-;5392:4;5430:2;5419:9;5415:18;5407:26;;5443:67;5507:1;5496:9;5492:17;5483:6;5443:67;:::i;:::-;5303:214;;;;:::o;5523:116::-;5593:21;5608:5;5593:21;:::i;:::-;5586:5;5583:32;5573:60;;5629:1;5626;5619:12;5573:60;5523:116;:::o;5645:133::-;5688:5;5726:6;5713:20;5704:29;;5742:30;5766:5;5742:30;:::i;:::-;5645:133;;;;:::o;5784:468::-;5849:6;5857;5906:2;5894:9;5885:7;5881:23;5877:32;5874:119;;;5912:79;;:::i;:::-;5874:119;6032:1;6057:53;6102:7;6093:6;6082:9;6078:22;6057:53;:::i;:::-;6047:63;;6003:117;6159:2;6185:50;6227:7;6218:6;6207:9;6203:22;6185:50;:::i;:::-;6175:60;;6130:115;5784:468;;;;;:::o;6258:60::-;6286:3;6307:5;6300:12;;6258:60;;;:::o;6324:142::-;6374:9;6407:53;6425:34;6434:24;6452:5;6434:24;:::i;:::-;6425:34;:::i;:::-;6407:53;:::i;:::-;6394:66;;6324:142;;;:::o;6472:126::-;6522:9;6555:37;6586:5;6555:37;:::i;:::-;6542:50;;6472:126;;;:::o;6604:153::-;6681:9;6714:37;6745:5;6714:37;:::i;:::-;6701:50;;6604:153;;;:::o;6763:185::-;6877:64;6935:5;6877:64;:::i;:::-;6872:3;6865:77;6763:185;;:::o;6954:276::-;7074:4;7112:2;7101:9;7097:18;7089:26;;7125:98;7220:1;7209:9;7205:17;7196:6;7125:98;:::i;:::-;6954:276;;;;:::o;7236:118::-;7323:24;7341:5;7323:24;:::i;:::-;7318:3;7311:37;7236:118;;:::o;7360:222::-;7453:4;7491:2;7480:9;7476:18;7468:26;;7504:71;7572:1;7561:9;7557:17;7548:6;7504:71;:::i;:::-;7360:222;;;;:::o;7588:323::-;7644:6;7693:2;7681:9;7672:7;7668:23;7664:32;7661:119;;;7699:79;;:::i;:::-;7661:119;7819:1;7844:50;7886:7;7877:6;7866:9;7862:22;7844:50;:::i;:::-;7834:60;;7790:114;7588:323;;;;:::o;7917:474::-;7985:6;7993;8042:2;8030:9;8021:7;8017:23;8013:32;8010:119;;;8048:79;;:::i;:::-;8010:119;8168:1;8193:53;8238:7;8229:6;8218:9;8214:22;8193:53;:::i;:::-;8183:63;;8139:117;8295:2;8321:53;8366:7;8357:6;8346:9;8342:22;8321:53;:::i;:::-;8311:63;;8266:118;7917:474;;;;;:::o;8397:229::-;8537:34;8533:1;8525:6;8521:14;8514:58;8606:12;8601:2;8593:6;8589:15;8582:37;8397:229;:::o;8632:366::-;8774:3;8795:67;8859:2;8854:3;8795:67;:::i;:::-;8788:74;;8871:93;8960:3;8871:93;:::i;:::-;8989:2;8984:3;8980:12;8973:19;;8632:366;;;:::o;9004:419::-;9170:4;9208:2;9197:9;9193:18;9185:26;;9257:9;9251:4;9247:20;9243:1;9232:9;9228:17;9221:47;9285:131;9411:4;9285:131;:::i;:::-;9277:139;;9004:419;;;:::o;9429:177::-;9569:29;9565:1;9557:6;9553:14;9546:53;9429:177;:::o;9612:366::-;9754:3;9775:67;9839:2;9834:3;9775:67;:::i;:::-;9768:74;;9851:93;9940:3;9851:93;:::i;:::-;9969:2;9964:3;9960:12;9953:19;;9612:366;;;:::o;9984:419::-;10150:4;10188:2;10177:9;10173:18;10165:26;;10237:9;10231:4;10227:20;10223:1;10212:9;10208:17;10201:47;10265:131;10391:4;10265:131;:::i;:::-;10257:139;;9984:419;;;:::o;10409:180::-;10457:77;10454:1;10447:88;10554:4;10551:1;10544:15;10578:4;10575:1;10568:15;10595:180;10643:77;10640:1;10633:88;10740:4;10737:1;10730:15;10764:4;10761:1;10754:15;10781:194;10821:4;10841:20;10859:1;10841:20;:::i;:::-;10836:25;;10875:20;10893:1;10875:20;:::i;:::-;10870:25;;10919:1;10916;10912:9;10904:17;;10943:1;10937:4;10934:11;10931:37;;;10948:18;;:::i;:::-;10931:37;10781:194;;;;:::o;10981:180::-;11029:77;11026:1;11019:88;11126:4;11123:1;11116:15;11150:4;11147:1;11140:15;11167:233;11206:3;11229:24;11247:5;11229:24;:::i;:::-;11220:33;;11275:66;11268:5;11265:77;11262:103;;11345:18;;:::i;:::-;11262:103;11392:1;11385:5;11381:13;11374:20;;11167:233;;;:::o;11406:231::-;11546:34;11542:1;11534:6;11530:14;11523:58;11615:14;11610:2;11602:6;11598:15;11591:39;11406:231;:::o;11643:366::-;11785:3;11806:67;11870:2;11865:3;11806:67;:::i;:::-;11799:74;;11882:93;11971:3;11882:93;:::i;:::-;12000:2;11995:3;11991:12;11984:19;;11643:366;;;:::o;12015:419::-;12181:4;12219:2;12208:9;12204:18;12196:26;;12268:9;12262:4;12258:20;12254:1;12243:9;12239:17;12232:47;12296:131;12422:4;12296:131;:::i;:::-;12288:139;;12015:419;;;:::o;12440:181::-;12580:33;12576:1;12568:6;12564:14;12557:57;12440:181;:::o;12627:366::-;12769:3;12790:67;12854:2;12849:3;12790:67;:::i;:::-;12783:74;;12866:93;12955:3;12866:93;:::i;:::-;12984:2;12979:3;12975:12;12968:19;;12627:366;;;:::o;12999:419::-;13165:4;13203:2;13192:9;13188:18;13180:26;;13252:9;13246:4;13242:20;13238:1;13227:9;13223:17;13216:47;13280:131;13406:4;13280:131;:::i;:::-;13272:139;;12999:419;;;:::o;13424:221::-;13564:34;13560:1;13552:6;13548:14;13541:58;13633:4;13628:2;13620:6;13616:15;13609:29;13424:221;:::o;13651:366::-;13793:3;13814:67;13878:2;13873:3;13814:67;:::i;:::-;13807:74;;13890:93;13979:3;13890:93;:::i;:::-;14008:2;14003:3;13999:12;13992:19;;13651:366;;;:::o;14023:419::-;14189:4;14227:2;14216:9;14212:18;14204:26;;14276:9;14270:4;14266:20;14262:1;14251:9;14247:17;14240:47;14304:131;14430:4;14304:131;:::i;:::-;14296:139;;14023:419;;;:::o;14448:225::-;14588:34;14584:1;14576:6;14572:14;14565:58;14657:8;14652:2;14644:6;14640:15;14633:33;14448:225;:::o;14679:366::-;14821:3;14842:67;14906:2;14901:3;14842:67;:::i;:::-;14835:74;;14918:93;15007:3;14918:93;:::i;:::-;15036:2;15031:3;15027:12;15020:19;;14679:366;;;:::o;15051:419::-;15217:4;15255:2;15244:9;15240:18;15232:26;;15304:9;15298:4;15294:20;15290:1;15279:9;15275:17;15268:47;15332:131;15458:4;15332:131;:::i;:::-;15324:139;;15051:419;;;:::o;15476:223::-;15616:34;15612:1;15604:6;15600:14;15593:58;15685:6;15680:2;15672:6;15668:15;15661:31;15476:223;:::o;15705:366::-;15847:3;15868:67;15932:2;15927:3;15868:67;:::i;:::-;15861:74;;15944:93;16033:3;15944:93;:::i;:::-;16062:2;16057:3;16053:12;16046:19;;15705:366;;;:::o;16077:419::-;16243:4;16281:2;16270:9;16266:18;16258:26;;16330:9;16324:4;16320:20;16316:1;16305:9;16301:17;16294:47;16358:131;16484:4;16358:131;:::i;:::-;16350:139;;16077:419;;;:::o;16502:221::-;16642:34;16638:1;16630:6;16626:14;16619:58;16711:4;16706:2;16698:6;16694:15;16687:29;16502:221;:::o;16729:366::-;16871:3;16892:67;16956:2;16951:3;16892:67;:::i;:::-;16885:74;;16968:93;17057:3;16968:93;:::i;:::-;17086:2;17081:3;17077:12;17070:19;;16729:366;;;:::o;17101:419::-;17267:4;17305:2;17294:9;17290:18;17282:26;;17354:9;17348:4;17344:20;17340:1;17329:9;17325:17;17318:47;17382:131;17508:4;17382:131;:::i;:::-;17374:139;;17101:419;;;:::o;17526:182::-;17666:34;17662:1;17654:6;17650:14;17643:58;17526:182;:::o;17714:366::-;17856:3;17877:67;17941:2;17936:3;17877:67;:::i;:::-;17870:74;;17953:93;18042:3;17953:93;:::i;:::-;18071:2;18066:3;18062:12;18055:19;;17714:366;;;:::o;18086:419::-;18252:4;18290:2;18279:9;18275:18;18267:26;;18339:9;18333:4;18329:20;18325:1;18314:9;18310:17;18303:47;18367:131;18493:4;18367:131;:::i;:::-;18359:139;;18086:419;;;:::o;18511:224::-;18651:34;18647:1;18639:6;18635:14;18628:58;18720:7;18715:2;18707:6;18703:15;18696:32;18511:224;:::o;18741:366::-;18883:3;18904:67;18968:2;18963:3;18904:67;:::i;:::-;18897:74;;18980:93;19069:3;18980:93;:::i;:::-;19098:2;19093:3;19089:12;19082:19;;18741:366;;;:::o;19113:419::-;19279:4;19317:2;19306:9;19302:18;19294:26;;19366:9;19360:4;19356:20;19352:1;19341:9;19337:17;19330:47;19394:131;19520:4;19394:131;:::i;:::-;19386:139;;19113:419;;;:::o;19538:222::-;19678:34;19674:1;19666:6;19662:14;19655:58;19747:5;19742:2;19734:6;19730:15;19723:30;19538:222;:::o;19766:366::-;19908:3;19929:67;19993:2;19988:3;19929:67;:::i;:::-;19922:74;;20005:93;20094:3;20005:93;:::i;:::-;20123:2;20118:3;20114:12;20107:19;;19766:366;;;:::o;20138:419::-;20304:4;20342:2;20331:9;20327:18;20319:26;;20391:9;20385:4;20381:20;20377:1;20366:9;20362:17;20355:47;20419:131;20545:4;20419:131;:::i;:::-;20411:139;;20138:419;;;:::o;20563:228::-;20703:34;20699:1;20691:6;20687:14;20680:58;20772:11;20767:2;20759:6;20755:15;20748:36;20563:228;:::o;20797:366::-;20939:3;20960:67;21024:2;21019:3;20960:67;:::i;:::-;20953:74;;21036:93;21125:3;21036:93;:::i;:::-;21154:2;21149:3;21145:12;21138:19;;20797:366;;;:::o;21169:419::-;21335:4;21373:2;21362:9;21358:18;21350:26;;21422:9;21416:4;21412:20;21408:1;21397:9;21393:17;21386:47;21450:131;21576:4;21450:131;:::i;:::-;21442:139;;21169:419;;;:::o;21594:180::-;21642:77;21639:1;21632:88;21739:4;21736:1;21729:15;21763:4;21760:1;21753:15;21780:185;21820:1;21837:20;21855:1;21837:20;:::i;:::-;21832:25;;21871:20;21889:1;21871:20;:::i;:::-;21866:25;;21910:1;21900:35;;21915:18;;:::i;:::-;21900:35;21957:1;21954;21950:9;21945:14;;21780:185;;;;:::o;21971:191::-;22011:3;22030:20;22048:1;22030:20;:::i;:::-;22025:25;;22064:20;22082:1;22064:20;:::i;:::-;22059:25;;22107:1;22104;22100:9;22093:16;;22128:3;22125:1;22122:10;22119:36;;;22135:18;;:::i;:::-;22119:36;21971:191;;;;:::o;22168:442::-;22317:4;22355:2;22344:9;22340:18;22332:26;;22368:71;22436:1;22425:9;22421:17;22412:6;22368:71;:::i;:::-;22449:72;22517:2;22506:9;22502:18;22493:6;22449:72;:::i;:::-;22531;22599:2;22588:9;22584:18;22575:6;22531:72;:::i;:::-;22168:442;;;;;;:::o;22616:180::-;22664:77;22661:1;22654:88;22761:4;22758:1;22751:15;22785:4;22782:1;22775:15;22802:143;22859:5;22890:6;22884:13;22875:22;;22906:33;22933:5;22906:33;:::i;:::-;22802:143;;;;:::o;22951:351::-;23021:6;23070:2;23058:9;23049:7;23045:23;23041:32;23038:119;;;23076:79;;:::i;:::-;23038:119;23196:1;23221:64;23277:7;23268:6;23257:9;23253:22;23221:64;:::i;:::-;23211:74;;23167:128;22951:351;;;;:::o;23308:85::-;23353:7;23382:5;23371:16;;23308:85;;;:::o;23399:158::-;23457:9;23490:61;23508:42;23517:32;23543:5;23517:32;:::i;:::-;23508:42;:::i;:::-;23490:61;:::i;:::-;23477:74;;23399:158;;;:::o;23563:147::-;23658:45;23697:5;23658:45;:::i;:::-;23653:3;23646:58;23563:147;;:::o;23716:114::-;23783:6;23817:5;23811:12;23801:22;;23716:114;;;:::o;23836:184::-;23935:11;23969:6;23964:3;23957:19;24009:4;24004:3;24000:14;23985:29;;23836:184;;;;:::o;24026:132::-;24093:4;24116:3;24108:11;;24146:4;24141:3;24137:14;24129:22;;24026:132;;;:::o;24164:108::-;24241:24;24259:5;24241:24;:::i;:::-;24236:3;24229:37;24164:108;;:::o;24278:179::-;24347:10;24368:46;24410:3;24402:6;24368:46;:::i;:::-;24446:4;24441:3;24437:14;24423:28;;24278:179;;;;:::o;24463:113::-;24533:4;24565;24560:3;24556:14;24548:22;;24463:113;;;:::o;24612:732::-;24731:3;24760:54;24808:5;24760:54;:::i;:::-;24830:86;24909:6;24904:3;24830:86;:::i;:::-;24823:93;;24940:56;24990:5;24940:56;:::i;:::-;25019:7;25050:1;25035:284;25060:6;25057:1;25054:13;25035:284;;;25136:6;25130:13;25163:63;25222:3;25207:13;25163:63;:::i;:::-;25156:70;;25249:60;25302:6;25249:60;:::i;:::-;25239:70;;25095:224;25082:1;25079;25075:9;25070:14;;25035:284;;;25039:14;25335:3;25328:10;;24736:608;;;24612:732;;;;:::o;25350:831::-;25613:4;25651:3;25640:9;25636:19;25628:27;;25665:71;25733:1;25722:9;25718:17;25709:6;25665:71;:::i;:::-;25746:80;25822:2;25811:9;25807:18;25798:6;25746:80;:::i;:::-;25873:9;25867:4;25863:20;25858:2;25847:9;25843:18;25836:48;25901:108;26004:4;25995:6;25901:108;:::i;:::-;25893:116;;26019:72;26087:2;26076:9;26072:18;26063:6;26019:72;:::i;:::-;26101:73;26169:3;26158:9;26154:19;26145:6;26101:73;:::i;:::-;25350:831;;;;;;;;:::o;26187:807::-;26436:4;26474:3;26463:9;26459:19;26451:27;;26488:71;26556:1;26545:9;26541:17;26532:6;26488:71;:::i;:::-;26569:72;26637:2;26626:9;26622:18;26613:6;26569:72;:::i;:::-;26651:80;26727:2;26716:9;26712:18;26703:6;26651:80;:::i;:::-;26741;26817:2;26806:9;26802:18;26793:6;26741:80;:::i;:::-;26831:73;26899:3;26888:9;26884:19;26875:6;26831:73;:::i;:::-;26914;26982:3;26971:9;26967:19;26958:6;26914:73;:::i;:::-;26187:807;;;;;;;;;:::o;27000:143::-;27057:5;27088:6;27082:13;27073:22;;27104:33;27131:5;27104:33;:::i;:::-;27000:143;;;;:::o;27149:663::-;27237:6;27245;27253;27302:2;27290:9;27281:7;27277:23;27273:32;27270:119;;;27308:79;;:::i;:::-;27270:119;27428:1;27453:64;27509:7;27500:6;27489:9;27485:22;27453:64;:::i;:::-;27443:74;;27399:128;27566:2;27592:64;27648:7;27639:6;27628:9;27624:22;27592:64;:::i;:::-;27582:74;;27537:129;27705:2;27731:64;27787:7;27778:6;27767:9;27763:22;27731:64;:::i;:::-;27721:74;;27676:129;27149:663;;;;;:::o;27818:410::-;27858:7;27881:20;27899:1;27881:20;:::i;:::-;27876:25;;27915:20;27933:1;27915:20;:::i;:::-;27910:25;;27970:1;27967;27963:9;27992:30;28010:11;27992:30;:::i;:::-;27981:41;;28171:1;28162:7;28158:15;28155:1;28152:22;28132:1;28125:9;28105:83;28082:139;;28201:18;;:::i;:::-;28082:139;27866:362;27818:410;;;;:::o

Swarm Source

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