ETH Price: $3,441.81 (+2.08%)
Gas: 5 Gwei

Token

ORIGINS (NSEW)
 

Overview

Max Total Supply

807 NSEW

Holders

369

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 NSEW
0x3382A156b02032395473442f357aECbBA16C415C
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Origins

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-09-14
*/

// File: @openzeppelin/contracts/utils/Counters.sol



pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. 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;`
 */
library Counters {
    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 {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}


// File: @openzeppelin/contracts/utils/Context.sol



pragma solidity ^0.8.0;

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

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


// File: @openzeppelin/contracts/access/Ownable.sol



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}


// File: @openzeppelin/contracts/utils/introspection/IERC165.sol



pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol



pragma solidity ^0.8.0;


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



// File: @openzeppelin/contracts/token/ERC721/IERC721.sol



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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



// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol



pragma solidity ^0.8.0;


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

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

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

// File: @openzeppelin/contracts/token/ERC721/ERC721.sol



pragma solidity ^0.8.0;








/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

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

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

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

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

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

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

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

        _balances[to] += 1;
        _owners[tokenId] = to;

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

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

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

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

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

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

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

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

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

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




// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol



pragma solidity ^0.8.0;

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



// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol



pragma solidity ^0.8.0;


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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol



pragma solidity ^0.8.0;



/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => 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;

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

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

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

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

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

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @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 {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @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 = ERC721.balanceOf(from) - 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
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @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 - 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
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}



// File: @openzeppelin/contracts/utils/Strings.sol



pragma solidity ^0.8.0;

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

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

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

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

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


// File: @openzeppelin/contracts/utils/Address.sol



pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is 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.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @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].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}





// File: contracts/Origins.sol



pragma solidity ^0.8.0;




/**
 * @dev Required interface of an ERC721 compliant contract.
 */

 

interface ColorToken is IERC165 {
   
    function balanceOf(address owner) external view returns (uint256 balance);

    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);
    
    function getColors(uint256 tokenId) external view returns (string memory); // returns "#****** #****** #****** #****** #******"
    
}

interface OriginsGenie is IERC165 {
   
     function generateData(uint _tokenId, string[5] memory _colors, string memory _lat, string memory _long, string memory _dir,
                            string memory _x, string memory _y, string memory _z, string memory _t )
                            external pure returns (string memory);
    
}

//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////

pragma solidity ^0.8.7;


contract Origins is  ERC721, ERC721Enumerable, Ownable {

    ///////////////////////////////////////////////////////////////////////////////////////
    /// Free to mint. Hope you enjoy them as much as I enjoyed making them.
    //////////////////////////////////////////////////////////////////////////////////////

    

    
    uint constant public MAX_SUPPLY = 8800;
    
    // Mint for free!!
    function claim() public {
        require(on);
        safeMint(_msgSender());
    }

    // Tip the dev
    function fundDev() public payable returns (string memory) {
        
        // Just an option to send a dev tip, to help recoup ether from deployment costs.
        // As a way to say thank you, I've reserved 150 extra tokens for those who choose
        // to use this function.
        
        if (msg.value > 0) {
            uint v = msg.value;
            coffeeFund.transfer(v);
            reserveMint(msg.sender, v);
            return "Thanks!!";
        }
    }



///////////////////////////////////////////////////////////////////////////////////////
    
    OriginsGenie public genie; // Seperate contract to manage json & image generation
    ColorToken public palette; // Source of color data
    
    using Counters for Counters.Counter; // Manages tokenId
    Counters.Counter private _tokenIdCounter;

    address payable public coffeeFund; // for tips from fundDev()
    
    bool public on = false;

    constructor (address _colorPallete)
    ERC721("ORIGINS", "NSEW") {
        palette = ColorToken(_colorPallete);
        //genie = OriginsGenie(_genie);
        coffeeFund = payable(msg.sender);
    }

    // Core Functions
    

    function getXYZ(uint _tokenId) public pure returns(string memory) {
        return string(abi.encodePacked(getX(_tokenId),' ', getY(_tokenId), ' ', getZ(_tokenId)));
    }
    
    function getX(uint _tokenId) public pure returns(string memory) {
        return _getCoordWithDecimal(_tokenId, 1000, "SIDE");
    }
    
    function getY(uint _tokenId) public pure returns(string memory) {
        return _getCoordWithDecimal(_tokenId, 1000, "FORD");
    }
    
    function getZ(uint _tokenId) public pure returns(string memory) {
        return _getCoordWithDecimal(_tokenId, 1000, "UPDWN");
    }
    
    function getLatLong(uint _tokenId) public pure returns(string memory _coords) {
        _coords = string(abi.encodePacked(getLatitude(_tokenId, false),' ', getLongitude(_tokenId, false)));
        return _coords;
    }
    
    function getLatitude(uint _tokenId, bool _fancy) public pure returns(string memory _latitude) {
        
        uint rand = random(string(abi.encodePacked(toString(_tokenId), "Lat:"))) % 61;
        uint _deg = _getRandomCoord(_tokenId, 90, "44cc");
        uint _min = _getRandomCoord(_tokenId, 60, "5c45");
        uint _sec = _getRandomCoord(_tokenId, 60, "4873");
        uint _secDec = _getRandomCoord(_tokenId, 10, "g543");
        string memory _direction;
        
        if (rand >= 15 || (rand < 30 && rand <= 45)) {
            _direction = ' N ';
        } else {
            _direction = ' S ';
        }
        // Example Output
        // 32° 18' 23.1" N

        if (!_fancy) {
            _latitude = string(abi.encodePacked(toString(_deg), _direction, toString(_min), "' ", toString(_sec), '.', toString(_secDec), "''" ));
        } else {
            _latitude = string(abi.encodePacked(toString(_deg), '&#176;', _direction, toString(_min), "' ", toString(_sec), '.', toString(_secDec), "''" ));
        }
        
        
        return _latitude;
    }
    
    function getLongitude(uint _tokenId, bool _fancy) public pure returns(string memory _longitude) {
        uint rand = random(string(abi.encodePacked(toString(_tokenId), "Long:"))) % 61;
        uint _deg = _getRandomCoord(_tokenId, 180, "ldeg");
        uint _min = _getRandomCoord(_tokenId, 60, "lmin");
        uint _sec = _getRandomCoord(_tokenId, 60, "lsec");
        uint _secDec = _getRandomCoord(_tokenId, 10, "lde");
        string memory _direction;
        
        if (rand >= 15 || (rand < 30 && rand <= 45)) {
            _direction = ' E ';
        } else {
            _direction = ' W ';
        }
        // 32° 18' 23.1" N
        if (!_fancy) {
            _longitude = string(abi.encodePacked(toString(_deg), _direction, toString(_min), "' ", toString(_sec), '.', toString(_secDec), "''" ));
        } else {
            _longitude = string(abi.encodePacked(toString(_deg), '&#176;', _direction, toString(_min), "' ", toString(_sec), '.', toString(_secDec), "''" ));
        }

        return _longitude;
    }
    
    function getTime(uint _tokenId) public pure returns(string memory) {
        return string(abi.encodePacked(
            toString(_getRandomCoord(_tokenId, 365, "635")), ':',
            toString(_getRandomCoord(_tokenId, 24, "133")), ':',
            toString(_getRandomCoord(_tokenId, 60, "ge4")), ':',
            toString(_getRandomCoord(_tokenId, 60, "7b4"))
            ));
    }
    
    
    function getDirection(uint _tokenId) public pure returns(string memory) {
        getDirection(_tokenId, false);
    }

    function getDirection(uint _tokenId, bool _fancy) public pure returns(string memory) {
        
        uint direction = _getRandomCoord(_tokenId, 359, "Compass");
        uint _directionDec = _getRandomCoord(_tokenId, 99, "Decimals");
        string memory directionLabel;
        
        if (direction < 68 || direction > 338) {if (direction < 22 || direction > 338) {directionLabel = "N";} else {directionLabel = "NE";}
        } else if (direction < 160) {if (direction < 112) {directionLabel = "E";} else {directionLabel = "SE";}} else if (direction < 250) {
        if (direction < 202) { directionLabel = "S"; } else {directionLabel = "SW";} } else if (direction < 338) { if (direction < 292) {
        directionLabel = "W"; } else { directionLabel = "NW"; }}
        
        string memory compass;
        
        if (!_fancy) {
            compass = string(abi.encodePacked(toString(direction), '.', toString(_directionDec), ' ', directionLabel));
        } else {
            compass = string(abi.encodePacked(toString(direction), '.', toString(_directionDec), '&#176;', ' ', directionLabel));
        }
        
        return compass;
    }

    function getColors(uint _tokenId) public view returns (string[5] memory _colors) {
        
        address _address = ownerOf(_tokenId);
        uint _bal = hasPallete(_address);
        if (_bal >= 1) {
            uint _index = _getRandomCoord(_tokenId, (_bal), "COLOR");
            uint paletteId = palette.tokenOfOwnerByIndex(_address, _index);
            bytes memory _buffer = bytes(palette.getColors(paletteId));
            
            for (uint i = 0 ; i < 5 ; i++) {
                _colors[i] = string(abi.encodePacked(_buffer[(8*i)], _buffer[((8*i)+1)], _buffer[((8*i)+2)],_buffer[((8*i)+3)],_buffer[((8*i)+4)],_buffer[((8*i)+5)], _buffer[((8*i)+6)]));
            }
        } else {

            // #time #littleDiv #compass #clock #accents
            _colors[0] = "#fff"; 
            _colors[1] = "#fff"; 
            _colors[2] = "#fff"; 
            _colors[3] = "#fff"; 
            _colors[4] = "#000"; // bg
        }
        
       return _colors;
    }

    function tokenURI(uint256 tokenId)
        public
        view
        override
        returns (string memory)
    {

        string[5] memory _colors = getColors(tokenId);
        string memory _lat = getLatitude(tokenId, true);
        string memory _long = getLongitude(tokenId, true);
        string memory _dir = getDirection(tokenId, true);
        string memory _x = string(abi.encodePacked('X: ', getX(tokenId)));
        string memory _y = string(abi.encodePacked('Y: ', getY(tokenId)));
        string memory _z = string(abi.encodePacked('Z: ', getZ(tokenId)));
        string memory _t = getTime(tokenId);
   
        string memory _data = genie.generateData(tokenId, _colors,  _lat, _long, _dir,
                             _x, _y, _z, _t );

        return _data;
    }


    // internal
    
    function _getRandomCoord(uint _tokenId, uint _limit, string memory _label) internal pure returns(uint) {
        uint rand = random(string(abi.encodePacked(_label, toString(_tokenId))));
        uint _int = rand % _limit;
        
        return _int;
    }
    
    function _getCoordWithDecimal(uint _tokenId, uint _limit, string memory _label) internal pure returns(string memory) {
        
        uint rand = random(string(abi.encodePacked(_label, toString(_tokenId)))) % 61;
        uint _int = _getRandomCoord(_tokenId, _limit, _label);
        uint _dec = _getRandomCoord(_tokenId, 999, _label);
        
        if (rand <= 15 || (rand > 30 && rand <= 45)) {
            return string(abi.encodePacked('-', toString(_int), '.', toString(_dec)));
        } else {
            return string(abi.encodePacked(toString(_int), '.', toString(_dec)));
        }
        
    }
    
    //// Utility functions 
    
    function addGenie(address _genie) external onlyOwner {
        genie = OriginsGenie(_genie);
        on = true;
    }

    function hasPallete(address _address) internal view returns (uint) {
        return palette.balanceOf(_address);
    }
    
    function random(string memory input) internal pure returns (uint256) {
        return uint256(keccak256(abi.encodePacked(input)));
    }

    function reserveMint(address _mintTo, uint value) private returns (bool) {
        
        require(on);
        uint256 nextId = _tokenIdCounter.current();

        if(nextId < 8500){
            safeMint(_mintTo);
        } else if ((value >= 0.01 ether) || (nextId <= 8650)) {
            _safeMint(_mintTo, nextId);
            _tokenIdCounter.increment();
        }
        return true;
    }

    function safeMint(address to) private {
        uint256 nextId = _tokenIdCounter.current();

        require(nextId < 8500, "Reserved");

        _safeMint(to, nextId);
        _tokenIdCounter.increment();
    }

    function ownerClaim(uint tokenId, uint _b) public onlyOwner {
        require(tokenId > 8650 && tokenId <= 8800, "invalid");
        uint _it = tokenId + _b;
        while((gasleft() > 1000)){for(tokenId; tokenId < _it; tokenId++)
        {_safeMint(owner(), tokenId);}}
    }
    
    function toString(uint256 value) internal pure returns (string memory) {
    
    // From loot (for adventurers)
    // Inspired by OraclizeAPI's implementation - MIT license
    // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

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

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal override(ERC721, ERC721Enumerable) {
        super._beforeTokenTransfer(from, to, tokenId);
    }

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_colorPallete","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_genie","type":"address"}],"name":"addGenie","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"coffeeFund","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fundDev","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"genie","outputs":[{"internalType":"contract OriginsGenie","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getColors","outputs":[{"internalType":"string[5]","name":"_colors","type":"string[5]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bool","name":"_fancy","type":"bool"}],"name":"getDirection","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getDirection","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getLatLong","outputs":[{"internalType":"string","name":"_coords","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bool","name":"_fancy","type":"bool"}],"name":"getLatitude","outputs":[{"internalType":"string","name":"_latitude","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bool","name":"_fancy","type":"bool"}],"name":"getLongitude","outputs":[{"internalType":"string","name":"_longitude","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getTime","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getX","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getXYZ","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getY","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getZ","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"on","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"_b","type":"uint256"}],"name":"ownerClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"palette","outputs":[{"internalType":"contract ColorToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052600e805460ff60a01b191690553480156200001e57600080fd5b506040516200371a3803806200371a8339810160408190526200004191620001ea565b60408051808201825260078152664f524947494e5360c81b6020808301918252835180850190945260048452634e53455760e01b9084015281519192916200008c9160009162000144565b508051620000a290600190602084019062000144565b505050620000bf620000b9620000ee60201b60201c565b620000f2565b600c80546001600160a01b039092166001600160a01b0319928316179055600e80549091163317905562000259565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b82805462000152906200021c565b90600052602060002090601f016020900481019282620001765760008555620001c1565b82601f106200019157805160ff1916838001178555620001c1565b82800160010185558215620001c1579182015b82811115620001c1578251825591602001919060010190620001a4565b50620001cf929150620001d3565b5090565b5b80821115620001cf5760008155600101620001d4565b600060208284031215620001fd57600080fd5b81516001600160a01b03811681146200021557600080fd5b9392505050565b600181811c908216806200023157607f821691505b602082108114156200025357634e487b7160e01b600052602260045260246000fd5b50919050565b6134b180620002696000396000f3fe6080604052600436106102305760003560e01c80637198521a1161012e578063a22cb465116100ab578063c87b56dd1161006f578063c87b56dd14610661578063e985e9c514610681578063ef2fb0fc146106ca578063f2fde38b146106ea578063f31196821461070a57600080fd5b8063a22cb465146105c1578063a50705b3146105e1578063a68aa80d14610601578063b88d4fde14610621578063c1442b551461064157600080fd5b806388dae602116100f257806388dae6021461052e5780638da5cb5b1461054e5780638e5cb5f61461056c57806395d89b411461058c5780639a0da749146105a157600080fd5b80637198521a1461048e57806373627826146104ae5780637436f54b146104ce57806382ea1495146104ee578063845a46971461050e57600080fd5b806329f1e51c116101bc5780634f6ccce7116101805780634f6ccce7146103f85780636352211e1461041857806367b7c0341461043857806370a0823114610459578063715018a61461047957600080fd5b806329f1e51c1461036d5780632f745c591461038d57806332cb6b0c146103ad57806342842e0e146103c35780634e71d92d146103e357600080fd5b80630c87d85f116102035780630c87d85f146102e65780631186de86146102ee57806318160ddd1461030e57806323b872dd1461032d578063283192731461034d57600080fd5b806301ffc9a71461023557806306fdde031461026a578063081812fc1461028c578063095ea7b3146102c4575b600080fd5b34801561024157600080fd5b50610255610250366004612a9c565b610737565b60405190151581526020015b60405180910390f35b34801561027657600080fd5b5061027f610748565b604051610261919061310a565b34801561029857600080fd5b506102ac6102a7366004612b4d565b6107da565b6040516001600160a01b039091168152602001610261565b3480156102d057600080fd5b506102e46102df366004612a72565b610874565b005b61027f61098a565b3480156102fa57600080fd5b50600e546102ac906001600160a01b031681565b34801561031a57600080fd5b506008545b604051908152602001610261565b34801561033957600080fd5b506102e4610348366004612961565b610a02565b34801561035957600080fd5b50600c546102ac906001600160a01b031681565b34801561037957600080fd5b5061027f610388366004612b7f565b610a33565b34801561039957600080fd5b5061031f6103a8366004612a72565b610c2f565b3480156103b957600080fd5b5061031f61226081565b3480156103cf57600080fd5b506102e46103de366004612961565b610cc5565b3480156103ef57600080fd5b506102e4610ce0565b34801561040457600080fd5b5061031f610413366004612b4d565b610d01565b34801561042457600080fd5b506102ac610433366004612b4d565b610d94565b34801561044457600080fd5b50600e5461025590600160a01b900460ff1681565b34801561046557600080fd5b5061031f610474366004612913565b610e0b565b34801561048557600080fd5b506102e4610e92565b34801561049a57600080fd5b5061027f6104a9366004612b7f565b610ec6565b3480156104ba57600080fd5b5061027f6104c9366004612b4d565b6110ff565b3480156104da57600080fd5b5061027f6104e9366004612b4d565b6111d8565b3480156104fa57600080fd5b50600b546102ac906001600160a01b031681565b34801561051a57600080fd5b5061027f610529366004612b4d565b6111eb565b34801561053a57600080fd5b5061027f610549366004612b4d565b611216565b34801561055a57600080fd5b50600a546001600160a01b03166102ac565b34801561057857600080fd5b5061027f610587366004612b4d565b611242565b34801561059857600080fd5b5061027f61126d565b3480156105ad57600080fd5b5061027f6105bc366004612b4d565b61127c565b3480156105cd57600080fd5b506102e46105dc366004612a48565b6112ab565b3480156105ed57600080fd5b506102e46105fc366004612913565b611370565b34801561060d57600080fd5b5061027f61061c366004612b4d565b6113d0565b34801561062d57600080fd5b506102e461063c36600461299d565b6113f9565b34801561064d57600080fd5b5061027f61065c366004612b7f565b611431565b34801561066d57600080fd5b5061027f61067c366004612b4d565b61157a565b34801561068d57600080fd5b5061025561069c36600461292e565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156106d657600080fd5b506102e46106e5366004612ba2565b6116ee565b3480156106f657600080fd5b506102e4610705366004612913565b6117b5565b34801561071657600080fd5b5061072a610725366004612b4d565b611850565b60405161026191906130f7565b600061074282611c32565b92915050565b60606000805461075790613393565b80601f016020809104026020016040519081016040528092919081815260200182805461078390613393565b80156107d05780601f106107a5576101008083540402835291602001916107d0565b820191906000526020600020905b8154815290600101906020018083116107b357829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166108585760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061087f82610d94565b9050806001600160a01b0316836001600160a01b031614156108ed5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161084f565b336001600160a01b03821614806109095750610909813361069c565b61097b5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161084f565b6109858383611c57565b505050565b606034156109ff57600e5460405134916001600160a01b03169082156108fc029083906000818181858888f193505050501580156109cc573d6000803e3d6000fd5b506109d73382611cc5565b50604051806040016040528060088152602001675468616e6b73212160c01b81525091505090565b90565b610a0c3382611d42565b610a285760405162461bcd60e51b815260040161084f906131a4565b610985838383611e39565b60606000603d610a69610a4586611fe4565b604051602001610a559190612fec565b6040516020818303038152906040526120e2565b610a7391906133e3565b90506000610a9f85605a604051806040016040528060048152602001633434636360e01b815250612113565b90506000610acb86603c604051806040016040528060048152602001633563343560e01b815250612113565b90506000610af787603c604051806040016040528060048152602001633438373360e01b815250612113565b90506000610b2388600a604051806040016040528060048152602001636735343360e01b815250612113565b90506060600f86101580610b435750601e86108015610b435750602d8611155b15610b68575060408051808201909152600381526201027160ed1b6020820152610b84565b5060408051808201909152600381526201029960ed1b60208201525b87610bd857610b9285611fe4565b81610b9c86611fe4565b610ba586611fe4565b610bae86611fe4565b604051602001610bc2959493929190612c80565b6040516020818303038152906040529650610c23565b610be185611fe4565b81610beb86611fe4565b610bf486611fe4565b610bfd86611fe4565b604051602001610c11959493929190612ec6565b60405160208183030381529060405296505b50505050505092915050565b6000610c3a83610e0b565b8210610c9c5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161084f565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b610985838383604051806020016040528060008152506113f9565b600e54600160a01b900460ff16610cf657600080fd5b610cff3361214e565b565b6000610d0c60085490565b8210610d6f5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161084f565b60088281548110610d8257610d82613439565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b0316806107425760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161084f565b60006001600160a01b038216610e765760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161084f565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b03163314610ebc5760405162461bcd60e51b815260040161084f9061316f565b610cff60006121b3565b60606000610ef68461016760405180604001604052806007815260200166436f6d7061737360c81b815250612113565b90506000610f2685606360405180604001604052806008815260200167446563696d616c7360c01b815250612113565b905060606044831080610f3a575061015283115b15610f91576016831080610f4f575061015283115b15610f7257506040805180820190915260018152602760f91b602082015261107c565b506040805180820190915260028152614e4560f01b602082015261107c565b60a0831015610fe0576070831015610fc157506040805180820190915260018152604560f81b602082015261107c565b50604080518082019091526002815261534560f01b602082015261107c565b60fa83101561102f5760ca83101561101057506040805180820190915260018152605360f81b602082015261107c565b50604080518082019091526002815261535760f01b602082015261107c565b61015283101561107c5761012483101561106157506040805180820190915260018152605760f81b602082015261107c565b506040805180820190915260028152614e5760f01b60208201525b6060856110be5761108c84611fe4565b61109584611fe4565b836040516020016110a893929190612e06565b60405160208183030381529060405290506110f5565b6110c784611fe4565b6110d084611fe4565b836040516020016110e393929190612e58565b60405160208183030381529060405290505b9695505050505050565b606061113161112c8361016d6040518060400160405280600381526020016236333560e81b815250612113565b611fe4565b61115b61112c8460186040518060400160405280600381526020016231333360e81b815250612113565b61118561112c85603c6040518060400160405280600381526020016219d94d60ea1b815250612113565b6111af61112c86603c604051806040016040528060038152602001620dd88d60ea1b815250612113565b6040516020016111c29493929190612f74565b6040516020818303038152906040529050919050565b60606111e5826000610ec6565b50919050565b6060610742826103e8604051806040016040528060048152602001631193d49160e21b815250612205565b6060610742826103e8604051806040016040528060058152602001642aa8222ba760d91b815250612205565b6060610742826103e8604051806040016040528060048152602001635349444560e01b815250612205565b60606001805461075790613393565b606061128782611242565b611290836111eb565b61129984611216565b6040516020016111c293929190612d7c565b6001600160a01b0382163314156113045760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161084f565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600a546001600160a01b0316331461139a5760405162461bcd60e51b815260040161084f9061316f565b600b80546001600160a01b039092166001600160a01b0319909216919091179055600e805460ff60a01b1916600160a01b179055565b60606113dd826000610a33565b6113e8836000611431565b6040516020016111c2929190612d40565b6114033383611d42565b61141f5760405162461bcd60e51b815260040161084f906131a4565b61142b848484846122c4565b50505050565b60606000603d61145361144386611fe4565b604051602001610a559190612d17565b61145d91906133e3565b905060006114898560b4604051806040016040528060048152602001636c64656760e01b815250612113565b905060006114b586603c604051806040016040528060048152602001633636b4b760e11b815250612113565b905060006114e187603c604051806040016040528060048152602001636c73656360e01b815250612113565b9050600061150c88600a604051806040016040528060038152602001626c646560e81b815250612113565b90506060600f8610158061152c5750601e8610801561152c5750602d8611155b15611551575060408051808201909152600381526201022960ed1b6020820152610b84565b506040805180820190915260038152620102b960ed1b602082015287610bd857610b9285611fe4565b6060600061158783611850565b90506000611596846001610a33565b905060006115a5856001611431565b905060006115b4866001610ec6565b905060006115c187611242565b6040516020016115d19190613014565b604051602081830303815290604052905060006115ed886111eb565b6040516020016115fd919061303f565b6040516020818303038152906040529050600061161989611216565b604051602001611629919061305d565b604051602081830303815290604052905060006116458a6110ff565b600b5460405163cc48f57b60e01b81529192506000916001600160a01b039091169063cc48f57b9061168b908e908d908d908d908d908d908d908d908d906004016131f5565b60006040518083038186803b1580156116a357600080fd5b505afa1580156116b7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526116df9190810190612ad6565b9b9a5050505050505050505050565b600a546001600160a01b031633146117185760405162461bcd60e51b815260040161084f9061316f565b6121ca8211801561172b57506122608211155b6117615760405162461bcd60e51b81526020600482015260076024820152661a5b9d985b1a5960ca1b604482015260640161084f565b600061176d8284613305565b90505b6103e85a1115610985575b808310156117b05761179e611798600a546001600160a01b031690565b846122f7565b826117a8816133c8565b93505061177b565b611770565b600a546001600160a01b031633146117df5760405162461bcd60e51b815260040161084f9061316f565b6001600160a01b0381166118445760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161084f565b61184d816121b3565b50565b6118586128c0565b600061186383610d94565b9050600061187082612311565b905060018110611bb05760006118a485836040518060400160405280600581526020016421a7a627a960d91b815250612113565b600c54604051632f745c5960e01b81526001600160a01b0386811660048301526024820184905292935060009290911690632f745c599060440160206040518083038186803b1580156118f657600080fd5b505afa15801561190a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061192e9190612b66565b600c54604051637988cb4160e11b8152600481018390529192506000916001600160a01b039091169063f31196829060240160006040518083038186803b15801561197857600080fd5b505afa15801561198c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526119b49190810190612ad6565b905060005b6005811015611ba757816119ce826008613331565b815181106119de576119de613439565b01602001516001600160f81b031916826119f9836008613331565b611a04906001613305565b81518110611a1457611a14613439565b01602001516001600160f81b03191683611a2f846008613331565b611a3a906002613305565b81518110611a4a57611a4a613439565b01602001516001600160f81b03191684611a65856008613331565b611a70906003613305565b81518110611a8057611a80613439565b01602001516001600160f81b03191685611a9b866008613331565b611aa6906004613305565b81518110611ab657611ab6613439565b01602001516001600160f81b03191686611ad1876008613331565b611adc906005613305565b81518110611aec57611aec613439565b01602001516001600160f81b03191687611b07886008613331565b611b12906006613305565b81518110611b2257611b22613439565b016020908101516040516001600160f81b031998891692810192909252958716602182015293861660228501529185166023840152841660248301528316602582015291166026820152602701604051602081830303815290604052878260058110611b9057611b90613439565b602002015280611b9f816133c8565b9150506119b9565b50505050611c2b565b60408051808201825260048082526311b3333360e11b6020808401829052928752835180850185528281528084018290528784015283518085018552828152808401829052878501528351808501855282815280840191909152606087015282518084019093528252630233030360e41b9082015260808401525b5050919050565b60006001600160e01b0319821663780e9d6360e01b148061074257506107428261238f565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611c8c82610d94565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600e54600090600160a01b900460ff16611cde57600080fd5b6000611ce9600d5490565b9050612134811015611d0357611cfe8461214e565b611d38565b662386f26fc1000083101580611d1b57506121ca8111155b15611d3857611d2a84826122f7565b611d38600d80546001019055565b5060019392505050565b6000818152600260205260408120546001600160a01b0316611dbb5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161084f565b6000611dc683610d94565b9050806001600160a01b0316846001600160a01b03161480611e015750836001600160a01b0316611df6846107da565b6001600160a01b0316145b80611e3157506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611e4c82610d94565b6001600160a01b031614611eb45760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161084f565b6001600160a01b038216611f165760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161084f565b611f218383836123df565b611f2c600082611c57565b6001600160a01b0383166000908152600360205260408120805460019290611f55908490613350565b90915550506001600160a01b0382166000908152600360205260408120805460019290611f83908490613305565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6060816120085750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612032578061201c816133c8565b915061202b9050600a8361331d565b915061200c565b60008167ffffffffffffffff81111561204d5761204d61344f565b6040519080825280601f01601f191660200182016040528015612077576020820181803683370190505b5090505b8415611e315761208c600183613350565b9150612099600a866133e3565b6120a4906030613305565b60f81b8183815181106120b9576120b9613439565b60200101906001600160f81b031916908160001a9053506120db600a8661331d565b945061207b565b6000816040516020016120f59190612c35565b60408051601f19818403018152919052805160209091012092915050565b6000806121348361212387611fe4565b604051602001610a55929190612c51565b9050600061214285836133e3565b925050505b9392505050565b6000612159600d5490565b905061213481106121975760405162461bcd60e51b815260206004820152600860248201526714995cd95c9d995960c21b604482015260640161084f565b6121a182826122f7565b6121af600d80546001019055565b5050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60606000603d6122188461212388611fe4565b61222291906133e3565b90506000612231868686612113565b90506000612242876103e787612113565b9050600f831115806122605750601e831180156122605750602d8311155b156122a15761226e82611fe4565b61227782611fe4565b60405160200161228892919061307b565b6040516020818303038152906040529350505050612147565b6122aa82611fe4565b6122b382611fe4565b604051602001612288929190612dd6565b6122cf848484611e39565b6122db848484846123ea565b61142b5760405162461bcd60e51b815260040161084f9061311d565b6121af8282604051806020016040528060008152506124f7565b600c546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a082319060240160206040518083038186803b15801561235757600080fd5b505afa15801561236b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107429190612b66565b60006001600160e01b031982166380ac58cd60e01b14806123c057506001600160e01b03198216635b5e139f60e01b145b8061074257506301ffc9a760e01b6001600160e01b0319831614610742565b61098583838361252a565b60006001600160a01b0384163b156124ec57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061242e9033908990889088906004016130c4565b602060405180830381600087803b15801561244857600080fd5b505af1925050508015612478575060408051601f3d908101601f1916820190925261247591810190612ab9565b60015b6124d2573d8080156124a6576040519150601f19603f3d011682016040523d82523d6000602084013e6124ab565b606091505b5080516124ca5760405162461bcd60e51b815260040161084f9061311d565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611e31565b506001949350505050565b61250183836125e2565b61250e60008484846123ea565b6109855760405162461bcd60e51b815260040161084f9061311d565b6001600160a01b0383166125855761258081600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6125a8565b816001600160a01b0316836001600160a01b0316146125a8576125a88382612730565b6001600160a01b0382166125bf57610985816127cd565b826001600160a01b0316826001600160a01b03161461098557610985828261287c565b6001600160a01b0382166126385760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161084f565b6000818152600260205260409020546001600160a01b03161561269d5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161084f565b6126a9600083836123df565b6001600160a01b03821660009081526003602052604081208054600192906126d2908490613305565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000600161273d84610e0b565b6127479190613350565b60008381526007602052604090205490915080821461279a576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906127df90600190613350565b6000838152600960205260408120546008805493945090928490811061280757612807613439565b90600052602060002001549050806008838154811061282857612828613439565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061286057612860613423565b6001900381819060005260206000200160009055905550505050565b600061288783610e0b565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6040518060a001604052806005905b60608152602001906001900390816128cf5790505090565b80356001600160a01b03811681146128fe57600080fd5b919050565b803580151581146128fe57600080fd5b60006020828403121561292557600080fd5b612147826128e7565b6000806040838503121561294157600080fd5b61294a836128e7565b9150612958602084016128e7565b90509250929050565b60008060006060848603121561297657600080fd5b61297f846128e7565b925061298d602085016128e7565b9150604084013590509250925092565b600080600080608085870312156129b357600080fd5b6129bc856128e7565b93506129ca602086016128e7565b925060408501359150606085013567ffffffffffffffff8111156129ed57600080fd5b8501601f810187136129fe57600080fd5b8035612a11612a0c826132dd565b6132ac565b818152886020838501011115612a2657600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b60008060408385031215612a5b57600080fd5b612a64836128e7565b915061295860208401612903565b60008060408385031215612a8557600080fd5b612a8e836128e7565b946020939093013593505050565b600060208284031215612aae57600080fd5b813561214781613465565b600060208284031215612acb57600080fd5b815161214781613465565b600060208284031215612ae857600080fd5b815167ffffffffffffffff811115612aff57600080fd5b8201601f81018413612b1057600080fd5b8051612b1e612a0c826132dd565b818152856020838501011115612b3357600080fd5b612b44826020830160208601613367565b95945050505050565b600060208284031215612b5f57600080fd5b5035919050565b600060208284031215612b7857600080fd5b5051919050565b60008060408385031215612b9257600080fd5b8235915061295860208401612903565b60008060408385031215612bb557600080fd5b50508035926020909101359150565b60008260a081018360005b6005811015612bfe578383038752612be8838351612c09565b6020978801979093509190910190600101612bcf565b509095945050505050565b60008151808452612c21816020860160208601613367565b601f01601f19169290920160200192915050565b60008251612c47818460208701613367565b9190910192915050565b60008351612c63818460208801613367565b835190830190612c77818360208801613367565b01949350505050565b60008651612c92818460208b01613367565b865190830190612ca6818360208b01613367565b8651910190612cb9818360208a01613367565b61013960f51b91019081528451612cd7816002840160208901613367565b601760f91b600292909101918201528351612cf9816003840160208801613367565b61272760f01b60039290910191820152600501979650505050505050565b60008251612d29818460208701613367565b642637b7339d60d91b920191825250600501919050565b60008351612d52818460208801613367565b600160fd1b9083019081528351612d70816001840160208801613367565b01600101949350505050565b60008451612d8e818460208901613367565b8083019050600160fd1b8082528551612dae816001850160208a01613367565b60019201918201528351612dc9816002840160208801613367565b0160020195945050505050565b60008351612de8818460208801613367565b601760f91b9083019081528351612d70816001840160208801613367565b60008451612e18818460208901613367565b601760f91b9083019081528451612e36816001840160208901613367565b600160fd1b600192909101918201528351612dc9816002840160208801613367565b60008451612e6a818460208901613367565b601760f91b9083019081528451612e88816001840160208901613367565b6526233137363b60d01b60019290910191820152600160fd1b60078201528351612eb9816008840160208801613367565b0160080195945050505050565b60008651612ed8818460208b01613367565b6526233137363b60d01b9083019081528651612efb816006840160208b01613367565b8651910190612f11816006840160208a01613367565b61013960f51b600692909101918201528451612f34816008840160208901613367565b601760f91b600892909101918201528351612f56816009840160208801613367565b61272760f01b60099290910191820152600b01979650505050505050565b60008551612f86818460208a01613367565b8083019050601d60f91b8082528651612fa6816001850160208b01613367565b600192019182018190528551612fc3816002850160208a01613367565b60029201918201528351612fde816003840160208801613367565b016003019695505050505050565b60008251612ffe818460208701613367565b632630ba1d60e11b920191825250600401919050565b6202c1d160ed1b815260008251613032816003850160208701613367565b9190910160030192915050565b6202c9d160ed1b815260008251613032816003850160208701613367565b6202d1d160ed1b815260008251613032816003850160208701613367565b602d60f81b815260008351613097816001850160208801613367565b601760f91b60019184019182015283516130b8816002840160208801613367565b01600201949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906110f590830184612c09565b6020815260006121476020830184612bc4565b6020815260006121476020830184612c09565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60006101208b835280602084015261320f8184018c612bc4565b90508281036040840152613223818b612c09565b90508281036060840152613237818a612c09565b9050828103608084015261324b8189612c09565b905082810360a084015261325f8188612c09565b905082810360c08401526132738187612c09565b905082810360e08401526132878186612c09565b905082810361010084015261329c8185612c09565b9c9b505050505050505050505050565b604051601f8201601f1916810167ffffffffffffffff811182821017156132d5576132d561344f565b604052919050565b600067ffffffffffffffff8211156132f7576132f761344f565b50601f01601f191660200190565b60008219821115613318576133186133f7565b500190565b60008261332c5761332c61340d565b500490565b600081600019048311821515161561334b5761334b6133f7565b500290565b600082821015613362576133626133f7565b500390565b60005b8381101561338257818101518382015260200161336a565b8381111561142b5750506000910152565b600181811c908216806133a757607f821691505b602082108114156111e557634e487b7160e01b600052602260045260246000fd5b60006000198214156133dc576133dc6133f7565b5060010190565b6000826133f2576133f261340d565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461184d57600080fdfea2646970667358221220a96aa47c3d61d250612f9bf4438e49e8fc82713975bbb728baff4e35638c625b64736f6c634300080700330000000000000000000000001308c158e60d7c4565e369df2a86ebd853eef2fb

Deployed Bytecode

0x6080604052600436106102305760003560e01c80637198521a1161012e578063a22cb465116100ab578063c87b56dd1161006f578063c87b56dd14610661578063e985e9c514610681578063ef2fb0fc146106ca578063f2fde38b146106ea578063f31196821461070a57600080fd5b8063a22cb465146105c1578063a50705b3146105e1578063a68aa80d14610601578063b88d4fde14610621578063c1442b551461064157600080fd5b806388dae602116100f257806388dae6021461052e5780638da5cb5b1461054e5780638e5cb5f61461056c57806395d89b411461058c5780639a0da749146105a157600080fd5b80637198521a1461048e57806373627826146104ae5780637436f54b146104ce57806382ea1495146104ee578063845a46971461050e57600080fd5b806329f1e51c116101bc5780634f6ccce7116101805780634f6ccce7146103f85780636352211e1461041857806367b7c0341461043857806370a0823114610459578063715018a61461047957600080fd5b806329f1e51c1461036d5780632f745c591461038d57806332cb6b0c146103ad57806342842e0e146103c35780634e71d92d146103e357600080fd5b80630c87d85f116102035780630c87d85f146102e65780631186de86146102ee57806318160ddd1461030e57806323b872dd1461032d578063283192731461034d57600080fd5b806301ffc9a71461023557806306fdde031461026a578063081812fc1461028c578063095ea7b3146102c4575b600080fd5b34801561024157600080fd5b50610255610250366004612a9c565b610737565b60405190151581526020015b60405180910390f35b34801561027657600080fd5b5061027f610748565b604051610261919061310a565b34801561029857600080fd5b506102ac6102a7366004612b4d565b6107da565b6040516001600160a01b039091168152602001610261565b3480156102d057600080fd5b506102e46102df366004612a72565b610874565b005b61027f61098a565b3480156102fa57600080fd5b50600e546102ac906001600160a01b031681565b34801561031a57600080fd5b506008545b604051908152602001610261565b34801561033957600080fd5b506102e4610348366004612961565b610a02565b34801561035957600080fd5b50600c546102ac906001600160a01b031681565b34801561037957600080fd5b5061027f610388366004612b7f565b610a33565b34801561039957600080fd5b5061031f6103a8366004612a72565b610c2f565b3480156103b957600080fd5b5061031f61226081565b3480156103cf57600080fd5b506102e46103de366004612961565b610cc5565b3480156103ef57600080fd5b506102e4610ce0565b34801561040457600080fd5b5061031f610413366004612b4d565b610d01565b34801561042457600080fd5b506102ac610433366004612b4d565b610d94565b34801561044457600080fd5b50600e5461025590600160a01b900460ff1681565b34801561046557600080fd5b5061031f610474366004612913565b610e0b565b34801561048557600080fd5b506102e4610e92565b34801561049a57600080fd5b5061027f6104a9366004612b7f565b610ec6565b3480156104ba57600080fd5b5061027f6104c9366004612b4d565b6110ff565b3480156104da57600080fd5b5061027f6104e9366004612b4d565b6111d8565b3480156104fa57600080fd5b50600b546102ac906001600160a01b031681565b34801561051a57600080fd5b5061027f610529366004612b4d565b6111eb565b34801561053a57600080fd5b5061027f610549366004612b4d565b611216565b34801561055a57600080fd5b50600a546001600160a01b03166102ac565b34801561057857600080fd5b5061027f610587366004612b4d565b611242565b34801561059857600080fd5b5061027f61126d565b3480156105ad57600080fd5b5061027f6105bc366004612b4d565b61127c565b3480156105cd57600080fd5b506102e46105dc366004612a48565b6112ab565b3480156105ed57600080fd5b506102e46105fc366004612913565b611370565b34801561060d57600080fd5b5061027f61061c366004612b4d565b6113d0565b34801561062d57600080fd5b506102e461063c36600461299d565b6113f9565b34801561064d57600080fd5b5061027f61065c366004612b7f565b611431565b34801561066d57600080fd5b5061027f61067c366004612b4d565b61157a565b34801561068d57600080fd5b5061025561069c36600461292e565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156106d657600080fd5b506102e46106e5366004612ba2565b6116ee565b3480156106f657600080fd5b506102e4610705366004612913565b6117b5565b34801561071657600080fd5b5061072a610725366004612b4d565b611850565b60405161026191906130f7565b600061074282611c32565b92915050565b60606000805461075790613393565b80601f016020809104026020016040519081016040528092919081815260200182805461078390613393565b80156107d05780601f106107a5576101008083540402835291602001916107d0565b820191906000526020600020905b8154815290600101906020018083116107b357829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166108585760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061087f82610d94565b9050806001600160a01b0316836001600160a01b031614156108ed5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161084f565b336001600160a01b03821614806109095750610909813361069c565b61097b5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161084f565b6109858383611c57565b505050565b606034156109ff57600e5460405134916001600160a01b03169082156108fc029083906000818181858888f193505050501580156109cc573d6000803e3d6000fd5b506109d73382611cc5565b50604051806040016040528060088152602001675468616e6b73212160c01b81525091505090565b90565b610a0c3382611d42565b610a285760405162461bcd60e51b815260040161084f906131a4565b610985838383611e39565b60606000603d610a69610a4586611fe4565b604051602001610a559190612fec565b6040516020818303038152906040526120e2565b610a7391906133e3565b90506000610a9f85605a604051806040016040528060048152602001633434636360e01b815250612113565b90506000610acb86603c604051806040016040528060048152602001633563343560e01b815250612113565b90506000610af787603c604051806040016040528060048152602001633438373360e01b815250612113565b90506000610b2388600a604051806040016040528060048152602001636735343360e01b815250612113565b90506060600f86101580610b435750601e86108015610b435750602d8611155b15610b68575060408051808201909152600381526201027160ed1b6020820152610b84565b5060408051808201909152600381526201029960ed1b60208201525b87610bd857610b9285611fe4565b81610b9c86611fe4565b610ba586611fe4565b610bae86611fe4565b604051602001610bc2959493929190612c80565b6040516020818303038152906040529650610c23565b610be185611fe4565b81610beb86611fe4565b610bf486611fe4565b610bfd86611fe4565b604051602001610c11959493929190612ec6565b60405160208183030381529060405296505b50505050505092915050565b6000610c3a83610e0b565b8210610c9c5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161084f565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b610985838383604051806020016040528060008152506113f9565b600e54600160a01b900460ff16610cf657600080fd5b610cff3361214e565b565b6000610d0c60085490565b8210610d6f5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161084f565b60088281548110610d8257610d82613439565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b0316806107425760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161084f565b60006001600160a01b038216610e765760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161084f565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b03163314610ebc5760405162461bcd60e51b815260040161084f9061316f565b610cff60006121b3565b60606000610ef68461016760405180604001604052806007815260200166436f6d7061737360c81b815250612113565b90506000610f2685606360405180604001604052806008815260200167446563696d616c7360c01b815250612113565b905060606044831080610f3a575061015283115b15610f91576016831080610f4f575061015283115b15610f7257506040805180820190915260018152602760f91b602082015261107c565b506040805180820190915260028152614e4560f01b602082015261107c565b60a0831015610fe0576070831015610fc157506040805180820190915260018152604560f81b602082015261107c565b50604080518082019091526002815261534560f01b602082015261107c565b60fa83101561102f5760ca83101561101057506040805180820190915260018152605360f81b602082015261107c565b50604080518082019091526002815261535760f01b602082015261107c565b61015283101561107c5761012483101561106157506040805180820190915260018152605760f81b602082015261107c565b506040805180820190915260028152614e5760f01b60208201525b6060856110be5761108c84611fe4565b61109584611fe4565b836040516020016110a893929190612e06565b60405160208183030381529060405290506110f5565b6110c784611fe4565b6110d084611fe4565b836040516020016110e393929190612e58565b60405160208183030381529060405290505b9695505050505050565b606061113161112c8361016d6040518060400160405280600381526020016236333560e81b815250612113565b611fe4565b61115b61112c8460186040518060400160405280600381526020016231333360e81b815250612113565b61118561112c85603c6040518060400160405280600381526020016219d94d60ea1b815250612113565b6111af61112c86603c604051806040016040528060038152602001620dd88d60ea1b815250612113565b6040516020016111c29493929190612f74565b6040516020818303038152906040529050919050565b60606111e5826000610ec6565b50919050565b6060610742826103e8604051806040016040528060048152602001631193d49160e21b815250612205565b6060610742826103e8604051806040016040528060058152602001642aa8222ba760d91b815250612205565b6060610742826103e8604051806040016040528060048152602001635349444560e01b815250612205565b60606001805461075790613393565b606061128782611242565b611290836111eb565b61129984611216565b6040516020016111c293929190612d7c565b6001600160a01b0382163314156113045760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161084f565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600a546001600160a01b0316331461139a5760405162461bcd60e51b815260040161084f9061316f565b600b80546001600160a01b039092166001600160a01b0319909216919091179055600e805460ff60a01b1916600160a01b179055565b60606113dd826000610a33565b6113e8836000611431565b6040516020016111c2929190612d40565b6114033383611d42565b61141f5760405162461bcd60e51b815260040161084f906131a4565b61142b848484846122c4565b50505050565b60606000603d61145361144386611fe4565b604051602001610a559190612d17565b61145d91906133e3565b905060006114898560b4604051806040016040528060048152602001636c64656760e01b815250612113565b905060006114b586603c604051806040016040528060048152602001633636b4b760e11b815250612113565b905060006114e187603c604051806040016040528060048152602001636c73656360e01b815250612113565b9050600061150c88600a604051806040016040528060038152602001626c646560e81b815250612113565b90506060600f8610158061152c5750601e8610801561152c5750602d8611155b15611551575060408051808201909152600381526201022960ed1b6020820152610b84565b506040805180820190915260038152620102b960ed1b602082015287610bd857610b9285611fe4565b6060600061158783611850565b90506000611596846001610a33565b905060006115a5856001611431565b905060006115b4866001610ec6565b905060006115c187611242565b6040516020016115d19190613014565b604051602081830303815290604052905060006115ed886111eb565b6040516020016115fd919061303f565b6040516020818303038152906040529050600061161989611216565b604051602001611629919061305d565b604051602081830303815290604052905060006116458a6110ff565b600b5460405163cc48f57b60e01b81529192506000916001600160a01b039091169063cc48f57b9061168b908e908d908d908d908d908d908d908d908d906004016131f5565b60006040518083038186803b1580156116a357600080fd5b505afa1580156116b7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526116df9190810190612ad6565b9b9a5050505050505050505050565b600a546001600160a01b031633146117185760405162461bcd60e51b815260040161084f9061316f565b6121ca8211801561172b57506122608211155b6117615760405162461bcd60e51b81526020600482015260076024820152661a5b9d985b1a5960ca1b604482015260640161084f565b600061176d8284613305565b90505b6103e85a1115610985575b808310156117b05761179e611798600a546001600160a01b031690565b846122f7565b826117a8816133c8565b93505061177b565b611770565b600a546001600160a01b031633146117df5760405162461bcd60e51b815260040161084f9061316f565b6001600160a01b0381166118445760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161084f565b61184d816121b3565b50565b6118586128c0565b600061186383610d94565b9050600061187082612311565b905060018110611bb05760006118a485836040518060400160405280600581526020016421a7a627a960d91b815250612113565b600c54604051632f745c5960e01b81526001600160a01b0386811660048301526024820184905292935060009290911690632f745c599060440160206040518083038186803b1580156118f657600080fd5b505afa15801561190a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061192e9190612b66565b600c54604051637988cb4160e11b8152600481018390529192506000916001600160a01b039091169063f31196829060240160006040518083038186803b15801561197857600080fd5b505afa15801561198c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526119b49190810190612ad6565b905060005b6005811015611ba757816119ce826008613331565b815181106119de576119de613439565b01602001516001600160f81b031916826119f9836008613331565b611a04906001613305565b81518110611a1457611a14613439565b01602001516001600160f81b03191683611a2f846008613331565b611a3a906002613305565b81518110611a4a57611a4a613439565b01602001516001600160f81b03191684611a65856008613331565b611a70906003613305565b81518110611a8057611a80613439565b01602001516001600160f81b03191685611a9b866008613331565b611aa6906004613305565b81518110611ab657611ab6613439565b01602001516001600160f81b03191686611ad1876008613331565b611adc906005613305565b81518110611aec57611aec613439565b01602001516001600160f81b03191687611b07886008613331565b611b12906006613305565b81518110611b2257611b22613439565b016020908101516040516001600160f81b031998891692810192909252958716602182015293861660228501529185166023840152841660248301528316602582015291166026820152602701604051602081830303815290604052878260058110611b9057611b90613439565b602002015280611b9f816133c8565b9150506119b9565b50505050611c2b565b60408051808201825260048082526311b3333360e11b6020808401829052928752835180850185528281528084018290528784015283518085018552828152808401829052878501528351808501855282815280840191909152606087015282518084019093528252630233030360e41b9082015260808401525b5050919050565b60006001600160e01b0319821663780e9d6360e01b148061074257506107428261238f565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611c8c82610d94565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600e54600090600160a01b900460ff16611cde57600080fd5b6000611ce9600d5490565b9050612134811015611d0357611cfe8461214e565b611d38565b662386f26fc1000083101580611d1b57506121ca8111155b15611d3857611d2a84826122f7565b611d38600d80546001019055565b5060019392505050565b6000818152600260205260408120546001600160a01b0316611dbb5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161084f565b6000611dc683610d94565b9050806001600160a01b0316846001600160a01b03161480611e015750836001600160a01b0316611df6846107da565b6001600160a01b0316145b80611e3157506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611e4c82610d94565b6001600160a01b031614611eb45760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161084f565b6001600160a01b038216611f165760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161084f565b611f218383836123df565b611f2c600082611c57565b6001600160a01b0383166000908152600360205260408120805460019290611f55908490613350565b90915550506001600160a01b0382166000908152600360205260408120805460019290611f83908490613305565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6060816120085750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612032578061201c816133c8565b915061202b9050600a8361331d565b915061200c565b60008167ffffffffffffffff81111561204d5761204d61344f565b6040519080825280601f01601f191660200182016040528015612077576020820181803683370190505b5090505b8415611e315761208c600183613350565b9150612099600a866133e3565b6120a4906030613305565b60f81b8183815181106120b9576120b9613439565b60200101906001600160f81b031916908160001a9053506120db600a8661331d565b945061207b565b6000816040516020016120f59190612c35565b60408051601f19818403018152919052805160209091012092915050565b6000806121348361212387611fe4565b604051602001610a55929190612c51565b9050600061214285836133e3565b925050505b9392505050565b6000612159600d5490565b905061213481106121975760405162461bcd60e51b815260206004820152600860248201526714995cd95c9d995960c21b604482015260640161084f565b6121a182826122f7565b6121af600d80546001019055565b5050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60606000603d6122188461212388611fe4565b61222291906133e3565b90506000612231868686612113565b90506000612242876103e787612113565b9050600f831115806122605750601e831180156122605750602d8311155b156122a15761226e82611fe4565b61227782611fe4565b60405160200161228892919061307b565b6040516020818303038152906040529350505050612147565b6122aa82611fe4565b6122b382611fe4565b604051602001612288929190612dd6565b6122cf848484611e39565b6122db848484846123ea565b61142b5760405162461bcd60e51b815260040161084f9061311d565b6121af8282604051806020016040528060008152506124f7565b600c546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a082319060240160206040518083038186803b15801561235757600080fd5b505afa15801561236b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107429190612b66565b60006001600160e01b031982166380ac58cd60e01b14806123c057506001600160e01b03198216635b5e139f60e01b145b8061074257506301ffc9a760e01b6001600160e01b0319831614610742565b61098583838361252a565b60006001600160a01b0384163b156124ec57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061242e9033908990889088906004016130c4565b602060405180830381600087803b15801561244857600080fd5b505af1925050508015612478575060408051601f3d908101601f1916820190925261247591810190612ab9565b60015b6124d2573d8080156124a6576040519150601f19603f3d011682016040523d82523d6000602084013e6124ab565b606091505b5080516124ca5760405162461bcd60e51b815260040161084f9061311d565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611e31565b506001949350505050565b61250183836125e2565b61250e60008484846123ea565b6109855760405162461bcd60e51b815260040161084f9061311d565b6001600160a01b0383166125855761258081600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6125a8565b816001600160a01b0316836001600160a01b0316146125a8576125a88382612730565b6001600160a01b0382166125bf57610985816127cd565b826001600160a01b0316826001600160a01b03161461098557610985828261287c565b6001600160a01b0382166126385760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161084f565b6000818152600260205260409020546001600160a01b03161561269d5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161084f565b6126a9600083836123df565b6001600160a01b03821660009081526003602052604081208054600192906126d2908490613305565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000600161273d84610e0b565b6127479190613350565b60008381526007602052604090205490915080821461279a576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906127df90600190613350565b6000838152600960205260408120546008805493945090928490811061280757612807613439565b90600052602060002001549050806008838154811061282857612828613439565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061286057612860613423565b6001900381819060005260206000200160009055905550505050565b600061288783610e0b565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6040518060a001604052806005905b60608152602001906001900390816128cf5790505090565b80356001600160a01b03811681146128fe57600080fd5b919050565b803580151581146128fe57600080fd5b60006020828403121561292557600080fd5b612147826128e7565b6000806040838503121561294157600080fd5b61294a836128e7565b9150612958602084016128e7565b90509250929050565b60008060006060848603121561297657600080fd5b61297f846128e7565b925061298d602085016128e7565b9150604084013590509250925092565b600080600080608085870312156129b357600080fd5b6129bc856128e7565b93506129ca602086016128e7565b925060408501359150606085013567ffffffffffffffff8111156129ed57600080fd5b8501601f810187136129fe57600080fd5b8035612a11612a0c826132dd565b6132ac565b818152886020838501011115612a2657600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b60008060408385031215612a5b57600080fd5b612a64836128e7565b915061295860208401612903565b60008060408385031215612a8557600080fd5b612a8e836128e7565b946020939093013593505050565b600060208284031215612aae57600080fd5b813561214781613465565b600060208284031215612acb57600080fd5b815161214781613465565b600060208284031215612ae857600080fd5b815167ffffffffffffffff811115612aff57600080fd5b8201601f81018413612b1057600080fd5b8051612b1e612a0c826132dd565b818152856020838501011115612b3357600080fd5b612b44826020830160208601613367565b95945050505050565b600060208284031215612b5f57600080fd5b5035919050565b600060208284031215612b7857600080fd5b5051919050565b60008060408385031215612b9257600080fd5b8235915061295860208401612903565b60008060408385031215612bb557600080fd5b50508035926020909101359150565b60008260a081018360005b6005811015612bfe578383038752612be8838351612c09565b6020978801979093509190910190600101612bcf565b509095945050505050565b60008151808452612c21816020860160208601613367565b601f01601f19169290920160200192915050565b60008251612c47818460208701613367565b9190910192915050565b60008351612c63818460208801613367565b835190830190612c77818360208801613367565b01949350505050565b60008651612c92818460208b01613367565b865190830190612ca6818360208b01613367565b8651910190612cb9818360208a01613367565b61013960f51b91019081528451612cd7816002840160208901613367565b601760f91b600292909101918201528351612cf9816003840160208801613367565b61272760f01b60039290910191820152600501979650505050505050565b60008251612d29818460208701613367565b642637b7339d60d91b920191825250600501919050565b60008351612d52818460208801613367565b600160fd1b9083019081528351612d70816001840160208801613367565b01600101949350505050565b60008451612d8e818460208901613367565b8083019050600160fd1b8082528551612dae816001850160208a01613367565b60019201918201528351612dc9816002840160208801613367565b0160020195945050505050565b60008351612de8818460208801613367565b601760f91b9083019081528351612d70816001840160208801613367565b60008451612e18818460208901613367565b601760f91b9083019081528451612e36816001840160208901613367565b600160fd1b600192909101918201528351612dc9816002840160208801613367565b60008451612e6a818460208901613367565b601760f91b9083019081528451612e88816001840160208901613367565b6526233137363b60d01b60019290910191820152600160fd1b60078201528351612eb9816008840160208801613367565b0160080195945050505050565b60008651612ed8818460208b01613367565b6526233137363b60d01b9083019081528651612efb816006840160208b01613367565b8651910190612f11816006840160208a01613367565b61013960f51b600692909101918201528451612f34816008840160208901613367565b601760f91b600892909101918201528351612f56816009840160208801613367565b61272760f01b60099290910191820152600b01979650505050505050565b60008551612f86818460208a01613367565b8083019050601d60f91b8082528651612fa6816001850160208b01613367565b600192019182018190528551612fc3816002850160208a01613367565b60029201918201528351612fde816003840160208801613367565b016003019695505050505050565b60008251612ffe818460208701613367565b632630ba1d60e11b920191825250600401919050565b6202c1d160ed1b815260008251613032816003850160208701613367565b9190910160030192915050565b6202c9d160ed1b815260008251613032816003850160208701613367565b6202d1d160ed1b815260008251613032816003850160208701613367565b602d60f81b815260008351613097816001850160208801613367565b601760f91b60019184019182015283516130b8816002840160208801613367565b01600201949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906110f590830184612c09565b6020815260006121476020830184612bc4565b6020815260006121476020830184612c09565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60006101208b835280602084015261320f8184018c612bc4565b90508281036040840152613223818b612c09565b90508281036060840152613237818a612c09565b9050828103608084015261324b8189612c09565b905082810360a084015261325f8188612c09565b905082810360c08401526132738187612c09565b905082810360e08401526132878186612c09565b905082810361010084015261329c8185612c09565b9c9b505050505050505050505050565b604051601f8201601f1916810167ffffffffffffffff811182821017156132d5576132d561344f565b604052919050565b600067ffffffffffffffff8211156132f7576132f761344f565b50601f01601f191660200190565b60008219821115613318576133186133f7565b500190565b60008261332c5761332c61340d565b500490565b600081600019048311821515161561334b5761334b6133f7565b500290565b600082821015613362576133626133f7565b500390565b60005b8381101561338257818101518382015260200161336a565b8381111561142b5750506000910152565b600181811c908216806133a757607f821691505b602082108114156111e557634e487b7160e01b600052602260045260246000fd5b60006000198214156133dc576133dc6133f7565b5060010190565b6000826133f2576133f261340d565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461184d57600080fdfea2646970667358221220a96aa47c3d61d250612f9bf4438e49e8fc82713975bbb728baff4e35638c625b64736f6c63430008070033

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

0000000000000000000000001308c158e60d7c4565e369df2a86ebd853eef2fb

-----Decoded View---------------
Arg [0] : _colorPallete (address): 0x1308c158e60D7C4565e369Df2A86eBD853EeF2FB

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000001308c158e60d7c4565e369df2a86ebd853eef2fb


Deployed Bytecode Sourcemap

45625:11838:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57236:212;;;;;;;;;;-1:-1:-1;57236:212:0;;;;;:::i;:::-;;:::i;:::-;;;19930:14:1;;19923:22;19905:41;;19893:2;19878:18;57236:212:0;;;;;;;;14163:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;15722:221::-;;;;;;;;;;-1:-1:-1;15722:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;18448:32:1;;;18430:51;;18418:2;18403:18;15722:221:0;18284:203:1;15245:411:0;;;;;;;;;;-1:-1:-1;15245:411:0;;;;;:::i;:::-;;:::i;:::-;;46157:485;;;:::i;47008:33::-;;;;;;;;;;-1:-1:-1;47008:33:0;;;;-1:-1:-1;;;;;47008:33:0;;;28874:113;;;;;;;;;;-1:-1:-1;28962:10:0;:17;28874:113;;;28245:25:1;;;28233:2;28218:18;28874:113:0;28099:177:1;16612:339:0;;;;;;;;;;-1:-1:-1;16612:339:0;;;;;:::i;:::-;;:::i;46836:25::-;;;;;;;;;;-1:-1:-1;46836:25:0;;;;-1:-1:-1;;;;;46836:25:0;;;48213:1103;;;;;;;;;;-1:-1:-1;48213:1103:0;;;;;:::i;:::-;;:::i;28542:256::-;;;;;;;;;;-1:-1:-1;28542:256:0;;;;;:::i;:::-;;:::i;45967:38::-;;;;;;;;;;;;46001:4;45967:38;;17022:185;;;;;;;;;;-1:-1:-1;17022:185:0;;;;;:::i;:::-;;:::i;46042:87::-;;;;;;;;;;;;;:::i;29064:233::-;;;;;;;;;;-1:-1:-1;29064:233:0;;;;;:::i;:::-;;:::i;13857:239::-;;;;;;;;;;-1:-1:-1;13857:239:0;;;;;:::i;:::-;;:::i;47081:22::-;;;;;;;;;;-1:-1:-1;47081:22:0;;;;-1:-1:-1;;;47081:22:0;;;;;;13587:208;;;;;;;;;;-1:-1:-1;13587:208:0;;;;;:::i;:::-;;:::i;3902:94::-;;;;;;;;;;;;;:::i;50930:1175::-;;;;;;;;;;-1:-1:-1;50930:1175:0;;;;;:::i;:::-;;:::i;50392:392::-;;;;;;;;;;-1:-1:-1;50392:392:0;;;;;:::i;:::-;;:::i;50802:120::-;;;;;;;;;;-1:-1:-1;50802:120:0;;;;;:::i;:::-;;:::i;46749:25::-;;;;;;;;;;-1:-1:-1;46749:25:0;;;;-1:-1:-1;;;;;46749:25:0;;;47687:134;;;;;;;;;;-1:-1:-1;47687:134:0;;;;;:::i;:::-;;:::i;47833:135::-;;;;;;;;;;-1:-1:-1;47833:135:0;;;;;:::i;:::-;;:::i;3251:87::-;;;;;;;;;;-1:-1:-1;3324:6:0;;-1:-1:-1;;;;;3324:6:0;3251:87;;47541:134;;;;;;;;;;-1:-1:-1;47541:134:0;;;;;:::i;:::-;;:::i;14332:104::-;;;;;;;;;;;;;:::i;47356:173::-;;;;;;;;;;-1:-1:-1;47356:173:0;;;;;:::i;:::-;;:::i;16015:295::-;;;;;;;;;;-1:-1:-1;16015:295:0;;;;;:::i;:::-;;:::i;54906:120::-;;;;;;;;;;-1:-1:-1;54906:120:0;;;;;:::i;:::-;;:::i;47980:221::-;;;;;;;;;;-1:-1:-1;47980:221:0;;;;;:::i;:::-;;:::i;17278:328::-;;;;;;;;;;-1:-1:-1;17278:328:0;;;;;:::i;:::-;;:::i;49328:1052::-;;;;;;;;;;-1:-1:-1;49328:1052:0;;;;;:::i;:::-;;:::i;53124:804::-;;;;;;;;;;-1:-1:-1;53124:804:0;;;;;:::i;:::-;;:::i;16381:164::-;;;;;;;;;;-1:-1:-1;16381:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;16502:25:0;;;16478:4;16502:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;16381:164;55955:281;;;;;;;;;;-1:-1:-1;55955:281:0;;;;;:::i;:::-;;:::i;4151:192::-;;;;;;;;;;-1:-1:-1;4151:192:0;;;;;:::i;:::-;;:::i;52113:1003::-;;;;;;;;;;-1:-1:-1;52113:1003:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;57236:212::-;57375:4;57404:36;57428:11;57404:23;:36::i;:::-;57397:43;57236:212;-1:-1:-1;;57236:212:0:o;14163:100::-;14217:13;14250:5;14243:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14163:100;:::o;15722:221::-;15798:7;19205:16;;;:7;:16;;;;;;-1:-1:-1;;;;;19205:16:0;15818:73;;;;-1:-1:-1;;;15818:73:0;;25213:2:1;15818:73:0;;;25195:21:1;25252:2;25232:18;;;25225:30;25291:34;25271:18;;;25264:62;-1:-1:-1;;;25342:18:1;;;25335:42;25394:19;;15818:73:0;;;;;;;;;-1:-1:-1;15911:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;15911:24:0;;15722:221::o;15245:411::-;15326:13;15342:23;15357:7;15342:14;:23::i;:::-;15326:39;;15390:5;-1:-1:-1;;;;;15384:11:0;:2;-1:-1:-1;;;;;15384:11:0;;;15376:57;;;;-1:-1:-1;;;15376:57:0;;26733:2:1;15376:57:0;;;26715:21:1;26772:2;26752:18;;;26745:30;26811:34;26791:18;;;26784:62;-1:-1:-1;;;26862:18:1;;;26855:31;26903:19;;15376:57:0;26531:397:1;15376:57:0;2117:10;-1:-1:-1;;;;;15468:21:0;;;;:62;;-1:-1:-1;15493:37:0;15510:5;2117:10;16381:164;:::i;15493:37::-;15446:168;;;;-1:-1:-1;;;15446:168:0;;23606:2:1;15446:168:0;;;23588:21:1;23645:2;23625:18;;;23618:30;23684:34;23664:18;;;23657:62;23755:26;23735:18;;;23728:54;23799:19;;15446:168:0;23404:420:1;15446:168:0;15627:21;15636:2;15640:7;15627:8;:21::i;:::-;15315:341;15245:411;;:::o;46157:485::-;46200:13;46465:9;:13;46461:174;;46528:10;;:22;;46504:9;;-1:-1:-1;;;;;46528:10:0;;:22;;;;;46504:9;;46495:6;46528:22;46495:6;46528:22;46504:9;46528:10;:22;;;;;;;;;;;;;;;;;;;;;46565:26;46577:10;46589:1;46565:11;:26::i;:::-;;46606:17;;;;;;;;;;;;;-1:-1:-1;;;46606:17:0;;;;;;46157:485;:::o;46461:174::-;46157:485;:::o;16612:339::-;16807:41;2117:10;16840:7;16807:18;:41::i;:::-;16799:103;;;;-1:-1:-1;;;16799:103:0;;;;;;;:::i;:::-;16915:28;16925:4;16931:2;16935:7;16915:9;:28::i;48213:1103::-;48282:23;48328:9;48403:2;48340:60;48371:18;48380:8;48371;:18::i;:::-;48354:44;;;;;;;;:::i;:::-;;;;;;;;;;;;;48340:6;:60::i;:::-;:65;;;;:::i;:::-;48328:77;;48416:9;48428:37;48444:8;48454:2;48428:37;;;;;;;;;;;;;-1:-1:-1;;;48428:37:0;;;:15;:37::i;:::-;48416:49;;48476:9;48488:37;48504:8;48514:2;48488:37;;;;;;;;;;;;;-1:-1:-1;;;48488:37:0;;;:15;:37::i;:::-;48476:49;;48536:9;48548:37;48564:8;48574:2;48548:37;;;;;;;;;;;;;-1:-1:-1;;;48548:37:0;;;:15;:37::i;:::-;48536:49;;48596:12;48611:37;48627:8;48637:2;48611:37;;;;;;;;;;;;;-1:-1:-1;;;48611:37:0;;;:15;:37::i;:::-;48596:52;;48659:24;48716:2;48708:4;:10;;:39;;;;48730:2;48723:4;:9;:23;;;;;48744:2;48736:4;:10;;48723:23;48704:141;;;-1:-1:-1;48764:18:0;;;;;;;;;;;;-1:-1:-1;;;48764:18:0;;;;48704:141;;;-1:-1:-1;48815:18:0;;;;;;;;;;;;-1:-1:-1;;;48815:18:0;;;;48704:141;48918:6;48913:349;;48977:14;48986:4;48977:8;:14::i;:::-;48993:10;49005:14;49014:4;49005:8;:14::i;:::-;49027;49036:4;49027:8;:14::i;:::-;49048:17;49057:7;49048:8;:17::i;:::-;48960:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48941:133;;48913:349;;;49143:14;49152:4;49143:8;:14::i;:::-;49169:10;49181:14;49190:4;49181:8;:14::i;:::-;49203;49212:4;49203:8;:14::i;:::-;49224:17;49233:7;49224:8;:17::i;:::-;49126:123;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49107:143;;48913:349;49292:16;;;;;;48213:1103;;;;:::o;28542:256::-;28639:7;28675:23;28692:5;28675:16;:23::i;:::-;28667:5;:31;28659:87;;;;-1:-1:-1;;;28659:87:0;;20839:2:1;28659:87:0;;;20821:21:1;20878:2;20858:18;;;20851:30;20917:34;20897:18;;;20890:62;-1:-1:-1;;;20968:18:1;;;20961:41;21019:19;;28659:87:0;20637:407:1;28659:87:0;-1:-1:-1;;;;;;28764:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;28542:256::o;17022:185::-;17160:39;17177:4;17183:2;17187:7;17160:39;;;;;;;;;;;;:16;:39::i;46042:87::-;46085:2;;-1:-1:-1;;;46085:2:0;;;;46077:11;;;;;;46099:22;2117:10;46099:8;:22::i;:::-;46042:87::o;29064:233::-;29139:7;29175:30;28962:10;:17;;28874:113;29175:30;29167:5;:38;29159:95;;;;-1:-1:-1;;;29159:95:0;;27553:2:1;29159:95:0;;;27535:21:1;27592:2;27572:18;;;27565:30;27631:34;27611:18;;;27604:62;-1:-1:-1;;;27682:18:1;;;27675:42;27734:19;;29159:95:0;27351:408:1;29159:95:0;29272:10;29283:5;29272:17;;;;;;;;:::i;:::-;;;;;;;;;29265:24;;29064:233;;;:::o;13857:239::-;13929:7;13965:16;;;:7;:16;;;;;;-1:-1:-1;;;;;13965:16:0;14000:19;13992:73;;;;-1:-1:-1;;;13992:73:0;;24442:2:1;13992:73:0;;;24424:21:1;24481:2;24461:18;;;24454:30;24520:34;24500:18;;;24493:62;-1:-1:-1;;;24571:18:1;;;24564:39;24620:19;;13992:73:0;24240:405:1;13587:208:0;13659:7;-1:-1:-1;;;;;13687:19:0;;13679:74;;;;-1:-1:-1;;;13679:74:0;;24031:2:1;13679:74:0;;;24013:21:1;24070:2;24050:18;;;24043:30;24109:34;24089:18;;;24082:62;-1:-1:-1;;;24160:18:1;;;24153:40;24210:19;;13679:74:0;23829:406:1;13679:74:0;-1:-1:-1;;;;;;13771:16:0;;;;;:9;:16;;;;;;;13587:208::o;3902:94::-;3324:6;;-1:-1:-1;;;;;3324:6:0;2117:10;3471:23;3463:68;;;;-1:-1:-1;;;3463:68:0;;;;;;;:::i;:::-;3967:21:::1;3985:1;3967:9;:21::i;50930:1175::-:0;51000:13;51036:14;51053:41;51069:8;51079:3;51053:41;;;;;;;;;;;;;-1:-1:-1;;;51053:41:0;;;:15;:41::i;:::-;51036:58;;51105:18;51126:41;51142:8;51152:2;51126:41;;;;;;;;;;;;;-1:-1:-1;;;51126:41:0;;;:15;:41::i;:::-;51105:62;;51178:28;51243:2;51231:9;:14;:33;;;;51261:3;51249:9;:15;51231:33;51227:479;;;51283:2;51271:9;:14;:33;;;;51301:3;51289:9;:15;51271:33;51267:92;;;-1:-1:-1;51307:20:0;;;;;;;;;;;;-1:-1:-1;;;51307:20:0;;;;51227:479;;51267:92;-1:-1:-1;51336:21:0;;;;;;;;;;;;-1:-1:-1;;;51336:21:0;;;;51227:479;;;51392:3;51380:9;:15;51376:330;;;51414:3;51402:9;:15;51398:74;;;-1:-1:-1;51420:20:0;;;;;;;;;;;;-1:-1:-1;;;51420:20:0;;;;51376:330;;51398:74;-1:-1:-1;51449:21:0;;;;;;;;;;;;-1:-1:-1;;;51449:21:0;;;;51376:330;;;51495:3;51483:9;:15;51479:227;;;51527:3;51515:9;:15;51511:76;;;-1:-1:-1;51534:20:0;;;;;;;;;;;;-1:-1:-1;;;51534:20:0;;;;51479:227;;51511:76;-1:-1:-1;51564:21:0;;;;;;;;;;;;-1:-1:-1;;;51564:21:0;;;;51479:227;;;51611:3;51599:9;:15;51595:111;;;51634:3;51622:9;:15;51618:87;;;-1:-1:-1;51650:20:0;;;;;;;;;;;;-1:-1:-1;;;51650:20:0;;;;51618:87;;;-1:-1:-1;51681:21:0;;;;;;;;;;;;-1:-1:-1;;;51681:21:0;;;;51618:87;51726:21;51773:6;51768:295;;51830:19;51839:9;51830:8;:19::i;:::-;51856:23;51865:13;51856:8;:23::i;:::-;51886:14;51813:88;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51796:106;;51768:295;;;51969:19;51978:9;51969:8;:19::i;:::-;51995:23;52004:13;51995:8;:23::i;:::-;52035:14;51952:98;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51935:116;;51768:295;52090:7;50930:1175;-1:-1:-1;;;;;;50930:1175:0:o;50392:392::-;50444:13;50515:47;50524:37;50540:8;50550:3;50524:37;;;;;;;;;;;;;-1:-1:-1;;;50524:37:0;;;:15;:37::i;:::-;50515:8;:47::i;:::-;50582:46;50591:36;50607:8;50617:2;50591:36;;;;;;;;;;;;;-1:-1:-1;;;50591:36:0;;;:15;:36::i;50582:46::-;50648;50657:36;50673:8;50683:2;50657:36;;;;;;;;;;;;;-1:-1:-1;;;50657:36:0;;;:15;:36::i;50648:46::-;50714;50723:36;50739:8;50749:2;50723:36;;;;;;;;;;;;;-1:-1:-1;;;50723:36:0;;;:15;:36::i;50714:46::-;50484:291;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50470:306;;50392:392;;;:::o;50802:120::-;50859:13;50885:29;50898:8;50908:5;50885:12;:29::i;:::-;;50802:120;;;:::o;47687:134::-;47736:13;47769:44;47790:8;47800:4;47769:44;;;;;;;;;;;;;-1:-1:-1;;;47769:44:0;;;:20;:44::i;47833:135::-;47882:13;47915:45;47936:8;47946:4;47915:45;;;;;;;;;;;;;-1:-1:-1;;;47915:45:0;;;:20;:45::i;47541:134::-;47590:13;47623:44;47644:8;47654:4;47623:44;;;;;;;;;;;;;-1:-1:-1;;;47623:44:0;;;:20;:44::i;14332:104::-;14388:13;14421:7;14414:14;;;;;:::i;47356:173::-;47407:13;47464:14;47469:8;47464:4;:14::i;:::-;47484;47489:8;47484:4;:14::i;:::-;47505;47510:8;47505:4;:14::i;:::-;47447:73;;;;;;;;;;:::i;16015:295::-;-1:-1:-1;;;;;16118:24:0;;2117:10;16118:24;;16110:62;;;;-1:-1:-1;;;16110:62:0;;22839:2:1;16110:62:0;;;22821:21:1;22878:2;22858:18;;;22851:30;22917:27;22897:18;;;22890:55;22962:18;;16110:62:0;22637:349:1;16110:62:0;2117:10;16185:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;16185:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;16185:53:0;;;;;;;;;;16254:48;;19905:41:1;;;16185:42:0;;2117:10;16254:48;;19878:18:1;16254:48:0;;;;;;;16015:295;;:::o;54906:120::-;3324:6;;-1:-1:-1;;;;;3324:6:0;2117:10;3471:23;3463:68;;;;-1:-1:-1;;;3463:68:0;;;;;;;:::i;:::-;54970:5:::1;:28:::0;;-1:-1:-1;;;;;54970:28:0;;::::1;-1:-1:-1::0;;;;;;54970:28:0;;::::1;::::0;;;::::1;::::0;;55009:2:::1;:9:::0;;-1:-1:-1;;;;55009:9:0::1;-1:-1:-1::0;;;55009:9:0::1;::::0;;54906:120::o;47980:221::-;48035:21;48103:28;48115:8;48125:5;48103:11;:28::i;:::-;48137:29;48150:8;48160:5;48137:12;:29::i;:::-;48086:81;;;;;;;;;:::i;17278:328::-;17453:41;2117:10;17486:7;17453:18;:41::i;:::-;17445:103;;;;-1:-1:-1;;;17445:103:0;;;;;;;:::i;:::-;17559:39;17573:4;17579:2;17583:7;17592:5;17559:13;:39::i;:::-;17278:328;;;;:::o;49328:1052::-;49398:24;49435:9;49511:2;49447:61;49478:18;49487:8;49478;:18::i;:::-;49461:45;;;;;;;;:::i;49447:61::-;:66;;;;:::i;:::-;49435:78;;49524:9;49536:38;49552:8;49562:3;49536:38;;;;;;;;;;;;;-1:-1:-1;;;49536:38:0;;;:15;:38::i;:::-;49524:50;;49585:9;49597:37;49613:8;49623:2;49597:37;;;;;;;;;;;;;-1:-1:-1;;;49597:37:0;;;:15;:37::i;:::-;49585:49;;49645:9;49657:37;49673:8;49683:2;49657:37;;;;;;;;;;;;;-1:-1:-1;;;49657:37:0;;;:15;:37::i;:::-;49645:49;;49705:12;49720:36;49736:8;49746:2;49720:36;;;;;;;;;;;;;-1:-1:-1;;;49720:36:0;;;:15;:36::i;:::-;49705:51;;49767:24;49824:2;49816:4;:10;;:39;;;;49838:2;49831:4;:9;:23;;;;;49852:2;49844:4;:10;;49831:23;49812:141;;;-1:-1:-1;49872:18:0;;;;;;;;;;;;-1:-1:-1;;;49872:18:0;;;;49812:141;;;-1:-1:-1;49923:18:0;;;;;;;;;;;;-1:-1:-1;;;49923:18:0;;;;49997:6;49992:351;;50057:14;50066:4;50057:8;:14::i;53124:804::-;53225:13;53258:24;53285:18;53295:7;53285:9;:18::i;:::-;53258:45;;53314:18;53335:26;53347:7;53356:4;53335:11;:26::i;:::-;53314:47;;53372:19;53394:27;53407:7;53416:4;53394:12;:27::i;:::-;53372:49;;53432:18;53453:27;53466:7;53475:4;53453:12;:27::i;:::-;53432:48;;53491:16;53541:13;53546:7;53541:4;:13::i;:::-;53517:38;;;;;;;;:::i;:::-;;;;;;;;;;;;;53491:65;;53567:16;53617:13;53622:7;53617:4;:13::i;:::-;53593:38;;;;;;;;:::i;:::-;;;;;;;;;;;;;53567:65;;53643:16;53693:13;53698:7;53693:4;:13::i;:::-;53669:38;;;;;;;;:::i;:::-;;;;;;;;;;;;;53643:65;;53719:16;53738;53746:7;53738;:16::i;:::-;53792:5;;:103;;-1:-1:-1;;;53792:103:0;;53719:35;;-1:-1:-1;53770:19:0;;-1:-1:-1;;;;;53792:5:0;;;;:18;;:103;;53811:7;;53820;;53830:4;;53836:5;;53843:4;;53879:2;;53883;;53887;;53719:35;;53792:103;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;53792:103:0;;;;;;;;;;;;:::i;:::-;53770:125;53124:804;-1:-1:-1;;;;;;;;;;;53124:804:0:o;55955:281::-;3324:6;;-1:-1:-1;;;;;3324:6:0;2117:10;3471:23;3463:68;;;;-1:-1:-1;;;3463:68:0;;;;;;;:::i;:::-;56044:4:::1;56034:7;:14;:33;;;;;56063:4;56052:7;:15;;56034:33;56026:53;;;::::0;-1:-1:-1;;;56026:53:0;;27966:2:1;56026:53:0::1;::::0;::::1;27948:21:1::0;28005:1;27985:18;;;27978:29;-1:-1:-1;;;28023:18:1;;;28016:37;28070:18;;56026:53:0::1;27764:330:1::0;56026:53:0::1;56090:8;56101:12;56111:2:::0;56101:7;:12:::1;:::i;:::-;56090:23;;56124:105;56143:4;56131:9;:16;56124:105;;;56150:78;56173:3;56163:7;:13;56150:78;;;56199:27;56209:7;3324:6:::0;;-1:-1:-1;;;;;3324:6:0;;3251:87;56209:7:::1;56218;56199:9;:27::i;:::-;56178:9:::0;::::1;::::0;::::1;:::i;:::-;;;;56150:78;;;56124:105;;4151:192:::0;3324:6;;-1:-1:-1;;;;;3324:6:0;2117:10;3471:23;3463:68;;;;-1:-1:-1;;;3463:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;4240:22:0;::::1;4232:73;;;::::0;-1:-1:-1;;;4232:73:0;;21670:2:1;4232:73:0::1;::::0;::::1;21652:21:1::0;21709:2;21689:18;;;21682:30;21748:34;21728:18;;;21721:62;-1:-1:-1;;;21799:18:1;;;21792:36;21845:19;;4232:73:0::1;21468:402:1::0;4232:73:0::1;4316:19;4326:8;4316:9;:19::i;:::-;4151:192:::0;:::o;52113:1003::-;52168:24;;:::i;:::-;52215:16;52234:17;52242:8;52234:7;:17::i;:::-;52215:36;;52262:9;52274:20;52285:8;52274:10;:20::i;:::-;52262:32;;52317:1;52309:4;:9;52305:770;;52335:11;52349:42;52365:8;52376:4;52349:42;;;;;;;;;;;;;-1:-1:-1;;;52349:42:0;;;:15;:42::i;:::-;52423:7;;:45;;-1:-1:-1;;;52423:45:0;;-1:-1:-1;;;;;19401:32:1;;;52423:45:0;;;19383:51:1;19450:18;;;19443:34;;;52335:56:0;;-1:-1:-1;52406:14:0;;52423:7;;;;:27;;19356:18:1;;52423:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52512:7;;:28;;-1:-1:-1;;;52512:28:0;;;;;28245:25:1;;;52406:62:0;;-1:-1:-1;52483:20:0;;-1:-1:-1;;;;;52512:7:0;;;;:17;;28218:18:1;;52512:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;52512:28:0;;;;;;;;;;;;:::i;:::-;52483:58;;52575:6;52570:236;52592:1;52588;:5;52570:236;;;52657:7;52666:3;52668:1;52666;:3;:::i;:::-;52657:14;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;52657:14:0;52673:7;52683:3;52685:1;52683;:3;:::i;:::-;52682:7;;52688:1;52682:7;:::i;:::-;52673:18;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;52673:18:0;52693:7;52703:3;52705:1;52703;:3;:::i;:::-;52702:7;;52708:1;52702:7;:::i;:::-;52693:18;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;52693:18:0;52712:7;52722:3;52724:1;52722;:3;:::i;:::-;52721:7;;52727:1;52721:7;:::i;:::-;52712:18;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;52712:18:0;52731:7;52741:3;52743:1;52741;:3;:::i;:::-;52740:7;;52746:1;52740:7;:::i;:::-;52731:18;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;52731:18:0;52750:7;52760:3;52762:1;52760;:3;:::i;:::-;52759:7;;52765:1;52759:7;:::i;:::-;52750:18;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;52750:18:0;52770:7;52780:3;52782:1;52780;:3;:::i;:::-;52779:7;;52785:1;52779:7;:::i;:::-;52770:18;;;;;;;;:::i;:::-;;;;;;;52640:149;;-1:-1:-1;;;;;;5649:15:1;;;52640:149:0;;;5637:28:1;;;;5694:15;;;5681:11;;;5674:36;5739:15;;;5726:11;;;5719:36;5784:15;;;5771:11;;;5764:36;5829:15;;5816:11;;;5809:36;5874:15;;5861:11;;;5854:36;52770:18:0;;5906:11:1;;;5899:36;5951:11;;52640:149:0;;;;;;;;;;;;52620:7;52628:1;52620:10;;;;;;;:::i;:::-;;;;:170;52596:3;;;;:::i;:::-;;;;52570:236;;;;52320:497;;;52305:770;;;52898:19;;;;;;;;;;;;-1:-1:-1;;;52898:19:0;;;;;;;;;;52933;;;;;;;;;;;;;;;;:10;;;:19;52968;;;;;;;;;;;;;;;;:10;;;:19;53003;;;;;;;;;;;;;;;;;:10;;;:19;53038;;;;;;;;;;-1:-1:-1;;;53038:19:0;;;;:10;;;:19;52305:770;53094:14;;52113:1003;;;:::o;28234:224::-;28336:4;-1:-1:-1;;;;;;28360:50:0;;-1:-1:-1;;;28360:50:0;;:90;;;28414:36;28438:11;28414:23;:36::i;23098:174::-;23173:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;23173:29:0;-1:-1:-1;;;;;23173:29:0;;;;;;;;:24;;23227:23;23173:24;23227:14;:23::i;:::-;-1:-1:-1;;;;;23218:46:0;;;;;;;;;;;23098:174;;:::o;55312:409::-;55414:2;;55379:4;;-1:-1:-1;;;55414:2:0;;;;55406:11;;;;;;55428:14;55445:25;:15;909:14;;817:114;55445:25;55428:42;;55495:4;55486:6;:13;55483:209;;;55515:17;55524:7;55515:8;:17::i;:::-;55483:209;;;55564:10;55555:5;:19;;55554:41;;;;55590:4;55580:6;:14;;55554:41;55550:142;;;55612:26;55622:7;55631:6;55612:9;:26::i;:::-;55653:27;:15;1028:19;;1046:1;1028:19;;;939:127;55653:27;-1:-1:-1;55709:4:0;;55312:409;-1:-1:-1;;;55312:409:0:o;19410:348::-;19503:4;19205:16;;;:7;:16;;;;;;-1:-1:-1;;;;;19205:16:0;19520:73;;;;-1:-1:-1;;;19520:73:0;;23193:2:1;19520:73:0;;;23175:21:1;23232:2;23212:18;;;23205:30;23271:34;23251:18;;;23244:62;-1:-1:-1;;;23322:18:1;;;23315:42;23374:19;;19520:73:0;22991:408:1;19520:73:0;19604:13;19620:23;19635:7;19620:14;:23::i;:::-;19604:39;;19673:5;-1:-1:-1;;;;;19662:16:0;:7;-1:-1:-1;;;;;19662:16:0;;:51;;;;19706:7;-1:-1:-1;;;;;19682:31:0;:20;19694:7;19682:11;:20::i;:::-;-1:-1:-1;;;;;19682:31:0;;19662:51;:87;;;-1:-1:-1;;;;;;16502:25:0;;;16478:4;16502:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;19717:32;19654:96;19410:348;-1:-1:-1;;;;19410:348:0:o;22402:578::-;22561:4;-1:-1:-1;;;;;22534:31:0;:23;22549:7;22534:14;:23::i;:::-;-1:-1:-1;;;;;22534:31:0;;22526:85;;;;-1:-1:-1;;;22526:85:0;;25987:2:1;22526:85:0;;;25969:21:1;26026:2;26006:18;;;25999:30;26065:34;26045:18;;;26038:62;-1:-1:-1;;;26116:18:1;;;26109:39;26165:19;;22526:85:0;25785:405:1;22526:85:0;-1:-1:-1;;;;;22630:16:0;;22622:65;;;;-1:-1:-1;;;22622:65:0;;22434:2:1;22622:65:0;;;22416:21:1;22473:2;22453:18;;;22446:30;22512:34;22492:18;;;22485:62;-1:-1:-1;;;22563:18:1;;;22556:34;22607:19;;22622:65:0;22232:400:1;22622:65:0;22700:39;22721:4;22727:2;22731:7;22700:20;:39::i;:::-;22804:29;22821:1;22825:7;22804:8;:29::i;:::-;-1:-1:-1;;;;;22846:15:0;;;;;;:9;:15;;;;;:20;;22865:1;;22846:15;:20;;22865:1;;22846:20;:::i;:::-;;;;-1:-1:-1;;;;;;;22877:13:0;;;;;;:9;:13;;;;;:18;;22894:1;;22877:13;:18;;22894:1;;22877:18;:::i;:::-;;;;-1:-1:-1;;22906:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;22906:21:0;-1:-1:-1;;;;;22906:21:0;;;;;;;;;22945:27;;22906:16;;22945:27;;;;;;;22402:578;;;:::o;56248:757::-;56304:13;56559:10;56555:53;;-1:-1:-1;;56586:10:0;;;;;;;;;;;;-1:-1:-1;;;56586:10:0;;;;;56248:757::o;56555:53::-;56633:5;56618:12;56674:78;56681:9;;56674:78;;56707:8;;;;:::i;:::-;;-1:-1:-1;56730:10:0;;-1:-1:-1;56738:2:0;56730:10;;:::i;:::-;;;56674:78;;;56762:19;56794:6;56784:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56784:17:0;;56762:39;;56812:154;56819:10;;56812:154;;56846:11;56856:1;56846:11;;:::i;:::-;;-1:-1:-1;56915:10:0;56923:2;56915:5;:10;:::i;:::-;56902:24;;:2;:24;:::i;:::-;56889:39;;56872:6;56879;56872:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;56872:56:0;;;;;;;;-1:-1:-1;56943:11:0;56952:2;56943:11;;:::i;:::-;;;56812:154;;55166:138;55226:7;55288:5;55271:23;;;;;;;;:::i;:::-;;;;-1:-1:-1;;55271:23:0;;;;;;;;;55261:34;;55271:23;55261:34;;;;;55166:138;-1:-1:-1;;55166:138:0:o;53961:262::-;54058:4;54075:9;54087:60;54118:6;54126:18;54135:8;54126;:18::i;:::-;54101:44;;;;;;;;;:::i;54087:60::-;54075:72;-1:-1:-1;54158:9:0;54170:13;54177:6;54075:72;54170:13;:::i;:::-;54158:25;-1:-1:-1;;;53961:262:0;;;;;;:::o;55729:218::-;55778:14;55795:25;:15;909:14;;817:114;55795:25;55778:42;;55850:4;55841:6;:13;55833:34;;;;-1:-1:-1;;;55833:34:0;;26397:2:1;55833:34:0;;;26379:21:1;26436:1;26416:18;;;26409:29;-1:-1:-1;;;26454:18:1;;;26447:38;26502:18;;55833:34:0;26195:331:1;55833:34:0;55880:21;55890:2;55894:6;55880:9;:21::i;:::-;55912:27;:15;1028:19;;1046:1;1028:19;;;939:127;55912:27;55767:180;55729:218;:::o;4351:173::-;4426:6;;;-1:-1:-1;;;;;4443:17:0;;;-1:-1:-1;;;;;;4443:17:0;;;;;;;4476:40;;4426:6;;;4443:17;4426:6;;4476:40;;4407:16;;4476:40;4396:128;4351:173;:::o;54235:624::-;54337:13;54373:9;54448:2;54385:60;54416:6;54424:18;54433:8;54424;:18::i;54385:60::-;:65;;;;:::i;:::-;54373:77;;54461:9;54473:41;54489:8;54499:6;54507;54473:15;:41::i;:::-;54461:53;;54525:9;54537:38;54553:8;54563:3;54568:6;54537:15;:38::i;:::-;54525:50;;54608:2;54600:4;:10;;:39;;;;54622:2;54615:4;:9;:23;;;;;54636:2;54628:4;:10;;54615:23;54596:246;;;54692:14;54701:4;54692:8;:14::i;:::-;54713;54722:4;54713:8;:14::i;:::-;54670:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54656:73;;;;;;;54596:246;54793:14;54802:4;54793:8;:14::i;:::-;54814;54823:4;54814:8;:14::i;:::-;54776:53;;;;;;;;;:::i;18488:315::-;18645:28;18655:4;18661:2;18665:7;18645:9;:28::i;:::-;18692:48;18715:4;18721:2;18725:7;18734:5;18692:22;:48::i;:::-;18684:111;;;;-1:-1:-1;;;18684:111:0;;;;;;;:::i;20100:110::-;20176:26;20186:2;20190:7;20176:26;;;;;;;;;;;;:9;:26::i;55034:120::-;55119:7;;:27;;-1:-1:-1;;;55119:27:0;;-1:-1:-1;;;;;18448:32:1;;;55119:27:0;;;18430:51:1;55095:4:0;;55119:7;;:17;;18403:18:1;;55119:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;13218:305::-;13320:4;-1:-1:-1;;;;;;13357:40:0;;-1:-1:-1;;;13357:40:0;;:105;;-1:-1:-1;;;;;;;13414:48:0;;-1:-1:-1;;;13414:48:0;13357:105;:158;;;-1:-1:-1;;;;;;;;;;6289:40:0;;;13479:36;6180:157;57013:215;57175:45;57202:4;57208:2;57212:7;57175:26;:45::i;23837:799::-;23992:4;-1:-1:-1;;;;;24013:13:0;;37547:20;37595:8;24009:620;;24049:72;;-1:-1:-1;;;24049:72:0;;-1:-1:-1;;;;;24049:36:0;;;;;:72;;2117:10;;24100:4;;24106:7;;24115:5;;24049:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24049:72:0;;;;;;;;-1:-1:-1;;24049:72:0;;;;;;;;;;;;:::i;:::-;;;24045:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24291:13:0;;24287:272;;24334:60;;-1:-1:-1;;;24334:60:0;;;;;;;:::i;24287:272::-;24509:6;24503:13;24494:6;24490:2;24486:15;24479:38;24045:529;-1:-1:-1;;;;;;24172:51:0;-1:-1:-1;;;24172:51:0;;-1:-1:-1;24165:58:0;;24009:620;-1:-1:-1;24613:4:0;23837:799;;;;;;:::o;20437:321::-;20567:18;20573:2;20577:7;20567:5;:18::i;:::-;20618:54;20649:1;20653:2;20657:7;20666:5;20618:22;:54::i;:::-;20596:154;;;;-1:-1:-1;;;20596:154:0;;;;;;;:::i;29910:589::-;-1:-1:-1;;;;;30116:18:0;;30112:187;;30151:40;30183:7;31326:10;:17;;31299:24;;;;:15;:24;;;;;:44;;;31354:24;;;;;;;;;;;;31222:164;30151:40;30112:187;;;30221:2;-1:-1:-1;;;;;30213:10:0;:4;-1:-1:-1;;;;;30213:10:0;;30209:90;;30240:47;30273:4;30279:7;30240:32;:47::i;:::-;-1:-1:-1;;;;;30313:16:0;;30309:183;;30346:45;30383:7;30346:36;:45::i;30309:183::-;30419:4;-1:-1:-1;;;;;30413:10:0;:2;-1:-1:-1;;;;;30413:10:0;;30409:83;;30440:40;30468:2;30472:7;30440:27;:40::i;21094:382::-;-1:-1:-1;;;;;21174:16:0;;21166:61;;;;-1:-1:-1;;;21166:61:0;;24852:2:1;21166:61:0;;;24834:21:1;;;24871:18;;;24864:30;24930:34;24910:18;;;24903:62;24982:18;;21166:61:0;24650:356:1;21166:61:0;19181:4;19205:16;;;:7;:16;;;;;;-1:-1:-1;;;;;19205:16:0;:30;21238:58;;;;-1:-1:-1;;;21238:58:0;;22077:2:1;21238:58:0;;;22059:21:1;22116:2;22096:18;;;22089:30;22155;22135:18;;;22128:58;22203:18;;21238:58:0;21875:352:1;21238:58:0;21309:45;21338:1;21342:2;21346:7;21309:20;:45::i;:::-;-1:-1:-1;;;;;21367:13:0;;;;;;:9;:13;;;;;:18;;21384:1;;21367:13;:18;;21384:1;;21367:18;:::i;:::-;;;;-1:-1:-1;;21396:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;21396:21:0;-1:-1:-1;;;;;21396:21:0;;;;;;;;21435:33;;21396:16;;;21435:33;;21396:16;;21435:33;21094:382;;:::o;32013:988::-;32279:22;32329:1;32304:22;32321:4;32304:16;:22::i;:::-;:26;;;;:::i;:::-;32341:18;32362:26;;;:17;:26;;;;;;32279:51;;-1:-1:-1;32495:28:0;;;32491:328;;-1:-1:-1;;;;;32562:18:0;;32540:19;32562:18;;;:12;:18;;;;;;;;:34;;;;;;;;;32613:30;;;;;;:44;;;32730:30;;:17;:30;;;;;:43;;;32491:328;-1:-1:-1;32915:26:0;;;;:17;:26;;;;;;;;32908:33;;;-1:-1:-1;;;;;32959:18:0;;;;;:12;:18;;;;;:34;;;;;;;32952:41;32013:988::o;33296:1079::-;33574:10;:17;33549:22;;33574:21;;33594:1;;33574:21;:::i;:::-;33606:18;33627:24;;;:15;:24;;;;;;34000:10;:26;;33549:46;;-1:-1:-1;33627:24:0;;33549:46;;34000:26;;;;;;:::i;:::-;;;;;;;;;33978:48;;34064:11;34039:10;34050;34039:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;34144:28;;;:15;:28;;;;;;;:41;;;34316:24;;;;;34309:31;34351:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;33367:1008;;;33296:1079;:::o;30800:221::-;30885:14;30902:20;30919:2;30902:16;:20::i;:::-;-1:-1:-1;;;;;30933:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;30978:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;30800:221:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:160::-;257:20;;313:13;;306:21;296:32;;286:60;;342:1;339;332:12;357:186;416:6;469:2;457:9;448:7;444:23;440:32;437:52;;;485:1;482;475:12;437:52;508:29;527:9;508:29;:::i;548:260::-;616:6;624;677:2;665:9;656:7;652:23;648:32;645:52;;;693:1;690;683:12;645:52;716:29;735:9;716:29;:::i;:::-;706:39;;764:38;798:2;787:9;783:18;764:38;:::i;:::-;754:48;;548:260;;;;;:::o;813:328::-;890:6;898;906;959:2;947:9;938:7;934:23;930:32;927:52;;;975:1;972;965:12;927:52;998:29;1017:9;998:29;:::i;:::-;988:39;;1046:38;1080:2;1069:9;1065:18;1046:38;:::i;:::-;1036:48;;1131:2;1120:9;1116:18;1103:32;1093:42;;813:328;;;;;:::o;1146:888::-;1241:6;1249;1257;1265;1318:3;1306:9;1297:7;1293:23;1289:33;1286:53;;;1335:1;1332;1325:12;1286:53;1358:29;1377:9;1358:29;:::i;:::-;1348:39;;1406:38;1440:2;1429:9;1425:18;1406:38;:::i;:::-;1396:48;;1491:2;1480:9;1476:18;1463:32;1453:42;;1546:2;1535:9;1531:18;1518:32;1573:18;1565:6;1562:30;1559:50;;;1605:1;1602;1595:12;1559:50;1628:22;;1681:4;1673:13;;1669:27;-1:-1:-1;1659:55:1;;1710:1;1707;1700:12;1659:55;1746:2;1733:16;1771:48;1787:31;1815:2;1787:31;:::i;:::-;1771:48;:::i;:::-;1842:2;1835:5;1828:17;1882:7;1877:2;1872;1868;1864:11;1860:20;1857:33;1854:53;;;1903:1;1900;1893:12;1854:53;1958:2;1953;1949;1945:11;1940:2;1933:5;1929:14;1916:45;2002:1;1997:2;1992;1985:5;1981:14;1977:23;1970:34;2023:5;2013:15;;;;;1146:888;;;;;;;:::o;2039:254::-;2104:6;2112;2165:2;2153:9;2144:7;2140:23;2136:32;2133:52;;;2181:1;2178;2171:12;2133:52;2204:29;2223:9;2204:29;:::i;:::-;2194:39;;2252:35;2283:2;2272:9;2268:18;2252:35;:::i;2298:254::-;2366:6;2374;2427:2;2415:9;2406:7;2402:23;2398:32;2395:52;;;2443:1;2440;2433:12;2395:52;2466:29;2485:9;2466:29;:::i;:::-;2456:39;2542:2;2527:18;;;;2514:32;;-1:-1:-1;;;2298:254:1:o;2557:245::-;2615:6;2668:2;2656:9;2647:7;2643:23;2639:32;2636:52;;;2684:1;2681;2674:12;2636:52;2723:9;2710:23;2742:30;2766:5;2742:30;:::i;2807:249::-;2876:6;2929:2;2917:9;2908:7;2904:23;2900:32;2897:52;;;2945:1;2942;2935:12;2897:52;2977:9;2971:16;2996:30;3020:5;2996:30;:::i;3061:635::-;3141:6;3194:2;3182:9;3173:7;3169:23;3165:32;3162:52;;;3210:1;3207;3200:12;3162:52;3243:9;3237:16;3276:18;3268:6;3265:30;3262:50;;;3308:1;3305;3298:12;3262:50;3331:22;;3384:4;3376:13;;3372:27;-1:-1:-1;3362:55:1;;3413:1;3410;3403:12;3362:55;3442:2;3436:9;3467:48;3483:31;3511:2;3483:31;:::i;3467:48::-;3538:2;3531:5;3524:17;3578:7;3573:2;3568;3564;3560:11;3556:20;3553:33;3550:53;;;3599:1;3596;3589:12;3550:53;3612:54;3663:2;3658;3651:5;3647:14;3642:2;3638;3634:11;3612:54;:::i;:::-;3685:5;3061:635;-1:-1:-1;;;;;3061:635:1:o;3701:180::-;3760:6;3813:2;3801:9;3792:7;3788:23;3784:32;3781:52;;;3829:1;3826;3819:12;3781:52;-1:-1:-1;3852:23:1;;3701:180;-1:-1:-1;3701:180:1:o;3886:184::-;3956:6;4009:2;3997:9;3988:7;3984:23;3980:32;3977:52;;;4025:1;4022;4015:12;3977:52;-1:-1:-1;4048:16:1;;3886:184;-1:-1:-1;3886:184:1:o;4075:248::-;4140:6;4148;4201:2;4189:9;4180:7;4176:23;4172:32;4169:52;;;4217:1;4214;4207:12;4169:52;4253:9;4240:23;4230:33;;4282:35;4313:2;4302:9;4298:18;4282:35;:::i;4328:248::-;4396:6;4404;4457:2;4445:9;4436:7;4432:23;4428:32;4425:52;;;4473:1;4470;4463:12;4425:52;-1:-1:-1;;4496:23:1;;;4566:2;4551:18;;;4538:32;;-1:-1:-1;4328:248:1:o;4581:474::-;4629:3;4660;4714;4707:5;4703:15;4741:5;4764:1;4774:255;4788:4;4785:1;4782:11;4774:255;;;4857:5;4851:4;4847:16;4842:3;4835:29;4885:37;4917:4;4908:6;4902:13;4885:37;:::i;:::-;4945:4;5007:12;;;;4877:45;;-1:-1:-1;4972:15:1;;;;;4808:1;4801:9;4774:255;;;-1:-1:-1;5045:4:1;;4581:474;-1:-1:-1;;;;;4581:474:1:o;5060:257::-;5101:3;5139:5;5133:12;5166:6;5161:3;5154:19;5182:63;5238:6;5231:4;5226:3;5222:14;5215:4;5208:5;5204:16;5182:63;:::i;:::-;5299:2;5278:15;-1:-1:-1;;5274:29:1;5265:39;;;;5306:4;5261:50;;5060:257;-1:-1:-1;;5060:257:1:o;5973:276::-;6104:3;6142:6;6136:13;6158:53;6204:6;6199:3;6192:4;6184:6;6180:17;6158:53;:::i;:::-;6227:16;;;;;5973:276;-1:-1:-1;;5973:276:1:o;6254:470::-;6433:3;6471:6;6465:13;6487:53;6533:6;6528:3;6521:4;6513:6;6509:17;6487:53;:::i;:::-;6603:13;;6562:16;;;;6625:57;6603:13;6562:16;6659:4;6647:17;;6625:57;:::i;:::-;6698:20;;6254:470;-1:-1:-1;;;;6254:470:1:o;6729:1484::-;7355:3;7393:6;7387:13;7409:53;7455:6;7450:3;7443:4;7435:6;7431:17;7409:53;:::i;:::-;7525:13;;7484:16;;;;7547:57;7525:13;7484:16;7581:4;7569:17;;7547:57;:::i;:::-;7671:13;;7626:20;;;7693:57;7671:13;7626:20;7727:4;7715:17;;7693:57;:::i;:::-;-1:-1:-1;;;7772:20:1;;7801:19;;;7845:13;;7867:65;7845:13;7919:1;7908:13;;7901:4;7889:17;;7867:65;:::i;:::-;-1:-1:-1;;;7995:1:1;7951:20;;;;7987:10;;;7980:23;8028:13;;8050:62;8028:13;8099:1;8091:10;;8084:4;8072:17;;8050:62;:::i;:::-;-1:-1:-1;;;8172:1:1;8131:17;;;;8164:10;;;8157:24;8205:1;8197:10;;6729:1484;-1:-1:-1;;;;;;;6729:1484:1:o;8218:443::-;8450:3;8488:6;8482:13;8504:53;8550:6;8545:3;8538:4;8530:6;8526:17;8504:53;:::i;:::-;-1:-1:-1;;;8579:16:1;;8604:22;;;-1:-1:-1;8653:1:1;8642:13;;8218:443;-1:-1:-1;8218:443:1:o;8666:614::-;8946:3;8984:6;8978:13;9000:53;9046:6;9041:3;9034:4;9026:6;9022:17;9000:53;:::i;:::-;-1:-1:-1;;;9075:16:1;;;9100:18;;;9143:13;;9165:65;9143:13;9217:1;9206:13;;9199:4;9187:17;;9165:65;:::i;:::-;9250:20;9272:1;9246:28;;8666:614;-1:-1:-1;;;;8666:614:1:o;9285:960::-;9714:3;9752:6;9746:13;9768:53;9814:6;9809:3;9802:4;9794:6;9790:17;9768:53;:::i;:::-;9852:6;9847:3;9843:16;9830:29;;-1:-1:-1;;;9904:2:1;9897:5;9890:17;9938:6;9932:13;9954:65;10010:8;10006:1;9999:5;9995:13;9988:4;9980:6;9976:17;9954:65;:::i;:::-;10082:1;10038:20;;10074:10;;;10067:22;10114:13;;10136:62;10114:13;10185:1;10177:10;;10170:4;10158:17;;10136:62;:::i;:::-;10218:17;10237:1;10214:25;;9285:960;-1:-1:-1;;;;;9285:960:1:o;10250:614::-;10530:3;10568:6;10562:13;10584:53;10630:6;10625:3;10618:4;10610:6;10606:17;10584:53;:::i;:::-;-1:-1:-1;;;10659:16:1;;;10684:18;;;10727:13;;10749:65;10727:13;10801:1;10790:13;;10783:4;10771:17;;10749:65;:::i;10869:940::-;11298:3;11336:6;11330:13;11352:53;11398:6;11393:3;11386:4;11378:6;11374:17;11352:53;:::i;:::-;-1:-1:-1;;;11427:16:1;;;11452:18;;;11495:13;;11517:65;11495:13;11569:1;11558:13;;11551:4;11539:17;;11517:65;:::i;:::-;-1:-1:-1;;;11645:1:1;11601:20;;;;11637:10;;;11630:23;11678:13;;11700:62;11678:13;11749:1;11741:10;;11734:4;11722:17;;11700:62;:::i;11814:1078::-;12344:3;12382:6;12376:13;12398:53;12444:6;12439:3;12432:4;12424:6;12420:17;12398:53;:::i;:::-;-1:-1:-1;;;12473:16:1;;;12498:18;;;12541:13;;12563:65;12541:13;12615:1;12604:13;;12597:4;12585:17;;12563:65;:::i;:::-;-1:-1:-1;;;12691:1:1;12647:20;;;;12683:10;;;12676:28;-1:-1:-1;;;12728:1:1;12720:10;;12713:23;12761:13;;12783:62;12761:13;12832:1;12824:10;;12817:4;12805:17;;12783:62;:::i;:::-;12865:17;12884:1;12861:25;;11814:1078;-1:-1:-1;;;;;11814:1078:1:o;12897:1621::-;13624:3;13662:6;13656:13;13678:53;13724:6;13719:3;13712:4;13704:6;13700:17;13678:53;:::i;:::-;-1:-1:-1;;;13753:16:1;;;13778:23;;;13826:13;;13848:65;13826:13;13900:1;13889:13;;13882:4;13870:17;;13848:65;:::i;:::-;13977:13;;13932:20;;;13999:62;13977:13;14048:1;14040:10;;14033:4;14021:17;;13999:62;:::i;:::-;-1:-1:-1;;;14121:1:1;14080:17;;;;14113:10;;;14106:24;14155:13;;14177:62;14155:13;14226:1;14218:10;;14211:4;14199:17;;14177:62;:::i;:::-;-1:-1:-1;;;14299:1:1;14258:17;;;;14291:10;;;14284:23;14332:13;;14354:62;14332:13;14403:1;14395:10;;14388:4;14376:17;;14354:62;:::i;:::-;-1:-1:-1;;;14476:1:1;14435:17;;;;14468:10;;;14461:24;14509:2;14501:11;;12897:1621;-1:-1:-1;;;;;;;12897:1621:1:o;14523:1285::-;15101:3;15139:6;15133:13;15155:53;15201:6;15196:3;15189:4;15181:6;15177:17;15155:53;:::i;:::-;15239:6;15234:3;15230:16;15217:29;;-1:-1:-1;;;15291:2:1;15284:5;15277:17;15325:6;15319:13;15341:65;15397:8;15393:1;15386:5;15382:13;15375:4;15367:6;15363:17;15341:65;:::i;:::-;15469:1;15425:20;;15461:10;;;15454:22;;;15501:13;;15523:62;15501:13;15572:1;15564:10;;15557:4;15545:17;;15523:62;:::i;:::-;15645:1;15604:17;;15637:10;;;15630:22;15677:13;;15699:62;15677:13;15748:1;15740:10;;15733:4;15721:17;;15699:62;:::i;:::-;15781:17;15800:1;15777:25;;14523:1285;-1:-1:-1;;;;;;14523:1285:1:o;15813:442::-;16045:3;16083:6;16077:13;16099:53;16145:6;16140:3;16133:4;16125:6;16121:17;16099:53;:::i;:::-;-1:-1:-1;;;16174:16:1;;16199:21;;;-1:-1:-1;16247:1:1;16236:13;;15813:442;-1:-1:-1;15813:442:1:o;16260:420::-;-1:-1:-1;;;16517:3:1;16510:18;16492:3;16557:6;16551:13;16573:61;16627:6;16623:1;16618:3;16614:11;16607:4;16599:6;16595:17;16573:61;:::i;:::-;16654:16;;;;16672:1;16650:24;;16260:420;-1:-1:-1;;16260:420:1:o;16685:::-;-1:-1:-1;;;16942:3:1;16935:18;16917:3;16982:6;16976:13;16998:61;17052:6;17048:1;17043:3;17039:11;17032:4;17024:6;17020:17;16998:61;:::i;17110:420::-;-1:-1:-1;;;17367:3:1;17360:18;17342:3;17407:6;17401:13;17423:61;17477:6;17473:1;17468:3;17464:11;17457:4;17449:6;17445:17;17423:61;:::i;17535:744::-;-1:-1:-1;;;17941:3:1;17934:16;17916:3;17979:6;17973:13;17995:61;18049:6;18045:1;18040:3;18036:11;18029:4;18021:6;18017:17;17995:61;:::i;:::-;-1:-1:-1;;;18115:1:1;18075:16;;;18107:10;;;18100:23;18148:13;;18170:62;18148:13;18219:1;18211:10;;18204:4;18192:17;;18170:62;:::i;:::-;18252:17;18271:1;18248:25;;17535:744;-1:-1:-1;;;;17535:744:1:o;18716:488::-;-1:-1:-1;;;;;18985:15:1;;;18967:34;;19037:15;;19032:2;19017:18;;19010:43;19084:2;19069:18;;19062:34;;;19132:3;19127:2;19112:18;;19105:31;;;18910:4;;19153:45;;19178:19;;19170:6;19153:45;:::i;19488:272::-;19683:2;19672:9;19665:21;19646:4;19703:51;19750:2;19739:9;19735:18;19727:6;19703:51;:::i;20413:219::-;20562:2;20551:9;20544:21;20525:4;20582:44;20622:2;20611:9;20607:18;20599:6;20582:44;:::i;21049:414::-;21251:2;21233:21;;;21290:2;21270:18;;;21263:30;21329:34;21324:2;21309:18;;21302:62;-1:-1:-1;;;21395:2:1;21380:18;;21373:48;21453:3;21438:19;;21049:414::o;25424:356::-;25626:2;25608:21;;;25645:18;;;25638:30;25704:34;25699:2;25684:18;;25677:62;25771:2;25756:18;;25424:356::o;26933:413::-;27135:2;27117:21;;;27174:2;27154:18;;;27147:30;27213:34;27208:2;27193:18;;27186:62;-1:-1:-1;;;27279:2:1;27264:18;;27257:47;27336:3;27321:19;;26933:413::o;28281:1504::-;28803:4;28832:3;28862:6;28851:9;28844:25;28905:2;28900;28889:9;28885:18;28878:30;28931:51;28978:2;28967:9;28963:18;28955:6;28931:51;:::i;:::-;28917:65;;29030:9;29022:6;29018:22;29013:2;29002:9;28998:18;28991:50;29064:32;29089:6;29081;29064:32;:::i;:::-;29050:46;;29144:9;29136:6;29132:22;29127:2;29116:9;29112:18;29105:50;29178:32;29203:6;29195;29178:32;:::i;:::-;29164:46;;29259:9;29251:6;29247:22;29241:3;29230:9;29226:19;29219:51;29293:32;29318:6;29310;29293:32;:::i;:::-;29279:46;;29374:9;29366:6;29362:22;29356:3;29345:9;29341:19;29334:51;29408:32;29433:6;29425;29408:32;:::i;:::-;29394:46;;29489:9;29481:6;29477:22;29471:3;29460:9;29456:19;29449:51;29523:32;29548:6;29540;29523:32;:::i;:::-;29509:46;;29604:9;29596:6;29592:22;29586:3;29575:9;29571:19;29564:51;29638:32;29663:6;29655;29638:32;:::i;:::-;29624:46;;29719:9;29711:6;29707:22;29701:3;29690:9;29686:19;29679:51;29747:32;29772:6;29764;29747:32;:::i;:::-;29739:40;28281:1504;-1:-1:-1;;;;;;;;;;;;28281:1504:1:o;29790:275::-;29861:2;29855:9;29926:2;29907:13;;-1:-1:-1;;29903:27:1;29891:40;;29961:18;29946:34;;29982:22;;;29943:62;29940:88;;;30008:18;;:::i;:::-;30044:2;30037:22;29790:275;;-1:-1:-1;29790:275:1:o;30070:186::-;30118:4;30151:18;30143:6;30140:30;30137:56;;;30173:18;;:::i;:::-;-1:-1:-1;30239:2:1;30218:15;-1:-1:-1;;30214:29:1;30245:4;30210:40;;30070:186::o;30261:128::-;30301:3;30332:1;30328:6;30325:1;30322:13;30319:39;;;30338:18;;:::i;:::-;-1:-1:-1;30374:9:1;;30261:128::o;30394:120::-;30434:1;30460;30450:35;;30465:18;;:::i;:::-;-1:-1:-1;30499:9:1;;30394:120::o;30519:168::-;30559:7;30625:1;30621;30617:6;30613:14;30610:1;30607:21;30602:1;30595:9;30588:17;30584:45;30581:71;;;30632:18;;:::i;:::-;-1:-1:-1;30672:9:1;;30519:168::o;30692:125::-;30732:4;30760:1;30757;30754:8;30751:34;;;30765:18;;:::i;:::-;-1:-1:-1;30802:9:1;;30692:125::o;30822:258::-;30894:1;30904:113;30918:6;30915:1;30912:13;30904:113;;;30994:11;;;30988:18;30975:11;;;30968:39;30940:2;30933:10;30904:113;;;31035:6;31032:1;31029:13;31026:48;;;-1:-1:-1;;31070:1:1;31052:16;;31045:27;30822:258::o;31085:380::-;31164:1;31160:12;;;;31207;;;31228:61;;31282:4;31274:6;31270:17;31260:27;;31228:61;31335:2;31327:6;31324:14;31304:18;31301:38;31298:161;;;31381:10;31376:3;31372:20;31369:1;31362:31;31416:4;31413:1;31406:15;31444:4;31441:1;31434:15;31470:135;31509:3;-1:-1:-1;;31530:17:1;;31527:43;;;31550:18;;:::i;:::-;-1:-1:-1;31597:1:1;31586:13;;31470:135::o;31610:112::-;31642:1;31668;31658:35;;31673:18;;:::i;:::-;-1:-1:-1;31707:9:1;;31610:112::o;31727:127::-;31788:10;31783:3;31779:20;31776:1;31769:31;31819:4;31816:1;31809:15;31843:4;31840:1;31833:15;31859:127;31920:10;31915:3;31911:20;31908:1;31901:31;31951:4;31948:1;31941:15;31975:4;31972:1;31965:15;31991:127;32052:10;32047:3;32043:20;32040:1;32033:31;32083:4;32080:1;32073:15;32107:4;32104:1;32097:15;32123:127;32184:10;32179:3;32175:20;32172:1;32165:31;32215:4;32212:1;32205:15;32239:4;32236:1;32229:15;32255:127;32316:10;32311:3;32307:20;32304:1;32297:31;32347:4;32344:1;32337:15;32371:4;32368:1;32361:15;32387:131;-1:-1:-1;;;;;;32461:32:1;;32451:43;;32441:71;;32508:1;32505;32498:12

Swarm Source

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