ETH Price: $3,189.12 (+1.81%)
 

Overview

Max Total Supply

50 AFFINITY

Holders

45

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
booknerd.eth
Balance
1 AFFINITY
0xb5326f4de1b96b458cdd0c38841db6777e607d20
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:
AffinityCollective

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-07-29
*/

// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.13;




/// @notice Modern, minimalist, and gas efficient ERC-721 implementation.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC721.sol)
abstract contract ERC721 {
    /*//////////////////////////////////////////////////////////////
                                 EVENTS
    //////////////////////////////////////////////////////////////*/

    event Transfer(address indexed from, address indexed to, uint256 indexed id);

    event Approval(address indexed owner, address indexed spender, uint256 indexed id);

    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /*//////////////////////////////////////////////////////////////
                         METADATA STORAGE/LOGIC
    //////////////////////////////////////////////////////////////*/

    string public name;

    string public symbol;

    function tokenURI(uint256 id) public view virtual returns (string memory);

    /*//////////////////////////////////////////////////////////////
                      ERC721 BALANCE/OWNER STORAGE
    //////////////////////////////////////////////////////////////*/

    mapping(uint256 => address) internal _ownerOf;

    mapping(address => uint256) internal _balanceOf;

    function ownerOf(uint256 id) public view virtual returns (address owner) {
        require((owner = _ownerOf[id]) != address(0), "NOT_MINTED");
    }

    function balanceOf(address owner) public view virtual returns (uint256) {
        require(owner != address(0), "ZERO_ADDRESS");

        return _balanceOf[owner];
    }

    /*//////////////////////////////////////////////////////////////
                         ERC721 APPROVAL STORAGE
    //////////////////////////////////////////////////////////////*/

    mapping(uint256 => address) public getApproved;

    mapping(address => mapping(address => bool)) public isApprovedForAll;

    /*//////////////////////////////////////////////////////////////
                               CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/

    constructor(string memory _name, string memory _symbol) {
        name = _name;
        symbol = _symbol;
    }

    /*//////////////////////////////////////////////////////////////
                              ERC721 LOGIC
    //////////////////////////////////////////////////////////////*/

    function approve(address spender, uint256 id) public virtual {
        address owner = _ownerOf[id];

        require(msg.sender == owner || isApprovedForAll[owner][msg.sender], "NOT_AUTHORIZED");

        getApproved[id] = spender;

        emit Approval(owner, spender, id);
    }

    function setApprovalForAll(address operator, bool approved) public virtual {
        isApprovedForAll[msg.sender][operator] = approved;

        emit ApprovalForAll(msg.sender, operator, approved);
    }

    function transferFrom(
        address from,
        address to,
        uint256 id
    ) public virtual {
        require(from == _ownerOf[id], "WRONG_FROM");

        require(to != address(0), "INVALID_RECIPIENT");

        require(
            msg.sender == from || isApprovedForAll[from][msg.sender] || msg.sender == getApproved[id],
            "NOT_AUTHORIZED"
        );

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        unchecked {
            _balanceOf[from]--;

            _balanceOf[to]++;
        }

        _ownerOf[id] = to;

        delete getApproved[id];

        emit Transfer(from, to, id);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 id
    ) public virtual {
        transferFrom(from, to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, "") ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        bytes calldata data
    ) public virtual {
        transferFrom(from, to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, data) ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    /*//////////////////////////////////////////////////////////////
                              ERC165 LOGIC
    //////////////////////////////////////////////////////////////*/

    function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
        return
            interfaceId == 0x01ffc9a7 || // ERC165 Interface ID for ERC165
            interfaceId == 0x80ac58cd || // ERC165 Interface ID for ERC721
            interfaceId == 0x5b5e139f; // ERC165 Interface ID for ERC721Metadata
    }

    /*//////////////////////////////////////////////////////////////
                        INTERNAL MINT/BURN LOGIC
    //////////////////////////////////////////////////////////////*/

    function _mint(address to, uint256 id) internal virtual {
        require(to != address(0), "INVALID_RECIPIENT");

        require(_ownerOf[id] == address(0), "ALREADY_MINTED");

        // Counter overflow is incredibly unrealistic.
        unchecked {
            _balanceOf[to]++;
        }

        _ownerOf[id] = to;

        emit Transfer(address(0), to, id);
    }

    function _burn(uint256 id) internal virtual {
        address owner = _ownerOf[id];

        require(owner != address(0), "NOT_MINTED");

        // Ownership check above ensures no underflow.
        unchecked {
            _balanceOf[owner]--;
        }

        delete _ownerOf[id];

        delete getApproved[id];

        emit Transfer(owner, address(0), id);
    }

    /*//////////////////////////////////////////////////////////////
                        INTERNAL SAFE MINT LOGIC
    //////////////////////////////////////////////////////////////*/

    function _safeMint(address to, uint256 id) internal virtual {
        _mint(to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, "") ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    function _safeMint(
        address to,
        uint256 id,
        bytes memory data
    ) internal virtual {
        _mint(to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, data) ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }
}

/// @notice A generic interface for a contract which properly accepts ERC721 tokens.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC721.sol)
abstract contract ERC721TokenReceiver {
    function onERC721Received(
        address,
        address,
        uint256,
        bytes calldata
    ) external virtual returns (bytes4) {
        return ERC721TokenReceiver.onERC721Received.selector;
    }
}


// OpenZeppelin Contracts (last updated v4.7.0) (token/common/ERC2981.sol)




// OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol)




// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)



/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}


/**
 * @dev Interface for the NFT Royalty Standard.
 *
 * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
 * support for royalty payments across all NFT marketplaces and ecosystem participants.
 *
 * _Available since v4.5._
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
     * exchange. The royalty amount is denominated and should be paid in that same unit of exchange.
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)





/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}


/**
 * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information.
 *
 * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for
 * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.
 *
 * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the
 * fee is specified in basis points by default.
 *
 * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See
 * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to
 * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.
 *
 * _Available since v4.5._
 */
abstract contract ERC2981 is IERC2981, ERC165 {
    struct RoyaltyInfo {
        address receiver;
        uint96 royaltyFraction;
    }

    RoyaltyInfo private _defaultRoyaltyInfo;
    mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo;

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) {
        return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @inheritdoc IERC2981
     */
    function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) {
        RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId];

        if (royalty.receiver == address(0)) {
            royalty = _defaultRoyaltyInfo;
        }

        uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator();

        return (royalty.receiver, royaltyAmount);
    }

    /**
     * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a
     * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an
     * override.
     */
    function _feeDenominator() internal pure virtual returns (uint96) {
        return 10000;
    }

    /**
     * @dev Sets the royalty information that all ids in this contract will default to.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: invalid receiver");

        _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Removes default royalty information.
     */
    function _deleteDefaultRoyalty() internal virtual {
        delete _defaultRoyaltyInfo;
    }

    /**
     * @dev Sets the royalty information for a specific token id, overriding the global default.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setTokenRoyalty(
        uint256 tokenId,
        address receiver,
        uint96 feeNumerator
    ) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: Invalid parameters");

        _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Resets royalty information for the token id back to the global default.
     */
    function _resetTokenRoyalty(uint256 tokenId) internal virtual {
        delete _tokenRoyaltyInfo[tokenId];
    }
}


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




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



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

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


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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)



/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}


// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)



/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;
    }

    function _nonReentrantAfter() private {
        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}






// OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/MerkleProof.sol)



