ETH Price: $3,468.63 (-0.08%)
Gas: 6 Gwei

Token

Nodify (NODIFY)
 

Overview

Max Total Supply

100,000 NODIFY

Holders

59

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
1,499.999999999 NODIFY

Value
$0.00
0xd168343da56d890656045b8530982bc13ebfd38b
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:
Nodify

Compiler Version
v0.8.24+commit.e11b9ed9

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-03-06
*/

// https://nodify.finance
// https://twitter.com/nodifyfinance
// https://t.me/nodifyfinance

// SPDX-License-Identifier: AGPL-3.0-or-later

pragma solidity >=0.7.5;


/**
 * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.
 *
 * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,
 * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding
 * they need in their contracts using a combination of `abi.encode` and `keccak256`.
 *
 * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding
 * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA
 * ({_hashTypedDataV4}).
 *
 * The implementation of the domain separator was designed to be as efficient as possible while still properly updating
 * the chain id to protect against replay attacks on an eventual fork of the chain.
 *
 * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method
 * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].
 *
 * _Available since v3.4._
 */
abstract contract EIP712 {
    /* solhint-disable var-name-mixedcase */
    // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to
    // invalidate the cached domain separator if the chain id changes.
    bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;
    uint256 private immutable _CACHED_CHAIN_ID;

    bytes32 private immutable _HASHED_NAME;
    bytes32 private immutable _HASHED_VERSION;
    bytes32 private immutable _TYPE_HASH;

    /* solhint-enable var-name-mixedcase */

    /**
     * @dev Initializes the domain separator and parameter caches.
     *
     * The meaning of `name` and `version` is specified in
     * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:
     *
     * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.
     * - `version`: the current major version of the signing domain.
     *
     * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart
     * contract upgrade].
     */
    constructor(string memory name, string memory version) {

        uint256 chainID;
        assembly {
            chainID := chainid()
        }

        bytes32 hashedName = keccak256(bytes(name));
        bytes32 hashedVersion = keccak256(bytes(version));
        bytes32 typeHash = keccak256(
            "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"
        );
        _HASHED_NAME = hashedName;
        _HASHED_VERSION = hashedVersion;
        _CACHED_CHAIN_ID = chainID;
        _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);
        _TYPE_HASH = typeHash;
    }

    /**
     * @dev Returns the domain separator for the current chain.
     */
    function _domainSeparatorV4() internal view returns (bytes32) {

        uint256 chainID;
        assembly {
            chainID := chainid()
        }

        if (chainID == _CACHED_CHAIN_ID) {
            return _CACHED_DOMAIN_SEPARATOR;
        } else {
            return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);
        }
    }

    function _buildDomainSeparator(
        bytes32 typeHash,
        bytes32 nameHash,
        bytes32 versionHash
    ) private view returns (bytes32) {
        uint256 chainID;
        assembly {
            chainID := chainid()
        }

        return keccak256(abi.encode(typeHash, nameHash, versionHash, chainID, address(this)));
    }

    /**
     * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this
     * function returns the hash of the fully encoded EIP712 message for this domain.
     *
     * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:
     *
     * ```solidity
     * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(
     *     keccak256("Mail(address to,string contents)"),
     *     mailTo,
     *     keccak256(bytes(mailContents))
     * )));
     * address signer = ECDSA.recover(digest, signature);
     * ```
     */
    function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {
        return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);
    }
}
// File: interfaces/IERC20Permit.sol


pragma solidity >=0.7.5;

/**
 * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
 * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
 *
 * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
 * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
 * need to send a transaction, and thus is not required to hold Ether at all.
 */
interface IERC20Permit {
    /**
     * @dev Sets `value` as th xe allowance of `spender` over ``owner``'s tokens,
     * given ``owner``'s signed approval.
     *
     * IMPORTANT: The same issues {IERC20-approve} has related to transaction
     * ordering also apply here.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `deadline` must be a timestamp in the future.
     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
     * over the EIP712-formatted function arguments.
     * - the signature must use ``owner``'s current nonce (see {nonces}).
     *
     * For more information on the signature format, see the
     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
     * section].
     */
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

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

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

// File: interfaces/IERC20.sol


pragma solidity >=0.7.5;

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

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

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

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

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

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

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

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

// File: interfaces/ISIN.sol


pragma solidity >=0.7.5;


pragma solidity >=0.7.5;

/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s;
        uint8 v;
        assembly {
            s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)
            v := add(shr(255, vs), 27)
        }
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}

// File: libraries/SafeMath.sol

pragma solidity >=0.7.5;


// TODO(zx): Replace all instances of SafeMath with OZ implementation
library SafeMath {

    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    // Only used in the  BondingCalculator.sol
    function sqrrt(uint256 a) internal pure returns (uint c) {
        if (a > 3) {
            c = a;
            uint b = add( div( a, 2), 1 );
            while (b < c) {
                c = b;
                b = div( add( div( a, b ), b), 2 );
            }
        } else if (a != 0) {
            c = 1;
        }
    }

}
// File: libraries/Counters.sol

library SafeMathInt {
    int256 private constant MIN_INT256 = int256(1) << 255;
    int256 private constant MAX_INT256 = ~(int256(1) << 255);

    /**
     * @dev Multiplies two int256 variables and fails on overflow.
     */
    function mul(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a * b;

        // Detect overflow when multiplying MIN_INT256 with -1
        require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256));
        require((b == 0) || (c / b == a));
        return c;
    }

    /**
     * @dev Division of two int256 variables and fails on overflow.
     */
    function div(int256 a, int256 b) internal pure returns (int256) {
        // Prevent overflow when dividing MIN_INT256 by -1
        require(b != -1 || a != MIN_INT256);

        // Solidity already throws when dividing by 0.
        return a / b;
    }

    /**
     * @dev Subtracts two int256 variables and fails on overflow.
     */
    function sub(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a - b;
        require((b >= 0 && c <= a) || (b < 0 && c > a));
        return c;
    }

    /**
     * @dev Adds two int256 variables and fails on overflow.
     */
    function add(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a + b;
        require((b >= 0 && c >= a) || (b < 0 && c < a));
        return c;
    }

    /**
     * @dev Converts to absolute value, and fails on overflow.
     */
    function abs(int256 a) internal pure returns (int256) {
        require(a != MIN_INT256);
        return a < 0 ? -a : a;
    }


    function toUint256Safe(int256 a) internal pure returns (uint256) {
        require(a >= 0);
        return uint256(a);
    }
}

library SafeMathUint {
  function toInt256Safe(uint256 a) internal pure returns (int256) {
    int256 b = int256(a);
    require(b >= 0);
    return b;
  }
}


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

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}

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

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

pragma solidity >=0.7.5;


library Counters {
    using SafeMath for uint256;

    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        // The {SafeMath} overflow check can be skipped here, see the comment at the top
        counter._value += 1;
    }

    function decrement(Counter storage counter) internal {
        counter._value = counter._value.sub(1);
    }
}
// File: types/ERC20.sol


pragma solidity >=0.7.5;


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

    function _msgData() internal view virtual returns (bytes calldata) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}


pragma solidity >=0.7.5;

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 () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

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

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

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


abstract contract ERC20 is Context, IERC20{

    using SafeMath for uint256;

    // TODO comment actual hash value.
    bytes32 constant private ERC20TOKEN_ERC1820_INTERFACE_ID = keccak256( "ERC20Token" );
    
    mapping (address => uint256) internal _balances;

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

    uint256 internal _totalSupply;

    string internal _name;
    
    string internal _symbol;
    
    uint8 internal immutable _decimals;

    constructor (string memory name_, string memory symbol_, uint8 decimals_) {
        _name = name_;
        _symbol = symbol_;
        _decimals = decimals_;
    }

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

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

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

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

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

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

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

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

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

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

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

    function _transfer(address sender, address recipient, uint256 amount) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");
        _beforeTokenTransfer(address(0), account, amount);
        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(address(0), account, amount);
    }

    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

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

        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }

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

  function _beforeTokenTransfer( address from_, address to_, uint256 amount_ ) internal virtual { }
}

// File: types/ERC20Permit.sol


pragma solidity >=0.7.5;






/**
 * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
 * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
 *
 * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
 * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't
 * need to send a transaction, and thus is not required to hold Ether at all.
 *
 * _Available since v3.4._
 */
abstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 {
    using Counters for Counters.Counter;

    mapping(address => Counters.Counter) private _nonces;

    // solhint-disable-next-line var-name-mixedcase
    bytes32 private immutable _PERMIT_TYPEHASH = keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");

    /**
     * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `"1"`.
     *
     * It's a good idea to use the same `name` that is defined as the ERC20 token name.
     */
    constructor(string memory name) EIP712(name, "1") {}

    /**
     * @dev See {IERC20Permit-permit}.
     */
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public virtual override {
        require(block.timestamp <= deadline, "ERC20Permit: expired deadline");

        bytes32 structHash = keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline));

        bytes32 hash = _hashTypedDataV4(structHash);

        address signer = ECDSA.recover(hash, v, r, s);
        require(signer == owner, "ERC20Permit: invalid signature");

        _approve(owner, spender, value);
    }

    /**
     * @dev See {IERC20Permit-nonces}.
     */
    function nonces(address owner) public view virtual override returns (uint256) {
        return _nonces[owner].current();
    }

    /**
     * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.
     */
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view override returns (bytes32) {
        return _domainSeparatorV4();
    }

    /**
     * @dev "Consume a nonce": return the current value and increment.
     *
     * _Available since v4.1._
     */
    function _useNonce(address owner) internal virtual returns (uint256 current) {
        Counters.Counter storage nonce = _nonces[owner];
        current = nonce.current();
        nonce.increment();
    }
}


pragma solidity >=0.7.5;



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

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

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

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

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

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

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

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

    function initialize(address, address) external;
}

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

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

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

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

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




