ETH Price: $3,421.31 (+3.80%)

Token

Luminal Credit (LUMICREDIT)
 

Overview

Max Total Supply

500 LUMICREDIT

Holders

169

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
nftlaurent.eth
Balance
4 LUMICREDIT
0x23602ca06e977c86339ffddad74966e824ab691e
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:
LuminalCredit

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT

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

pragma solidity ^0.8.0;

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

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

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

pragma solidity ^0.8.0;

/**
 * @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);
}

// OpenZeppelin Contracts v4.4.0 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}

// OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

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

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

// OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

// OpenZeppelin Contracts v4.4.0 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

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

pragma solidity ^0.8.0;

/**
 * @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;
    }
}

// OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.6;

library Address {
    function isContract(address account) internal view returns (bool) {
        uint size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }
}

// OpenZeppelin Contracts v4.4.0 (utils/Strings.sol)

pragma solidity ^0.8.0;

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

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPIs 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);
    }
}

pragma solidity ^0.8.7;

abstract contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;
    
    string private _name;
    string private _symbol;

    // Mapping from token ID to owner address
    address[] internal _owners;

    mapping(uint256 => address) private _tokenApprovals;
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) 
        public 
        view 
        virtual 
        override 
        returns (uint) 
    {
        require(owner != address(0), "ERC721: balance query for the zero address");

        uint count;
        for( uint i; i < _owners.length; ++i ){
          if( owner == _owners[i] )
            ++count;
        }
        return count;
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId)
        public
        view
        virtual
        override
        returns (address)
    {
        address owner = _owners[tokenId];
        require(
            owner != address(0),
            "ERC721: owner query for nonexistent token"
        );
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId)
        public
        view
        virtual
        override
        returns (address)
    {
        require(
            _exists(tokenId),
            "ERC721: approved query for nonexistent token"
        );

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved)
        public
        virtual
        override
    {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator)
        public
        view
        virtual
        override
        returns (bool)
    {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(
            _isApprovedOrOwner(_msgSender(), tokenId),
            "ERC721: transfer caller is not owner nor approved"
        );

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(
            _isApprovedOrOwner(_msgSender(), tokenId),
            "ERC721: transfer caller is not owner nor approved"
        );
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return tokenId < _owners.length && _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId)
        internal
        view
        virtual
        returns (bool)
    {
        require(
            _exists(tokenId),
            "ERC721: operator query for nonexistent token"
        );
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner ||
            getApproved(tokenId) == spender ||
            isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);
        _owners.push(to);

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

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);
        _owners[tokenId] = address(0);

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

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(
            ERC721.ownerOf(tokenId) == from,
            "ERC721: transfer of token that is not own"
        );
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try
                IERC721Receiver(to).onERC721Received(
                    _msgSender(),
                    from,
                    tokenId,
                    _data
                )
            returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert(
                        "ERC721: transfer to non ERC721Receiver implementer"
                    );
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

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

// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/extensions/ERC721Burnable.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC721 Burnable Token
 * @dev ERC721 Token that can be burned (destroyed).
 */
abstract contract ERC721Burnable is Context, ERC721 {
    /**
     * @dev Burns `tokenId`. See {ERC721-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId) public virtual {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved");
        _burn(tokenId);
    }
}

pragma solidity ^0.8.7;

/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account but rips out the core of the gas-wasting processing that comes from OpenZeppelin.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable, ERC721Burnable {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) {
        return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId);
    }

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

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < _owners.length, "ERC721Enumerable: global index out of bounds");
        return index;
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256 tokenId) {
        require(index < balanceOf(owner), "ERC721Enumerable: owner index out of bounds");

        uint count;
        for(uint i; i < _owners.length; i++){
            if(owner == _owners[i]){
                if(count == index) return i;
                else count++;
            }
        }

        revert("ERC721Enumerable: owner index out of bounds");
    }
}

// OpenZeppelin Contracts v4.4.0 (access/Ownable.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _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 v4.4.0 (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees 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.
 */
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 Returns the rebuilt hash obtained by traversing a Merklee 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++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = keccak256(abi.encodePacked(computedHash, proofElement));
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = keccak256(abi.encodePacked(proofElement, computedHash));
            }
        }
        return computedHash;
    }
}

pragma solidity ^0.8.11;
pragma abicoder v2;

