ETH Price: $3,252.85 (-3.69%)

Token

OpClouds (OPC)
 

Overview

Max Total Supply

100,000,000 OPC

Holders

19

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
1,600,000 OPC

Value
$0.00
0x7b82851b3c915b28667a829a4268a3915d6aaaaa
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:
OpClouds

Compiler Version
v0.8.24+commit.e11b9ed9

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU AGPLv3 license

Contract Source Code (Solidity)

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

/*

OpClouds - $OPC

Transforming DePIN with Decentralized Computing Resources as a Service.

Website: https://opclouds.tech/
Dapp: https://app.opclouds.tech/
Twitter: https://twitter.com/opclouds_tech

*/

// 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 OpClouds is ERC20Permit, Ownable {
    using SafeMath for uint256;

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

    address public RevShareWallet;
    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 RevShareWalletUpdated(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 _RevShareWallet, address _treasuryWallet) 
    ERC20("OpClouds", "OPC", 9) 
    ERC20Permit("OPC") 
    {

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

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

        uint256 _sellMarketingFee = 5;
        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;
        
        RevShareWallet = address(_RevShareWallet);
        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 updateRevShareWallet(address newRevShareWallet) external onlyOwner {
        emit RevShareWalletUpdated(newRevShareWallet, RevShareWallet);
        RevShareWallet = newRevShareWallet;
    }

    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(RevShareWallet).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":"_RevShareWallet","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":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"RevShareWalletUpdated","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":"treasuryWalletUpdated","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RevShareWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"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":"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":"address","name":"newRevShareWallet","type":"address"}],"name":"updateRevShareWallet","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"}]