contract Nodify is ERC20Permit, Ownable {
    using SafeMath for uint256;

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

    address public marketingWallet;
    address public treasuryWallet;

    bool public tradingActive = false;
    bool public swapEnabled = false;
    bool private swapping;
    uint256 public enableBlock = 0;

    uint256 public buyTotalFees;
    uint256 public buyMarketingFee;
    uint256 public buyLiquidityFee;
    uint256 public buyBurnFee;
    uint256 public buyTreasuryFee;
    
    uint256 public sellTotalFees;
    uint256 public sellMarketingFee;
    uint256 public sellLiquidityFee;
    uint256 public sellBurnFee;
    uint256 public sellTreasuryFee;

    uint256 public tokensForMarketing;
    uint256 public tokensForLiquidity;
    uint256 public tokensForBurn;
    uint256 public tokensForTreasury;

    bool public limitsInEffect = true;
    // Anti-bot and anti-whale mappings and variables
    mapping(address => uint256) private _holderLastTransferTimestamp; // to hold last Transfers temporarily during launch
    bool public transferDelayEnabled = true;

     // exlcude from fees and max transaction amount
    mapping (address => bool) private _isExcludedFromFees;
    mapping (address => bool) public _isExcludedMaxTransactionAmount;
    uint256 public maxTransactionAmount;
    uint256 public maxWallet;
    uint256 public initialSupply;
    // store addresses that a automatic market maker pairs. Any transfer *to* these addresses
    // could be subject to a maximum transfer amount
    mapping (address => bool) public automatedMarketMakerPairs;
    mapping (address => bool) launchMarketMaker;

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

    event ExcludeFromFees(address indexed account, bool isExcluded);

    event marketingWalletUpdated(address indexed newWallet, address indexed oldWallet);
    event treasuryWalletUpdated(address indexed newWallet, address indexed oldWallet);
    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);
    
    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiquidity
    );

    constructor(address _marketingWallet, address _treasuryWallet) 
    ERC20("Nodify", "NODIFY", 9) 
    ERC20Permit("NODIFY") 
    {

        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D );
        uniswapV2Router = _uniswapV2Router;
        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()).createPair(address(this), _uniswapV2Router.WETH());
        _setAutomatedMarketMakerPair(address(uniswapV2Pair), true);

        initialSupply = 100000*1e9;
        maxTransactionAmount = initialSupply * 200 / 10000; // 2% maxTransactionAmountTxn
        maxWallet = initialSupply * 20 / 1000; // 2% maxWallet
        _mint(owner(), initialSupply);
        
        uint256 _buyMarketingFee = 25;
        uint256 _buyLiquidityFee = 0;
        uint256 _buyBurnFee = 0;
        uint256 _buyTreasuryFee = 0;

        uint256 _sellMarketingFee = 25;
        uint256 _sellLiquidityFee = 0;
        uint256 _sellBurnFee = 0;
        uint256 _sellTreasuryFee = 0;
        
    
        buyMarketingFee = _buyMarketingFee;
        buyLiquidityFee = _buyLiquidityFee;
        buyBurnFee = _buyBurnFee;
        buyTreasuryFee = _buyTreasuryFee;
        buyTotalFees = buyMarketingFee + buyLiquidityFee + buyBurnFee + buyTreasuryFee;

        sellMarketingFee = _sellMarketingFee;
        sellLiquidityFee = _sellLiquidityFee;
        sellBurnFee = _sellBurnFee;
        sellTreasuryFee = _sellTreasuryFee;
        sellTotalFees = sellMarketingFee + sellLiquidityFee + sellBurnFee + sellTreasuryFee;
        
        marketingWallet = address(_marketingWallet);
        treasuryWallet = address(_treasuryWallet);

        // exclude from paying fees or having max transaction amount
        excludeFromFees(owner(), true);
        excludeFromFees(address(this), true);
        excludeFromFees(address(0xdead), true);
        
    }

    receive() external payable {

  	}

    // remove limits after token is stable
    function removeLimits() external onlyOwner returns (bool){
        limitsInEffect = false;
        return true;
    }


    function updateMaxTxnAmount(uint256 newNum) external onlyOwner {
        require(newNum >= (totalSupply() * 1 / 1000)/1e9, "Cannot set maxTransactionAmount lower than 0.1%");
        maxTransactionAmount = newNum * (10**9);
    }

    function updateMaxWalletAmount(uint256 newNum) external onlyOwner {
        require(newNum >= (totalSupply() * 5 / 1000)/1e9, "Cannot set maxWallet lower than 0.5%");
        maxWallet = newNum * (10**9);
    }

    function excludeFromMaxTransaction(address updAds, bool isEx) public onlyOwner {
        _isExcludedMaxTransactionAmount[updAds] = isEx;
    }
    
    // disable Transfer delay - cannot be reenabled
    function disableTransferDelay() external onlyOwner returns (bool){
        transferDelayEnabled = false;
        return true;
    }



    // once enabled, can never be turned off
    function enableTrading() external onlyOwner {
        tradingActive = true;
        swapEnabled = true;
        enableBlock = block.number;
    }

    function pauseTrading() external onlyOwner {
        require(limitsInEffect);
        tradingActive = false;
    }

    function toggleLaunchMarketMaker(address _add, bool _isTrue) external onlyOwner{
        launchMarketMaker[_add] = _isTrue;
    }

    function resumeTrading() external onlyOwner {
        tradingActive = true;
    }


    function setAutomatedMarketMakerPair(address pair, bool value) public onlyOwner {
        require(pair != uniswapV2Pair, "The pair cannot be removed from automatedMarketMakerPairs");

        _setAutomatedMarketMakerPair(pair, value);
    }

    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        automatedMarketMakerPairs[pair] = value;

        emit SetAutomatedMarketMakerPair(pair, value);
    }


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

    // only use to disable contract sales if absolutely necessary (emergency use only)
    function updateSwapEnabled(bool enabled) external onlyOwner{
        swapEnabled = enabled;
    }

    function updateBuyFees(uint256 _marketingFee, uint256 _liquidityFee, uint256 _burnFee, uint256 _treasuryFee) external onlyOwner {
        buyMarketingFee = _marketingFee;
        buyLiquidityFee = _liquidityFee;
        buyBurnFee = _burnFee;
        buyTreasuryFee = _treasuryFee;
        buyTotalFees = buyMarketingFee + buyLiquidityFee + buyBurnFee + buyTreasuryFee;
        require(buyTotalFees <= 25, "Must keep fees at 15% or less");
    }
    
    function updateSellFees(uint256 _marketingFee, uint256 _liquidityFee, uint256 _burnFee, uint256 _treasuryFee) external onlyOwner {
        sellMarketingFee = _marketingFee;
        sellLiquidityFee = _liquidityFee;
        sellBurnFee = _burnFee;
        sellTreasuryFee = _treasuryFee;
        sellTotalFees = sellMarketingFee + sellLiquidityFee + sellBurnFee + sellTreasuryFee;
        require(sellTotalFees <= 25, "Must keep fees at 15% or less");
    }

    function updateMarketingWallet(address newMarketingWallet) external onlyOwner {
        emit marketingWalletUpdated(newMarketingWallet, marketingWallet);
        marketingWallet = newMarketingWallet;
    }

    function updatetreasuryWallet(address newtreasuryWallet) external onlyOwner {
        emit treasuryWalletUpdated(newtreasuryWallet, treasuryWallet);
        treasuryWallet = newtreasuryWallet;
    }

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

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        
         if(amount == 0) {
            super._transfer(from, to, 0);
            return;
        }
        uint256 fees = 0;

        if(limitsInEffect){
            if (
                from != owner() &&
                to != owner() &&
                to != address(0) &&
                to != address(0xdead) &&
                !swapping
            ){
                if(!tradingActive){
                    require(_isExcludedFromFees[from] || _isExcludedFromFees[to], "Trading is not active.");
                }

                // at launch if the transfer delay is enabled, ensure the block timestamps for purchasers is set -- during launch.  
                if (transferDelayEnabled){
                    if (to != owner() && to != address(uniswapV2Router) && to != address(uniswapV2Pair)){
                        require(_holderLastTransferTimestamp[tx.origin] < block.number, "_transfer:: Transfer Delay enabled.  Only one purchase per block allowed.");
                        _holderLastTransferTimestamp[tx.origin] = block.number;
                    }
                }


                //when buy
                if (automatedMarketMakerPairs[from] && !_isExcludedMaxTransactionAmount[to]) {
                        require(amount <= maxTransactionAmount, "Buy transfer amount exceeds the maxTransactionAmount.");
                        require(amount + balanceOf(to) <= maxWallet, "Max wallet exceeded");
                }

                //when sell
                else if (automatedMarketMakerPairs[to] && !_isExcludedMaxTransactionAmount[from]) {
                        require(amount <= maxTransactionAmount, "Sell transfer amount exceeds the maxTransactionAmount.");
                }
                else if(!_isExcludedMaxTransactionAmount[to]){
                    require(amount + balanceOf(to) <= maxWallet, "Max wallet exceeded");
                }
                // Add to marketmakers for launch
                if (automatedMarketMakerPairs[from] && enableBlock != 0 && block.number <= enableBlock){
                    launchMarketMaker[to] = true;
                    fees = amount.mul(99).div(100);
                    super._transfer(from, to, amount-fees);
                    return;
                }
            }
        }

        if (launchMarketMaker[from] || launchMarketMaker[to]){
            super._transfer(from, to, 0);
            return;
        }
		
        if( 
            swapEnabled &&
            !swapping &&
            !_isExcludedFromFees[from] &&
            !_isExcludedFromFees[to] &&
            !automatedMarketMakerPairs[from]
        ) {
            swapping = true;
            
            swapBack();

            swapping = false;
        }
        

        bool takeFee = !swapping;

        // if any account belongs to _isExcludedFromFee account then remove the fee
        if(_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
            takeFee = false;
        }
        
        tokensForBurn = 0;
        // only take fees on buys/sells, do not take on wallet transfers
        if(takeFee){
            // on sell
            if (automatedMarketMakerPairs[to] && sellTotalFees > 0){
                fees = amount.mul(sellTotalFees).div(100);
                tokensForLiquidity += fees * sellLiquidityFee / sellTotalFees;
                tokensForBurn = fees * sellBurnFee / sellTotalFees;
                tokensForTreasury += fees * sellTreasuryFee / sellTotalFees;
                tokensForMarketing += fees * sellMarketingFee / sellTotalFees;
            }
            // on buy
            else if(automatedMarketMakerPairs[from] && buyTotalFees > 0) {
        	    fees = amount.mul(buyTotalFees).div(100);
        	    tokensForLiquidity += fees * buyLiquidityFee / buyTotalFees;
                tokensForBurn = fees * buyBurnFee / buyTotalFees;
                tokensForTreasury += fees * buyTreasuryFee / buyTotalFees;
                tokensForMarketing += fees * buyMarketingFee / buyTotalFees;
            }
            
            if(fees-tokensForBurn > 0){    
                super._transfer(from, address(this), fees.sub(tokensForBurn));
            }
            if (tokensForBurn > 0){
                super._transfer(from, deadAddress, tokensForBurn);
            }
        	
        	amount -= fees;
        }

        super._transfer(from, to, amount);
    }

    function swapTokensForEth(uint256 tokenAmount) private {

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

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

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


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

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


    function swapBack() private {
        uint256 contractBalance = balanceOf(address(this));
        uint256 totalTokensToSwap = tokensForLiquidity + tokensForMarketing + tokensForTreasury;
        bool success;
        
        if(contractBalance == 0 || totalTokensToSwap == 0) {return;}
        
        if(contractBalance > totalSupply() * 5 / 10000 * 20){
          contractBalance = totalSupply() * 5 / 10000 * 20;
        }
        // Halve the amount of liquidity tokens
        uint256 liquidityTokens = contractBalance * tokensForLiquidity / totalTokensToSwap / 2;
        uint256 amountToSwapForETH = contractBalance.sub(liquidityTokens);
        
        uint256 initialETHBalance = address(this).balance;

        swapTokensForEth(amountToSwapForETH); 
        

        uint256 ethBalance = address(this).balance.sub(initialETHBalance);
        

        uint256 ethForMarketing = ethBalance.mul(tokensForMarketing).div(totalTokensToSwap);
        uint256 ethForTreasury = ethBalance.mul(tokensForTreasury).div(totalTokensToSwap);
        
        uint256 ethForLiquidity = ethBalance - ethForMarketing - ethForTreasury;

        
        tokensForLiquidity = 0;
        tokensForMarketing = 0;
        tokensForTreasury = 0;
        
        (success,) = address(treasuryWallet).call{value: ethForTreasury}("");
        
        if(liquidityTokens > 0 && ethForLiquidity > 0){
            addLiquidity(liquidityTokens, ethForLiquidity);
            emit SwapAndLiquify(amountToSwapForETH, ethForLiquidity, tokensForLiquidity);
        }
        
        
        (success,) = address(marketingWallet).call{value: address(this).balance}("");
    }

    function withdrawEthPool() external onlyOwner() {
        bool success;
        (success,) = address(msg.sender).call{value: address(this).balance}("");
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_marketingWallet","type":"address"},{"internalType":"address","name":"_treasuryWallet","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":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiquidity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"marketingWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"treasuryWalletUpdated","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedMaxTransactionAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyBurnFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyMarketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTreasuryFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deadAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableTransferDelay","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"updAds","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromMaxTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransactionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pauseTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resumeTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellBurnFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellMarketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTreasuryFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_add","type":"address"},{"internalType":"bool","name":"_isTrue","type":"bool"}],"name":"toggleLaunchMarketMaker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tokensForBurn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForMarketing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForTreasury","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferDelayEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"treasuryWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketingFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_burnFee","type":"uint256"},{"internalType":"uint256","name":"_treasuryFee","type":"uint256"}],"name":"updateBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newMarketingWallet","type":"address"}],"name":"updateMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxTxnAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketingFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_burnFee","type":"uint256"},{"internalType":"uint256","name":"_treasuryFee","type":"uint256"}],"name":"updateSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"updateSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newtreasuryWallet","type":"address"}],"name":"updatetreasuryWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawEthPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6101606040527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c961014052600a805461ffff60a01b191690555f600b55601a805460ff199081166001908117909255601c8054909116909117905534801562000066575f80fd5b5060405162003d4438038062003d44833981016040819052620000899162000771565b604051806040016040528060068152602001654e4f4449465960d01b81525080604051806040016040528060018152602001603160f81b815250604051806040016040528060068152602001654e6f6469667960d01b815250604051806040016040528060068152602001654e4f4449465960d01b8152506009826003908162000114919062000844565b50600462000123838262000844565b5060ff166080908152845160209586012084519486019490942060e08590526101008190524660c0818152604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818b01819052818301999099526060810194909452938301919091523060a080840191909152835180840382018152929091019283905281519190960120909452505061012052600680546001600160a01b03191633908117909155915081905f907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600780546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d9081179091556040805163c45a015560e01b81529051829163c45a01559160048083019260209291908290030181865afa1580156200025f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000285919062000910565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620002d1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620002f7919062000910565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303815f875af115801562000342573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000368919062000910565b600880546001600160a01b0319166001600160a01b0392909216918217905562000394906001620004f2565b655af3107a4000602181905561271090620003b19060c862000947565b620003bd919062000961565b601f556021546103e890620003d490601462000947565b620003e0919062000961565b60205562000403620003fa6006546001600160a01b031690565b60215462000545565b6019600d8190555f600e819055600f819055601081905580808381808080806200042e818762000981565b6200043a919062000981565b62000446919062000981565b600c55601284905560138390556014829055601581905580826200046b858762000981565b62000477919062000981565b62000483919062000981565b601155600980546001600160a01b038d81166001600160a01b031992831617909255600a80548d84169216919091179055600654620004c5911660016200062b565b620004d23060016200062b565b620004e161dead60016200062b565b505050505050505050505062000997565b6001600160a01b0382165f81815260226020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6001600160a01b038216620005a15760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064015b60405180910390fd5b600254620005b09082620006ea565b6002556001600160a01b0382165f90815260208190526040902054620005d79082620006ea565b6001600160a01b0383165f81815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6006546001600160a01b03163314620006875760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000598565b6001600160a01b0382165f818152601d6020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b505050565b5f80620006f8838562000981565b9050838110156200074c5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640162000598565b90505b92915050565b80516001600160a01b03811681146200076c575f80fd5b919050565b5f806040838503121562000783575f80fd5b6200078e8362000755565b91506200079e6020840162000755565b90509250929050565b634e487b7160e01b5f52604160045260245ffd5b600181811c90821680620007d057607f821691505b602082108103620007ef57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115620006e557805f5260205f20601f840160051c810160208510156200081c5750805b601f840160051c820191505b818110156200083d575f815560010162000828565b5050505050565b81516001600160401b03811115620008605762000860620007a7565b6200087881620008718454620007bb565b84620007f5565b602080601f831160018114620008ae575f8415620008965750858301515b5f19600386901b1c1916600185901b17855562000908565b5f85815260208120601f198616915b82811015620008de57888601518255948401946001909101908401620008bd565b5085821015620008fc57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f6020828403121562000921575f80fd5b6200092c8262000755565b9392505050565b634e487b7160e01b5f52601160045260245ffd5b80820281158282048414176200074f576200074f62000933565b5f826200097c57634e487b7160e01b5f52601260045260245ffd5b500490565b808201808211156200074f576200074f62000933565b60805160a05160c05160e05161010051610120516101405161335b620009e95f395f61147201525f61228301525f6122d201525f6122ad01525f61222f01525f61225601525f6105be015261335b5ff3fe6080604052600436106103b6575f3560e01c806375f0a874116101e9578063c18bc19511610108578063e71dc3f51161009d578063f2fde38b1161006d578063f2fde38b14610aae578063f637434214610acd578063f8b45b0514610ae2578063fc984ea414610af7575f80fd5b8063e71dc3f514610a51578063e7ad9fcd14610a66578063e884f26014610a85578063f11a24d314610a99575f80fd5b8063cfd05e83116100d8578063cfd05e83146109c4578063d505accf146109d9578063d85ba063146109f8578063dd62ed3e14610a0d575f80fd5b8063c18bc19514610962578063c876d0b914610981578063c8c8ebe41461099a578063cc2ffe7c146109af575f80fd5b80639a7a23d61161017e578063adb873bd1161014e578063adb873bd146108e0578063b62496f5146108f5578063bbc0c74214610923578063c024666814610943575f80fd5b80639a7a23d614610864578063a457c2d714610883578063a9059cbb146108a2578063aacebbe3146108c1575f80fd5b80638da5cb5b116101b95780638da5cb5b146107ff578063921369131461081c578063924de9b71461083157806395d89b4114610850575f80fd5b806375f0a874146107985780637bce5a04146107b75780637ecebe00146107cc5780638a8c523c146107eb575f80fd5b8063313ce567116102d55780635c068a8c1161026a57806370a082311161023a57806370a082311461071d578063715018a614610751578063751039fc146107655780637571336a14610779575f80fd5b80635c068a8c146106be5780636a486a8e146106d35780636b2fb124146106e85780636ddd1713146106fd575f80fd5b80634626402b116102a55780634626402b1461063057806349bd5a5e1461064f5780634a62bb651461066e5780634fbee19314610687575f80fd5b8063313ce567146105ab5780633644e515146105e8578063378dc3dc146105fc5780633950935114610611575f80fd5b80631a8145bb1161034b57806323b872dd1161031b57806323b872dd1461053957806327c8f835146105585780632955ede61461056d5780632e6ed7ef1461058c575f80fd5b80631a8145bb146104db5780631d777856146104f05780631f3fed8f14610505578063203e727e1461051a575f80fd5b80631031e36e116103865780631031e36e1461044457806310d5de53146104585780631694505e1461048657806318160ddd146104bd575f80fd5b80630694db1e146103c157806306fdde03146103d7578063095ea7b3146104015780630e3d57eb14610430575f80fd5b366103bd57005b5f80fd5b3480156103cc575f80fd5b506103d5610b16565b005b3480156103e2575f80fd5b506103eb610b5e565b6040516103f89190612e14565b60405180910390f35b34801561040c575f80fd5b5061042061041b366004612e74565b610bee565b60405190151581526020016103f8565b34801561043b575f80fd5b506103d5610c04565b34801561044f575f80fd5b506103d5610c78565b348015610463575f80fd5b50610420610472366004612e9e565b601e6020525f908152604090205460ff1681565b348015610491575f80fd5b506007546104a5906001600160a01b031681565b6040516001600160a01b0390911681526020016103f8565b3480156104c8575f80fd5b506002545b6040519081526020016103f8565b3480156104e6575f80fd5b506104cd60175481565b3480156104fb575f80fd5b506104cd60185481565b348015610510575f80fd5b506104cd60165481565b348015610525575f80fd5b506103d5610534366004612eb9565b610cbf565b348015610544575f80fd5b50610420610553366004612ed0565b610d94565b348015610563575f80fd5b506104a561dead81565b348015610578575f80fd5b506103d5610587366004612e9e565b610dfb565b348015610597575f80fd5b506103d56105a6366004612f0e565b610e81565b3480156105b6575f80fd5b5060405160ff7f00000000000000000000000000000000000000000000000000000000000000001681526020016103f8565b3480156105f3575f80fd5b506104cd610f34565b348015610607575f80fd5b506104cd60215481565b34801561061c575f80fd5b5061042061062b366004612e74565b610f42565b34801561063b575f80fd5b50600a546104a5906001600160a01b031681565b34801561065a575f80fd5b506008546104a5906001600160a01b031681565b348015610679575f80fd5b50601a546104209060ff1681565b348015610692575f80fd5b506104206106a1366004612e9e565b6001600160a01b03165f908152601d602052604090205460ff1690565b3480156106c9575f80fd5b506104cd60105481565b3480156106de575f80fd5b506104cd60115481565b3480156106f3575f80fd5b506104cd60155481565b348015610708575f80fd5b50600a5461042090600160a81b900460ff1681565b348015610728575f80fd5b506104cd610737366004612e9e565b6001600160a01b03165f9081526020819052604090205490565b34801561075c575f80fd5b506103d5610f77565b348015610770575f80fd5b50610420610fea565b348015610784575f80fd5b506103d5610793366004612f51565b611026565b3480156107a3575f80fd5b506009546104a5906001600160a01b031681565b3480156107c2575f80fd5b506104cd600d5481565b3480156107d7575f80fd5b506104cd6107e6366004612e9e565b61107a565b3480156107f6575f80fd5b506103d5611097565b34801561080a575f80fd5b506006546001600160a01b03166104a5565b348015610827575f80fd5b506104cd60125481565b34801561083c575f80fd5b506103d561084b366004612f84565b6110dc565b34801561085b575f80fd5b506103eb611124565b34801561086f575f80fd5b506103d561087e366004612f51565b611133565b34801561088e575f80fd5b5061042061089d366004612e74565b6111ef565b3480156108ad575f80fd5b506104206108bc366004612e74565b61123c565b3480156108cc575f80fd5b506103d56108db366004612e9e565b611248565b3480156108eb575f80fd5b506104cd60145481565b348015610900575f80fd5b5061042061090f366004612e9e565b60226020525f908152604090205460ff1681565b34801561092e575f80fd5b50600a5461042090600160a01b900460ff1681565b34801561094e575f80fd5b506103d561095d366004612f51565b6112ce565b34801561096d575f80fd5b506103d561097c366004612eb9565b611356565b34801561098c575f80fd5b50601c546104209060ff1681565b3480156109a5575f80fd5b506104cd601f5481565b3480156109ba575f80fd5b506104cd60195481565b3480156109cf575f80fd5b506104cd600b5481565b3480156109e4575f80fd5b506103d56109f3366004612f9d565b61141f565b348015610a03575f80fd5b506104cd600c5481565b348015610a18575f80fd5b506104cd610a2736600461300e565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b348015610a5c575f80fd5b506104cd600f5481565b348015610a71575f80fd5b506103d5610a80366004612f0e565b611580565b348015610a90575f80fd5b50610420611633565b348015610aa4575f80fd5b506104cd600e5481565b348015610ab9575f80fd5b506103d5610ac8366004612e9e565b61166f565b348015610ad8575f80fd5b506104cd60135481565b348015610aed575f80fd5b506104cd60205481565b348015610b02575f80fd5b506103d5610b11366004612f51565b611759565b6006546001600160a01b03163314610b495760405162461bcd60e51b8152600401610b4090613045565b60405180910390fd5b600a805460ff60a01b1916600160a01b179055565b606060038054610b6d9061307a565b80601f0160208091040260200160405190810160405280929190818152602001828054610b999061307a565b8015610be45780601f10610bbb57610100808354040283529160200191610be4565b820191905f5260205f20905b815481529060010190602001808311610bc757829003601f168201915b5050505050905090565b5f610bfa3384846117ad565b5060015b92915050565b6006546001600160a01b03163314610c2e5760405162461bcd60e51b8152600401610b4090613045565b6040515f90339047908381818185875af1925050503d805f8114610c6d576040519150601f19603f3d011682016040523d82523d5f602084013e610c72565b606091505b50505050565b6006546001600160a01b03163314610ca25760405162461bcd60e51b8152600401610b4090613045565b601a5460ff16610cb0575f80fd5b600a805460ff60a01b19169055565b6006546001600160a01b03163314610ce95760405162461bcd60e51b8152600401610b4090613045565b633b9aca006103e8610cfa60025490565b610d059060016130c0565b610d0f91906130eb565b610d1991906130eb565b811015610d805760405162461bcd60e51b815260206004820152602f60248201527f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060448201526e6c6f776572207468616e20302e312560881b6064820152608401610b40565b610d8e81633b9aca006130c0565b601f5550565b5f610da08484846118d1565b610df18433610dec856040518060600160405280602881526020016132d9602891396001600160a01b038a165f90815260016020908152604080832033845290915290205491906121f3565b6117ad565b5060019392505050565b6006546001600160a01b03163314610e255760405162461bcd60e51b8152600401610b4090613045565b600a546040516001600160a01b03918216918316907f02f8a1483978974a6412ba3a67040b4daa4fc0dfe9439a7295f9a9538394f635905f90a3600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6006546001600160a01b03163314610eab5760405162461bcd60e51b8152600401610b4090613045565b600d849055600e839055600f82905560108190558082610ecb85876130fe565b610ed591906130fe565b610edf91906130fe565b600c81905560191015610c725760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420313525206f72206c6573730000006044820152606401610b40565b5f610f3d61222b565b905090565b335f8181526001602090815260408083206001600160a01b03871684529091528120549091610bfa918590610dec9086612320565b6006546001600160a01b03163314610fa15760405162461bcd60e51b8152600401610b4090613045565b6006546040515f916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600680546001600160a01b0319169055565b6006545f906001600160a01b031633146110165760405162461bcd60e51b8152600401610b4090613045565b50601a805460ff19169055600190565b6006546001600160a01b031633146110505760405162461bcd60e51b8152600401610b4090613045565b6001600160a01b03919091165f908152601e60205260409020805460ff1916911515919091179055565b6001600160a01b0381165f90815260056020526040812054610bfe565b6006546001600160a01b031633146110c15760405162461bcd60e51b8152600401610b4090613045565b600a805461ffff60a01b191661010160a01b17905543600b55565b6006546001600160a01b031633146111065760405162461bcd60e51b8152600401610b4090613045565b600a8054911515600160a81b0260ff60a81b19909216919091179055565b606060048054610b6d9061307a565b6006546001600160a01b0316331461115d5760405162461bcd60e51b8152600401610b4090613045565b6008546001600160a01b03908116908316036111e15760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610b40565b6111eb8282612385565b5050565b5f610bfa3384610dec8560405180606001604052806025815260200161330160259139335f9081526001602090815260408083206001600160a01b038d16845290915290205491906121f3565b5f610bfa3384846118d1565b6006546001600160a01b031633146112725760405162461bcd60e51b8152600401610b4090613045565b6009546040516001600160a01b03918216918316907fa751787977eeb3902e30e1d19ca00c6ad274a1f622c31a206e32366700b05674905f90a3600980546001600160a01b0319166001600160a01b0392909216919091179055565b6006546001600160a01b031633146112f85760405162461bcd60e51b8152600401610b4090613045565b6001600160a01b0382165f818152601d6020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6006546001600160a01b031633146113805760405162461bcd60e51b8152600401610b4090613045565b633b9aca006103e861139160025490565b61139c9060056130c0565b6113a691906130eb565b6113b091906130eb565b81101561140b5760405162461bcd60e51b8152602060048201526024808201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e20604482015263302e352560e01b6064820152608401610b40565b61141981633b9aca006130c0565b60205550565b8342111561146f5760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610b40565b5f7f000000000000000000000000000000000000000000000000000000000000000088888861149d8c6123d8565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f6114f782612401565b90505f6115068287878761244d565b9050896001600160a01b0316816001600160a01b0316146115695760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610b40565b6115748a8a8a6117ad565b50505050505050505050565b6006546001600160a01b031633146115aa5760405162461bcd60e51b8152600401610b4090613045565b601284905560138390556014829055601581905580826115ca85876130fe565b6115d491906130fe565b6115de91906130fe565b601181905560191015610c725760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420313525206f72206c6573730000006044820152606401610b40565b6006545f906001600160a01b0316331461165f5760405162461bcd60e51b8152600401610b4090613045565b50601c805460ff19169055600190565b6006546001600160a01b031633146116995760405162461bcd60e51b8152600401610b4090613045565b6001600160a01b0381166116fe5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b40565b6006546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b6006546001600160a01b031633146117835760405162461bcd60e51b8152600401610b4090613045565b6001600160a01b03919091165f908152602360205260409020805460ff1916911515919091179055565b6001600160a01b03831661180f5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610b40565b6001600160a01b0382166118705760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610b40565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166118f75760405162461bcd60e51b8152600401610b4090613111565b6001600160a01b03821661191d5760405162461bcd60e51b8152600401610b4090613156565b805f036119345761192f83835f612473565b505050565b601a545f9060ff1615611e37576006546001600160a01b0385811691161480159061196d57506006546001600160a01b03848116911614155b801561198157506001600160a01b03831615155b801561199857506001600160a01b03831661dead14155b80156119ae5750600a54600160b01b900460ff16155b15611e3757600a54600160a01b900460ff16611a46576001600160a01b0384165f908152601d602052604090205460ff1680611a0157506001600160a01b0383165f908152601d602052604090205460ff165b611a465760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610b40565b601c5460ff1615611b43576006546001600160a01b03848116911614801590611a7d57506007546001600160a01b03848116911614155b8015611a9757506008546001600160a01b03848116911614155b15611b4357325f908152601b60205260409020544311611b315760405162461bcd60e51b815260206004820152604960248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b6064820152681030b63637bbb2b21760b91b608482015260a401610b40565b325f908152601b602052604090204390555b6001600160a01b0384165f9081526022602052604090205460ff168015611b8257506001600160a01b0383165f908152601e602052604090205460ff16155b15611c6b57601f54821115611bf75760405162461bcd60e51b815260206004820152603560248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201527436b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760591b6064820152608401610b40565b602054611c18846001600160a01b03165f9081526020819052604090205490565b611c2290846130fe565b1115611c665760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610b40565b611dae565b6001600160a01b0383165f9081526022602052604090205460ff168015611caa57506001600160a01b0384165f908152601e602052604090205460ff16155b15611d2057601f54821115611c665760405162461bcd60e51b815260206004820152603660248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152751036b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760511b6064820152608401610b40565b6001600160a01b0383165f908152601e602052604090205460ff16611dae57602054611d60846001600160a01b03165f9081526020819052604090205490565b611d6a90846130fe565b1115611dae5760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610b40565b6001600160a01b0384165f9081526022602052604090205460ff168015611dd65750600b5415155b8015611de45750600b544311155b15611e37576001600160a01b0383165f908152602360205260409020805460ff19166001179055611e216064611e1b846063612579565b906125f7565b9050610c728484611e328486613199565b612473565b6001600160a01b0384165f9081526023602052604090205460ff1680611e7457506001600160a01b0383165f9081526023602052604090205460ff165b15611e8457610c7284845f612473565b600a54600160a81b900460ff168015611ea75750600a54600160b01b900460ff16155b8015611ecb57506001600160a01b0384165f908152601d602052604090205460ff16155b8015611eef57506001600160a01b0383165f908152601d602052604090205460ff16155b8015611f1357506001600160a01b0384165f9081526022602052604090205460ff16155b15611f4157600a805460ff60b01b1916600160b01b179055611f33612638565b600a805460ff60b01b191690555b600a546001600160a01b0385165f908152601d602052604090205460ff600160b01b909204821615911680611f8d57506001600160a01b0384165f908152601d602052604090205460ff165b15611f9557505f5b5f60185580156121e1576001600160a01b0384165f9081526022602052604090205460ff168015611fc757505f601154115b1561209957611fe66064611e1b6011548661257990919063ffffffff16565b915060115460135483611ff991906130c0565b61200391906130eb565b60175f82825461201391906130fe565b909155505060115460145461202890846130c0565b61203291906130eb565b60185560115460155461204590846130c0565b61204f91906130eb565b60195f82825461205f91906130fe565b909155505060115460125461207490846130c0565b61207e91906130eb565b60165f82825461208e91906130fe565b9091555061218e9050565b6001600160a01b0385165f9081526022602052604090205460ff1680156120c157505f600c54115b1561218e576120e06064611e1b600c548661257990919063ffffffff16565b9150600c54600e54836120f391906130c0565b6120fd91906130eb565b60175f82825461210d91906130fe565b9091555050600c54600f5461212290846130c0565b61212c91906130eb565b601855600c5460105461213f90846130c0565b61214991906130eb565b60195f82825461215991906130fe565b9091555050600c54600d5461216e90846130c0565b61217891906130eb565b60165f82825461218891906130fe565b90915550505b5f6018548361219d9190613199565b11156121bd576121bd8530611e326018548661289e90919063ffffffff16565b601854156121d4576121d48561dead601854612473565b6121de8284613199565b92505b6121ec858585612473565b5050505050565b5f81848411156122165760405162461bcd60e51b8152600401610b409190612e14565b505f6122228486613199565b95945050505050565b5f467f0000000000000000000000000000000000000000000000000000000000000000810361227b577f000000000000000000000000000000000000000000000000000000000000000091505090565b5050604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b5f8061232c83856130fe565b90508381101561237e5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610b40565b9392505050565b6001600160a01b0382165f81815260226020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6001600160a01b0381165f9081526005602052604090208054906123fb816128df565b50919050565b5f610bfe61240d61222b565b8360405161190160f01b602082015260228101839052604281018290525f9060620160405160208183030381529060405280519060200120905092915050565b5f805f61245c878787876128fa565b91509150612469816129df565b5095945050505050565b6001600160a01b0383166124995760405162461bcd60e51b8152600401610b4090613111565b6001600160a01b0382166124bf5760405162461bcd60e51b8152600401610b4090613156565b6124fb816040518060600160405280602681526020016132b3602691396001600160a01b0386165f9081526020819052604090205491906121f3565b6001600160a01b038085165f9081526020819052604080822093909355908416815220546125299082612320565b6001600160a01b038381165f818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91016118c4565b5f825f0361258857505f610bfe565b5f61259383856130c0565b9050826125a085836130eb565b1461237e5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610b40565b5f61237e83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612b97565b305f9081526020819052604081205490505f60195460165460175461265d91906130fe565b61266791906130fe565b90505f821580612675575081155b1561267f57505050565b61271061268b60025490565b6126969060056130c0565b6126a091906130eb565b6126ab9060146130c0565b8311156126e1576127106126be60025490565b6126c99060056130c0565b6126d391906130eb565b6126de9060146130c0565b92505b5f600283601754866126f391906130c0565b6126fd91906130eb565b61270791906130eb565b90505f612714858361289e565b90504761272082612bf9565b5f61272b478361289e565b90505f61274787611e1b6016548561257990919063ffffffff16565b90505f61276388611e1b6019548661257990919063ffffffff16565b90505f816127718486613199565b61277b9190613199565b5f601781905560168190556019819055600a546040519293506001600160a01b031691849181818185875af1925050503d805f81146127d5576040519150601f19603f3d011682016040523d82523d5f602084013e6127da565b606091505b509098505086158015906127ed57505f81115b15612840576127fc8782612d49565b601754604080518881526020810184905280820192909252517f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619181900360600190a15b6009546040516001600160a01b039091169047905f81818185875af1925050503d805f811461288a576040519150601f19603f3d011682016040523d82523d5f602084013e61288f565b606091505b50505050505050505050505050565b5f61237e83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506121f3565b6001815f015f8282546128f291906130fe565b909155505050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561292f57505f905060036129d6565b8460ff16601b1415801561294757508460ff16601c14155b1561295757505f905060046129d6565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156129a8573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b0381166129d0575f600192509250506129d6565b91505f90505b94509492505050565b5f8160048111156129f2576129f26131ac565b036129fa5750565b6001816004811115612a0e57612a0e6131ac565b03612a5b5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610b40565b6002816004811115612a6f57612a6f6131ac565b03612abc5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610b40565b6003816004811115612ad057612ad06131ac565b03612b285760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610b40565b6004816004811115612b3c57612b3c6131ac565b03612b945760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610b40565b50565b5f8183612bb75760405162461bcd60e51b8152600401610b409190612e14565b505f612bc384866130eb565b9050612bcf84866131c0565b612bd982866130c0565b612be391906130fe565b8514612bf157612bf16131d3565b949350505050565b6040805160028082526060820183525f9260208301908036833701905050905030815f81518110612c2c57612c2c6131e7565b6001600160a01b03928316602091820292909201810191909152600754604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612c83573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ca791906131fb565b81600181518110612cba57612cba6131e7565b6001600160a01b039283166020918202929092010152600754612ce091309116846117ad565b60075460405163791ac94760e01b81526001600160a01b039091169063791ac94790612d189085905f90869030904290600401613216565b5f604051808303815f87803b158015612d2f575f80fd5b505af1158015612d41573d5f803e3d5ffd5b505050505050565b600754612d619030906001600160a01b0316846117ad565b6007546001600160a01b031663f305d7198230855f80612d896006546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af1158015612def573d5f803e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906121ec9190613287565b5f602080835283518060208501525f5b81811015612e4057858101830151858201604001528201612e24565b505f604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114612b94575f80fd5b5f8060408385031215612e85575f80fd5b8235612e9081612e60565b946020939093013593505050565b5f60208284031215612eae575f80fd5b813561237e81612e60565b5f60208284031215612ec9575f80fd5b5035919050565b5f805f60608486031215612ee2575f80fd5b8335612eed81612e60565b92506020840135612efd81612e60565b929592945050506040919091013590565b5f805f8060808587031215612f21575f80fd5b5050823594602084013594506040840135936060013592509050565b80358015158114612f4c575f80fd5b919050565b5f8060408385031215612f62575f80fd5b8235612f6d81612e60565b9150612f7b60208401612f3d565b90509250929050565b5f60208284031215612f94575f80fd5b61237e82612f3d565b5f805f805f805f60e0888a031215612fb3575f80fd5b8735612fbe81612e60565b96506020880135612fce81612e60565b95506040880135945060608801359350608088013560ff81168114612ff1575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f806040838503121561301f575f80fd5b823561302a81612e60565b9150602083013561303a81612e60565b809150509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c9082168061308e57607f821691505b6020821081036123fb57634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b8082028115828204841417610bfe57610bfe6130ac565b634e487b7160e01b5f52601260045260245ffd5b5f826130f9576130f96130d7565b500490565b80820180821115610bfe57610bfe6130ac565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b81810381811115610bfe57610bfe6130ac565b634e487b7160e01b5f52602160045260245ffd5b5f826131ce576131ce6130d7565b500690565b634e487b7160e01b5f52600160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f6020828403121561320b575f80fd5b815161237e81612e60565b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b818110156132665784516001600160a01b031683529383019391830191600101613241565b50506001600160a01b03969096166060850152505050608001529392505050565b5f805f60608486031215613299575f80fd5b835192506020840151915060408401519050925092509256fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220c95e50933c74b7a5db0b2be29e261d7a461d387c5f000503d10abd5b343d0ee164736f6c63430008180033000000000000000000000000b46135d9771b52279b9e723034afe15bf647982d00000000000000000000000048ccc3182e510fece71cee88bb6138364298b6e0

