ETH Price: $2,454.39 (+1.70%)
 

Overview

Max Total Supply

5,792 CMMINT

Holders

955

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
4 CMMINT
0x0ec997abd9ae9bdce46a01aff482f613c3e38609
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Psychedelic NFTs.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
CryptoMorphMint

Compiler Version
v0.5.16+commit.9c3226ce

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-02-05
*/

/**
 *Submitted for verification at Etherscan.io on 2020-01-19
*/

pragma solidity ^0.5.12;

/*
 * @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 GSN 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.
 */
contract Context {
    // Empty internal constructor, to prevent people from mistakenly deploying
    // an instance of this contract, which should be used via inheritance.
    constructor () internal {

    }
    // solhint-disable-previous-line no-empty-blocks

    function _msgSender() internal view returns (address payable) {
        return msg.sender;
    }

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

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

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
contract IERC721 is IERC165 {
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

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

    /**
     * @dev Returns the owner of the NFT specified by `tokenId`.
     */
    function ownerOf(uint256 tokenId) public view returns (address owner);

    /**
     * @dev Transfers a specific NFT (`tokenId`) from one account (`from`) to
     * another (`to`).
     *
     *
     *
     * Requirements:
     * - `from`, `to` cannot be zero.
     * - `tokenId` must be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this
     * NFT by either {approve} or {setApprovalForAll}.
     */
    function safeTransferFrom(address from, address to, uint256 tokenId) public;
    /**
     * @dev Transfers a specific NFT (`tokenId`) from one account (`from`) to
     * another (`to`).
     *
     * Requirements:
     * - If the caller is not `from`, it must be approved to move this NFT by
     * either {approve} or {setApprovalForAll}.
     */
    function transferFrom(address from, address to, uint256 tokenId) public;
    function approve(address to, uint256 tokenId) public;
    function getApproved(uint256 tokenId) public view returns (address operator);

    function setApprovalForAll(address operator, bool _approved) public;
    function isApprovedForAll(address owner, address operator) public view returns (bool);


    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public;
}

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
contract IERC721Receiver {
    /**
     * @notice Handle the receipt of an NFT
     * @dev The ERC721 smart contract calls this function on the recipient
     * after a {IERC721-safeTransferFrom}. This function MUST return the function selector,
     * otherwise the caller will revert the transaction. The selector to be
     * returned can be obtained as `this.onERC721Received.selector`. This
     * function MAY throw to revert and reject the transfer.
     * Note: the ERC721 contract address is always the message sender.
     * @param operator The address which called `safeTransferFrom` function
     * @param from The address which previously owned the token
     * @param tokenId The NFT identifier which is being transferred
     * @param data Additional data with no specified format
     * @return bytes4 `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
     */
    function onERC721Received(address operator, address from, uint256 tokenId, bytes memory data)
    public returns (bytes4);
}

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @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) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @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 sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     *
     * _Available since v2.4.0._
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

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

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

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts 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) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts 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.
     *
     * _Available since v2.4.0._
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts 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 mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message 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.
     *
     * _Available since v2.4.0._
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * This test is non-exhaustive, and there may be false-negatives: during the
     * execution of a contract's constructor, its address will be reported as
     * not containing a contract.
     *
     * IMPORTANT: It is unsafe to assume that an address for which this
     * function returns false is an externally-owned account (EOA) and not a
     * contract.
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies in extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly { codehash := extcodehash(account) }
        return (codehash != 0x0 && codehash != accountHash);
    }

    /**
     * @dev Converts an `address` into `address payable`. Note that this is
     * simply a type cast: the actual underlying value is not changed.
     *
     * _Available since v2.4.0._
     */
    function toPayable(address account) internal pure returns (address payable) {
        return address(uint160(account));
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     *
     * _Available since v2.4.0._
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-call-value
        (bool success, ) = recipient.call.value(amount)("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }
}

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 * Since it is not possible to overflow a 256 bit integer with increments of one, `increment` can skip the {SafeMath}
 * overflow check, thereby saving gas. This does assume however correct usage, in that the underlying `_value` is never
 * directly accessed.
 */
library Counters {
    using SafeMath for uint256;

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

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

    function increment(Counter storage counter) internal {
        counter._value += 1;
    }

    function decrement(Counter storage counter) internal {
        counter._value = counter._value.sub(1);
    }
}

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts may inherit from this and call {_registerInterface} to declare
 * their support of an interface.
 */
contract ERC165 is IERC165 {
    /*
     * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7
     */
    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;

    /**
     * @dev Mapping of interface ids to whether or not it's supported.
     */
    mapping(bytes4 => bool) private _supportedInterfaces;

    constructor () internal {
        // Derived contracts need only register support for their own interfaces,
        // we register support for ERC165 itself here
        _registerInterface(_INTERFACE_ID_ERC165);
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     *
     * Time complexity O(1), guaranteed to always use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool) {
        return _supportedInterfaces[interfaceId];
    }

    /**
     * @dev Registers the contract as an implementer of the interface defined by
     * `interfaceId`. Support of the actual ERC165 interface is automatic and
     * registering its interface id is not required.
     *
     * See {IERC165-supportsInterface}.
     *
     * Requirements:
     *
     * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`).
     */
    function _registerInterface(bytes4 interfaceId) internal {
        require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
        _supportedInterfaces[interfaceId] = true;
    }
}

/**
 * @title ERC721 Non-Fungible Token Standard basic implementation
 * @dev see https://eips.ethereum.org/EIPS/eip-721
 */
contract ERC721 is Context, ERC165, IERC721 {
    using SafeMath for uint256;
    using Address for address;
    using Counters for Counters.Counter;

    // Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
    // which can be also obtained as `IERC721Receiver(0).onERC721Received.selector`
    bytes4 private constant _ERC721_RECEIVED = 0x150b7a02;

    // Mapping from token ID to owner
    mapping (uint256 => address) private _tokenOwner;

    // Mapping from token ID to approved address
    mapping (uint256 => address) private _tokenApprovals;

    // Mapping from owner to number of owned token
    mapping (address => Counters.Counter) private _ownedTokensCount;

    // Mapping from owner to operator approvals
    mapping (address => mapping (address => bool)) private _operatorApprovals;

    /*
     *     bytes4(keccak256('balanceOf(address)')) == 0x70a08231
     *     bytes4(keccak256('ownerOf(uint256)')) == 0x6352211e
     *     bytes4(keccak256('approve(address,uint256)')) == 0x095ea7b3
     *     bytes4(keccak256('getApproved(uint256)')) == 0x081812fc
     *     bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465
     *     bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c5
     *     bytes4(keccak256('transferFrom(address,address,uint256)')) == 0x23b872dd
     *     bytes4(keccak256('safeTransferFrom(address,address,uint256)')) == 0x42842e0e
     *     bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) == 0xb88d4fde
     *
     *     => 0x70a08231 ^ 0x6352211e ^ 0x095ea7b3 ^ 0x081812fc ^
     *        0xa22cb465 ^ 0xe985e9c ^ 0x23b872dd ^ 0x42842e0e ^ 0xb88d4fde == 0x80ac58cd
     */
    bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd;

    constructor () public {
        // register the supported interfaces to conform to ERC721 via ERC165
        _registerInterface(_INTERFACE_ID_ERC721);
    }

    /**
     * @dev Gets the balance of the specified address.
     * @param owner address to query the balance of
     * @return uint256 representing the amount owned by the passed address
     */
    function balanceOf(address owner) public view returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");

        return _ownedTokensCount[owner].current();
    }

    /**
     * @dev Gets the owner of the specified token ID.
     * @param tokenId uint256 ID of the token to query the owner of
     * @return address currently marked as the owner of the given token ID
     */
    function ownerOf(uint256 tokenId) public view returns (address) {
        address owner = _tokenOwner[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");

        return owner;
    }

    /**
     * @dev Approves another address to transfer the given token ID
     * The zero address indicates there is no approved address.
     * There can only be one approved address per token at a given time.
     * Can only be called by the token owner or an approved operator.
     * @param to address to be approved for the given token ID
     * @param tokenId uint256 ID of the token to be approved
     */
    function approve(address to, uint256 tokenId) public {
        address owner = 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"
        );

        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

    /**
     * @dev Gets the approved address for a token ID, or zero if no address set
     * Reverts if the token ID does not exist.
     * @param tokenId uint256 ID of the token to query the approval of
     * @return address currently approved for the given token ID
     */
    function getApproved(uint256 tokenId) public view returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev Sets or unsets the approval of a given operator
     * An operator is allowed to transfer all tokens of the sender on their behalf.
     * @param to operator address to set the approval
     * @param approved representing the status of the approval to be set
     */
    function setApprovalForAll(address to, bool approved) public {
        require(to != _msgSender(), "ERC721: approve to caller");

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

    /**
     * @dev Tells whether an operator is approved by a given owner.
     * @param owner owner address which you want to query the approval of
     * @param operator operator address which you want to query the approval of
     * @return bool whether the given operator is approved by the given owner
     */
    function isApprovedForAll(address owner, address operator) public view returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev Transfers the ownership of a given token ID to another address.
     * Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     * Requires the msg.sender to be the owner, approved, or operator.
     * @param from current owner of the token
     * @param to address to receive the ownership of the given token ID
     * @param tokenId uint256 ID of the token to be transferred
     */
    function transferFrom(address from, address to, uint256 tokenId) public {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transferFrom(from, to, tokenId);
    }

    /**
     * @dev Safely transfers the ownership of a given token ID to another address
     * If the target address is a contract, it must implement {IERC721Receiver-onERC721Received},
     * which is called upon a safe transfer, and return the magic value
     * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise,
     * the transfer is reverted.
     * Requires the msg.sender to be the owner, approved, or operator
     * @param from current owner of the token
     * @param to address to receive the ownership of the given token ID
     * @param tokenId uint256 ID of the token to be transferred
     */
    function safeTransferFrom(address from, address to, uint256 tokenId) public {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev Safely transfers the ownership of a given token ID to another address
     * If the target address is a contract, it must implement {IERC721Receiver-onERC721Received},
     * which is called upon a safe transfer, and return the magic value
     * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise,
     * the transfer is reverted.
     * Requires the _msgSender() to be the owner, approved, or operator
     * @param from current owner of the token
     * @param to address to receive the ownership of the given token ID
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes data to send along with a safe transfer check
     */
    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransferFrom(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers the ownership of a given token ID to another address
     * If the target address is a contract, it must implement `onERC721Received`,
     * which is called upon a safe transfer, and return the magic value
     * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise,
     * the transfer is reverted.
     * Requires the msg.sender to be the owner, approved, or operator
     * @param from current owner of the token
     * @param to address to receive the ownership of the given token ID
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes data to send along with a safe transfer check
     */
    function _safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) internal {
        _transferFrom(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether the specified token exists.
     * @param tokenId uint256 ID of the token to query the existence of
     * @return bool whether the token exists
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        address owner = _tokenOwner[tokenId];
        return owner != address(0);
    }

    /**
     * @dev Returns whether the given spender can transfer a given token ID.
     * @param spender address of the spender to query
     * @param tokenId uint256 ID of the token to be transferred
     * @return bool whether the msg.sender is approved for the given token ID,
     * is an operator of the owner, or is the owner of the token
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Internal function to safely mint a new token.
     * Reverts if the given token ID already exists.
     * If the target address is a contract, it must implement `onERC721Received`,
     * which is called upon a safe transfer, and return the magic value
     * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise,
     * the transfer is reverted.
     * @param to The address that will own the minted token
     * @param tokenId uint256 ID of the token to be minted
     */
    function _safeMint(address to, uint256 tokenId) internal {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Internal function to safely mint a new token.
     * Reverts if the given token ID already exists.
     * If the target address is a contract, it must implement `onERC721Received`,
     * which is called upon a safe transfer, and return the magic value
     * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise,
     * the transfer is reverted.
     * @param to The address that will own the minted token
     * @param tokenId uint256 ID of the token to be minted
     * @param _data bytes data to send along with a safe transfer check
     */
    function _safeMint(address to, uint256 tokenId, bytes memory _data) internal {
        _mint(to, tokenId);
        require(_checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Internal function to mint a new token.
     * Reverts if the given token ID already exists.
     * @param to The address that will own the minted token
     * @param tokenId uint256 ID of the token to be minted
     */
    function _mint(address to, uint256 tokenId) internal {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _tokenOwner[tokenId] = to;
        _ownedTokensCount[to].increment();

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

    /**
     * @dev Internal function to burn a specific token.
     * Reverts if the token does not exist.
     * Deprecated, use {_burn} instead.
     * @param owner owner of the token to burn
     * @param tokenId uint256 ID of the token being burned
     */
    function _burn(address owner, uint256 tokenId) internal {
        require(ownerOf(tokenId) == owner, "ERC721: burn of token that is not own");

        _clearApproval(tokenId);

        _ownedTokensCount[owner].decrement();
        _tokenOwner[tokenId] = address(0);

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

    /**
     * @dev Internal function to burn a specific token.
     * Reverts if the token does not exist.
     * @param tokenId uint256 ID of the token being burned
     */
    function _burn(uint256 tokenId) internal {
        _burn(ownerOf(tokenId), tokenId);
    }

    /**
     * @dev Internal function to transfer ownership of a given token ID to another address.
     * As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     * @param from current owner of the token
     * @param to address to receive the ownership of the given token ID
     * @param tokenId uint256 ID of the token to be transferred
     */
    function _transferFrom(address from, address to, uint256 tokenId) internal {
        require(ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _clearApproval(tokenId);

        _ownedTokensCount[from].decrement();
        _ownedTokensCount[to].increment();

        _tokenOwner[tokenId] = to;

        emit Transfer(from, 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.
     *
     * This function is deprecated.
     * @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)
        internal returns (bool)
    {
        if (!to.isContract()) {
            return true;
        }

        bytes4 retval = IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data);
        return (retval == _ERC721_RECEIVED);
    }

    /**
     * @dev Private function to clear current approval of a given token ID.
     * @param tokenId uint256 ID of the token to be transferred
     */
    function _clearApproval(uint256 tokenId) private {
        if (_tokenApprovals[tokenId] != address(0)) {
            _tokenApprovals[tokenId] = address(0);
        }
    }
}

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
contract IERC721Enumerable is IERC721 {
    function totalSupply() public view returns (uint256);
    function tokenOfOwnerByIndex(address owner, uint256 index) public view returns (uint256 tokenId);

    function tokenByIndex(uint256 index) public view returns (uint256);
}

/**
 * @title ERC-721 Non-Fungible Token with optional enumeration extension logic
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
contract ERC721Enumerable is Context, ERC165, ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => uint256[]) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

    /*
     *     bytes4(keccak256('totalSupply()')) == 0x18160ddd
     *     bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) == 0x2f745c59
     *     bytes4(keccak256('tokenByIndex(uint256)')) == 0x4f6ccce7
     *
     *     => 0x18160ddd ^ 0x2f745c59 ^ 0x4f6ccce7 == 0x780e9d63
     */
    bytes4 private constant _INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63;

    /**
     * @dev Constructor function.
     */
    constructor () public {
        // register the supported interface to conform to ERC721Enumerable via ERC165
        _registerInterface(_INTERFACE_ID_ERC721_ENUMERABLE);
    }

    /**
     * @dev Gets the token ID at a given index of the tokens list of the requested owner.
     * @param owner address owning the tokens list to be accessed
     * @param index uint256 representing the index to be accessed of the requested tokens list
     * @return uint256 token ID at the given index of the tokens list owned by the requested address
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view returns (uint256) {
        require(index < balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev Gets the total amount of tokens stored by the contract.
     * @return uint256 representing the total amount of tokens
     */
    function totalSupply() public view returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev Gets the token ID at a given index of all the tokens in this contract
     * Reverts if the index is greater or equal to the total number of tokens.
     * @param index uint256 representing the index to be accessed of the tokens list
     * @return uint256 token ID at the given index of the tokens list
     */
    function tokenByIndex(uint256 index) public view returns (uint256) {
        require(index < totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @dev Internal function to transfer ownership of a given token ID to another address.
     * As opposed to transferFrom, this imposes no restrictions on msg.sender.
     * @param from current owner of the token
     * @param to address to receive the ownership of the given token ID
     * @param tokenId uint256 ID of the token to be transferred
     */
    function _transferFrom(address from, address to, uint256 tokenId) internal {
        super._transferFrom(from, to, tokenId);

        _removeTokenFromOwnerEnumeration(from, tokenId);

        _addTokenToOwnerEnumeration(to, tokenId);
    }

    /**
     * @dev Internal function to mint a new token.
     * Reverts if the given token ID already exists.
     * @param to address the beneficiary that will own the minted token
     * @param tokenId uint256 ID of the token to be minted
     */
    function _mint(address to, uint256 tokenId) internal {
        super._mint(to, tokenId);

        _addTokenToOwnerEnumeration(to, tokenId);

        _addTokenToAllTokensEnumeration(tokenId);
    }

    /**
     * @dev Internal function to burn a specific token.
     * Reverts if the token does not exist.
     * Deprecated, use {ERC721-_burn} instead.
     * @param owner owner of the token to burn
     * @param tokenId uint256 ID of the token being burned
     */
    function _burn(address owner, uint256 tokenId) internal {
        super._burn(owner, tokenId);

        _removeTokenFromOwnerEnumeration(owner, tokenId);
        // Since tokenId will be deleted, we can clear its slot in _ownedTokensIndex to trigger a gas refund
        _ownedTokensIndex[tokenId] = 0;

        _removeTokenFromAllTokensEnumeration(tokenId);
    }

    /**
     * @dev Gets the list of token IDs of the requested owner.
     * @param owner address owning the tokens
     * @return uint256[] List of token IDs owned by the requested address
     */
    function _tokensOfOwner(address owner) internal view returns (uint256[] storage) {
        return _ownedTokens[owner];
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        _ownedTokensIndex[tokenId] = _ownedTokens[to].length;
        _ownedTokens[to].push(tokenId);
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _ownedTokens[from].length.sub(1);
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        _ownedTokens[from].length--;

        // Note that _ownedTokensIndex[tokenId] hasn't been cleared: it still points to the old slot (now occupied by
        // lastTokenId, or just over the end of the array if the token was the last one).
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length.sub(1);
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        _allTokens.length--;
        _allTokensIndex[tokenId] = 0;
    }
}

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
contract IERC721Metadata is IERC721 {
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

contract ERC721Metadata is Context, ERC165, ERC721, IERC721Metadata {
    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Optional mapping for token URIs
    mapping(uint256 => string) private _tokenURIs;
    /*
     *     bytes4(keccak256('name()')) == 0x06fdde03
     *     bytes4(keccak256('symbol()')) == 0x95d89b41
     *     bytes4(keccak256('tokenURI(uint256)')) == 0xc87b56dd
     *
     *     => 0x06fdde03 ^ 0x95d89b41 ^ 0xc87b56dd == 0x5b5e139f
     */
    bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f;

    /**
     * @dev Constructor function
     */
    constructor (string memory name, string memory symbol) public {
        _name = name;
        _symbol = symbol;

        // register the supported interfaces to conform to ERC721 via ERC165
        _registerInterface(_INTERFACE_ID_ERC721_METADATA);
    }

    /**
     * @dev Gets the token name.
     * @return string representing the token name
     */
    function name() external view returns (string memory) {
        return _name;
    }

    /**
     * @dev Gets the token symbol.
     * @return string representing the token symbol
     */
    function symbol() external view returns (string memory) {
        return _symbol;
    }


    /**
     * @dev Returns an URI for a given token ID.
     * Throws if the token ID does not exist. May return an empty string.
     * @param tokenId uint256 ID of the token to query
     */
     
    /*
        function tokenURI(uint256 tokenId) external view returns (string memory) {
            require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
    //        return _tokenURIs[tokenId];

            return string(abi.encodePacked("https://ChainScrape3.damo1884.repl.co/api/mint?id=", id_to_value[tokenId]));
        }
    */

    /**
     * @dev Internal function to set the token URI for a given token.
     * Reverts if the token ID does not exist.
     * @param tokenId uint256 ID of the token to set its URI
     * @param uri string URI to assign
     */
    function _setTokenURI(uint256 tokenId, string memory uri) internal {
        require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token");
        _tokenURIs[tokenId] = uri;
    }

    /**
     * @dev Internal function to burn a specific token.
     * Reverts if the token does not exist.
     * Deprecated, use _burn(uint256) instead.
     * @param owner owner of the token to burn
     * @param tokenId uint256 ID of the token being burned by the msg.sender
     */
    function _burn(address owner, uint256 tokenId) internal {
        super._burn(owner, tokenId);

        // Clear metadata (if any)
        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }
    }
}

/**
 * @title Full ERC721 Token
 * @dev This implementation includes all the required and some optional functionality of the ERC721 standard
 * Moreover, it includes approve all functionality using operator terminology.
 *
 * See https://eips.ethereum.org/EIPS/eip-721
 */
contract ERC721Full is ERC721, ERC721Enumerable, ERC721Metadata {
    constructor (string memory name, string memory symbol) public ERC721Metadata(name, symbol) {
        // solhint-disable-previous-line no-empty-blocks
    }
}

library Random
{
    /**
    * Initialize the pool with the entropy of the blockhashes of the blocks in the closed interval [earliestBlock, latestBlock]
    * The argument "seed" is optional and can be left zero in most cases.
    * This extra seed allows you to select a different sequence of random numbers for the same block range.
    */
    function init(uint256 earliestBlock, uint256 latestBlock, uint256 seed) internal view returns (bytes32[] memory) {
        require(block.number-1 >= latestBlock && latestBlock >= earliestBlock, "Random.init: invalid block interval");
        bytes32[] memory pool = new bytes32[](latestBlock-earliestBlock+2);
        bytes32 salt = keccak256(abi.encodePacked(block.number,seed));
        for(uint256 i = 0; i <= latestBlock-earliestBlock; i++) {
            // Add some salt to each blockhash so that we don't reuse those hash chains
            // when this function gets called again in another block.
            pool[i+1] = keccak256(abi.encodePacked(blockhash(earliestBlock+i),salt));
        }
        return pool;
    }

    /**
    * Initialize the pool from the latest "num" blocks.
    */
    function initLatest(uint256 num, uint256 seed) internal view returns (bytes32[] memory) {
        return init(block.number-num, block.number-1, seed);
    }

    /**
    * Advances to the next 256-bit random number in the pool of hash chains.
    */
    function next(bytes32[] memory pool) internal pure returns (uint256) {
        require(pool.length > 1, "Random.next: invalid pool");
        uint256 roundRobinIdx = uint256(pool[0]) % (pool.length-1) + 1;
        bytes32 hash = keccak256(abi.encodePacked(pool[roundRobinIdx]));
        pool[0] = bytes32(uint256(pool[0])+1);
        pool[roundRobinIdx] = hash;
        return uint256(hash);
    }

    /**
    * Produces random integer values, uniformly distributed on the closed interval [a, b]
    */
    function uniform(bytes32[] memory pool, int256 a, int256 b) internal pure returns (int256) {
        require(a <= b, "Random.uniform: invalid interval");
        return int256(next(pool)%uint256(b-a+1))+a;
    }
}


contract CryptoMorphMint is ERC721Full {
    using SafeMath for uint256;

    mapping (uint256 => uint) internal idToSymmetry;
    mapping (uint256 => uint) internal idToColors;

    constructor() ERC721Full("CryptoMorphMint", "CMMINT") public {
        _registerToken(1, 1);
        _registerToken(1, 2);
        _registerToken(2, 2);
        _registerToken(2, 3);
        _registerToken(3, 3);
        _registerToken(3, 4);
        _registerToken(4, 4);
        _registerToken(4, 5);
        _registerToken(5, 5);
        _registerToken(5, 6);
        _registerToken(6, 6);
        _registerToken(6, 7);
        _registerToken(7, 7);
        _registerToken(7, 8);
        _registerToken(8, 8);
        _registerToken(8, 9);
        _registerToken(7, 9);
        _registerToken(7, 10);
        _registerToken(6, 10);
        _registerToken(6, 11);
        _registerToken(5, 11);
        _registerToken(5, 12);
        _registerToken(4, 12);
        _registerToken(4, 13);
        _registerToken(3, 13);
        _registerToken(3, 14);
        _registerToken(2, 14);
        _registerToken(2, 15);
        _registerToken(1, 15);
        _registerToken(1, 16);
    }

    function getRandomColors(uint256 seed) internal view returns (uint256 colorsID) {

      bytes32[] memory pool = Random.initLatest(4, seed);

      uint256 colorsRNG = uint256(Random.uniform(pool, 1, 10000));
      if (colorsRNG <= 100) {
        colorsID = 1;
      } else if (colorsRNG <= 500) {
        colorsID = 2;
      } else if (colorsRNG <= 1000) {
        colorsID = 3;
      } else if (colorsRNG <= 3000) {
        colorsID = 4;
      } else if (colorsRNG <= 7000) {
        colorsID = 5;
      } else if (colorsRNG <= 9000) {
        colorsID = 6;
      } else if (colorsRNG <= 9500) {
        colorsID = 7;
      } else if (colorsRNG <= 9900) {
        colorsID = 8;
      } else {
        colorsID = 1;
      }
    }

    function getRandomSymmetry(uint256 seed) internal view returns (uint256 symmetryID) {

      bytes32[] memory pool = Random.initLatest(5, seed);

      uint256 symmetryRNG = uint256(Random.uniform(pool, 1, 10000));

      if (symmetryRNG <= 100) {
        symmetryID = 1;
      } else if (symmetryRNG <= 500) {
        symmetryID = 2;
      } else if (symmetryRNG <= 1000) {
        symmetryID = 3;
      } else if (symmetryRNG <= 1500) {
        symmetryID = 4;
      } else if (symmetryRNG <= 2000) {
        symmetryID = 5;
      } else if (symmetryRNG <= 2500) {
        symmetryID = 6;
      } else if (symmetryRNG <= 3000) {
        symmetryID = 7;
      } else if (symmetryRNG <= 3500) {
        symmetryID = 8;
      } else if (symmetryRNG <= 4000) {
        symmetryID = 9;
      } else if (symmetryRNG <= 5000) {
        symmetryID = 10;
      } else if (symmetryRNG <= 6000) {
        symmetryID = 11;
      } else if (symmetryRNG <= 7000) {
        symmetryID = 12;
      } else if (symmetryRNG <= 8000) {
        symmetryID = 13;
      } else if (symmetryRNG <= 9000) {
        symmetryID = 14;
      } else if (symmetryRNG <= 9500) {
        symmetryID = 15;
      } else if (symmetryRNG <= 9900) {
        symmetryID = 16;
      } else {
        symmetryID = 1;
      }
    }

    function _registerToken(uint256 colors, uint256 symmetry) private {
        uint256 tokenId = totalSupply();
        idToSymmetry[tokenId] = symmetry;
        idToColors[tokenId] = colors;
        _mint(msg.sender, tokenId);
    }

    uint public constant tokenLimit = 9999;

    function createCryptoMorph(uint256 seed) public payable {

      if (totalSupply() < 1000) {
        require(msg.value == 6 finney);
      } else if (totalSupply() < 2000) {
        require(msg.value == 8 finney);
      } else if (totalSupply() < 3000) {
        require(msg.value == 10 finney);
      } else if (totalSupply() < 4000) {
        require(msg.value == 15 finney);
      } else if (totalSupply() < 5000) {
        require(msg.value == 20 finney);
      } else if (totalSupply() < 6000) {
        require(msg.value == 25 finney);
      } else if (totalSupply() < 7000) {
        require(msg.value == 30 finney);
      } else if (totalSupply() < 8000) {
        require(msg.value == 35 finney);
      } else if (totalSupply() < 9000) {
        require(msg.value == 40 finney);
      } else {
        require(msg.value == 45 finney);
      }

      require(totalSupply() <= tokenLimit, "CryptoMorph Mint sale has completed. They are now only available on the secondary market. ");

      address(0xaa02859173c1f351Ffb4f015A98Fa66200d95687).transfer(msg.value);

      uint256 symmetry = getRandomSymmetry(seed);
      uint256 colors = getRandomColors(seed);

      _registerToken(colors, symmetry);
    }

   function integerToString(uint _i) internal pure
      returns (string memory) {

      if (_i == 0) {
         return "0";
      }
      uint j = _i;
      uint len;

      while (j != 0) {
         len++;
         j /= 10;
      }
      bytes memory bstr = new bytes(len);
      uint k = len - 1;

      while (_i != 0) {
         bstr[k--] = byte(uint8(48 + _i % 10));
         _i /= 10;
      }
      return string(bstr);
   }


    function tokenURI(uint256 id) external view returns (string memory) {
        require(_exists(id), "ERC721Metadata: URI query for nonexistent token");
        return string(abi.encodePacked("https://ChainScrape3.damo1884.repl.co/api/mint?id=", integerToString(id)));
    }

    function getSymmetry(uint id) public view returns (uint256 symmetry) {
        return idToSymmetry[id];
    }

    function getColors(uint id) public view returns (uint256 colors) {
        return idToColors[id];
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"payable":false,"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":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"seed","type":"uint256"}],"name":"createCryptoMorph","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getColors","outputs":[{"internalType":"uint256","name":"colors","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getSymmetry","outputs":[{"internalType":"uint256","name":"symmetry","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"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":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tokenLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506040518060400160405280600f81526020017f43727970746f4d6f7270684d696e7400000000000000000000000000000000008152506040518060400160405280600681526020017f434d4d494e5400000000000000000000000000000000000000000000000000008152508181620000986301ffc9a760e01b6200036c60201b60201c565b620000b06380ac58cd60e01b6200036c60201b60201c565b620000c863780e9d6360e01b6200036c60201b60201c565b8160099080519060200190620000e0929190620008e5565b5080600a9080519060200190620000f9929190620008e5565b5062000112635b5e139f60e01b6200036c60201b60201c565b50505050620001296001806200047560201b60201c565b6200013d600160026200047560201b60201c565b620001506002806200047560201b60201c565b62000164600260036200047560201b60201c565b620001776003806200047560201b60201c565b6200018b600360046200047560201b60201c565b6200019e6004806200047560201b60201c565b620001b2600460056200047560201b60201c565b620001c56005806200047560201b60201c565b620001d9600560066200047560201b60201c565b620001ec6006806200047560201b60201c565b62000200600660076200047560201b60201c565b620002136007806200047560201b60201c565b62000227600760086200047560201b60201c565b6200023a6008806200047560201b60201c565b6200024e600860096200047560201b60201c565b62000262600760096200047560201b60201c565b620002766007600a6200047560201b60201c565b6200028a6006600a6200047560201b60201c565b6200029e6006600b6200047560201b60201c565b620002b26005600b6200047560201b60201c565b620002c66005600c6200047560201b60201c565b620002da6004600c6200047560201b60201c565b620002ee6004600d6200047560201b60201c565b620003026003600d6200047560201b60201c565b620003166003600e6200047560201b60201c565b6200032a6002600e6200047560201b60201c565b6200033e6002600f6200047560201b60201c565b620003526001600f6200047560201b60201c565b62000366600160106200047560201b60201c565b62000994565b63ffffffff60e01b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141562000409576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4552433136353a20696e76616c696420696e746572666163652069640000000081525060200191505060405180910390fd5b6001600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600062000487620004d060201b60201c565b905081600c60008381526020019081526020016000208190555082600d600083815260200190815260200160002081905550620004cb3382620004dd60201b60201c565b505050565b6000600780549050905090565b620004f482826200051b60201b620028f31760201c565b6200050682826200074a60201b60201c565b62000517816200081160201b60201c565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620005bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4552433732313a206d696e7420746f20746865207a65726f206164647265737381525060200191505060405180910390fd5b620005d0816200085d60201b60201c565b1562000644576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000081525060200191505060405180910390fd5b816001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620006ea600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020620008cf60201b620026081760201c565b808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490506006600083815260200190815260200160002081905550600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190806001815401808255809150509060018203906000526020600020016000909192909190915055505050565b6007805490506008600083815260200190815260200160002081905550600781908060018154018082558091505090600182039060005260206000200160009091929091909150555050565b6000806001600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415915050919050565b6001816000016000828254019250508190555050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200092857805160ff191683800117855562000959565b8280016001018555821562000959579182015b82811115620009585782518255916020019190600101906200093b565b5b5090506200096891906200096c565b5090565b6200099191905b808211156200098d57600081600090555060010162000973565b5090565b90565b612fd180620009a46000396000f3fe60806040526004361061011f5760003560e01c80635cdf141b116100a0578063b2895b7311610064578063b2895b7314610701578063b88d4fde14610750578063c87b56dd14610862578063e985e9c514610916578063f31196821461099f5761011f565b80635cdf141b146105065780636352211e1461053457806370a08231146105af57806395d89b4114610614578063a22cb465146106a45761011f565b806323b872dd116100e757806323b872dd146103275780632f745c59146103a257806342842e0e146104115780634f6ccce71461048c57806356c7627e146104db5761011f565b806301ffc9a71461012457806306fdde0314610196578063081812fc14610226578063095ea7b3146102a157806318160ddd146102fc575b600080fd5b34801561013057600080fd5b5061017c6004803603602081101561014757600080fd5b8101908080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690602001909291905050506109ee565b604051808215151515815260200191505060405180910390f35b3480156101a257600080fd5b506101ab610a55565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156101eb5780820151818401526020810190506101d0565b50505050905090810190601f1680156102185780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561023257600080fd5b5061025f6004803603602081101561024957600080fd5b8101908080359060200190929190505050610af7565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156102ad57600080fd5b506102fa600480360360408110156102c457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610b92565b005b34801561030857600080fd5b50610311610d79565b6040518082815260200191505060405180910390f35b34801561033357600080fd5b506103a06004803603606081101561034a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610d86565b005b3480156103ae57600080fd5b506103fb600480360360408110156103c557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610dfc565b6040518082815260200191505060405180910390f35b34801561041d57600080fd5b5061048a6004803603606081101561043457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610ebb565b005b34801561049857600080fd5b506104c5600480360360208110156104af57600080fd5b8101908080359060200190929190505050610edb565b6040518082815260200191505060405180910390f35b3480156104e757600080fd5b506104f0610f5b565b6040518082815260200191505060405180910390f35b6105326004803603602081101561051c57600080fd5b8101908080359060200190929190505050610f61565b005b34801561054057600080fd5b5061056d6004803603602081101561055757600080fd5b81019080803590602001909291905050506111d4565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156105bb57600080fd5b506105fe600480360360208110156105d257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061129c565b6040518082815260200191505060405180910390f35b34801561062057600080fd5b50610629611371565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561066957808201518184015260208101905061064e565b50505050905090810190601f1680156106965780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156106b057600080fd5b506106ff600480360360408110156106c757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050611413565b005b34801561070d57600080fd5b5061073a6004803603602081101561072457600080fd5b81019080803590602001909291905050506115cb565b6040518082815260200191505060405180910390f35b34801561075c57600080fd5b506108606004803603608081101561077357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156107da57600080fd5b8201836020820111156107ec57600080fd5b8035906020019184600183028401116401000000008311171561080e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506115e8565b005b34801561086e57600080fd5b5061089b6004803603602081101561088557600080fd5b8101908080359060200190929190505050611660565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156108db5780820151818401526020810190506108c0565b50505050905090810190601f1680156109085780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561092257600080fd5b506109856004803603604081101561093957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611745565b604051808215151515815260200191505060405180910390f35b3480156109ab57600080fd5b506109d8600480360360208110156109c257600080fd5b81019080803590602001909291905050506117d9565b6040518082815260200191505060405180910390f35b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060098054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610aed5780601f10610ac257610100808354040283529160200191610aed565b820191906000526020600020905b815481529060010190602001808311610ad057829003601f168201915b5050505050905090565b6000610b02826117f6565b610b57576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180612e78602c913960400191505060405180910390fd5b6002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b9d826111d4565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180612efc6021913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c43611868565b73ffffffffffffffffffffffffffffffffffffffff161480610c725750610c7181610c6c611868565b611745565b5b610cc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526038815260200180612ded6038913960400191505060405180910390fd5b826002600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000600780549050905090565b610d97610d91611868565b82611870565b610dec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526031815260200180612f406031913960400191505060405180910390fd5b610df7838383611964565b505050565b6000610e078361129c565b8210610e5e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180612ce6602b913960400191505060405180910390fd5b600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110610ea857fe5b9060005260206000200154905092915050565b610ed6838383604051806020016040528060008152506115e8565b505050565b6000610ee5610d79565b8210610f3c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180612f71602c913960400191505060405180910390fd5b60078281548110610f4957fe5b90600052602060002001549050919050565b61270f81565b6103e8610f6c610d79565b1015610f8a57661550f7dca700003414610f8557600080fd5b6110ee565b6107d0610f95610d79565b1015610fb357661c6bf5263400003414610fae57600080fd5b6110ed565b610bb8610fbe610d79565b1015610fdc57662386f26fc100003414610fd757600080fd5b6110ec565b610fa0610fe7610d79565b10156110055766354a6ba7a18000341461100057600080fd5b6110eb565b611388611010610d79565b101561102e5766470de4df820000341461102957600080fd5b6110ea565b611770611039610d79565b1015611057576658d15e17628000341461105257600080fd5b6110e9565b611b58611062610d79565b101561108057666a94d74f430000341461107b57600080fd5b6110e8565b611f4061108b610d79565b10156110a957667c58508723800034146110a457600080fd5b6110e7565b6123286110b4610d79565b10156110d257668e1bc9bf04000034146110cd57600080fd5b6110e6565b669fdf42f6e4800034146110e557600080fd5b5b5b5b5b5b5b5b5b5b61270f6110f9610d79565b1115611150576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252605a815260200180612d93605a913960600191505060405180910390fd5b73aa02859173c1f351ffb4f015a98fa66200d9568773ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f193505050501580156111aa573d6000803e3d6000fd5b5060006111b682611988565b905060006111c383611ae5565b90506111cf8183611baa565b505050565b6000806001600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611293576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180612e4f6029913960400191505060405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611323576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180612e25602a913960400191505060405180910390fd5b61136a600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611bf5565b9050919050565b6060600a8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114095780601f106113de57610100808354040283529160200191611409565b820191906000526020600020905b8154815290600101906020018083116113ec57829003601f168201915b5050505050905090565b61141b611868565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f4552433732313a20617070726f766520746f2063616c6c65720000000000000081525060200191505060405180910390fd5b80600460006114c9611868565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611576611868565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051808215151515815260200191505060405180910390a35050565b6000600c6000838152602001908152602001600020549050919050565b6115f96115f3611868565b83611870565b61164e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526031815260200180612f406031913960400191505060405180910390fd5b61165a84848484611c03565b50505050565b606061166b826117f6565b6116c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180612ecd602f913960400191505060405180910390fd5b6116c982611c75565b6040516020018080612cb46032913960320182805190602001908083835b6020831061170a57805182526020820191506020810190506020830392506116e7565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040529050919050565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000600d6000838152602001908152602001600020549050919050565b6000806001600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415915050919050565b600033905090565b600061187b826117f6565b6118d0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180612d67602c913960400191505060405180910390fd5b60006118db836111d4565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061194a57508373ffffffffffffffffffffffffffffffffffffffff1661193284610af7565b73ffffffffffffffffffffffffffffffffffffffff16145b8061195b575061195a8185611745565b5b91505092915050565b61196f838383611da2565b6119798382611ffd565b611983828261219b565b505050565b60006060611997600584612262565b905060006119a982600161271061227c565b9050606481116119bc5760019250611ade565b6101f481116119ce5760029250611add565b6103e881116119e05760039250611adc565b6105dc81116119f25760049250611adb565b6107d08111611a045760059250611ada565b6109c48111611a165760069250611ad9565b610bb88111611a285760079250611ad8565b610dac8111611a3a5760089250611ad7565b610fa08111611a4c5760099250611ad6565b6113888111611a5e57600a9250611ad5565b6117708111611a7057600b9250611ad4565b611b588111611a8257600c9250611ad3565b611f408111611a9457600d9250611ad2565b6123288111611aa657600e9250611ad1565b61251c8111611ab857600f9250611ad0565b6126ac8111611aca5760109250611acf565b600192505b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5050919050565b60006060611af4600484612262565b90506000611b0682600161271061227c565b905060648111611b195760019250611ba3565b6101f48111611b2b5760029250611ba2565b6103e88111611b3d5760039250611ba1565b610bb88111611b4f5760049250611ba0565b611b588111611b615760059250611b9f565b6123288111611b735760069250611b9e565b61251c8111611b855760079250611b9d565b6126ac8111611b975760089250611b9c565b600192505b5b5b5b5b5b5b5b5050919050565b6000611bb4610d79565b905081600c60008381526020019081526020016000208190555082600d600083815260200190815260200160002081905550611bf03382612316565b505050565b600081600001549050919050565b611c0e848484611964565b611c1a84848484612337565b611c6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180612d116032913960400191505060405180910390fd5b50505050565b60606000821415611cbd576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611d9d565b600082905060005b60008214611ce7578080600101915050600a8281611cdf57fe5b049150611cc5565b6060816040519080825280601f01601f191660200182016040528015611d1c5781602001600182028038833980820191505090505b50905060006001830390505b60008614611d9557600a8681611d3a57fe5b0660300160f81b82828060019003935081518110611d5457fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8681611d8d57fe5b049550611d28565b819450505050505b919050565b8273ffffffffffffffffffffffffffffffffffffffff16611dc2826111d4565b73ffffffffffffffffffffffffffffffffffffffff1614611e2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180612ea46029913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611eb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180612d436024913960400191505060405180910390fd5b611ebd81612527565b611f04600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206125e5565b611f4b600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612608565b816001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006120556001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905061261e90919063ffffffff16565b9050600060066000848152602001908152602001600020549050818114612142576000600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083815481106120c257fe5b9060005260206000200154905080600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020838154811061211a57fe5b9060005260206000200181905550816006600083815260200190815260200160002081905550505b600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054809190600190036121949190612c62565b5050505050565b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490506006600083815260200190815260200160002081905550600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190806001815401808255809150509060018203906000526020600020016000909192909190915055505050565b60606122748343036001430384612668565b905092915050565b6000818313156122f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f52616e646f6d2e756e69666f726d3a20696e76616c696420696e74657276616c81525060200191505060405180910390fd5b82600184840301612304866127b4565b8161230b57fe5b060190509392505050565b61232082826128f3565b61232a828261219b565b61233381612b0b565b5050565b60006123588473ffffffffffffffffffffffffffffffffffffffff16612b57565b612365576001905061251f565b60008473ffffffffffffffffffffffffffffffffffffffff1663150b7a0261238b611868565b8887876040518563ffffffff1660e01b8152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561244757808201518184015260208101905061242c565b50505050905090810190601f1680156124745780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b15801561249657600080fd5b505af11580156124aa573d6000803e3d6000fd5b505050506040513d60208110156124c057600080fd5b8101908080519060200190929190505050905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff166002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146125e25760006002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b6125fd6001826000015461261e90919063ffffffff16565b816000018190555050565b6001816000016000828254019250508190555050565b600061266083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612ba2565b905092915050565b606082600143031015801561267d5750838310155b6126d2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180612f1d6023913960400191505060405180910390fd5b60606002858503016040519080825280602002602001820160405280156127085781602001602082028038833980820191505090505b50905060004384604051602001808381526020018281526020019250505060405160208183030381529060405280519060200120905060008090505b86860381116127a757808701408260405160200180838152602001828152602001925050506040516020818303038152906040528051906020012083600183018151811061278e57fe5b6020026020010181815250508080600101915050612744565b5081925050509392505050565b6000600182511161282d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f52616e646f6d2e6e6578743a20696e76616c696420706f6f6c0000000000000081525060200191505060405180910390fd5b60006001808451038460008151811061284257fe5b602002602001015160001c8161285457fe5b06019050600083828151811061286657fe5b6020026020010151604051602001808281526020019150506040516020818303038152906040528051906020012090506001846000815181106128a557fe5b602002602001015160001c0160001b846000815181106128c157fe5b602002602001018181525050808483815181106128da57fe5b6020026020010181815250508060001c92505050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612996576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4552433732313a206d696e7420746f20746865207a65726f206164647265737381525060200191505060405180910390fd5b61299f816117f6565b15612a12576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000081525060200191505060405180910390fd5b816001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550612aab600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612608565b808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6007805490506008600083815260200190815260200160002081905550600781908060018154018082558091505090600182039060005260206000200160009091929091909150555050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91506000801b8214158015612b995750808214155b92505050919050565b6000838311158290612c4f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612c14578082015181840152602081019050612bf9565b50505050905090810190601f168015612c415780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b815481835581811115612c8957818360005260206000209182019101612c889190612c8e565b5b505050565b612cb091905b80821115612cac576000816000905550600101612c94565b5090565b9056fe68747470733a2f2f436861696e536372617065332e64616d6f313838342e7265706c2e636f2f6170692f6d696e743f69643d455243373231456e756d657261626c653a206f776e657220696e646578206f7574206f6620626f756e64734552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a207472616e7366657220746f20746865207a65726f20616464726573734552433732313a206f70657261746f7220717565727920666f72206e6f6e6578697374656e7420746f6b656e43727970746f4d6f727068204d696e742073616c652068617320636f6d706c657465642e205468657920617265206e6f77206f6e6c7920617661696c61626c65206f6e20746865207365636f6e64617279206d61726b65742e204552433732313a20617070726f76652063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f76656420666f7220616c6c4552433732313a2062616c616e636520717565727920666f7220746865207a65726f20616464726573734552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a20617070726f76656420717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a207472616e73666572206f6620746f6b656e2074686174206973206e6f74206f776e4552433732314d657461646174613a2055524920717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a20617070726f76616c20746f2063757272656e74206f776e657252616e646f6d2e696e69743a20696e76616c696420626c6f636b20696e74657276616c4552433732313a207472616e736665722063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564455243373231456e756d657261626c653a20676c6f62616c20696e646578206f7574206f6620626f756e6473a265627a7a7231582008f136ce19f5b4be41bf20153b5afdb21e94f3f333f134bacc20f6ea28d84b1064736f6c63430005100032

Deployed Bytecode

0x60806040526004361061011f5760003560e01c80635cdf141b116100a0578063b2895b7311610064578063b2895b7314610701578063b88d4fde14610750578063c87b56dd14610862578063e985e9c514610916578063f31196821461099f5761011f565b80635cdf141b146105065780636352211e1461053457806370a08231146105af57806395d89b4114610614578063a22cb465146106a45761011f565b806323b872dd116100e757806323b872dd146103275780632f745c59146103a257806342842e0e146104115780634f6ccce71461048c57806356c7627e146104db5761011f565b806301ffc9a71461012457806306fdde0314610196578063081812fc14610226578063095ea7b3146102a157806318160ddd146102fc575b600080fd5b34801561013057600080fd5b5061017c6004803603602081101561014757600080fd5b8101908080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690602001909291905050506109ee565b604051808215151515815260200191505060405180910390f35b3480156101a257600080fd5b506101ab610a55565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156101eb5780820151818401526020810190506101d0565b50505050905090810190601f1680156102185780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561023257600080fd5b5061025f6004803603602081101561024957600080fd5b8101908080359060200190929190505050610af7565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156102ad57600080fd5b506102fa600480360360408110156102c457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610b92565b005b34801561030857600080fd5b50610311610d79565b6040518082815260200191505060405180910390f35b34801561033357600080fd5b506103a06004803603606081101561034a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610d86565b005b3480156103ae57600080fd5b506103fb600480360360408110156103c557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610dfc565b6040518082815260200191505060405180910390f35b34801561041d57600080fd5b5061048a6004803603606081101561043457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610ebb565b005b34801561049857600080fd5b506104c5600480360360208110156104af57600080fd5b8101908080359060200190929190505050610edb565b6040518082815260200191505060405180910390f35b3480156104e757600080fd5b506104f0610f5b565b6040518082815260200191505060405180910390f35b6105326004803603602081101561051c57600080fd5b8101908080359060200190929190505050610f61565b005b34801561054057600080fd5b5061056d6004803603602081101561055757600080fd5b81019080803590602001909291905050506111d4565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156105bb57600080fd5b506105fe600480360360208110156105d257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061129c565b6040518082815260200191505060405180910390f35b34801561062057600080fd5b50610629611371565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561066957808201518184015260208101905061064e565b50505050905090810190601f1680156106965780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156106b057600080fd5b506106ff600480360360408110156106c757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050611413565b005b34801561070d57600080fd5b5061073a6004803603602081101561072457600080fd5b81019080803590602001909291905050506115cb565b6040518082815260200191505060405180910390f35b34801561075c57600080fd5b506108606004803603608081101561077357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156107da57600080fd5b8201836020820111156107ec57600080fd5b8035906020019184600183028401116401000000008311171561080e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506115e8565b005b34801561086e57600080fd5b5061089b6004803603602081101561088557600080fd5b8101908080359060200190929190505050611660565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156108db5780820151818401526020810190506108c0565b50505050905090810190601f1680156109085780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561092257600080fd5b506109856004803603604081101561093957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611745565b604051808215151515815260200191505060405180910390f35b3480156109ab57600080fd5b506109d8600480360360208110156109c257600080fd5b81019080803590602001909291905050506117d9565b6040518082815260200191505060405180910390f35b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060098054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610aed5780601f10610ac257610100808354040283529160200191610aed565b820191906000526020600020905b815481529060010190602001808311610ad057829003601f168201915b5050505050905090565b6000610b02826117f6565b610b57576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180612e78602c913960400191505060405180910390fd5b6002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b9d826111d4565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180612efc6021913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c43611868565b73ffffffffffffffffffffffffffffffffffffffff161480610c725750610c7181610c6c611868565b611745565b5b610cc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526038815260200180612ded6038913960400191505060405180910390fd5b826002600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000600780549050905090565b610d97610d91611868565b82611870565b610dec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526031815260200180612f406031913960400191505060405180910390fd5b610df7838383611964565b505050565b6000610e078361129c565b8210610e5e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180612ce6602b913960400191505060405180910390fd5b600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110610ea857fe5b9060005260206000200154905092915050565b610ed6838383604051806020016040528060008152506115e8565b505050565b6000610ee5610d79565b8210610f3c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180612f71602c913960400191505060405180910390fd5b60078281548110610f4957fe5b90600052602060002001549050919050565b61270f81565b6103e8610f6c610d79565b1015610f8a57661550f7dca700003414610f8557600080fd5b6110ee565b6107d0610f95610d79565b1015610fb357661c6bf5263400003414610fae57600080fd5b6110ed565b610bb8610fbe610d79565b1015610fdc57662386f26fc100003414610fd757600080fd5b6110ec565b610fa0610fe7610d79565b10156110055766354a6ba7a18000341461100057600080fd5b6110eb565b611388611010610d79565b101561102e5766470de4df820000341461102957600080fd5b6110ea565b611770611039610d79565b1015611057576658d15e17628000341461105257600080fd5b6110e9565b611b58611062610d79565b101561108057666a94d74f430000341461107b57600080fd5b6110e8565b611f4061108b610d79565b10156110a957667c58508723800034146110a457600080fd5b6110e7565b6123286110b4610d79565b10156110d257668e1bc9bf04000034146110cd57600080fd5b6110e6565b669fdf42f6e4800034146110e557600080fd5b5b5b5b5b5b5b5b5b5b61270f6110f9610d79565b1115611150576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252605a815260200180612d93605a913960600191505060405180910390fd5b73aa02859173c1f351ffb4f015a98fa66200d9568773ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f193505050501580156111aa573d6000803e3d6000fd5b5060006111b682611988565b905060006111c383611ae5565b90506111cf8183611baa565b505050565b6000806001600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611293576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180612e4f6029913960400191505060405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611323576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180612e25602a913960400191505060405180910390fd5b61136a600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611bf5565b9050919050565b6060600a8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114095780601f106113de57610100808354040283529160200191611409565b820191906000526020600020905b8154815290600101906020018083116113ec57829003601f168201915b5050505050905090565b61141b611868565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f4552433732313a20617070726f766520746f2063616c6c65720000000000000081525060200191505060405180910390fd5b80600460006114c9611868565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611576611868565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051808215151515815260200191505060405180910390a35050565b6000600c6000838152602001908152602001600020549050919050565b6115f96115f3611868565b83611870565b61164e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526031815260200180612f406031913960400191505060405180910390fd5b61165a84848484611c03565b50505050565b606061166b826117f6565b6116c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180612ecd602f913960400191505060405180910390fd5b6116c982611c75565b6040516020018080612cb46032913960320182805190602001908083835b6020831061170a57805182526020820191506020810190506020830392506116e7565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040529050919050565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000600d6000838152602001908152602001600020549050919050565b6000806001600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415915050919050565b600033905090565b600061187b826117f6565b6118d0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180612d67602c913960400191505060405180910390fd5b60006118db836111d4565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061194a57508373ffffffffffffffffffffffffffffffffffffffff1661193284610af7565b73ffffffffffffffffffffffffffffffffffffffff16145b8061195b575061195a8185611745565b5b91505092915050565b61196f838383611da2565b6119798382611ffd565b611983828261219b565b505050565b60006060611997600584612262565b905060006119a982600161271061227c565b9050606481116119bc5760019250611ade565b6101f481116119ce5760029250611add565b6103e881116119e05760039250611adc565b6105dc81116119f25760049250611adb565b6107d08111611a045760059250611ada565b6109c48111611a165760069250611ad9565b610bb88111611a285760079250611ad8565b610dac8111611a3a5760089250611ad7565b610fa08111611a4c5760099250611ad6565b6113888111611a5e57600a9250611ad5565b6117708111611a7057600b9250611ad4565b611b588111611a8257600c9250611ad3565b611f408111611a9457600d9250611ad2565b6123288111611aa657600e9250611ad1565b61251c8111611ab857600f9250611ad0565b6126ac8111611aca5760109250611acf565b600192505b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5050919050565b60006060611af4600484612262565b90506000611b0682600161271061227c565b905060648111611b195760019250611ba3565b6101f48111611b2b5760029250611ba2565b6103e88111611b3d5760039250611ba1565b610bb88111611b4f5760049250611ba0565b611b588111611b615760059250611b9f565b6123288111611b735760069250611b9e565b61251c8111611b855760079250611b9d565b6126ac8111611b975760089250611b9c565b600192505b5b5b5b5b5b5b5b5050919050565b6000611bb4610d79565b905081600c60008381526020019081526020016000208190555082600d600083815260200190815260200160002081905550611bf03382612316565b505050565b600081600001549050919050565b611c0e848484611964565b611c1a84848484612337565b611c6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180612d116032913960400191505060405180910390fd5b50505050565b60606000821415611cbd576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611d9d565b600082905060005b60008214611ce7578080600101915050600a8281611cdf57fe5b049150611cc5565b6060816040519080825280601f01601f191660200182016040528015611d1c5781602001600182028038833980820191505090505b50905060006001830390505b60008614611d9557600a8681611d3a57fe5b0660300160f81b82828060019003935081518110611d5457fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8681611d8d57fe5b049550611d28565b819450505050505b919050565b8273ffffffffffffffffffffffffffffffffffffffff16611dc2826111d4565b73ffffffffffffffffffffffffffffffffffffffff1614611e2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180612ea46029913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611eb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180612d436024913960400191505060405180910390fd5b611ebd81612527565b611f04600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206125e5565b611f4b600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612608565b816001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006120556001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905061261e90919063ffffffff16565b9050600060066000848152602001908152602001600020549050818114612142576000600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083815481106120c257fe5b9060005260206000200154905080600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020838154811061211a57fe5b9060005260206000200181905550816006600083815260200190815260200160002081905550505b600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054809190600190036121949190612c62565b5050505050565b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490506006600083815260200190815260200160002081905550600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190806001815401808255809150509060018203906000526020600020016000909192909190915055505050565b60606122748343036001430384612668565b905092915050565b6000818313156122f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f52616e646f6d2e756e69666f726d3a20696e76616c696420696e74657276616c81525060200191505060405180910390fd5b82600184840301612304866127b4565b8161230b57fe5b060190509392505050565b61232082826128f3565b61232a828261219b565b61233381612b0b565b5050565b60006123588473ffffffffffffffffffffffffffffffffffffffff16612b57565b612365576001905061251f565b60008473ffffffffffffffffffffffffffffffffffffffff1663150b7a0261238b611868565b8887876040518563ffffffff1660e01b8152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561244757808201518184015260208101905061242c565b50505050905090810190601f1680156124745780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b15801561249657600080fd5b505af11580156124aa573d6000803e3d6000fd5b505050506040513d60208110156124c057600080fd5b8101908080519060200190929190505050905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff166002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146125e25760006002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b6125fd6001826000015461261e90919063ffffffff16565b816000018190555050565b6001816000016000828254019250508190555050565b600061266083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612ba2565b905092915050565b606082600143031015801561267d5750838310155b6126d2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180612f1d6023913960400191505060405180910390fd5b60606002858503016040519080825280602002602001820160405280156127085781602001602082028038833980820191505090505b50905060004384604051602001808381526020018281526020019250505060405160208183030381529060405280519060200120905060008090505b86860381116127a757808701408260405160200180838152602001828152602001925050506040516020818303038152906040528051906020012083600183018151811061278e57fe5b6020026020010181815250508080600101915050612744565b5081925050509392505050565b6000600182511161282d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f52616e646f6d2e6e6578743a20696e76616c696420706f6f6c0000000000000081525060200191505060405180910390fd5b60006001808451038460008151811061284257fe5b602002602001015160001c8161285457fe5b06019050600083828151811061286657fe5b6020026020010151604051602001808281526020019150506040516020818303038152906040528051906020012090506001846000815181106128a557fe5b602002602001015160001c0160001b846000815181106128c157fe5b602002602001018181525050808483815181106128da57fe5b6020026020010181815250508060001c92505050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612996576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4552433732313a206d696e7420746f20746865207a65726f206164647265737381525060200191505060405180910390fd5b61299f816117f6565b15612a12576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000081525060200191505060405180910390fd5b816001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550612aab600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612608565b808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6007805490506008600083815260200190815260200160002081905550600781908060018154018082558091505090600182039060005260206000200160009091929091909150555050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91506000801b8214158015612b995750808214155b92505050919050565b6000838311158290612c4f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612c14578082015181840152602081019050612bf9565b50505050905090810190601f168015612c415780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b815481835581811115612c8957818360005260206000209182019101612c889190612c8e565b5b505050565b612cb091905b80821115612cac576000816000905550600101612c94565b5090565b9056fe68747470733a2f2f436861696e536372617065332e64616d6f313838342e7265706c2e636f2f6170692f6d696e743f69643d455243373231456e756d657261626c653a206f776e657220696e646578206f7574206f6620626f756e64734552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a207472616e7366657220746f20746865207a65726f20616464726573734552433732313a206f70657261746f7220717565727920666f72206e6f6e6578697374656e7420746f6b656e43727970746f4d6f727068204d696e742073616c652068617320636f6d706c657465642e205468657920617265206e6f77206f6e6c7920617661696c61626c65206f6e20746865207365636f6e64617279206d61726b65742e204552433732313a20617070726f76652063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f76656420666f7220616c6c4552433732313a2062616c616e636520717565727920666f7220746865207a65726f20616464726573734552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a20617070726f76656420717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a207472616e73666572206f6620746f6b656e2074686174206973206e6f74206f776e4552433732314d657461646174613a2055524920717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a20617070726f76616c20746f2063757272656e74206f776e657252616e646f6d2e696e69743a20696e76616c696420626c6f636b20696e74657276616c4552433732313a207472616e736665722063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564455243373231456e756d657261626c653a20676c6f62616c20696e646578206f7574206f6620626f756e6473a265627a7a7231582008f136ce19f5b4be41bf20153b5afdb21e94f3f333f134bacc20f6ea28d84b1064736f6c63430005100032

Deployed Bytecode Sourcemap

46894:5823:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15869:135;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15869:135:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;15869:135:0;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;42337:85;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42337:85:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;42337:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20730:204;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20730:204:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;20730:204:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;20012:425;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20012:425:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;20012:425:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;34181:96;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34181:96:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;22413:292;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22413:292:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;22413:292:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;33790:232;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33790:232:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;33790:232:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;23367:134;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23367:134:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;23367:134:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;34623:199;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34623:199:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;34623:199:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;50447:38;;8:9:-1;5:2;;;30:1;27;20:12;5:2;50447:38:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;50494:1246;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;50494:1246:0;;;;;;;;;;;;;;;;;:::i;:::-;;19353:228;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19353:228:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;19353:228:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;18916:211;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18916:211:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;18916:211:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;42537:89;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42537:89:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;42537:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21235:254;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21235:254:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;21235:254:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;52490:111;;8:9:-1;5:2;;;30:1;27;20:12;5:2;52490:111:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;52490:111:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;24238:272;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24238:272:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;24238:272:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;24238:272:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;24238:272:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;24238:272:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;24238:272:0;;;;;;;;;;;;;;;:::i;:::-;;52207:275;;8:9:-1;5:2;;;30:1;27;20:12;5:2;52207:275:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;52207:275:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;52207:275:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21819:147;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21819:147:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;21819:147:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;52609:105;;8:9:-1;5:2;;;30:1;27;20:12;5:2;52609:105:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;52609:105:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;15869:135;15939:4;15963:20;:33;15984:11;15963:33;;;;;;;;;;;;;;;;;;;;;;;;;;;15956:40;;15869:135;;;:::o;42337:85::-;42376:13;42409:5;42402:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42337:85;:::o;20730:204::-;20789:7;20817:16;20825:7;20817;:16::i;:::-;20809:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20902:15;:24;20918:7;20902:24;;;;;;;;;;;;;;;;;;;;;20895:31;;20730:204;;;:::o;20012:425::-;20076:13;20092:16;20100:7;20092;:16::i;:::-;20076:32;;20133:5;20127:11;;:2;:11;;;;20119:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20213:5;20197:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;20222:37;20239:5;20246:12;:10;:12::i;:::-;20222:16;:37::i;:::-;20197:62;20189:154;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20383:2;20356:15;:24;20372:7;20356:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;20421:7;20417:2;20401:28;;20410:5;20401:28;;;;;;;;;;;;20012:425;;;:::o;34181:96::-;34225:7;34252:10;:17;;;;34245:24;;34181:96;:::o;22413:292::-;22557:41;22576:12;:10;:12::i;:::-;22590:7;22557:18;:41::i;:::-;22549:103;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22665:32;22679:4;22685:2;22689:7;22665:13;:32::i;:::-;22413:292;;;:::o;33790:232::-;33870:7;33906:16;33916:5;33906:9;:16::i;:::-;33898:5;:24;33890:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33988:12;:19;34001:5;33988:19;;;;;;;;;;;;;;;34008:5;33988:26;;;;;;;;;;;;;;;;33981:33;;33790:232;;;;:::o;23367:134::-;23454:39;23471:4;23477:2;23481:7;23454:39;;;;;;;;;;;;:16;:39::i;:::-;23367:134;;;:::o;34623:199::-;34681:7;34717:13;:11;:13::i;:::-;34709:5;:21;34701:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34797:10;34808:5;34797:17;;;;;;;;;;;;;;;;34790:24;;34623:199;;;:::o;50447:38::-;50481:4;50447:38;:::o;50494:1246::-;50581:4;50565:13;:11;:13::i;:::-;:20;50561:806;;;50619:8;50606:9;:21;50598:30;;;;;;50561:806;;;50664:4;50648:13;:11;:13::i;:::-;:20;50644:723;;;50702:8;50689:9;:21;50681:30;;;;;;50644:723;;;50747:4;50731:13;:11;:13::i;:::-;:20;50727:640;;;50785:9;50772;:22;50764:31;;;;;;50727:640;;;50831:4;50815:13;:11;:13::i;:::-;:20;50811:556;;;50869:9;50856;:22;50848:31;;;;;;50811:556;;;50915:4;50899:13;:11;:13::i;:::-;:20;50895:472;;;50953:9;50940;:22;50932:31;;;;;;50895:472;;;50999:4;50983:13;:11;:13::i;:::-;:20;50979:388;;;51037:9;51024;:22;51016:31;;;;;;50979:388;;;51083:4;51067:13;:11;:13::i;:::-;:20;51063:304;;;51121:9;51108;:22;51100:31;;;;;;51063:304;;;51167:4;51151:13;:11;:13::i;:::-;:20;51147:220;;;51205:9;51192;:22;51184:31;;;;;;51147:220;;;51251:4;51235:13;:11;:13::i;:::-;:20;51231:136;;;51289:9;51276;:22;51268:31;;;;;;51231:136;;;51347:9;51334;:22;51326:31;;;;;;51231:136;51147:220;51063:304;50979:388;50895:472;50811:556;50727:640;50644:723;50561:806;50481:4;51385:13;:11;:13::i;:::-;:27;;51377:130;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51526:42;51518:60;;:71;51579:9;51518:71;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51518:71:0;51600:16;51619:23;51637:4;51619:17;:23::i;:::-;51600:42;;51651:14;51668:21;51684:4;51668:15;:21::i;:::-;51651:38;;51700:32;51715:6;51723:8;51700:14;:32::i;:::-;50494:1246;;;:::o;19353:228::-;19408:7;19428:13;19444:11;:20;19456:7;19444:20;;;;;;;;;;;;;;;;;;;;;19428:36;;19500:1;19483:19;;:5;:19;;;;19475:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19568:5;19561:12;;;19353:228;;;:::o;18916:211::-;18971:7;19016:1;18999:19;;:5;:19;;;;18991:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19085:34;:17;:24;19103:5;19085:24;;;;;;;;;;;;;;;:32;:34::i;:::-;19078:41;;18916:211;;;:::o;42537:89::-;42578:13;42611:7;42604:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42537:89;:::o;21235:254::-;21321:12;:10;:12::i;:::-;21315:18;;:2;:18;;;;21307:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21415:8;21376:18;:32;21395:12;:10;:12::i;:::-;21376:32;;;;;;;;;;;;;;;:36;21409:2;21376:36;;;;;;;;;;;;;;;;:47;;;;;;;;;;;;;;;;;;21468:2;21439:42;;21454:12;:10;:12::i;:::-;21439:42;;;21472:8;21439:42;;;;;;;;;;;;;;;;;;;;;;21235:254;;:::o;52490:111::-;52541:16;52577:12;:16;52590:2;52577:16;;;;;;;;;;;;52570:23;;52490:111;;;:::o;24238:272::-;24353:41;24372:12;:10;:12::i;:::-;24386:7;24353:18;:41::i;:::-;24345:103;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24459:43;24477:4;24483:2;24487:7;24496:5;24459:17;:43::i;:::-;24238:272;;;;:::o;52207:275::-;52260:13;52294:11;52302:2;52294:7;:11::i;:::-;52286:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52453:19;52469:2;52453:15;:19::i;:::-;52382:91;;;;;;;;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;52382:91:0;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;52382:91:0;;;52368:106;;52207:275;;;:::o;21819:147::-;21899:4;21923:18;:25;21942:5;21923:25;;;;;;;;;;;;;;;:35;21949:8;21923:35;;;;;;;;;;;;;;;;;;;;;;;;;21916:42;;21819:147;;;;:::o;52609:105::-;52658:14;52692:10;:14;52703:2;52692:14;;;;;;;;;;;;52685:21;;52609:105;;;:::o;25703:155::-;25760:4;25777:13;25793:11;:20;25805:7;25793:20;;;;;;;;;;;;;;;;;;;;;25777:36;;25848:1;25831:19;;:5;:19;;;;25824:26;;;25703:155;;;:::o;885:98::-;930:15;965:10;958:17;;885:98;:::o;26228:333::-;26313:4;26338:16;26346:7;26338;:16::i;:::-;26330:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26414:13;26430:16;26438:7;26430;:16::i;:::-;26414:32;;26476:5;26465:16;;:7;:16;;;:51;;;;26509:7;26485:31;;:20;26497:7;26485:11;:20::i;:::-;:31;;;26465:51;:87;;;;26520:32;26537:5;26544:7;26520:16;:32::i;:::-;26465:87;26457:96;;;26228:333;;;;:::o;35206:245::-;35292:38;35312:4;35318:2;35322:7;35292:19;:38::i;:::-;35343:47;35376:4;35382:7;35343:32;:47::i;:::-;35403:40;35431:2;35435:7;35403:27;:40::i;:::-;35206:245;;;:::o;48865:1331::-;48929:18;48960:21;48984:26;49002:1;49005:4;48984:17;:26::i;:::-;48960:50;;49021:19;49051:30;49066:4;49072:1;49075:5;49051:14;:30::i;:::-;49021:61;;49112:3;49097:11;:18;49093:1096;;49141:1;49128:14;;49093:1096;;;49177:3;49162:11;:18;49158:1031;;49206:1;49193:14;;49158:1031;;;49242:4;49227:11;:19;49223:966;;49272:1;49259:14;;49223:966;;;49308:4;49293:11;:19;49289:900;;49338:1;49325:14;;49289:900;;;49374:4;49359:11;:19;49355:834;;49404:1;49391:14;;49355:834;;;49440:4;49425:11;:19;49421:768;;49470:1;49457:14;;49421:768;;;49506:4;49491:11;:19;49487:702;;49536:1;49523:14;;49487:702;;;49572:4;49557:11;:19;49553:636;;49602:1;49589:14;;49553:636;;;49638:4;49623:11;:19;49619:570;;49668:1;49655:14;;49619:570;;;49704:4;49689:11;:19;49685:504;;49734:2;49721:15;;49685:504;;;49771:4;49756:11;:19;49752:437;;49801:2;49788:15;;49752:437;;;49838:4;49823:11;:19;49819:370;;49868:2;49855:15;;49819:370;;;49905:4;49890:11;:19;49886:303;;49935:2;49922:15;;49886:303;;;49972:4;49957:11;:19;49953:236;;50002:2;49989:15;;49953:236;;;50039:4;50024:11;:19;50020:169;;50069:2;50056:15;;50020:169;;;50106:4;50091:11;:19;50087:102;;50136:2;50123:15;;50087:102;;;50178:1;50165:14;;50087:102;50020:169;49953:236;49886:303;49819:370;49752:437;49685:504;49619:570;49553:636;49487:702;49421:768;49355:834;49289:900;49223:966;49158:1031;49093:1096;48865:1331;;;;;:::o;48103:754::-;48165:16;48194:21;48218:26;48236:1;48239:4;48218:17;:26::i;:::-;48194:50;;48255:17;48283:30;48298:4;48304:1;48307:5;48283:14;:30::i;:::-;48255:59;;48340:3;48327:9;:16;48323:527;;48367:1;48356:12;;48323:527;;;48401:3;48388:9;:16;48384:466;;48428:1;48417:12;;48384:466;;;48462:4;48449:9;:17;48445:405;;48490:1;48479:12;;48445:405;;;48524:4;48511:9;:17;48507:343;;48552:1;48541:12;;48507:343;;;48586:4;48573:9;:17;48569:281;;48614:1;48603:12;;48569:281;;;48648:4;48635:9;:17;48631:219;;48676:1;48665:12;;48631:219;;;48710:4;48697:9;:17;48693:157;;48738:1;48727:12;;48693:157;;;48772:4;48759:9;:17;48755:95;;48800:1;48789:12;;48755:95;;;48839:1;48828:12;;48755:95;48693:157;48631:219;48569:281;48507:343;48445:405;48384:466;48323:527;48103:754;;;;;:::o;50204:235::-;50281:15;50299:13;:11;:13::i;:::-;50281:31;;50347:8;50323:12;:21;50336:7;50323:21;;;;;;;;;;;:32;;;;50388:6;50366:10;:19;50377:7;50366:19;;;;;;;;;;;:28;;;;50405:26;50411:10;50423:7;50405:5;:26::i;:::-;50204:235;;;:::o;14638:114::-;14703:7;14730;:14;;;14723:21;;14638:114;;;:::o;25229:272::-;25339:32;25353:4;25359:2;25363:7;25339:13;:32::i;:::-;25390:48;25413:4;25419:2;25423:7;25432:5;25390:22;:48::i;:::-;25382:111;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25229:272;;;;:::o;51747:450::-;51811:13;51847:1;51841:2;:7;51837:45;;;51862:10;;;;;;;;;;;;;;;;;;;;;51837:45;51890:6;51899:2;51890:11;;51910:8;51929:61;51941:1;51936;:6;51929:61;;51956:5;;;;;;;51978:2;51973:7;;;;;;;;;51929:61;;;51998:17;52028:3;52018:14;;;;;;;;;;;;;;;;;;;;;;;;;29:1:-1;21:6;17:14;116:4;104:10;96:6;87:34;147:4;139:6;135:17;125:27;;0:156;52018:14:0;;;;51998:34;;52041:6;52056:1;52050:3;:7;52041:16;;52068:95;52081:1;52075:2;:7;52068:95;;52129:2;52124;:7;;;;;;52119:2;:12;52108:25;;52096:4;52101:3;;;;;;;52096:9;;;;;;;;;;;:37;;;;;;;;;;;52151:2;52145:8;;;;;;;;;52068:95;;;52185:4;52171:19;;;;;;51747:450;;;;:::o;29924:459::-;30038:4;30018:24;;:16;30026:7;30018;:16::i;:::-;:24;;;30010:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30121:1;30107:16;;:2;:16;;;;30099:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30177:23;30192:7;30177:14;:23::i;:::-;30213:35;:17;:23;30231:4;30213:23;;;;;;;;;;;;;;;:33;:35::i;:::-;30259:33;:17;:21;30277:2;30259:21;;;;;;;;;;;;;;;:31;:33::i;:::-;30328:2;30305:11;:20;30317:7;30305:20;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;30367:7;30363:2;30348:27;;30357:4;30348:27;;;;;;;;;;;;29924:459;;;:::o;38391:1148::-;38657:22;38682:32;38712:1;38682:12;:18;38695:4;38682:18;;;;;;;;;;;;;;;:25;;;;:29;;:32;;;;:::i;:::-;38657:57;;38725:18;38746:17;:26;38764:7;38746:26;;;;;;;;;;;;38725:47;;38893:14;38879:10;:28;38875:328;;38924:19;38946:12;:18;38959:4;38946:18;;;;;;;;;;;;;;;38965:14;38946:34;;;;;;;;;;;;;;;;38924:56;;39030:11;38997:12;:18;39010:4;38997:18;;;;;;;;;;;;;;;39016:10;38997:30;;;;;;;;;;;;;;;:44;;;;39147:10;39114:17;:30;39132:11;39114:30;;;;;;;;;;;:43;;;;38875:328;;39292:12;:18;39305:4;39292:18;;;;;;;;;;;;;;;:27;;;;;;;;;;;;:::i;:::-;;38391:1148;;;;:::o;37213:186::-;37327:12;:16;37340:2;37327:16;;;;;;;;;;;;;;;:23;;;;37298:17;:26;37316:7;37298:26;;;;;;;;;;;:52;;;;37361:12;:16;37374:2;37361:16;;;;;;;;;;;;;;;37383:7;37361:30;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;37361:30:0;;;;;;;;;;;;;;;;;;;;;;37213:186;;:::o;45890:158::-;45960:16;45996:44;46014:3;46001:12;:16;46032:1;46019:12;:14;46035:4;45996;:44::i;:::-;45989:51;;45890:158;;;;:::o;46671:214::-;46754:6;46786:1;46781;:6;;46773:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46876:1;46872;46870;46868;:3;:5;46849:10;46854:4;46849;:10::i;:::-;:25;;;;;;46842:35;46835:42;;46671:214;;;;;:::o;35716:202::-;35780:24;35792:2;35796:7;35780:11;:24::i;:::-;35817:40;35845:2;35849:7;35817:27;:40::i;:::-;35870;35902:7;35870:31;:40::i;:::-;35716:202;;:::o;30985:358::-;31107:4;31134:15;:2;:13;;;:15::i;:::-;31129:60;;31173:4;31166:11;;;;31129:60;31201:13;31233:2;31217:36;;;31254:12;:10;:12::i;:::-;31268:4;31274:7;31283:5;31217:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;31217:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31217:72:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31217:72:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;31217:72:0;;;;;;;;;;;;;;;;31201:88;;17117:10;31318:16;;31308:26;;;:6;:26;;;;31300:35;;;30985:358;;;;;;;:::o;31511:175::-;31611:1;31575:38;;:15;:24;31591:7;31575:24;;;;;;;;;;;;;;;;;;;;;:38;;;31571:108;;31665:1;31630:15;:24;31646:7;31630:24;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;31571:108;31511:175;:::o;14859:110::-;14940:21;14959:1;14940:7;:14;;;:18;;:21;;;;:::i;:::-;14923:7;:14;;:38;;;;14859:110;:::o;14760:91::-;14842:1;14824:7;:14;;;:19;;;;;;;;;;;14760:91;:::o;6412:136::-;6470:7;6497:43;6501:1;6504;6497:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;6490:50;;6412:136;;;;:::o;45071:737::-;45166:16;45221:11;45216:1;45203:12;:14;:29;;:61;;;;;45251:13;45236:11;:28;;45203:61;45195:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45315:21;45379:1;45365:13;45353:11;:25;:27;45339:42;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;45339:42:0;;;;45315:66;;45392:12;45434;45447:4;45417:35;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;45417:35:0;;;45407:46;;;;;;45392:61;;45468:9;45480:1;45468:13;;45464:315;45500:13;45488:11;:25;45483:1;:30;45464:315;;45758:1;45744:13;:15;45734:26;45761:4;45717:49;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;45717::0;;;45707:60;;;;;;45695:4;45702:1;45700;:3;45695:9;;;;;;;;;;;;;:72;;;;;45515:3;;;;;;;45464:315;;;;45796:4;45789:11;;;;45071:737;;;;;:::o;46151:404::-;46211:7;46253:1;46239:4;:11;:15;46231:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46295:21;46356:1;46351;46339:4;:11;:13;46327:4;46332:1;46327:7;;;;;;;;;;;;;;46319:16;;:34;;;;;;:38;46295:62;;46368:12;46410:4;46415:13;46410:19;;;;;;;;;;;;;;46393:37;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;46393:37:0;;;46383:48;;;;;;46368:63;;46477:1;46468:4;46473:1;46468:7;;;;;;;;;;;;;;46460:16;;:18;46452:27;;46442:4;46447:1;46442:7;;;;;;;;;;;;;:37;;;;;46512:4;46490;46495:13;46490:19;;;;;;;;;;;;;:26;;;;;46542:4;46534:13;;46527:20;;;;46151:404;;;:::o;28313:335::-;28399:1;28385:16;;:2;:16;;;;28377:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28458:16;28466:7;28458;:16::i;:::-;28457:17;28449:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28543:2;28520:11;:20;28532:7;28520:20;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;28556:33;:17;:21;28574:2;28556:21;;;;;;;;;;;;;;;:31;:33::i;:::-;28632:7;28628:2;28607:33;;28624:1;28607:33;;;;;;;;;;;;28313:335;;:::o;37600:164::-;37704:10;:17;;;;37677:15;:24;37693:7;37677:24;;;;;;;;;;;:44;;;;37732:10;37748:7;37732:24;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;37732:24:0;;;;;;;;;;;;;;;;;;;;;;37600:164;:::o;11100:810::-;11160:4;11613:16;11640:19;11662:66;11640:88;;;;11831:7;11819:20;11807:32;;11871:3;11859:15;;:8;:15;;:42;;;;;11890:11;11878:8;:23;;11859:42;11851:51;;;;11100:810;;;:::o;6885:192::-;6971:7;7004:1;6999;:6;;7007:12;6991:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;6991:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7031:9;7047:1;7043;:5;7031:17;;7068:1;7061:8;;;6885:192;;;;;:::o;46894:5823::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

bzzr://08f136ce19f5b4be41bf20153b5afdb21e94f3f333f134bacc20f6ea28d84b10
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.