6101606040527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c961014052600a805461ffff60a01b191690555f600b55601a805460ff199081166001908117909255601c8054909116909117905534801562000066575f80fd5b5060405162003d4238038062003d4283398101604081905262000089916200076f565b604051806040016040528060038152602001624f504360e81b81525080604051806040016040528060018152602001603160f81b815250604051806040016040528060088152602001674f70436c6f75647360c01b815250604051806040016040528060038152602001624f504360e81b8152506009826003908162000110919062000842565b5060046200011f838262000842565b5060ff166080908152845160209586012084519486019490942060e08590526101008190524660c0818152604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818b01819052818301999099526060810194909452938301919091523060a080840191909152835180840382018152929091019283905281519190960120909452505061012052600680546001600160a01b03191633908117909155915081905f907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600780546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d9081179091556040805163c45a015560e01b81529051829163c45a01559160048083019260209291908290030181865afa1580156200025b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200028191906200090e565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620002cd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620002f391906200090e565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303815f875af11580156200033e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200036491906200090e565b600880546001600160a01b0319166001600160a01b0392909216918217905562000390906001620004f0565b67016345785d8a0000602181905561271090620003af9060c862000945565b620003bb91906200095f565b601f556021546103e890620003d290601462000945565b620003de91906200095f565b60205562000401620003f86006546001600160a01b031690565b60215462000543565b6005600d8190555f600e819055600f819055601081905580808381808080806200042c81876200097f565b6200043891906200097f565b6200044491906200097f565b600c55601284905560138390556014829055601581905580826200046985876200097f565b6200047591906200097f565b6200048191906200097f565b601155600980546001600160a01b038d81166001600160a01b031992831617909255600a80548d84169216919091179055600654620004c39116600162000629565b620004d030600162000629565b620004df61dead600162000629565b505050505050505050505062000995565b6001600160a01b0382165f81815260226020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6001600160a01b0382166200059f5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064015b60405180910390fd5b600254620005ae9082620006e8565b6002556001600160a01b0382165f90815260208190526040902054620005d59082620006e8565b6001600160a01b0383165f81815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6006546001600160a01b03163314620006855760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000596565b6001600160a01b0382165f818152601d6020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b505050565b5f80620006f683856200097f565b9050838110156200074a5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640162000596565b90505b92915050565b80516001600160a01b03811681146200076a575f80fd5b919050565b5f806040838503121562000781575f80fd5b6200078c8362000753565b91506200079c6020840162000753565b90509250929050565b634e487b7160e01b5f52604160045260245ffd5b600181811c90821680620007ce57607f821691505b602082108103620007ed57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115620006e357805f5260205f20601f840160051c810160208510156200081a5750805b601f840160051c820191505b818110156200083b575f815560010162000826565b5050505050565b81516001600160401b038111156200085e576200085e620007a5565b62000876816200086f8454620007b9565b84620007f3565b602080601f831160018114620008ac575f8415620008945750858301515b5f19600386901b1c1916600185901b17855562000906565b5f85815260208120601f198616915b82811015620008dc57888601518255948401946001909101908401620008bb565b5085821015620008fa57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f602082840312156200091f575f80fd5b6200092a8262000753565b9392505050565b634e487b7160e01b5f52601160045260245ffd5b80820281158282048414176200074d576200074d62000931565b5f826200097a57634e487b7160e01b5f52601260045260245ffd5b500490565b808201808211156200074d576200074d62000931565b60805160a05160c05160e05161010051610120516101405161335b620009e75f395f61147201525f61228301525f6122d201525f6122ad01525f61222f01525f61225601525f6105be015261335b5ff3fe6080604052600436106103b6575f3560e01c80637bce5a04116101e9578063c876d0b911610108578063e7ad9fcd1161009d578063f63743421161006d578063f637434214610aae578063f8b45b0514610ac3578063fc984ea414610ad8578063fd860b6b14610af7575f80fd5b8063e7ad9fcd14610a47578063e884f26014610a66578063f11a24d314610a7a578063f2fde38b14610a8f575f80fd5b8063d505accf116100d8578063d505accf146109ba578063d85ba063146109d9578063dd62ed3e146109ee578063e71dc3f514610a32575f80fd5b8063c876d0b914610962578063c8c8ebe41461097b578063cc2ffe7c14610990578063cfd05e83146109a5575f80fd5b8063a457c2d71161017e578063b62496f51161014e578063b62496f5146108d6578063bbc0c74214610904578063c024666814610924578063c18bc19514610943575f80fd5b8063a457c2d714610864578063a9059cbb14610883578063adb873bd146108a2578063adee28ff146108b7575f80fd5b806392136913116101b957806392136913146107fd578063924de9b71461081257806395d89b41146108315780639a7a23d614610845575f80fd5b80637bce5a04146107985780637ecebe00146107ad5780638a8c523c146107cc5780638da5cb5b146107e0575f80fd5b8063313ce567116102d55780635c068a8c1161026a57806370a082311161023a57806370a082311461071d578063715018a614610751578063751039fc146107655780637571336a14610779575f80fd5b80635c068a8c146106be5780636a486a8e146106d35780636b2fb124146106e85780636ddd1713146106fd575f80fd5b80634626402b116102a55780634626402b1461063057806349bd5a5e1461064f5780634a62bb651461066e5780634fbee19314610687575f80fd5b8063313ce567146105ab5780633644e515146105e8578063378dc3dc146105fc5780633950935114610611575f80fd5b80631a8145bb1161034b57806323b872dd1161031b57806323b872dd1461053957806327c8f835146105585780632955ede61461056d5780632e6ed7ef1461058c575f80fd5b80631a8145bb146104db5780631d777856146104f05780631f3fed8f14610505578063203e727e1461051a575f80fd5b80631031e36e116103865780631031e36e1461044457806310d5de53146104585780631694505e1461048657806318160ddd146104bd575f80fd5b80630694db1e146103c157806306fdde03146103d7578063095ea7b3146104015780630e3d57eb14610430575f80fd5b366103bd57005b5f80fd5b3480156103cc575f80fd5b506103d5610b16565b005b3480156103e2575f80fd5b506103eb610b5e565b6040516103f89190612e14565b60405180910390f35b34801561040c575f80fd5b5061042061041b366004612e74565b610bee565b60405190151581526020016103f8565b34801561043b575f80fd5b506103d5610c04565b34801561044f575f80fd5b506103d5610c78565b348015610463575f80fd5b50610420610472366004612e9e565b601e6020525f908152604090205460ff1681565b348015610491575f80fd5b506007546104a5906001600160a01b031681565b6040516001600160a01b0390911681526020016103f8565b3480156104c8575f80fd5b506002545b6040519081526020016103f8565b3480156104e6575f80fd5b506104cd60175481565b3480156104fb575f80fd5b506104cd60185481565b348015610510575f80fd5b506104cd60165481565b348015610525575f80fd5b506103d5610534366004612eb9565b610cbf565b348015610544575f80fd5b50610420610553366004612ed0565b610d94565b348015610563575f80fd5b506104a561dead81565b348015610578575f80fd5b506103d5610587366004612e9e565b610dfb565b348015610597575f80fd5b506103d56105a6366004612f0e565b610e81565b3480156105b6575f80fd5b5060405160ff7f00000000000000000000000000000000000000000000000000000000000000001681526020016103f8565b3480156105f3575f80fd5b506104cd610f34565b348015610607575f80fd5b506104cd60215481565b34801561061c575f80fd5b5061042061062b366004612e74565b610f42565b34801561063b575f80fd5b50600a546104a5906001600160a01b031681565b34801561065a575f80fd5b506008546104a5906001600160a01b031681565b348015610679575f80fd5b50601a546104209060ff1681565b348015610692575f80fd5b506104206106a1366004612e9e565b6001600160a01b03165f908152601d602052604090205460ff1690565b3480156106c9575f80fd5b506104cd60105481565b3480156106de575f80fd5b506104cd60115481565b3480156106f3575f80fd5b506104cd60155481565b348015610708575f80fd5b50600a5461042090600160a81b900460ff1681565b348015610728575f80fd5b506104cd610737366004612e9e565b6001600160a01b03165f9081526020819052604090205490565b34801561075c575f80fd5b506103d5610f77565b348015610770575f80fd5b50610420610fea565b348015610784575f80fd5b506103d5610793366004612f51565b611026565b3480156107a3575f80fd5b506104cd600d5481565b3480156107b8575f80fd5b506104cd6107c7366004612e9e565b61107a565b3480156107d7575f80fd5b506103d5611097565b3480156107eb575f80fd5b506006546001600160a01b03166104a5565b348015610808575f80fd5b506104cd60125481565b34801561081d575f80fd5b506103d561082c366004612f84565b6110dc565b34801561083c575f80fd5b506103eb611124565b348015610850575f80fd5b506103d561085f366004612f51565b611133565b34801561086f575f80fd5b5061042061087e366004612e74565b6111ef565b34801561088e575f80fd5b5061042061089d366004612e74565b61123c565b3480156108ad575f80fd5b506104cd60145481565b3480156108c2575f80fd5b506103d56108d1366004612e9e565b611248565b3480156108e1575f80fd5b506104206108f0366004612e9e565b60226020525f908152604090205460ff1681565b34801561090f575f80fd5b50600a5461042090600160a01b900460ff1681565b34801561092f575f80fd5b506103d561093e366004612f51565b6112ce565b34801561094e575f80fd5b506103d561095d366004612eb9565b611356565b34801561096d575f80fd5b50601c546104209060ff1681565b348015610986575f80fd5b506104cd601f5481565b34801561099b575f80fd5b506104cd60195481565b3480156109b0575f80fd5b506104cd600b5481565b3480156109c5575f80fd5b506103d56109d4366004612f9d565b61141f565b3480156109e4575f80fd5b506104cd600c5481565b3480156109f9575f80fd5b506104cd610a0836600461300e565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b348015610a3d575f80fd5b506104cd600f5481565b348015610a52575f80fd5b506103d5610a61366004612f0e565b611580565b348015610a71575f80fd5b50610420611633565b348015610a85575f80fd5b506104cd600e5481565b348015610a9a575f80fd5b506103d5610aa9366004612e9e565b61166f565b348015610ab9575f80fd5b506104cd60135481565b348015610ace575f80fd5b506104cd60205481565b348015610ae3575f80fd5b506103d5610af2366004612f51565b611759565b348015610b02575f80fd5b506009546104a5906001600160a01b031681565b6006546001600160a01b03163314610b495760405162461bcd60e51b8152600401610b4090613045565b60405180910390fd5b600a805460ff60a01b1916600160a01b179055565b606060038054610b6d9061307a565b80601f0160208091040260200160405190810160405280929190818152602001828054610b999061307a565b8015610be45780601f10610bbb57610100808354040283529160200191610be4565b820191905f5260205f20905b815481529060010190602001808311610bc757829003601f168201915b5050505050905090565b5f610bfa3384846117ad565b5060015b92915050565b6006546001600160a01b03163314610c2e5760405162461bcd60e51b8152600401610b4090613045565b6040515f90339047908381818185875af1925050503d805f8114610c6d576040519150601f19603f3d011682016040523d82523d5f602084013e610c72565b606091505b50505050565b6006546001600160a01b03163314610ca25760405162461bcd60e51b8152600401610b4090613045565b601a5460ff16610cb0575f80fd5b600a805460ff60a01b19169055565b6006546001600160a01b03163314610ce95760405162461bcd60e51b8152600401610b4090613045565b633b9aca006103e8610cfa60025490565b610d059060016130c0565b610d0f91906130eb565b610d1991906130eb565b811015610d805760405162461bcd60e51b815260206004820152602f60248201527f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060448201526e6c6f776572207468616e20302e312560881b6064820152608401610b40565b610d8e81633b9aca006130c0565b601f5550565b5f610da08484846118d1565b610df18433610dec856040518060600160405280602881526020016132d9602891396001600160a01b038a165f90815260016020908152604080832033845290915290205491906121f3565b6117ad565b5060019392505050565b6006546001600160a01b03163314610e255760405162461bcd60e51b8152600401610b4090613045565b600a546040516001600160a01b03918216918316907f02f8a1483978974a6412ba3a67040b4daa4fc0dfe9439a7295f9a9538394f635905f90a3600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6006546001600160a01b03163314610eab5760405162461bcd60e51b8152600401610b4090613045565b600d849055600e839055600f82905560108190558082610ecb85876130fe565b610ed591906130fe565b610edf91906130fe565b600c81905560191015610c725760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420313525206f72206c6573730000006044820152606401610b40565b5f610f3d61222b565b905090565b335f8181526001602090815260408083206001600160a01b03871684529091528120549091610bfa918590610dec9086612320565b6006546001600160a01b03163314610fa15760405162461bcd60e51b8152600401610b4090613045565b6006546040515f916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600680546001600160a01b0319169055565b6006545f906001600160a01b031633146110165760405162461bcd60e51b8152600401610b4090613045565b50601a805460ff19169055600190565b6006546001600160a01b031633146110505760405162461bcd60e51b8152600401610b4090613045565b6001600160a01b03919091165f908152601e60205260409020805460ff1916911515919091179055565b6001600160a01b0381165f90815260056020526040812054610bfe565b6006546001600160a01b031633146110c15760405162461bcd60e51b8152600401610b4090613045565b600a805461ffff60a01b191661010160a01b17905543600b55565b6006546001600160a01b031633146111065760405162461bcd60e51b8152600401610b4090613045565b600a8054911515600160a81b0260ff60a81b19909216919091179055565b606060048054610b6d9061307a565b6006546001600160a01b0316331461115d5760405162461bcd60e51b8152600401610b4090613045565b6008546001600160a01b03908116908316036111e15760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610b40565b6111eb8282612385565b5050565b5f610bfa3384610dec8560405180606001604052806025815260200161330160259139335f9081526001602090815260408083206001600160a01b038d16845290915290205491906121f3565b5f610bfa3384846118d1565b6006546001600160a01b031633146112725760405162461bcd60e51b8152600401610b4090613045565b6009546040516001600160a01b03918216918316907fcb24b9cc1975a8c5afd1fcc8deca22156b8f357af3485db1f9382b3c584d671f905f90a3600980546001600160a01b0319166001600160a01b0392909216919091179055565b6006546001600160a01b031633146112f85760405162461bcd60e51b8152600401610b4090613045565b6001600160a01b0382165f818152601d6020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6006546001600160a01b031633146113805760405162461bcd60e51b8152600401610b4090613045565b633b9aca006103e861139160025490565b61139c9060056130c0565b6113a691906130eb565b6113b091906130eb565b81101561140b5760405162461bcd60e51b8152602060048201526024808201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e20604482015263302e352560e01b6064820152608401610b40565b61141981633b9aca006130c0565b60205550565b8342111561146f5760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610b40565b5f7f000000000000000000000000000000000000000000000000000000000000000088888861149d8c6123d8565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f6114f782612401565b90505f6115068287878761244d565b9050896001600160a01b0316816001600160a01b0316146115695760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610b40565b6115748a8a8a6117ad565b50505050505050505050565b6006546001600160a01b031633146115aa5760405162461bcd60e51b8152600401610b4090613045565b601284905560138390556014829055601581905580826115ca85876130fe565b6115d491906130fe565b6115de91906130fe565b601181905560191015610c725760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420313525206f72206c6573730000006044820152606401610b40565b6006545f906001600160a01b0316331461165f5760405162461bcd60e51b8152600401610b4090613045565b50601c805460ff19169055600190565b6006546001600160a01b031633146116995760405162461bcd60e51b8152600401610b4090613045565b6001600160a01b0381166116fe5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b40565b6006546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b6006546001600160a01b031633146117835760405162461bcd60e51b8152600401610b4090613045565b6001600160a01b03919091165f908152602360205260409020805460ff1916911515919091179055565b6001600160a01b03831661180f5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610b40565b6001600160a01b0382166118705760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610b40565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166118f75760405162461bcd60e51b8152600401610b4090613111565b6001600160a01b03821661191d5760405162461bcd60e51b8152600401610b4090613156565b805f036119345761192f83835f612473565b505050565b601a545f9060ff1615611e37576006546001600160a01b0385811691161480159061196d57506006546001600160a01b03848116911614155b801561198157506001600160a01b03831615155b801561199857506001600160a01b03831661dead14155b80156119ae5750600a54600160b01b900460ff16155b15611e3757600a54600160a01b900460ff16611a46576001600160a01b0384165f908152601d602052604090205460ff1680611a0157506001600160a01b0383165f908152601d602052604090205460ff165b611a465760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610b40565b601c5460ff1615611b43576006546001600160a01b03848116911614801590611a7d57506007546001600160a01b03848116911614155b8015611a9757506008546001600160a01b03848116911614155b15611b4357325f908152601b60205260409020544311611b315760405162461bcd60e51b815260206004820152604960248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b6064820152681030b63637bbb2b21760b91b608482015260a401610b40565b325f908152601b602052604090204390555b6001600160a01b0384165f9081526022602052604090205460ff168015611b8257506001600160a01b0383165f908152601e602052604090205460ff16155b15611c6b57601f54821115611bf75760405162461bcd60e51b815260206004820152603560248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201527436b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760591b6064820152608401610b40565b602054611c18846001600160a01b03165f9081526020819052604090205490565b611c2290846130fe565b1115611c665760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610b40565b611dae565b6001600160a01b0383165f9081526022602052604090205460ff168015611caa57506001600160a01b0384165f908152601e602052604090205460ff16155b15611d2057601f54821115611c665760405162461bcd60e51b815260206004820152603660248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152751036b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760511b6064820152608401610b40565b6001600160a01b0383165f908152601e602052604090205460ff16611dae57602054611d60846001600160a01b03165f9081526020819052604090205490565b611d6a90846130fe565b1115611dae5760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610b40565b6001600160a01b0384165f9081526022602052604090205460ff168015611dd65750600b5415155b8015611de45750600b544311155b15611e37576001600160a01b0383165f908152602360205260409020805460ff19166001179055611e216064611e1b846063612579565b906125f7565b9050610c728484611e328486613199565b612473565b6001600160a01b0384165f9081526023602052604090205460ff1680611e7457506001600160a01b0383165f9081526023602052604090205460ff165b15611e8457610c7284845f612473565b600a54600160a81b900460ff168015611ea75750600a54600160b01b900460ff16155b8015611ecb57506001600160a01b0384165f908152601d602052604090205460ff16155b8015611eef57506001600160a01b0383165f908152601d602052604090205460ff16155b8015611f1357506001600160a01b0384165f9081526022602052604090205460ff16155b15611f4157600a805460ff60b01b1916600160b01b179055611f33612638565b600a805460ff60b01b191690555b600a546001600160a01b0385165f908152601d602052604090205460ff600160b01b909204821615911680611f8d57506001600160a01b0384165f908152601d602052604090205460ff165b15611f9557505f5b5f60185580156121e1576001600160a01b0384165f9081526022602052604090205460ff168015611fc757505f601154115b1561209957611fe66064611e1b6011548661257990919063ffffffff16565b915060115460135483611ff991906130c0565b61200391906130eb565b60175f82825461201391906130fe565b909155505060115460145461202890846130c0565b61203291906130eb565b60185560115460155461204590846130c0565b61204f91906130eb565b60195f82825461205f91906130fe565b909155505060115460125461207490846130c0565b61207e91906130eb565b60165f82825461208e91906130fe565b9091555061218e9050565b6001600160a01b0385165f9081526022602052604090205460ff1680156120c157505f600c54115b1561218e576120e06064611e1b600c548661257990919063ffffffff16565b9150600c54600e54836120f391906130c0565b6120fd91906130eb565b60175f82825461210d91906130fe565b9091555050600c54600f5461212290846130c0565b61212c91906130eb565b601855600c5460105461213f90846130c0565b61214991906130eb565b60195f82825461215991906130fe565b9091555050600c54600d5461216e90846130c0565b61217891906130eb565b60165f82825461218891906130fe565b90915550505b5f6018548361219d9190613199565b11156121bd576121bd8530611e326018548661289e90919063ffffffff16565b601854156121d4576121d48561dead601854612473565b6121de8284613199565b92505b6121ec858585612473565b5050505050565b5f81848411156122165760405162461bcd60e51b8152600401610b409190612e14565b505f6122228486613199565b95945050505050565b5f467f0000000000000000000000000000000000000000000000000000000000000000810361227b577f000000000000000000000000000000000000000000000000000000000000000091505090565b5050604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b5f8061232c83856130fe565b90508381101561237e5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610b40565b9392505050565b6001600160a01b0382165f81815260226020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6001600160a01b0381165f9081526005602052604090208054906123fb816128df565b50919050565b5f610bfe61240d61222b565b8360405161190160f01b602082015260228101839052604281018290525f9060620160405160208183030381529060405280519060200120905092915050565b5f805f61245c878787876128fa565b91509150612469816129df565b5095945050505050565b6001600160a01b0383166124995760405162461bcd60e51b8152600401610b4090613111565b6001600160a01b0382166124bf5760405162461bcd60e51b8152600401610b4090613156565b6124fb816040518060600160405280602681526020016132b3602691396001600160a01b0386165f9081526020819052604090205491906121f3565b6001600160a01b038085165f9081526020819052604080822093909355908416815220546125299082612320565b6001600160a01b038381165f818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91016118c4565b5f825f0361258857505f610bfe565b5f61259383856130c0565b9050826125a085836130eb565b1461237e5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610b40565b5f61237e83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612b97565b305f9081526020819052604081205490505f60195460165460175461265d91906130fe565b61266791906130fe565b90505f821580612675575081155b1561267f57505050565b61271061268b60025490565b6126969060056130c0565b6126a091906130eb565b6126ab9060146130c0565b8311156126e1576127106126be60025490565b6126c99060056130c0565b6126d391906130eb565b6126de9060146130c0565b92505b5f600283601754866126f391906130c0565b6126fd91906130eb565b61270791906130eb565b90505f612714858361289e565b90504761272082612bf9565b5f61272b478361289e565b90505f61274787611e1b6016548561257990919063ffffffff16565b90505f61276388611e1b6019548661257990919063ffffffff16565b90505f816127718486613199565b61277b9190613199565b5f601781905560168190556019819055600a546040519293506001600160a01b031691849181818185875af1925050503d805f81146127d5576040519150601f19603f3d011682016040523d82523d5f602084013e6127da565b606091505b509098505086158015906127ed57505f81115b15612840576127fc8782612d49565b601754604080518881526020810184905280820192909252517f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619181900360600190a15b6009546040516001600160a01b039091169047905f81818185875af1925050503d805f811461288a576040519150601f19603f3d011682016040523d82523d5f602084013e61288f565b606091505b50505050505050505050505050565b5f61237e83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506121f3565b6001815f015f8282546128f291906130fe565b909155505050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561292f57505f905060036129d6565b8460ff16601b1415801561294757508460ff16601c14155b1561295757505f905060046129d6565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156129a8573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b0381166129d0575f600192509250506129d6565b91505f90505b94509492505050565b5f8160048111156129f2576129f26131ac565b036129fa5750565b6001816004811115612a0e57612a0e6131ac565b03612a5b5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610b40565b6002816004811115612a6f57612a6f6131ac565b03612abc5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610b40565b6003816004811115612ad057612ad06131ac565b03612b285760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610b40565b6004816004811115612b3c57612b3c6131ac565b03612b945760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610b40565b50565b5f8183612bb75760405162461bcd60e51b8152600401610b409190612e14565b505f612bc384866130eb565b9050612bcf84866131c0565b612bd982866130c0565b612be391906130fe565b8514612bf157612bf16131d3565b949350505050565b6040805160028082526060820183525f9260208301908036833701905050905030815f81518110612c2c57612c2c6131e7565b6001600160a01b03928316602091820292909201810191909152600754604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612c83573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ca791906131fb565b81600181518110612cba57612cba6131e7565b6001600160a01b039283166020918202929092010152600754612ce091309116846117ad565b60075460405163791ac94760e01b81526001600160a01b039091169063791ac94790612d189085905f90869030904290600401613216565b5f604051808303815f87803b158015612d2f575f80fd5b505af1158015612d41573d5f803e3d5ffd5b505050505050565b600754612d619030906001600160a01b0316846117ad565b6007546001600160a01b031663f305d7198230855f80612d896006546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af1158015612def573d5f803e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906121ec9190613287565b5f602080835283518060208501525f5b81811015612e4057858101830151858201604001528201612e24565b505f604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114612b94575f80fd5b5f8060408385031215612e85575f80fd5b8235612e9081612e60565b946020939093013593505050565b5f60208284031215612eae575f80fd5b813561237e81612e60565b5f60208284031215612ec9575f80fd5b5035919050565b5f805f60608486031215612ee2575f80fd5b8335612eed81612e60565b92506020840135612efd81612e60565b929592945050506040919091013590565b5f805f8060808587031215612f21575f80fd5b5050823594602084013594506040840135936060013592509050565b80358015158114612f4c575f80fd5b919050565b5f8060408385031215612f62575f80fd5b8235612f6d81612e60565b9150612f7b60208401612f3d565b90509250929050565b5f60208284031215612f94575f80fd5b61237e82612f3d565b5f805f805f805f60e0888a031215612fb3575f80fd5b8735612fbe81612e60565b96506020880135612fce81612e60565b95506040880135945060608801359350608088013560ff81168114612ff1575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f806040838503121561301f575f80fd5b823561302a81612e60565b9150602083013561303a81612e60565b809150509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c9082168061308e57607f821691505b6020821081036123fb57634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b8082028115828204841417610bfe57610bfe6130ac565b634e487b7160e01b5f52601260045260245ffd5b5f826130f9576130f96130d7565b500490565b80820180821115610bfe57610bfe6130ac565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b81810381811115610bfe57610bfe6130ac565b634e487b7160e01b5f52602160045260245ffd5b5f826131ce576131ce6130d7565b500690565b634e487b7160e01b5f52600160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f6020828403121561320b575f80fd5b815161237e81612e60565b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b818110156132665784516001600160a01b031683529383019391830191600101613241565b50506001600160a01b03969096166060850152505050608001529392505050565b5f805f60608486031215613299575f80fd5b835192506020840151915060408401519050925092509256fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220ac241511640413f0c1bfbdd80033a9ffaf866cfaa199b1a123a8f76c6d964ebb64736f6c6343000818003300000000000000000000000006bedc9bb990e7fb977f982120e83b363812663d00000000000000000000000064a9d140abea1a14d1b63df8f0d8c7b38c55c3df

