ETH Price: $3,173.75 (-8.28%)
Gas: 3 Gwei

Token

Toadles (TDL)
 

Overview

Max Total Supply

214 TDL

Holders

86

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 TDL
0xd71e3b37b11748c1a37a0e4862b6ec0c89a3d7fc
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:
Toadles

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-01-12
*/

// 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.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

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

        _;

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

// 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 compiler's built in overflow checks.

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

    /**
     * @dev Returns the 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 Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

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

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

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

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

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

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

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

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 OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

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

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

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

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 {}
}

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

pragma solidity ^0.8.11;
pragma abicoder v2;

contract Toadles is ERC721Enumerable, Ownable, ReentrancyGuard {
  using SafeMath for uint256;
  
  bool                        public          saleIsActive = true;
  string                      public          final_provenance = "";
  address                     public          proxyRegistryAddress;
  string                      public          baseURI;
  uint256                     public constant TOKEN_PRICE = 44000000000000000;
  uint256                     public constant MAX_TOKENS = 4444;

    
  constructor() ERC721("Toadles", "TDL") {
    setBaseURI("ipfs://Qmbex7y1o6MfGVg4j6x4b1RsBvjFmZX7HZ9ZXiJoNZFpjV/");
    proxyRegistryAddress = address(0xa5409ec958C83C3f309868babACA7c86DCB077c1);
  }
    
  function setProxyRegistryAddress(address _proxyRegistryAddress) external onlyOwner {
    proxyRegistryAddress = _proxyRegistryAddress;
  }
  

  function withdraw() public onlyOwner nonReentrant {
    (bool ownerSuccess, ) = _msgSender().call{value: address(this).balance}("");
    require(ownerSuccess, "Failed to send to Owner.");
  }

  function setProvenanceHash(string memory provenanceHash) public onlyOwner {
    final_provenance = provenanceHash;
  }

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

  function flipSaleState() public onlyOwner {
    saleIsActive = !saleIsActive;
  }
  
  function tokensOfOwner(address _owner) external view returns(uint256[] memory ) {
    uint256 tokenCount = balanceOf(_owner);
    if (tokenCount == 0) {
      // Return an empty array
      return new uint256[](0);
    } else {
      uint256[] memory result = new uint256[](tokenCount);
      uint256 index;
      for (index = 0; index < tokenCount; index++) {
        result[index] = tokenOfOwnerByIndex(_owner, index);
      }
      return result;
    }
  }
  
  function mintToken(uint numberOfTokens) public payable nonReentrant {
    require(saleIsActive, "Sale must be active to mint");
    require(numberOfTokens > 0, "Must mint more than 0 tokens.");
    require(totalSupply().add(numberOfTokens) <= MAX_TOKENS, "Purchase would exceed max supply");
    require(msg.value >= TOKEN_PRICE.mul(numberOfTokens), "Ether value sent is not correct");
    
    for(uint i = 0; i < numberOfTokens; i++) {
      _safeMint(msg.sender, totalSupply());
    }
  }

  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 _owner, address operator) public view override returns (bool) {
    OpenSeaProxyRegistry proxyRegistry = OpenSeaProxyRegistry(proxyRegistryAddress);
    if (address(proxyRegistry.proxies(_owner)) == operator) return true;
    return super.isApprovedForAll(_owner, operator);
  }

  function airdrop(address to, uint256 airdropAmount) external onlyOwner {
    require(totalSupply().add(airdropAmount) <= MAX_TOKENS, "Purchase would exceed max supply");
    for (uint i = 0; i < airdropAmount; i++) {
      _safeMint(to, totalSupply());
    }
  }
}

contract OwnableDelegateProxy {}
contract OpenSeaProxyRegistry {
  mapping(address => OwnableDelegateProxy) public proxies;
}

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_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKEN_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"airdropAmount","type":"uint256"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","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":[],"name":"final_provenance","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipSaleState","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":"_owner","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"}],"name":"mintToken","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":"proxyRegistryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"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":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"string","name":"provenanceHash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_proxyRegistryAddress","type":"address"}],"name":"setProxyRegistryAddress","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":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"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"}]

6007805460ff1916600117905560a06040819052600060808190526200002891600891620001da565b503480156200003657600080fd5b506040805180820182526007815266546f61646c657360c81b60208083019182528351808501909452600384526215111360ea1b9084015281519192916200008191600091620001da565b50805162000097906001906020840190620001da565b505050620000b4620000ae6200010c60201b60201c565b62000110565b6001600681905550620000e0604051806060016040528060368152602001620025e36036913962000162565b600980546001600160a01b03191673a5409ec958c83c3f309868babaca7c86dcb077c1179055620002bd565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6005546001600160a01b03163314620001c15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640160405180910390fd5b8051620001d690600a906020840190620001da565b5050565b828054620001e89062000280565b90600052602060002090601f0160209004810192826200020c576000855562000257565b82601f106200022757805160ff191683800117855562000257565b8280016001018555821562000257579182015b82811115620002575782518255916020019190600101906200023a565b506200026592915062000269565b5090565b5b808211156200026557600081556001016200026a565b600181811c908216806200029557607f821691505b60208210811415620002b757634e487b7160e01b600052602260045260246000fd5b50919050565b61231680620002cd6000396000f3fe6080604052600436106101ee5760003560e01c8063715018a61161010d578063c634d032116100a0578063d2d8cb671161006f578063d2d8cb671461055f578063e985e9c51461057a578063eb8d24441461059a578063f2fde38b146105b4578063f47c84c5146105d457600080fd5b8063c634d032146104ec578063c87b56dd146104ff578063cd7c03261461051f578063d26ea6c01461053f57600080fd5b806395d89b41116100dc57806395d89b4114610482578063a22cb46514610497578063b2462be5146104b7578063b88d4fde146104cc57600080fd5b8063715018a6146104025780638462151c146104175780638ba4cc3c146104445780638da5cb5b1461046457600080fd5b806334918dfd1161018557806355f804b31161015457806355f804b31461038d5780636352211e146103ad5780636c0360eb146103cd57806370a08231146103e257600080fd5b806334918dfd146103235780633ccfd60b1461033857806342842e0e1461034d5780634f6ccce71461036d57600080fd5b806310969523116101c157806310969523146102a457806318160ddd146102c457806323b872dd146102e35780632f745c591461030357600080fd5b806301ffc9a7146101f357806306fdde0314610228578063081812fc1461024a578063095ea7b314610282575b600080fd5b3480156101ff57600080fd5b5061021361020e366004611c36565b6105ea565b60405190151581526020015b60405180910390f35b34801561023457600080fd5b5061023d610615565b60405161021f9190611cab565b34801561025657600080fd5b5061026a610265366004611cbe565b6106a7565b6040516001600160a01b03909116815260200161021f565b34801561028e57600080fd5b506102a261029d366004611cec565b610734565b005b3480156102b057600080fd5b506102a26102bf366004611da4565b61084a565b3480156102d057600080fd5b506002545b60405190815260200161021f565b3480156102ef57600080fd5b506102a26102fe366004611ded565b61088b565b34801561030f57600080fd5b506102d561031e366004611cec565b6108bc565b34801561032f57600080fd5b506102a261096f565b34801561034457600080fd5b506102a26109ad565b34801561035957600080fd5b506102a2610368366004611ded565b610acf565b34801561037957600080fd5b506102d5610388366004611cbe565b610aea565b34801561039957600080fd5b506102a26103a8366004611da4565b610b57565b3480156103b957600080fd5b5061026a6103c8366004611cbe565b610b94565b3480156103d957600080fd5b5061023d610c20565b3480156103ee57600080fd5b506102d56103fd366004611e2e565b610cae565b34801561040e57600080fd5b506102a2610d7c565b34801561042357600080fd5b50610437610432366004611e2e565b610db2565b60405161021f9190611e4b565b34801561045057600080fd5b506102a261045f366004611cec565b610e71565b34801561047057600080fd5b506005546001600160a01b031661026a565b34801561048e57600080fd5b5061023d610f2e565b3480156104a357600080fd5b506102a26104b2366004611e8f565b610f3d565b3480156104c357600080fd5b5061023d611002565b3480156104d857600080fd5b506102a26104e7366004611ecd565b61100f565b6102a26104fa366004611cbe565b611047565b34801561050b57600080fd5b5061023d61051a366004611cbe565b611232565b34801561052b57600080fd5b5060095461026a906001600160a01b031681565b34801561054b57600080fd5b506102a261055a366004611e2e565b6112b3565b34801561056b57600080fd5b506102d5669c51c4521e000081565b34801561058657600080fd5b50610213610595366004611f4d565b6112ff565b3480156105a657600080fd5b506007546102139060ff1681565b3480156105c057600080fd5b506102a26105cf366004611e2e565b6113c0565b3480156105e057600080fd5b506102d561115c81565b60006001600160e01b0319821663780e9d6360e01b148061060f575061060f8261145b565b92915050565b60606000805461062490611f7b565b80601f016020809104026020016040519081016040528092919081815260200182805461065090611f7b565b801561069d5780601f106106725761010080835404028352916020019161069d565b820191906000526020600020905b81548152906001019060200180831161068057829003601f168201915b5050505050905090565b60006106b2826114ab565b6107185760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600360205260409020546001600160a01b031690565b600061073f82610b94565b9050806001600160a01b0316836001600160a01b031614156107ad5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161070f565b336001600160a01b03821614806107c957506107c981336112ff565b61083b5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161070f565b61084583836114f5565b505050565b6005546001600160a01b031633146108745760405162461bcd60e51b815260040161070f90611fb0565b8051610887906008906020840190611b90565b5050565b6108953382611563565b6108b15760405162461bcd60e51b815260040161070f90611fe5565b610845838383611625565b60006108c783610cae565b82106108e55760405162461bcd60e51b815260040161070f90612036565b6000805b600254811015610956576002818154811061090657610906612081565b6000918252602090912001546001600160a01b0386811691161415610944578382141561093657915061060f9050565b81610940816120ad565b9250505b8061094e816120ad565b9150506108e9565b5060405162461bcd60e51b815260040161070f90612036565b6005546001600160a01b031633146109995760405162461bcd60e51b815260040161070f90611fb0565b6007805460ff19811660ff90911615179055565b6005546001600160a01b031633146109d75760405162461bcd60e51b815260040161070f90611fb0565b60026006541415610a2a5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161070f565b6002600655604051600090339047908381818185875af1925050503d8060008114610a71576040519150601f19603f3d011682016040523d82523d6000602084013e610a76565b606091505b5050905080610ac75760405162461bcd60e51b815260206004820152601860248201527f4661696c656420746f2073656e6420746f204f776e65722e0000000000000000604482015260640161070f565b506001600655565b6108458383836040518060200160405280600081525061100f565b6002546000908210610b535760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161070f565b5090565b6005546001600160a01b03163314610b815760405162461bcd60e51b815260040161070f90611fb0565b805161088790600a906020840190611b90565b60008060028381548110610baa57610baa612081565b6000918252602090912001546001600160a01b031690508061060f5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161070f565b600a8054610c2d90611f7b565b80601f0160208091040260200160405190810160405280929190818152602001828054610c5990611f7b565b8015610ca65780601f10610c7b57610100808354040283529160200191610ca6565b820191906000526020600020905b815481529060010190602001808311610c8957829003601f168201915b505050505081565b60006001600160a01b038216610d195760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161070f565b6000805b600254811015610d755760028181548110610d3a57610d3a612081565b6000918252602090912001546001600160a01b0385811691161415610d6557610d62826120ad565b91505b610d6e816120ad565b9050610d1d565b5092915050565b6005546001600160a01b03163314610da65760405162461bcd60e51b815260040161070f90611fb0565b610db0600061177b565b565b60606000610dbf83610cae565b905080610de05760408051600080825260208201909252905b509392505050565b60008167ffffffffffffffff811115610dfb57610dfb611d18565b604051908082528060200260200182016040528015610e24578160200160208202803683370190505b50905060005b82811015610dd857610e3c85826108bc565b828281518110610e4e57610e4e612081565b602090810291909101015280610e63816120ad565b915050610e2a565b50919050565b6005546001600160a01b03163314610e9b5760405162461bcd60e51b815260040161070f90611fb0565b61115c610eb182610eab60025490565b906117cd565b1115610eff5760405162461bcd60e51b815260206004820181905260248201527f507572636861736520776f756c6420657863656564206d617820737570706c79604482015260640161070f565b60005b8181101561084557610f1c83610f1760025490565b6117e0565b80610f26816120ad565b915050610f02565b60606001805461062490611f7b565b6001600160a01b038216331415610f965760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161070f565b3360008181526004602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60088054610c2d90611f7b565b6110193383611563565b6110355760405162461bcd60e51b815260040161070f90611fe5565b611041848484846117fa565b50505050565b6002600654141561109a5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161070f565b600260065560075460ff166110f15760405162461bcd60e51b815260206004820152601b60248201527f53616c65206d7573742062652061637469766520746f206d696e740000000000604482015260640161070f565b600081116111415760405162461bcd60e51b815260206004820152601d60248201527f4d757374206d696e74206d6f7265207468616e203020746f6b656e732e000000604482015260640161070f565b61115c61115182610eab60025490565b111561119f5760405162461bcd60e51b815260206004820181905260248201527f507572636861736520776f756c6420657863656564206d617820737570706c79604482015260640161070f565b6111b0669c51c4521e00008261182d565b3410156111ff5760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f727265637400604482015260640161070f565b60005b818110156112295761121733610f1760025490565b80611221816120ad565b915050611202565b50506001600655565b606061123d826114ab565b6112815760405162461bcd60e51b81526020600482015260156024820152742a37b5b2b7103237b2b9903737ba1032bc34b9ba1760591b604482015260640161070f565b600a61128c83611839565b60405160200161129d9291906120e4565b6040516020818303038152906040529050919050565b6005546001600160a01b031633146112dd5760405162461bcd60e51b815260040161070f90611fb0565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b60095460405163c455279160e01b81526001600160a01b03848116600483015260009281169190841690829063c455279190602401602060405180830381865afa158015611351573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611375919061218b565b6001600160a01b0316141561138e57600191505061060f565b6001600160a01b0380851660009081526004602090815260408083209387168352929052205460ff165b949350505050565b6005546001600160a01b031633146113ea5760405162461bcd60e51b815260040161070f90611fb0565b6001600160a01b03811661144f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161070f565b6114588161177b565b50565b60006001600160e01b031982166380ac58cd60e01b148061148c57506001600160e01b03198216635b5e139f60e01b145b8061060f57506301ffc9a760e01b6001600160e01b031983161461060f565b6002546000908210801561060f575060006001600160a01b0316600283815481106114d8576114d8612081565b6000918252602090912001546001600160a01b0316141592915050565b600081815260036020526040902080546001600160a01b0319166001600160a01b038416908117909155819061152a82610b94565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061156e826114ab565b6115cf5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161070f565b60006115da83610b94565b9050806001600160a01b0316846001600160a01b031614806116155750836001600160a01b031661160a846106a7565b6001600160a01b0316145b806113b857506113b881856112ff565b826001600160a01b031661163882610b94565b6001600160a01b0316146116a05760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161070f565b6001600160a01b0382166117025760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161070f565b61170d6000826114f5565b816002828154811061172157611721612081565b6000918252602082200180546001600160a01b0319166001600160a01b03938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006117d982846121a8565b9392505050565b610887828260405180602001604052806000815250611937565b611805848484611625565b6118118484848461196a565b6110415760405162461bcd60e51b815260040161070f906121c0565b60006117d98284612212565b60608161185d5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156118875780611871816120ad565b91506118809050600a83612247565b9150611861565b60008167ffffffffffffffff8111156118a2576118a2611d18565b6040519080825280601f01601f1916602001820160405280156118cc576020820181803683370190505b5090505b84156113b8576118e160018361225b565b91506118ee600a86612272565b6118f99060306121a8565b60f81b81838151811061190e5761190e612081565b60200101906001600160f81b031916908160001a905350611930600a86612247565b94506118d0565b6119418383611a68565b61194e600084848461196a565b6108455760405162461bcd60e51b815260040161070f906121c0565b60006001600160a01b0384163b15611a5d57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906119ae903390899088908890600401612286565b6020604051808303816000875af19250505080156119e9575060408051601f3d908101601f191682019092526119e6918101906122c3565b60015b611a43573d808015611a17576040519150601f19603f3d011682016040523d82523d6000602084013e611a1c565b606091505b508051611a3b5760405162461bcd60e51b815260040161070f906121c0565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506113b8565b506001949350505050565b6001600160a01b038216611abe5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161070f565b611ac7816114ab565b15611b145760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161070f565b6002805460018101825560009182527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180546001600160a01b0319166001600160a01b0385169081179091556040518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054611b9c90611f7b565b90600052602060002090601f016020900481019282611bbe5760008555611c04565b82601f10611bd757805160ff1916838001178555611c04565b82800160010185558215611c04579182015b82811115611c04578251825591602001919060010190611be9565b50610b539291505b80821115610b535760008155600101611c0c565b6001600160e01b03198116811461145857600080fd5b600060208284031215611c4857600080fd5b81356117d981611c20565b60005b83811015611c6e578181015183820152602001611c56565b838111156110415750506000910152565b60008151808452611c97816020860160208601611c53565b601f01601f19169290920160200192915050565b6020815260006117d96020830184611c7f565b600060208284031215611cd057600080fd5b5035919050565b6001600160a01b038116811461145857600080fd5b60008060408385031215611cff57600080fd5b8235611d0a81611cd7565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115611d4957611d49611d18565b604051601f8501601f19908116603f01168101908282118183101715611d7157611d71611d18565b81604052809350858152868686011115611d8a57600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215611db657600080fd5b813567ffffffffffffffff811115611dcd57600080fd5b8201601f81018413611dde57600080fd5b6113b884823560208401611d2e565b600080600060608486031215611e0257600080fd5b8335611e0d81611cd7565b92506020840135611e1d81611cd7565b929592945050506040919091013590565b600060208284031215611e4057600080fd5b81356117d981611cd7565b6020808252825182820181905260009190848201906040850190845b81811015611e8357835183529284019291840191600101611e67565b50909695505050505050565b60008060408385031215611ea257600080fd5b8235611ead81611cd7565b915060208301358015158114611ec257600080fd5b809150509250929050565b60008060008060808587031215611ee357600080fd5b8435611eee81611cd7565b93506020850135611efe81611cd7565b925060408501359150606085013567ffffffffffffffff811115611f2157600080fd5b8501601f81018713611f3257600080fd5b611f4187823560208401611d2e565b91505092959194509250565b60008060408385031215611f6057600080fd5b8235611f6b81611cd7565b91506020830135611ec281611cd7565b600181811c90821680611f8f57607f821691505b60208210811415610e6b57634e487b7160e01b600052602260045260246000fd5b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006000198214156120c1576120c1612097565b5060010190565b600081516120da818560208601611c53565b9290920192915050565b600080845481600182811c91508083168061210057607f831692505b602080841082141561212057634e487b7160e01b86526022600452602486fd5b818015612134576001811461214557612172565b60ff19861689528489019650612172565b60008b81526020902060005b8681101561216a5781548b820152908501908301612151565b505084890196505b50505050505061218281856120c8565b95945050505050565b60006020828403121561219d57600080fd5b81516117d981611cd7565b600082198211156121bb576121bb612097565b500190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b600081600019048311821515161561222c5761222c612097565b500290565b634e487b7160e01b600052601260045260246000fd5b60008261225657612256612231565b500490565b60008282101561226d5761226d612097565b500390565b60008261228157612281612231565b500690565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906122b990830184611c7f565b9695505050505050565b6000602082840312156122d557600080fd5b81516117d981611c2056fea2646970667358221220385206803fabd653e5e8874eb9ea0674168ffa97aa688a09dcbc5b18675394bf64736f6c634300080b0033697066733a2f2f516d6265783779316f364d66475667346a3678346231527342766a466d5a5837485a395a58694a6f4e5a46706a562f

Deployed Bytecode

0x6080604052600436106101ee5760003560e01c8063715018a61161010d578063c634d032116100a0578063d2d8cb671161006f578063d2d8cb671461055f578063e985e9c51461057a578063eb8d24441461059a578063f2fde38b146105b4578063f47c84c5146105d457600080fd5b8063c634d032146104ec578063c87b56dd146104ff578063cd7c03261461051f578063d26ea6c01461053f57600080fd5b806395d89b41116100dc57806395d89b4114610482578063a22cb46514610497578063b2462be5146104b7578063b88d4fde146104cc57600080fd5b8063715018a6146104025780638462151c146104175780638ba4cc3c146104445780638da5cb5b1461046457600080fd5b806334918dfd1161018557806355f804b31161015457806355f804b31461038d5780636352211e146103ad5780636c0360eb146103cd57806370a08231146103e257600080fd5b806334918dfd146103235780633ccfd60b1461033857806342842e0e1461034d5780634f6ccce71461036d57600080fd5b806310969523116101c157806310969523146102a457806318160ddd146102c457806323b872dd146102e35780632f745c591461030357600080fd5b806301ffc9a7146101f357806306fdde0314610228578063081812fc1461024a578063095ea7b314610282575b600080fd5b3480156101ff57600080fd5b5061021361020e366004611c36565b6105ea565b60405190151581526020015b60405180910390f35b34801561023457600080fd5b5061023d610615565b60405161021f9190611cab565b34801561025657600080fd5b5061026a610265366004611cbe565b6106a7565b6040516001600160a01b03909116815260200161021f565b34801561028e57600080fd5b506102a261029d366004611cec565b610734565b005b3480156102b057600080fd5b506102a26102bf366004611da4565b61084a565b3480156102d057600080fd5b506002545b60405190815260200161021f565b3480156102ef57600080fd5b506102a26102fe366004611ded565b61088b565b34801561030f57600080fd5b506102d561031e366004611cec565b6108bc565b34801561032f57600080fd5b506102a261096f565b34801561034457600080fd5b506102a26109ad565b34801561035957600080fd5b506102a2610368366004611ded565b610acf565b34801561037957600080fd5b506102d5610388366004611cbe565b610aea565b34801561039957600080fd5b506102a26103a8366004611da4565b610b57565b3480156103b957600080fd5b5061026a6103c8366004611cbe565b610b94565b3480156103d957600080fd5b5061023d610c20565b3480156103ee57600080fd5b506102d56103fd366004611e2e565b610cae565b34801561040e57600080fd5b506102a2610d7c565b34801561042357600080fd5b50610437610432366004611e2e565b610db2565b60405161021f9190611e4b565b34801561045057600080fd5b506102a261045f366004611cec565b610e71565b34801561047057600080fd5b506005546001600160a01b031661026a565b34801561048e57600080fd5b5061023d610f2e565b3480156104a357600080fd5b506102a26104b2366004611e8f565b610f3d565b3480156104c357600080fd5b5061023d611002565b3480156104d857600080fd5b506102a26104e7366004611ecd565b61100f565b6102a26104fa366004611cbe565b611047565b34801561050b57600080fd5b5061023d61051a366004611cbe565b611232565b34801561052b57600080fd5b5060095461026a906001600160a01b031681565b34801561054b57600080fd5b506102a261055a366004611e2e565b6112b3565b34801561056b57600080fd5b506102d5669c51c4521e000081565b34801561058657600080fd5b50610213610595366004611f4d565b6112ff565b3480156105a657600080fd5b506007546102139060ff1681565b3480156105c057600080fd5b506102a26105cf366004611e2e565b6113c0565b3480156105e057600080fd5b506102d561115c81565b60006001600160e01b0319821663780e9d6360e01b148061060f575061060f8261145b565b92915050565b60606000805461062490611f7b565b80601f016020809104026020016040519081016040528092919081815260200182805461065090611f7b565b801561069d5780601f106106725761010080835404028352916020019161069d565b820191906000526020600020905b81548152906001019060200180831161068057829003601f168201915b5050505050905090565b60006106b2826114ab565b6107185760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600360205260409020546001600160a01b031690565b600061073f82610b94565b9050806001600160a01b0316836001600160a01b031614156107ad5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161070f565b336001600160a01b03821614806107c957506107c981336112ff565b61083b5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161070f565b61084583836114f5565b505050565b6005546001600160a01b031633146108745760405162461bcd60e51b815260040161070f90611fb0565b8051610887906008906020840190611b90565b5050565b6108953382611563565b6108b15760405162461bcd60e51b815260040161070f90611fe5565b610845838383611625565b60006108c783610cae565b82106108e55760405162461bcd60e51b815260040161070f90612036565b6000805b600254811015610956576002818154811061090657610906612081565b6000918252602090912001546001600160a01b0386811691161415610944578382141561093657915061060f9050565b81610940816120ad565b9250505b8061094e816120ad565b9150506108e9565b5060405162461bcd60e51b815260040161070f90612036565b6005546001600160a01b031633146109995760405162461bcd60e51b815260040161070f90611fb0565b6007805460ff19811660ff90911615179055565b6005546001600160a01b031633146109d75760405162461bcd60e51b815260040161070f90611fb0565b60026006541415610a2a5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161070f565b6002600655604051600090339047908381818185875af1925050503d8060008114610a71576040519150601f19603f3d011682016040523d82523d6000602084013e610a76565b606091505b5050905080610ac75760405162461bcd60e51b815260206004820152601860248201527f4661696c656420746f2073656e6420746f204f776e65722e0000000000000000604482015260640161070f565b506001600655565b6108458383836040518060200160405280600081525061100f565b6002546000908210610b535760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161070f565b5090565b6005546001600160a01b03163314610b815760405162461bcd60e51b815260040161070f90611fb0565b805161088790600a906020840190611b90565b60008060028381548110610baa57610baa612081565b6000918252602090912001546001600160a01b031690508061060f5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161070f565b600a8054610c2d90611f7b565b80601f0160208091040260200160405190810160405280929190818152602001828054610c5990611f7b565b8015610ca65780601f10610c7b57610100808354040283529160200191610ca6565b820191906000526020600020905b815481529060010190602001808311610c8957829003601f168201915b505050505081565b60006001600160a01b038216610d195760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161070f565b6000805b600254811015610d755760028181548110610d3a57610d3a612081565b6000918252602090912001546001600160a01b0385811691161415610d6557610d62826120ad565b91505b610d6e816120ad565b9050610d1d565b5092915050565b6005546001600160a01b03163314610da65760405162461bcd60e51b815260040161070f90611fb0565b610db0600061177b565b565b60606000610dbf83610cae565b905080610de05760408051600080825260208201909252905b509392505050565b60008167ffffffffffffffff811115610dfb57610dfb611d18565b604051908082528060200260200182016040528015610e24578160200160208202803683370190505b50905060005b82811015610dd857610e3c85826108bc565b828281518110610e4e57610e4e612081565b602090810291909101015280610e63816120ad565b915050610e2a565b50919050565b6005546001600160a01b03163314610e9b5760405162461bcd60e51b815260040161070f90611fb0565b61115c610eb182610eab60025490565b906117cd565b1115610eff5760405162461bcd60e51b815260206004820181905260248201527f507572636861736520776f756c6420657863656564206d617820737570706c79604482015260640161070f565b60005b8181101561084557610f1c83610f1760025490565b6117e0565b80610f26816120ad565b915050610f02565b60606001805461062490611f7b565b6001600160a01b038216331415610f965760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161070f565b3360008181526004602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60088054610c2d90611f7b565b6110193383611563565b6110355760405162461bcd60e51b815260040161070f90611fe5565b611041848484846117fa565b50505050565b6002600654141561109a5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161070f565b600260065560075460ff166110f15760405162461bcd60e51b815260206004820152601b60248201527f53616c65206d7573742062652061637469766520746f206d696e740000000000604482015260640161070f565b600081116111415760405162461bcd60e51b815260206004820152601d60248201527f4d757374206d696e74206d6f7265207468616e203020746f6b656e732e000000604482015260640161070f565b61115c61115182610eab60025490565b111561119f5760405162461bcd60e51b815260206004820181905260248201527f507572636861736520776f756c6420657863656564206d617820737570706c79604482015260640161070f565b6111b0669c51c4521e00008261182d565b3410156111ff5760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f727265637400604482015260640161070f565b60005b818110156112295761121733610f1760025490565b80611221816120ad565b915050611202565b50506001600655565b606061123d826114ab565b6112815760405162461bcd60e51b81526020600482015260156024820152742a37b5b2b7103237b2b9903737ba1032bc34b9ba1760591b604482015260640161070f565b600a61128c83611839565b60405160200161129d9291906120e4565b6040516020818303038152906040529050919050565b6005546001600160a01b031633146112dd5760405162461bcd60e51b815260040161070f90611fb0565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b60095460405163c455279160e01b81526001600160a01b03848116600483015260009281169190841690829063c455279190602401602060405180830381865afa158015611351573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611375919061218b565b6001600160a01b0316141561138e57600191505061060f565b6001600160a01b0380851660009081526004602090815260408083209387168352929052205460ff165b949350505050565b6005546001600160a01b031633146113ea5760405162461bcd60e51b815260040161070f90611fb0565b6001600160a01b03811661144f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161070f565b6114588161177b565b50565b60006001600160e01b031982166380ac58cd60e01b148061148c57506001600160e01b03198216635b5e139f60e01b145b8061060f57506301ffc9a760e01b6001600160e01b031983161461060f565b6002546000908210801561060f575060006001600160a01b0316600283815481106114d8576114d8612081565b6000918252602090912001546001600160a01b0316141592915050565b600081815260036020526040902080546001600160a01b0319166001600160a01b038416908117909155819061152a82610b94565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061156e826114ab565b6115cf5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161070f565b60006115da83610b94565b9050806001600160a01b0316846001600160a01b031614806116155750836001600160a01b031661160a846106a7565b6001600160a01b0316145b806113b857506113b881856112ff565b826001600160a01b031661163882610b94565b6001600160a01b0316146116a05760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161070f565b6001600160a01b0382166117025760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161070f565b61170d6000826114f5565b816002828154811061172157611721612081565b6000918252602082200180546001600160a01b0319166001600160a01b03938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006117d982846121a8565b9392505050565b610887828260405180602001604052806000815250611937565b611805848484611625565b6118118484848461196a565b6110415760405162461bcd60e51b815260040161070f906121c0565b60006117d98284612212565b60608161185d5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156118875780611871816120ad565b91506118809050600a83612247565b9150611861565b60008167ffffffffffffffff8111156118a2576118a2611d18565b6040519080825280601f01601f1916602001820160405280156118cc576020820181803683370190505b5090505b84156113b8576118e160018361225b565b91506118ee600a86612272565b6118f99060306121a8565b60f81b81838151811061190e5761190e612081565b60200101906001600160f81b031916908160001a905350611930600a86612247565b94506118d0565b6119418383611a68565b61194e600084848461196a565b6108455760405162461bcd60e51b815260040161070f906121c0565b60006001600160a01b0384163b15611a5d57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906119ae903390899088908890600401612286565b6020604051808303816000875af19250505080156119e9575060408051601f3d908101601f191682019092526119e6918101906122c3565b60015b611a43573d808015611a17576040519150601f19603f3d011682016040523d82523d6000602084013e611a1c565b606091505b508051611a3b5760405162461bcd60e51b815260040161070f906121c0565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506113b8565b506001949350505050565b6001600160a01b038216611abe5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161070f565b611ac7816114ab565b15611b145760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161070f565b6002805460018101825560009182527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180546001600160a01b0319166001600160a01b0385169081179091556040518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054611b9c90611f7b565b90600052602060002090601f016020900481019282611bbe5760008555611c04565b82601f10611bd757805160ff1916838001178555611c04565b82800160010185558215611c04579182015b82811115611c04578251825591602001919060010190611be9565b50610b539291505b80821115610b535760008155600101611c0c565b6001600160e01b03198116811461145857600080fd5b600060208284031215611c4857600080fd5b81356117d981611c20565b60005b83811015611c6e578181015183820152602001611c56565b838111156110415750506000910152565b60008151808452611c97816020860160208601611c53565b601f01601f19169290920160200192915050565b6020815260006117d96020830184611c7f565b600060208284031215611cd057600080fd5b5035919050565b6001600160a01b038116811461145857600080fd5b60008060408385031215611cff57600080fd5b8235611d0a81611cd7565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115611d4957611d49611d18565b604051601f8501601f19908116603f01168101908282118183101715611d7157611d71611d18565b81604052809350858152868686011115611d8a57600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215611db657600080fd5b813567ffffffffffffffff811115611dcd57600080fd5b8201601f81018413611dde57600080fd5b6113b884823560208401611d2e565b600080600060608486031215611e0257600080fd5b8335611e0d81611cd7565b92506020840135611e1d81611cd7565b929592945050506040919091013590565b600060208284031215611e4057600080fd5b81356117d981611cd7565b6020808252825182820181905260009190848201906040850190845b81811015611e8357835183529284019291840191600101611e67565b50909695505050505050565b60008060408385031215611ea257600080fd5b8235611ead81611cd7565b915060208301358015158114611ec257600080fd5b809150509250929050565b60008060008060808587031215611ee357600080fd5b8435611eee81611cd7565b93506020850135611efe81611cd7565b925060408501359150606085013567ffffffffffffffff811115611f2157600080fd5b8501601f81018713611f3257600080fd5b611f4187823560208401611d2e565b91505092959194509250565b60008060408385031215611f6057600080fd5b8235611f6b81611cd7565b91506020830135611ec281611cd7565b600181811c90821680611f8f57607f821691505b60208210811415610e6b57634e487b7160e01b600052602260045260246000fd5b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006000198214156120c1576120c1612097565b5060010190565b600081516120da818560208601611c53565b9290920192915050565b600080845481600182811c91508083168061210057607f831692505b602080841082141561212057634e487b7160e01b86526022600452602486fd5b818015612134576001811461214557612172565b60ff19861689528489019650612172565b60008b81526020902060005b8681101561216a5781548b820152908501908301612151565b505084890196505b50505050505061218281856120c8565b95945050505050565b60006020828403121561219d57600080fd5b81516117d981611cd7565b600082198211156121bb576121bb612097565b500190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b600081600019048311821515161561222c5761222c612097565b500290565b634e487b7160e01b600052601260045260246000fd5b60008261225657612256612231565b500490565b60008282101561226d5761226d612097565b500390565b60008261228157612281612231565b500690565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906122b990830184611c7f565b9695505050505050565b6000602082840312156122d557600080fd5b81516117d981611c2056fea2646970667358221220385206803fabd653e5e8874eb9ea0674168ffa97aa688a09dcbc5b18675394bf64736f6c634300080b0033

Deployed Bytecode Sourcemap

39323:3193:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35530:224;;;;;;;;;;-1:-1:-1;35530:224:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;35530:224:0;;;;;;;;24147:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;24959:308::-;;;;;;;;;;-1:-1:-1;24959:308:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1714:32:1;;;1696:51;;1684:2;1669:18;24959:308:0;1550:203:1;24482:411:0;;;;;;;;;;-1:-1:-1;24482:411:0;;;;;:::i;:::-;;:::i;:::-;;40404:120;;;;;;;;;;-1:-1:-1;40404:120:0;;;;;:::i;:::-;;:::i;35830:110::-;;;;;;;;;;-1:-1:-1;35918:7:0;:14;35830:110;;;3585:25:1;;;3573:2;3558:18;35830:110:0;3439:177:1;26018:376:0;;;;;;;;;;-1:-1:-1;26018:376:0;;;;;:::i;:::-;;:::i;36306:490::-;;;;;;;;;;-1:-1:-1;36306:490:0;;;;;:::i;:::-;;:::i;40628:83::-;;;;;;;;;;;;;:::i;40204:194::-;;;;;;;;;;;;;:::i;26465:185::-;;;;;;;;;;-1:-1:-1;26465:185:0;;;;;:::i;:::-;;:::i;36017:205::-;;;;;;;;;;-1:-1:-1;36017:205:0;;;;;:::i;:::-;;:::i;40530:92::-;;;;;;;;;;-1:-1:-1;40530:92:0;;;;;:::i;:::-;;:::i;23754:326::-;;;;;;;;;;-1:-1:-1;23754:326:0;;;;;:::i;:::-;;:::i;39633:51::-;;;;;;;;;;;;;:::i;23300:392::-;;;;;;;;;;-1:-1:-1;23300:392:0;;;;;:::i;:::-;;:::i;38457:103::-;;;;;;;;;;;;;:::i;40719:472::-;;;;;;;;;;-1:-1:-1;40719:472:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;42246:267::-;;;;;;;;;;-1:-1:-1;42246:267:0;;;;;:::i;:::-;;:::i;37806:87::-;;;;;;;;;;-1:-1:-1;37879:6:0;;-1:-1:-1;;;;;37879:6:0;37806:87;;24316:104;;;;;;;;;;;;;:::i;25339:327::-;;;;;;;;;;-1:-1:-1;25339:327:0;;;;;:::i;:::-;;:::i;39494:65::-;;;;;;;;;;;;;:::i;26721:365::-;;;;;;;;;;-1:-1:-1;26721:365:0;;;;;:::i;:::-;;:::i;41199:500::-;;;;;;:::i;:::-;;:::i;41705:213::-;;;;;;;;;;-1:-1:-1;41705:213:0;;;;;:::i;:::-;;:::i;39564:64::-;;;;;;;;;;-1:-1:-1;39564:64:0;;;;-1:-1:-1;;;;;39564:64:0;;;40054:140;;;;;;;;;;-1:-1:-1;40054:140:0;;;;;:::i;:::-;;:::i;39689:75::-;;;;;;;;;;;;39747:17;39689:75;;41924:316;;;;;;;;;;-1:-1:-1;41924:316:0;;;;;:::i;:::-;;:::i;39426:63::-;;;;;;;;;;-1:-1:-1;39426:63:0;;;;;;;;38715:201;;;;;;;;;;-1:-1:-1;38715:201:0;;;;;:::i;:::-;;:::i;39769:61::-;;;;;;;;;;;;39826:4;39769:61;;35530:224;35632:4;-1:-1:-1;;;;;;35656:50:0;;-1:-1:-1;;;35656:50:0;;:90;;;35710:36;35734:11;35710:23;:36::i;:::-;35649:97;35530:224;-1:-1:-1;;35530:224:0:o;24147:100::-;24201:13;24234:5;24227:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24147:100;:::o;24959:308::-;25080:7;25127:16;25135:7;25127;:16::i;:::-;25105:110;;;;-1:-1:-1;;;25105:110:0;;7172:2:1;25105:110:0;;;7154:21:1;7211:2;7191:18;;;7184:30;7250:34;7230:18;;;7223:62;-1:-1:-1;;;7301:18:1;;;7294:42;7353:19;;25105:110:0;;;;;;;;;-1:-1:-1;25235:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;25235:24:0;;24959:308::o;24482:411::-;24563:13;24579:23;24594:7;24579:14;:23::i;:::-;24563:39;;24627:5;-1:-1:-1;;;;;24621:11:0;:2;-1:-1:-1;;;;;24621:11:0;;;24613:57;;;;-1:-1:-1;;;24613:57:0;;7585:2:1;24613:57:0;;;7567:21:1;7624:2;7604:18;;;7597:30;7663:34;7643:18;;;7636:62;-1:-1:-1;;;7714:18:1;;;7707:31;7755:19;;24613:57:0;7383:397:1;24613:57:0;738:10;-1:-1:-1;;;;;24705:21:0;;;;:62;;-1:-1:-1;24730:37:0;24747:5;738:10;41924:316;:::i;24730:37::-;24683:168;;;;-1:-1:-1;;;24683:168:0;;7987:2:1;24683:168:0;;;7969:21:1;8026:2;8006:18;;;7999:30;8065:34;8045:18;;;8038:62;8136:26;8116:18;;;8109:54;8180:19;;24683:168:0;7785:420:1;24683:168:0;24864:21;24873:2;24877:7;24864:8;:21::i;:::-;24552:341;24482:411;;:::o;40404:120::-;37879:6;;-1:-1:-1;;;;;37879:6:0;738:10;38026:23;38018:68;;;;-1:-1:-1;;;38018:68:0;;;;;;;:::i;:::-;40485:33;;::::1;::::0;:16:::1;::::0;:33:::1;::::0;::::1;::::0;::::1;:::i;:::-;;40404:120:::0;:::o;26018:376::-;26227:41;738:10;26260:7;26227:18;:41::i;:::-;26205:140;;;;-1:-1:-1;;;26205:140:0;;;;;;;:::i;:::-;26358:28;26368:4;26374:2;26378:7;26358:9;:28::i;36306:490::-;36403:15;36447:16;36457:5;36447:9;:16::i;:::-;36439:5;:24;36431:80;;;;-1:-1:-1;;;36431:80:0;;;;;;;:::i;:::-;36524:10;36549:6;36545:178;36561:7;:14;36557:18;;36545:178;;;36608:7;36616:1;36608:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;36599:19:0;;;36608:10;;36599:19;36596:116;;;36650:5;36641;:14;36638:58;;;36664:1;-1:-1:-1;36657:8:0;;-1:-1:-1;36657:8:0;36638:58;36689:7;;;;:::i;:::-;;;;36638:58;36577:3;;;;:::i;:::-;;;;36545:178;;;;36735:53;;-1:-1:-1;;;36735:53:0;;;;;;;:::i;40628:83::-;37879:6;;-1:-1:-1;;;;;37879:6:0;738:10;38026:23;38018:68;;;;-1:-1:-1;;;38018:68:0;;;;;;;:::i;:::-;40693:12:::1;::::0;;-1:-1:-1;;40677:28:0;::::1;40693:12;::::0;;::::1;40692:13;40677:28;::::0;;40628:83::o;40204:194::-;37879:6;;-1:-1:-1;;;;;37879:6:0;738:10;38026:23;38018:68;;;;-1:-1:-1;;;38018:68:0;;;;;;;:::i;:::-;2617:1:::1;3215:7;;:19;;3207:63;;;::::0;-1:-1:-1;;;3207:63:0;;10007:2:1;3207:63:0::1;::::0;::::1;9989:21:1::0;10046:2;10026:18;;;10019:30;10085:33;10065:18;;;10058:61;10136:18;;3207:63:0::1;9805:355:1::0;3207:63:0::1;2617:1;3348:7;:18:::0;40285:51:::2;::::0;40262:17:::2;::::0;738:10;;40310:21:::2;::::0;40262:17;40285:51;40262:17;40285:51;40310:21;738:10;40285:51:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40261:75;;;40351:12;40343:49;;;::::0;-1:-1:-1;;;40343:49:0;;10577:2:1;40343:49:0::2;::::0;::::2;10559:21:1::0;10616:2;10596:18;;;10589:30;10655:26;10635:18;;;10628:54;10699:18;;40343:49:0::2;10375:348:1::0;40343:49:0::2;-1:-1:-1::0;2573:1:0::1;3527:7;:22:::0;40204:194::o;26465:185::-;26603:39;26620:4;26626:2;26630:7;26603:39;;;;;;;;;;;;:16;:39::i;36017:205::-;36128:7;:14;36092:7;;36120:22;;36112:79;;;;-1:-1:-1;;;36112:79:0;;10930:2:1;36112:79:0;;;10912:21:1;10969:2;10949:18;;;10942:30;11008:34;10988:18;;;10981:62;-1:-1:-1;;;11059:18:1;;;11052:42;11111:19;;36112:79:0;10728:408:1;36112:79:0;-1:-1:-1;36209:5:0;36017:205::o;40530:92::-;37879:6;;-1:-1:-1;;;;;37879:6:0;738:10;38026:23;38018:68;;;;-1:-1:-1;;;38018:68:0;;;;;;;:::i;:::-;40598:18;;::::1;::::0;:7:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;23754:326::-:0;23871:7;23896:13;23912:7;23920;23912:16;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;23912:16:0;;-1:-1:-1;23961:19:0;23939:110;;;;-1:-1:-1;;;23939:110:0;;11343:2:1;23939:110:0;;;11325:21:1;11382:2;11362:18;;;11355:30;11421:34;11401:18;;;11394:62;-1:-1:-1;;;11472:18:1;;;11465:39;11521:19;;23939:110:0;11141:405:1;39633:51:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;23300:392::-;23422:4;-1:-1:-1;;;;;23453:19:0;;23445:74;;;;-1:-1:-1;;;23445:74:0;;11753:2:1;23445:74:0;;;11735:21:1;11792:2;11772:18;;;11765:30;11831:34;11811:18;;;11804:62;-1:-1:-1;;;11882:18:1;;;11875:40;11932:19;;23445:74:0;11551:406:1;23445:74:0;23532:10;23558:6;23553:109;23570:7;:14;23566:18;;23553:109;;;23617:7;23625:1;23617:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;23608:19:0;;;23617:10;;23608:19;23604:46;;;23643:7;;;:::i;:::-;;;23604:46;23586:3;;;:::i;:::-;;;23553:109;;;-1:-1:-1;23679:5:0;23300:392;-1:-1:-1;;23300:392:0:o;38457:103::-;37879:6;;-1:-1:-1;;;;;37879:6:0;738:10;38026:23;38018:68;;;;-1:-1:-1;;;38018:68:0;;;;;;;:::i;:::-;38522:30:::1;38549:1;38522:18;:30::i;:::-;38457:103::o:0;40719:472::-;40780:16;40806:18;40827:17;40837:6;40827:9;:17::i;:::-;40806:38;-1:-1:-1;40855:15:0;40851:335;;40920:16;;;40934:1;40920:16;;;;;;;;;;;-1:-1:-1;40913:23:0;40719:472;-1:-1:-1;;;40719:472:0:o;40851:335::-;40959:23;40999:10;40985:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40985:25:0;;40959:51;;41019:13;41041:116;41065:10;41057:5;:18;41041:116;;;41113:34;41133:6;41141:5;41113:19;:34::i;:::-;41097:6;41104:5;41097:13;;;;;;;;:::i;:::-;;;;;;;;;;:50;41077:7;;;;:::i;:::-;;;;41041:116;;40851:335;40799:392;40719:472;;;:::o;42246:267::-;37879:6;;-1:-1:-1;;;;;37879:6:0;738:10;38026:23;38018:68;;;;-1:-1:-1;;;38018:68:0;;;;;;;:::i;:::-;39826:4:::1;42332:32;42350:13;42332;35918:7:::0;:14;;35830:110;42332:13:::1;:17:::0;::::1;:32::i;:::-;:46;;42324:91;;;::::0;-1:-1:-1;;;42324:91:0;;12164:2:1;42324:91:0::1;::::0;::::1;12146:21:1::0;;;12183:18;;;12176:30;12242:34;12222:18;;;12215:62;12294:18;;42324:91:0::1;11962:356:1::0;42324:91:0::1;42427:6;42422:86;42443:13;42439:1;:17;42422:86;;;42472:28;42482:2;42486:13;35918:7:::0;:14;;35830:110;42486:13:::1;42472:9;:28::i;:::-;42458:3:::0;::::1;::::0;::::1;:::i;:::-;;;;42422:86;;24316:104:::0;24372:13;24405:7;24398:14;;;;;:::i;25339:327::-;-1:-1:-1;;;;;25474:24:0;;738:10;25474:24;;25466:62;;;;-1:-1:-1;;;25466:62:0;;12525:2:1;25466:62:0;;;12507:21:1;12564:2;12544:18;;;12537:30;12603:27;12583:18;;;12576:55;12648:18;;25466:62:0;12323:349:1;25466:62:0;738:10;25541:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;25541:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;25541:53:0;;;;;;;;;;25610:48;;540:41:1;;;25541:42:0;;738:10;25610:48;;513:18:1;25610:48:0;;;;;;;25339:327;;:::o;39494:65::-;;;;;;;:::i;26721:365::-;26910:41;738:10;26943:7;26910:18;:41::i;:::-;26888:140;;;;-1:-1:-1;;;26888:140:0;;;;;;;:::i;:::-;27039:39;27053:4;27059:2;27063:7;27072:5;27039:13;:39::i;:::-;26721:365;;;;:::o;41199:500::-;2617:1;3215:7;;:19;;3207:63;;;;-1:-1:-1;;;3207:63:0;;10007:2:1;3207:63:0;;;9989:21:1;10046:2;10026:18;;;10019:30;10085:33;10065:18;;;10058:61;10136:18;;3207:63:0;9805:355:1;3207:63:0;2617:1;3348:7;:18;41282:12:::1;::::0;::::1;;41274:52;;;::::0;-1:-1:-1;;;41274:52:0;;12879:2:1;41274:52:0::1;::::0;::::1;12861:21:1::0;12918:2;12898:18;;;12891:30;12957:29;12937:18;;;12930:57;13004:18;;41274:52:0::1;12677:351:1::0;41274:52:0::1;41358:1;41341:14;:18;41333:60;;;::::0;-1:-1:-1;;;41333:60:0;;13235:2:1;41333:60:0::1;::::0;::::1;13217:21:1::0;13274:2;13254:18;;;13247:30;13313:31;13293:18;;;13286:59;13362:18;;41333:60:0::1;13033:353:1::0;41333:60:0::1;39826:4;41408:33;41426:14;41408:13;35918:7:::0;:14;;35830:110;41408:33:::1;:47;;41400:92;;;::::0;-1:-1:-1;;;41400:92:0;;12164:2:1;41400:92:0::1;::::0;::::1;12146:21:1::0;;;12183:18;;;12176:30;12242:34;12222:18;;;12215:62;12294:18;;41400:92:0::1;11962:356:1::0;41400:92:0::1;41520:31;39747:17;41536:14:::0;41520:15:::1;:31::i;:::-;41507:9;:44;;41499:88;;;::::0;-1:-1:-1;;;41499:88:0;;13593:2:1;41499:88:0::1;::::0;::::1;13575:21:1::0;13632:2;13612:18;;;13605:30;13671:33;13651:18;;;13644:61;13722:18;;41499:88:0::1;13391:355:1::0;41499:88:0::1;41604:6;41600:94;41620:14;41616:1;:18;41600:94;;;41650:36;41660:10;41672:13;35918:7:::0;:14;;35830:110;41650:36:::1;41636:3:::0;::::1;::::0;::::1;:::i;:::-;;;;41600:94;;;-1:-1:-1::0;;2573:1:0;3527:7;:22;41199:500::o;41705:213::-;41764:13;41794:17;41802:8;41794:7;:17::i;:::-;41786:51;;;;-1:-1:-1;;;41786:51:0;;13953:2:1;41786:51:0;;;13935:21:1;13992:2;13972:18;;;13965:30;-1:-1:-1;;;14011:18:1;;;14004:51;14072:18;;41786:51:0;13751:345:1;41786:51:0;41875:7;41884:26;41901:8;41884:16;:26::i;:::-;41858:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;41844:68;;41705:213;;;:::o;40054:140::-;37879:6;;-1:-1:-1;;;;;37879:6:0;738:10;38026:23;38018:68;;;;-1:-1:-1;;;38018:68:0;;;;;;;:::i;:::-;40144:20:::1;:44:::0;;-1:-1:-1;;;;;;40144:44:0::1;-1:-1:-1::0;;;;;40144:44:0;;;::::1;::::0;;;::::1;::::0;;40054:140::o;41924:316::-;42085:20;;42125:29;;-1:-1:-1;;;42125:29:0;;-1:-1:-1;;;;;1714:32:1;;;42125:29:0;;;1696:51:1;42014:4:0;;42085:20;;;42117:50;;;;42085:20;;42125:21;;1669:18:1;;42125:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;42117:50:0;;42113:67;;;42176:4;42169:11;;;;;42113:67;-1:-1:-1;;;;;25908:25:0;;;25879:4;25908:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;42194:40;42187:47;41924:316;-1:-1:-1;;;;41924:316:0:o;38715:201::-;37879:6;;-1:-1:-1;;;;;37879:6:0;738:10;38026:23;38018:68;;;;-1:-1:-1;;;38018:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;38804:22:0;::::1;38796:73;;;::::0;-1:-1:-1;;;38796:73:0;;16083:2:1;38796:73:0::1;::::0;::::1;16065:21:1::0;16122:2;16102:18;;;16095:30;16161:34;16141:18;;;16134:62;-1:-1:-1;;;16212:18:1;;;16205:36;16258:19;;38796:73:0::1;15881:402:1::0;38796:73:0::1;38880:28;38899:8;38880:18;:28::i;:::-;38715:201:::0;:::o;22881:355::-;23028:4;-1:-1:-1;;;;;;23070:40:0;;-1:-1:-1;;;23070:40:0;;:105;;-1:-1:-1;;;;;;;23127:48:0;;-1:-1:-1;;;23127:48:0;23070:105;:158;;;-1:-1:-1;;;;;;;;;;12787:40:0;;;23192:36;12678:157;28633:155;28732:7;:14;28698:4;;28722:24;;:58;;;;;28778:1;-1:-1:-1;;;;;28750:30:0;:7;28758;28750:16;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;28750:16:0;:30;;28715:65;28633:155;-1:-1:-1;;28633:155:0:o;32658:174::-;32733:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;32733:29:0;-1:-1:-1;;;;;32733:29:0;;;;;;;;:24;;32787:23;32733:24;32787:14;:23::i;:::-;-1:-1:-1;;;;;32778:46:0;;;;;;;;;;;32658:174;;:::o;28955:452::-;29084:4;29128:16;29136:7;29128;:16::i;:::-;29106:110;;;;-1:-1:-1;;;29106:110:0;;16490:2:1;29106:110:0;;;16472:21:1;16529:2;16509:18;;;16502:30;16568:34;16548:18;;;16541:62;-1:-1:-1;;;16619:18:1;;;16612:42;16671:19;;29106:110:0;16288:408:1;29106:110:0;29227:13;29243:23;29258:7;29243:14;:23::i;:::-;29227:39;;29296:5;-1:-1:-1;;;;;29285:16:0;:7;-1:-1:-1;;;;;29285:16:0;;:64;;;;29342:7;-1:-1:-1;;;;;29318:31:0;:20;29330:7;29318:11;:20::i;:::-;-1:-1:-1;;;;;29318:31:0;;29285:64;:113;;;;29366:32;29383:5;29390:7;29366:16;:32::i;31987:553::-;32160:4;-1:-1:-1;;;;;32133:31:0;:23;32148:7;32133:14;:23::i;:::-;-1:-1:-1;;;;;32133:31:0;;32111:122;;;;-1:-1:-1;;;32111:122:0;;16903:2:1;32111:122:0;;;16885:21:1;16942:2;16922:18;;;16915:30;16981:34;16961:18;;;16954:62;-1:-1:-1;;;17032:18:1;;;17025:39;17081:19;;32111:122:0;16701:405:1;32111:122:0;-1:-1:-1;;;;;32252:16:0;;32244:65;;;;-1:-1:-1;;;32244:65:0;;17313:2:1;32244:65:0;;;17295:21:1;17352:2;17332:18;;;17325:30;17391:34;17371:18;;;17364:62;-1:-1:-1;;;17442:18:1;;;17435:34;17486:19;;32244:65:0;17111:400:1;32244:65:0;32426:29;32443:1;32447:7;32426:8;:29::i;:::-;32485:2;32466:7;32474;32466:16;;;;;;;;:::i;:::-;;;;;;;;;:21;;-1:-1:-1;;;;;;32466:21:0;-1:-1:-1;;;;;32466:21:0;;;;;;32505:27;;32524:7;;32505:27;;;;;;;;;;32466:16;32505:27;31987:553;;;:::o;39076:191::-;39169:6;;;-1:-1:-1;;;;;39186:17:0;;;-1:-1:-1;;;;;;39186:17:0;;;;;;;39219:40;;39169:6;;;39186:17;39169:6;;39219:40;;39150:16;;39219:40;39139:128;39076:191;:::o;15642:98::-;15700:7;15727:5;15731:1;15727;:5;:::i;:::-;15720:12;15642:98;-1:-1:-1;;;15642:98:0:o;29749:110::-;29825:26;29835:2;29839:7;29825:26;;;;;;;;;;;;:9;:26::i;27968:352::-;28125:28;28135:4;28141:2;28145:7;28125:9;:28::i;:::-;28186:48;28209:4;28215:2;28219:7;28228:5;28186:22;:48::i;:::-;28164:148;;;;-1:-1:-1;;;28164:148:0;;;;;;;:::i;16380:98::-;16438:7;16465:5;16469:1;16465;:5;:::i;20366:723::-;20422:13;20643:10;20639:53;;-1:-1:-1;;20670:10:0;;;;;;;;;;;;-1:-1:-1;;;20670:10:0;;;;;20366:723::o;20639:53::-;20717:5;20702:12;20758:78;20765:9;;20758:78;;20791:8;;;;:::i;:::-;;-1:-1:-1;20814:10:0;;-1:-1:-1;20822:2:0;20814:10;;:::i;:::-;;;20758:78;;;20846:19;20878:6;20868:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20868:17:0;;20846:39;;20896:154;20903:10;;20896:154;;20930:11;20940:1;20930:11;;:::i;:::-;;-1:-1:-1;20999:10:0;21007:2;20999:5;:10;:::i;:::-;20986:24;;:2;:24;:::i;:::-;20973:39;;20956:6;20963;20956:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;20956:56:0;;;;;;;;-1:-1:-1;21027:11:0;21036:2;21027:11;;:::i;:::-;;;20896:154;;30086:321;30216:18;30222:2;30226:7;30216:5;:18::i;:::-;30267:54;30298:1;30302:2;30306:7;30315:5;30267:22;:54::i;:::-;30245:154;;;;-1:-1:-1;;;30245:154:0;;;;;;;:::i;33397:980::-;33552:4;-1:-1:-1;;;;;33573:13:0;;19986:20;20034:8;33569:801;;33626:175;;-1:-1:-1;;;33626:175:0;;-1:-1:-1;;;;;33626:36:0;;;;;:175;;738:10;;33720:4;;33747:7;;33777:5;;33626:175;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33626:175:0;;;;;;;;-1:-1:-1;;33626:175:0;;;;;;;;;;;;:::i;:::-;;;33605:710;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33984:13:0;;33980:320;;34027:108;;-1:-1:-1;;;34027:108:0;;;;;;;:::i;33980:320::-;34250:6;34244:13;34235:6;34231:2;34227:15;34220:38;33605:710;-1:-1:-1;;;;;;33865:51:0;-1:-1:-1;;;33865:51:0;;-1:-1:-1;33858:58:0;;33569:801;-1:-1:-1;34354:4:0;33397:980;;;;;;:::o;30743:346::-;-1:-1:-1;;;;;30823:16:0;;30815:61;;;;-1:-1:-1;;;30815:61:0;;19706:2:1;30815:61:0;;;19688:21:1;;;19725:18;;;19718:30;19784:34;19764:18;;;19757:62;19836:18;;30815:61:0;19504:356:1;30815:61:0;30896:16;30904:7;30896;:16::i;:::-;30895:17;30887:58;;;;-1:-1:-1;;;30887:58:0;;20067:2:1;30887:58:0;;;20049:21:1;20106:2;20086:18;;;20079:30;20145;20125:18;;;20118:58;20193:18;;30887:58:0;19865:352:1;30887:58:0;31014:7;:16;;;;;;;-1:-1:-1;31014:16:0;;;;;;;-1:-1:-1;;;;;;31014:16:0;-1:-1:-1;;;;;31014:16:0;;;;;;;;31048:33;;31073:7;;-1:-1:-1;31048:33:0;;-1:-1:-1;;31048:33:0;30743:346;;:::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:131::-;-1:-1:-1;;;;;1833:31:1;;1823:42;;1813:70;;1879:1;1876;1869:12;1894:315;1962:6;1970;2023:2;2011:9;2002:7;1998:23;1994:32;1991:52;;;2039:1;2036;2029:12;1991:52;2078:9;2065:23;2097:31;2122:5;2097:31;:::i;:::-;2147:5;2199:2;2184:18;;;;2171:32;;-1:-1:-1;;;1894:315:1:o;2214:127::-;2275:10;2270:3;2266:20;2263:1;2256:31;2306:4;2303:1;2296:15;2330:4;2327:1;2320:15;2346:632;2411:5;2441:18;2482:2;2474:6;2471:14;2468:40;;;2488:18;;:::i;:::-;2563:2;2557:9;2531:2;2617:15;;-1:-1:-1;;2613:24:1;;;2639:2;2609:33;2605:42;2593:55;;;2663:18;;;2683:22;;;2660:46;2657:72;;;2709:18;;:::i;:::-;2749:10;2745:2;2738:22;2778:6;2769:15;;2808:6;2800;2793:22;2848:3;2839:6;2834:3;2830:16;2827:25;2824:45;;;2865:1;2862;2855:12;2824:45;2915:6;2910:3;2903:4;2895:6;2891:17;2878:44;2970:1;2963:4;2954:6;2946;2942:19;2938:30;2931:41;;;;2346:632;;;;;:::o;2983:451::-;3052:6;3105:2;3093:9;3084:7;3080:23;3076:32;3073:52;;;3121:1;3118;3111:12;3073:52;3161:9;3148:23;3194:18;3186:6;3183:30;3180:50;;;3226:1;3223;3216:12;3180:50;3249:22;;3302:4;3294:13;;3290:27;-1:-1:-1;3280:55:1;;3331:1;3328;3321:12;3280:55;3354:74;3420:7;3415:2;3402:16;3397:2;3393;3389:11;3354:74;:::i;3621:456::-;3698:6;3706;3714;3767:2;3755:9;3746:7;3742:23;3738:32;3735:52;;;3783:1;3780;3773:12;3735:52;3822:9;3809:23;3841:31;3866:5;3841:31;:::i;:::-;3891:5;-1:-1:-1;3948:2:1;3933:18;;3920:32;3961:33;3920:32;3961:33;:::i;:::-;3621:456;;4013:7;;-1:-1:-1;;;4067:2:1;4052:18;;;;4039:32;;3621:456::o;4082:247::-;4141:6;4194:2;4182:9;4173:7;4169:23;4165:32;4162:52;;;4210:1;4207;4200:12;4162:52;4249:9;4236:23;4268:31;4293:5;4268:31;:::i;4334:632::-;4505:2;4557:21;;;4627:13;;4530:18;;;4649:22;;;4476:4;;4505:2;4728:15;;;;4702:2;4687:18;;;4476:4;4771:169;4785:6;4782:1;4779:13;4771:169;;;4846:13;;4834:26;;4915:15;;;;4880:12;;;;4807:1;4800:9;4771:169;;;-1:-1:-1;4957:3:1;;4334:632;-1:-1:-1;;;;;;4334:632:1:o;4971:416::-;5036:6;5044;5097:2;5085:9;5076:7;5072:23;5068:32;5065:52;;;5113:1;5110;5103:12;5065:52;5152:9;5139:23;5171:31;5196:5;5171:31;:::i;:::-;5221:5;-1:-1:-1;5278:2:1;5263:18;;5250:32;5320:15;;5313:23;5301:36;;5291:64;;5351:1;5348;5341:12;5291:64;5374:7;5364:17;;;4971:416;;;;;:::o;5392:795::-;5487:6;5495;5503;5511;5564:3;5552:9;5543:7;5539:23;5535:33;5532:53;;;5581:1;5578;5571:12;5532:53;5620:9;5607:23;5639:31;5664:5;5639:31;:::i;:::-;5689:5;-1:-1:-1;5746:2:1;5731:18;;5718:32;5759:33;5718:32;5759:33;:::i;:::-;5811:7;-1:-1:-1;5865:2:1;5850:18;;5837:32;;-1:-1:-1;5920:2:1;5905:18;;5892:32;5947:18;5936:30;;5933:50;;;5979:1;5976;5969:12;5933:50;6002:22;;6055:4;6047:13;;6043:27;-1:-1:-1;6033:55:1;;6084:1;6081;6074:12;6033:55;6107:74;6173:7;6168:2;6155:16;6150:2;6146;6142:11;6107:74;:::i;:::-;6097:84;;;5392:795;;;;;;;:::o;6192:388::-;6260:6;6268;6321:2;6309:9;6300:7;6296:23;6292:32;6289:52;;;6337:1;6334;6327:12;6289:52;6376:9;6363:23;6395:31;6420:5;6395:31;:::i;:::-;6445:5;-1:-1:-1;6502:2:1;6487:18;;6474:32;6515:33;6474:32;6515:33;:::i;6585:380::-;6664:1;6660:12;;;;6707;;;6728:61;;6782:4;6774:6;6770:17;6760:27;;6728:61;6835:2;6827:6;6824:14;6804:18;6801:38;6798:161;;;6881:10;6876:3;6872:20;6869:1;6862:31;6916:4;6913:1;6906:15;6944:4;6941:1;6934:15;8210:356;8412:2;8394:21;;;8431:18;;;8424:30;8490:34;8485:2;8470:18;;8463:62;8557:2;8542:18;;8210:356::o;8571:413::-;8773:2;8755:21;;;8812:2;8792:18;;;8785:30;8851:34;8846:2;8831:18;;8824:62;-1:-1:-1;;;8917:2:1;8902:18;;8895:47;8974:3;8959:19;;8571:413::o;8989:407::-;9191:2;9173:21;;;9230:2;9210:18;;;9203:30;9269:34;9264:2;9249:18;;9242:62;-1:-1:-1;;;9335:2:1;9320:18;;9313:41;9386:3;9371:19;;8989:407::o;9401:127::-;9462:10;9457:3;9453:20;9450:1;9443:31;9493:4;9490:1;9483:15;9517:4;9514:1;9507:15;9533:127;9594:10;9589:3;9585:20;9582:1;9575:31;9625:4;9622:1;9615:15;9649:4;9646:1;9639:15;9665:135;9704:3;-1:-1:-1;;9725:17:1;;9722:43;;;9745:18;;:::i;:::-;-1:-1:-1;9792:1:1;9781:13;;9665:135::o;14227:185::-;14269:3;14307:5;14301:12;14322:52;14367:6;14362:3;14355:4;14348:5;14344:16;14322:52;:::i;:::-;14390:16;;;;;14227:185;-1:-1:-1;;14227:185:1:o;14417:1174::-;14593:3;14622:1;14655:6;14649:13;14685:3;14707:1;14735:9;14731:2;14727:18;14717:28;;14795:2;14784:9;14780:18;14817;14807:61;;14861:4;14853:6;14849:17;14839:27;;14807:61;14887:2;14935;14927:6;14924:14;14904:18;14901:38;14898:165;;;-1:-1:-1;;;14962:33:1;;15018:4;15015:1;15008:15;15048:4;14969:3;15036:17;14898:165;15079:18;15106:104;;;;15224:1;15219:320;;;;15072:467;;15106:104;-1:-1:-1;;15139:24:1;;15127:37;;15184:16;;;;-1:-1:-1;15106:104:1;;15219:320;14174:1;14167:14;;;14211:4;14198:18;;15314:1;15328:165;15342:6;15339:1;15336:13;15328:165;;;15420:14;;15407:11;;;15400:35;15463:16;;;;15357:10;;15328:165;;;15332:3;;15522:6;15517:3;15513:16;15506:23;;15072:467;;;;;;;15555:30;15581:3;15573:6;15555:30;:::i;:::-;15548:37;14417:1174;-1:-1:-1;;;;;14417:1174:1:o;15596:280::-;15695:6;15748:2;15736:9;15727:7;15723:23;15719:32;15716:52;;;15764:1;15761;15754:12;15716:52;15796:9;15790:16;15815:31;15840:5;15815:31;:::i;17516:128::-;17556:3;17587:1;17583:6;17580:1;17577:13;17574:39;;;17593:18;;:::i;:::-;-1:-1:-1;17629:9:1;;17516:128::o;17649:414::-;17851:2;17833:21;;;17890:2;17870:18;;;17863:30;17929:34;17924:2;17909:18;;17902:62;-1:-1:-1;;;17995:2:1;17980:18;;17973:48;18053:3;18038:19;;17649:414::o;18068:168::-;18108:7;18174:1;18170;18166:6;18162:14;18159:1;18156:21;18151:1;18144:9;18137:17;18133:45;18130:71;;;18181:18;;:::i;:::-;-1:-1:-1;18221:9:1;;18068:168::o;18241:127::-;18302:10;18297:3;18293:20;18290:1;18283:31;18333:4;18330:1;18323:15;18357:4;18354:1;18347:15;18373:120;18413:1;18439;18429:35;;18444:18;;:::i;:::-;-1:-1:-1;18478:9:1;;18373:120::o;18498:125::-;18538:4;18566:1;18563;18560:8;18557:34;;;18571:18;;:::i;:::-;-1:-1:-1;18608:9:1;;18498:125::o;18628:112::-;18660:1;18686;18676:35;;18691:18;;:::i;:::-;-1:-1:-1;18725:9:1;;18628:112::o;18745:500::-;-1:-1:-1;;;;;19014:15:1;;;18996:34;;19066:15;;19061:2;19046:18;;19039:43;19113:2;19098:18;;19091:34;;;19161:3;19156:2;19141:18;;19134:31;;;18939:4;;19182:57;;19219:19;;19211:6;19182:57;:::i;:::-;19174:65;18745:500;-1:-1:-1;;;;;;18745:500:1:o;19250:249::-;19319:6;19372:2;19360:9;19351:7;19347:23;19343:32;19340:52;;;19388:1;19385;19378:12;19340:52;19420:9;19414:16;19439:30;19463:5;19439:30;:::i

Swarm Source

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