/**
 * @dev These functions deal with verification of Merkle Tree proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Calldata version of {verify}
     *
     * _Available since v4.7._
     */
    function verifyCalldata(
        bytes32[] calldata proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProofCalldata(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Calldata version of {processProof}
     *
     * _Available since v4.7._
     */
    function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Returns true if the `leaves` can be proved to be a part of a Merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * _Available since v4.7._
     */
    function multiProofVerify(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProof(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Calldata version of {multiProofVerify}
     *
     * _Available since v4.7._
     */
    function multiProofVerifyCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProofCalldata(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Returns the root of a tree reconstructed from `leaves` and the sibling nodes in `proof`,
     * consuming from one or the other at each step according to the instructions given by
     * `proofFlags`.
     *
     * _Available since v4.7._
     */
    function processMultiProof(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    /**
     * @dev Calldata version of {processMultiProof}
     *
     * _Available since v4.7._
     */
    function processMultiProofCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
        return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}


contract MerkleDistributor {
    bytes32 public merkleRoot;
    bool public allowListActive = false;

    mapping(address => uint256) private _allowListNumMinted;

    /**
     * @dev emitted when an account has claimed some tokens
     */
    event Claimed(address indexed account, uint256 amount);

    /**
     * @dev emitted when the merkle root has changed
     */
    event MerkleRootChanged(bytes32 merkleRoot);

    /**
     * @dev throws when allow list is not active
     */
    modifier isAllowListActive() {
        require(allowListActive, 'Allow list is not active');
        _;
    }

    /**
     * @dev throws when number of tokens exceeds total token amount
     */
    modifier tokensAvailable(
        address to,
        uint256 numberOfTokens,
        uint256 totalTokenAmount
    ) {
        uint256 claimed = getAllowListMinted(to);
        require(claimed + numberOfTokens <= totalTokenAmount, 'Purchase would exceed number of tokens allotted');
        _;
    }

    /**
     * @dev throws when parameters sent by claimer is incorrect
     */
    modifier ableToClaim(address claimer, bytes32[] memory proof) {
        require(onAllowList(claimer, proof), 'Not on allow list');
        _;
    }

    /**
     * @dev sets the state of the allow list
     */
    function _setAllowListActive(bool allowListActive_) internal virtual {
        allowListActive = allowListActive_;
    }

    /**
     * @dev sets the merkle root
     */
    function _setAllowList(bytes32 merkleRoot_) internal virtual {
        merkleRoot = merkleRoot_;

        emit MerkleRootChanged(merkleRoot);
    }

    /**
     * @dev adds the number of tokens to the incoming address
     */
    function _setAllowListMinted(address to, uint256 numberOfTokens) internal virtual {
        _allowListNumMinted[to] += numberOfTokens;

        emit Claimed(to, numberOfTokens);
    }

    /**
     * @dev gets the number of tokens from the address
     */
    function getAllowListMinted(address from) public view virtual returns (uint256) {
        return _allowListNumMinted[from];
    }

    /**
     * @dev checks if the claimer has a valid proof
     */
    function onAllowList(address claimer, bytes32[] memory proof) public view returns (bool) {
        bytes32 leaf = keccak256(abi.encodePacked(claimer));
        return MerkleProof.verify(proof, merkleRoot, leaf);
    }
}

error MintPriceNotPaid();
error PublicSaleNotActive();
error MaxSupply();
error MaxMintPerAddress();
error NonExistentTokenURI();
error WithdrawTransfer();

contract AffinityCollective is
    ERC721,
    ERC2981,
    Ownable,
    MerkleDistributor,
    ReentrancyGuard
{
    using Strings for uint256;
    uint256 public constant TOTAL_SUPPLY = 1000;
    uint256 public constant MAX_MINT_PER_ADDRESS = 5;
    uint256 public MINT_PRICE;
    bool public publiSaleActive;
    uint256 public currentTokenId;
    string public founderURI;
    string public memberURI;

    /**
     * @notice premint founder NFT's
     */

    constructor(
        uint256 _mintPrice,
        string memory _founderURI,
        string memory _memberURI
    ) ERC721("Affinity Collective", "AFFINITY") {
        founderURI = _founderURI;
        memberURI = _memberURI;
        publiSaleActive = false;
        MINT_PRICE = _mintPrice;
    }

    /**
     * @dev checks to see whether publiSaleActive is true
     */
    modifier isPublicSaleActive() {
        if (!publiSaleActive) revert PublicSaleNotActive();
        _;
    }

    /**
     * @notice airdrop founding members NFT's
     */
    function airdropFounders(address _foundersAirdrop) external onlyOwner {
        require(currentTokenId == 0, "Airdrop already completed");
        uint256 index;
        for (index = 0; index < 50; index++) {
            _safeMint(_foundersAirdrop, index);
        }
        currentTokenId = index;
    }

    /**
     * @notice Public mint
     */
    function mint(uint256 _amount)
        public
        payable
        nonReentrant
        isPublicSaleActive
    {
        if (_amount > MAX_MINT_PER_ADDRESS) revert MaxMintPerAddress();
        if (currentTokenId >= TOTAL_SUPPLY) revert MaxSupply();
        if (msg.value != MINT_PRICE * _amount) revert MintPriceNotPaid();
        for (uint256 index = 0; index < _amount; index++) {
            _safeMint(msg.sender, currentTokenId);
            currentTokenId++;
        }
    }

    /**
     * @notice White list mint
     */
    function whitelistMint(
        address _to,
        uint256 _amount,
        bytes32[] memory _proof
    )
        public
        payable
        nonReentrant
        isAllowListActive
        ableToClaim(_to, _proof)
        tokensAvailable(_to, _amount, MAX_MINT_PER_ADDRESS)
    {
        if (msg.value != MINT_PRICE * _amount) revert MintPriceNotPaid();
        if (currentTokenId + _amount > TOTAL_SUPPLY) revert MaxSupply();
        for (uint256 index = 0; index < _amount; index++) {
            _safeMint(_to, currentTokenId);
            currentTokenId++;
        }
    }

    /**
     * @notice Return token uri of the given token id.
     */
    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        if (ownerOf(tokenId) == address(0)) {
            revert NonExistentTokenURI();
        }
        if (tokenId < 50) return founderURI;
        return memberURI;
    }

    /**
     * @notice Return current token count.
     */
    function totalSupply() public view returns (uint256) {
        return currentTokenId;
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        override(ERC721, ERC2981)
        returns (bool)
    {
        return
            ERC721.supportsInterface(interfaceId) ||
            ERC2981.supportsInterface(interfaceId);
    }

    /**
     * @notice Set the token URI's.
     */
    function setTokenURI(string memory _founder, string memory _member)
        external
        onlyOwner
    {
        founderURI = _founder;
        memberURI = _member;
    }

    /**
     * @dev sets the merkle root for the allow list
     */
    function setAllowList(bytes32 merkleRoot) external onlyOwner {
        _setAllowList(merkleRoot);
    }

    /**
     * @dev sets mint price
     */
    function setMintPrice(uint256 _mintPrice) external onlyOwner {
        MINT_PRICE = _mintPrice;
    }

    /**
     * @dev allows minting from a list of addresses
     */
    function setAllowListActive(bool allowListActive) external onlyOwner {
        _setAllowListActive(allowListActive);
    }

    /**
     * @dev Enable public sale
     */
    function setPublicSale(bool state) external onlyOwner {
        publiSaleActive = state;
    }

    /**
     *  @dev Set royalties
     */
    function setRoyaltyInfo(address receiver, uint96 feeBasisPoints)
        external
        onlyOwner
    {
        _setDefaultRoyalty(receiver, feeBasisPoints);
    }

    /**
     * @dev Withdraw contract balance.
     */
    function withdraw(address _to) external onlyOwner {
        uint256 balance = address(this).balance;
        (bool transferTx, ) = _to.call{value: balance}("");
        if (!transferTx) {
            revert WithdrawTransfer();
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"_mintPrice","type":"uint256"},{"internalType":"string","name":"_founderURI","type":"string"},{"internalType":"string","name":"_memberURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"MaxMintPerAddress","type":"error"},{"inputs":[],"name":"MaxSupply","type":"error"},{"inputs":[],"name":"MintPriceNotPaid","type":"error"},{"inputs":[],"name":"NonExistentTokenURI","type":"error"},{"inputs":[],"name":"PublicSaleNotActive","type":"error"},{"inputs":[],"name":"WithdrawTransfer","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Claimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"merkleRoot","type":"bytes32"}],"name":"MerkleRootChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_MINT_PER_ADDRESS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOTAL_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_foundersAirdrop","type":"address"}],"name":"airdropFounders","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"allowListActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"founderURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"}],"name":"getAllowListMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"memberURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"claimer","type":"address"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"onAllowList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publiSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"}],"name":"setAllowList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"allowListActive","type":"bool"}],"name":"setAllowListActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintPrice","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"state","type":"bool"}],"name":"setPublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"feeBasisPoints","type":"uint96"}],"name":"setRoyaltyInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_founder","type":"string"},{"internalType":"string","name":"_member","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","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":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052600a805460ff191690553480156200001b57600080fd5b5060405162002446380380620024468339810160408190526200003e91620002e5565b604080518082018252601381527f416666696e69747920436f6c6c65637469766500000000000000000000000000602080830191825283518085019094526008845267414646494e49545960c01b908401528151919291620000a39160009162000172565b508051620000b990600190602084019062000172565b505050620000d6620000d06200011c60201b60201c565b62000120565b6001600c558151620000f090601090602085019062000172565b5080516200010690601190602084019062000172565b5050600e805460ff1916905550600d5562000395565b3390565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001809062000359565b90600052602060002090601f016020900481019282620001a45760008555620001ef565b82601f10620001bf57805160ff1916838001178555620001ef565b82800160010185558215620001ef579182015b82811115620001ef578251825591602001919060010190620001d2565b50620001fd92915062000201565b5090565b5b80821115620001fd576000815560010162000202565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200024057600080fd5b81516001600160401b03808211156200025d576200025d62000218565b604051601f8301601f19908116603f0116810190828211818310171562000288576200028862000218565b81604052838152602092508683858801011115620002a557600080fd5b600091505b83821015620002c95785820183015181830184015290820190620002aa565b83821115620002db5760008385830101525b9695505050505050565b600080600060608486031215620002fb57600080fd5b835160208501519093506001600160401b03808211156200031b57600080fd5b62000329878388016200022e565b935060408601519150808211156200034057600080fd5b506200034f868287016200022e565b9150509250925092565b600181811c908216806200036e57607f821691505b6020821081036200038f57634e487b7160e01b600052602260045260246000fd5b50919050565b6120a180620003a56000396000f3fe60806040526004361061022f5760003560e01c806370a082311161012e578063b88d4fde116100ab578063e05eb28b1161006f578063e05eb28b14610672578063e985e9c51461068c578063f2fde38b146106c7578063f4a0a528146106e7578063fc0840ed1461070757600080fd5b8063b88d4fde146105e7578063c002d23d14610607578063c87b56dd1461061d578063d48ede991461063d578063d7c8962c1461065d57600080fd5b806393151300116100f2578063931513001461056a57806395d89b411461057f578063a0712d6814610594578063a22cb465146105a7578063b32c5680146105c757600080fd5b806370a08231146104e1578063715018a61461050157806384584d07146105165780638da5cb5b14610536578063902d55a51461055457600080fd5b80632eb4a7ab116101bc5780634b11faaf116101805780634b11faaf1461043857806351cff8d91461044b5780635aca1bb61461046b5780635ea1ef521461048b5780636352211e146104c157600080fd5b80632eb4a7ab146103b35780633a73c58d146103c95780633acd6cb2146103e957806342842e0e146103fe578063457dbf211461041e57600080fd5b8063081812fc11610203578063081812fc146102d1578063095ea7b31461031f57806318160ddd1461033f57806323b872dd146103545780632a55205a1461037457600080fd5b80629a9b7b1461023457806301ffc9a71461025d57806302fa7c471461028d57806306fdde03146102af575b600080fd5b34801561024057600080fd5b5061024a600f5481565b6040519081526020015b60405180910390f35b34801561026957600080fd5b5061027d610278366004611a17565b610727565b6040519015158152602001610254565b34801561029957600080fd5b506102ad6102a8366004611a4b565b610747565b005b3480156102bb57600080fd5b506102c461075d565b6040516102549190611a8e565b3480156102dd57600080fd5b506103076102ec366004611ae3565b6004602052600090815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610254565b34801561032b57600080fd5b506102ad61033a366004611afc565b6107eb565b34801561034b57600080fd5b50600f5461024a565b34801561036057600080fd5b506102ad61036f366004611b26565b6108d2565b34801561038057600080fd5b5061039461038f366004611b62565b610a99565b604080516001600160a01b039093168352602083019190915201610254565b3480156103bf57600080fd5b5061024a60095481565b3480156103d557600080fd5b506102ad6103e4366004611b94565b610b45565b3480156103f557600080fd5b5061024a600581565b34801561040a57600080fd5b506102ad610419366004611b26565b610b61565b34801561042a57600080fd5b50600a5461027d9060ff1681565b6102ad610446366004611c76565b610c36565b34801561045757600080fd5b506102ad610466366004611ccd565b610e21565b34801561047757600080fd5b506102ad610486366004611b94565b610e9d565b34801561049757600080fd5b5061024a6104a6366004611ccd565b6001600160a01b03166000908152600b602052604090205490565b3480156104cd57600080fd5b506103076104dc366004611ae3565b610eb8565b3480156104ed57600080fd5b5061024a6104fc366004611ccd565b610f0f565b34801561050d57600080fd5b506102ad610f72565b34801561052257600080fd5b506102ad610531366004611ae3565b610f86565b34801561054257600080fd5b506008546001600160a01b0316610307565b34801561056057600080fd5b5061024a6103e881565b34801561057657600080fd5b506102c4610f97565b34801561058b57600080fd5b506102c4610fa4565b6102ad6105a2366004611ae3565b610fb1565b3480156105b357600080fd5b506102ad6105c2366004611ce8565b611099565b3480156105d357600080fd5b5061027d6105e2366004611d1b565b611105565b3480156105f357600080fd5b506102ad610602366004611d69565b611156565b34801561061357600080fd5b5061024a600d5481565b34801561062957600080fd5b506102c4610638366004611ae3565b61121b565b34801561064957600080fd5b506102ad610658366004611e74565b6112f7565b34801561066957600080fd5b506102c4611326565b34801561067e57600080fd5b50600e5461027d9060ff1681565b34801561069857600080fd5b5061027d6106a7366004611ece565b600560209081526000928352604080842090915290825290205460ff1681565b3480156106d357600080fd5b506102ad6106e2366004611ccd565b611333565b3480156106f357600080fd5b506102ad610702366004611ae3565b6113a9565b34801561071357600080fd5b506102ad610722366004611ccd565b6113b6565b60006107328261143c565b8061074157506107418261148a565b92915050565b61074f6114bf565b6107598282611519565b5050565b6000805461076a90611ef8565b80601f016020809104026020016040519081016040528092919081815260200182805461079690611ef8565b80156107e35780601f106107b8576101008083540402835291602001916107e3565b820191906000526020600020905b8154815290600101906020018083116107c657829003601f168201915b505050505081565b6000818152600260205260409020546001600160a01b03163381148061083457506001600160a01b038116600090815260056020908152604080832033845290915290205460ff165b6108765760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b60448201526064015b60405180910390fd5b60008281526004602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000818152600260205260409020546001600160a01b038481169116146109285760405162461bcd60e51b815260206004820152600a60248201526957524f4e475f46524f4d60b01b604482015260640161086d565b6001600160a01b0382166109725760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b604482015260640161086d565b336001600160a01b03841614806109ac57506001600160a01b038316600090815260056020908152604080832033845290915290205460ff165b806109cd57506000818152600460205260409020546001600160a01b031633145b610a0a5760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b604482015260640161086d565b6001600160a01b0380841660008181526003602090815260408083208054600019019055938616808352848320805460010190558583526002825284832080546001600160a01b03199081168317909155600490925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60008281526007602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092528291610b0e5750604080518082019091526006546001600160a01b0381168252600160a01b90046001600160601b031660208201525b602081015160009061271090610b2d906001600160601b031687611f48565b610b379190611f67565b915196919550909350505050565b610b4d6114bf565b600a805460ff191682151517905550565b50565b610b6c8383836108d2565b6001600160a01b0382163b1580610c155750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af1158015610be5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c099190611f89565b6001600160e01b031916145b610c315760405162461bcd60e51b815260040161086d90611fa6565b505050565b610c3e611616565b600a5460ff16610c905760405162461bcd60e51b815260206004820152601860248201527f416c6c6f77206c697374206973206e6f74206163746976650000000000000000604482015260640161086d565b8281610c9c8282611105565b610cdc5760405162461bcd60e51b8152602060048201526011602482015270139bdd081bdb88185b1b1bddc81b1a5cdd607a1b604482015260640161086d565b848460056000610d01846001600160a01b03166000908152600b602052604090205490565b905081610d0e8483611fd0565b1115610d745760405162461bcd60e51b815260206004820152602f60248201527f507572636861736520776f756c6420657863656564206e756d626572206f662060448201526e1d1bdad95b9cc8185b1b1bdd1d1959608a1b606482015260840161086d565b87600d54610d829190611f48565b3414610da1576040516310f0c8f160e11b815260040160405180910390fd5b6103e888600f54610db29190611fd0565b1115610dd157604051632cdb04a160e21b815260040160405180910390fd5b60005b88811015610e1057610de88a600f5461166f565b600f8054906000610df883611fe8565b91905055508080610e0890611fe8565b915050610dd4565b50505050505050610c316001600c55565b610e296114bf565b60405147906000906001600160a01b0384169083908381818185875af1925050503d8060008114610e76576040519150601f19603f3d011682016040523d82523d6000602084013e610e7b565b606091505b5050905080610c315760405163d23a9e8960e01b815260040160405180910390fd5b610ea56114bf565b600e805460ff1916911515919091179055565b6000818152600260205260409020546001600160a01b031680610f0a5760405162461bcd60e51b815260206004820152600a6024820152691393d517d3525395115160b21b604482015260640161086d565b919050565b60006001600160a01b038216610f565760405162461bcd60e51b815260206004820152600c60248201526b5a45524f5f4144445245535360a01b604482015260640161086d565b506001600160a01b031660009081526003602052604090205490565b610f7a6114bf565b610f84600061173b565b565b610f8e6114bf565b610b5e8161178d565b6011805461076a90611ef8565b6001805461076a90611ef8565b610fb9611616565b600e5460ff16610fdc576040516331f423c160e21b815260040160405180910390fd5b6005811115610ffe576040516369f0a9d960e11b815260040160405180910390fd5b6103e8600f541061102257604051632cdb04a160e21b815260040160405180910390fd5b80600d546110309190611f48565b341461104f576040516310f0c8f160e11b815260040160405180910390fd5b60005b8181101561108e5761106633600f5461166f565b600f805490600061107683611fe8565b9190505550808061108690611fe8565b915050611052565b50610b5e6001600c55565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6040516bffffffffffffffffffffffff19606084901b166020820152600090819060340160405160208183030381529060405280519060200120905061114e83600954836117c8565b949350505050565b6111618585856108d2565b6001600160a01b0384163b15806111f85750604051630a85bd0160e11b808252906001600160a01b0386169063150b7a02906111a99033908a90899089908990600401612001565b6020604051808303816000875af11580156111c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ec9190611f89565b6001600160e01b031916145b6112145760405162461bcd60e51b815260040161086d90611fa6565b5050505050565b6060600061122883610eb8565b6001600160a01b03160361124f5760405163d872946b60e01b815260040160405180910390fd5b60328210156112ea576010805461126590611ef8565b80601f016020809104026020016040519081016040528092919081815260200182805461129190611ef8565b80156112de5780601f106112b3576101008083540402835291602001916112de565b820191906000526020600020905b8154815290600101906020018083116112c157829003601f168201915b50505050509050919050565b6011805461126590611ef8565b6112ff6114bf565b8151611312906010906020850190611968565b508051610c31906011906020840190611968565b6010805461076a90611ef8565b61133b6114bf565b6001600160a01b0381166113a05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161086d565b610b5e8161173b565b6113b16114bf565b600d55565b6113be6114bf565b600f541561140e5760405162461bcd60e51b815260206004820152601960248201527f41697264726f7020616c726561647920636f6d706c6574656400000000000000604482015260640161086d565b60005b603281101561143657611424828261166f565b8061142e81611fe8565b915050611411565b600f5550565b60006301ffc9a760e01b6001600160e01b03198316148061146d57506380ac58cd60e01b6001600160e01b03198316145b806107415750506001600160e01b031916635b5e139f60e01b1490565b60006001600160e01b0319821663152a902d60e11b148061074157506301ffc9a760e01b6001600160e01b0319831614610741565b6008546001600160a01b03163314610f845760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161086d565b6127106001600160601b03821611156115875760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b606482015260840161086d565b6001600160a01b0382166115dd5760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c696420726563656976657200000000000000604482015260640161086d565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600655565b6002600c54036116685760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161086d565b6002600c55565b61167982826117de565b6001600160a01b0382163b158061171f5750604051630a85bd0160e11b80825233600483015260006024830181905260448301849052608060648401526084830152906001600160a01b0384169063150b7a029060a4016020604051808303816000875af11580156116ef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117139190611f89565b6001600160e01b031916145b6107595760405162461bcd60e51b815260040161086d90611fa6565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60098190556040518181527f1b930366dfeaa7eb3b325021e4ae81e36527063452ee55b86c95f85b36f4c31c9060200160405180910390a150565b6000826117d585846118e9565b14949350505050565b6001600160a01b0382166118285760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b604482015260640161086d565b6000818152600260205260409020546001600160a01b03161561187e5760405162461bcd60e51b815260206004820152600e60248201526d1053149150511657d3525395115160921b604482015260640161086d565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600081815b845181101561192e5761191a8286838151811061190d5761190d612055565b6020026020010151611936565b91508061192681611fe8565b9150506118ee565b509392505050565b6000818310611952576000828152602084905260409020611961565b60008381526020839052604090205b9392505050565b82805461197490611ef8565b90600052602060002090601f01602090048101928261199657600085556119dc565b82601f106119af57805160ff19168380011785556119dc565b828001600101855582156119dc579182015b828111156119dc5782518255916020019190600101906119c1565b506119e89291506119ec565b5090565b5b808211156119e857600081556001016119ed565b6001600160e01b031981168114610b5e57600080fd5b600060208284031215611a2957600080fd5b813561196181611a01565b80356001600160a01b0381168114610f0a57600080fd5b60008060408385031215611a5e57600080fd5b611a6783611a34565b915060208301356001600160601b0381168114611a8357600080fd5b809150509250929050565b600060208083528351808285015260005b81811015611abb57858101830151858201604001528201611a9f565b81811115611acd576000604083870101525b50601f01601f1916929092016040019392505050565b600060208284031215611af557600080fd5b5035919050565b60008060408385031215611b0f57600080fd5b611b1883611a34565b946020939093013593505050565b600080600060608486031215611b3b57600080fd5b611b4484611a34565b9250611b5260208501611a34565b9150604084013590509250925092565b60008060408385031215611b7557600080fd5b50508035926020909101359150565b80358015158114610f0a57600080fd5b600060208284031215611ba657600080fd5b61196182611b84565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611bee57611bee611baf565b604052919050565b600082601f830112611c0757600080fd5b8135602067ffffffffffffffff821115611c2357611c23611baf565b8160051b611c32828201611bc5565b9283528481018201928281019087851115611c4c57600080fd5b83870192505b84831015611c6b57823582529183019190830190611c52565b979650505050505050565b600080600060608486031215611c8b57600080fd5b611c9484611a34565b925060208401359150604084013567ffffffffffffffff811115611cb757600080fd5b611cc386828701611bf6565b9150509250925092565b600060208284031215611cdf57600080fd5b61196182611a34565b60008060408385031215611cfb57600080fd5b611d0483611a34565b9150611d1260208401611b84565b90509250929050565b60008060408385031215611d2e57600080fd5b611d3783611a34565b9150602083013567ffffffffffffffff811115611d5357600080fd5b611d5f85828601611bf6565b9150509250929050565b600080600080600060808688031215611d8157600080fd5b611d8a86611a34565b9450611d9860208701611a34565b935060408601359250606086013567ffffffffffffffff80821115611dbc57600080fd5b818801915088601f830112611dd057600080fd5b813581811115611ddf57600080fd5b896020828501011115611df157600080fd5b9699959850939650602001949392505050565b600082601f830112611e1557600080fd5b813567ffffffffffffffff811115611e2f57611e2f611baf565b611e42601f8201601f1916602001611bc5565b818152846020838601011115611e5757600080fd5b816020850160208301376000918101602001919091529392505050565b60008060408385031215611e8757600080fd5b823567ffffffffffffffff80821115611e9f57600080fd5b611eab86838701611e04565b93506020850135915080821115611ec157600080fd5b50611d5f85828601611e04565b60008060408385031215611ee157600080fd5b611eea83611a34565b9150611d1260208401611a34565b600181811c90821680611f0c57607f821691505b602082108103611f2c57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615611f6257611f62611f32565b500290565b600082611f8457634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215611f9b57600080fd5b815161196181611a01565b60208082526010908201526f155394d0519157d49150d2541251539560821b604082015260600190565b60008219821115611fe357611fe3611f32565b500190565b600060018201611ffa57611ffa611f32565b5060010190565b6001600160a01b038681168252851660208201526040810184905260806060820181905281018290526000828460a0840137600060a0848401015260a0601f19601f85011683010190509695505050505050565b634e487b7160e01b600052603260045260246000fdfea2646970667358221220c1a021c7fde431a0b81be49d6b527699983203ebe986fc9717338262b181df1264736f6c634300080d003300000000000000000000000000000000000000000000000010a741a462780000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d524454766a763673576a55626541767a7642597641735647775a6141744c4633594e355136394a3833756a6100000000000000000000000000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d526f7558653935487a67314a436e4d48645347725a6e4252356163384a6f5047716b4b5a48676641387a56350000000000000000000000