Deployed Bytecode

0x6080604052600436106103b6575f3560e01c80637bce5a04116101e9578063c876d0b911610108578063e7ad9fcd1161009d578063f63743421161006d578063f637434214610aae578063f8b45b0514610ac3578063fc984ea414610ad8578063fd860b6b14610af7575f80fd5b8063e7ad9fcd14610a47578063e884f26014610a66578063f11a24d314610a7a578063f2fde38b14610a8f575f80fd5b8063d505accf116100d8578063d505accf146109ba578063d85ba063146109d9578063dd62ed3e146109ee578063e71dc3f514610a32575f80fd5b8063c876d0b914610962578063c8c8ebe41461097b578063cc2ffe7c14610990578063cfd05e83146109a5575f80fd5b8063a457c2d71161017e578063b62496f51161014e578063b62496f5146108d6578063bbc0c74214610904578063c024666814610924578063c18bc19514610943575f80fd5b8063a457c2d714610864578063a9059cbb14610883578063adb873bd146108a2578063adee28ff146108b7575f80fd5b806392136913116101b957806392136913146107fd578063924de9b71461081257806395d89b41146108315780639a7a23d614610845575f80fd5b80637bce5a04146107985780637ecebe00146107ad5780638a8c523c146107cc5780638da5cb5b146107e0575f80fd5b8063313ce567116102d55780635c068a8c1161026a57806370a082311161023a57806370a082311461071d578063715018a614610751578063751039fc146107655780637571336a14610779575f80fd5b80635c068a8c146106be5780636a486a8e146106d35780636b2fb124146106e85780636ddd1713146106fd575f80fd5b80634626402b116102a55780634626402b1461063057806349bd5a5e1461064f5780634a62bb651461066e5780634fbee19314610687575f80fd5b8063313ce567146105ab5780633644e515146105e8578063378dc3dc146105fc5780633950935114610611575f80fd5b80631a8145bb1161034b57806323b872dd1161031b57806323b872dd1461053957806327c8f835146105585780632955ede61461056d5780632e6ed7ef1461058c575f80fd5b80631a8145bb146104db5780631d777856146104f05780631f3fed8f14610505578063203e727e1461051a575f80fd5b80631031e36e116103865780631031e36e1461044457806310d5de53146104585780631694505e1461048657806318160ddd146104bd575f80fd5b80630694db1e146103c157806306fdde03146103d7578063095ea7b3146104015780630e3d57eb14610430575f80fd5b366103bd57005b5f80fd5b3480156103cc575f80fd5b506103d5610b16565b005b3480156103e2575f80fd5b506103eb610b5e565b6040516103f89190612e14565b60405180910390f35b34801561040c575f80fd5b5061042061041b366004612e74565b610bee565b60405190151581526020016103f8565b34801561043b575f80fd5b506103d5610c04565b34801561044f575f80fd5b506103d5610c78565b348015610463575f80fd5b50610420610472366004612e9e565b601e6020525f908152604090205460ff1681565b348015610491575f80fd5b506007546104a5906001600160a01b031681565b6040516001600160a01b0390911681526020016103f8565b3480156104c8575f80fd5b506002545b6040519081526020016103f8565b3480156104e6575f80fd5b506104cd60175481565b3480156104fb575f80fd5b506104cd60185481565b348015610510575f80fd5b506104cd60165481565b348015610525575f80fd5b506103d5610534366004612eb9565b610cbf565b348015610544575f80fd5b50610420610553366004612ed0565b610d94565b348015610563575f80fd5b506104a561dead81565b348015610578575f80fd5b506103d5610587366004612e9e565b610dfb565b348015610597575f80fd5b506103d56105a6366004612f0e565b610e81565b3480156105b6575f80fd5b5060405160ff7f00000000000000000000000000000000000000000000000000000000000000091681526020016103f8565b3480156105f3575f80fd5b506104cd610f34565b348015610607575f80fd5b506104cd60215481565b34801561061c575f80fd5b5061042061062b366004612e74565b610f42565b34801561063b575f80fd5b50600a546104a5906001600160a01b031681565b34801561065a575f80fd5b506008546104a5906001600160a01b031681565b348015610679575f80fd5b50601a546104209060ff1681565b348015610692575f80fd5b506104206106a1366004612e9e565b6001600160a01b03165f908152601d602052604090205460ff1690565b3480156106c9575f80fd5b506104cd60105481565b3480156106de575f80fd5b506104cd60115481565b3480156106f3575f80fd5b506104cd60155481565b348015610708575f80fd5b50600a5461042090600160a81b900460ff1681565b348015610728575f80fd5b506104cd610737366004612e9e565b6001600160a01b03165f9081526020819052604090205490565b34801561075c575f80fd5b506103d5610f77565b348015610770575f80fd5b50610420610fea565b348015610784575f80fd5b506103d5610793366004612f51565b611026565b3480156107a3575f80fd5b506104cd600d5481565b3480156107b8575f80fd5b506104cd6107c7366004612e9e565b61107a565b3480156107d7575f80fd5b506103d5611097565b3480156107eb575f80fd5b506006546001600160a01b03166104a5565b348015610808575f80fd5b506104cd60125481565b34801561081d575f80fd5b506103d561082c366004612f84565b6110dc565b34801561083c575f80fd5b506103eb611124565b348015610850575f80fd5b506103d561085f366004612f51565b611133565b34801561086f575f80fd5b5061042061087e366004612e74565b6111ef565b34801561088e575f80fd5b5061042061089d366004612e74565b61123c565b3480156108ad575f80fd5b506104cd60145481565b3480156108c2575f80fd5b506103d56108d1366004612e9e565b611248565b3480156108e1575f80fd5b506104206108f0366004612e9e565b60226020525f908152604090205460ff1681565b34801561090f575f80fd5b50600a5461042090600160a01b900460ff1681565b34801561092f575f80fd5b506103d561093e366004612f51565b6112ce565b34801561094e575f80fd5b506103d561095d366004612eb9565b611356565b34801561096d575f80fd5b50601c546104209060ff1681565b348015610986575f80fd5b506104cd601f5481565b34801561099b575f80fd5b506104cd60195481565b3480156109b0575f80fd5b506104cd600b5481565b3480156109c5575f80fd5b506103d56109d4366004612f9d565b61141f565b3480156109e4575f80fd5b506104cd600c5481565b3480156109f9575f80fd5b506104cd610a0836600461300e565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b348015610a3d575f80fd5b506104cd600f5481565b348015610a52575f80fd5b506103d5610a61366004612f0e565b611580565b348015610a71575f80fd5b50610420611633565b348015610a85575f80fd5b506104cd600e5481565b348015610a9a575f80fd5b506103d5610aa9366004612e9e565b61166f565b348015610ab9575f80fd5b506104cd60135481565b348015610ace575f80fd5b506104cd60205481565b348015610ae3575f80fd5b506103d5610af2366004612f51565b611759565b348015610b02575f80fd5b506009546104a5906001600160a01b031681565b6006546001600160a01b03163314610b495760405162461bcd60e51b8152600401610b4090613045565b60405180910390fd5b600a805460ff60a01b1916600160a01b179055565b606060038054610b6d9061307a565b80601f0160208091040260200160405190810160405280929190818152602001828054610b999061307a565b8015610be45780601f10610bbb57610100808354040283529160200191610be4565b820191905f5260205f20905b815481529060010190602001808311610bc757829003601f168201915b5050505050905090565b5f610bfa3384846117ad565b5060015b92915050565b6006546001600160a01b03163314610c2e5760405162461bcd60e51b8152600401610b4090613045565b6040515f90339047908381818185875af1925050503d805f8114610c6d576040519150601f19603f3d011682016040523d82523d5f602084013e610c72565b606091505b50505050565b6006546001600160a01b03163314610ca25760405162461bcd60e51b8152600401610b4090613045565b601a5460ff16610cb0575f80fd5b600a805460ff60a01b19169055565b6006546001600160a01b03163314610ce95760405162461bcd60e51b8152600401610b4090613045565b633b9aca006103e8610cfa60025490565b610d059060016130c0565b610d0f91906130eb565b610d1991906130eb565b811015610d805760405162461bcd60e51b815260206004820152602f60248201527f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060448201526e6c6f776572207468616e20302e312560881b6064820152608401610b40565b610d8e81633b9aca006130c0565b601f5550565b5f610da08484846118d1565b610df18433610dec856040518060600160405280602881526020016132d9602891396001600160a01b038a165f90815260016020908152604080832033845290915290205491906121f3565b6117ad565b5060019392505050565b6006546001600160a01b03163314610e255760405162461bcd60e51b8152600401610b4090613045565b600a546040516001600160a01b03918216918316907f02f8a1483978974a6412ba3a67040b4daa4fc0dfe9439a7295f9a9538394f635905f90a3600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6006546001600160a01b03163314610eab5760405162461bcd60e51b8152600401610b4090613045565b600d849055600e839055600f82905560108190558082610ecb85876130fe565b610ed591906130fe565b610edf91906130fe565b600c81905560191015610c725760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420313525206f72206c6573730000006044820152606401610b40565b5f610f3d61222b565b905090565b335f8181526001602090815260408083206001600160a01b03871684529091528120549091610bfa918590610dec9086612320565b6006546001600160a01b03163314610fa15760405162461bcd60e51b8152600401610b4090613045565b6006546040515f916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600680546001600160a01b0319169055565b6006545f906001600160a01b031633146110165760405162461bcd60e51b8152600401610b4090613045565b50601a805460ff19169055600190565b6006546001600160a01b031633146110505760405162461bcd60e51b8152600401610b4090613045565b6001600160a01b03919091165f908152601e60205260409020805460ff1916911515919091179055565b6001600160a01b0381165f90815260056020526040812054610bfe565b6006546001600160a01b031633146110c15760405162461bcd60e51b8152600401610b4090613045565b600a805461ffff60a01b191661010160a01b17905543600b55565b6006546001600160a01b031633146111065760405162461bcd60e51b8152600401610b4090613045565b600a8054911515600160a81b0260ff60a81b19909216919091179055565b606060048054610b6d9061307a565b6006546001600160a01b0316331461115d5760405162461bcd60e51b8152600401610b4090613045565b6008546001600160a01b03908116908316036111e15760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610b40565b6111eb8282612385565b5050565b5f610bfa3384610dec8560405180606001604052806025815260200161330160259139335f9081526001602090815260408083206001600160a01b038d16845290915290205491906121f3565b5f610bfa3384846118d1565b6006546001600160a01b031633146112725760405162461bcd60e51b8152600401610b4090613045565b6009546040516001600160a01b03918216918316907fcb24b9cc1975a8c5afd1fcc8deca22156b8f357af3485db1f9382b3c584d671f905f90a3600980546001600160a01b0319166001600160a01b0392909216919091179055565b6006546001600160a01b031633146112f85760405162461bcd60e51b8152600401610b4090613045565b6001600160a01b0382165f818152601d6020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6006546001600160a01b031633146113805760405162461bcd60e51b8152600401610b4090613045565b633b9aca006103e861139160025490565b61139c9060056130c0565b6113a691906130eb565b6113b091906130eb565b81101561140b5760405162461bcd60e51b8152602060048201526024808201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e20604482015263302e352560e01b6064820152608401610b40565b61141981633b9aca006130c0565b60205550565b8342111561146f5760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610b40565b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c988888861149d8c6123d8565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f6114f782612401565b90505f6115068287878761244d565b9050896001600160a01b0316816001600160a01b0316146115695760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610b40565b6115748a8a8a6117ad565b50505050505050505050565b6006546001600160a01b031633146115aa5760405162461bcd60e51b8152600401610b4090613045565b601284905560138390556014829055601581905580826115ca85876130fe565b6115d491906130fe565b6115de91906130fe565b601181905560191015610c725760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420313525206f72206c6573730000006044820152606401610b40565b6006545f906001600160a01b0316331461165f5760405162461bcd60e51b8152600401610b4090613045565b50601c805460ff19169055600190565b6006546001600160a01b031633146116995760405162461bcd60e51b8152600401610b4090613045565b6001600160a01b0381166116fe5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b40565b6006546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b6006546001600160a01b031633146117835760405162461bcd60e51b8152600401610b4090613045565b6001600160a01b03919091165f908152602360205260409020805460ff1916911515919091179055565b6001600160a01b03831661180f5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610b40565b6001600160a01b0382166118705760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610b40565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166118f75760405162461bcd60e51b8152600401610b4090613111565b6001600160a01b03821661191d5760405162461bcd60e51b8152600401610b4090613156565b805f036119345761192f83835f612473565b505050565b601a545f9060ff1615611e37576006546001600160a01b0385811691161480159061196d57506006546001600160a01b03848116911614155b801561198157506001600160a01b03831615155b801561199857506001600160a01b03831661dead14155b80156119ae5750600a54600160b01b900460ff16155b15611e3757600a54600160a01b900460ff16611a46576001600160a01b0384165f908152601d602052604090205460ff1680611a0157506001600160a01b0383165f908152601d602052604090205460ff165b611a465760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610b40565b601c5460ff1615611b43576006546001600160a01b03848116911614801590611a7d57506007546001600160a01b03848116911614155b8015611a9757506008546001600160a01b03848116911614155b15611b4357325f908152601b60205260409020544311611b315760405162461bcd60e51b815260206004820152604960248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b6064820152681030b63637bbb2b21760b91b608482015260a401610b40565b325f908152601b602052604090204390555b6001600160a01b0384165f9081526022602052604090205460ff168015611b8257506001600160a01b0383165f908152601e602052604090205460ff16155b15611c6b57601f54821115611bf75760405162461bcd60e51b815260206004820152603560248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201527436b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760591b6064820152608401610b40565b602054611c18846001600160a01b03165f9081526020819052604090205490565b611c2290846130fe565b1115611c665760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610b40565b611dae565b6001600160a01b0383165f9081526022602052604090205460ff168015611caa57506001600160a01b0384165f908152601e602052604090205460ff16155b15611d2057601f54821115611c665760405162461bcd60e51b815260206004820152603660248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152751036b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760511b6064820152608401610b40565b6001600160a01b0383165f908152601e602052604090205460ff16611dae57602054611d60846001600160a01b03165f9081526020819052604090205490565b611d6a90846130fe565b1115611dae5760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610b40565b6001600160a01b0384165f9081526022602052604090205460ff168015611dd65750600b5415155b8015611de45750600b544311155b15611e37576001600160a01b0383165f908152602360205260409020805460ff19166001179055611e216064611e1b846063612579565b906125f7565b9050610c728484611e328486613199565b612473565b6001600160a01b0384165f9081526023602052604090205460ff1680611e7457506001600160a01b0383165f9081526023602052604090205460ff165b15611e8457610c7284845f612473565b600a54600160a81b900460ff168015611ea75750600a54600160b01b900460ff16155b8015611ecb57506001600160a01b0384165f908152601d602052604090205460ff16155b8015611eef57506001600160a01b0383165f908152601d602052604090205460ff16155b8015611f1357506001600160a01b0384165f9081526022602052604090205460ff16155b15611f4157600a805460ff60b01b1916600160b01b179055611f33612638565b600a805460ff60b01b191690555b600a546001600160a01b0385165f908152601d602052604090205460ff600160b01b909204821615911680611f8d57506001600160a01b0384165f908152601d602052604090205460ff165b15611f9557505f5b5f60185580156121e1576001600160a01b0384165f9081526022602052604090205460ff168015611fc757505f601154115b1561209957611fe66064611e1b6011548661257990919063ffffffff16565b915060115460135483611ff991906130c0565b61200391906130eb565b60175f82825461201391906130fe565b909155505060115460145461202890846130c0565b61203291906130eb565b60185560115460155461204590846130c0565b61204f91906130eb565b60195f82825461205f91906130fe565b909155505060115460125461207490846130c0565b61207e91906130eb565b60165f82825461208e91906130fe565b9091555061218e9050565b6001600160a01b0385165f9081526022602052604090205460ff1680156120c157505f600c54115b1561218e576120e06064611e1b600c548661257990919063ffffffff16565b9150600c54600e54836120f391906130c0565b6120fd91906130eb565b60175f82825461210d91906130fe565b9091555050600c54600f5461212290846130c0565b61212c91906130eb565b601855600c5460105461213f90846130c0565b61214991906130eb565b60195f82825461215991906130fe565b9091555050600c54600d5461216e90846130c0565b61217891906130eb565b60165f82825461218891906130fe565b90915550505b5f6018548361219d9190613199565b11156121bd576121bd8530611e326018548661289e90919063ffffffff16565b601854156121d4576121d48561dead601854612473565b6121de8284613199565b92505b6121ec858585612473565b5050505050565b5f81848411156122165760405162461bcd60e51b8152600401610b409190612e14565b505f6122228486613199565b95945050505050565b5f467f0000000000000000000000000000000000000000000000000000000000000001810361227b577f45a3f33e671a40c32a41506e59cdfa5734b64fa0232fc14132feb6d54af47f1e91505090565b5050604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6020808301919091527f6b1267656e62957bf06a2aee6d0d0f9c6942e8f86971d125ad5aad933aa8bbf1828401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b5f8061232c83856130fe565b90508381101561237e5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610b40565b9392505050565b6001600160a01b0382165f81815260226020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6001600160a01b0381165f9081526005602052604090208054906123fb816128df565b50919050565b5f610bfe61240d61222b565b8360405161190160f01b602082015260228101839052604281018290525f9060620160405160208183030381529060405280519060200120905092915050565b5f805f61245c878787876128fa565b91509150612469816129df565b5095945050505050565b6001600160a01b0383166124995760405162461bcd60e51b8152600401610b4090613111565b6001600160a01b0382166124bf5760405162461bcd60e51b8152600401610b4090613156565b6124fb816040518060600160405280602681526020016132b3602691396001600160a01b0386165f9081526020819052604090205491906121f3565b6001600160a01b038085165f9081526020819052604080822093909355908416815220546125299082612320565b6001600160a01b038381165f818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91016118c4565b5f825f0361258857505f610bfe565b5f61259383856130c0565b9050826125a085836130eb565b1461237e5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610b40565b5f61237e83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612b97565b305f9081526020819052604081205490505f60195460165460175461265d91906130fe565b61266791906130fe565b90505f821580612675575081155b1561267f57505050565b61271061268b60025490565b6126969060056130c0565b6126a091906130eb565b6126ab9060146130c0565b8311156126e1576127106126be60025490565b6126c99060056130c0565b6126d391906130eb565b6126de9060146130c0565b92505b5f600283601754866126f391906130c0565b6126fd91906130eb565b61270791906130eb565b90505f612714858361289e565b90504761272082612bf9565b5f61272b478361289e565b90505f61274787611e1b6016548561257990919063ffffffff16565b90505f61276388611e1b6019548661257990919063ffffffff16565b90505f816127718486613199565b61277b9190613199565b5f601781905560168190556019819055600a546040519293506001600160a01b031691849181818185875af1925050503d805f81146127d5576040519150601f19603f3d011682016040523d82523d5f602084013e6127da565b606091505b509098505086158015906127ed57505f81115b15612840576127fc8782612d49565b601754604080518881526020810184905280820192909252517f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619181900360600190a15b6009546040516001600160a01b039091169047905f81818185875af1925050503d805f811461288a576040519150601f19603f3d011682016040523d82523d5f602084013e61288f565b606091505b50505050505050505050505050565b5f61237e83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506121f3565b6001815f015f8282546128f291906130fe565b909155505050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561292f57505f905060036129d6565b8460ff16601b1415801561294757508460ff16601c14155b1561295757505f905060046129d6565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156129a8573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b0381166129d0575f600192509250506129d6565b91505f90505b94509492505050565b5f8160048111156129f2576129f26131ac565b036129fa5750565b6001816004811115612a0e57612a0e6131ac565b03612a5b5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610b40565b6002816004811115612a6f57612a6f6131ac565b03612abc5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610b40565b6003816004811115612ad057612ad06131ac565b03612b285760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610b40565b6004816004811115612b3c57612b3c6131ac565b03612b945760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610b40565b50565b5f8183612bb75760405162461bcd60e51b8152600401610b409190612e14565b505f612bc384866130eb565b9050612bcf84866131c0565b612bd982866130c0565b612be391906130fe565b8514612bf157612bf16131d3565b949350505050565b6040805160028082526060820183525f9260208301908036833701905050905030815f81518110612c2c57612c2c6131e7565b6001600160a01b03928316602091820292909201810191909152600754604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612c83573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ca791906131fb565b81600181518110612cba57612cba6131e7565b6001600160a01b039283166020918202929092010152600754612ce091309116846117ad565b60075460405163791ac94760e01b81526001600160a01b039091169063791ac94790612d189085905f90869030904290600401613216565b5f604051808303815f87803b158015612d2f575f80fd5b505af1158015612d41573d5f803e3d5ffd5b505050505050565b600754612d619030906001600160a01b0316846117ad565b6007546001600160a01b031663f305d7198230855f80612d896006546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af1158015612def573d5f803e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906121ec9190613287565b5f602080835283518060208501525f5b81811015612e4057858101830151858201604001528201612e24565b505f604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114612b94575f80fd5b5f8060408385031215612e85575f80fd5b8235612e9081612e60565b946020939093013593505050565b5f60208284031215612eae575f80fd5b813561237e81612e60565b5f60208284031215612ec9575f80fd5b5035919050565b5f805f60608486031215612ee2575f80fd5b8335612eed81612e60565b92506020840135612efd81612e60565b929592945050506040919091013590565b5f805f8060808587031215612f21575f80fd5b5050823594602084013594506040840135936060013592509050565b80358015158114612f4c575f80fd5b919050565b5f8060408385031215612f62575f80fd5b8235612f6d81612e60565b9150612f7b60208401612f3d565b90509250929050565b5f60208284031215612f94575f80fd5b61237e82612f3d565b5f805f805f805f60e0888a031215612fb3575f80fd5b8735612fbe81612e60565b96506020880135612fce81612e60565b95506040880135945060608801359350608088013560ff81168114612ff1575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f806040838503121561301f575f80fd5b823561302a81612e60565b9150602083013561303a81612e60565b809150509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c9082168061308e57607f821691505b6020821081036123fb57634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b8082028115828204841417610bfe57610bfe6130ac565b634e487b7160e01b5f52601260045260245ffd5b5f826130f9576130f96130d7565b500490565b80820180821115610bfe57610bfe6130ac565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b81810381811115610bfe57610bfe6130ac565b634e487b7160e01b5f52602160045260245ffd5b5f826131ce576131ce6130d7565b500690565b634e487b7160e01b5f52600160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f6020828403121561320b575f80fd5b815161237e81612e60565b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b818110156132665784516001600160a01b031683529383019391830191600101613241565b50506001600160a01b03969096166060850152505050608001529392505050565b5f805f60608486031215613299575f80fd5b835192506020840151915060408401519050925092509256fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220ac241511640413f0c1bfbdd80033a9ffaf866cfaa199b1a123a8f76c6d964ebb64736f6c63430008180033

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