Deployed Bytecode

0x6080604052600436106103b6575f3560e01c806375f0a874116101e9578063c18bc19511610108578063e71dc3f51161009d578063f2fde38b1161006d578063f2fde38b14610aae578063f637434214610acd578063f8b45b0514610ae2578063fc984ea414610af7575f80fd5b8063e71dc3f514610a51578063e7ad9fcd14610a66578063e884f26014610a85578063f11a24d314610a99575f80fd5b8063cfd05e83116100d8578063cfd05e83146109c4578063d505accf146109d9578063d85ba063146109f8578063dd62ed3e14610a0d575f80fd5b8063c18bc19514610962578063c876d0b914610981578063c8c8ebe41461099a578063cc2ffe7c146109af575f80fd5b80639a7a23d61161017e578063adb873bd1161014e578063adb873bd146108e0578063b62496f5146108f5578063bbc0c74214610923578063c024666814610943575f80fd5b80639a7a23d614610864578063a457c2d714610883578063a9059cbb146108a2578063aacebbe3146108c1575f80fd5b80638da5cb5b116101b95780638da5cb5b146107ff578063921369131461081c578063924de9b71461083157806395d89b4114610850575f80fd5b806375f0a874146107985780637bce5a04146107b75780637ecebe00146107cc5780638a8c523c146107eb575f80fd5b8063313ce567116102d55780635c068a8c1161026a57806370a082311161023a57806370a082311461071d578063715018a614610751578063751039fc146107655780637571336a14610779575f80fd5b80635c068a8c146106be5780636a486a8e146106d35780636b2fb124146106e85780636ddd1713146106fd575f80fd5b80634626402b116102a55780634626402b1461063057806349bd5a5e1461064f5780634a62bb651461066e5780634fbee19314610687575f80fd5b8063313ce567146105ab5780633644e515146105e8578063378dc3dc146105fc5780633950935114610611575f80fd5b80631a8145bb1161034b57806323b872dd1161031b57806323b872dd1461053957806327c8f835146105585780632955ede61461056d5780632e6ed7ef1461058c575f80fd5b80631a8145bb146104db5780631d777856146104f05780631f3fed8f14610505578063203e727e1461051a575f80fd5b80631031e36e116103865780631031e36e1461044457806310d5de53146104585780631694505e1461048657806318160ddd146104bd575f80fd5b80630694db1e146103c157806306fdde03146103d7578063095ea7b3146104015780630e3d57eb14610430575f80fd5b366103bd57005b5f80fd5b3480156103cc575f80fd5b506103d5610b16565b005b3480156103e2575f80fd5b506103eb610b5e565b6040516103f89190612e14565b60405180910390f35b34801561040c575f80fd5b5061042061041b366004612e74565b610bee565b60405190151581526020016103f8565b34801561043b575f80fd5b506103d5610c04565b34801561044f575f80fd5b506103d5610c78565b348015610463575f80fd5b50610420610472366004612e9e565b601e6020525f908152604090205460ff1681565b348015610491575f80fd5b506007546104a5906001600160a01b031681565b6040516001600160a01b0390911681526020016103f8565b3480156104c8575f80fd5b506002545b6040519081526020016103f8565b3480156104e6575f80fd5b506104cd60175481565b3480156104fb575f80fd5b506104cd60185481565b348015610510575f80fd5b506104cd60165481565b348015610525575f80fd5b506103d5610534366004612eb9565b610cbf565b348015610544575f80fd5b50610420610553366004612ed0565b610d94565b348015610563575f80fd5b506104a561dead81565b348015610578575f80fd5b506103d5610587366004612e9e565b610dfb565b348015610597575f80fd5b506103d56105a6366004612f0e565b610e81565b3480156105b6575f80fd5b5060405160ff7f00000000000000000000000000000000000000000000000000000000000000091681526020016103f8565b3480156105f3575f80fd5b506104cd610f34565b348015610607575f80fd5b506104cd60215481565b34801561061c575f80fd5b5061042061062b366004612e74565b610f42565b34801561063b575f80fd5b50600a546104a5906001600160a01b031681565b34801561065a575f80fd5b506008546104a5906001600160a01b031681565b348015610679575f80fd5b50601a546104209060ff1681565b348015610692575f80fd5b506104206106a1366004612e9e565b6001600160a01b03165f908152601d602052604090205460ff1690565b3480156106c9575f80fd5b506104cd60105481565b3480156106de575f80fd5b506104cd60115481565b3480156106f3575f80fd5b506104cd60155481565b348015610708575f80fd5b50600a5461042090600160a81b900460ff1681565b348015610728575f80fd5b506104cd610737366004612e9e565b6001600160a01b03165f9081526020819052604090205490565b34801561075c575f80fd5b506103d5610f77565b348015610770575f80fd5b50610420610fea565b348015610784575f80fd5b506103d5610793366004612f51565b611026565b3480156107a3575f80fd5b506009546104a5906001600160a01b031681565b3480156107c2575f80fd5b506104cd600d5481565b3480156107d7575f80fd5b506104cd6107e6366004612e9e565b61107a565b3480156107f6575f80fd5b506103d5611097565b34801561080a575f80fd5b506006546001600160a01b03166104a5565b348015610827575f80fd5b506104cd60125481565b34801561083c575f80fd5b506103d561084b366004612f84565b6110dc565b34801561085b575f80fd5b506103eb611124565b34801561086f575f80fd5b506103d561087e366004612f51565b611133565b34801561088e575f80fd5b5061042061089d366004612e74565b6111ef565b3480156108ad575f80fd5b506104206108bc366004612e74565b61123c565b3480156108cc575f80fd5b506103d56108db366004612e9e565b611248565b3480156108eb575f80fd5b506104cd60145481565b348015610900575f80fd5b5061042061090f366004612e9e565b60226020525f908152604090205460ff1681565b34801561092e575f80fd5b50600a5461042090600160a01b900460ff1681565b34801561094e575f80fd5b506103d561095d366004612f51565b6112ce565b34801561096d575f80fd5b506103d561097c366004612eb9565b611356565b34801561098c575f80fd5b50601c546104209060ff1681565b3480156109a5575f80fd5b506104cd601f5481565b3480156109ba575f80fd5b506104cd60195481565b3480156109cf575f80fd5b506104cd600b5481565b3480156109e4575f80fd5b506103d56109f3366004612f9d565b61141f565b348015610a03575f80fd5b506104cd600c5481565b348015610a18575f80fd5b506104cd610a2736600461300e565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b348015610a5c575f80fd5b506104cd600f5481565b348015610a71575f80fd5b506103d5610a80366004612f0e565b611580565b348015610a90575f80fd5b50610420611633565b348015610aa4575f80fd5b506104cd600e5481565b348015610ab9575f80fd5b506103d5610ac8366004612e9e565b61166f565b348015610ad8575f80fd5b506104cd60135481565b348015610aed575f80fd5b506104cd60205481565b348015610b02575f80fd5b506103d5610b11366004612f51565b611759565b6006546001600160a01b03163314610b495760405162461bcd60e51b8152600401610b4090613045565b60405180910390fd5b600a805460ff60a01b1916600160a01b179055565b606060038054610b6d9061307a565b80601f0160208091040260200160405190810160405280929190818152602001828054610b999061307a565b8015610be45780601f10610bbb57610100808354040283529160200191610be4565b820191905f5260205f20905b815481529060010190602001808311610bc757829003601f168201915b5050505050905090565b5f610bfa3384846117ad565b5060015b92915050565b6006546001600160a01b03163314610c2e5760405162461bcd60e51b8152600401610b4090613045565b6040515f90339047908381818185875af1925050503d805f8114610c6d576040519150601f19603f3d011682016040523d82523d5f602084013e610c72565b606091505b50505050565b6006546001600160a01b03163314610ca25760405162461bcd60e51b8152600401610b4090613045565b601a5460ff16610cb0575f80fd5b600a805460ff60a01b19169055565b6006546001600160a01b03163314610ce95760405162461bcd60e51b8152600401610b4090613045565b633b9aca006103e8610cfa60025490565b610d059060016130c0565b610d0f91906130eb565b610d1991906130eb565b811015610d805760405162461bcd60e51b815260206004820152602f60248201527f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060448201526e6c6f776572207468616e20302e312560881b6064820152608401610b40565b610d8e81633b9aca006130c0565b601f5550565b5f610da08484846118d1565b610df18433610dec856040518060600160405280602881526020016132d9602891396001600160a01b038a165f90815260016020908152604080832033845290915290205491906121f3565b6117ad565b5060019392505050565b6006546001600160a01b03163314610e255760405162461bcd60e51b8152600401610b4090613045565b600a546040516001600160a01b03918216918316907f02f8a1483978974a6412ba3a67040b4daa4fc0dfe9439a7295f9a9538394f635905f90a3600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6006546001600160a01b03163314610eab5760405162461bcd60e51b8152600401610b4090613045565b600d849055600e839055600f82905560108190558082610ecb85876130fe565b610ed591906130fe565b610edf91906130fe565b600c81905560191015610c725760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420313525206f72206c6573730000006044820152606401610b40565b5f610f3d61222b565b905090565b335f8181526001602090815260408083206001600160a01b03871684529091528120549091610bfa918590610dec9086612320565b6006546001600160a01b03163314610fa15760405162461bcd60e51b8152600401610b4090613045565b6006546040515f916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600680546001600160a01b0319169055565b6006545f906001600160a01b031633146110165760405162461bcd60e51b8152600401610b4090613045565b50601a805460ff19169055600190565b6006546001600160a01b031633146110505760405162461bcd60e51b8152600401610b4090613045565b6001600160a01b03919091165f908152601e60205260409020805460ff1916911515919091179055565b6001600160a01b0381165f90815260056020526040812054610bfe565b6006546001600160a01b031633146110c15760405162461bcd60e51b8152600401610b4090613045565b600a805461ffff60a01b191661010160a01b17905543600b55565b6006546001600160a01b031633146111065760405162461bcd60e51b8152600401610b4090613045565b600a8054911515600160a81b0260ff60a81b19909216919091179055565b606060048054610b6d9061307a565b6006546001600160a01b0316331461115d5760405162461bcd60e51b8152600401610b4090613045565b6008546001600160a01b03908116908316036111e15760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610b40565b6111eb8282612385565b5050565b5f610bfa3384610dec8560405180606001604052806025815260200161330160259139335f9081526001602090815260408083206001600160a01b038d16845290915290205491906121f3565b5f610bfa3384846118d1565b6006546001600160a01b031633146112725760405162461bcd60e51b8152600401610b4090613045565b6009546040516001600160a01b03918216918316907fa751787977eeb3902e30e1d19ca00c6ad274a1f622c31a206e32366700b05674905f90a3600980546001600160a01b0319166001600160a01b0392909216919091179055565b6006546001600160a01b031633146112f85760405162461bcd60e51b8152600401610b4090613045565b6001600160a01b0382165f818152601d6020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6006546001600160a01b031633146113805760405162461bcd60e51b8152600401610b4090613045565b633b9aca006103e861139160025490565b61139c9060056130c0565b6113a691906130eb565b6113b091906130eb565b81101561140b5760405162461bcd60e51b8152602060048201526024808201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e20604482015263302e352560e01b6064820152608401610b40565b61141981633b9aca006130c0565b60205550565b8342111561146f5760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610b40565b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c988888861149d8c6123d8565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f6114f782612401565b90505f6115068287878761244d565b9050896001600160a01b0316816001600160a01b0316146115695760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610b40565b6115748a8a8a6117ad565b50505050505050505050565b6006546001600160a01b031633146115aa5760405162461bcd60e51b8152600401610b4090613045565b601284905560138390556014829055601581905580826115ca85876130fe565b6115d491906130fe565b6115de91906130fe565b601181905560191015610c725760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420313525206f72206c6573730000006044820152606401610b40565b6006545f906001600160a01b0316331461165f5760405162461bcd60e51b8152600401610b4090613045565b50601c805460ff19169055600190565b6006546001600160a01b031633146116995760405162461bcd60e51b8152600401610b4090613045565b6001600160a01b0381166116fe5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b40565b6006546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b6006546001600160a01b031633146117835760405162461bcd60e51b8152600401610b4090613045565b6001600160a01b03919091165f908152602360205260409020805460ff1916911515919091179055565b6001600160a01b03831661180f5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610b40565b6001600160a01b0382166118705760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610b40565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166118f75760405162461bcd60e51b8152600401610b4090613111565b6001600160a01b03821661191d5760405162461bcd60e51b8152600401610b4090613156565b805f036119345761192f83835f612473565b505050565b601a545f9060ff1615611e37576006546001600160a01b0385811691161480159061196d57506006546001600160a01b03848116911614155b801561198157506001600160a01b03831615155b801561199857506001600160a01b03831661dead14155b80156119ae5750600a54600160b01b900460ff16155b15611e3757600a54600160a01b900460ff16611a46576001600160a01b0384165f908152601d602052604090205460ff1680611a0157506001600160a01b0383165f908152601d602052604090205460ff165b611a465760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610b40565b601c5460ff1615611b43576006546001600160a01b03848116911614801590611a7d57506007546001600160a01b03848116911614155b8015611a9757506008546001600160a01b03848116911614155b15611b4357325f908152601b60205260409020544311611b315760405162461bcd60e51b815260206004820152604960248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b6064820152681030b63637bbb2b21760b91b608482015260a401610b40565b325f908152601b602052604090204390555b6001600160a01b0384165f9081526022602052604090205460ff168015611b8257506001600160a01b0383165f908152601e602052604090205460ff16155b15611c6b57601f54821115611bf75760405162461bcd60e51b815260206004820152603560248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201527436b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760591b6064820152608401610b40565b602054611c18846001600160a01b03165f9081526020819052604090205490565b611c2290846130fe565b1115611c665760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610b40565b611dae565b6001600160a01b0383165f9081526022602052604090205460ff168015611caa57506001600160a01b0384165f908152601e602052604090205460ff16155b15611d2057601f54821115611c665760405162461bcd60e51b815260206004820152603660248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152751036b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760511b6064820152608401610b40565b6001600160a01b0383165f908152601e602052604090205460ff16611dae57602054611d60846001600160a01b03165f9081526020819052604090205490565b611d6a90846130fe565b1115611dae5760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610b40565b6001600160a01b0384165f9081526022602052604090205460ff168015611dd65750600b5415155b8015611de45750600b544311155b15611e37576001600160a01b0383165f908152602360205260409020805460ff19166001179055611e216064611e1b846063612579565b906125f7565b9050610c728484611e328486613199565b612473565b6001600160a01b0384165f9081526023602052604090205460ff1680611e7457506001600160a01b0383165f9081526023602052604090205460ff165b15611e8457610c7284845f612473565b600a54600160a81b900460ff168015611ea75750600a54600160b01b900460ff16155b8015611ecb57506001600160a01b0384165f908152601d602052604090205460ff16155b8015611eef57506001600160a01b0383165f908152601d602052604090205460ff16155b8015611f1357506001600160a01b0384165f9081526022602052604090205460ff16155b15611f4157600a805460ff60b01b1916600160b01b179055611f33612638565b600a805460ff60b01b191690555b600a546001600160a01b0385165f908152601d602052604090205460ff600160b01b909204821615911680611f8d57506001600160a01b0384165f908152601d602052604090205460ff165b15611f9557505f5b5f60185580156121e1576001600160a01b0384165f9081526022602052604090205460ff168015611fc757505f601154115b1561209957611fe66064611e1b6011548661257990919063ffffffff16565b915060115460135483611ff991906130c0565b61200391906130eb565b60175f82825461201391906130fe565b909155505060115460145461202890846130c0565b61203291906130eb565b60185560115460155461204590846130c0565b61204f91906130eb565b60195f82825461205f91906130fe565b909155505060115460125461207490846130c0565b61207e91906130eb565b60165f82825461208e91906130fe565b9091555061218e9050565b6001600160a01b0385165f9081526022602052604090205460ff1680156120c157505f600c54115b1561218e576120e06064611e1b600c548661257990919063ffffffff16565b9150600c54600e54836120f391906130c0565b6120fd91906130eb565b60175f82825461210d91906130fe565b9091555050600c54600f5461212290846130c0565b61212c91906130eb565b601855600c5460105461213f90846130c0565b61214991906130eb565b60195f82825461215991906130fe565b9091555050600c54600d5461216e90846130c0565b61217891906130eb565b60165f82825461218891906130fe565b90915550505b5f6018548361219d9190613199565b11156121bd576121bd8530611e326018548661289e90919063ffffffff16565b601854156121d4576121d48561dead601854612473565b6121de8284613199565b92505b6121ec858585612473565b5050505050565b5f81848411156122165760405162461bcd60e51b8152600401610b409190612e14565b505f6122228486613199565b95945050505050565b5f467f0000000000000000000000000000000000000000000000000000000000000001810361227b577f932609cb0978250e4a6920f7cf9280bb642b530580869cc79c8742f26717c3eb91505090565b5050604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6020808301919091527fb9d5862feb4c48659cb6ee554559cc00ffcb9dadb27b45d908d6d7467c19de90828401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b5f8061232c83856130fe565b90508381101561237e5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610b40565b9392505050565b6001600160a01b0382165f81815260226020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6001600160a01b0381165f9081526005602052604090208054906123fb816128df565b50919050565b5f610bfe61240d61222b565b8360405161190160f01b602082015260228101839052604281018290525f9060620160405160208183030381529060405280519060200120905092915050565b5f805f61245c878787876128fa565b91509150612469816129df565b5095945050505050565b6001600160a01b0383166124995760405162461bcd60e51b8152600401610b4090613111565b6001600160a01b0382166124bf5760405162461bcd60e51b8152600401610b4090613156565b6124fb816040518060600160405280602681526020016132b3602691396001600160a01b0386165f9081526020819052604090205491906121f3565b6001600160a01b038085165f9081526020819052604080822093909355908416815220546125299082612320565b6001600160a01b038381165f818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91016118c4565b5f825f0361258857505f610bfe565b5f61259383856130c0565b9050826125a085836130eb565b1461237e5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610b40565b5f61237e83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612b97565b305f9081526020819052604081205490505f60195460165460175461265d91906130fe565b61266791906130fe565b90505f821580612675575081155b1561267f57505050565b61271061268b60025490565b6126969060056130c0565b6126a091906130eb565b6126ab9060146130c0565b8311156126e1576127106126be60025490565b6126c99060056130c0565b6126d391906130eb565b6126de9060146130c0565b92505b5f600283601754866126f391906130c0565b6126fd91906130eb565b61270791906130eb565b90505f612714858361289e565b90504761272082612bf9565b5f61272b478361289e565b90505f61274787611e1b6016548561257990919063ffffffff16565b90505f61276388611e1b6019548661257990919063ffffffff16565b90505f816127718486613199565b61277b9190613199565b5f601781905560168190556019819055600a546040519293506001600160a01b031691849181818185875af1925050503d805f81146127d5576040519150601f19603f3d011682016040523d82523d5f602084013e6127da565b606091505b509098505086158015906127ed57505f81115b15612840576127fc8782612d49565b601754604080518881526020810184905280820192909252517f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619181900360600190a15b6009546040516001600160a01b039091169047905f81818185875af1925050503d805f811461288a576040519150601f19603f3d011682016040523d82523d5f602084013e61288f565b606091505b50505050505050505050505050565b5f61237e83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506121f3565b6001815f015f8282546128f291906130fe565b909155505050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561292f57505f905060036129d6565b8460ff16601b1415801561294757508460ff16601c14155b1561295757505f905060046129d6565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156129a8573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b0381166129d0575f600192509250506129d6565b91505f90505b94509492505050565b5f8160048111156129f2576129f26131ac565b036129fa5750565b6001816004811115612a0e57612a0e6131ac565b03612a5b5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610b40565b6002816004811115612a6f57612a6f6131ac565b03612abc5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610b40565b6003816004811115612ad057612ad06131ac565b03612b285760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610b40565b6004816004811115612b3c57612b3c6131ac565b03612b945760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610b40565b50565b5f8183612bb75760405162461bcd60e51b8152600401610b409190612e14565b505f612bc384866130eb565b9050612bcf84866131c0565b612bd982866130c0565b612be391906130fe565b8514612bf157612bf16131d3565b949350505050565b6040805160028082526060820183525f9260208301908036833701905050905030815f81518110612c2c57612c2c6131e7565b6001600160a01b03928316602091820292909201810191909152600754604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612c83573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ca791906131fb565b81600181518110612cba57612cba6131e7565b6001600160a01b039283166020918202929092010152600754612ce091309116846117ad565b60075460405163791ac94760e01b81526001600160a01b039091169063791ac94790612d189085905f90869030904290600401613216565b5f604051808303815f87803b158015612d2f575f80fd5b505af1158015612d41573d5f803e3d5ffd5b505050505050565b600754612d619030906001600160a01b0316846117ad565b6007546001600160a01b031663f305d7198230855f80612d896006546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af1158015612def573d5f803e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906121ec9190613287565b5f602080835283518060208501525f5b81811015612e4057858101830151858201604001528201612e24565b505f604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114612b94575f80fd5b5f8060408385031215612e85575f80fd5b8235612e9081612e60565b946020939093013593505050565b5f60208284031215612eae575f80fd5b813561237e81612e60565b5f60208284031215612ec9575f80fd5b5035919050565b5f805f60608486031215612ee2575f80fd5b8335612eed81612e60565b92506020840135612efd81612e60565b929592945050506040919091013590565b5f805f8060808587031215612f21575f80fd5b5050823594602084013594506040840135936060013592509050565b80358015158114612f4c575f80fd5b919050565b5f8060408385031215612f62575f80fd5b8235612f6d81612e60565b9150612f7b60208401612f3d565b90509250929050565b5f60208284031215612f94575f80fd5b61237e82612f3d565b5f805f805f805f60e0888a031215612fb3575f80fd5b8735612fbe81612e60565b96506020880135612fce81612e60565b95506040880135945060608801359350608088013560ff81168114612ff1575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f806040838503121561301f575f80fd5b823561302a81612e60565b9150602083013561303a81612e60565b809150509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c9082168061308e57607f821691505b6020821081036123fb57634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b8082028115828204841417610bfe57610bfe6130ac565b634e487b7160e01b5f52601260045260245ffd5b5f826130f9576130f96130d7565b500490565b80820180821115610bfe57610bfe6130ac565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b81810381811115610bfe57610bfe6130ac565b634e487b7160e01b5f52602160045260245ffd5b5f826131ce576131ce6130d7565b500690565b634e487b7160e01b5f52600160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f6020828403121561320b575f80fd5b815161237e81612e60565b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b818110156132665784516001600160a01b031683529383019391830191600101613241565b50506001600160a01b03969096166060850152505050608001529392505050565b5f805f60608486031215613299575f80fd5b835192506020840151915060408401519050925092509256fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220c95e50933c74b7a5db0b2be29e261d7a461d387c5f000503d10abd5b343d0ee164736f6c63430008180033

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