Deployed Bytecode

0x60806040526004361061022f5760003560e01c806370a082311161012e578063b88d4fde116100ab578063e05eb28b1161006f578063e05eb28b14610672578063e985e9c51461068c578063f2fde38b146106c7578063f4a0a528146106e7578063fc0840ed1461070757600080fd5b8063b88d4fde146105e7578063c002d23d14610607578063c87b56dd1461061d578063d48ede991461063d578063d7c8962c1461065d57600080fd5b806393151300116100f2578063931513001461056a57806395d89b411461057f578063a0712d6814610594578063a22cb465146105a7578063b32c5680146105c757600080fd5b806370a08231146104e1578063715018a61461050157806384584d07146105165780638da5cb5b14610536578063902d55a51461055457600080fd5b80632eb4a7ab116101bc5780634b11faaf116101805780634b11faaf1461043857806351cff8d91461044b5780635aca1bb61461046b5780635ea1ef521461048b5780636352211e146104c157600080fd5b80632eb4a7ab146103b35780633a73c58d146103c95780633acd6cb2146103e957806342842e0e146103fe578063457dbf211461041e57600080fd5b8063081812fc11610203578063081812fc146102d1578063095ea7b31461031f57806318160ddd1461033f57806323b872dd146103545780632a55205a1461037457600080fd5b80629a9b7b1461023457806301ffc9a71461025d57806302fa7c471461028d57806306fdde03146102af575b600080fd5b34801561024057600080fd5b5061024a600f5481565b6040519081526020015b60405180910390f35b34801561026957600080fd5b5061027d610278366004611a17565b610727565b6040519015158152602001610254565b34801561029957600080fd5b506102ad6102a8366004611a4b565b610747565b005b3480156102bb57600080fd5b506102c461075d565b6040516102549190611a8e565b3480156102dd57600080fd5b506103076102ec366004611ae3565b6004602052600090815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610254565b34801561032b57600080fd5b506102ad61033a366004611afc565b6107eb565b34801561034b57600080fd5b50600f5461024a565b34801561036057600080fd5b506102ad61036f366004611b26565b6108d2565b34801561038057600080fd5b5061039461038f366004611b62565b610a99565b604080516001600160a01b039093168352602083019190915201610254565b3480156103bf57600080fd5b5061024a60095481565b3480156103d557600080fd5b506102ad6103e4366004611b94565b610b45565b3480156103f557600080fd5b5061024a600581565b34801561040a57600080fd5b506102ad610419366004611b26565b610b61565b34801561042a57600080fd5b50600a5461027d9060ff1681565b6102ad610446366004611c76565b610c36565b34801561045757600080fd5b506102ad610466366004611ccd565b610e21565b34801561047757600080fd5b506102ad610486366004611b94565b610e9d565b34801561049757600080fd5b5061024a6104a6366004611ccd565b6001600160a01b03166000908152600b602052604090205490565b3480156104cd57600080fd5b506103076104dc366004611ae3565b610eb8565b3480156104ed57600080fd5b5061024a6104fc366004611ccd565b610f0f565b34801561050d57600080fd5b506102ad610f72565b34801561052257600080fd5b506102ad610531366004611ae3565b610f86565b34801561054257600080fd5b506008546001600160a01b0316610307565b34801561056057600080fd5b5061024a6103e881565b34801561057657600080fd5b506102c4610f97565b34801561058b57600080fd5b506102c4610fa4565b6102ad6105a2366004611ae3565b610fb1565b3480156105b357600080fd5b506102ad6105c2366004611ce8565b611099565b3480156105d357600080fd5b5061027d6105e2366004611d1b565b611105565b3480156105f357600080fd5b506102ad610602366004611d69565b611156565b34801561061357600080fd5b5061024a600d5481565b34801561062957600080fd5b506102c4610638366004611ae3565b61121b565b34801561064957600080fd5b506102ad610658366004611e74565b6112f7565b34801561066957600080fd5b506102c4611326565b34801561067e57600080fd5b50600e5461027d9060ff1681565b34801561069857600080fd5b5061027d6106a7366004611ece565b600560209081526000928352604080842090915290825290205460ff1681565b3480156106d357600080fd5b506102ad6106e2366004611ccd565b611333565b3480156106f357600080fd5b506102ad610702366004611ae3565b6113a9565b34801561071357600080fd5b506102ad610722366004611ccd565b6113b6565b60006107328261143c565b8061074157506107418261148a565b92915050565b61074f6114bf565b6107598282611519565b5050565b6000805461076a90611ef8565b80601f016020809104026020016040519081016040528092919081815260200182805461079690611ef8565b80156107e35780601f106107b8576101008083540402835291602001916107e3565b820191906000526020600020905b8154815290600101906020018083116107c657829003601f168201915b505050505081565b6000818152600260205260409020546001600160a01b03163381148061083457506001600160a01b038116600090815260056020908152604080832033845290915290205460ff165b6108765760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b60448201526064015b60405180910390fd5b60008281526004602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000818152600260205260409020546001600160a01b038481169116146109285760405162461bcd60e51b815260206004820152600a60248201526957524f4e475f46524f4d60b01b604482015260640161086d565b6001600160a01b0382166109725760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b604482015260640161086d565b336001600160a01b03841614806109ac57506001600160a01b038316600090815260056020908152604080832033845290915290205460ff165b806109cd57506000818152600460205260409020546001600160a01b031633145b610a0a5760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b604482015260640161086d565b6001600160a01b0380841660008181526003602090815260408083208054600019019055938616808352848320805460010190558583526002825284832080546001600160a01b03199081168317909155600490925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60008281526007602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092528291610b0e5750604080518082019091526006546001600160a01b0381168252600160a01b90046001600160601b031660208201525b602081015160009061271090610b2d906001600160601b031687611f48565b610b379190611f67565b915196919550909350505050565b610b4d6114bf565b600a805460ff191682151517905550565b50565b610b6c8383836108d2565b6001600160a01b0382163b1580610c155750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af1158015610be5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c099190611f89565b6001600160e01b031916145b610c315760405162461bcd60e51b815260040161086d90611fa6565b505050565b610c3e611616565b600a5460ff16610c905760405162461bcd60e51b815260206004820152601860248201527f416c6c6f77206c697374206973206e6f74206163746976650000000000000000604482015260640161086d565b8281610c9c8282611105565b610cdc5760405162461bcd60e51b8152602060048201526011602482015270139bdd081bdb88185b1b1bddc81b1a5cdd607a1b604482015260640161086d565b848460056000610d01846001600160a01b03166000908152600b602052604090205490565b905081610d0e8483611fd0565b1115610d745760405162461bcd60e51b815260206004820152602f60248201527f507572636861736520776f756c6420657863656564206e756d626572206f662060448201526e1d1bdad95b9cc8185b1b1bdd1d1959608a1b606482015260840161086d565b87600d54610d829190611f48565b3414610da1576040516310f0c8f160e11b815260040160405180910390fd5b6103e888600f54610db29190611fd0565b1115610dd157604051632cdb04a160e21b815260040160405180910390fd5b60005b88811015610e1057610de88a600f5461166f565b600f8054906000610df883611fe8565b91905055508080610e0890611fe8565b915050610dd4565b50505050505050610c316001600c55565b610e296114bf565b60405147906000906001600160a01b0384169083908381818185875af1925050503d8060008114610e76576040519150601f19603f3d011682016040523d82523d6000602084013e610e7b565b606091505b5050905080610c315760405163d23a9e8960e01b815260040160405180910390fd5b610ea56114bf565b600e805460ff1916911515919091179055565b6000818152600260205260409020546001600160a01b031680610f0a5760405162461bcd60e51b815260206004820152600a6024820152691393d517d3525395115160b21b604482015260640161086d565b919050565b60006001600160a01b038216610f565760405162461bcd60e51b815260206004820152600c60248201526b5a45524f5f4144445245535360a01b604482015260640161086d565b506001600160a01b031660009081526003602052604090205490565b610f7a6114bf565b610f84600061173b565b565b610f8e6114bf565b610b5e8161178d565b6011805461076a90611ef8565b6001805461076a90611ef8565b610fb9611616565b600e5460ff16610fdc576040516331f423c160e21b815260040160405180910390fd5b6005811115610ffe576040516369f0a9d960e11b815260040160405180910390fd5b6103e8600f541061102257604051632cdb04a160e21b815260040160405180910390fd5b80600d546110309190611f48565b341461104f576040516310f0c8f160e11b815260040160405180910390fd5b60005b8181101561108e5761106633600f5461166f565b600f805490600061107683611fe8565b9190505550808061108690611fe8565b915050611052565b50610b5e6001600c55565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6040516bffffffffffffffffffffffff19606084901b166020820152600090819060340160405160208183030381529060405280519060200120905061114e83600954836117c8565b949350505050565b6111618585856108d2565b6001600160a01b0384163b15806111f85750604051630a85bd0160e11b808252906001600160a01b0386169063150b7a02906111a99033908a90899089908990600401612001565b6020604051808303816000875af11580156111c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ec9190611f89565b6001600160e01b031916145b6112145760405162461bcd60e51b815260040161086d90611fa6565b5050505050565b6060600061122883610eb8565b6001600160a01b03160361124f5760405163d872946b60e01b815260040160405180910390fd5b60328210156112ea576010805461126590611ef8565b80601f016020809104026020016040519081016040528092919081815260200182805461129190611ef8565b80156112de5780601f106112b3576101008083540402835291602001916112de565b820191906000526020600020905b8154815290600101906020018083116112c157829003601f168201915b50505050509050919050565b6011805461126590611ef8565b6112ff6114bf565b8151611312906010906020850190611968565b508051610c31906011906020840190611968565b6010805461076a90611ef8565b61133b6114bf565b6001600160a01b0381166113a05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161086d565b610b5e8161173b565b6113b16114bf565b600d55565b6113be6114bf565b600f541561140e5760405162461bcd60e51b815260206004820152601960248201527f41697264726f7020616c726561647920636f6d706c6574656400000000000000604482015260640161086d565b60005b603281101561143657611424828261166f565b8061142e81611fe8565b915050611411565b600f5550565b60006301ffc9a760e01b6001600160e01b03198316148061146d57506380ac58cd60e01b6001600160e01b03198316145b806107415750506001600160e01b031916635b5e139f60e01b1490565b60006001600160e01b0319821663152a902d60e11b148061074157506301ffc9a760e01b6001600160e01b0319831614610741565b6008546001600160a01b03163314610f845760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161086d565b6127106001600160601b03821611156115875760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b606482015260840161086d565b6001600160a01b0382166115dd5760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c696420726563656976657200000000000000604482015260640161086d565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600655565b6002600c54036116685760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161086d565b6002600c55565b61167982826117de565b6001600160a01b0382163b158061171f5750604051630a85bd0160e11b80825233600483015260006024830181905260448301849052608060648401526084830152906001600160a01b0384169063150b7a029060a4016020604051808303816000875af11580156116ef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117139190611f89565b6001600160e01b031916145b6107595760405162461bcd60e51b815260040161086d90611fa6565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60098190556040518181527f1b930366dfeaa7eb3b325021e4ae81e36527063452ee55b86c95f85b36f4c31c9060200160405180910390a150565b6000826117d585846118e9565b14949350505050565b6001600160a01b0382166118285760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b604482015260640161086d565b6000818152600260205260409020546001600160a01b03161561187e5760405162461bcd60e51b815260206004820152600e60248201526d1053149150511657d3525395115160921b604482015260640161086d565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600081815b845181101561192e5761191a8286838151811061190d5761190d612055565b6020026020010151611936565b91508061192681611fe8565b9150506118ee565b509392505050565b6000818310611952576000828152602084905260409020611961565b60008381526020839052604090205b9392505050565b82805461197490611ef8565b90600052602060002090601f01602090048101928261199657600085556119dc565b82601f106119af57805160ff19168380011785556119dc565b828001600101855582156119dc579182015b828111156119dc5782518255916020019190600101906119c1565b506119e89291506119ec565b5090565b5b808211156119e857600081556001016119ed565b6001600160e01b031981168114610b5e57600080fd5b600060208284031215611a2957600080fd5b813561196181611a01565b80356001600160a01b0381168114610f0a57600080fd5b60008060408385031215611a5e57600080fd5b611a6783611a34565b915060208301356001600160601b0381168114611a8357600080fd5b809150509250929050565b600060208083528351808285015260005b81811015611abb57858101830151858201604001528201611a9f565b81811115611acd576000604083870101525b50601f01601f1916929092016040019392505050565b600060208284031215611af557600080fd5b5035919050565b60008060408385031215611b0f57600080fd5b611b1883611a34565b946020939093013593505050565b600080600060608486031215611b3b57600080fd5b611b4484611a34565b9250611b5260208501611a34565b9150604084013590509250925092565b60008060408385031215611b7557600080fd5b50508035926020909101359150565b80358015158114610f0a57600080fd5b600060208284031215611ba657600080fd5b61196182611b84565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611bee57611bee611baf565b604052919050565b600082601f830112611c0757600080fd5b8135602067ffffffffffffffff821115611c2357611c23611baf565b8160051b611c32828201611bc5565b9283528481018201928281019087851115611c4c57600080fd5b83870192505b84831015611c6b57823582529183019190830190611c52565b979650505050505050565b600080600060608486031215611c8b57600080fd5b611c9484611a34565b925060208401359150604084013567ffffffffffffffff811115611cb757600080fd5b611cc386828701611bf6565b9150509250925092565b600060208284031215611cdf57600080fd5b61196182611a34565b60008060408385031215611cfb57600080fd5b611d0483611a34565b9150611d1260208401611b84565b90509250929050565b60008060408385031215611d2e57600080fd5b611d3783611a34565b9150602083013567ffffffffffffffff811115611d5357600080fd5b611d5f85828601611bf6565b9150509250929050565b600080600080600060808688031215611d8157600080fd5b611d8a86611a34565b9450611d9860208701611a34565b935060408601359250606086013567ffffffffffffffff80821115611dbc57600080fd5b818801915088601f830112611dd057600080fd5b813581811115611ddf57600080fd5b896020828501011115611df157600080fd5b9699959850939650602001949392505050565b600082601f830112611e1557600080fd5b813567ffffffffffffffff811115611e2f57611e2f611baf565b611e42601f8201601f1916602001611bc5565b818152846020838601011115611e5757600080fd5b816020850160208301376000918101602001919091529392505050565b60008060408385031215611e8757600080fd5b823567ffffffffffffffff80821115611e9f57600080fd5b611eab86838701611e04565b93506020850135915080821115611ec157600080fd5b50611d5f85828601611e04565b60008060408385031215611ee157600080fd5b611eea83611a34565b9150611d1260208401611a34565b600181811c90821680611f0c57607f821691505b602082108103611f2c57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615611f6257611f62611f32565b500290565b600082611f8457634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215611f9b57600080fd5b815161196181611a01565b60208082526010908201526f155394d0519157d49150d2541251539560821b604082015260600190565b60008219821115611fe357611fe3611f32565b500190565b600060018201611ffa57611ffa611f32565b5060010190565b6001600160a01b038681168252851660208201526040810184905260806060820181905281018290526000828460a0840137600060a0848401015260a0601f19601f85011683010190509695505050505050565b634e487b7160e01b600052603260045260246000fdfea2646970667358221220c1a021c7fde431a0b81be49d6b527699983203ebe986fc9717338262b181df1264736f6c634300080d0033

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