00000000000000000000000006bedc9bb990e7fb977f982120e83b363812663d00000000000000000000000064a9d140abea1a14d1b63df8f0d8c7b38c55c3df

-----Decoded View---------------
Arg [0] : _RevShareWallet (address): 0x06BeDc9bB990E7fb977f982120E83B363812663d
Arg [1] : _treasuryWallet (address): 0x64a9D140AbeA1a14D1b63DF8F0D8C7b38C55c3df

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000006bedc9bb990e7fb977f982120e83b363812663d
Arg [1] : 00000000000000000000000064a9d140abea1a14d1b63df8f0d8c7b38c55c3df


Deployed Bytecode Sourcemap

40670:15975:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46454:83;;;;;;;;;;;;;:::i;:::-;;31093;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31961:167;;;;;;;;;;-1:-1:-1;31961:167:0;;;;;:::i;:::-;;:::i;:::-;;;1188:14:1;;1181:22;1163:41;;1151:2;1136:18;31961:167:0;1023:187:1;56479:161:0;;;;;;;;;;;;;:::i;46190:117::-;;;;;;;;;;;;;:::i;42019:64::-;;;;;;;;;;-1:-1:-1;42019:64:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;40754:41;;;;;;;;;;-1:-1:-1;40754:41:0;;;;-1:-1:-1;;;;;40754:41:0;;;;;;-1:-1:-1;;;;;1658:32:1;;;1640:51;;1628:2;1613:18;40754:41:0;1467:230:1;31378:100:0;;;;;;;;;;-1:-1:-1;31458:12:0;;31378:100;;;1848:25:1;;;1836:2;1821:18;31378:100:0;1702:177:1;41523:33:0;;;;;;;;;;;;;;;;41563:28;;;;;;;;;;;;;;;;41483:33;;;;;;;;;;;;;;;;45171:232;;;;;;;;;;-1:-1:-1;45171:232:0;;;;;:::i;:::-;;:::i;32136:317::-;;;;;;;;;;-1:-1:-1;32136:317:0;;;;;:::i;:::-;;:::i;40837:53::-;;;;;;;;;;;;40883:6;40837:53;;48526:201;;;;;;;;;;-1:-1:-1;48526:201:0;;;;;:::i;:::-;;:::i;47382:452::-;;;;;;;;;;-1:-1:-1;47382:452:0;;;;;:::i;:::-;;:::i;31279:91::-;;;;;;;;;;-1:-1:-1;31279:91:0;;3300:4:1;31353:9:0;3288:17:1;3270:36;;3258:2;3243:18;31279:91:0;3128:184:1;37061:115:0;;;;;;;;;;;;;:::i;42163:28::-;;;;;;;;;;;;;;;;32461:214;;;;;;;;;;-1:-1:-1;32461:214:0;;;;;:::i;:::-;;:::i;40935:29::-;;;;;;;;;;-1:-1:-1;40935:29:0;;;;-1:-1:-1;;;;;40935:29:0;;;40802:28;;;;;;;;;;-1:-1:-1;40802:28:0;;;;-1:-1:-1;;;;;40802:28:0;;;41639:33;;;;;;;;;;-1:-1:-1;41639:33:0;;;;;;;;48735:125;;;;;;;;;;-1:-1:-1;48735:125:0;;;;;:::i;:::-;-1:-1:-1;;;;;48824:28:0;48800:4;48824:28;;;:19;:28;;;;;;;;;48735:125;41258:29;;;;;;;;;;;;;;;;41300:28;;;;;;;;;;;;;;;;41444:30;;;;;;;;;;;;;;;;41013:31;;;;;;;;;;-1:-1:-1;41013:31:0;;;;-1:-1:-1;;;41013:31:0;;;;;;31486:127;;;;;;;;;;-1:-1:-1;31486:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;31587:18:0;31560:7;31587:18;;;;;;;;;;;;31486:127;29854:148;;;;;;;;;;;;;:::i;45041:120::-;;;;;;;;;;;;;:::i;45632:144::-;;;;;;;;;;-1:-1:-1;45632:144:0;;;;;:::i;:::-;;:::i;41152:30::-;;;;;;;;;;;;;;;;36803:128;;;;;;;;;;-1:-1:-1;36803:128:0;;;;;:::i;:::-;;:::i;46033:149::-;;;;;;;;;;;;;:::i;29212:79::-;;;;;;;;;;-1:-1:-1;29277:6:0;;-1:-1:-1;;;;;29277:6:0;29212:79;;41335:31;;;;;;;;;;;;;;;;47275:99;;;;;;;;;;-1:-1:-1;47275:99:0;;;;;:::i;:::-;;:::i;31184:87::-;;;;;;;;;;;;;:::i;46547:244::-;;;;;;;;;;-1:-1:-1;46547:244:0;;;;;:::i;:::-;;:::i;32683:265::-;;;;;;;;;;-1:-1:-1;32683:265:0;;;;;:::i;:::-;;:::i;31621:173::-;;;;;;;;;;-1:-1:-1;31621:173:0;;;;;:::i;:::-;;:::i;41411:26::-;;;;;;;;;;;;;;;;48317:201;;;;;;;;;;-1:-1:-1;48317:201:0;;;;;:::i;:::-;;:::i;42347:58::-;;;;;;;;;;-1:-1:-1;42347:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;40973:33;;;;;;;;;;-1:-1:-1;40973:33:0;;;;-1:-1:-1;;;40973:33:0;;;;;;46997:182;;;;;;;;;;-1:-1:-1;46997:182:0;;;;;:::i;:::-;;:::i;45411:213::-;;;;;;;;;;-1:-1:-1;45411:213:0;;;;;:::i;:::-;;:::i;41857:39::-;;;;;;;;;;-1:-1:-1;41857:39:0;;;;;;;;42090:35;;;;;;;;;;;;;;;;41598:32;;;;;;;;;;;;;;;;41079:30;;;;;;;;;;;;;;;;36092:645;;;;;;;;;;-1:-1:-1;36092:645:0;;;;;:::i;:::-;;:::i;41118:27::-;;;;;;;;;;;;;;;;31802:151;;;;;;;;;;-1:-1:-1;31802:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;31918:18:0;;;31891:7;31918:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;31802:151;41226:25;;;;;;;;;;;;;;;;47846:463;;;;;;;;;;-1:-1:-1;47846:463:0;;;;;:::i;:::-;;:::i;45841:134::-;;;;;;;;;;;;;:::i;41189:30::-;;;;;;;;;;;;;;;;30157:244;;;;;;;;;;-1:-1:-1;30157:244:0;;;;;:::i;:::-;;:::i;41373:31::-;;;;;;;;;;;;;;;;42132:24;;;;;;;;;;;;;;;;46315:131;;;;;;;;;;-1:-1:-1;46315:131:0;;;;;:::i;:::-;;:::i;40899:29::-;;;;;;;;;;-1:-1:-1;40899:29:0;;;;-1:-1:-1;;;;;40899:29:0;;;46454:83;29424:6;;-1:-1:-1;;;;;29424:6:0;28418:10;29424:22;29416:67;;;;-1:-1:-1;;;29416:67:0;;;;;;;:::i;:::-;;;;;;;;;46509:13:::1;:20:::0;;-1:-1:-1;;;;46509:20:0::1;-1:-1:-1::0;;;46509:20:0::1;::::0;;46454:83::o;31093:::-;31130:13;31163:5;31156:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31093:83;:::o;31961:167::-;32044:4;32061:37;32070:10;32082:7;32091:6;32061:8;:37::i;:::-;-1:-1:-1;32116:4:0;31961:167;;;;;:::o;56479:161::-;29424:6;;-1:-1:-1;;;;;29424:6:0;28418:10;29424:22;29416:67;;;;-1:-1:-1;;;29416:67:0;;;;;;;:::i;:::-;56574:58:::1;::::0;56538:12:::1;::::0;56582:10:::1;::::0;56606:21:::1;::::0;56538:12;56574:58;56538:12;56574:58;56606:21;56582:10;56574:58:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;56479:161:0:o;46190:117::-;29424:6;;-1:-1:-1;;;;;29424:6:0;28418:10;29424:22;29416:67;;;;-1:-1:-1;;;29416:67:0;;;;;;;:::i;:::-;46252:14:::1;::::0;::::1;;46244:23;;;::::0;::::1;;46278:13;:21:::0;;-1:-1:-1;;;;46278:21:0::1;::::0;;46190:117::o;45171:232::-;29424:6;;-1:-1:-1;;;;;29424:6:0;28418:10;29424:22;29416:67;;;;-1:-1:-1;;;29416:67:0;;;;;;;:::i;:::-;45290:3:::1;45284:4;45264:13;31458:12:::0;;;31378:100;45264:13:::1;:17;::::0;45280:1:::1;45264:17;:::i;:::-;:24;;;;:::i;:::-;45263:30;;;;:::i;:::-;45253:6;:40;;45245:100;;;::::0;-1:-1:-1;;;45245:100:0;;7116:2:1;45245: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;;45245:100:0::1;6914:411:1::0;45245:100:0::1;45379:16;:6:::0;45389:5:::1;45379:16;:::i;:::-;45356:20;:39:::0;-1:-1:-1;45171:232:0:o;32136:317::-;32242:4;32259:36;32269:6;32277:9;32288:6;32259:9;:36::i;:::-;32306:117;32315:6;32323:10;32335:87;32371:6;32335:87;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32335:19:0;;;;;;:11;:19;;;;;;;;32355:10;32335:31;;;;;;;;;:87;:35;:87::i;:::-;32306:8;:117::i;:::-;-1:-1:-1;32441:4:0;32136:317;;;;;:::o;48526:201::-;29424:6;;-1:-1:-1;;;;;29424:6:0;28418:10;29424:22;29416:67;;;;-1:-1:-1;;;29416:67:0;;;;;;;:::i;:::-;48659:14:::1;::::0;48618:56:::1;::::0;-1:-1:-1;;;;;48659:14:0;;::::1;::::0;48618:56;::::1;::::0;::::1;::::0;48659:14:::1;::::0;48618:56:::1;48685:14;:34:::0;;-1:-1:-1;;;;;;48685:34:0::1;-1:-1:-1::0;;;;;48685:34:0;;;::::1;::::0;;;::::1;::::0;;48526:201::o;47382:452::-;29424:6;;-1:-1:-1;;;;;29424:6:0;28418:10;29424:22;29416:67;;;;-1:-1:-1;;;29416:67:0;;;;;;;:::i;:::-;47521:15:::1;:31:::0;;;47563:15:::1;:31:::0;;;47605:10:::1;:21:::0;;;47637:14:::1;:29:::0;;;47654:12;47618:8;47692:33:::1;47581:13:::0;47539;47692:33:::1;:::i;:::-;:46;;;;:::i;:::-;:63;;;;:::i;:::-;47677:12;:78:::0;;;47790:2:::1;-1:-1:-1::0;47774:18:0::1;47766:60;;;::::0;-1:-1:-1;;;47766:60:0;;7662:2:1;47766:60:0::1;::::0;::::1;7644:21:1::0;7701:2;7681:18;;;7674:30;7740:31;7720:18;;;7713:59;7789:18;;47766:60:0::1;7460:353:1::0;37061:115:0;37121:7;37148:20;:18;:20::i;:::-;37141:27;;37061:115;:::o;32461:214::-;32575:10;32549:4;32596:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;32596:32:0;;;;;;;;;;32549:4;;32566:79;;32587:7;;32596:48;;32633:10;32596:36;:48::i;29854:148::-;29424:6;;-1:-1:-1;;;;;29424:6:0;28418:10;29424:22;29416:67;;;;-1:-1:-1;;;29416:67:0;;;;;;;:::i;:::-;29945:6:::1;::::0;29924:40:::1;::::0;29961:1:::1;::::0;-1:-1:-1;;;;;29945:6:0::1;::::0;29924:40:::1;::::0;29961:1;;29924:40:::1;29975:6;:19:::0;;-1:-1:-1;;;;;;29975:19:0::1;::::0;;29854:148::o;45041:120::-;29424:6;;45093:4;;-1:-1:-1;;;;;29424:6:0;28418:10;29424:22;29416:67;;;;-1:-1:-1;;;29416:67:0;;;;;;;:::i;:::-;-1:-1:-1;45109:14:0::1;:22:::0;;-1:-1:-1;;45109:22:0::1;::::0;;;45041:120;:::o;45632:144::-;29424:6;;-1:-1:-1;;;;;29424:6:0;28418:10;29424:22;29416:67;;;;-1:-1:-1;;;29416:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;45722:39:0;;;::::1;;::::0;;;:31:::1;:39;::::0;;;;:46;;-1:-1:-1;;45722:46:0::1;::::0;::::1;;::::0;;;::::1;::::0;;45632:144::o;36803:128::-;-1:-1:-1;;;;;36899:14:0;;36872:7;36899:14;;;:7;:14;;;;;27911;36899:24;27819:114;46033:149;29424:6;;-1:-1:-1;;;;;29424:6:0;28418:10;29424:22;29416:67;;;;-1:-1:-1;;;29416:67:0;;;;;;;:::i;:::-;46088:13:::1;:20:::0;;-1:-1:-1;;;;46119:18:0;-1:-1:-1;;;46119:18:0;;;46162:12:::1;46148:11;:26:::0;46033:149::o;47275:99::-;29424:6;;-1:-1:-1;;;;;29424:6:0;28418:10;29424:22;29416:67;;;;-1:-1:-1;;;29416:67:0;;;;;;;:::i;:::-;47345:11:::1;:21:::0;;;::::1;;-1:-1:-1::0;;;47345:21:0::1;-1:-1:-1::0;;;;47345:21:0;;::::1;::::0;;;::::1;::::0;;47275:99::o;31184:87::-;31223:13;31256:7;31249:14;;;;;:::i;46547:244::-;29424:6;;-1:-1:-1;;;;;29424:6:0;28418:10;29424:22;29416:67;;;;-1:-1:-1;;;29416:67:0;;;;;;;:::i;:::-;46654:13:::1;::::0;-1:-1:-1;;;;;46654:13:0;;::::1;46646:21:::0;;::::1;::::0;46638:91:::1;;;::::0;-1:-1:-1;;;46638:91:0;;8020:2:1;46638: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;;46638:91:0::1;7818:421:1::0;46638:91:0::1;46742:41;46771:4;46777:5;46742:28;:41::i;:::-;46547:244:::0;;:::o;32683:265::-;32776:4;32793:125;32802:10;32814:7;32823:94;32860:15;32823:94;;;;;;;;;;;;;;;;;32835:10;32823:23;;;;:11;:23;;;;;;;;-1:-1:-1;;;;;32823:32:0;;;;;;;;;;;:94;:36;:94::i;31621:173::-;31707:4;31724:40;31734:10;31746:9;31757:6;31724:9;:40::i;48317:201::-;29424:6;;-1:-1:-1;;;;;29424:6:0;28418:10;29424:22;29416:67;;;;-1:-1:-1;;;29416:67:0;;;;;;;:::i;:::-;48450:14:::1;::::0;48409:56:::1;::::0;-1:-1:-1;;;;;48450:14:0;;::::1;::::0;48409:56;::::1;::::0;::::1;::::0;48450:14:::1;::::0;48409:56:::1;48476:14;:34:::0;;-1:-1:-1;;;;;;48476:34:0::1;-1:-1:-1::0;;;;;48476:34:0;;;::::1;::::0;;;::::1;::::0;;48317:201::o;46997:182::-;29424:6;;-1:-1:-1;;;;;29424:6:0;28418:10;29424:22;29416:67;;;;-1:-1:-1;;;29416:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;47082:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;47082:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;47137:34;;1163:41:1;;;47137:34:0::1;::::0;1136:18:1;47137:34:0::1;;;;;;;46997:182:::0;;:::o;45411:213::-;29424:6;;-1:-1:-1;;;;;29424:6:0;28418:10;29424:22;29416:67;;;;-1:-1:-1;;;29416:67:0;;;;;;;:::i;:::-;45533:3:::1;45527:4;45507:13;31458:12:::0;;;31378:100;45507:13:::1;:17;::::0;45523:1:::1;45507:17;:::i;:::-;:24;;;;:::i;:::-;45506:30;;;;:::i;:::-;45496:6;:40;;45488:89;;;::::0;-1:-1:-1;;;45488:89:0;;8446:2:1;45488: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;;45488:89:0::1;8244:400:1::0;45488:89:0::1;45600:16;:6:::0;45610:5:::1;45600:16;:::i;:::-;45588:9;:28:::0;-1:-1:-1;45411:213:0:o;36092:645::-;36336:8;36317:15;:27;;36309:69;;;;-1:-1:-1;;;36309:69:0;;8851:2:1;36309:69:0;;;8833:21:1;8890:2;8870:18;;;8863:30;8929:31;8909:18;;;8902:59;8978:18;;36309:69:0;8649:353:1;36309:69:0;36391:18;36433:16;36451:5;36458:7;36467:5;36474:16;36484:5;36474:9;:16::i;:::-;36422: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;;36422:79:0;;;;;;;;;;;;36412:90;;;;;;36391:111;;36515:12;36530:28;36547:10;36530:16;:28::i;:::-;36515:43;;36571:14;36588:28;36602:4;36608:1;36611;36614;36588:13;:28::i;:::-;36571:45;;36645:5;-1:-1:-1;;;;;36635:15:0;:6;-1:-1:-1;;;;;36635:15:0;;36627:58;;;;-1:-1:-1;;;36627:58:0;;9805:2:1;36627:58:0;;;9787:21:1;9844:2;9824:18;;;9817:30;9883:32;9863:18;;;9856:60;9933:18;;36627:58:0;9603:354:1;36627:58:0;36698:31;36707:5;36714:7;36723:5;36698:8;:31::i;:::-;36298:439;;;36092:645;;;;;;;:::o;47846:463::-;29424:6;;-1:-1:-1;;;;;29424:6:0;28418:10;29424:22;29416:67;;;;-1:-1:-1;;;29416:67:0;;;;;;;:::i;:::-;47986:16:::1;:32:::0;;;48029:16:::1;:32:::0;;;48072:11:::1;:22:::0;;;48105:15:::1;:30:::0;;;48123:12;48086:8;48162:35:::1;48048:13:::0;48005;48162:35:::1;:::i;:::-;:49;;;;:::i;:::-;:67;;;;:::i;:::-;48146:13;:83:::0;;;48265:2:::1;-1:-1:-1::0;48248:19:0::1;48240:61;;;::::0;-1:-1:-1;;;48240:61:0;;7662:2:1;48240:61:0::1;::::0;::::1;7644:21:1::0;7701:2;7681:18;;;7674:30;7740:31;7720:18;;;7713:59;7789:18;;48240:61:0::1;7460:353:1::0;45841:134:0;29424:6;;45901:4;;-1:-1:-1;;;;;29424:6:0;28418:10;29424:22;29416:67;;;;-1:-1:-1;;;29416:67:0;;;;;;;:::i;:::-;-1:-1:-1;45917:20:0::1;:28:::0;;-1:-1:-1;;45917:28:0::1;::::0;;;45841:134;:::o;30157:244::-;29424:6;;-1:-1:-1;;;;;29424:6:0;28418:10;29424:22;29416:67;;;;-1:-1:-1;;;29416:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;30246:22:0;::::1;30238:73;;;::::0;-1:-1:-1;;;30238:73:0;;10164:2:1;30238: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;;30238:73:0::1;9962:402:1::0;30238:73:0::1;30348:6;::::0;30327:38:::1;::::0;-1:-1:-1;;;;;30327:38:0;;::::1;::::0;30348:6:::1;::::0;30327:38:::1;::::0;30348:6:::1;::::0;30327:38:::1;30376:6;:17:::0;;-1:-1:-1;;;;;;30376:17:0::1;-1:-1:-1::0;;;;;30376:17:0;;;::::1;::::0;;;::::1;::::0;;30157:244::o;46315:131::-;29424:6;;-1:-1:-1;;;;;29424:6:0;28418:10;29424:22;29416:67;;;;-1:-1:-1;;;29416:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;46405:23:0;;;::::1;;::::0;;;:17:::1;:23;::::0;;;;:33;;-1:-1:-1;;46405:33:0::1;::::0;::::1;;::::0;;;::::1;::::0;;46315:131::o;34311:346::-;-1:-1:-1;;;;;34413:19:0;;34405:68;;;;-1:-1:-1;;;34405:68:0;;10571:2:1;34405: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;;34405:68:0;10369:400:1;34405:68:0;-1:-1:-1;;;;;34492:21:0;;34484:68;;;;-1:-1:-1;;;34484:68:0;;10976:2:1;34484: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;;34484:68:0;10774:398:1;34484:68:0;-1:-1:-1;;;;;34565:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;34617:32;;1848:25:1;;;34617:32:0;;1821:18:1;34617:32:0;;;;;;;;34311:346;;;:::o;48868:4763::-;-1:-1:-1;;;;;49000:18:0;;48992:68;;;;-1:-1:-1;;;48992:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;49079:16:0;;49071:64;;;;-1:-1:-1;;;49071:64:0;;;;;;;:::i;:::-;49160:6;49170:1;49160:11;49157:92;;49188:28;49204:4;49210:2;49214:1;49188:15;:28::i;:::-;48868:4763;;;:::o;49157:92::-;49291:14;;49259:12;;49291:14;;49288:2180;;;29277:6;;-1:-1:-1;;;;;49343:15:0;;;29277:6;;49343:15;;;;:49;;-1:-1:-1;29277:6:0;;-1:-1:-1;;;;;49379:13:0;;;29277:6;;49379:13;;49343:49;:86;;;;-1:-1:-1;;;;;;49413:16:0;;;;49343:86;:128;;;;-1:-1:-1;;;;;;49450:21:0;;49464:6;49450:21;;49343:128;:158;;;;-1:-1:-1;49493:8:0;;-1:-1:-1;;;49493:8:0;;;;49492:9;49343:158;49321:2136;;;49539:13;;-1:-1:-1;;;49539:13:0;;;;49535:148;;-1:-1:-1;;;;;49584:25:0;;;;;;:19;:25;;;;;;;;;:52;;-1:-1:-1;;;;;;49613:23:0;;;;;;:19;:23;;;;;;;;49584:52;49576:87;;;;-1:-1:-1;;;49576:87:0;;12189:2:1;49576:87:0;;;12171:21:1;12228:2;12208:18;;;12201:30;-1:-1:-1;;;12247:18:1;;;12240:52;12309:18;;49576:87:0;11987:346:1;49576:87:0;49841:20;;;;49837:423;;;29277:6;;-1:-1:-1;;;;;49889:13:0;;;29277:6;;49889:13;;;;:47;;-1:-1:-1;49920:15:0;;-1:-1:-1;;;;;49906:30:0;;;49920:15;;49906:30;;49889:47;:79;;;;-1:-1:-1;49954:13:0;;-1:-1:-1;;;;;49940:28:0;;;49954:13;;49940:28;;49889:79;49885:356;;;50033:9;50004:39;;;;:28;:39;;;;;;50046:12;-1:-1:-1;49996:140:0;;;;-1:-1:-1;;;49996:140:0;;12540:2:1;49996: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;;49996:140:0;12338:477:1;49996:140:0;50192:9;50163:39;;;;:28;:39;;;;;50205:12;50163:54;;49885:356;-1:-1:-1;;;;;50314:31:0;;;;;;:25;:31;;;;;;;;:71;;;;-1:-1:-1;;;;;;50350:35:0;;;;;;:31;:35;;;;;;;;50349:36;50314:71;50310:762;;;50432:20;;50422:6;:30;;50414:96;;;;-1:-1:-1;;;50414:96:0;;13022:2:1;50414: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;;50414:96:0;12820:417:1;50414:96:0;50571:9;;50554:13;50564:2;-1:-1:-1;;;;;31587:18:0;31560:7;31587:18;;;;;;;;;;;;31486:127;50554:13;50545:22;;:6;:22;:::i;:::-;:35;;50537:67;;;;-1:-1:-1;;;50537:67:0;;13444:2:1;50537:67:0;;;13426:21:1;13483:2;13463:18;;;13456:30;-1:-1:-1;;;13502:18:1;;;13495:49;13561:18;;50537:67:0;13242:343:1;50537:67:0;50310:762;;;-1:-1:-1;;;;;50682:29:0;;;;;;:25;:29;;;;;;;;:71;;;;-1:-1:-1;;;;;;50716:37:0;;;;;;:31;:37;;;;;;;;50715:38;50682:71;50678:394;;;50800:20;;50790:6;:30;;50782:97;;;;-1:-1:-1;;;50782:97:0;;13792:2:1;50782: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;;50782:97:0;13590:418:1;50678:394:0;-1:-1:-1;;;;;50926:35:0;;;;;;:31;:35;;;;;;;;50922:150;;51019:9;;51002:13;51012:2;-1:-1:-1;;;;;31587:18:0;31560:7;31587:18;;;;;;;;;;;;31486:127;51002:13;50993:22;;:6;:22;:::i;:::-;:35;;50985:67;;;;-1:-1:-1;;;50985:67:0;;13444:2:1;50985:67:0;;;13426:21:1;13483:2;13463:18;;;13456:30;-1:-1:-1;;;13502:18:1;;;13495:49;13561:18;;50985:67:0;13242:343:1;50985:67:0;-1:-1:-1;;;;;51145:31:0;;;;;;:25;:31;;;;;;;;:51;;;;-1:-1:-1;51180:11:0;;:16;;51145:51;:82;;;;;51216:11;;51200:12;:27;;51145:82;51141:301;;;-1:-1:-1;;;;;51251:21:0;;;;;;:17;:21;;;;;:28;;-1:-1:-1;;51251:28:0;51275:4;51251:28;;;51309:23;51328:3;51309:14;:6;51320:2;51309:10;:14::i;:::-;:18;;:23::i;:::-;51302:30;-1:-1:-1;51355:38:0;51371:4;51377:2;51381:11;51302:30;51381:6;:11;:::i;:::-;51355:15;:38::i;51141:301::-;-1:-1:-1;;;;;51484:23:0;;;;;;:17;:23;;;;;;;;;:48;;-1:-1:-1;;;;;;51511:21:0;;;;;;:17;:21;;;;;;;;51484:48;51480:129;;;51548:28;51564:4;51570:2;51574:1;51548:15;:28::i;51480:129::-;51641:11;;-1:-1:-1;;;51641:11:0;;;;:37;;;;-1:-1:-1;51670:8:0;;-1:-1:-1;;;51670:8:0;;;;51669:9;51641:37;:80;;;;-1:-1:-1;;;;;;51696:25:0;;;;;;:19;:25;;;;;;;;51695:26;51641:80;:121;;;;-1:-1:-1;;;;;;51739:23:0;;;;;;:19;:23;;;;;;;;51738:24;51641:121;:170;;;;-1:-1:-1;;;;;;51780:31:0;;;;;;:25;:31;;;;;;;;51779:32;51641:170;51623:314;;;51838:8;:15;;-1:-1:-1;;;;51838:15:0;-1:-1:-1;;;51838:15:0;;;51882:10;:8;:10::i;:::-;51909:8;:16;;-1:-1:-1;;;;51909:16:0;;;51623:314;51975:8;;-1:-1:-1;;;;;52084:25:0;;51959:12;52084:25;;;:19;:25;;;;;;51975:8;-1:-1:-1;;;51975:8:0;;;;;51974:9;;52084:25;;:52;;-1:-1:-1;;;;;;52113:23:0;;;;;;:19;:23;;;;;;;;52084:52;52081:99;;;-1:-1:-1;52163:5:0;52081:99;52216:1;52200:13;:17;52302:1276;;;;-1:-1:-1;;;;;52356:29:0;;;;;;:25;:29;;;;;;;;:50;;;;;52405:1;52389:13;;:17;52356:50;52352:904;;;52433:34;52463:3;52433:25;52444:13;;52433:6;:10;;:25;;;;:::i;:34::-;52426:41;;52534:13;;52515:16;;52508:4;:23;;;;:::i;:::-;:39;;;;:::i;:::-;52486:18;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;;52603:13:0;;52589:11;;52582:18;;:4;:18;:::i;:::-;:34;;;;:::i;:::-;52566:13;:50;52681:13;;52663:15;;52656:22;;:4;:22;:::i;:::-;:38;;;;:::i;:::-;52635:17;;:59;;;;;;;:::i;:::-;;;;-1:-1:-1;;52761:13:0;;52742:16;;52735:23;;:4;:23;:::i;:::-;:39;;;;:::i;:::-;52713:18;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;52352:904:0;;-1:-1:-1;52352:904:0;;-1:-1:-1;;;;;52835:31:0;;;;;;:25;:31;;;;;;;;:51;;;;;52885:1;52870:12;;:16;52835:51;52832:424;;;52911:33;52940:3;52911:24;52922:12;;52911:6;:10;;:24;;;;:::i;:33::-;52904:40;;53007:12;;52989:15;;52982:4;:22;;;;:::i;:::-;:37;;;;:::i;:::-;52960:18;;:59;;;;;;;:::i;:::-;;;;-1:-1:-1;;53074:12:0;;53061:10;;53054:17;;:4;:17;:::i;:::-;:32;;;;:::i;:::-;53038:13;:48;53150:12;;53133:14;;53126:21;;:4;:21;:::i;:::-;:36;;;;:::i;:::-;53105:17;;:57;;;;;;;:::i;:::-;;;;-1:-1:-1;;53228:12:0;;53210:15;;53203:22;;:4;:22;:::i;:::-;:37;;;;:::i;:::-;53181:18;;:59;;;;;;;:::i;:::-;;;;-1:-1:-1;;52832:424:0;53308:1;53292:13;;53287:4;:18;;;;:::i;:::-;:22;53284:126;;;53333:61;53349:4;53363;53370:23;53379:13;;53370:4;:8;;:23;;;;:::i;53333:61::-;53428:13;;:17;53424:106;;53465:49;53481:4;40883:6;53500:13;;53465:15;:49::i;:::-;53552:14;53562:4;53552:14;;:::i;:::-;;;52302:1276;53590:33;53606:4;53612:2;53616:6;53590:15;:33::i;:::-;48981:4650;;48868:4763;;;:::o;19218:192::-;19304:7;19340:12;19332:6;;;;19324:29;;;;-1:-1:-1;;;19324:29:0;;;;;;;;:::i;:::-;-1:-1:-1;19364:9:0;19376:5;19380:1;19376;:5;:::i;:::-;19364:17;19218:192;-1:-1:-1;;;;;19218:192:0:o;3356:370::-;3409:7;3492:9;3539:16;3528:27;;3524:195;;3579:24;3572:31;;;3356:370;:::o;3524:195::-;-1:-1:-1;;4008:67:0;;;3665:10;4008:67;;;;15487:25:1;;;;3677:12:0;15528:18:1;;;15521:34;3691:15:0;15571:18:1;;;15564:34;3959:9:0;15614:18:1;;;15607:34;4069:4:0;15657:19:1;;;;15650:61;;;;4008:67:0;;;;;;;;;;15459:19:1;;;;4008:67:0;;;3998:78;;;;;;3356:370::o;18885:181::-;18943:7;;18975:5;18979:1;18975;:5;:::i;:::-;18963:17;;19004:1;18999;:6;;18991:46;;;;-1:-1:-1;;;18991:46:0;;14348:2:1;18991:46:0;;;14330:21:1;14387:2;14367:18;;;14360:30;14426:29;14406:18;;;14399:57;14473:18;;18991:46:0;14146:351:1;18991:46:0;19057:1;18885:181;-1:-1:-1;;;18885:181:0:o;46799:188::-;-1:-1:-1;;;;;46882:31:0;;;;;;:25;:31;;;;;;:39;;-1:-1:-1;;46882:39:0;;;;;;;;;;46939:40;;46882:39;;:31;46939:40;;;46799:188;;:::o;37314:207::-;-1:-1:-1;;;;;37435:14:0;;37374:15;37435:14;;;:7;:14;;;;;27911;;;37496:17;37435:14;37496:15;:17::i;:::-;37391:130;37314:207;;;:::o;4726:167::-;4803:7;4830:55;4852:20;:18;:20::i;:::-;4874:10;18650:57;;-1:-1:-1;;;18650:57:0;;;15980:27:1;16023:11;;;16016:27;;;16059:12;;;16052:28;;;18613:7:0;;16096:12:1;;18650:57:0;;;;;;;;;;;;18640:68;;;;;;18633:75;;18520:196;;;;;17322:279;17450:7;17471:17;17490:18;17512:25;17523:4;17529:1;17532;17535;17512:10;:25::i;:::-;17470:67;;;;17548:18;17560:5;17548:11;:18::i;:::-;-1:-1:-1;17584:9:0;17322:279;-1:-1:-1;;;;;17322:279:0:o;32956:539::-;-1:-1:-1;;;;;33062:20:0;;33054:70;;;;-1:-1:-1;;;33054:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;33143:23:0;;33135:71;;;;-1:-1:-1;;;33135:71:0;;;;;;;:::i;:::-;33299;33321:6;33299:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33299:17:0;;:9;:17;;;;;;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;33279:17:0;;;:9;:17;;;;;;;;;;;:91;;;;33404:20;;;;;;;:32;;33429:6;33404:24;:32::i;:::-;-1:-1:-1;;;;;33381:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;33452:35;1848:25:1;;;33381:20:0;;33452:35;;;;;;1821:18:1;33452:35:0;1702:177:1;19418:250:0;19476:7;19500:1;19505;19500:6;19496:47;;-1:-1:-1;19530:1:0;19523:8;;19496:47;19555:9;19567:5;19571:1;19567;:5;:::i;:::-;19555:17;-1:-1:-1;19600:1:0;19591:5;19595:1;19555:17;19591:5;:::i;:::-;:10;19583:56;;;;-1:-1:-1;;;19583:56:0;;14704:2:1;19583: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;;19583:56:0;14502:397:1;19676:132:0;19734:7;19761:39;19765:1;19768;19761:39;;;;;;;;;;;;;;;;;:3;:39::i;54773:1698::-;54856:4;54812:23;31587:18;;;;;;;;;;;54812:50;;54873:25;54943:17;;54922:18;;54901;;:39;;;;:::i;:::-;:59;;;;:::i;:::-;54873:87;-1:-1:-1;54971:12:0;55007:20;;;:46;;-1:-1:-1;55031:22:0;;55007:46;55004:60;;;55056:7;;;54773:1698::o;55004:60::-;55125:5;55105:13;31458:12;;;31378:100;55105:13;:17;;55121:1;55105:17;:::i;:::-;:25;;;;:::i;:::-;:30;;55133:2;55105:30;:::i;:::-;55087:15;:48;55084:125;;;55187:5;55167:13;31458:12;;;31378:100;55167:13;:17;;55183:1;55167:17;:::i;:::-;:25;;;;:::i;:::-;:30;;55195:2;55167:30;:::i;:::-;55149:48;;55084:125;55268:23;55353:1;55333:17;55312:18;;55294:15;:36;;;;:::i;:::-;:56;;;;:::i;:::-;:60;;;;:::i;:::-;55268:86;-1:-1:-1;55365:26:0;55394:36;:15;55268:86;55394:19;:36::i;:::-;55365:65;-1:-1:-1;55479:21:0;55513:36;55365:65;55513:16;:36::i;:::-;55573:18;55594:44;:21;55620:17;55594:25;:44::i;:::-;55573:65;;55661:23;55687:57;55726:17;55687:34;55702:18;;55687:10;:14;;:34;;;;:::i;:57::-;55661:83;;55755:22;55780:56;55818:17;55780:33;55795:17;;55780:10;:14;;:33;;;;:::i;:56::-;55755:81;-1:-1:-1;55857:23:0;55755:81;55883:28;55896:15;55883:10;:28;:::i;:::-;:45;;;;:::i;:::-;55972:1;55951:18;:22;;;55984:18;:22;;;56017:17;:21;;;56080:14;;56072:55;;55857:71;;-1:-1:-1;;;;;;56080:14:0;;56108;;56072:55;55972:1;56072:55;56108:14;56080;56072:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56059:68:0;;-1:-1:-1;;56151:19:0;;;;;:42;;;56192:1;56174:15;:19;56151:42;56148:210;;;56209:46;56222:15;56239;56209:12;:46::i;:::-;56327:18;;56275:71;;;15106:25:1;;;15162:2;15147:18;;15140:34;;;15190:18;;;15183:34;;;;56275:71:0;;;;;;15094:2:1;56275:71:0;;;56148:210;56409:14;;56401:62;;-1:-1:-1;;;;;56409:14:0;;;;56437:21;;56401:62;;;;56437:21;56409:14;56401:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;54773:1698:0:o;19074:136::-;19132:7;19159:43;19163:1;19166;19159:43;;;;;;;;;;;;;;;;;:3;:43::i;27941:181::-;28113:1;28095:7;:14;;;:19;;;;;;;:::i;:::-;;;;-1:-1:-1;;;27941:181:0:o;15551:1632::-;15682:7;;16616:66;16603:79;;16599:163;;;-1:-1:-1;16715:1:0;;-1:-1:-1;16719:30:0;16699:51;;16599:163;16776:1;:7;;16781:2;16776:7;;:18;;;;;16787:1;:7;;16792:2;16787:7;;16776:18;16772:102;;;-1:-1:-1;16827:1:0;;-1:-1:-1;16831:30:0;16811:51;;16772:102;16988:24;;;16971:14;16988:24;;;;;;;;;16346:25:1;;;16419:4;16407:17;;16387:18;;;16380:45;;;;16441:18;;;16434:34;;;16484:18;;;16477:34;;;16988:24:0;;16318:19:1;;16988:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;16988:24:0;;-1:-1:-1;;16988:24:0;;;-1:-1:-1;;;;;;;17027:20:0;;17023:103;;17080:1;17084:29;17064:50;;;;;;;17023:103;17146:6;-1:-1:-1;17154:20:0;;-1:-1:-1;15551:1632:0;;;;;;;;:::o;10213:643::-;10291:20;10282:5;:29;;;;;;;;:::i;:::-;;10278:571;;10213:643;:::o;10278:571::-;10389:29;10380:5;:38;;;;;;;;:::i;:::-;;10376:473;;10435:34;;-1:-1:-1;;;10435:34:0;;16856:2:1;10435:34:0;;;16838:21:1;16895:2;16875:18;;;16868:30;16934:26;16914:18;;;16907:54;16978:18;;10435:34:0;16654:348:1;10376:473:0;10500:35;10491:5;:44;;;;;;;;:::i;:::-;;10487:362;;10552:41;;-1:-1:-1;;;10552:41:0;;17209:2:1;10552:41:0;;;17191:21:1;17248:2;17228:18;;;17221:30;17287:33;17267:18;;;17260:61;17338:18;;10552:41:0;17007:355:1;10487:362:0;10624:30;10615:5;:39;;;;;;;;:::i;:::-;;10611:238;;10671:44;;-1:-1:-1;;;10671:44:0;;17569:2:1;10671: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;;10671:44:0;17367:398:1;10611:238:0;10746:30;10737:5;:39;;;;;;;;:::i;:::-;;10733:116;;10793:44;;-1:-1:-1;;;10793:44:0;;17972:2:1;10793: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;;10793:44:0;17770:398:1;10733:116:0;10213:643;:::o;19816:275::-;19902:7;19937:12;19930:5;19922:28;;;;-1:-1:-1;;;19922:28:0;;;;;;;;:::i;:::-;-1:-1:-1;19961:9:0;19973:5;19977:1;19973;:5;:::i;:::-;19961:17;-1:-1:-1;20009:5:0;20013:1;20009;:5;:::i;:::-;20001;20005:1;20001;:5;:::i;:::-;:13;;;;:::i;:::-;19996:1;:18;19989:26;;;;:::i;:::-;20082:1;19816:275;-1:-1:-1;;;;19816:275:0:o;53639:601::-;53791:16;;;53805:1;53791:16;;;;;;;;53767:21;;53791:16;;;;;;;;;;-1:-1:-1;53791:16:0;53767:40;;53836:4;53818;53823:1;53818:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;53818:23:0;;;:7;;;;;;;;;;:23;;;;53862:15;;:22;;;-1:-1:-1;;;53862:22:0;;;;:15;;;;;:20;;:22;;;;;53818:7;;53862:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53852:4;53857:1;53852:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;53852:32:0;;;:7;;;;;;;;;:32;53929:15;;53897:62;;53914:4;;53929:15;53947:11;53897:8;:62::i;:::-;53998:15;;:224;;-1:-1:-1;;;53998:224:0;;-1:-1:-1;;;;;53998:15:0;;;;:66;;:224;;54079:11;;53998:15;;54149:4;;54176;;54196:15;;53998:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53694:546;53639:601;:::o;54250:513::-;54430:15;;54398:62;;54415:4;;-1:-1:-1;;;;;54430:15:0;54448:11;54398:8;:62::i;:::-;54503:15;;-1:-1:-1;;;;;54503:15:0;:31;54542:9;54575:4;54595:11;54503:15;;54707:7;29277:6;;-1:-1:-1;;;;;29277:6:0;;29212:79;54707:7;54503:252;;;;;;-1:-1:-1;;;;;;54503:252:0;;;-1:-1:-1;;;;;20286:15:1;;;54503:252:0;;;20268:34:1;20318:18;;;20311:34;;;;20361:18;;;20354:34;;;;20404:18;;;20397:34;20468:15;;;20447:19;;;20440:44;54729:15:0;20500:19:1;;;20493:35;20202:19;;54503: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://ac241511640413f0c1bfbdd80033a9ffaf866cfaa199b1a123a8f76c6d964ebb
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.