contract LuminalCredit is ERC721Enumerable, Ownable {
  using SafeMath    for uint256;
  using MerkleProof for bytes32[];

  mapping(address => uint256) private allowance;
  bytes32 public allowlistMerkleRoot;
  bool public preSaleIsActive = false;
  string public baseURI;
  mapping(address => bool) public projectProxy;

  uint256 public constant MAX_CREDITS = 500;
  
  constructor() ERC721("Luminal Credit", "LUMICREDIT") {
    setBaseURI("https://mint.luminalgenesis.xyz/api/metadata/");
    setRoot(0x57210f9254703b1ccfbf77a2bb8118bdf680f3340d03ebd0ab4b76118b8dc367);
  }

  function withdraw() external onlyOwner {
    uint256 balance = address(this).balance;
    require(balance > 0, "Your balance is zero");
    (bool ownerSuccess, ) = payable(msg.sender).call{value: balance}("");
    require(ownerSuccess, "Failed to send to Owner.");
  }
  
  function flipProxyState(address proxyAddress) external onlyOwner {
    projectProxy[proxyAddress] = !projectProxy[proxyAddress];
  }

  function setBaseURI(string memory _baseURI) public onlyOwner {
    baseURI = _baseURI;
  }

  function flipPreSaleState() external onlyOwner {
    preSaleIsActive = !preSaleIsActive;
  }
  
  function setRoot(bytes32 root) public onlyOwner {
    allowlistMerkleRoot = root;
  }

  function mint(uint256 numberOfTokens, uint256 allowed, bytes32[] memory proof) external payable {
    require(msg.sender == tx.origin, "No smart contracts allowed.");
    require(preSaleIsActive, "Pre-sale not started or has ended");
    require(
      _verify(_leaf(msg.sender, allowed), proof),
      "Your address is not whitelisted"
    );
    require(allowance[msg.sender] + numberOfTokens <= allowed, "Exceeds wallet allowance");

    allowance[msg.sender] += numberOfTokens;
    for (uint i; i < numberOfTokens; i++) {
      _mint(msg.sender, totalSupply());
    }
  }

  function airdrop(address _to, uint256 _numberOfTokens) external onlyOwner {
    uint256 supply = totalSupply();
    require(supply + _numberOfTokens <= MAX_CREDITS, "Purchase would exceed max supply");
    for (uint256 i; i < _numberOfTokens; i++) {
      _safeMint(_to, supply + i);
    }
  }

  function _leaf(address account, uint256 allowed) internal pure returns (bytes32) {
    return keccak256(abi.encodePacked(account, allowed));
  }

  function _verify(bytes32 leaf, bytes32[] memory proof) internal view returns (bool) {
    return MerkleProof.verify(proof, allowlistMerkleRoot, leaf);
  }

  function tokenURI(uint256 _tokenId) external view returns (string memory) {
    require(_exists(_tokenId), "Token does not exist");
    return string(abi.encodePacked(baseURI, Strings.toString(_tokenId)));
  }

  function isApprovedForAll(address _localOwner, address operator) public view override returns (bool) {
    if (projectProxy[operator]) return true;
    return super.isApprovedForAll(_localOwner, operator);
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","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":"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":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_CREDITS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_numberOfTokens","type":"uint256"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"allowlistMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","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":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipPreSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"proxyAddress","type":"address"}],"name":"flipProxyState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_localOwner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"},{"internalType":"uint256","name":"allowed","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preSaleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"projectProxy","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","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":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","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":"string","name":"_baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"root","type":"bytes32"}],"name":"setRoot","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":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"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":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526008805460ff191690553480156200001b57600080fd5b50604080518082018252600e81526d131d5b5a5b985b0810dc99591a5d60921b60208083019182528351808501909452600a8452691315535250d49151125560b21b90840152815191929162000074916000916200020a565b5080516200008a9060019060208401906200020a565b505050620000a7620000a1620000fc60201b60201c565b62000100565b620000cb6040518060600160405280602d8152602001620026b6602d913962000152565b620000f67f57210f9254703b1ccfbf77a2bb8118bdf680f3340d03ebd0ab4b76118b8dc367620001ba565b620002ed565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6005546001600160a01b03163314620001a15760405162461bcd60e51b81526020600482018190526024820152600080516020620026e383398151915260448201526064015b60405180910390fd5b8051620001b69060099060208401906200020a565b5050565b6005546001600160a01b03163314620002055760405162461bcd60e51b81526020600482018190526024820152600080516020620026e3833981519152604482015260640162000198565b600755565b8280546200021890620002b0565b90600052602060002090601f0160209004810192826200023c576000855562000287565b82601f106200025757805160ff191683800117855562000287565b8280016001018555821562000287579182015b82811115620002875782518255916020019190600101906200026a565b506200029592915062000299565b5090565b5b808211156200029557600081556001016200029a565b600181811c90821680620002c557607f821691505b60208210811415620002e757634e487b7160e01b600052602260045260246000fd5b50919050565b6123b980620002fd6000396000f3fe6080604052600436106101e35760003560e01c80636c0360eb11610102578063c87b56dd11610095578063f032554911610064578063f03255491461055d578063f2fde38b14610572578063f73c814b14610592578063f9bb1a0b146105b257600080fd5b8063c87b56dd146104ea578063dab5f3401461050a578063e6d37b881461052a578063e985e9c51461053d57600080fd5b80638da5cb5b116100d15780638da5cb5b1461047757806395d89b4114610495578063a22cb465146104aa578063b88d4fde146104ca57600080fd5b80636c0360eb1461040d57806370a0823114610422578063715018a6146104425780638ba4cc3c1461045757600080fd5b80632f745c591161017a5780634f6ccce7116101495780634f6ccce71461037d57806355f804b31461039d5780635bab26e2146103bd5780636352211e146103ed57600080fd5b80632f745c59146103085780633ccfd60b1461032857806342842e0e1461033d57806342966c681461035d57600080fd5b806318160ddd116101b657806318160ddd146102995780631f0234d8146102b857806323b872dd146102d2578063293108e0146102f257600080fd5b806301ffc9a7146101e857806306fdde031461021d578063081812fc1461023f578063095ea7b314610277575b600080fd5b3480156101f457600080fd5b50610208610203366004611c88565b6105c8565b60405190151581526020015b60405180910390f35b34801561022957600080fd5b506102326105f3565b6040516102149190611cfd565b34801561024b57600080fd5b5061025f61025a366004611d10565b610685565b6040516001600160a01b039091168152602001610214565b34801561028357600080fd5b50610297610292366004611d45565b610712565b005b3480156102a557600080fd5b506002545b604051908152602001610214565b3480156102c457600080fd5b506008546102089060ff1681565b3480156102de57600080fd5b506102976102ed366004611d6f565b610828565b3480156102fe57600080fd5b506102aa60075481565b34801561031457600080fd5b506102aa610323366004611d45565b61085a565b34801561033457600080fd5b5061029761090d565b34801561034957600080fd5b50610297610358366004611d6f565b610a18565b34801561036957600080fd5b50610297610378366004611d10565b610a33565b34801561038957600080fd5b506102aa610398366004611d10565b610aaa565b3480156103a957600080fd5b506102976103b8366004611e4a565b610b17565b3480156103c957600080fd5b506102086103d8366004611e93565b600a6020526000908152604090205460ff1681565b3480156103f957600080fd5b5061025f610408366004611d10565b610b54565b34801561041957600080fd5b50610232610be0565b34801561042e57600080fd5b506102aa61043d366004611e93565b610c6e565b34801561044e57600080fd5b50610297610d3c565b34801561046357600080fd5b50610297610472366004611d45565b610d72565b34801561048357600080fd5b506005546001600160a01b031661025f565b3480156104a157600080fd5b50610232610e3a565b3480156104b657600080fd5b506102976104c5366004611eae565b610e49565b3480156104d657600080fd5b506102976104e5366004611eea565b610f0e565b3480156104f657600080fd5b50610232610505366004611d10565b610f40565b34801561051657600080fd5b50610297610525366004611d10565b610fc0565b610297610538366004611f66565b610fef565b34801561054957600080fd5b50610208610558366004612021565b6111ee565b34801561056957600080fd5b50610297611248565b34801561057e57600080fd5b5061029761058d366004611e93565b611286565b34801561059e57600080fd5b506102976105ad366004611e93565b61131e565b3480156105be57600080fd5b506102aa6101f481565b60006001600160e01b0319821663780e9d6360e01b14806105ed57506105ed82611371565b92915050565b60606000805461060290612054565b80601f016020809104026020016040519081016040528092919081815260200182805461062e90612054565b801561067b5780601f106106505761010080835404028352916020019161067b565b820191906000526020600020905b81548152906001019060200180831161065e57829003601f168201915b5050505050905090565b6000610690826113c1565b6106f65760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600360205260409020546001600160a01b031690565b600061071d82610b54565b9050806001600160a01b0316836001600160a01b0316141561078b5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016106ed565b336001600160a01b03821614806107a757506107a781336111ee565b6108195760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016106ed565b610823838361140b565b505050565b610833335b82611479565b61084f5760405162461bcd60e51b81526004016106ed9061208f565b610823838383611543565b600061086583610c6e565b82106108835760405162461bcd60e51b81526004016106ed906120e0565b6000805b6002548110156108f457600281815481106108a4576108a461212b565b6000918252602090912001546001600160a01b03868116911614156108e257838214156108d45791506105ed9050565b816108de81612157565b9250505b806108ec81612157565b915050610887565b5060405162461bcd60e51b81526004016106ed906120e0565b6005546001600160a01b031633146109375760405162461bcd60e51b81526004016106ed90612172565b478061097c5760405162461bcd60e51b8152602060048201526014602482015273596f75722062616c616e6365206973207a65726f60601b60448201526064016106ed565b604051600090339083908381818185875af1925050503d80600081146109be576040519150601f19603f3d011682016040523d82523d6000602084013e6109c3565b606091505b5050905080610a145760405162461bcd60e51b815260206004820152601860248201527f4661696c656420746f2073656e6420746f204f776e65722e000000000000000060448201526064016106ed565b5050565b61082383838360405180602001604052806000815250610f0e565b610a3c3361082d565b610a9e5760405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201526c1c881bdc88185c1c1c9bdd9959609a1b60648201526084016106ed565b610aa781611699565b50565b6002546000908210610b135760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016106ed565b5090565b6005546001600160a01b03163314610b415760405162461bcd60e51b81526004016106ed90612172565b8051610a14906009906020840190611be2565b60008060028381548110610b6a57610b6a61212b565b6000918252602090912001546001600160a01b03169050806105ed5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016106ed565b60098054610bed90612054565b80601f0160208091040260200160405190810160405280929190818152602001828054610c1990612054565b8015610c665780601f10610c3b57610100808354040283529160200191610c66565b820191906000526020600020905b815481529060010190602001808311610c4957829003601f168201915b505050505081565b60006001600160a01b038216610cd95760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016106ed565b6000805b600254811015610d355760028181548110610cfa57610cfa61212b565b6000918252602090912001546001600160a01b0385811691161415610d2557610d2282612157565b91505b610d2e81612157565b9050610cdd565b5092915050565b6005546001600160a01b03163314610d665760405162461bcd60e51b81526004016106ed90612172565b610d70600061171b565b565b6005546001600160a01b03163314610d9c5760405162461bcd60e51b81526004016106ed90612172565b6000610da760025490565b90506101f4610db683836121a7565b1115610e045760405162461bcd60e51b815260206004820181905260248201527f507572636861736520776f756c6420657863656564206d617820737570706c7960448201526064016106ed565b60005b82811015610e3457610e2284610e1d83856121a7565b61176d565b80610e2c81612157565b915050610e07565b50505050565b60606001805461060290612054565b6001600160a01b038216331415610ea25760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016106ed565b3360008181526004602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610f183383611479565b610f345760405162461bcd60e51b81526004016106ed9061208f565b610e3484848484611787565b6060610f4b826113c1565b610f8e5760405162461bcd60e51b8152602060048201526014602482015273151bdad95b88191bd95cc81b9bdd08195e1a5cdd60621b60448201526064016106ed565b6009610f99836117ba565b604051602001610faa9291906121db565b6040516020818303038152906040529050919050565b6005546001600160a01b03163314610fea5760405162461bcd60e51b81526004016106ed90612172565b600755565b33321461103e5760405162461bcd60e51b815260206004820152601b60248201527f4e6f20736d61727420636f6e74726163747320616c6c6f7765642e000000000060448201526064016106ed565b60085460ff1661109a5760405162461bcd60e51b815260206004820152602160248201527f5072652d73616c65206e6f742073746172746564206f722068617320656e64656044820152601960fa1b60648201526084016106ed565b604080513360601b6bffffffffffffffffffffffff1916602080830191909152603480830186905283518084039091018152605490920190925280519101206110e390826118b8565b61112f5760405162461bcd60e51b815260206004820152601f60248201527f596f75722061646472657373206973206e6f742077686974656c69737465640060448201526064016106ed565b33600090815260066020526040902054829061114c9085906121a7565b111561119a5760405162461bcd60e51b815260206004820152601860248201527f457863656564732077616c6c657420616c6c6f77616e6365000000000000000060448201526064016106ed565b33600090815260066020526040812080548592906111b99084906121a7565b90915550600090505b83811015610e34576111dc336111d760025490565b6118c7565b806111e681612157565b9150506111c2565b6001600160a01b0381166000908152600a602052604081205460ff1615611217575060016105ed565b6001600160a01b0380841660009081526004602090815260408083209386168352929052205460ff165b9392505050565b6005546001600160a01b031633146112725760405162461bcd60e51b81526004016106ed90612172565b6008805460ff19811660ff90911615179055565b6005546001600160a01b031633146112b05760405162461bcd60e51b81526004016106ed90612172565b6001600160a01b0381166113155760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106ed565b610aa78161171b565b6005546001600160a01b031633146113485760405162461bcd60e51b81526004016106ed90612172565b6001600160a01b03166000908152600a60205260409020805460ff19811660ff90911615179055565b60006001600160e01b031982166380ac58cd60e01b14806113a257506001600160e01b03198216635b5e139f60e01b145b806105ed57506301ffc9a760e01b6001600160e01b03198316146105ed565b600254600090821080156105ed575060006001600160a01b0316600283815481106113ee576113ee61212b565b6000918252602090912001546001600160a01b0316141592915050565b600081815260036020526040902080546001600160a01b0319166001600160a01b038416908117909155819061144082610b54565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611484826113c1565b6114e55760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016106ed565b60006114f083610b54565b9050806001600160a01b0316846001600160a01b0316148061152b5750836001600160a01b031661152084610685565b6001600160a01b0316145b8061153b575061153b81856111ee565b949350505050565b826001600160a01b031661155682610b54565b6001600160a01b0316146115be5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016106ed565b6001600160a01b0382166116205760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016106ed565b61162b60008261140b565b816002828154811061163f5761163f61212b565b6000918252602082200180546001600160a01b0319166001600160a01b03938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b60006116a482610b54565b90506116b160008361140b565b6000600283815481106116c6576116c661212b565b6000918252602082200180546001600160a01b0319166001600160a01b0393841617905560405184928416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b610a148282604051806020016040528060008152506119ef565b611792848484611543565b61179e84848484611a22565b610e345760405162461bcd60e51b81526004016106ed90612282565b6060816117de5750506040805180820190915260018152600360fc1b602082015290565b8160005b811561180857806117f281612157565b91506118019050600a836122ea565b91506117e2565b60008167ffffffffffffffff81111561182357611823611dab565b6040519080825280601f01601f19166020018201604052801561184d576020820181803683370190505b5090505b841561153b576118626001836122fe565b915061186f600a86612315565b61187a9060306121a7565b60f81b81838151811061188f5761188f61212b565b60200101906001600160f81b031916908160001a9053506118b1600a866122ea565b9450611851565b60006112418260075485611b20565b6001600160a01b03821661191d5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016106ed565b611926816113c1565b156119735760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016106ed565b6002805460018101825560009182527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180546001600160a01b0319166001600160a01b0385169081179091556040518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6119f983836118c7565b611a066000848484611a22565b6108235760405162461bcd60e51b81526004016106ed90612282565b60006001600160a01b0384163b15611b1557604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611a66903390899088908890600401612329565b6020604051808303816000875af1925050508015611aa1575060408051601f3d908101601f19168201909252611a9e91810190612366565b60015b611afb573d808015611acf576040519150601f19603f3d011682016040523d82523d6000602084013e611ad4565b606091505b508051611af35760405162461bcd60e51b81526004016106ed90612282565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061153b565b506001949350505050565b600082611b2d8584611b36565b14949350505050565b600081815b8451811015611bda576000858281518110611b5857611b5861212b565b60200260200101519050808311611b9a576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250611bc7565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080611bd281612157565b915050611b3b565b509392505050565b828054611bee90612054565b90600052602060002090601f016020900481019282611c105760008555611c56565b82601f10611c2957805160ff1916838001178555611c56565b82800160010185558215611c56579182015b82811115611c56578251825591602001919060010190611c3b565b50610b139291505b80821115610b135760008155600101611c5e565b6001600160e01b031981168114610aa757600080fd5b600060208284031215611c9a57600080fd5b813561124181611c72565b60005b83811015611cc0578181015183820152602001611ca8565b83811115610e345750506000910152565b60008151808452611ce9816020860160208601611ca5565b601f01601f19169290920160200192915050565b6020815260006112416020830184611cd1565b600060208284031215611d2257600080fd5b5035919050565b80356001600160a01b0381168114611d4057600080fd5b919050565b60008060408385031215611d5857600080fd5b611d6183611d29565b946020939093013593505050565b600080600060608486031215611d8457600080fd5b611d8d84611d29565b9250611d9b60208501611d29565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611dea57611dea611dab565b604052919050565b600067ffffffffffffffff831115611e0c57611e0c611dab565b611e1f601f8401601f1916602001611dc1565b9050828152838383011115611e3357600080fd5b828260208301376000602084830101529392505050565b600060208284031215611e5c57600080fd5b813567ffffffffffffffff811115611e7357600080fd5b8201601f81018413611e8457600080fd5b61153b84823560208401611df2565b600060208284031215611ea557600080fd5b61124182611d29565b60008060408385031215611ec157600080fd5b611eca83611d29565b915060208301358015158114611edf57600080fd5b809150509250929050565b60008060008060808587031215611f0057600080fd5b611f0985611d29565b9350611f1760208601611d29565b925060408501359150606085013567ffffffffffffffff811115611f3a57600080fd5b8501601f81018713611f4b57600080fd5b611f5a87823560208401611df2565b91505092959194509250565b600080600060608486031215611f7b57600080fd5b833592506020808501359250604085013567ffffffffffffffff80821115611fa257600080fd5b818701915087601f830112611fb657600080fd5b813581811115611fc857611fc8611dab565b8060051b9150611fd9848301611dc1565b818152918301840191848101908a841115611ff357600080fd5b938501935b8385101561201157843582529385019390850190611ff8565b8096505050505050509250925092565b6000806040838503121561203457600080fd5b61203d83611d29565b915061204b60208401611d29565b90509250929050565b600181811c9082168061206857607f821691505b6020821081141561208957634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060001982141561216b5761216b612141565b5060010190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600082198211156121ba576121ba612141565b500190565b600081516121d1818560208601611ca5565b9290920192915050565b600080845481600182811c9150808316806121f757607f831692505b602080841082141561221757634e487b7160e01b86526022600452602486fd5b81801561222b576001811461223c57612269565b60ff19861689528489019650612269565b60008b81526020902060005b868110156122615781548b820152908501908301612248565b505084890196505b50505050505061227981856121bf565b95945050505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b6000826122f9576122f96122d4565b500490565b60008282101561231057612310612141565b500390565b600082612324576123246122d4565b500690565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061235c90830184611cd1565b9695505050505050565b60006020828403121561237857600080fd5b815161124181611c7256fea26469706673582212201b071e0db3acb81d00269b62dcca2857af2aa648b0672e02212fcab45f6e9ab064736f6c634300080b003368747470733a2f2f6d696e742e6c756d696e616c67656e657369732e78797a2f6170692f6d657461646174612f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572

Deployed Bytecode

0x6080604052600436106101e35760003560e01c80636c0360eb11610102578063c87b56dd11610095578063f032554911610064578063f03255491461055d578063f2fde38b14610572578063f73c814b14610592578063f9bb1a0b146105b257600080fd5b8063c87b56dd146104ea578063dab5f3401461050a578063e6d37b881461052a578063e985e9c51461053d57600080fd5b80638da5cb5b116100d15780638da5cb5b1461047757806395d89b4114610495578063a22cb465146104aa578063b88d4fde146104ca57600080fd5b80636c0360eb1461040d57806370a0823114610422578063715018a6146104425780638ba4cc3c1461045757600080fd5b80632f745c591161017a5780634f6ccce7116101495780634f6ccce71461037d57806355f804b31461039d5780635bab26e2146103bd5780636352211e146103ed57600080fd5b80632f745c59146103085780633ccfd60b1461032857806342842e0e1461033d57806342966c681461035d57600080fd5b806318160ddd116101b657806318160ddd146102995780631f0234d8146102b857806323b872dd146102d2578063293108e0146102f257600080fd5b806301ffc9a7146101e857806306fdde031461021d578063081812fc1461023f578063095ea7b314610277575b600080fd5b3480156101f457600080fd5b50610208610203366004611c88565b6105c8565b60405190151581526020015b60405180910390f35b34801561022957600080fd5b506102326105f3565b6040516102149190611cfd565b34801561024b57600080fd5b5061025f61025a366004611d10565b610685565b6040516001600160a01b039091168152602001610214565b34801561028357600080fd5b50610297610292366004611d45565b610712565b005b3480156102a557600080fd5b506002545b604051908152602001610214565b3480156102c457600080fd5b506008546102089060ff1681565b3480156102de57600080fd5b506102976102ed366004611d6f565b610828565b3480156102fe57600080fd5b506102aa60075481565b34801561031457600080fd5b506102aa610323366004611d45565b61085a565b34801561033457600080fd5b5061029761090d565b34801561034957600080fd5b50610297610358366004611d6f565b610a18565b34801561036957600080fd5b50610297610378366004611d10565b610a33565b34801561038957600080fd5b506102aa610398366004611d10565b610aaa565b3480156103a957600080fd5b506102976103b8366004611e4a565b610b17565b3480156103c957600080fd5b506102086103d8366004611e93565b600a6020526000908152604090205460ff1681565b3480156103f957600080fd5b5061025f610408366004611d10565b610b54565b34801561041957600080fd5b50610232610be0565b34801561042e57600080fd5b506102aa61043d366004611e93565b610c6e565b34801561044e57600080fd5b50610297610d3c565b34801561046357600080fd5b50610297610472366004611d45565b610d72565b34801561048357600080fd5b506005546001600160a01b031661025f565b3480156104a157600080fd5b50610232610e3a565b3480156104b657600080fd5b506102976104c5366004611eae565b610e49565b3480156104d657600080fd5b506102976104e5366004611eea565b610f0e565b3480156104f657600080fd5b50610232610505366004611d10565b610f40565b34801561051657600080fd5b50610297610525366004611d10565b610fc0565b610297610538366004611f66565b610fef565b34801561054957600080fd5b50610208610558366004612021565b6111ee565b34801561056957600080fd5b50610297611248565b34801561057e57600080fd5b5061029761058d366004611e93565b611286565b34801561059e57600080fd5b506102976105ad366004611e93565b61131e565b3480156105be57600080fd5b506102aa6101f481565b60006001600160e01b0319821663780e9d6360e01b14806105ed57506105ed82611371565b92915050565b60606000805461060290612054565b80601f016020809104026020016040519081016040528092919081815260200182805461062e90612054565b801561067b5780601f106106505761010080835404028352916020019161067b565b820191906000526020600020905b81548152906001019060200180831161065e57829003601f168201915b5050505050905090565b6000610690826113c1565b6106f65760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600360205260409020546001600160a01b031690565b600061071d82610b54565b9050806001600160a01b0316836001600160a01b0316141561078b5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016106ed565b336001600160a01b03821614806107a757506107a781336111ee565b6108195760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016106ed565b610823838361140b565b505050565b610833335b82611479565b61084f5760405162461bcd60e51b81526004016106ed9061208f565b610823838383611543565b600061086583610c6e565b82106108835760405162461bcd60e51b81526004016106ed906120e0565b6000805b6002548110156108f457600281815481106108a4576108a461212b565b6000918252602090912001546001600160a01b03868116911614156108e257838214156108d45791506105ed9050565b816108de81612157565b9250505b806108ec81612157565b915050610887565b5060405162461bcd60e51b81526004016106ed906120e0565b6005546001600160a01b031633146109375760405162461bcd60e51b81526004016106ed90612172565b478061097c5760405162461bcd60e51b8152602060048201526014602482015273596f75722062616c616e6365206973207a65726f60601b60448201526064016106ed565b604051600090339083908381818185875af1925050503d80600081146109be576040519150601f19603f3d011682016040523d82523d6000602084013e6109c3565b606091505b5050905080610a145760405162461bcd60e51b815260206004820152601860248201527f4661696c656420746f2073656e6420746f204f776e65722e000000000000000060448201526064016106ed565b5050565b61082383838360405180602001604052806000815250610f0e565b610a3c3361082d565b610a9e5760405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201526c1c881bdc88185c1c1c9bdd9959609a1b60648201526084016106ed565b610aa781611699565b50565b6002546000908210610b135760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016106ed565b5090565b6005546001600160a01b03163314610b415760405162461bcd60e51b81526004016106ed90612172565b8051610a14906009906020840190611be2565b60008060028381548110610b6a57610b6a61212b565b6000918252602090912001546001600160a01b03169050806105ed5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016106ed565b60098054610bed90612054565b80601f0160208091040260200160405190810160405280929190818152602001828054610c1990612054565b8015610c665780601f10610c3b57610100808354040283529160200191610c66565b820191906000526020600020905b815481529060010190602001808311610c4957829003601f168201915b505050505081565b60006001600160a01b038216610cd95760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016106ed565b6000805b600254811015610d355760028181548110610cfa57610cfa61212b565b6000918252602090912001546001600160a01b0385811691161415610d2557610d2282612157565b91505b610d2e81612157565b9050610cdd565b5092915050565b6005546001600160a01b03163314610d665760405162461bcd60e51b81526004016106ed90612172565b610d70600061171b565b565b6005546001600160a01b03163314610d9c5760405162461bcd60e51b81526004016106ed90612172565b6000610da760025490565b90506101f4610db683836121a7565b1115610e045760405162461bcd60e51b815260206004820181905260248201527f507572636861736520776f756c6420657863656564206d617820737570706c7960448201526064016106ed565b60005b82811015610e3457610e2284610e1d83856121a7565b61176d565b80610e2c81612157565b915050610e07565b50505050565b60606001805461060290612054565b6001600160a01b038216331415610ea25760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016106ed565b3360008181526004602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610f183383611479565b610f345760405162461bcd60e51b81526004016106ed9061208f565b610e3484848484611787565b6060610f4b826113c1565b610f8e5760405162461bcd60e51b8152602060048201526014602482015273151bdad95b88191bd95cc81b9bdd08195e1a5cdd60621b60448201526064016106ed565b6009610f99836117ba565b604051602001610faa9291906121db565b6040516020818303038152906040529050919050565b6005546001600160a01b03163314610fea5760405162461bcd60e51b81526004016106ed90612172565b600755565b33321461103e5760405162461bcd60e51b815260206004820152601b60248201527f4e6f20736d61727420636f6e74726163747320616c6c6f7765642e000000000060448201526064016106ed565b60085460ff1661109a5760405162461bcd60e51b815260206004820152602160248201527f5072652d73616c65206e6f742073746172746564206f722068617320656e64656044820152601960fa1b60648201526084016106ed565b604080513360601b6bffffffffffffffffffffffff1916602080830191909152603480830186905283518084039091018152605490920190925280519101206110e390826118b8565b61112f5760405162461bcd60e51b815260206004820152601f60248201527f596f75722061646472657373206973206e6f742077686974656c69737465640060448201526064016106ed565b33600090815260066020526040902054829061114c9085906121a7565b111561119a5760405162461bcd60e51b815260206004820152601860248201527f457863656564732077616c6c657420616c6c6f77616e6365000000000000000060448201526064016106ed565b33600090815260066020526040812080548592906111b99084906121a7565b90915550600090505b83811015610e34576111dc336111d760025490565b6118c7565b806111e681612157565b9150506111c2565b6001600160a01b0381166000908152600a602052604081205460ff1615611217575060016105ed565b6001600160a01b0380841660009081526004602090815260408083209386168352929052205460ff165b9392505050565b6005546001600160a01b031633146112725760405162461bcd60e51b81526004016106ed90612172565b6008805460ff19811660ff90911615179055565b6005546001600160a01b031633146112b05760405162461bcd60e51b81526004016106ed90612172565b6001600160a01b0381166113155760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106ed565b610aa78161171b565b6005546001600160a01b031633146113485760405162461bcd60e51b81526004016106ed90612172565b6001600160a01b03166000908152600a60205260409020805460ff19811660ff90911615179055565b60006001600160e01b031982166380ac58cd60e01b14806113a257506001600160e01b03198216635b5e139f60e01b145b806105ed57506301ffc9a760e01b6001600160e01b03198316146105ed565b600254600090821080156105ed575060006001600160a01b0316600283815481106113ee576113ee61212b565b6000918252602090912001546001600160a01b0316141592915050565b600081815260036020526040902080546001600160a01b0319166001600160a01b038416908117909155819061144082610b54565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611484826113c1565b6114e55760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016106ed565b60006114f083610b54565b9050806001600160a01b0316846001600160a01b0316148061152b5750836001600160a01b031661152084610685565b6001600160a01b0316145b8061153b575061153b81856111ee565b949350505050565b826001600160a01b031661155682610b54565b6001600160a01b0316146115be5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016106ed565b6001600160a01b0382166116205760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016106ed565b61162b60008261140b565b816002828154811061163f5761163f61212b565b6000918252602082200180546001600160a01b0319166001600160a01b03938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b60006116a482610b54565b90506116b160008361140b565b6000600283815481106116c6576116c661212b565b6000918252602082200180546001600160a01b0319166001600160a01b0393841617905560405184928416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b610a148282604051806020016040528060008152506119ef565b611792848484611543565b61179e84848484611a22565b610e345760405162461bcd60e51b81526004016106ed90612282565b6060816117de5750506040805180820190915260018152600360fc1b602082015290565b8160005b811561180857806117f281612157565b91506118019050600a836122ea565b91506117e2565b60008167ffffffffffffffff81111561182357611823611dab565b6040519080825280601f01601f19166020018201604052801561184d576020820181803683370190505b5090505b841561153b576118626001836122fe565b915061186f600a86612315565b61187a9060306121a7565b60f81b81838151811061188f5761188f61212b565b60200101906001600160f81b031916908160001a9053506118b1600a866122ea565b9450611851565b60006112418260075485611b20565b6001600160a01b03821661191d5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016106ed565b611926816113c1565b156119735760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016106ed565b6002805460018101825560009182527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180546001600160a01b0319166001600160a01b0385169081179091556040518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6119f983836118c7565b611a066000848484611a22565b6108235760405162461bcd60e51b81526004016106ed90612282565b60006001600160a01b0384163b15611b1557604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611a66903390899088908890600401612329565b6020604051808303816000875af1925050508015611aa1575060408051601f3d908101601f19168201909252611a9e91810190612366565b60015b611afb573d808015611acf576040519150601f19603f3d011682016040523d82523d6000602084013e611ad4565b606091505b508051611af35760405162461bcd60e51b81526004016106ed90612282565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061153b565b506001949350505050565b600082611b2d8584611b36565b14949350505050565b600081815b8451811015611bda576000858281518110611b5857611b5861212b565b60200260200101519050808311611b9a576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250611bc7565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080611bd281612157565b915050611b3b565b509392505050565b828054611bee90612054565b90600052602060002090601f016020900481019282611c105760008555611c56565b82601f10611c2957805160ff1916838001178555611c56565b82800160010185558215611c56579182015b82811115611c56578251825591602001919060010190611c3b565b50610b139291505b80821115610b135760008155600101611c5e565b6001600160e01b031981168114610aa757600080fd5b600060208284031215611c9a57600080fd5b813561124181611c72565b60005b83811015611cc0578181015183820152602001611ca8565b83811115610e345750506000910152565b60008151808452611ce9816020860160208601611ca5565b601f01601f19169290920160200192915050565b6020815260006112416020830184611cd1565b600060208284031215611d2257600080fd5b5035919050565b80356001600160a01b0381168114611d4057600080fd5b919050565b60008060408385031215611d5857600080fd5b611d6183611d29565b946020939093013593505050565b600080600060608486031215611d8457600080fd5b611d8d84611d29565b9250611d9b60208501611d29565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611dea57611dea611dab565b604052919050565b600067ffffffffffffffff831115611e0c57611e0c611dab565b611e1f601f8401601f1916602001611dc1565b9050828152838383011115611e3357600080fd5b828260208301376000602084830101529392505050565b600060208284031215611e5c57600080fd5b813567ffffffffffffffff811115611e7357600080fd5b8201601f81018413611e8457600080fd5b61153b84823560208401611df2565b600060208284031215611ea557600080fd5b61124182611d29565b60008060408385031215611ec157600080fd5b611eca83611d29565b915060208301358015158114611edf57600080fd5b809150509250929050565b60008060008060808587031215611f0057600080fd5b611f0985611d29565b9350611f1760208601611d29565b925060408501359150606085013567ffffffffffffffff811115611f3a57600080fd5b8501601f81018713611f4b57600080fd5b611f5a87823560208401611df2565b91505092959194509250565b600080600060608486031215611f7b57600080fd5b833592506020808501359250604085013567ffffffffffffffff80821115611fa257600080fd5b818701915087601f830112611fb657600080fd5b813581811115611fc857611fc8611dab565b8060051b9150611fd9848301611dc1565b818152918301840191848101908a841115611ff357600080fd5b938501935b8385101561201157843582529385019390850190611ff8565b8096505050505050509250925092565b6000806040838503121561203457600080fd5b61203d83611d29565b915061204b60208401611d29565b90509250929050565b600181811c9082168061206857607f821691505b6020821081141561208957634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060001982141561216b5761216b612141565b5060010190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600082198211156121ba576121ba612141565b500190565b600081516121d1818560208601611ca5565b9290920192915050565b600080845481600182811c9150808316806121f757607f831692505b602080841082141561221757634e487b7160e01b86526022600452602486fd5b81801561222b576001811461223c57612269565b60ff19861689528489019650612269565b60008b81526020902060005b868110156122615781548b820152908501908301612248565b505084890196505b50505050505061227981856121bf565b95945050505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b6000826122f9576122f96122d4565b500490565b60008282101561231057612310612141565b500390565b600082612324576123246122d4565b500690565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061235c90830184611cd1565b9695505050505050565b60006020828403121561237857600080fd5b815161124181611c7256fea26469706673582212201b071e0db3acb81d00269b62dcca2857af2aa648b0672e02212fcab45f6e9ab064736f6c634300080b0033

Deployed Bytecode Sourcemap

39425:2958:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33537:224;;;;;;;;;;-1:-1:-1;33537:224:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;33537:224:0;;;;;;;;21438:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;22250:308::-;;;;;;;;;;-1:-1:-1;22250:308:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1714:32:1;;;1696:51;;1684:2;1669:18;22250:308:0;1550:203:1;21773:411:0;;;;;;;;;;-1:-1:-1;21773:411:0;;;;;:::i;:::-;;:::i;:::-;;33837:110;;;;;;;;;;-1:-1:-1;33925:7:0;:14;33837:110;;;2341:25:1;;;2329:2;2314:18;33837:110:0;2195:177:1;39643:35:0;;;;;;;;;;-1:-1:-1;39643:35:0;;;;;;;;23309:376;;;;;;;;;;-1:-1:-1;23309:376:0;;;;;:::i;:::-;;:::i;39604:34::-;;;;;;;;;;;;;;;;34313:490;;;;;;;;;;-1:-1:-1;34313:490:0;;;;;:::i;:::-;;:::i;40023:273::-;;;;;;;;;;;;;:::i;23756:185::-;;;;;;;;;;-1:-1:-1;23756:185:0;;;;;:::i;:::-;;:::i;32824:242::-;;;;;;;;;;-1:-1:-1;32824:242:0;;;;;:::i;:::-;;:::i;34024:205::-;;;;;;;;;;-1:-1:-1;34024:205:0;;;;;:::i;:::-;;:::i;40444:92::-;;;;;;;;;;-1:-1:-1;40444:92:0;;;;;:::i;:::-;;:::i;39709:44::-;;;;;;;;;;-1:-1:-1;39709:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;21045:326;;;;;;;;;;-1:-1:-1;21045:326:0;;;;;:::i;:::-;;:::i;39683:21::-;;;;;;;;;;;;;:::i;20591:392::-;;;;;;;;;;-1:-1:-1;20591:392:0;;;;;:::i;:::-;;:::i;36464:103::-;;;;;;;;;;;;;:::i;41331:299::-;;;;;;;;;;-1:-1:-1;41331:299:0;;;;;:::i;:::-;;:::i;35813:87::-;;;;;;;;;;-1:-1:-1;35886:6:0;;-1:-1:-1;;;;;35886:6:0;35813:87;;21607:104;;;;;;;;;;;;;:::i;22630:327::-;;;;;;;;;;-1:-1:-1;22630:327:0;;;;;:::i;:::-;;:::i;24012:365::-;;;;;;;;;;-1:-1:-1;24012:365:0;;;;;:::i;:::-;;:::i;41950:212::-;;;;;;;;;;-1:-1:-1;41950:212:0;;;;;:::i;:::-;;:::i;40644:87::-;;;;;;;;;;-1:-1:-1;40644:87:0;;;;;:::i;:::-;;:::i;40737:588::-;;;;;;:::i;:::-;;:::i;42168:212::-;;;;;;;;;;-1:-1:-1;42168:212:0;;;;;:::i;:::-;;:::i;40542:94::-;;;;;;;;;;;;;:::i;36722:201::-;;;;;;;;;;-1:-1:-1;36722:201:0;;;;;:::i;:::-;;:::i;40304:134::-;;;;;;;;;;-1:-1:-1;40304:134:0;;;;;:::i;:::-;;:::i;39760:41::-;;;;;;;;;;;;39798:3;39760:41;;33537:224;33639:4;-1:-1:-1;;;;;;33663:50:0;;-1:-1:-1;;;33663:50:0;;:90;;;33717:36;33741:11;33717:23;:36::i;:::-;33656:97;33537:224;-1:-1:-1;;33537:224:0:o;21438:100::-;21492:13;21525:5;21518:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21438:100;:::o;22250:308::-;22371:7;22418:16;22426:7;22418;:16::i;:::-;22396:110;;;;-1:-1:-1;;;22396:110:0;;7511:2:1;22396:110:0;;;7493:21:1;7550:2;7530:18;;;7523:30;7589:34;7569:18;;;7562:62;-1:-1:-1;;;7640:18:1;;;7633:42;7692:19;;22396:110:0;;;;;;;;;-1:-1:-1;22526:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;22526:24:0;;22250:308::o;21773:411::-;21854:13;21870:23;21885:7;21870:14;:23::i;:::-;21854:39;;21918:5;-1:-1:-1;;;;;21912:11:0;:2;-1:-1:-1;;;;;21912:11:0;;;21904:57;;;;-1:-1:-1;;;21904:57:0;;7924:2:1;21904:57:0;;;7906:21:1;7963:2;7943:18;;;7936:30;8002:34;7982:18;;;7975:62;-1:-1:-1;;;8053:18:1;;;8046:31;8094:19;;21904:57:0;7722:397:1;21904:57:0;738:10;-1:-1:-1;;;;;21996:21:0;;;;:62;;-1:-1:-1;22021:37:0;22038:5;738:10;42168:212;:::i;22021:37::-;21974:168;;;;-1:-1:-1;;;21974:168:0;;8326:2:1;21974:168:0;;;8308:21:1;8365:2;8345:18;;;8338:30;8404:34;8384:18;;;8377:62;8475:26;8455:18;;;8448:54;8519:19;;21974:168:0;8124:420:1;21974:168:0;22155:21;22164:2;22168:7;22155:8;:21::i;:::-;21843:341;21773:411;;:::o;23309:376::-;23518:41;738:10;23537:12;23551:7;23518:18;:41::i;:::-;23496:140;;;;-1:-1:-1;;;23496:140:0;;;;;;;:::i;:::-;23649:28;23659:4;23665:2;23669:7;23649:9;:28::i;34313:490::-;34410:15;34454:16;34464:5;34454:9;:16::i;:::-;34446:5;:24;34438:80;;;;-1:-1:-1;;;34438:80:0;;;;;;;:::i;:::-;34531:10;34556:6;34552:178;34568:7;:14;34564:18;;34552:178;;;34615:7;34623:1;34615:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;34606:19:0;;;34615:10;;34606:19;34603:116;;;34657:5;34648;:14;34645:58;;;34671:1;-1:-1:-1;34664:8:0;;-1:-1:-1;34664:8:0;34645:58;34696:7;;;;:::i;:::-;;;;34645:58;34584:3;;;;:::i;:::-;;;;34552:178;;;;34742:53;;-1:-1:-1;;;34742:53:0;;;;;;;:::i;40023:273::-;35886:6;;-1:-1:-1;;;;;35886:6:0;738:10;36033:23;36025:68;;;;-1:-1:-1;;;36025:68:0;;;;;;;:::i;:::-;40087:21:::1;40123:11:::0;40115:44:::1;;;::::0;-1:-1:-1;;;40115:44:0;;10346:2:1;40115:44:0::1;::::0;::::1;10328:21:1::0;10385:2;10365:18;;;10358:30;-1:-1:-1;;;10404:18:1;;;10397:50;10464:18;;40115:44:0::1;10144:344:1::0;40115:44:0::1;40190;::::0;40167:17:::1;::::0;40198:10:::1;::::0;40222:7;;40167:17;40190:44;40167:17;40190:44;40222:7;40198:10;40190:44:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40166:68;;;40249:12;40241:49;;;::::0;-1:-1:-1;;;40241:49:0;;10905:2:1;40241:49:0::1;::::0;::::1;10887:21:1::0;10944:2;10924:18;;;10917:30;10983:26;10963:18;;;10956:54;11027:18;;40241:49:0::1;10703:348:1::0;40241:49:0::1;40062:234;;40023:273::o:0;23756:185::-;23894:39;23911:4;23917:2;23921:7;23894:39;;;;;;;;;;;;:16;:39::i;32824:242::-;32942:41;738:10;32961:12;658:98;32942:41;32934:99;;;;-1:-1:-1;;;32934:99:0;;11258:2:1;32934:99:0;;;11240:21:1;11297:2;11277:18;;;11270:30;11336:34;11316:18;;;11309:62;-1:-1:-1;;;11387:18:1;;;11380:43;11440:19;;32934:99:0;11056:409:1;32934:99:0;33044:14;33050:7;33044:5;:14::i;:::-;32824:242;:::o;34024:205::-;34135:7;:14;34099:7;;34127:22;;34119:79;;;;-1:-1:-1;;;34119:79:0;;11672:2:1;34119:79:0;;;11654:21:1;11711:2;11691:18;;;11684:30;11750:34;11730:18;;;11723:62;-1:-1:-1;;;11801:18:1;;;11794:42;11853:19;;34119:79:0;11470:408:1;34119:79:0;-1:-1:-1;34216:5:0;34024:205::o;40444:92::-;35886:6;;-1:-1:-1;;;;;35886:6:0;738:10;36033:23;36025:68;;;;-1:-1:-1;;;36025:68:0;;;;;;;:::i;:::-;40512:18;;::::1;::::0;:7:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;21045:326::-:0;21162:7;21187:13;21203:7;21211;21203:16;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;21203:16:0;;-1:-1:-1;21252:19:0;21230:110;;;;-1:-1:-1;;;21230:110:0;;12085:2:1;21230:110:0;;;12067:21:1;12124:2;12104:18;;;12097:30;12163:34;12143:18;;;12136:62;-1:-1:-1;;;12214:18:1;;;12207:39;12263:19;;21230:110:0;11883:405:1;39683:21:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;20591:392::-;20713:4;-1:-1:-1;;;;;20744:19:0;;20736:74;;;;-1:-1:-1;;;20736:74:0;;12495:2:1;20736:74:0;;;12477:21:1;12534:2;12514:18;;;12507:30;12573:34;12553:18;;;12546:62;-1:-1:-1;;;12624:18:1;;;12617:40;12674:19;;20736:74:0;12293:406:1;20736:74:0;20823:10;20849:6;20844:109;20861:7;:14;20857:18;;20844:109;;;20908:7;20916:1;20908:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;20899:19:0;;;20908:10;;20899:19;20895:46;;;20934:7;;;:::i;:::-;;;20895:46;20877:3;;;:::i;:::-;;;20844:109;;;-1:-1:-1;20970:5:0;20591:392;-1:-1:-1;;20591:392:0:o;36464:103::-;35886:6;;-1:-1:-1;;;;;35886:6:0;738:10;36033:23;36025:68;;;;-1:-1:-1;;;36025:68:0;;;;;;;:::i;:::-;36529:30:::1;36556:1;36529:18;:30::i;:::-;36464:103::o:0;41331:299::-;35886:6;;-1:-1:-1;;;;;35886:6:0;738:10;36033:23;36025:68;;;;-1:-1:-1;;;36025:68:0;;;;;;;:::i;:::-;41412:14:::1;41429:13;33925:7:::0;:14;;33837:110;41429:13:::1;41412:30:::0;-1:-1:-1;39798:3:0::1;41457:24;41466:15:::0;41412:30;41457:24:::1;:::i;:::-;:39;;41449:84;;;::::0;-1:-1:-1;;;41449:84:0;;13039:2:1;41449:84:0::1;::::0;::::1;13021:21:1::0;;;13058:18;;;13051:30;13117:34;13097:18;;;13090:62;13169:18;;41449:84:0::1;12837:356:1::0;41449:84:0::1;41545:9;41540:85;41560:15;41556:1;:19;41540:85;;;41591:26;41601:3:::0;41606:10:::1;41615:1:::0;41606:6;:10:::1;:::i;:::-;41591:9;:26::i;:::-;41577:3:::0;::::1;::::0;::::1;:::i;:::-;;;;41540:85;;;;41405:225;41331:299:::0;;:::o;21607:104::-;21663:13;21696:7;21689:14;;;;;:::i;22630:327::-;-1:-1:-1;;;;;22765:24:0;;738:10;22765:24;;22757:62;;;;-1:-1:-1;;;22757:62:0;;13400:2:1;22757:62:0;;;13382:21:1;13439:2;13419:18;;;13412:30;13478:27;13458:18;;;13451:55;13523:18;;22757:62:0;13198:349:1;22757:62:0;738:10;22832:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;22832:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;22832:53:0;;;;;;;;;;22901:48;;540:41:1;;;22832:42:0;;738:10;22901:48;;513:18:1;22901:48:0;;;;;;;22630:327;;:::o;24012:365::-;24201:41;738:10;24234:7;24201:18;:41::i;:::-;24179:140;;;;-1:-1:-1;;;24179:140:0;;;;;;;:::i;:::-;24330:39;24344:4;24350:2;24354:7;24363:5;24330:13;:39::i;41950:212::-;42009:13;42039:17;42047:8;42039:7;:17::i;:::-;42031:50;;;;-1:-1:-1;;;42031:50:0;;13754:2:1;42031:50:0;;;13736:21:1;13793:2;13773:18;;;13766:30;-1:-1:-1;;;13812:18:1;;;13805:50;13872:18;;42031:50:0;13552:344:1;42031:50:0;42119:7;42128:26;42145:8;42128:16;:26::i;:::-;42102:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;42088:68;;41950:212;;;:::o;40644:87::-;35886:6;;-1:-1:-1;;;;;35886:6:0;738:10;36033:23;36025:68;;;;-1:-1:-1;;;36025:68:0;;;;;;;:::i;:::-;40699:19:::1;:26:::0;40644:87::o;40737:588::-;40848:10;40862:9;40848:23;40840:63;;;;-1:-1:-1;;;40840:63:0;;15598:2:1;40840:63:0;;;15580:21:1;15637:2;15617:18;;;15610:30;15676:29;15656:18;;;15649:57;15723:18;;40840:63:0;15396:351:1;40840:63:0;40918:15;;;;40910:61;;;;-1:-1:-1;;;40910:61:0;;15954:2:1;40910:61:0;;;15936:21:1;15993:2;15973:18;;;15966:30;16032:34;16012:18;;;16005:62;-1:-1:-1;;;16083:18:1;;;16076:31;16124:19;;40910:61:0;15752:397:1;40910:61:0;41741:34;;;41008:10;19602:2:1;19598:15;-1:-1:-1;;19594:53:1;41741:34:0;;;;19582:66:1;;;;19664:12;;;;19657:28;;;41741:34:0;;;;;;;;;;19701:12:1;;;;41741:34:0;;;41731:45;;;;;40994:42;;41030:5;40994:7;:42::i;:::-;40978:107;;;;-1:-1:-1;;;40978:107:0;;16356:2:1;40978:107:0;;;16338:21:1;16395:2;16375:18;;;16368:30;16434:33;16414:18;;;16407:61;16485:18;;40978:107:0;16154:355:1;40978:107:0;41110:10;41100:21;;;;:9;:21;;;;;;41142:7;;41100:38;;41124:14;;41100:38;:::i;:::-;:49;;41092:86;;;;-1:-1:-1;;;41092:86:0;;16716:2:1;41092:86:0;;;16698:21:1;16755:2;16735:18;;;16728:30;16794:26;16774:18;;;16767:54;16838:18;;41092:86:0;16514:348:1;41092:86:0;41197:10;41187:21;;;;:9;:21;;;;;:39;;41212:14;;41187:21;:39;;41212:14;;41187:39;:::i;:::-;;;;-1:-1:-1;41238:6:0;;-1:-1:-1;41233:87:0;41250:14;41246:1;:18;41233:87;;;41280:32;41286:10;41298:13;33925:7;:14;;33837:110;41298:13;41280:5;:32::i;:::-;41266:3;;;;:::i;:::-;;;;41233:87;;42168:212;-1:-1:-1;;;;;42280:22:0;;42263:4;42280:22;;;:12;:22;;;;;;;;42276:39;;;-1:-1:-1;42311:4:0;42304:11;;42276:39;-1:-1:-1;;;;;23199:25:0;;;23170:4;23199:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;42329:45;42322:52;42168:212;-1:-1:-1;;;42168:212:0:o;40542:94::-;35886:6;;-1:-1:-1;;;;;35886:6:0;738:10;36033:23;36025:68;;;;-1:-1:-1;;;36025:68:0;;;;;;;:::i;:::-;40615:15:::1;::::0;;-1:-1:-1;;40596:34:0;::::1;40615:15;::::0;;::::1;40614:16;40596:34;::::0;;40542:94::o;36722:201::-;35886:6;;-1:-1:-1;;;;;35886:6:0;738:10;36033:23;36025:68;;;;-1:-1:-1;;;36025:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36811:22:0;::::1;36803:73;;;::::0;-1:-1:-1;;;36803:73:0;;17069:2:1;36803:73:0::1;::::0;::::1;17051:21:1::0;17108:2;17088:18;;;17081:30;17147:34;17127:18;;;17120:62;-1:-1:-1;;;17198:18:1;;;17191:36;17244:19;;36803:73:0::1;16867:402:1::0;36803:73:0::1;36887:28;36906:8;36887:18;:28::i;40304:134::-:0;35886:6;;-1:-1:-1;;;;;35886:6:0;738:10;36033:23;36025:68;;;;-1:-1:-1;;;36025:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;40406:26:0::1;;::::0;;;:12:::1;:26;::::0;;;;;;-1:-1:-1;;40376:56:0;::::1;40406:26;::::0;;::::1;40405:27;40376:56;::::0;;40304:134::o;20172:355::-;20319:4;-1:-1:-1;;;;;;20361:40:0;;-1:-1:-1;;;20361:40:0;;:105;;-1:-1:-1;;;;;;;20418:48:0;;-1:-1:-1;;;20418:48:0;20361:105;:158;;;-1:-1:-1;;;;;;;;;;10093:40:0;;;20483:36;9984:157;25924:155;26023:7;:14;25989:4;;26013:24;;:58;;;;;26069:1;-1:-1:-1;;;;;26041:30:0;:7;26049;26041:16;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;26041:16:0;:30;;26006:65;25924:155;-1:-1:-1;;25924:155:0:o;29949:174::-;30024:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;30024:29:0;-1:-1:-1;;;;;30024:29:0;;;;;;;;:24;;30078:23;30024:24;30078:14;:23::i;:::-;-1:-1:-1;;;;;30069:46:0;;;;;;;;;;;29949:174;;:::o;26246:452::-;26375:4;26419:16;26427:7;26419;:16::i;:::-;26397:110;;;;-1:-1:-1;;;26397:110:0;;17476:2:1;26397:110:0;;;17458:21:1;17515:2;17495:18;;;17488:30;17554:34;17534:18;;;17527:62;-1:-1:-1;;;17605:18:1;;;17598:42;17657:19;;26397:110:0;17274:408:1;26397:110:0;26518:13;26534:23;26549:7;26534:14;:23::i;:::-;26518:39;;26587:5;-1:-1:-1;;;;;26576:16:0;:7;-1:-1:-1;;;;;26576:16:0;;:64;;;;26633:7;-1:-1:-1;;;;;26609:31:0;:20;26621:7;26609:11;:20::i;:::-;-1:-1:-1;;;;;26609:31:0;;26576:64;:113;;;;26657:32;26674:5;26681:7;26657:16;:32::i;:::-;26568:122;26246:452;-1:-1:-1;;;;26246:452:0:o;29278:553::-;29451:4;-1:-1:-1;;;;;29424:31:0;:23;29439:7;29424:14;:23::i;:::-;-1:-1:-1;;;;;29424:31:0;;29402:122;;;;-1:-1:-1;;;29402:122:0;;17889:2:1;29402:122:0;;;17871:21:1;17928:2;17908:18;;;17901:30;17967:34;17947:18;;;17940:62;-1:-1:-1;;;18018:18:1;;;18011:39;18067:19;;29402:122:0;17687:405:1;29402:122:0;-1:-1:-1;;;;;29543:16:0;;29535:65;;;;-1:-1:-1;;;29535:65:0;;18299:2:1;29535:65:0;;;18281:21:1;18338:2;18318:18;;;18311:30;18377:34;18357:18;;;18350:62;-1:-1:-1;;;18428:18:1;;;18421:34;18472:19;;29535:65:0;18097:400:1;29535:65:0;29717:29;29734:1;29738:7;29717:8;:29::i;:::-;29776:2;29757:7;29765;29757:16;;;;;;;;:::i;:::-;;;;;;;;;:21;;-1:-1:-1;;;;;;29757:21:0;-1:-1:-1;;;;;29757:21:0;;;;;;29796:27;;29815:7;;29796:27;;;;;;;;;;29757:16;29796:27;29278:553;;;:::o;28609:332::-;28669:13;28685:23;28700:7;28685:14;:23::i;:::-;28669:39;;28810:29;28827:1;28831:7;28810:8;:29::i;:::-;28877:1;28850:7;28858;28850:16;;;;;;;;:::i;:::-;;;;;;;;;:29;;-1:-1:-1;;;;;;28850:29:0;-1:-1:-1;;;;;28850:29:0;;;;;;28897:36;;28925:7;;28897:36;;;;;28850:16;;28897:36;28658:283;28609:332;:::o;37083:191::-;37176:6;;;-1:-1:-1;;;;;37193:17:0;;;-1:-1:-1;;;;;;37193:17:0;;;;;;;37226:40;;37176:6;;;37193:17;37176:6;;37226:40;;37157:16;;37226:40;37146:128;37083:191;:::o;27040:110::-;27116:26;27126:2;27130:7;27116:26;;;;;;;;;;;;:9;:26::i;25259:352::-;25416:28;25426:4;25432:2;25436:7;25416:9;:28::i;:::-;25477:48;25500:4;25506:2;25510:7;25519:5;25477:22;:48::i;:::-;25455:148;;;;-1:-1:-1;;;25455:148:0;;;;;;;:::i;17658:722::-;17714:13;17934:10;17930:53;;-1:-1:-1;;17961:10:0;;;;;;;;;;;;-1:-1:-1;;;17961:10:0;;;;;17658:722::o;17930:53::-;18008:5;17993:12;18049:78;18056:9;;18049:78;;18082:8;;;;:::i;:::-;;-1:-1:-1;18105:10:0;;-1:-1:-1;18113:2:0;18105:10;;:::i;:::-;;;18049:78;;;18137:19;18169:6;18159:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18159:17:0;;18137:39;;18187:154;18194:10;;18187:154;;18221:11;18231:1;18221:11;;:::i;:::-;;-1:-1:-1;18290:10:0;18298:2;18290:5;:10;:::i;:::-;18277:24;;:2;:24;:::i;:::-;18264:39;;18247:6;18254;18247:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;18247:56:0;;;;;;;;-1:-1:-1;18318:11:0;18327:2;18318:11;;:::i;:::-;;;18187:154;;41788:156;41866:4;41886:52;41905:5;41912:19;;41933:4;41886:18;:52::i;28034:346::-;-1:-1:-1;;;;;28114:16:0;;28106:61;;;;-1:-1:-1;;;28106:61:0;;19926:2:1;28106:61:0;;;19908:21:1;;;19945:18;;;19938:30;20004:34;19984:18;;;19977:62;20056:18;;28106:61:0;19724:356:1;28106:61:0;28187:16;28195:7;28187;:16::i;:::-;28186:17;28178:58;;;;-1:-1:-1;;;28178:58:0;;20287:2:1;28178:58:0;;;20269:21:1;20326:2;20306:18;;;20299:30;20365;20345:18;;;20338:58;20413:18;;28178:58:0;20085:352:1;28178:58:0;28305:7;:16;;;;;;;-1:-1:-1;28305:16:0;;;;;;;-1:-1:-1;;;;;;28305:16:0;-1:-1:-1;;;;;28305:16:0;;;;;;;;28339:33;;28364:7;;-1:-1:-1;28339:33:0;;-1:-1:-1;;28339:33:0;28034:346;;:::o;27377:321::-;27507:18;27513:2;27517:7;27507:5;:18::i;:::-;27558:54;27589:1;27593:2;27597:7;27606:5;27558:22;:54::i;:::-;27536:154;;;;-1:-1:-1;;;27536:154:0;;;;;;;:::i;30688:980::-;30843:4;-1:-1:-1;;;;;30864:13:0;;17278:20;17326:8;30860:801;;30917:175;;-1:-1:-1;;;30917:175:0;;-1:-1:-1;;;;;30917:36:0;;;;;:175;;738:10;;31011:4;;31038:7;;31068:5;;30917:175;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30917:175:0;;;;;;;;-1:-1:-1;;30917:175:0;;;;;;;;;;;;:::i;:::-;;;30896:710;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31275:13:0;;31271:320;;31318:108;;-1:-1:-1;;;31318:108:0;;;;;;;:::i;31271:320::-;31541:6;31535:13;31526:6;31522:2;31518:15;31511:38;30896:710;-1:-1:-1;;;;;;31156:51:0;-1:-1:-1;;;31156:51:0;;-1:-1:-1;31149:58:0;;30860:801;-1:-1:-1;31645:4:0;30688:980;;;;;;:::o;38116:190::-;38241:4;38294;38265:25;38278:5;38285:4;38265:12;:25::i;:::-;:33;;38116:190;-1:-1:-1;;;;38116:190:0:o;38668:701::-;38751:7;38794:4;38751:7;38809:523;38833:5;:12;38829:1;:16;38809:523;;;38867:20;38890:5;38896:1;38890:8;;;;;;;;:::i;:::-;;;;;;;38867:31;;38933:12;38917;:28;38913:408;;39070:44;;;;;;21358:19:1;;;21393:12;;;21386:28;;;21430:12;;39070:44:0;;;;;;;;;;;;39060:55;;;;;;39045:70;;38913:408;;;39260:44;;;;;;21358:19:1;;;21393:12;;;21386:28;;;21430:12;;39260:44:0;;;;;;;;;;;;39250:55;;;;;;39235:70;;38913:408;-1:-1:-1;38847:3:0;;;;:::i;:::-;;;;38809:523;;;-1:-1:-1;39349:12:0;38668:701;-1:-1:-1;;;38668:701:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:1;822:16;;815:27;592:258::o;855:269::-;908:3;946:5;940:12;973:6;968:3;961:19;989:63;1045:6;1038:4;1033:3;1029:14;1022:4;1015:5;1011:16;989:63;:::i;:::-;1106:2;1085:15;-1:-1:-1;;1081:29:1;1072:39;;;;1113:4;1068:50;;855:269;-1:-1:-1;;855:269:1:o;1129:231::-;1278:2;1267:9;1260:21;1241:4;1298:56;1350:2;1339:9;1335:18;1327:6;1298:56;:::i;1365:180::-;1424:6;1477:2;1465:9;1456:7;1452:23;1448:32;1445:52;;;1493:1;1490;1483:12;1445:52;-1:-1:-1;1516:23:1;;1365:180;-1:-1:-1;1365:180:1:o;1758:173::-;1826:20;;-1:-1:-1;;;;;1875:31:1;;1865:42;;1855:70;;1921:1;1918;1911:12;1855:70;1758:173;;;:::o;1936:254::-;2004:6;2012;2065:2;2053:9;2044:7;2040:23;2036:32;2033:52;;;2081:1;2078;2071:12;2033:52;2104:29;2123:9;2104:29;:::i;:::-;2094:39;2180:2;2165:18;;;;2152:32;;-1:-1:-1;;;1936:254:1:o;2377:328::-;2454:6;2462;2470;2523:2;2511:9;2502:7;2498:23;2494:32;2491:52;;;2539:1;2536;2529:12;2491:52;2562:29;2581:9;2562:29;:::i;:::-;2552:39;;2610:38;2644:2;2633:9;2629:18;2610:38;:::i;:::-;2600:48;;2695:2;2684:9;2680:18;2667:32;2657:42;;2377:328;;;;;:::o;2892:127::-;2953:10;2948:3;2944:20;2941:1;2934:31;2984:4;2981:1;2974:15;3008:4;3005:1;2998:15;3024:275;3095:2;3089:9;3160:2;3141:13;;-1:-1:-1;;3137:27:1;3125:40;;3195:18;3180:34;;3216:22;;;3177:62;3174:88;;;3242:18;;:::i;:::-;3278:2;3271:22;3024:275;;-1:-1:-1;3024:275:1:o;3304:407::-;3369:5;3403:18;3395:6;3392:30;3389:56;;;3425:18;;:::i;:::-;3463:57;3508:2;3487:15;;-1:-1:-1;;3483:29:1;3514:4;3479:40;3463:57;:::i;:::-;3454:66;;3543:6;3536:5;3529:21;3583:3;3574:6;3569:3;3565:16;3562:25;3559:45;;;3600:1;3597;3590:12;3559:45;3649:6;3644:3;3637:4;3630:5;3626:16;3613:43;3703:1;3696:4;3687:6;3680:5;3676:18;3672:29;3665:40;3304:407;;;;;:::o;3716:451::-;3785:6;3838:2;3826:9;3817:7;3813:23;3809:32;3806:52;;;3854:1;3851;3844:12;3806:52;3894:9;3881:23;3927:18;3919:6;3916:30;3913:50;;;3959:1;3956;3949:12;3913:50;3982:22;;4035:4;4027:13;;4023:27;-1:-1:-1;4013:55:1;;4064:1;4061;4054:12;4013:55;4087:74;4153:7;4148:2;4135:16;4130:2;4126;4122:11;4087:74;:::i;4172:186::-;4231:6;4284:2;4272:9;4263:7;4259:23;4255:32;4252:52;;;4300:1;4297;4290:12;4252:52;4323:29;4342:9;4323:29;:::i;4363:347::-;4428:6;4436;4489:2;4477:9;4468:7;4464:23;4460:32;4457:52;;;4505:1;4502;4495:12;4457:52;4528:29;4547:9;4528:29;:::i;:::-;4518:39;;4607:2;4596:9;4592:18;4579:32;4654:5;4647:13;4640:21;4633:5;4630:32;4620:60;;4676:1;4673;4666:12;4620:60;4699:5;4689:15;;;4363:347;;;;;:::o;4715:667::-;4810:6;4818;4826;4834;4887:3;4875:9;4866:7;4862:23;4858:33;4855:53;;;4904:1;4901;4894:12;4855:53;4927:29;4946:9;4927:29;:::i;:::-;4917:39;;4975:38;5009:2;4998:9;4994:18;4975:38;:::i;:::-;4965:48;;5060:2;5049:9;5045:18;5032:32;5022:42;;5115:2;5104:9;5100:18;5087:32;5142:18;5134:6;5131:30;5128:50;;;5174:1;5171;5164:12;5128:50;5197:22;;5250:4;5242:13;;5238:27;-1:-1:-1;5228:55:1;;5279:1;5276;5269:12;5228:55;5302:74;5368:7;5363:2;5350:16;5345:2;5341;5337:11;5302:74;:::i;:::-;5292:84;;;4715:667;;;;;;;:::o;5572:1082::-;5674:6;5682;5690;5743:2;5731:9;5722:7;5718:23;5714:32;5711:52;;;5759:1;5756;5749:12;5711:52;5795:9;5782:23;5772:33;;5824:2;5873;5862:9;5858:18;5845:32;5835:42;;5928:2;5917:9;5913:18;5900:32;5951:18;5992:2;5984:6;5981:14;5978:34;;;6008:1;6005;5998:12;5978:34;6046:6;6035:9;6031:22;6021:32;;6091:7;6084:4;6080:2;6076:13;6072:27;6062:55;;6113:1;6110;6103:12;6062:55;6149:2;6136:16;6171:2;6167;6164:10;6161:36;;;6177:18;;:::i;:::-;6223:2;6220:1;6216:10;6206:20;;6246:28;6270:2;6266;6262:11;6246:28;:::i;:::-;6308:15;;;6378:11;;;6374:20;;;6339:12;;;;6406:19;;;6403:39;;;6438:1;6435;6428:12;6403:39;6462:11;;;;6482:142;6498:6;6493:3;6490:15;6482:142;;;6564:17;;6552:30;;6515:12;;;;6602;;;;6482:142;;;6643:5;6633:15;;;;;;;;5572:1082;;;;;:::o;6659:260::-;6727:6;6735;6788:2;6776:9;6767:7;6763:23;6759:32;6756:52;;;6804:1;6801;6794:12;6756:52;6827:29;6846:9;6827:29;:::i;:::-;6817:39;;6875:38;6909:2;6898:9;6894:18;6875:38;:::i;:::-;6865:48;;6659:260;;;;;:::o;6924:380::-;7003:1;6999:12;;;;7046;;;7067:61;;7121:4;7113:6;7109:17;7099:27;;7067:61;7174:2;7166:6;7163:14;7143:18;7140:38;7137:161;;;7220:10;7215:3;7211:20;7208:1;7201:31;7255:4;7252:1;7245:15;7283:4;7280:1;7273:15;7137:161;;6924:380;;;:::o;8549:413::-;8751:2;8733:21;;;8790:2;8770:18;;;8763:30;8829:34;8824:2;8809:18;;8802:62;-1:-1:-1;;;8895:2:1;8880:18;;8873:47;8952:3;8937:19;;8549:413::o;8967:407::-;9169:2;9151:21;;;9208:2;9188:18;;;9181:30;9247:34;9242:2;9227:18;;9220:62;-1:-1:-1;;;9313:2:1;9298:18;;9291:41;9364:3;9349:19;;8967:407::o;9379:127::-;9440:10;9435:3;9431:20;9428:1;9421:31;9471:4;9468:1;9461:15;9495:4;9492:1;9485:15;9511:127;9572:10;9567:3;9563:20;9560:1;9553:31;9603:4;9600:1;9593:15;9627:4;9624:1;9617:15;9643:135;9682:3;-1:-1:-1;;9703:17:1;;9700:43;;;9723:18;;:::i;:::-;-1:-1:-1;9770:1:1;9759:13;;9643:135::o;9783:356::-;9985:2;9967:21;;;10004:18;;;9997:30;10063:34;10058:2;10043:18;;10036:62;10130:2;10115:18;;9783:356::o;12704:128::-;12744:3;12775:1;12771:6;12768:1;12765:13;12762:39;;;12781:18;;:::i;:::-;-1:-1:-1;12817:9:1;;12704:128::o;14027:185::-;14069:3;14107:5;14101:12;14122:52;14167:6;14162:3;14155:4;14148:5;14144:16;14122:52;:::i;:::-;14190:16;;;;;14027:185;-1:-1:-1;;14027:185:1:o;14217:1174::-;14393:3;14422:1;14455:6;14449:13;14485:3;14507:1;14535:9;14531:2;14527:18;14517:28;;14595:2;14584:9;14580:18;14617;14607:61;;14661:4;14653:6;14649:17;14639:27;;14607:61;14687:2;14735;14727:6;14724:14;14704:18;14701:38;14698:165;;;-1:-1:-1;;;14762:33:1;;14818:4;14815:1;14808:15;14848:4;14769:3;14836:17;14698:165;14879:18;14906:104;;;;15024:1;15019:320;;;;14872:467;;14906:104;-1:-1:-1;;14939:24:1;;14927:37;;14984:16;;;;-1:-1:-1;14906:104:1;;15019:320;13974:1;13967:14;;;14011:4;13998:18;;15114:1;15128:165;15142:6;15139:1;15136:13;15128:165;;;15220:14;;15207:11;;;15200:35;15263:16;;;;15157:10;;15128:165;;;15132:3;;15322:6;15317:3;15313:16;15306:23;;14872:467;;;;;;;15355:30;15381:3;15373:6;15355:30;:::i;:::-;15348:37;14217:1174;-1:-1:-1;;;;;14217:1174:1:o;18502:414::-;18704:2;18686:21;;;18743:2;18723:18;;;18716:30;18782:34;18777:2;18762:18;;18755:62;-1:-1:-1;;;18848:2:1;18833:18;;18826:48;18906:3;18891:19;;18502:414::o;18921:127::-;18982:10;18977:3;18973:20;18970:1;18963:31;19013:4;19010:1;19003:15;19037:4;19034:1;19027:15;19053:120;19093:1;19119;19109:35;;19124:18;;:::i;:::-;-1:-1:-1;19158:9:1;;19053:120::o;19178:125::-;19218:4;19246:1;19243;19240:8;19237:34;;;19251:18;;:::i;:::-;-1:-1:-1;19288:9:1;;19178:125::o;19308:112::-;19340:1;19366;19356:35;;19371:18;;:::i;:::-;-1:-1:-1;19405:9:1;;19308:112::o;20442:500::-;-1:-1:-1;;;;;20711:15:1;;;20693:34;;20763:15;;20758:2;20743:18;;20736:43;20810:2;20795:18;;20788:34;;;20858:3;20853:2;20838:18;;20831:31;;;20636:4;;20879:57;;20916:19;;20908:6;20879:57;:::i;:::-;20871:65;20442:500;-1:-1:-1;;;;;;20442:500:1:o;20947:249::-;21016:6;21069:2;21057:9;21048:7;21044:23;21040:32;21037:52;;;21085:1;21082;21075:12;21037:52;21117:9;21111:16;21136:30;21160:5;21136:30;:::i

Swarm Source

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