00000000000000000000000000000000000000000000000010a741a462780000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d524454766a763673576a55626541767a7642597641735647775a6141744c4633594e355136394a3833756a6100000000000000000000000000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d526f7558653935487a67314a436e4d48645347725a6e4252356163384a6f5047716b4b5a48676641387a56350000000000000000000000

-----Decoded View---------------
Arg [0] : _mintPrice (uint256): 1200000000000000000
Arg [1] : _founderURI (string): ipfs://QmRDTvjv6sWjUbeAvzvBYvAsVGwZaAtLF3YN5Q69J83uja
Arg [2] : _memberURI (string): ipfs://QmRouXe95Hzg1JCnMHdSGrZnBR5ac8JoPGqkKZHgfA8zV5

-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000010a741a462780000
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000035
Arg [4] : 697066733a2f2f516d524454766a763673576a55626541767a76425976417356
Arg [5] : 47775a6141744c4633594e355136394a3833756a610000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000035
Arg [7] : 697066733a2f2f516d526f7558653935487a67314a436e4d48645347725a6e42
Arg [8] : 52356163384a6f5047716b4b5a48676641387a56350000000000000000000000


Deployed Bytecode Sourcemap

34215:4904:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34543:29;;;;;;;;;;;;;;;;;;;160:25:1;;;148:2;133:18;34543:29:0;;;;;;;;37364:272;;;;;;;;;;-1:-1:-1;37364:272:0;;;;;:::i;:::-;;:::i;:::-;;;747:14:1;;740:22;722:41;;710:2;695:18;37364:272:0;582:187:1;38632:170:0;;;;;;;;;;-1:-1:-1;38632:170:0;;;;;:::i;:::-;;:::i;:::-;;922:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;1895:46::-;;;;;;;;;;-1:-1:-1;1895:46:0;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;1895:46:0;;;;;;-1:-1:-1;;;;;2274:32:1;;;2256:51;;2244:2;2229:18;1895:46:0;2110:203:1;2521:290:0;;;;;;;;;;-1:-1:-1;2521:290:0;;;;;:::i;:::-;;:::i;37263:93::-;;;;;;;;;;-1:-1:-1;37334:14:0;;37263:93;;3034:768;;;;;;;;;;-1:-1:-1;3034:768:0;;;;;:::i;:::-;;:::i;11753:442::-;;;;;;;;;;-1:-1:-1;11753:442:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;3355:32:1;;;3337:51;;3419:2;3404:18;;3397:34;;;;3310:18;11753:442:0;3163:274:1;31622:25:0;;;;;;;;;;;;;;;;38300:124;;;;;;;;;;-1:-1:-1;38300:124:0;;;;;:::i;:::-;;:::i;34422:48::-;;;;;;;;;;;;34469:1;34422:48;;3810:409;;;;;;;;;;-1:-1:-1;3810:409:0;;;;;:::i;:::-;;:::i;31654:35::-;;;;;;;;;;-1:-1:-1;31654:35:0;;;;;;;;36192:599;;;;;;:::i;:::-;;:::i;38868:248::-;;;;;;;;;;-1:-1:-1;38868:248:0;;;;;:::i;:::-;;:::i;38482:96::-;;;;;;;;;;-1:-1:-1;38482:96:0;;;;;:::i;:::-;;:::i;33614:131::-;;;;;;;;;;-1:-1:-1;33614:131:0;;;;;:::i;:::-;-1:-1:-1;;;;;33712:25:0;33685:7;33712:25;;;:19;:25;;;;;;;33614:131;1364:151;;;;;;;;;;-1:-1:-1;1364:151:0;;;;;:::i;:::-;;:::i;1523:172::-;;;;;;;;;;-1:-1:-1;1523:172:0;;;;;:::i;:::-;;:::i;16871:103::-;;;;;;;;;;;;;:::i;37958:105::-;;;;;;;;;;-1:-1:-1;37958:105:0;;;;;:::i;:::-;;:::i;16223:87::-;;;;;;;;;;-1:-1:-1;16296:6:0;;-1:-1:-1;;;;;16296:6:0;16223:87;;34372:43;;;;;;;;;;;;34411:4;34372:43;;34610:23;;;;;;;;;;;;;:::i;949:20::-;;;;;;;;;;;;;:::i;35639:495::-;;;;;;:::i;:::-;;:::i;2819:207::-;;;;;;;;;;-1:-1:-1;2819:207:0;;;;;:::i;:::-;;:::i;33824:220::-;;;;;;;;;;-1:-1:-1;33824:220:0;;;;;:::i;:::-;;:::i;4227:441::-;;;;;;;;;;-1:-1:-1;4227:441:0;;;;;:::i;:::-;;:::i;34477:25::-;;;;;;;;;;;;;;;;36873:320;;;;;;;;;;-1:-1:-1;36873:320:0;;;;;:::i;:::-;;:::i;37699:180::-;;;;;;;;;;-1:-1:-1;37699:180:0;;;;;:::i;:::-;;:::i;34579:24::-;;;;;;;;;;;;;:::i;34509:27::-;;;;;;;;;;-1:-1:-1;34509:27:0;;;;;;;;1950:68;;;;;;;;;;-1:-1:-1;1950:68:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;17129:201;;;;;;;;;;-1:-1:-1;17129:201:0;;;;;:::i;:::-;;:::i;38118:103::-;;;;;;;;;;-1:-1:-1;38118:103:0;;;;;:::i;:::-;;:::i;35274:311::-;;;;;;;;;;-1:-1:-1;35274:311:0;;;;;:::i;:::-;;:::i;37364:272::-;37494:4;37536:37;37561:11;37536:24;:37::i;:::-;:92;;;;37590:38;37616:11;37590:25;:38::i;:::-;37516:112;37364:272;-1:-1:-1;;37364:272:0:o;38632:170::-;16109:13;:11;:13::i;:::-;38750:44:::1;38769:8;38779:14;38750:18;:44::i;:::-;38632:170:::0;;:::o;922:18::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2521:290::-;2593:13;2609:12;;;:8;:12;;;;;;-1:-1:-1;;;;;2609:12:0;2642:10;:19;;;:58;;-1:-1:-1;;;;;;2665:23:0;;;;;;:16;:23;;;;;;;;2689:10;2665:35;;;;;;;;;;2642:58;2634:85;;;;-1:-1:-1;;;2634:85:0;;9409:2:1;2634:85:0;;;9391:21:1;9448:2;9428:18;;;9421:30;-1:-1:-1;;;9467:18:1;;;9460:44;9521:18;;2634:85:0;;;;;;;;;2732:15;;;;:11;:15;;;;;;:25;;-1:-1:-1;;;;;;2732:25:0;-1:-1:-1;;;;;2732:25:0;;;;;;;;;2775:28;;2732:15;;2775:28;;;;;;;2582:229;2521:290;;:::o;3034:768::-;3170:12;;;;:8;:12;;;;;;-1:-1:-1;;;;;3162:20:0;;;3170:12;;3162:20;3154:43;;;;-1:-1:-1;;;3154:43:0;;9752:2:1;3154:43:0;;;9734:21:1;9791:2;9771:18;;;9764:30;-1:-1:-1;;;9810:18:1;;;9803:40;9860:18;;3154:43:0;9550:334:1;3154:43:0;-1:-1:-1;;;;;3218:16:0;;3210:46;;;;-1:-1:-1;;;3210:46:0;;10091:2:1;3210:46:0;;;10073:21:1;10130:2;10110:18;;;10103:30;-1:-1:-1;;;10149:18:1;;;10142:47;10206:18;;3210:46:0;9889:341:1;3210:46:0;3291:10;-1:-1:-1;;;;;3291:18:0;;;;:56;;-1:-1:-1;;;;;;3313:22:0;;;;;;:16;:22;;;;;;;;3336:10;3313:34;;;;;;;;;;3291:56;:89;;;-1:-1:-1;3365:15:0;;;;:11;:15;;;;;;-1:-1:-1;;;;;3365:15:0;3351:10;:29;3291:89;3269:153;;;;-1:-1:-1;;;3269:153:0;;9409:2:1;3269:153:0;;;9391:21:1;9448:2;9428:18;;;9421:30;-1:-1:-1;;;9467:18:1;;;9460:44;9521:18;;3269:153:0;9207:338:1;3269:153:0;-1:-1:-1;;;;;3627:16:0;;;;;;;:10;:16;;;;;;;;:18;;-1:-1:-1;;3627:18:0;;;3662:14;;;;;;;;;:16;;3627:18;3662:16;;;3702:12;;;:8;:12;;;;;:17;;-1:-1:-1;;;;;;3702:17:0;;;;;;;;3739:11;:15;;;;;;3732:22;;;;;;;;3772;;3711:2;;3662:14;3627:16;3772:22;;;3034:768;;;:::o;11753:442::-;11850:7;11908:27;;;:17;:27;;;;;;;;11879:56;;;;;;;;;-1:-1:-1;;;;;11879:56:0;;;;;-1:-1:-1;;;11879:56:0;;;-1:-1:-1;;;;;11879:56:0;;;;;;;;11850:7;;11948:92;;-1:-1:-1;11999:29:0;;;;;;;;;12009:19;11999:29;-1:-1:-1;;;;;11999:29:0;;;;-1:-1:-1;;;11999:29:0;;-1:-1:-1;;;;;11999:29:0;;;;;11948:92;12090:23;;;;12052:21;;12561:5;;12077:36;;-1:-1:-1;;;;;12077:36:0;:10;:36;:::i;:::-;12076:58;;;;:::i;:::-;12155:16;;;;;-1:-1:-1;11753:442:0;;-1:-1:-1;;;;11753:442:0:o;38300:124::-;16109:13;:11;:13::i;:::-;33003:15;:34;;-1:-1:-1;;33003:34:0;;;;;;;38300:124;:::o;38380:36::-:1;38300:124:::0;:::o;3810:409::-;3934:26;3947:4;3953:2;3957;3934:12;:26::i;:::-;-1:-1:-1;;;;;3995:14:0;;;:19;;:172;;-1:-1:-1;4035:66:0;;-1:-1:-1;;;4035:66:0;;;4076:10;4035:66;;;11067:34:1;-1:-1:-1;;;;;11137:15:1;;;11117:18;;;11110:43;11169:18;;;11162:34;;;11232:3;11212:18;;;11205:31;-1:-1:-1;11252:19:1;;;11245:30;4122:45:0;;4035:40;;;;4122:45;;11292:19:1;;4035:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;4035:132:0;;3995:172;3973:238;;;;-1:-1:-1;;;3973:238:0;;;;;;;:::i;:::-;3810:409;;;:::o;36192:599::-;22350:21;:19;:21::i;:::-;32144:15:::1;::::0;::::1;;32136:52;;;::::0;-1:-1:-1;;;32136:52:0;;12123:2:1;32136:52:0::1;::::0;::::1;12105:21:1::0;12162:2;12142:18;;;12135:30;12201:26;12181:18;;;12174:54;12245:18;;32136:52:0::1;11921:348:1::0;32136:52:0::1;36407:3:::2;36412:6;32782:27;32794:7;32803:5;32782:11;:27::i;:::-;32774:57;;;::::0;-1:-1:-1;;;32774:57:0;;12476:2:1;32774:57:0::2;::::0;::::2;12458:21:1::0;12515:2;12495:18;;;12488:30;-1:-1:-1;;;12534:18:1;;;12527:47;12591:18;;32774:57:0::2;12274:341:1::0;32774:57:0::2;36445:3:::3;36450:7;34469:1;32435:15;32453:22;32472:2;-1:-1:-1::0;;;;;33712:25:0;33685:7;33712:25;;;:19;:25;;;;;;;33614:131;32453:22:::3;32435:40:::0;-1:-1:-1;32522:16:0;32494:24:::3;32504:14:::0;32435:40;32494:24:::3;:::i;:::-;:44;;32486:104;;;::::0;-1:-1:-1;;;32486:104:0;;12955:2:1;32486:104:0::3;::::0;::::3;12937:21:1::0;12994:2;12974:18;;;12967:30;13033:34;13013:18;;;13006:62;-1:-1:-1;;;13084:18:1;;;13077:45;13139:19;;32486:104:0::3;12753:411:1::0;32486:104:0::3;36527:7:::4;36514:10;;:20;;;;:::i;:::-;36501:9;:33;36497:64;;36543:18;;-1:-1:-1::0;;;36543:18:0::4;;;;;;;;;;;36497:64;34411:4;36593:7;36576:14;;:24;;;;:::i;:::-;:39;36572:63;;;36624:11;;-1:-1:-1::0;;;36624:11:0::4;;;;;;;;;;;36572:63;36651:13;36646:138;36678:7;36670:5;:15;36646:138;;;36711:30;36721:3;36726:14;;36711:9;:30::i;:::-;36756:14;:16:::0;;;:14:::4;:16;::::0;::::4;:::i;:::-;;;;;;36687:7;;;;;:::i;:::-;;;;36646:138;;;;32424:186:::3;32842:1;;;32199::::2;;22394:20:::0;21788:1;22910:7;:22;22727:213;38868:248;16109:13;:11;:13::i;:::-;39001:28:::1;::::0;38947:21:::1;::::0;38929:15:::1;::::0;-1:-1:-1;;;;;39001:8:0;::::1;::::0;38947:21;;38929:15;39001:28;38929:15;39001:28;38947:21;39001:8;:28:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38979:50;;;39045:10;39040:69;;39079:18;;-1:-1:-1::0;;;39079:18:0::1;;;;;;;;;;;38482:96:::0;16109:13;:11;:13::i;:::-;38547:15:::1;:23:::0;;-1:-1:-1;;38547:23:0::1;::::0;::::1;;::::0;;;::::1;::::0;;38482:96::o;1364:151::-;1422:13;1465:12;;;:8;:12;;;;;;-1:-1:-1;;;;;1465:12:0;;1448:59;;;;-1:-1:-1;;;1448:59:0;;13721:2:1;1448:59:0;;;13703:21:1;13760:2;13740:18;;;13733:30;-1:-1:-1;;;13779:18:1;;;13772:40;13829:18;;1448:59:0;13519:334:1;1448:59:0;1364:151;;;:::o;1523:172::-;1586:7;-1:-1:-1;;;;;1614:19:0;;1606:44;;;;-1:-1:-1;;;1606:44:0;;14060:2:1;1606:44:0;;;14042:21:1;14099:2;14079:18;;;14072:30;-1:-1:-1;;;14118:18:1;;;14111:42;14170:18;;1606:44:0;13858:336:1;1606:44:0;-1:-1:-1;;;;;;1670:17:0;;;;;:10;:17;;;;;;;1523:172::o;16871:103::-;16109:13;:11;:13::i;:::-;16936:30:::1;16963:1;16936:18;:30::i;:::-;16871:103::o:0;37958:105::-;16109:13;:11;:13::i;:::-;38030:25:::1;38044:10;38030:13;:25::i;34610:23::-:0;;;;;;;:::i;949:20::-;;;;;;;:::i;35639:495::-;22350:21;:19;:21::i;:::-;35136:15:::1;::::0;::::1;;35131:50;;35160:21;;-1:-1:-1::0;;;35160:21:0::1;;;;;;;;;;;35131:50;34469:1:::2;35773:7;:30;35769:62;;;35812:19;;-1:-1:-1::0;;;35812:19:0::2;;;;;;;;;;;35769:62;34411:4;35846:14;;:30;35842:54;;35885:11;;-1:-1:-1::0;;;35885:11:0::2;;;;;;;;;;;35842:54;35937:7;35924:10;;:20;;;;:::i;:::-;35911:9;:33;35907:64;;35953:18;;-1:-1:-1::0;;;35953:18:0::2;;;;;;;;;;;35907:64;35987:13;35982:145;36014:7;36006:5;:15;35982:145;;;36047:37;36057:10;36069:14;;36047:9;:37::i;:::-;36099:14;:16:::0;;;:14:::2;:16;::::0;::::2;:::i;:::-;;;;;;36023:7;;;;;:::i;:::-;;;;35982:145;;;;22394:20:::0;21788:1;22910:7;:22;22727:213;2819:207;2922:10;2905:28;;;;:16;:28;;;;;;;;-1:-1:-1;;;;;2905:38:0;;;;;;;;;;;;:49;;-1:-1:-1;;2905:49:0;;;;;;;;;;2972:46;;722:41:1;;;2905:38:0;;2922:10;2972:46;;695:18:1;2972:46:0;;;;;;;2819:207;;:::o;33824:220::-;33949:25;;-1:-1:-1;;14348:2:1;14344:15;;;14340:53;33949:25:0;;;14328:66:1;33907:4:0;;;;14410:12:1;;33949:25:0;;;;;;;;;;;;33939:36;;;;;;33924:51;;33993:43;34012:5;34019:10;;34031:4;33993:18;:43::i;:::-;33986:50;33824:220;-1:-1:-1;;;;33824:220:0:o;4227:441::-;4381:26;4394:4;4400:2;4404;4381:12;:26::i;:::-;-1:-1:-1;;;;;4442:14:0;;;:19;;:174;;-1:-1:-1;4482:68:0;;-1:-1:-1;;;4482:68:0;;;4571:45;-1:-1:-1;;;;;4482:40:0;;;4571:45;;4482:68;;4523:10;;4535:4;;4541:2;;4545:4;;;;4482:68;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;4482:134:0;;4442:174;4420:240;;;;-1:-1:-1;;;4420:240:0;;;;;;;:::i;:::-;4227:441;;;;;:::o;36873:320::-;36991:13;37054:1;37026:16;37034:7;37026;:16::i;:::-;-1:-1:-1;;;;;37026:30:0;;37022:91;;37080:21;;-1:-1:-1;;;37080:21:0;;;;;;;;;;;37022:91;37137:2;37127:7;:12;37123:35;;;37148:10;37141:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36873:320;;;:::o;37123:35::-;37176:9;37169:16;;;;;:::i;37699:180::-;16109:13;:11;:13::i;:::-;37820:21;;::::1;::::0;:10:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;37852:19:0;;::::1;::::0;:9:::1;::::0;:19:::1;::::0;::::1;::::0;::::1;:::i;34579:24::-:0;;;;;;;:::i;17129:201::-;16109:13;:11;:13::i;:::-;-1:-1:-1;;;;;17218:22:0;::::1;17210:73;;;::::0;-1:-1:-1;;;17210:73:0;;15302:2:1;17210:73:0::1;::::0;::::1;15284:21:1::0;15341:2;15321:18;;;15314:30;15380:34;15360:18;;;15353:62;-1:-1:-1;;;15431:18:1;;;15424:36;15477:19;;17210:73:0::1;15100:402:1::0;17210:73:0::1;17294:28;17313:8;17294:18;:28::i;38118:103::-:0;16109:13;:11;:13::i;:::-;38190:10:::1;:23:::0;38118:103::o;35274:311::-;16109:13;:11;:13::i;:::-;35363:14:::1;::::0;:19;35355:57:::1;;;::::0;-1:-1:-1;;;35355:57:0;;15709:2:1;35355:57:0::1;::::0;::::1;15691:21:1::0;15748:2;15728:18;;;15721:30;15787:27;15767:18;;;15760:55;15832:18;;35355:57:0::1;15507:349:1::0;35355:57:0::1;35423:13;35447:98;35471:2;35463:5;:10;35447:98;;;35499:34;35509:16;35527:5;35499:9;:34::i;:::-;35475:7:::0;::::1;::::0;::::1;:::i;:::-;;;;35447:98;;;35555:14;:22:::0;-1:-1:-1;35274:311:0:o;4862:340::-;4938:4;-1:-1:-1;;;;;;;;;4975:25:0;;;;:101;;-1:-1:-1;;;;;;;;;;5051:25:0;;;4975:101;:177;;;-1:-1:-1;;;;;;;;5127:25:0;-1:-1:-1;;;5127:25:0;;4862:340::o;11483:215::-;11585:4;-1:-1:-1;;;;;;11609:41:0;;-1:-1:-1;;;11609:41:0;;:81;;-1:-1:-1;;;;;;;;;;10212:40:0;;;11654:36;10103:157;16388:132;16296:6;;-1:-1:-1;;;;;16296:6:0;15010:10;16452:23;16444:68;;;;-1:-1:-1;;;16444:68:0;;16063:2:1;16444:68:0;;;16045:21:1;;;16082:18;;;16075:30;16141:34;16121:18;;;16114:62;16193:18;;16444:68:0;15861:356:1;12845:332:0;12561:5;-1:-1:-1;;;;;12948:33:0;;;;12940:88;;;;-1:-1:-1;;;12940:88:0;;16424:2:1;12940:88:0;;;16406:21:1;16463:2;16443:18;;;16436:30;16502:34;16482:18;;;16475:62;-1:-1:-1;;;16553:18:1;;;16546:40;16603:19;;12940:88:0;16222:406:1;12940:88:0;-1:-1:-1;;;;;13047:22:0;;13039:60;;;;-1:-1:-1;;;13039:60:0;;16835:2:1;13039:60:0;;;16817:21:1;16874:2;16854:18;;;16847:30;16913:27;16893:18;;;16886:55;16958:18;;13039:60:0;16633:349:1;13039:60:0;13134:35;;;;;;;;;-1:-1:-1;;;;;13134:35:0;;;;;;-1:-1:-1;;;;;13134:35:0;;;;;;;;;;-1:-1:-1;;;13112:57:0;;;;:19;:57;12845:332::o;22430:289::-;21832:1;22560:7;;:19;22552:63;;;;-1:-1:-1;;;22552:63:0;;17189:2:1;22552:63:0;;;17171:21:1;17228:2;17208:18;;;17201:30;17267:33;17247:18;;;17240:61;17318:18;;22552:63:0;16987:355:1;22552:63:0;21832:1;22693:7;:18;22430:289::o;6380:349::-;6451:13;6457:2;6461;6451:5;:13::i;:::-;-1:-1:-1;;;;;6499:14:0;;;:19;;:178;;-1:-1:-1;6539:72:0;;-1:-1:-1;;;6539:72:0;;;6580:10;6539:72;;;11067:34:1;6600:1:0;11117:18:1;;;11110:43;;;11169:18;;;11162:34;;;11232:3;11212:18;;;11205:31;11252:19;;;11245:30;6632:45:0;-1:-1:-1;;;;;6539:40:0;;;6632:45;;11292:19:1;;6539:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;6539:138:0;;6499:178;6477:244;;;;-1:-1:-1;;;6477:244:0;;;;;;;:::i;17490:191::-;17583:6;;;-1:-1:-1;;;;;17600:17:0;;;-1:-1:-1;;;;;;17600:17:0;;;;;;;17633:40;;17583:6;;;17600:17;17583:6;;17633:40;;17564:16;;17633:40;17553:128;17490:191;:::o;33105:151::-;33177:10;:24;;;33219:29;;160:25:1;;;33219:29:0;;148:2:1;133:18;33219:29:0;;;;;;;33105:151;:::o;24080:190::-;24205:4;24258;24229:25;24242:5;24249:4;24229:12;:25::i;:::-;:33;;24080:190;-1:-1:-1;;;;24080:190:0:o;5402:384::-;-1:-1:-1;;;;;5477:16:0;;5469:46;;;;-1:-1:-1;;;5469:46:0;;10091:2:1;5469:46:0;;;10073:21:1;10130:2;10110:18;;;10103:30;-1:-1:-1;;;10149:18:1;;;10142:47;10206:18;;5469:46:0;9889:341:1;5469:46:0;5560:1;5536:12;;;:8;:12;;;;;;-1:-1:-1;;;;;5536:12:0;:26;5528:53;;;;-1:-1:-1;;;5528:53:0;;17549:2:1;5528:53:0;;;17531:21:1;17588:2;17568:18;;;17561:30;-1:-1:-1;;;17607:18:1;;;17600:44;17661:18;;5528:53:0;17347:338:1;5528:53:0;-1:-1:-1;;;;;5675:14:0;;;;;;:10;:14;;;;;;;;:16;;;;;;5715:12;;;:8;:12;;;;;;:17;;-1:-1:-1;;;;;;5715:17:0;;;;;5750:28;5724:2;;5675:14;;5750:28;;5675:14;;5750:28;5402:384;;:::o;24947:296::-;25030:7;25073:4;25030:7;25088:118;25112:5;:12;25108:1;:16;25088:118;;;25161:33;25171:12;25185:5;25191:1;25185:8;;;;;;;;:::i;:::-;;;;;;;25161:9;:33::i;:::-;25146:48;-1:-1:-1;25126:3:0;;;;:::i;:::-;;;;25088:118;;;-1:-1:-1;25223:12:0;24947:296;-1:-1:-1;;;24947:296:0:o;31154:149::-;31217:7;31248:1;31244;:5;:51;;31379:13;31473:15;;;31509:4;31502:15;;;31556:4;31540:21;;31244:51;;;31379:13;31473:15;;;31509:4;31502:15;;;31556:4;31540:21;;31252:20;31237:58;31154:149;-1:-1:-1;;;31154:149:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;196:131:1;-1:-1:-1;;;;;;270:32:1;;260:43;;250:71;;317:1;314;307:12;332:245;390:6;443:2;431:9;422:7;418:23;414:32;411:52;;;459:1;456;449:12;411:52;498:9;485:23;517:30;541:5;517:30;:::i;774:173::-;842:20;;-1:-1:-1;;;;;891:31:1;;881:42;;871:70;;937:1;934;927:12;952:366;1019:6;1027;1080:2;1068:9;1059:7;1055:23;1051:32;1048:52;;;1096:1;1093;1086:12;1048:52;1119:29;1138:9;1119:29;:::i;:::-;1109:39;;1198:2;1187:9;1183:18;1170:32;-1:-1:-1;;;;;1235:5:1;1231:38;1224:5;1221:49;1211:77;;1284:1;1281;1274:12;1211:77;1307:5;1297:15;;;952:366;;;;;:::o;1323:597::-;1435:4;1464:2;1493;1482:9;1475:21;1525:6;1519:13;1568:6;1563:2;1552:9;1548:18;1541:34;1593:1;1603:140;1617:6;1614:1;1611:13;1603:140;;;1712:14;;;1708:23;;1702:30;1678:17;;;1697:2;1674:26;1667:66;1632:10;;1603:140;;;1761:6;1758:1;1755:13;1752:91;;;1831:1;1826:2;1817:6;1806:9;1802:22;1798:31;1791:42;1752:91;-1:-1:-1;1904:2:1;1883:15;-1:-1:-1;;1879:29:1;1864:45;;;;1911:2;1860:54;;1323:597;-1:-1:-1;;;1323:597:1:o;1925:180::-;1984:6;2037:2;2025:9;2016:7;2012:23;2008:32;2005:52;;;2053:1;2050;2043:12;2005:52;-1:-1:-1;2076:23:1;;1925:180;-1:-1:-1;1925:180:1:o;2318:254::-;2386:6;2394;2447:2;2435:9;2426:7;2422:23;2418:32;2415:52;;;2463:1;2460;2453:12;2415:52;2486:29;2505:9;2486:29;:::i;:::-;2476:39;2562:2;2547:18;;;;2534:32;;-1:-1:-1;;;2318:254:1:o;2577:328::-;2654:6;2662;2670;2723:2;2711:9;2702:7;2698:23;2694:32;2691:52;;;2739:1;2736;2729:12;2691:52;2762:29;2781:9;2762:29;:::i;:::-;2752:39;;2810:38;2844:2;2833:9;2829:18;2810:38;:::i;:::-;2800:48;;2895:2;2884:9;2880:18;2867:32;2857:42;;2577:328;;;;;:::o;2910:248::-;2978:6;2986;3039:2;3027:9;3018:7;3014:23;3010:32;3007:52;;;3055:1;3052;3045:12;3007:52;-1:-1:-1;;3078:23:1;;;3148:2;3133:18;;;3120:32;;-1:-1:-1;2910:248:1:o;3624:160::-;3689:20;;3745:13;;3738:21;3728:32;;3718:60;;3774:1;3771;3764:12;3789:180;3845:6;3898:2;3886:9;3877:7;3873:23;3869:32;3866:52;;;3914:1;3911;3904:12;3866:52;3937:26;3953:9;3937:26;:::i;3974:127::-;4035:10;4030:3;4026:20;4023:1;4016:31;4066:4;4063:1;4056:15;4090:4;4087:1;4080:15;4106:275;4177:2;4171:9;4242:2;4223:13;;-1:-1:-1;;4219:27:1;4207:40;;4277:18;4262:34;;4298:22;;;4259:62;4256:88;;;4324:18;;:::i;:::-;4360:2;4353:22;4106:275;;-1:-1:-1;4106:275:1:o;4386:712::-;4440:5;4493:3;4486:4;4478:6;4474:17;4470:27;4460:55;;4511:1;4508;4501:12;4460:55;4547:6;4534:20;4573:4;4596:18;4592:2;4589:26;4586:52;;;4618:18;;:::i;:::-;4664:2;4661:1;4657:10;4687:28;4711:2;4707;4703:11;4687:28;:::i;:::-;4749:15;;;4819;;;4815:24;;;4780:12;;;;4851:15;;;4848:35;;;4879:1;4876;4869:12;4848:35;4915:2;4907:6;4903:15;4892:26;;4927:142;4943:6;4938:3;4935:15;4927:142;;;5009:17;;4997:30;;4960:12;;;;5047;;;;4927:142;;;5087:5;4386:712;-1:-1:-1;;;;;;;4386:712:1:o;5103:490::-;5205:6;5213;5221;5274:2;5262:9;5253:7;5249:23;5245:32;5242:52;;;5290:1;5287;5280:12;5242:52;5313:29;5332:9;5313:29;:::i;:::-;5303:39;;5389:2;5378:9;5374:18;5361:32;5351:42;;5444:2;5433:9;5429:18;5416:32;5471:18;5463:6;5460:30;5457:50;;;5503:1;5500;5493:12;5457:50;5526:61;5579:7;5570:6;5559:9;5555:22;5526:61;:::i;:::-;5516:71;;;5103:490;;;;;:::o;5598:186::-;5657:6;5710:2;5698:9;5689:7;5685:23;5681:32;5678:52;;;5726:1;5723;5716:12;5678:52;5749:29;5768:9;5749:29;:::i;5974:254::-;6039:6;6047;6100:2;6088:9;6079:7;6075:23;6071:32;6068:52;;;6116:1;6113;6106:12;6068:52;6139:29;6158:9;6139:29;:::i;:::-;6129:39;;6187:35;6218:2;6207:9;6203:18;6187:35;:::i;:::-;6177:45;;5974:254;;;;;:::o;6233:422::-;6326:6;6334;6387:2;6375:9;6366:7;6362:23;6358:32;6355:52;;;6403:1;6400;6393:12;6355:52;6426:29;6445:9;6426:29;:::i;:::-;6416:39;;6506:2;6495:9;6491:18;6478:32;6533:18;6525:6;6522:30;6519:50;;;6565:1;6562;6555:12;6519:50;6588:61;6641:7;6632:6;6621:9;6617:22;6588:61;:::i;:::-;6578:71;;;6233:422;;;;;:::o;6660:808::-;6757:6;6765;6773;6781;6789;6842:3;6830:9;6821:7;6817:23;6813:33;6810:53;;;6859:1;6856;6849:12;6810:53;6882:29;6901:9;6882:29;:::i;:::-;6872:39;;6930:38;6964:2;6953:9;6949:18;6930:38;:::i;:::-;6920:48;;7015:2;7004:9;7000:18;6987:32;6977:42;;7070:2;7059:9;7055:18;7042:32;7093:18;7134:2;7126:6;7123:14;7120:34;;;7150:1;7147;7140:12;7120:34;7188:6;7177:9;7173:22;7163:32;;7233:7;7226:4;7222:2;7218:13;7214:27;7204:55;;7255:1;7252;7245:12;7204:55;7295:2;7282:16;7321:2;7313:6;7310:14;7307:34;;;7337:1;7334;7327:12;7307:34;7382:7;7377:2;7368:6;7364:2;7360:15;7356:24;7353:37;7350:57;;;7403:1;7400;7393:12;7350:57;6660:808;;;;-1:-1:-1;6660:808:1;;-1:-1:-1;7434:2:1;7426:11;;7456:6;6660:808;-1:-1:-1;;;6660:808:1:o;7473:531::-;7516:5;7569:3;7562:4;7554:6;7550:17;7546:27;7536:55;;7587:1;7584;7577:12;7536:55;7623:6;7610:20;7649:18;7645:2;7642:26;7639:52;;;7671:18;;:::i;:::-;7715:55;7758:2;7739:13;;-1:-1:-1;;7735:27:1;7764:4;7731:38;7715:55;:::i;:::-;7795:2;7786:7;7779:19;7841:3;7834:4;7829:2;7821:6;7817:15;7813:26;7810:35;7807:55;;;7858:1;7855;7848:12;7807:55;7923:2;7916:4;7908:6;7904:17;7897:4;7888:7;7884:18;7871:55;7971:1;7946:16;;;7964:4;7942:27;7935:38;;;;7950:7;7473:531;-1:-1:-1;;;7473:531:1:o;8009:543::-;8097:6;8105;8158:2;8146:9;8137:7;8133:23;8129:32;8126:52;;;8174:1;8171;8164:12;8126:52;8214:9;8201:23;8243:18;8284:2;8276:6;8273:14;8270:34;;;8300:1;8297;8290:12;8270:34;8323:50;8365:7;8356:6;8345:9;8341:22;8323:50;:::i;:::-;8313:60;;8426:2;8415:9;8411:18;8398:32;8382:48;;8455:2;8445:8;8442:16;8439:36;;;8471:1;8468;8461:12;8439:36;;8494:52;8538:7;8527:8;8516:9;8512:24;8494:52;:::i;8557:260::-;8625:6;8633;8686:2;8674:9;8665:7;8661:23;8657:32;8654:52;;;8702:1;8699;8692:12;8654:52;8725:29;8744:9;8725:29;:::i;:::-;8715:39;;8773:38;8807:2;8796:9;8792:18;8773:38;:::i;8822:380::-;8901:1;8897:12;;;;8944;;;8965:61;;9019:4;9011:6;9007:17;8997:27;;8965:61;9072:2;9064:6;9061:14;9041:18;9038:38;9035:161;;9118:10;9113:3;9109:20;9106:1;9099:31;9153:4;9150:1;9143:15;9181:4;9178:1;9171:15;9035:161;;8822:380;;;:::o;10235:127::-;10296:10;10291:3;10287:20;10284:1;10277:31;10327:4;10324:1;10317:15;10351:4;10348:1;10341:15;10367:168;10407:7;10473:1;10469;10465:6;10461:14;10458:1;10455:21;10450:1;10443:9;10436:17;10432:45;10429:71;;;10480:18;;:::i;:::-;-1:-1:-1;10520:9:1;;10367:168::o;10540:217::-;10580:1;10606;10596:132;;10650:10;10645:3;10641:20;10638:1;10631:31;10685:4;10682:1;10675:15;10713:4;10710:1;10703:15;10596:132;-1:-1:-1;10742:9:1;;10540:217::o;11322:249::-;11391:6;11444:2;11432:9;11423:7;11419:23;11415:32;11412:52;;;11460:1;11457;11450:12;11412:52;11492:9;11486:16;11511:30;11535:5;11511:30;:::i;11576:340::-;11778:2;11760:21;;;11817:2;11797:18;;;11790:30;-1:-1:-1;;;11851:2:1;11836:18;;11829:46;11907:2;11892:18;;11576:340::o;12620:128::-;12660:3;12691:1;12687:6;12684:1;12681:13;12678:39;;;12697:18;;:::i;:::-;-1:-1:-1;12733:9:1;;12620:128::o;13169:135::-;13208:3;13229:17;;;13226:43;;13249:18;;:::i;:::-;-1:-1:-1;13296:1:1;13285:13;;13169:135::o;14433:662::-;-1:-1:-1;;;;;14712:15:1;;;14694:34;;14764:15;;14759:2;14744:18;;14737:43;14811:2;14796:18;;14789:34;;;14859:3;14854:2;14839:18;;14832:31;;;14879:19;;14872:35;;;14637:4;14900:6;14950;14674:3;14929:19;;14916:49;15015:1;15009:3;15000:6;14989:9;14985:22;14981:32;14974:43;15085:3;15078:2;15074:7;15069:2;15061:6;15057:15;15053:29;15042:9;15038:45;15034:55;15026:63;;14433:662;;;;;;;;:::o;17690:127::-;17751:10;17746:3;17742:20;17739:1;17732:31;17782:4;17779:1;17772:15;17806:4;17803:1;17796:15

Swarm Source

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