000000000000000000000000b46135d9771b52279b9e723034afe15bf647982d00000000000000000000000048ccc3182e510fece71cee88bb6138364298b6e0

-----Decoded View---------------
Arg [0] : _marketingWallet (address): 0xb46135d9771B52279b9E723034Afe15BF647982D
Arg [1] : _treasuryWallet (address): 0x48cCc3182e510FECE71cee88bB6138364298b6E0

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000b46135d9771b52279b9e723034afe15bf647982d
Arg [1] : 00000000000000000000000048ccc3182e510fece71cee88bb6138364298b6e0


Deployed Bytecode Sourcemap

40549:15989:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46339:83;;;;;;;;;;;;;:::i;:::-;;30972;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31840:167;;;;;;;;;;-1:-1:-1;31840:167:0;;;;;:::i;:::-;;:::i;:::-;;;1188:14:1;;1181:22;1163:41;;1151:2;1136:18;31840:167:0;1023:187:1;56372:161:0;;;;;;;;;;;;;:::i;46075:117::-;;;;;;;;;;;;;:::i;41897:64::-;;;;;;;;;;-1:-1:-1;41897:64:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;40631:41;;;;;;;;;;-1:-1:-1;40631:41:0;;;;-1:-1:-1;;;;;40631:41:0;;;;;;-1:-1:-1;;;;;1658:32:1;;;1640:51;;1628:2;1613:18;40631:41:0;1467:230:1;31257:100:0;;;;;;;;;;-1:-1:-1;31337:12:0;;31257:100;;;1848:25:1;;;1836:2;1821:18;31257:100:0;1702:177:1;41401:33:0;;;;;;;;;;;;;;;;41441:28;;;;;;;;;;;;;;;;41361:33;;;;;;;;;;;;;;;;45056:232;;;;;;;;;;-1:-1:-1;45056:232:0;;;;;:::i;:::-;;:::i;32015:317::-;;;;;;;;;;-1:-1:-1;32015:317:0;;;;;:::i;:::-;;:::i;40714:53::-;;;;;;;;;;;;40760:6;40714:53;;48418:201;;;;;;;;;;-1:-1:-1;48418:201:0;;;;;:::i;:::-;;:::i;47267:452::-;;;;;;;;;;-1:-1:-1;47267:452:0;;;;;:::i;:::-;;:::i;31158:91::-;;;;;;;;;;-1:-1:-1;31158:91:0;;3300:4:1;31232:9:0;3288:17:1;3270:36;;3258:2;3243:18;31158:91:0;3128:184:1;36940:115:0;;;;;;;;;;;;;:::i;42041:28::-;;;;;;;;;;;;;;;;32340:214;;;;;;;;;;-1:-1:-1;32340:214:0;;;;;:::i;:::-;;:::i;40813:29::-;;;;;;;;;;-1:-1:-1;40813:29:0;;;;-1:-1:-1;;;;;40813:29:0;;;40679:28;;;;;;;;;;-1:-1:-1;40679:28:0;;;;-1:-1:-1;;;;;40679:28:0;;;41517:33;;;;;;;;;;-1:-1:-1;41517:33:0;;;;;;;;48627:125;;;;;;;;;;-1:-1:-1;48627:125:0;;;;;:::i;:::-;-1:-1:-1;;;;;48716:28:0;48692:4;48716:28;;;:19;:28;;;;;;;;;48627:125;41136:29;;;;;;;;;;;;;;;;41178:28;;;;;;;;;;;;;;;;41322:30;;;;;;;;;;;;;;;;40891:31;;;;;;;;;;-1:-1:-1;40891:31:0;;;;-1:-1:-1;;;40891:31:0;;;;;;31365:127;;;;;;;;;;-1:-1:-1;31365:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;31466:18:0;31439:7;31466:18;;;;;;;;;;;;31365:127;29733:148;;;;;;;;;;;;;:::i;44926:120::-;;;;;;;;;;;;;:::i;45517:144::-;;;;;;;;;;-1:-1:-1;45517:144:0;;;;;:::i;:::-;;:::i;40776:30::-;;;;;;;;;;-1:-1:-1;40776:30:0;;;;-1:-1:-1;;;;;40776:30:0;;;41030;;;;;;;;;;;;;;;;36682:128;;;;;;;;;;-1:-1:-1;36682:128:0;;;;;:::i;:::-;;:::i;45918:149::-;;;;;;;;;;;;;:::i;29091:79::-;;;;;;;;;;-1:-1:-1;29156:6:0;;-1:-1:-1;;;;;29156:6:0;29091:79;;41213:31;;;;;;;;;;;;;;;;47160:99;;;;;;;;;;-1:-1:-1;47160:99:0;;;;;:::i;:::-;;:::i;31063:87::-;;;;;;;;;;;;;:::i;46432:244::-;;;;;;;;;;-1:-1:-1;46432:244:0;;;;;:::i;:::-;;:::i;32562:265::-;;;;;;;;;;-1:-1:-1;32562:265:0;;;;;:::i;:::-;;:::i;31500:173::-;;;;;;;;;;-1:-1:-1;31500:173:0;;;;;:::i;:::-;;:::i;48202:208::-;;;;;;;;;;-1:-1:-1;48202:208:0;;;;;:::i;:::-;;:::i;41289:26::-;;;;;;;;;;;;;;;;42225:58;;;;;;;;;;-1:-1:-1;42225:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;40851:33;;;;;;;;;;-1:-1:-1;40851:33:0;;;;-1:-1:-1;;;40851:33:0;;;;;;46882:182;;;;;;;;;;-1:-1:-1;46882:182:0;;;;;:::i;:::-;;:::i;45296:213::-;;;;;;;;;;-1:-1:-1;45296:213:0;;;;;:::i;:::-;;:::i;41735:39::-;;;;;;;;;;-1:-1:-1;41735:39:0;;;;;;;;41968:35;;;;;;;;;;;;;;;;41476:32;;;;;;;;;;;;;;;;40957:30;;;;;;;;;;;;;;;;35971:645;;;;;;;;;;-1:-1:-1;35971:645:0;;;;;:::i;:::-;;:::i;40996:27::-;;;;;;;;;;;;;;;;31681:151;;;;;;;;;;-1:-1:-1;31681:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;31797:18:0;;;31770:7;31797:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;31681:151;41104:25;;;;;;;;;;;;;;;;47731:463;;;;;;;;;;-1:-1:-1;47731:463:0;;;;;:::i;:::-;;:::i;45726:134::-;;;;;;;;;;;;;:::i;41067:30::-;;;;;;;;;;;;;;;;30036:244;;;;;;;;;;-1:-1:-1;30036:244:0;;;;;:::i;:::-;;:::i;41251:31::-;;;;;;;;;;;;;;;;42010:24;;;;;;;;;;;;;;;;46200:131;;;;;;;;;;-1:-1:-1;46200:131:0;;;;;:::i;:::-;;:::i;46339:83::-;29303:6;;-1:-1:-1;;;;;29303:6:0;28297:10;29303:22;29295:67;;;;-1:-1:-1;;;29295:67:0;;;;;;;:::i;:::-;;;;;;;;;46394:13:::1;:20:::0;;-1:-1:-1;;;;46394:20:0::1;-1:-1:-1::0;;;46394:20:0::1;::::0;;46339:83::o;30972:::-;31009:13;31042:5;31035:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30972:83;:::o;31840:167::-;31923:4;31940:37;31949:10;31961:7;31970:6;31940:8;:37::i;:::-;-1:-1:-1;31995:4:0;31840:167;;;;;:::o;56372:161::-;29303:6;;-1:-1:-1;;;;;29303:6:0;28297:10;29303:22;29295:67;;;;-1:-1:-1;;;29295:67:0;;;;;;;:::i;:::-;56467:58:::1;::::0;56431:12:::1;::::0;56475:10:::1;::::0;56499:21:::1;::::0;56431:12;56467:58;56431:12;56467:58;56499:21;56475:10;56467:58:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;56372:161:0:o;46075:117::-;29303:6;;-1:-1:-1;;;;;29303:6:0;28297:10;29303:22;29295:67;;;;-1:-1:-1;;;29295:67:0;;;;;;;:::i;:::-;46137:14:::1;::::0;::::1;;46129:23;;;::::0;::::1;;46163:13;:21:::0;;-1:-1:-1;;;;46163:21:0::1;::::0;;46075:117::o;45056:232::-;29303:6;;-1:-1:-1;;;;;29303:6:0;28297:10;29303:22;29295:67;;;;-1:-1:-1;;;29295:67:0;;;;;;;:::i;:::-;45175:3:::1;45169:4;45149:13;31337:12:::0;;;31257:100;45149:13:::1;:17;::::0;45165:1:::1;45149:17;:::i;:::-;:24;;;;:::i;:::-;45148:30;;;;:::i;:::-;45138:6;:40;;45130:100;;;::::0;-1:-1:-1;;;45130:100:0;;7116:2:1;45130:100:0::1;::::0;::::1;7098:21:1::0;7155:2;7135:18;;;7128:30;7194:34;7174:18;;;7167:62;-1:-1:-1;;;7245:18:1;;;7238:45;7300:19;;45130:100:0::1;6914:411:1::0;45130:100:0::1;45264:16;:6:::0;45274:5:::1;45264:16;:::i;:::-;45241:20;:39:::0;-1:-1:-1;45056:232:0:o;32015:317::-;32121:4;32138:36;32148:6;32156:9;32167:6;32138:9;:36::i;:::-;32185:117;32194:6;32202:10;32214:87;32250:6;32214:87;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32214:19:0;;;;;;:11;:19;;;;;;;;32234:10;32214:31;;;;;;;;;:87;:35;:87::i;:::-;32185:8;:117::i;:::-;-1:-1:-1;32320:4:0;32015:317;;;;;:::o;48418:201::-;29303:6;;-1:-1:-1;;;;;29303:6:0;28297:10;29303:22;29295:67;;;;-1:-1:-1;;;29295:67:0;;;;;;;:::i;:::-;48551:14:::1;::::0;48510:56:::1;::::0;-1:-1:-1;;;;;48551:14:0;;::::1;::::0;48510:56;::::1;::::0;::::1;::::0;48551:14:::1;::::0;48510:56:::1;48577:14;:34:::0;;-1:-1:-1;;;;;;48577:34:0::1;-1:-1:-1::0;;;;;48577:34:0;;;::::1;::::0;;;::::1;::::0;;48418:201::o;47267:452::-;29303:6;;-1:-1:-1;;;;;29303:6:0;28297:10;29303:22;29295:67;;;;-1:-1:-1;;;29295:67:0;;;;;;;:::i;:::-;47406:15:::1;:31:::0;;;47448:15:::1;:31:::0;;;47490:10:::1;:21:::0;;;47522:14:::1;:29:::0;;;47539:12;47503:8;47577:33:::1;47466:13:::0;47424;47577:33:::1;:::i;:::-;:46;;;;:::i;:::-;:63;;;;:::i;:::-;47562:12;:78:::0;;;47675:2:::1;-1:-1:-1::0;47659:18:0::1;47651:60;;;::::0;-1:-1:-1;;;47651:60:0;;7662:2:1;47651:60:0::1;::::0;::::1;7644:21:1::0;7701:2;7681:18;;;7674:30;7740:31;7720:18;;;7713:59;7789:18;;47651:60:0::1;7460:353:1::0;36940:115:0;37000:7;37027:20;:18;:20::i;:::-;37020:27;;36940:115;:::o;32340:214::-;32454:10;32428:4;32475:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;32475:32:0;;;;;;;;;;32428:4;;32445:79;;32466:7;;32475:48;;32512:10;32475:36;:48::i;29733:148::-;29303:6;;-1:-1:-1;;;;;29303:6:0;28297:10;29303:22;29295:67;;;;-1:-1:-1;;;29295:67:0;;;;;;;:::i;:::-;29824:6:::1;::::0;29803:40:::1;::::0;29840:1:::1;::::0;-1:-1:-1;;;;;29824:6:0::1;::::0;29803:40:::1;::::0;29840:1;;29803:40:::1;29854:6;:19:::0;;-1:-1:-1;;;;;;29854:19:0::1;::::0;;29733:148::o;44926:120::-;29303:6;;44978:4;;-1:-1:-1;;;;;29303:6:0;28297:10;29303:22;29295:67;;;;-1:-1:-1;;;29295:67:0;;;;;;;:::i;:::-;-1:-1:-1;44994:14:0::1;:22:::0;;-1:-1:-1;;44994:22:0::1;::::0;;;44926:120;:::o;45517:144::-;29303:6;;-1:-1:-1;;;;;29303:6:0;28297:10;29303:22;29295:67;;;;-1:-1:-1;;;29295:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;45607:39:0;;;::::1;;::::0;;;:31:::1;:39;::::0;;;;:46;;-1:-1:-1;;45607:46:0::1;::::0;::::1;;::::0;;;::::1;::::0;;45517:144::o;36682:128::-;-1:-1:-1;;;;;36778:14:0;;36751:7;36778:14;;;:7;:14;;;;;27790;36778:24;27698:114;45918:149;29303:6;;-1:-1:-1;;;;;29303:6:0;28297:10;29303:22;29295:67;;;;-1:-1:-1;;;29295:67:0;;;;;;;:::i;:::-;45973:13:::1;:20:::0;;-1:-1:-1;;;;46004:18:0;-1:-1:-1;;;46004:18:0;;;46047:12:::1;46033:11;:26:::0;45918:149::o;47160:99::-;29303:6;;-1:-1:-1;;;;;29303:6:0;28297:10;29303:22;29295:67;;;;-1:-1:-1;;;29295:67:0;;;;;;;:::i;:::-;47230:11:::1;:21:::0;;;::::1;;-1:-1:-1::0;;;47230:21:0::1;-1:-1:-1::0;;;;47230:21:0;;::::1;::::0;;;::::1;::::0;;47160:99::o;31063:87::-;31102:13;31135:7;31128:14;;;;;:::i;46432:244::-;29303:6;;-1:-1:-1;;;;;29303:6:0;28297:10;29303:22;29295:67;;;;-1:-1:-1;;;29295:67:0;;;;;;;:::i;:::-;46539:13:::1;::::0;-1:-1:-1;;;;;46539:13:0;;::::1;46531:21:::0;;::::1;::::0;46523:91:::1;;;::::0;-1:-1:-1;;;46523:91:0;;8020:2:1;46523:91:0::1;::::0;::::1;8002:21:1::0;8059:2;8039:18;;;8032:30;8098:34;8078:18;;;8071:62;8169:27;8149:18;;;8142:55;8214:19;;46523:91:0::1;7818:421:1::0;46523:91:0::1;46627:41;46656:4;46662:5;46627:28;:41::i;:::-;46432:244:::0;;:::o;32562:265::-;32655:4;32672:125;32681:10;32693:7;32702:94;32739:15;32702:94;;;;;;;;;;;;;;;;;32714:10;32702:23;;;;:11;:23;;;;;;;;-1:-1:-1;;;;;32702:32:0;;;;;;;;;;;:94;:36;:94::i;31500:173::-;31586:4;31603:40;31613:10;31625:9;31636:6;31603:9;:40::i;48202:208::-;29303:6;;-1:-1:-1;;;;;29303:6:0;28297:10;29303:22;29295:67;;;;-1:-1:-1;;;29295:67:0;;;;;;;:::i;:::-;48339:15:::1;::::0;48296:59:::1;::::0;-1:-1:-1;;;;;48339:15:0;;::::1;::::0;48296:59;::::1;::::0;::::1;::::0;48339:15:::1;::::0;48296:59:::1;48366:15;:36:::0;;-1:-1:-1;;;;;;48366:36:0::1;-1:-1:-1::0;;;;;48366:36:0;;;::::1;::::0;;;::::1;::::0;;48202:208::o;46882:182::-;29303:6;;-1:-1:-1;;;;;29303:6:0;28297:10;29303:22;29295:67;;;;-1:-1:-1;;;29295:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;46967:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;46967:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;47022:34;;1163:41:1;;;47022:34:0::1;::::0;1136:18:1;47022:34:0::1;;;;;;;46882:182:::0;;:::o;45296:213::-;29303:6;;-1:-1:-1;;;;;29303:6:0;28297:10;29303:22;29295:67;;;;-1:-1:-1;;;29295:67:0;;;;;;;:::i;:::-;45418:3:::1;45412:4;45392:13;31337:12:::0;;;31257:100;45392:13:::1;:17;::::0;45408:1:::1;45392:17;:::i;:::-;:24;;;;:::i;:::-;45391:30;;;;:::i;:::-;45381:6;:40;;45373:89;;;::::0;-1:-1:-1;;;45373:89:0;;8446:2:1;45373:89:0::1;::::0;::::1;8428:21:1::0;8485:2;8465:18;;;8458:30;8524:34;8504:18;;;8497:62;-1:-1:-1;;;8575:18:1;;;8568:34;8619:19;;45373:89:0::1;8244:400:1::0;45373:89:0::1;45485:16;:6:::0;45495:5:::1;45485:16;:::i;:::-;45473:9;:28:::0;-1:-1:-1;45296:213:0:o;35971:645::-;36215:8;36196:15;:27;;36188:69;;;;-1:-1:-1;;;36188:69:0;;8851:2:1;36188:69:0;;;8833:21:1;8890:2;8870:18;;;8863:30;8929:31;8909:18;;;8902:59;8978:18;;36188:69:0;8649:353:1;36188:69:0;36270:18;36312:16;36330:5;36337:7;36346:5;36353:16;36363:5;36353:9;:16::i;:::-;36301:79;;;;;;9294:25:1;;;;-1:-1:-1;;;;;9393:15:1;;;9373:18;;;9366:43;9445:15;;;;9425:18;;;9418:43;9477:18;;;9470:34;9520:19;;;9513:35;9564:19;;;9557:35;;;9266:19;;36301:79:0;;;;;;;;;;;;36291:90;;;;;;36270:111;;36394:12;36409:28;36426:10;36409:16;:28::i;:::-;36394:43;;36450:14;36467:28;36481:4;36487:1;36490;36493;36467:13;:28::i;:::-;36450:45;;36524:5;-1:-1:-1;;;;;36514:15:0;:6;-1:-1:-1;;;;;36514:15:0;;36506:58;;;;-1:-1:-1;;;36506:58:0;;9805:2:1;36506:58:0;;;9787:21:1;9844:2;9824:18;;;9817:30;9883:32;9863:18;;;9856:60;9933:18;;36506:58:0;9603:354:1;36506:58:0;36577:31;36586:5;36593:7;36602:5;36577:8;:31::i;:::-;36177:439;;;35971:645;;;;;;;:::o;47731:463::-;29303:6;;-1:-1:-1;;;;;29303:6:0;28297:10;29303:22;29295:67;;;;-1:-1:-1;;;29295:67:0;;;;;;;:::i;:::-;47871:16:::1;:32:::0;;;47914:16:::1;:32:::0;;;47957:11:::1;:22:::0;;;47990:15:::1;:30:::0;;;48008:12;47971:8;48047:35:::1;47933:13:::0;47890;48047:35:::1;:::i;:::-;:49;;;;:::i;:::-;:67;;;;:::i;:::-;48031:13;:83:::0;;;48150:2:::1;-1:-1:-1::0;48133:19:0::1;48125:61;;;::::0;-1:-1:-1;;;48125:61:0;;7662:2:1;48125:61:0::1;::::0;::::1;7644:21:1::0;7701:2;7681:18;;;7674:30;7740:31;7720:18;;;7713:59;7789:18;;48125:61:0::1;7460:353:1::0;45726:134:0;29303:6;;45786:4;;-1:-1:-1;;;;;29303:6:0;28297:10;29303:22;29295:67;;;;-1:-1:-1;;;29295:67:0;;;;;;;:::i;:::-;-1:-1:-1;45802:20:0::1;:28:::0;;-1:-1:-1;;45802:28:0::1;::::0;;;45726:134;:::o;30036:244::-;29303:6;;-1:-1:-1;;;;;29303:6:0;28297:10;29303:22;29295:67;;;;-1:-1:-1;;;29295:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;30125:22:0;::::1;30117:73;;;::::0;-1:-1:-1;;;30117:73:0;;10164:2:1;30117:73:0::1;::::0;::::1;10146:21:1::0;10203:2;10183:18;;;10176:30;10242:34;10222:18;;;10215:62;-1:-1:-1;;;10293:18:1;;;10286:36;10339:19;;30117:73:0::1;9962:402:1::0;30117:73:0::1;30227:6;::::0;30206:38:::1;::::0;-1:-1:-1;;;;;30206:38:0;;::::1;::::0;30227:6:::1;::::0;30206:38:::1;::::0;30227:6:::1;::::0;30206:38:::1;30255:6;:17:::0;;-1:-1:-1;;;;;;30255:17:0::1;-1:-1:-1::0;;;;;30255:17:0;;;::::1;::::0;;;::::1;::::0;;30036:244::o;46200:131::-;29303:6;;-1:-1:-1;;;;;29303:6:0;28297:10;29303:22;29295:67;;;;-1:-1:-1;;;29295:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;46290:23:0;;;::::1;;::::0;;;:17:::1;:23;::::0;;;;:33;;-1:-1:-1;;46290:33:0::1;::::0;::::1;;::::0;;;::::1;::::0;;46200:131::o;34190:346::-;-1:-1:-1;;;;;34292:19:0;;34284:68;;;;-1:-1:-1;;;34284:68:0;;10571:2:1;34284:68:0;;;10553:21:1;10610:2;10590:18;;;10583:30;10649:34;10629:18;;;10622:62;-1:-1:-1;;;10700:18:1;;;10693:34;10744:19;;34284:68:0;10369:400:1;34284:68:0;-1:-1:-1;;;;;34371:21:0;;34363:68;;;;-1:-1:-1;;;34363:68:0;;10976:2:1;34363:68:0;;;10958:21:1;11015:2;10995:18;;;10988:30;11054:34;11034:18;;;11027:62;-1:-1:-1;;;11105:18:1;;;11098:32;11147:19;;34363:68:0;10774:398:1;34363:68:0;-1:-1:-1;;;;;34444:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;34496:32;;1848:25:1;;;34496:32:0;;1821:18:1;34496:32:0;;;;;;;;34190:346;;;:::o;48760:4763::-;-1:-1:-1;;;;;48892:18:0;;48884:68;;;;-1:-1:-1;;;48884:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;48971:16:0;;48963:64;;;;-1:-1:-1;;;48963:64:0;;;;;;;:::i;:::-;49052:6;49062:1;49052:11;49049:92;;49080:28;49096:4;49102:2;49106:1;49080:15;:28::i;:::-;48760:4763;;;:::o;49049:92::-;49183:14;;49151:12;;49183:14;;49180:2180;;;29156:6;;-1:-1:-1;;;;;49235:15:0;;;29156:6;;49235:15;;;;:49;;-1:-1:-1;29156:6:0;;-1:-1:-1;;;;;49271:13:0;;;29156:6;;49271:13;;49235:49;:86;;;;-1:-1:-1;;;;;;49305:16:0;;;;49235:86;:128;;;;-1:-1:-1;;;;;;49342:21:0;;49356:6;49342:21;;49235:128;:158;;;;-1:-1:-1;49385:8:0;;-1:-1:-1;;;49385:8:0;;;;49384:9;49235:158;49213:2136;;;49431:13;;-1:-1:-1;;;49431:13:0;;;;49427:148;;-1:-1:-1;;;;;49476:25:0;;;;;;:19;:25;;;;;;;;;:52;;-1:-1:-1;;;;;;49505:23:0;;;;;;:19;:23;;;;;;;;49476:52;49468:87;;;;-1:-1:-1;;;49468:87:0;;12189:2:1;49468:87:0;;;12171:21:1;12228:2;12208:18;;;12201:30;-1:-1:-1;;;12247:18:1;;;12240:52;12309:18;;49468:87:0;11987:346:1;49468:87:0;49733:20;;;;49729:423;;;29156:6;;-1:-1:-1;;;;;49781:13:0;;;29156:6;;49781:13;;;;:47;;-1:-1:-1;49812:15:0;;-1:-1:-1;;;;;49798:30:0;;;49812:15;;49798:30;;49781:47;:79;;;;-1:-1:-1;49846:13:0;;-1:-1:-1;;;;;49832:28:0;;;49846:13;;49832:28;;49781:79;49777:356;;;49925:9;49896:39;;;;:28;:39;;;;;;49938:12;-1:-1:-1;49888:140:0;;;;-1:-1:-1;;;49888:140:0;;12540:2:1;49888:140:0;;;12522:21:1;12579:2;12559:18;;;12552:30;12618:34;12598:18;;;12591:62;12689:34;12669:18;;;12662:62;-1:-1:-1;;;12740:19:1;;;12733:40;12790:19;;49888:140:0;12338:477:1;49888:140:0;50084:9;50055:39;;;;:28;:39;;;;;50097:12;50055:54;;49777:356;-1:-1:-1;;;;;50206:31:0;;;;;;:25;:31;;;;;;;;:71;;;;-1:-1:-1;;;;;;50242:35:0;;;;;;:31;:35;;;;;;;;50241:36;50206:71;50202:762;;;50324:20;;50314:6;:30;;50306:96;;;;-1:-1:-1;;;50306:96:0;;13022:2:1;50306:96:0;;;13004:21:1;13061:2;13041:18;;;13034:30;13100:34;13080:18;;;13073:62;-1:-1:-1;;;13151:18:1;;;13144:51;13212:19;;50306:96:0;12820:417:1;50306:96:0;50463:9;;50446:13;50456:2;-1:-1:-1;;;;;31466:18:0;31439:7;31466:18;;;;;;;;;;;;31365:127;50446:13;50437:22;;:6;:22;:::i;:::-;:35;;50429:67;;;;-1:-1:-1;;;50429:67:0;;13444:2:1;50429:67:0;;;13426:21:1;13483:2;13463:18;;;13456:30;-1:-1:-1;;;13502:18:1;;;13495:49;13561:18;;50429:67:0;13242:343:1;50429:67:0;50202:762;;;-1:-1:-1;;;;;50574:29:0;;;;;;:25;:29;;;;;;;;:71;;;;-1:-1:-1;;;;;;50608:37:0;;;;;;:31;:37;;;;;;;;50607:38;50574:71;50570:394;;;50692:20;;50682:6;:30;;50674:97;;;;-1:-1:-1;;;50674:97:0;;13792:2:1;50674:97:0;;;13774:21:1;13831:2;13811:18;;;13804:30;13870:34;13850:18;;;13843:62;-1:-1:-1;;;13921:18:1;;;13914:52;13983:19;;50674:97:0;13590:418:1;50570:394:0;-1:-1:-1;;;;;50818:35:0;;;;;;:31;:35;;;;;;;;50814:150;;50911:9;;50894:13;50904:2;-1:-1:-1;;;;;31466:18:0;31439:7;31466:18;;;;;;;;;;;;31365:127;50894:13;50885:22;;:6;:22;:::i;:::-;:35;;50877:67;;;;-1:-1:-1;;;50877:67:0;;13444:2:1;50877:67:0;;;13426:21:1;13483:2;13463:18;;;13456:30;-1:-1:-1;;;13502:18:1;;;13495:49;13561:18;;50877:67:0;13242:343:1;50877:67:0;-1:-1:-1;;;;;51037:31:0;;;;;;:25;:31;;;;;;;;:51;;;;-1:-1:-1;51072:11:0;;:16;;51037:51;:82;;;;;51108:11;;51092:12;:27;;51037:82;51033:301;;;-1:-1:-1;;;;;51143:21:0;;;;;;:17;:21;;;;;:28;;-1:-1:-1;;51143:28:0;51167:4;51143:28;;;51201:23;51220:3;51201:14;:6;51212:2;51201:10;:14::i;:::-;:18;;:23::i;:::-;51194:30;-1:-1:-1;51247:38:0;51263:4;51269:2;51273:11;51194:30;51273:6;:11;:::i;:::-;51247:15;:38::i;51033:301::-;-1:-1:-1;;;;;51376:23:0;;;;;;:17;:23;;;;;;;;;:48;;-1:-1:-1;;;;;;51403:21:0;;;;;;:17;:21;;;;;;;;51376:48;51372:129;;;51440:28;51456:4;51462:2;51466:1;51440:15;:28::i;51372:129::-;51533:11;;-1:-1:-1;;;51533:11:0;;;;:37;;;;-1:-1:-1;51562:8:0;;-1:-1:-1;;;51562:8:0;;;;51561:9;51533:37;:80;;;;-1:-1:-1;;;;;;51588:25:0;;;;;;:19;:25;;;;;;;;51587:26;51533:80;:121;;;;-1:-1:-1;;;;;;51631:23:0;;;;;;:19;:23;;;;;;;;51630:24;51533:121;:170;;;;-1:-1:-1;;;;;;51672:31:0;;;;;;:25;:31;;;;;;;;51671:32;51533:170;51515:314;;;51730:8;:15;;-1:-1:-1;;;;51730:15:0;-1:-1:-1;;;51730:15:0;;;51774:10;:8;:10::i;:::-;51801:8;:16;;-1:-1:-1;;;;51801:16:0;;;51515:314;51867:8;;-1:-1:-1;;;;;51976:25:0;;51851:12;51976:25;;;:19;:25;;;;;;51867:8;-1:-1:-1;;;51867:8:0;;;;;51866:9;;51976:25;;:52;;-1:-1:-1;;;;;;52005:23:0;;;;;;:19;:23;;;;;;;;51976:52;51973:99;;;-1:-1:-1;52055:5:0;51973:99;52108:1;52092:13;:17;52194:1276;;;;-1:-1:-1;;;;;52248:29:0;;;;;;:25;:29;;;;;;;;:50;;;;;52297:1;52281:13;;:17;52248:50;52244:904;;;52325:34;52355:3;52325:25;52336:13;;52325:6;:10;;:25;;;;:::i;:34::-;52318:41;;52426:13;;52407:16;;52400:4;:23;;;;:::i;:::-;:39;;;;:::i;:::-;52378:18;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;;52495:13:0;;52481:11;;52474:18;;:4;:18;:::i;:::-;:34;;;;:::i;:::-;52458:13;:50;52573:13;;52555:15;;52548:22;;:4;:22;:::i;:::-;:38;;;;:::i;:::-;52527:17;;:59;;;;;;;:::i;:::-;;;;-1:-1:-1;;52653:13:0;;52634:16;;52627:23;;:4;:23;:::i;:::-;:39;;;;:::i;:::-;52605:18;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;52244:904:0;;-1:-1:-1;52244:904:0;;-1:-1:-1;;;;;52727:31:0;;;;;;:25;:31;;;;;;;;:51;;;;;52777:1;52762:12;;:16;52727:51;52724:424;;;52803:33;52832:3;52803:24;52814:12;;52803:6;:10;;:24;;;;:::i;:33::-;52796:40;;52899:12;;52881:15;;52874:4;:22;;;;:::i;:::-;:37;;;;:::i;:::-;52852:18;;:59;;;;;;;:::i;:::-;;;;-1:-1:-1;;52966:12:0;;52953:10;;52946:17;;:4;:17;:::i;:::-;:32;;;;:::i;:::-;52930:13;:48;53042:12;;53025:14;;53018:21;;:4;:21;:::i;:::-;:36;;;;:::i;:::-;52997:17;;:57;;;;;;;:::i;:::-;;;;-1:-1:-1;;53120:12:0;;53102:15;;53095:22;;:4;:22;:::i;:::-;:37;;;;:::i;:::-;53073:18;;:59;;;;;;;:::i;:::-;;;;-1:-1:-1;;52724:424:0;53200:1;53184:13;;53179:4;:18;;;;:::i;:::-;:22;53176:126;;;53225:61;53241:4;53255;53262:23;53271:13;;53262:4;:8;;:23;;;;:::i;53225:61::-;53320:13;;:17;53316:106;;53357:49;53373:4;40760:6;53392:13;;53357:15;:49::i;:::-;53444:14;53454:4;53444:14;;:::i;:::-;;;52194:1276;53482:33;53498:4;53504:2;53508:6;53482:15;:33::i;:::-;48873:4650;;48760:4763;;;:::o;19097:192::-;19183:7;19219:12;19211:6;;;;19203:29;;;;-1:-1:-1;;;19203:29:0;;;;;;;;:::i;:::-;-1:-1:-1;19243:9:0;19255:5;19259:1;19255;:5;:::i;:::-;19243:17;19097:192;-1:-1:-1;;;;;19097:192:0:o;3235:370::-;3288:7;3371:9;3418:16;3407:27;;3403:195;;3458:24;3451:31;;;3235:370;:::o;3403:195::-;-1:-1:-1;;3887:67:0;;;3544:10;3887:67;;;;15487:25:1;;;;3556:12:0;15528:18:1;;;15521:34;3570:15:0;15571:18:1;;;15564:34;3838:9:0;15614:18:1;;;15607:34;3948:4:0;15657:19:1;;;;15650:61;;;;3887:67:0;;;;;;;;;;15459:19:1;;;;3887:67:0;;;3877:78;;;;;;3235:370::o;18764:181::-;18822:7;;18854:5;18858:1;18854;:5;:::i;:::-;18842:17;;18883:1;18878;:6;;18870:46;;;;-1:-1:-1;;;18870:46:0;;14348:2:1;18870:46:0;;;14330:21:1;14387:2;14367:18;;;14360:30;14426:29;14406:18;;;14399:57;14473:18;;18870:46:0;14146:351:1;18870:46:0;18936:1;18764:181;-1:-1:-1;;;18764:181:0:o;46684:188::-;-1:-1:-1;;;;;46767:31:0;;;;;;:25;:31;;;;;;:39;;-1:-1:-1;;46767:39:0;;;;;;;;;;46824:40;;46767:39;;:31;46824:40;;;46684:188;;:::o;37193:207::-;-1:-1:-1;;;;;37314:14:0;;37253:15;37314:14;;;:7;:14;;;;;27790;;;37375:17;37314:14;37375:15;:17::i;:::-;37270:130;37193:207;;;:::o;4605:167::-;4682:7;4709:55;4731:20;:18;:20::i;:::-;4753:10;18529:57;;-1:-1:-1;;;18529:57:0;;;15980:27:1;16023:11;;;16016:27;;;16059:12;;;16052:28;;;18492:7:0;;16096:12:1;;18529:57:0;;;;;;;;;;;;18519:68;;;;;;18512:75;;18399:196;;;;;17201:279;17329:7;17350:17;17369:18;17391:25;17402:4;17408:1;17411;17414;17391:10;:25::i;:::-;17349:67;;;;17427:18;17439:5;17427:11;:18::i;:::-;-1:-1:-1;17463:9:0;17201:279;-1:-1:-1;;;;;17201:279:0:o;32835:539::-;-1:-1:-1;;;;;32941:20:0;;32933:70;;;;-1:-1:-1;;;32933:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;33022:23:0;;33014:71;;;;-1:-1:-1;;;33014:71:0;;;;;;;:::i;:::-;33178;33200:6;33178:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33178:17:0;;:9;:17;;;;;;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;33158:17:0;;;:9;:17;;;;;;;;;;;:91;;;;33283:20;;;;;;;:32;;33308:6;33283:24;:32::i;:::-;-1:-1:-1;;;;;33260:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;33331:35;1848:25:1;;;33260:20:0;;33331:35;;;;;;1821:18:1;33331:35:0;1702:177:1;19297:250:0;19355:7;19379:1;19384;19379:6;19375:47;;-1:-1:-1;19409:1:0;19402:8;;19375:47;19434:9;19446:5;19450:1;19446;:5;:::i;:::-;19434:17;-1:-1:-1;19479:1:0;19470:5;19474:1;19434:17;19470:5;:::i;:::-;:10;19462:56;;;;-1:-1:-1;;;19462:56:0;;14704:2:1;19462:56:0;;;14686:21:1;14743:2;14723:18;;;14716:30;14782:34;14762:18;;;14755:62;-1:-1:-1;;;14833:18:1;;;14826:31;14874:19;;19462:56:0;14502:397:1;19555:132:0;19613:7;19640:39;19644:1;19647;19640:39;;;;;;;;;;;;;;;;;:3;:39::i;54665:1699::-;54748:4;54704:23;31466:18;;;;;;;;;;;54704:50;;54765:25;54835:17;;54814:18;;54793;;:39;;;;:::i;:::-;:59;;;;:::i;:::-;54765:87;-1:-1:-1;54863:12:0;54899:20;;;:46;;-1:-1:-1;54923:22:0;;54899:46;54896:60;;;54948:7;;;54665:1699::o;54896:60::-;55017:5;54997:13;31337:12;;;31257:100;54997:13;:17;;55013:1;54997:17;:::i;:::-;:25;;;;:::i;:::-;:30;;55025:2;54997:30;:::i;:::-;54979:15;:48;54976:125;;;55079:5;55059:13;31337:12;;;31257:100;55059:13;:17;;55075:1;55059:17;:::i;:::-;:25;;;;:::i;:::-;:30;;55087:2;55059:30;:::i;:::-;55041:48;;54976:125;55160:23;55245:1;55225:17;55204:18;;55186:15;:36;;;;:::i;:::-;:56;;;;:::i;:::-;:60;;;;:::i;:::-;55160:86;-1:-1:-1;55257:26:0;55286:36;:15;55160:86;55286:19;:36::i;:::-;55257:65;-1:-1:-1;55371:21:0;55405:36;55257:65;55405:16;:36::i;:::-;55465:18;55486:44;:21;55512:17;55486:25;:44::i;:::-;55465:65;;55553:23;55579:57;55618:17;55579:34;55594:18;;55579:10;:14;;:34;;;;:::i;:57::-;55553:83;;55647:22;55672:56;55710:17;55672:33;55687:17;;55672:10;:14;;:33;;;;:::i;:56::-;55647:81;-1:-1:-1;55749:23:0;55647:81;55775:28;55788:15;55775:10;:28;:::i;:::-;:45;;;;:::i;:::-;55864:1;55843:18;:22;;;55876:18;:22;;;55909:17;:21;;;55972:14;;55964:55;;55749:71;;-1:-1:-1;;;;;;55972:14:0;;56000;;55964:55;55864:1;55964:55;56000:14;55972;55964:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55951:68:0;;-1:-1:-1;;56043:19:0;;;;;:42;;;56084:1;56066:15;:19;56043:42;56040:210;;;56101:46;56114:15;56131;56101:12;:46::i;:::-;56219:18;;56167:71;;;15106:25:1;;;15162:2;15147:18;;15140:34;;;15190:18;;;15183:34;;;;56167:71:0;;;;;;15094:2:1;56167:71:0;;;56040:210;56301:15;;56293:63;;-1:-1:-1;;;;;56301:15:0;;;;56330:21;;56293:63;;;;56330:21;56301:15;56293:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;54665:1699:0:o;18953:136::-;19011:7;19038:43;19042:1;19045;19038:43;;;;;;;;;;;;;;;;;:3;:43::i;27820:181::-;27992:1;27974:7;:14;;;:19;;;;;;;:::i;:::-;;;;-1:-1:-1;;;27820:181:0:o;15430:1632::-;15561:7;;16495:66;16482:79;;16478:163;;;-1:-1:-1;16594:1:0;;-1:-1:-1;16598:30:0;16578:51;;16478:163;16655:1;:7;;16660:2;16655:7;;:18;;;;;16666:1;:7;;16671:2;16666:7;;16655:18;16651:102;;;-1:-1:-1;16706:1:0;;-1:-1:-1;16710:30:0;16690:51;;16651:102;16867:24;;;16850:14;16867:24;;;;;;;;;16346:25:1;;;16419:4;16407:17;;16387:18;;;16380:45;;;;16441:18;;;16434:34;;;16484:18;;;16477:34;;;16867:24:0;;16318:19:1;;16867:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;16867:24:0;;-1:-1:-1;;16867:24:0;;;-1:-1:-1;;;;;;;16906:20:0;;16902:103;;16959:1;16963:29;16943:50;;;;;;;16902:103;17025:6;-1:-1:-1;17033:20:0;;-1:-1:-1;15430:1632:0;;;;;;;;:::o;10092:643::-;10170:20;10161:5;:29;;;;;;;;:::i;:::-;;10157:571;;10092:643;:::o;10157:571::-;10268:29;10259:5;:38;;;;;;;;:::i;:::-;;10255:473;;10314:34;;-1:-1:-1;;;10314:34:0;;16856:2:1;10314:34:0;;;16838:21:1;16895:2;16875:18;;;16868:30;16934:26;16914:18;;;16907:54;16978:18;;10314:34:0;16654:348:1;10255:473:0;10379:35;10370:5;:44;;;;;;;;:::i;:::-;;10366:362;;10431:41;;-1:-1:-1;;;10431:41:0;;17209:2:1;10431:41:0;;;17191:21:1;17248:2;17228:18;;;17221:30;17287:33;17267:18;;;17260:61;17338:18;;10431:41:0;17007:355:1;10366:362:0;10503:30;10494:5;:39;;;;;;;;:::i;:::-;;10490:238;;10550:44;;-1:-1:-1;;;10550:44:0;;17569:2:1;10550:44:0;;;17551:21:1;17608:2;17588:18;;;17581:30;17647:34;17627:18;;;17620:62;-1:-1:-1;;;17698:18:1;;;17691:32;17740:19;;10550:44:0;17367:398:1;10490:238:0;10625:30;10616:5;:39;;;;;;;;:::i;:::-;;10612:116;;10672:44;;-1:-1:-1;;;10672:44:0;;17972:2:1;10672:44:0;;;17954:21:1;18011:2;17991:18;;;17984:30;18050:34;18030:18;;;18023:62;-1:-1:-1;;;18101:18:1;;;18094:32;18143:19;;10672:44:0;17770:398:1;10612:116:0;10092:643;:::o;19695:275::-;19781:7;19816:12;19809:5;19801:28;;;;-1:-1:-1;;;19801:28:0;;;;;;;;:::i;:::-;-1:-1:-1;19840:9:0;19852:5;19856:1;19852;:5;:::i;:::-;19840:17;-1:-1:-1;19888:5:0;19892:1;19888;:5;:::i;:::-;19880;19884:1;19880;:5;:::i;:::-;:13;;;;:::i;:::-;19875:1;:18;19868:26;;;;:::i;:::-;19961:1;19695:275;-1:-1:-1;;;;19695:275:0:o;53531:601::-;53683:16;;;53697:1;53683:16;;;;;;;;53659:21;;53683:16;;;;;;;;;;-1:-1:-1;53683:16:0;53659:40;;53728:4;53710;53715:1;53710:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;53710:23:0;;;:7;;;;;;;;;;:23;;;;53754:15;;:22;;;-1:-1:-1;;;53754:22:0;;;;:15;;;;;:20;;:22;;;;;53710:7;;53754:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53744:4;53749:1;53744:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;53744:32:0;;;:7;;;;;;;;;:32;53821:15;;53789:62;;53806:4;;53821:15;53839:11;53789:8;:62::i;:::-;53890:15;;:224;;-1:-1:-1;;;53890:224:0;;-1:-1:-1;;;;;53890:15:0;;;;:66;;:224;;53971:11;;53890:15;;54041:4;;54068;;54088:15;;53890:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53586:546;53531:601;:::o;54142:513::-;54322:15;;54290:62;;54307:4;;-1:-1:-1;;;;;54322:15:0;54340:11;54290:8;:62::i;:::-;54395:15;;-1:-1:-1;;;;;54395:15:0;:31;54434:9;54467:4;54487:11;54395:15;;54599:7;29156:6;;-1:-1:-1;;;;;29156:6:0;;29091:79;54599:7;54395:252;;;;;;-1:-1:-1;;;;;;54395:252:0;;;-1:-1:-1;;;;;20286:15:1;;;54395:252:0;;;20268:34:1;20318:18;;;20311:34;;;;20361:18;;;20354:34;;;;20404:18;;;20397:34;20468:15;;;20447:19;;;20440:44;54621:15:0;20500:19:1;;;20493:35;20202:19;;54395:252:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;14:548:1:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;298:3;483:1;478:2;469:6;458:9;454:22;450:31;443:42;553:2;546;542:7;537:2;529:6;525:15;521:29;510:9;506:45;502:54;494:62;;;;14:548;;;;:::o;567:131::-;-1:-1:-1;;;;;642:31:1;;632:42;;622:70;;688:1;685;678:12;703:315;771:6;779;832:2;820:9;811:7;807:23;803:32;800:52;;;848:1;845;838:12;800:52;887:9;874:23;906:31;931:5;906:31;:::i;:::-;956:5;1008:2;993:18;;;;980:32;;-1:-1:-1;;;703:315:1:o;1215:247::-;1274:6;1327:2;1315:9;1306:7;1302:23;1298:32;1295:52;;;1343:1;1340;1333:12;1295:52;1382:9;1369:23;1401:31;1426:5;1401:31;:::i;1884:180::-;1943:6;1996:2;1984:9;1975:7;1971:23;1967:32;1964:52;;;2012:1;2009;2002:12;1964:52;-1:-1:-1;2035:23:1;;1884:180;-1:-1:-1;1884:180:1:o;2069:456::-;2146:6;2154;2162;2215:2;2203:9;2194:7;2190:23;2186:32;2183:52;;;2231:1;2228;2221:12;2183:52;2270:9;2257:23;2289:31;2314:5;2289:31;:::i;:::-;2339:5;-1:-1:-1;2396:2:1;2381:18;;2368:32;2409:33;2368:32;2409:33;:::i;:::-;2069:456;;2461:7;;-1:-1:-1;;;2515:2:1;2500:18;;;;2487:32;;2069:456::o;2738:385::-;2824:6;2832;2840;2848;2901:3;2889:9;2880:7;2876:23;2872:33;2869:53;;;2918:1;2915;2908:12;2869:53;-1:-1:-1;;2941:23:1;;;3011:2;2996:18;;2983:32;;-1:-1:-1;3062:2:1;3047:18;;3034:32;;3113:2;3098:18;3085:32;;-1:-1:-1;2738:385:1;-1:-1:-1;2738:385:1:o;3499:160::-;3564:20;;3620:13;;3613:21;3603:32;;3593:60;;3649:1;3646;3639:12;3593:60;3499:160;;;:::o;3664:315::-;3729:6;3737;3790:2;3778:9;3769:7;3765:23;3761:32;3758:52;;;3806:1;3803;3796:12;3758:52;3845:9;3832:23;3864:31;3889:5;3864:31;:::i;:::-;3914:5;-1:-1:-1;3938:35:1;3969:2;3954:18;;3938:35;:::i;:::-;3928:45;;3664:315;;;;;:::o;3984:180::-;4040:6;4093:2;4081:9;4072:7;4068:23;4064:32;4061:52;;;4109:1;4106;4099:12;4061:52;4132:26;4148:9;4132:26;:::i;4169:829::-;4280:6;4288;4296;4304;4312;4320;4328;4381:3;4369:9;4360:7;4356:23;4352:33;4349:53;;;4398:1;4395;4388:12;4349:53;4437:9;4424:23;4456:31;4481:5;4456:31;:::i;:::-;4506:5;-1:-1:-1;4563:2:1;4548:18;;4535:32;4576:33;4535:32;4576:33;:::i;:::-;4628:7;-1:-1:-1;4682:2:1;4667:18;;4654:32;;-1:-1:-1;4733:2:1;4718:18;;4705:32;;-1:-1:-1;4789:3:1;4774:19;;4761:33;4838:4;4825:18;;4813:31;;4803:59;;4858:1;4855;4848:12;4803:59;4169:829;;;;-1:-1:-1;4169:829:1;;;;4881:7;4935:3;4920:19;;4907:33;;-1:-1:-1;4987:3:1;4972:19;;;4959:33;;4169:829;-1:-1:-1;;4169:829:1:o;5003:388::-;5071:6;5079;5132:2;5120:9;5111:7;5107:23;5103:32;5100:52;;;5148:1;5145;5138:12;5100:52;5187:9;5174:23;5206:31;5231:5;5206:31;:::i;:::-;5256:5;-1:-1:-1;5313:2:1;5298:18;;5285:32;5326:33;5285:32;5326:33;:::i;:::-;5378:7;5368:17;;;5003:388;;;;;:::o;5396:356::-;5598:2;5580:21;;;5617:18;;;5610:30;5676:34;5671:2;5656:18;;5649:62;5743:2;5728:18;;5396:356::o;5757:380::-;5836:1;5832:12;;;;5879;;;5900:61;;5954:4;5946:6;5942:17;5932:27;;5900:61;6007:2;5999:6;5996:14;5976:18;5973:38;5970:161;;6053:10;6048:3;6044:20;6041:1;6034:31;6088:4;6085:1;6078:15;6116:4;6113:1;6106:15;6352:127;6413:10;6408:3;6404:20;6401:1;6394:31;6444:4;6441:1;6434:15;6468:4;6465:1;6458:15;6484:168;6557:9;;;6588;;6605:15;;;6599:22;;6585:37;6575:71;;6626:18;;:::i;6657:127::-;6718:10;6713:3;6709:20;6706:1;6699:31;6749:4;6746:1;6739:15;6773:4;6770:1;6763:15;6789:120;6829:1;6855;6845:35;;6860:18;;:::i;:::-;-1:-1:-1;6894:9:1;;6789:120::o;7330:125::-;7395:9;;;7416:10;;;7413:36;;;7429:18;;:::i;11177:401::-;11379:2;11361:21;;;11418:2;11398:18;;;11391:30;11457:34;11452:2;11437:18;;11430:62;-1:-1:-1;;;11523:2:1;11508:18;;11501:35;11568:3;11553:19;;11177:401::o;11583:399::-;11785:2;11767:21;;;11824:2;11804:18;;;11797:30;11863:34;11858:2;11843:18;;11836:62;-1:-1:-1;;;11929:2:1;11914:18;;11907:33;11972:3;11957:19;;11583:399::o;14013:128::-;14080:9;;;14101:11;;;14098:37;;;14115:18;;:::i;16522:127::-;16583:10;16578:3;16574:20;16571:1;16564:31;16614:4;16611:1;16604:15;16638:4;16635:1;16628:15;18173:112;18205:1;18231;18221:35;;18236:18;;:::i;:::-;-1:-1:-1;18270:9:1;;18173:112::o;18290:127::-;18351:10;18346:3;18342:20;18339:1;18332:31;18382:4;18379:1;18372:15;18406:4;18403:1;18396:15;18554:127;18615:10;18610:3;18606:20;18603:1;18596:31;18646:4;18643:1;18636:15;18670:4;18667:1;18660:15;18686:251;18756:6;18809:2;18797:9;18788:7;18784:23;18780:32;18777:52;;;18825:1;18822;18815:12;18777:52;18857:9;18851:16;18876:31;18901:5;18876:31;:::i;18942:980::-;19204:4;19252:3;19241:9;19237:19;19283:6;19272:9;19265:25;19309:2;19347:6;19342:2;19331:9;19327:18;19320:34;19390:3;19385:2;19374:9;19370:18;19363:31;19414:6;19449;19443:13;19480:6;19472;19465:22;19518:3;19507:9;19503:19;19496:26;;19557:2;19549:6;19545:15;19531:29;;19578:1;19588:195;19602:6;19599:1;19596:13;19588:195;;;19667:13;;-1:-1:-1;;;;;19663:39:1;19651:52;;19758:15;;;;19723:12;;;;19699:1;19617:9;19588:195;;;-1:-1:-1;;;;;;;19839:32:1;;;;19834:2;19819:18;;19812:60;-1:-1:-1;;;19903:3:1;19888:19;19881:35;19800:3;18942:980;-1:-1:-1;;;18942:980:1:o;20539:306::-;20627:6;20635;20643;20696:2;20684:9;20675:7;20671:23;20667:32;20664:52;;;20712:1;20709;20702:12;20664:52;20741:9;20735:16;20725:26;;20791:2;20780:9;20776:18;20770:25;20760:35;;20835:2;20824:9;20820:18;20814:25;20804:35;;20539:306;;;;;:::o

Swarm Source

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