ETH Price: $3,904.28 (+0.36%)

J. Pierce & Friends (JPF)
 

Overview

TokenID

2085

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Welcome! Minting has just begun! https://ownerfy.com/jpandfriends Renowned American modern artist, Justin Pierce has found a passion in fine arts, product design and custom urban murals to touch people and their emotions. J.Pierce is inspired by legendary artist: Warhol, Seu...

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
JPandFriends

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-11-12
*/

pragma solidity ^0.8.0;

/**
* The J. Pierce & Friends contract was deployed by Ownerfy Inc. of Ownerfy.com
* https://ownerfy.com/jpandfriends
* Visit Ownerfy.com for exclusive NFT drops or inquiries for your project.
*
* This contract is not a proxy.
* This contract is not pausable.
* This contract is not lockable.
* This contract cannot be rug pulled.
* The URIs are not changeable after mint.
* This contract uses IPFS
* This contract puts SHA256 media hash into the Update event for permanent on-chain documentation
* The NFT Owners and only the NFT Owners have complete control over their NFTs
*/

// SPDX-License-Identifier: UNLICENSED


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

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
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;
}



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



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



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

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private 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);
            }
        }
    }
}



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

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



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



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

/**
 * @dev Implementation of 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(to).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 {}
}



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



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

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

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

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

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

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

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

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

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

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

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

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

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

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



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



/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return recover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return recover(hash, r, vs);
        } else {
            revert("ECDSA: invalid signature length");
        }
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        bytes32 s;
        uint8 v;
        assembly {
            s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)
            v := add(shr(255, vs), 27)
        }
        return recover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`, `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        require(
            uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0,
            "ECDSA: invalid signature 's' value"
        );
        require(v == 27 || v == 28, "ECDSA: invalid signature 'v' value");

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        require(signer != address(0), "ECDSA: invalid signature");

        return signer;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}

contract JPandFriends is Context, ERC721, Ownable {

  using SafeMath for uint256;
  using Counters for Counters.Counter;

  Counters.Counter private _tokenIdTracker;
  Counters.Counter private _whiteListCount;

  uint256 public salePrice = 37 * 10**15;
  uint256 public constant MAX_ELEMENTS = 4000;
  address public constant creatorAddress = 0x6c474099ad6d9Af49201a38b9842111d4ACd10BC;
  string public baseTokenURI;
  bool public placeHolder = true;
  bool public saleOn = true;
  bool public listOnly = true;
  uint256 wlc = 4000;

  uint256 private _royaltyBps = 500;
  address payable private _royaltyRecipient;

  bytes4 private constant _INTERFACE_ID_ROYALTIES_CREATORCORE = 0xbb3bafd6;
  bytes4 private constant _INTERFACE_ID_ROYALTIES_EIP2981 = 0x2a55205a;
  bytes4 private constant _INTERFACE_ID_ROYALTIES_RARIBLE = 0xb7799584;

  mapping (address => bool) public whitelist;
  mapping (address => uint8) public totalBought;

  event Mint(address indexed sender, uint256 count, uint256 paid, uint256 price);
  event UpdateRoyalty(address indexed _address, uint256 _bps);

    /**
     * deploys the contract.
     */
    constructor(string memory _uri) payable ERC721("J. Pierce & Friends", "JPF") {
      _royaltyRecipient = payable(msg.sender);
      baseTokenURI = _uri;
    }

    function _totalSupply() internal view returns (uint) {
        return _tokenIdTracker.current();
    }

    modifier saleIsOpen {
        require(_totalSupply() <= MAX_ELEMENTS, "Sale end");
        require(saleOn, "Sale hasnt started");

        _;
    }

    function totalSupply() public view returns (uint256) {
        return _totalSupply();
    }

    function mint(uint8 _count, address _to, uint256 code) public payable saleIsOpen {
        uint256 total = _totalSupply();
        uint256 cost = salePrice.mul(_count);
        require(total + _count <= MAX_ELEMENTS, "Max limit");
        require(msg.value >= price(_count), "Value below price");

        if(listOnly) {

          require(code == wlc, "Sender not on whitelist");
          require(totalBought[_to] + _count < 5, "MAX WHITELIST AMOUNT PURCHASED");

          totalBought[_to] = totalBought[_to] + _count;

          _mintElements(_count, _to);
          Mint(_to, _count, cost, salePrice);

        } else {

          require(totalBought[_to] + _count < 13, "MAX GENERAL SALE AMOUNT PURCHASED");
          totalBought[_to] = totalBought[_to] + _count;
          _mintElements(_count, _to);
          Mint(_to, _count, cost, salePrice);
        }
    }

    function creditCardMint(uint8 _count, address _to) public saleIsOpen onlyOwner {
        uint256 total = _totalSupply();
        uint256 cost = salePrice.mul(_count);
        require(total + _count <= MAX_ELEMENTS, "Max limit");
        Mint(_to, _count, cost, salePrice);
        _mintElements(_count, _to);
    }

    function _mintElements(uint256 _count, address _to) private {
        for (uint256 i = 0; i < _count; i++) {
          _tokenIdTracker.increment();
          _safeMint(_to, _tokenIdTracker.current());
        }
    }

    function price(uint256 _count) public view returns (uint256) {
        return salePrice.mul(_count);
    }

    // Set price
    function setPrice(uint256 _price) public onlyOwner{
        salePrice = _price;
    }

    function setWlc(uint256 _wlc) public onlyOwner{
        wlc = _wlc;
    }

    // Function to withdraw all Ether and tokens from this contract.
    function withdraw() public onlyOwner{
        uint amount = address(this).balance;

        // send all Ether to owner
        // Owner can receive Ether since the address of owner is payable
        (bool success, ) = owner().call{value: amount}("");
        require(success, "Failed to send Ether");

    }

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

    function setPlaceHolder(bool isOn) public onlyOwner {
        placeHolder = isOn;
    }

    function setSaleOn(bool isOn) public onlyOwner {
        saleOn = isOn;
    }

    function setListOnly(bool isOn) public onlyOwner {
        listOnly = isOn;
    }

    function tokenURI(uint256 _id) public view virtual override returns (string memory) {
        if(placeHolder) {
          return baseTokenURI;
        } else {
          return string(abi.encodePacked(baseTokenURI, uint2str(_id), ".json"));
        }
    }

    /**
    * @dev Update royalties
    */
    function updateRoyalties(address payable recipient, uint256 bps) external onlyOwner {
        _royaltyRecipient = recipient;
        _royaltyBps = bps;
        emit UpdateRoyalty(recipient, bps);
    }

    /**
      * ROYALTY FUNCTIONS
      */
    function getRoyalties(uint256) external view returns (address payable[] memory recipients, uint256[] memory bps) {
        if (_royaltyRecipient != address(0x0)) {
            recipients = new address payable[](1);
            recipients[0] = _royaltyRecipient;
            bps = new uint256[](1);
            bps[0] = _royaltyBps;
        }
        return (recipients, bps);
    }

    function getFeeRecipients(uint256) external view returns (address payable[] memory recipients) {
        if (_royaltyRecipient != address(0x0)) {
            recipients = new address payable[](1);
            recipients[0] = _royaltyRecipient;
        }
        return recipients;
    }

    function getFeeBps(uint256) external view returns (uint[] memory bps) {
        if (_royaltyRecipient != address(0x0)) {
            bps = new uint256[](1);
            bps[0] = _royaltyBps;
        }
        return bps;
    }

    function royaltyInfo(uint256, uint256 value) external view returns (address, uint256) {
        return (_royaltyRecipient, value*_royaltyBps/10000);
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721) returns (bool) {
        return ERC721.supportsInterface(interfaceId) || interfaceId == _INTERFACE_ID_ROYALTIES_CREATORCORE
               || interfaceId == _INTERFACE_ID_ROYALTIES_EIP2981 || interfaceId == _INTERFACE_ID_ROYALTIES_RARIBLE;
    }

     function uint2str(
      uint256 _i
    )
      internal
      pure
      returns (string memory str)
    {
      if (_i == 0)
      {
        return "0";
      }
      uint256 j = _i;
      uint256 length;
      while (j != 0)
      {
        length++;
        j /= 10;
      }
      bytes memory bstr = new bytes(length);
      uint256 k = length;
      j = _i;
      while (j != 0)
      {
        bstr[--k] = bytes1(uint8(48 + j % 10));
        j /= 10;
      }
      str = string(bstr);
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"stateMutability":"payable","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":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"count","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"paid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"}],"name":"Mint","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_address","type":"address"},{"indexed":false,"internalType":"uint256","name":"_bps","type":"uint256"}],"name":"UpdateRoyalty","type":"event"},{"inputs":[],"name":"MAX_ELEMENTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"creatorAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_count","type":"uint8"},{"internalType":"address","name":"_to","type":"address"}],"name":"creditCardMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getFeeBps","outputs":[{"internalType":"uint256[]","name":"bps","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getFeeRecipients","outputs":[{"internalType":"address payable[]","name":"recipients","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getRoyalties","outputs":[{"internalType":"address payable[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"bps","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"listOnly","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_count","type":"uint8"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"code","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"placeHolder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleOn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"salePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isOn","type":"bool"}],"name":"setListOnly","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isOn","type":"bool"}],"name":"setPlaceHolder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isOn","type":"bool"}],"name":"setSaleOn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_wlc","type":"uint256"}],"name":"setWlc","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":"_id","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalBought","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"recipient","type":"address"},{"internalType":"uint256","name":"bps","type":"uint256"}],"name":"updateRoyalties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526683734dd0b080006009556001600b60006101000a81548160ff0219169083151502179055506001600b60016101000a81548160ff0219169083151502179055506001600b60026101000a81548160ff021916908315150217905550610fa0600c556101f4600d5560405162005481380380620054818339818101604052810190620000919190620003a2565b6040518060400160405280601381526020017f4a2e20506965726365202620467269656e6473000000000000000000000000008152506040518060400160405280600381526020017f4a5046000000000000000000000000000000000000000000000000000000000081525081600090805190602001906200011592919062000280565b5080600190805190602001906200012e92919062000280565b5050506200015162000145620001b260201b60201c565b620001ba60201b60201c565b33600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600a9080519060200190620001aa92919062000280565b505062000518565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200028e9062000484565b90600052602060002090601f016020900481019282620002b25760008555620002fe565b82601f10620002cd57805160ff1916838001178555620002fe565b82800160010185558215620002fe579182015b82811115620002fd578251825591602001919060010190620002e0565b5b5090506200030d919062000311565b5090565b5b808211156200032c57600081600090555060010162000312565b5090565b60006200034762000341846200041b565b620003e7565b9050828152602081018484840111156200036057600080fd5b6200036d8482856200044e565b509392505050565b600082601f8301126200038757600080fd5b81516200039984826020860162000330565b91505092915050565b600060208284031215620003b557600080fd5b600082015167ffffffffffffffff811115620003d057600080fd5b620003de8482850162000375565b91505092915050565b6000604051905081810181811067ffffffffffffffff82111715620004115762000410620004e9565b5b8060405250919050565b600067ffffffffffffffff821115620004395762000438620004e9565b5b601f19601f8301169050602081019050919050565b60005b838110156200046e57808201518184015260208101905062000451565b838111156200047e576000848401525b50505050565b600060028204905060018216806200049d57607f821691505b60208210811415620004b457620004b3620004ba565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b614f5980620005286000396000f3fe6080604052600436106102465760003560e01c806370a0823111610139578063b88d4fde116100b6578063e927fc5c1161007a578063e927fc5c146108c6578063e985e9c5146108f1578063eb7c17531461092e578063eebab8ef14610957578063f2fde38b14610973578063f51f96dd1461099c57610246565b8063b88d4fde146107ba578063b9c4d9fb146107e3578063bb3bafd614610820578063c87b56dd1461085e578063d547cfb71461089b57610246565b80638e89457a116100fd5780638e89457a146106d557806391b7f5ed1461070057806395d89b41146107295780639b19251a14610754578063a22cb4651461079157610246565b806370a0823114610602578063715018a61461063f57806376bbedc514610656578063773ef1cf1461067f5780638da5cb5b146106aa57610246565b80632a53a7f0116101c75780634663b1b21161018b5780634663b1b21461050d5780634d66a2561461054a57806355f804b3146105735780636352211e1461059c5780636c2f5acd146105d957610246565b80632a53a7f0146104395780632a55205a146104645780633502a716146104a25780633ccfd60b146104cd57806342842e0e146104e457610246565b806318160ddd1161020e57806318160ddd146103565780631871aaeb146103815780631e960d20146103aa57806323b872dd146103d357806326a49e37146103fc57610246565b806301ffc9a71461024b57806306fdde0314610288578063081812fc146102b3578063095ea7b3146102f05780630ebd4c7f14610319575b600080fd5b34801561025757600080fd5b50610272600480360381019061026d91906138a8565b6109c7565b60405161027f91906145d3565b60405180910390f35b34801561029457600080fd5b5061029d610ac6565b6040516102aa91906145ee565b60405180910390f35b3480156102bf57600080fd5b506102da60048036038101906102d5919061393b565b610b58565b6040516102e791906144c8565b60405180910390f35b3480156102fc57600080fd5b5061031760048036038101906103129190613843565b610bdd565b005b34801561032557600080fd5b50610340600480360381019061033b919061393b565b610cf5565b60405161034d91906145b1565b60405180910390f35b34801561036257600080fd5b5061036b610e0e565b60405161037891906148f0565b60405180910390f35b34801561038d57600080fd5b506103a860048036038101906103a3919061387f565b610e1d565b005b3480156103b657600080fd5b506103d160048036038101906103cc919061387f565b610eb6565b005b3480156103df57600080fd5b506103fa60048036038101906103f5919061373d565b610f4f565b005b34801561040857600080fd5b50610423600480360381019061041e919061393b565b610faf565b60405161043091906148f0565b60405180910390f35b34801561044557600080fd5b5061044e610fcd565b60405161045b91906145d3565b60405180910390f35b34801561047057600080fd5b5061048b60048036038101906104869190613964565b610fe0565b60405161049992919061452f565b60405180910390f35b3480156104ae57600080fd5b506104b761102c565b6040516104c491906148f0565b60405180910390f35b3480156104d957600080fd5b506104e2611032565b005b3480156104f057600080fd5b5061050b6004803603810190610506919061373d565b61116a565b005b34801561051957600080fd5b50610534600480360381019061052f919061369c565b61118a565b604051610541919061490b565b60405180910390f35b34801561055657600080fd5b50610571600480360381019061056c91906139a0565b6111aa565b005b34801561057f57600080fd5b5061059a600480360381019061059591906138fa565b6113a3565b005b3480156105a857600080fd5b506105c360048036038101906105be919061393b565b611439565b6040516105d091906144c8565b60405180910390f35b3480156105e557600080fd5b5061060060048036038101906105fb91906136c5565b6114eb565b005b34801561060e57600080fd5b506106296004803603810190610624919061369c565b611601565b60405161063691906148f0565b60405180910390f35b34801561064b57600080fd5b506106546116b9565b005b34801561066257600080fd5b5061067d6004803603810190610678919061387f565b611741565b005b34801561068b57600080fd5b506106946117da565b6040516106a191906145d3565b60405180910390f35b3480156106b657600080fd5b506106bf6117ed565b6040516106cc91906144c8565b60405180910390f35b3480156106e157600080fd5b506106ea611817565b6040516106f791906145d3565b60405180910390f35b34801561070c57600080fd5b506107276004803603810190610722919061393b565b61182a565b005b34801561073557600080fd5b5061073e6118b0565b60405161074b91906145ee565b60405180910390f35b34801561076057600080fd5b5061077b6004803603810190610776919061369c565b611942565b60405161078891906145d3565b60405180910390f35b34801561079d57600080fd5b506107b860048036038101906107b39190613807565b611962565b005b3480156107c657600080fd5b506107e160048036038101906107dc919061378c565b611ae3565b005b3480156107ef57600080fd5b5061080a6004803603810190610805919061393b565b611b45565b6040516108179190614558565b60405180910390f35b34801561082c57600080fd5b506108476004803603810190610842919061393b565b611cac565b60405161085592919061457a565b60405180910390f35b34801561086a57600080fd5b506108856004803603810190610880919061393b565b611ecf565b60405161089291906145ee565b60405180910390f35b3480156108a757600080fd5b506108b0611fab565b6040516108bd91906145ee565b60405180910390f35b3480156108d257600080fd5b506108db612039565b6040516108e891906144c8565b60405180910390f35b3480156108fd57600080fd5b5061091860048036038101906109139190613701565b612051565b60405161092591906145d3565b60405180910390f35b34801561093a57600080fd5b506109556004803603810190610950919061393b565b6120e5565b005b610971600480360381019061096c91906139dc565b61216b565b005b34801561097f57600080fd5b5061099a6004803603810190610995919061369c565b61268f565b005b3480156109a857600080fd5b506109b1612787565b6040516109be91906148f0565b60405180910390f35b60006109d28261278d565b80610a21575063bb3bafd660e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a705750632a55205a60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610abf575063b779958460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060008054610ad590614d20565b80601f0160208091040260200160405190810160405280929190818152602001828054610b0190614d20565b8015610b4e5780601f10610b2357610100808354040283529160200191610b4e565b820191906000526020600020905b815481529060010190602001808311610b3157829003601f168201915b5050505050905090565b6000610b638261286f565b610ba2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b99906147f0565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610be882611439565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5090614890565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c786128db565b73ffffffffffffffffffffffffffffffffffffffff161480610ca75750610ca681610ca16128db565b612051565b5b610ce6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cdd90614730565b60405180910390fd5b610cf083836128e3565b505050565b6060600073ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610e0957600167ffffffffffffffff811115610d8e577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015610dbc5781602001602082028036833780820191505090505b509050600d5481600081518110610dfc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250505b919050565b6000610e1861299c565b905090565b610e256128db565b73ffffffffffffffffffffffffffffffffffffffff16610e436117ed565b73ffffffffffffffffffffffffffffffffffffffff1614610e99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9090614810565b60405180910390fd5b80600b60026101000a81548160ff02191690831515021790555050565b610ebe6128db565b73ffffffffffffffffffffffffffffffffffffffff16610edc6117ed565b73ffffffffffffffffffffffffffffffffffffffff1614610f32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2990614810565b60405180910390fd5b80600b60006101000a81548160ff02191690831515021790555050565b610f60610f5a6128db565b826129ad565b610f9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f96906148b0565b60405180910390fd5b610faa838383612a8b565b505050565b6000610fc682600954612ce790919063ffffffff16565b9050919050565b600b60029054906101000a900460ff1681565b600080600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612710600d54856110179190614b81565b6110219190614b50565b915091509250929050565b610fa081565b61103a6128db565b73ffffffffffffffffffffffffffffffffffffffff166110586117ed565b73ffffffffffffffffffffffffffffffffffffffff16146110ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a590614810565b60405180910390fd5b600047905060006110bd6117ed565b73ffffffffffffffffffffffffffffffffffffffff16826040516110e0906144b3565b60006040518083038185875af1925050503d806000811461111d576040519150601f19603f3d011682016040523d82523d6000602084013e611122565b606091505b5050905080611166576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115d90614670565b60405180910390fd5b5050565b61118583838360405180602001604052806000815250611ae3565b505050565b60106020528060005260406000206000915054906101000a900460ff1681565b610fa06111b561299c565b11156111f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ed906147d0565b60405180910390fd5b600b60019054906101000a900460ff16611245576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123c906146f0565b60405180910390fd5b61124d6128db565b73ffffffffffffffffffffffffffffffffffffffff1661126b6117ed565b73ffffffffffffffffffffffffffffffffffffffff16146112c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b890614810565b60405180910390fd5b60006112cb61299c565b905060006112e78460ff16600954612ce790919063ffffffff16565b9050610fa08460ff16836112fb9190614ac3565b111561133c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611333906146d0565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff167fb4c03061fb5b7fed76389d5af8f2e0ddb09f8c70d1333abbb62582835e10accb858360095460405161138893929190614926565b60405180910390a261139d8460ff1684612cfd565b50505050565b6113ab6128db565b73ffffffffffffffffffffffffffffffffffffffff166113c96117ed565b73ffffffffffffffffffffffffffffffffffffffff161461141f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141690614810565b60405180910390fd5b80600a9080519060200190611435929190613496565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156114e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d990614770565b60405180910390fd5b80915050919050565b6114f36128db565b73ffffffffffffffffffffffffffffffffffffffff166115116117ed565b73ffffffffffffffffffffffffffffffffffffffff1614611567576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155e90614810565b60405180910390fd5b81600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600d819055508173ffffffffffffffffffffffffffffffffffffffff167fa0a3764a6a020070a984037ddad31af783c92eae7581e99c957792d105717dd4826040516115f591906148f0565b60405180910390a25050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166990614750565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6116c16128db565b73ffffffffffffffffffffffffffffffffffffffff166116df6117ed565b73ffffffffffffffffffffffffffffffffffffffff1614611735576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172c90614810565b60405180910390fd5b61173f6000612d3d565b565b6117496128db565b73ffffffffffffffffffffffffffffffffffffffff166117676117ed565b73ffffffffffffffffffffffffffffffffffffffff16146117bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b490614810565b60405180910390fd5b80600b60016101000a81548160ff02191690831515021790555050565b600b60019054906101000a900460ff1681565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600b60009054906101000a900460ff1681565b6118326128db565b73ffffffffffffffffffffffffffffffffffffffff166118506117ed565b73ffffffffffffffffffffffffffffffffffffffff16146118a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189d90614810565b60405180910390fd5b8060098190555050565b6060600180546118bf90614d20565b80601f01602080910402602001604051908101604052809291908181526020018280546118eb90614d20565b80156119385780601f1061190d57610100808354040283529160200191611938565b820191906000526020600020905b81548152906001019060200180831161191b57829003601f168201915b5050505050905090565b600f6020528060005260406000206000915054906101000a900460ff1681565b61196a6128db565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119cf906146b0565b60405180910390fd5b80600560006119e56128db565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611a926128db565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611ad791906145d3565b60405180910390a35050565b611af4611aee6128db565b836129ad565b611b33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2a906148b0565b60405180910390fd5b611b3f84848484612e03565b50505050565b6060600073ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611ca757600167ffffffffffffffff811115611bde577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015611c0c5781602001602082028036833780820191505090505b509050600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600081518110611c6c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505b919050565b606080600073ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611eca57600167ffffffffffffffff811115611d46577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015611d745781602001602082028036833780820191505090505b509150600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682600081518110611dd4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600167ffffffffffffffff811115611e4f577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015611e7d5781602001602082028036833780820191505090505b509050600d5481600081518110611ebd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250505b915091565b6060600b60009054906101000a900460ff1615611f7857600a8054611ef390614d20565b80601f0160208091040260200160405190810160405280929190818152602001828054611f1f90614d20565b8015611f6c5780601f10611f4157610100808354040283529160200191611f6c565b820191906000526020600020905b815481529060010190602001808311611f4f57829003601f168201915b50505050509050611fa6565b600a611f8383612e5f565b604051602001611f94929190614484565b60405160208183030381529060405290505b919050565b600a8054611fb890614d20565b80601f0160208091040260200160405190810160405280929190818152602001828054611fe490614d20565b80156120315780601f1061200657610100808354040283529160200191612031565b820191906000526020600020905b81548152906001019060200180831161201457829003601f168201915b505050505081565b736c474099ad6d9af49201a38b9842111d4acd10bc81565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6120ed6128db565b73ffffffffffffffffffffffffffffffffffffffff1661210b6117ed565b73ffffffffffffffffffffffffffffffffffffffff1614612161576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215890614810565b60405180910390fd5b80600c8190555050565b610fa061217661299c565b11156121b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ae906147d0565b60405180910390fd5b600b60019054906101000a900460ff16612206576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121fd906146f0565b60405180910390fd5b600061221061299c565b9050600061222c8560ff16600954612ce790919063ffffffff16565b9050610fa08560ff16836122409190614ac3565b1115612281576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612278906146d0565b60405180910390fd5b61228d8560ff16610faf565b3410156122cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c690614870565b60405180910390fd5b600b60029054906101000a900460ff16156124da57600c548314612328576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231f906148d0565b60405180910390fd5b600585601060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166123829190614b19565b60ff16106123c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123bc90614790565b60405180910390fd5b84601060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661241d9190614b19565b601060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055506124818560ff1685612cfd565b8373ffffffffffffffffffffffffffffffffffffffff167fb4c03061fb5b7fed76389d5af8f2e0ddb09f8c70d1333abbb62582835e10accb86836009546040516124cd93929190614926565b60405180910390a2612688565b600d85601060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166125349190614b19565b60ff1610612577576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161256e90614850565b60405180910390fd5b84601060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166125cf9190614b19565b601060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055506126338560ff1685612cfd565b8373ffffffffffffffffffffffffffffffffffffffff167fb4c03061fb5b7fed76389d5af8f2e0ddb09f8c70d1333abbb62582835e10accb868360095460405161267f93929190614926565b60405180910390a25b5050505050565b6126976128db565b73ffffffffffffffffffffffffffffffffffffffff166126b56117ed565b73ffffffffffffffffffffffffffffffffffffffff161461270b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270290614810565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561277b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277290614630565b60405180910390fd5b61278481612d3d565b50565b60095481565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061285857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612868575061286782613012565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661295683611439565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006129a8600761307c565b905090565b60006129b88261286f565b6129f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129ee90614710565b60405180910390fd5b6000612a0283611439565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612a7157508373ffffffffffffffffffffffffffffffffffffffff16612a5984610b58565b73ffffffffffffffffffffffffffffffffffffffff16145b80612a825750612a818185612051565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612aab82611439565b73ffffffffffffffffffffffffffffffffffffffff1614612b01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612af890614830565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612b71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6890614690565b60405180910390fd5b612b7c83838361308a565b612b876000826128e3565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612bd79190614bdb565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612c2e9190614ac3565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008183612cf59190614b81565b905092915050565b60005b82811015612d3857612d12600761308f565b612d2582612d20600761307c565b6130a5565b8080612d3090614d52565b915050612d00565b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612e0e848484612a8b565b612e1a848484846130c3565b612e59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e5090614610565b60405180910390fd5b50505050565b60606000821415612ea7576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061300d565b600082905060005b60008214612ed9578080612ec290614d52565b915050600a82612ed29190614b50565b9150612eaf565b60008167ffffffffffffffff811115612f1b577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612f4d5781602001600182028036833780820191505090505b50905060008290508593505b6000841461300557600a84612f6e9190614d9b565b6030612f7a9190614ac3565b60f81b8282612f8890614cf6565b92508281518110612fc2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a84612ffe9190614b50565b9350612f59565b819450505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081600001549050919050565b505050565b6001816000016000828254019250508190555050565b6130bf82826040518060200160405280600081525061325a565b5050565b60006130e48473ffffffffffffffffffffffffffffffffffffffff166132b5565b1561324d578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261310d6128db565b8786866040518563ffffffff1660e01b815260040161312f94939291906144e3565b602060405180830381600087803b15801561314957600080fd5b505af192505050801561317a57506040513d601f19601f8201168201806040525081019061317791906138d1565b60015b6131fd573d80600081146131aa576040519150601f19603f3d011682016040523d82523d6000602084013e6131af565b606091505b506000815114156131f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131ec90614610565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613252565b600190505b949350505050565b61326483836132c8565b61327160008484846130c3565b6132b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132a790614610565b60405180910390fd5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613338576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161332f906147b0565b60405180910390fd5b6133418161286f565b15613381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161337890614650565b60405180910390fd5b61338d6000838361308a565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546133dd9190614ac3565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b8280546134a290614d20565b90600052602060002090601f0160209004810192826134c4576000855561350b565b82601f106134dd57805160ff191683800117855561350b565b8280016001018555821561350b579182015b8281111561350a5782518255916020019190600101906134ef565b5b509050613518919061351c565b5090565b5b8082111561353557600081600090555060010161351d565b5090565b600061354c6135478461498e565b61495d565b90508281526020810184848401111561356457600080fd5b61356f848285614cb4565b509392505050565b600061358a613585846149be565b61495d565b9050828152602081018484840111156135a257600080fd5b6135ad848285614cb4565b509392505050565b6000813590506135c481614e99565b92915050565b6000813590506135d981614eb0565b92915050565b6000813590506135ee81614ec7565b92915050565b60008135905061360381614ede565b92915050565b60008151905061361881614ede565b92915050565b600082601f83011261362f57600080fd5b813561363f848260208601613539565b91505092915050565b600082601f83011261365957600080fd5b8135613669848260208601613577565b91505092915050565b60008135905061368181614ef5565b92915050565b60008135905061369681614f0c565b92915050565b6000602082840312156136ae57600080fd5b60006136bc848285016135b5565b91505092915050565b600080604083850312156136d857600080fd5b60006136e6858286016135ca565b92505060206136f785828601613672565b9150509250929050565b6000806040838503121561371457600080fd5b6000613722858286016135b5565b9250506020613733858286016135b5565b9150509250929050565b60008060006060848603121561375257600080fd5b6000613760868287016135b5565b9350506020613771868287016135b5565b925050604061378286828701613672565b9150509250925092565b600080600080608085870312156137a257600080fd5b60006137b0878288016135b5565b94505060206137c1878288016135b5565b93505060406137d287828801613672565b925050606085013567ffffffffffffffff8111156137ef57600080fd5b6137fb8782880161361e565b91505092959194509250565b6000806040838503121561381a57600080fd5b6000613828858286016135b5565b9250506020613839858286016135df565b9150509250929050565b6000806040838503121561385657600080fd5b6000613864858286016135b5565b925050602061387585828601613672565b9150509250929050565b60006020828403121561389157600080fd5b600061389f848285016135df565b91505092915050565b6000602082840312156138ba57600080fd5b60006138c8848285016135f4565b91505092915050565b6000602082840312156138e357600080fd5b60006138f184828501613609565b91505092915050565b60006020828403121561390c57600080fd5b600082013567ffffffffffffffff81111561392657600080fd5b61393284828501613648565b91505092915050565b60006020828403121561394d57600080fd5b600061395b84828501613672565b91505092915050565b6000806040838503121561397757600080fd5b600061398585828601613672565b925050602061399685828601613672565b9150509250929050565b600080604083850312156139b357600080fd5b60006139c185828601613687565b92505060206139d2858286016135b5565b9150509250929050565b6000806000606084860312156139f157600080fd5b60006139ff86828701613687565b9350506020613a10868287016135b5565b9250506040613a2186828701613672565b9150509250925092565b6000613a378383613a5b565b60208301905092915050565b6000613a4f8383614448565b60208301905092915050565b613a6481614c21565b82525050565b613a7381614c0f565b82525050565b6000613a8482614a23565b613a8e8185614a69565b9350613a99836149ee565b8060005b83811015613aca578151613ab18882613a2b565b9750613abc83614a4f565b925050600181019050613a9d565b5085935050505092915050565b6000613ae282614a2e565b613aec8185614a7a565b9350613af7836149fe565b8060005b83811015613b28578151613b0f8882613a43565b9750613b1a83614a5c565b925050600181019050613afb565b5085935050505092915050565b613b3e81614c33565b82525050565b6000613b4f82614a39565b613b598185614a8b565b9350613b69818560208601614cc3565b613b7281614e88565b840191505092915050565b6000613b8882614a44565b613b928185614aa7565b9350613ba2818560208601614cc3565b613bab81614e88565b840191505092915050565b6000613bc182614a44565b613bcb8185614ab8565b9350613bdb818560208601614cc3565b80840191505092915050565b60008154613bf481614d20565b613bfe8186614ab8565b94506001821660008114613c195760018114613c2a57613c5d565b60ff19831686528186019350613c5d565b613c3385614a0e565b60005b83811015613c5557815481890152600182019150602081019050613c36565b838801955050505b50505092915050565b6000613c73603283614aa7565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000613cd9602683614aa7565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613d3f601c83614aa7565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613d7f601483614aa7565b91507f4661696c656420746f2073656e642045746865720000000000000000000000006000830152602082019050919050565b6000613dbf602483614aa7565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613e25601983614aa7565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613e65600983614aa7565b91507f4d6178206c696d697400000000000000000000000000000000000000000000006000830152602082019050919050565b6000613ea5601283614aa7565b91507f53616c65206861736e74207374617274656400000000000000000000000000006000830152602082019050919050565b6000613ee5602c83614aa7565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613f4b603883614aa7565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613fb1602a83614aa7565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000614017602983614aa7565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061407d601e83614aa7565b91507f4d41582057484954454c49535420414d4f554e542050555243484153454400006000830152602082019050919050565b60006140bd602083614aa7565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b60006140fd600883614aa7565b91507f53616c6520656e640000000000000000000000000000000000000000000000006000830152602082019050919050565b600061413d602c83614aa7565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006141a3600583614ab8565b91507f2e6a736f6e0000000000000000000000000000000000000000000000000000006000830152600582019050919050565b60006141e3602083614aa7565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614223602983614aa7565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614289602183614aa7565b91507f4d41582047454e4552414c2053414c4520414d4f554e5420505552434841534560008301527f44000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006142ef601183614aa7565b91507f56616c75652062656c6f772070726963650000000000000000000000000000006000830152602082019050919050565b600061432f602183614aa7565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614395600083614a9c565b9150600082019050919050565b60006143af603183614aa7565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000614415601783614aa7565b91507f53656e646572206e6f74206f6e2077686974656c6973740000000000000000006000830152602082019050919050565b61445181614c8b565b82525050565b61446081614c8b565b82525050565b61446f81614ca2565b82525050565b61447e81614c95565b82525050565b60006144908285613be7565b915061449c8284613bb6565b91506144a782614196565b91508190509392505050565b60006144be82614388565b9150819050919050565b60006020820190506144dd6000830184613a6a565b92915050565b60006080820190506144f86000830187613a6a565b6145056020830186613a6a565b6145126040830185614457565b81810360608301526145248184613b44565b905095945050505050565b60006040820190506145446000830185613a6a565b6145516020830184614457565b9392505050565b600060208201905081810360008301526145728184613a79565b905092915050565b600060408201905081810360008301526145948185613a79565b905081810360208301526145a88184613ad7565b90509392505050565b600060208201905081810360008301526145cb8184613ad7565b905092915050565b60006020820190506145e86000830184613b35565b92915050565b600060208201905081810360008301526146088184613b7d565b905092915050565b6000602082019050818103600083015261462981613c66565b9050919050565b6000602082019050818103600083015261464981613ccc565b9050919050565b6000602082019050818103600083015261466981613d32565b9050919050565b6000602082019050818103600083015261468981613d72565b9050919050565b600060208201905081810360008301526146a981613db2565b9050919050565b600060208201905081810360008301526146c981613e18565b9050919050565b600060208201905081810360008301526146e981613e58565b9050919050565b6000602082019050818103600083015261470981613e98565b9050919050565b6000602082019050818103600083015261472981613ed8565b9050919050565b6000602082019050818103600083015261474981613f3e565b9050919050565b6000602082019050818103600083015261476981613fa4565b9050919050565b600060208201905081810360008301526147898161400a565b9050919050565b600060208201905081810360008301526147a981614070565b9050919050565b600060208201905081810360008301526147c9816140b0565b9050919050565b600060208201905081810360008301526147e9816140f0565b9050919050565b6000602082019050818103600083015261480981614130565b9050919050565b60006020820190508181036000830152614829816141d6565b9050919050565b6000602082019050818103600083015261484981614216565b9050919050565b600060208201905081810360008301526148698161427c565b9050919050565b60006020820190508181036000830152614889816142e2565b9050919050565b600060208201905081810360008301526148a981614322565b9050919050565b600060208201905081810360008301526148c9816143a2565b9050919050565b600060208201905081810360008301526148e981614408565b9050919050565b60006020820190506149056000830184614457565b92915050565b60006020820190506149206000830184614475565b92915050565b600060608201905061493b6000830186614466565b6149486020830185614457565b6149556040830184614457565b949350505050565b6000604051905081810181811067ffffffffffffffff8211171561498457614983614e59565b5b8060405250919050565b600067ffffffffffffffff8211156149a9576149a8614e59565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156149d9576149d8614e59565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614ace82614c8b565b9150614ad983614c8b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614b0e57614b0d614dcc565b5b828201905092915050565b6000614b2482614c95565b9150614b2f83614c95565b92508260ff03821115614b4557614b44614dcc565b5b828201905092915050565b6000614b5b82614c8b565b9150614b6683614c8b565b925082614b7657614b75614dfb565b5b828204905092915050565b6000614b8c82614c8b565b9150614b9783614c8b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614bd057614bcf614dcc565b5b828202905092915050565b6000614be682614c8b565b9150614bf183614c8b565b925082821015614c0457614c03614dcc565b5b828203905092915050565b6000614c1a82614c6b565b9050919050565b6000614c2c82614c6b565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000614cad82614c95565b9050919050565b82818337600083830152505050565b60005b83811015614ce1578082015181840152602081019050614cc6565b83811115614cf0576000848401525b50505050565b6000614d0182614c8b565b91506000821415614d1557614d14614dcc565b5b600182039050919050565b60006002820490506001821680614d3857607f821691505b60208210811415614d4c57614d4b614e2a565b5b50919050565b6000614d5d82614c8b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614d9057614d8f614dcc565b5b600182019050919050565b6000614da682614c8b565b9150614db183614c8b565b925082614dc157614dc0614dfb565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b614ea281614c0f565b8114614ead57600080fd5b50565b614eb981614c21565b8114614ec457600080fd5b50565b614ed081614c33565b8114614edb57600080fd5b50565b614ee781614c3f565b8114614ef257600080fd5b50565b614efe81614c8b565b8114614f0957600080fd5b50565b614f1581614c95565b8114614f2057600080fd5b5056fea2646970667358221220327342c26e4311f78fa2b6b056476c26fc567aa663743e220575714fa19536a864736f6c634300080000330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000005068747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d515a573369524561664736797477386a666345436d737a766b547478536f5a3145755a5257587a677242356f00000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102465760003560e01c806370a0823111610139578063b88d4fde116100b6578063e927fc5c1161007a578063e927fc5c146108c6578063e985e9c5146108f1578063eb7c17531461092e578063eebab8ef14610957578063f2fde38b14610973578063f51f96dd1461099c57610246565b8063b88d4fde146107ba578063b9c4d9fb146107e3578063bb3bafd614610820578063c87b56dd1461085e578063d547cfb71461089b57610246565b80638e89457a116100fd5780638e89457a146106d557806391b7f5ed1461070057806395d89b41146107295780639b19251a14610754578063a22cb4651461079157610246565b806370a0823114610602578063715018a61461063f57806376bbedc514610656578063773ef1cf1461067f5780638da5cb5b146106aa57610246565b80632a53a7f0116101c75780634663b1b21161018b5780634663b1b21461050d5780634d66a2561461054a57806355f804b3146105735780636352211e1461059c5780636c2f5acd146105d957610246565b80632a53a7f0146104395780632a55205a146104645780633502a716146104a25780633ccfd60b146104cd57806342842e0e146104e457610246565b806318160ddd1161020e57806318160ddd146103565780631871aaeb146103815780631e960d20146103aa57806323b872dd146103d357806326a49e37146103fc57610246565b806301ffc9a71461024b57806306fdde0314610288578063081812fc146102b3578063095ea7b3146102f05780630ebd4c7f14610319575b600080fd5b34801561025757600080fd5b50610272600480360381019061026d91906138a8565b6109c7565b60405161027f91906145d3565b60405180910390f35b34801561029457600080fd5b5061029d610ac6565b6040516102aa91906145ee565b60405180910390f35b3480156102bf57600080fd5b506102da60048036038101906102d5919061393b565b610b58565b6040516102e791906144c8565b60405180910390f35b3480156102fc57600080fd5b5061031760048036038101906103129190613843565b610bdd565b005b34801561032557600080fd5b50610340600480360381019061033b919061393b565b610cf5565b60405161034d91906145b1565b60405180910390f35b34801561036257600080fd5b5061036b610e0e565b60405161037891906148f0565b60405180910390f35b34801561038d57600080fd5b506103a860048036038101906103a3919061387f565b610e1d565b005b3480156103b657600080fd5b506103d160048036038101906103cc919061387f565b610eb6565b005b3480156103df57600080fd5b506103fa60048036038101906103f5919061373d565b610f4f565b005b34801561040857600080fd5b50610423600480360381019061041e919061393b565b610faf565b60405161043091906148f0565b60405180910390f35b34801561044557600080fd5b5061044e610fcd565b60405161045b91906145d3565b60405180910390f35b34801561047057600080fd5b5061048b60048036038101906104869190613964565b610fe0565b60405161049992919061452f565b60405180910390f35b3480156104ae57600080fd5b506104b761102c565b6040516104c491906148f0565b60405180910390f35b3480156104d957600080fd5b506104e2611032565b005b3480156104f057600080fd5b5061050b6004803603810190610506919061373d565b61116a565b005b34801561051957600080fd5b50610534600480360381019061052f919061369c565b61118a565b604051610541919061490b565b60405180910390f35b34801561055657600080fd5b50610571600480360381019061056c91906139a0565b6111aa565b005b34801561057f57600080fd5b5061059a600480360381019061059591906138fa565b6113a3565b005b3480156105a857600080fd5b506105c360048036038101906105be919061393b565b611439565b6040516105d091906144c8565b60405180910390f35b3480156105e557600080fd5b5061060060048036038101906105fb91906136c5565b6114eb565b005b34801561060e57600080fd5b506106296004803603810190610624919061369c565b611601565b60405161063691906148f0565b60405180910390f35b34801561064b57600080fd5b506106546116b9565b005b34801561066257600080fd5b5061067d6004803603810190610678919061387f565b611741565b005b34801561068b57600080fd5b506106946117da565b6040516106a191906145d3565b60405180910390f35b3480156106b657600080fd5b506106bf6117ed565b6040516106cc91906144c8565b60405180910390f35b3480156106e157600080fd5b506106ea611817565b6040516106f791906145d3565b60405180910390f35b34801561070c57600080fd5b506107276004803603810190610722919061393b565b61182a565b005b34801561073557600080fd5b5061073e6118b0565b60405161074b91906145ee565b60405180910390f35b34801561076057600080fd5b5061077b6004803603810190610776919061369c565b611942565b60405161078891906145d3565b60405180910390f35b34801561079d57600080fd5b506107b860048036038101906107b39190613807565b611962565b005b3480156107c657600080fd5b506107e160048036038101906107dc919061378c565b611ae3565b005b3480156107ef57600080fd5b5061080a6004803603810190610805919061393b565b611b45565b6040516108179190614558565b60405180910390f35b34801561082c57600080fd5b506108476004803603810190610842919061393b565b611cac565b60405161085592919061457a565b60405180910390f35b34801561086a57600080fd5b506108856004803603810190610880919061393b565b611ecf565b60405161089291906145ee565b60405180910390f35b3480156108a757600080fd5b506108b0611fab565b6040516108bd91906145ee565b60405180910390f35b3480156108d257600080fd5b506108db612039565b6040516108e891906144c8565b60405180910390f35b3480156108fd57600080fd5b5061091860048036038101906109139190613701565b612051565b60405161092591906145d3565b60405180910390f35b34801561093a57600080fd5b506109556004803603810190610950919061393b565b6120e5565b005b610971600480360381019061096c91906139dc565b61216b565b005b34801561097f57600080fd5b5061099a6004803603810190610995919061369c565b61268f565b005b3480156109a857600080fd5b506109b1612787565b6040516109be91906148f0565b60405180910390f35b60006109d28261278d565b80610a21575063bb3bafd660e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a705750632a55205a60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610abf575063b779958460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060008054610ad590614d20565b80601f0160208091040260200160405190810160405280929190818152602001828054610b0190614d20565b8015610b4e5780601f10610b2357610100808354040283529160200191610b4e565b820191906000526020600020905b815481529060010190602001808311610b3157829003601f168201915b5050505050905090565b6000610b638261286f565b610ba2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b99906147f0565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610be882611439565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5090614890565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c786128db565b73ffffffffffffffffffffffffffffffffffffffff161480610ca75750610ca681610ca16128db565b612051565b5b610ce6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cdd90614730565b60405180910390fd5b610cf083836128e3565b505050565b6060600073ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610e0957600167ffffffffffffffff811115610d8e577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015610dbc5781602001602082028036833780820191505090505b509050600d5481600081518110610dfc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250505b919050565b6000610e1861299c565b905090565b610e256128db565b73ffffffffffffffffffffffffffffffffffffffff16610e436117ed565b73ffffffffffffffffffffffffffffffffffffffff1614610e99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9090614810565b60405180910390fd5b80600b60026101000a81548160ff02191690831515021790555050565b610ebe6128db565b73ffffffffffffffffffffffffffffffffffffffff16610edc6117ed565b73ffffffffffffffffffffffffffffffffffffffff1614610f32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2990614810565b60405180910390fd5b80600b60006101000a81548160ff02191690831515021790555050565b610f60610f5a6128db565b826129ad565b610f9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f96906148b0565b60405180910390fd5b610faa838383612a8b565b505050565b6000610fc682600954612ce790919063ffffffff16565b9050919050565b600b60029054906101000a900460ff1681565b600080600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612710600d54856110179190614b81565b6110219190614b50565b915091509250929050565b610fa081565b61103a6128db565b73ffffffffffffffffffffffffffffffffffffffff166110586117ed565b73ffffffffffffffffffffffffffffffffffffffff16146110ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a590614810565b60405180910390fd5b600047905060006110bd6117ed565b73ffffffffffffffffffffffffffffffffffffffff16826040516110e0906144b3565b60006040518083038185875af1925050503d806000811461111d576040519150601f19603f3d011682016040523d82523d6000602084013e611122565b606091505b5050905080611166576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115d90614670565b60405180910390fd5b5050565b61118583838360405180602001604052806000815250611ae3565b505050565b60106020528060005260406000206000915054906101000a900460ff1681565b610fa06111b561299c565b11156111f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ed906147d0565b60405180910390fd5b600b60019054906101000a900460ff16611245576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123c906146f0565b60405180910390fd5b61124d6128db565b73ffffffffffffffffffffffffffffffffffffffff1661126b6117ed565b73ffffffffffffffffffffffffffffffffffffffff16146112c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b890614810565b60405180910390fd5b60006112cb61299c565b905060006112e78460ff16600954612ce790919063ffffffff16565b9050610fa08460ff16836112fb9190614ac3565b111561133c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611333906146d0565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff167fb4c03061fb5b7fed76389d5af8f2e0ddb09f8c70d1333abbb62582835e10accb858360095460405161138893929190614926565b60405180910390a261139d8460ff1684612cfd565b50505050565b6113ab6128db565b73ffffffffffffffffffffffffffffffffffffffff166113c96117ed565b73ffffffffffffffffffffffffffffffffffffffff161461141f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141690614810565b60405180910390fd5b80600a9080519060200190611435929190613496565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156114e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d990614770565b60405180910390fd5b80915050919050565b6114f36128db565b73ffffffffffffffffffffffffffffffffffffffff166115116117ed565b73ffffffffffffffffffffffffffffffffffffffff1614611567576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155e90614810565b60405180910390fd5b81600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600d819055508173ffffffffffffffffffffffffffffffffffffffff167fa0a3764a6a020070a984037ddad31af783c92eae7581e99c957792d105717dd4826040516115f591906148f0565b60405180910390a25050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166990614750565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6116c16128db565b73ffffffffffffffffffffffffffffffffffffffff166116df6117ed565b73ffffffffffffffffffffffffffffffffffffffff1614611735576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172c90614810565b60405180910390fd5b61173f6000612d3d565b565b6117496128db565b73ffffffffffffffffffffffffffffffffffffffff166117676117ed565b73ffffffffffffffffffffffffffffffffffffffff16146117bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b490614810565b60405180910390fd5b80600b60016101000a81548160ff02191690831515021790555050565b600b60019054906101000a900460ff1681565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600b60009054906101000a900460ff1681565b6118326128db565b73ffffffffffffffffffffffffffffffffffffffff166118506117ed565b73ffffffffffffffffffffffffffffffffffffffff16146118a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189d90614810565b60405180910390fd5b8060098190555050565b6060600180546118bf90614d20565b80601f01602080910402602001604051908101604052809291908181526020018280546118eb90614d20565b80156119385780601f1061190d57610100808354040283529160200191611938565b820191906000526020600020905b81548152906001019060200180831161191b57829003601f168201915b5050505050905090565b600f6020528060005260406000206000915054906101000a900460ff1681565b61196a6128db565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119cf906146b0565b60405180910390fd5b80600560006119e56128db565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611a926128db565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611ad791906145d3565b60405180910390a35050565b611af4611aee6128db565b836129ad565b611b33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2a906148b0565b60405180910390fd5b611b3f84848484612e03565b50505050565b6060600073ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611ca757600167ffffffffffffffff811115611bde577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015611c0c5781602001602082028036833780820191505090505b509050600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600081518110611c6c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505b919050565b606080600073ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611eca57600167ffffffffffffffff811115611d46577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015611d745781602001602082028036833780820191505090505b509150600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682600081518110611dd4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600167ffffffffffffffff811115611e4f577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015611e7d5781602001602082028036833780820191505090505b509050600d5481600081518110611ebd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250505b915091565b6060600b60009054906101000a900460ff1615611f7857600a8054611ef390614d20565b80601f0160208091040260200160405190810160405280929190818152602001828054611f1f90614d20565b8015611f6c5780601f10611f4157610100808354040283529160200191611f6c565b820191906000526020600020905b815481529060010190602001808311611f4f57829003601f168201915b50505050509050611fa6565b600a611f8383612e5f565b604051602001611f94929190614484565b60405160208183030381529060405290505b919050565b600a8054611fb890614d20565b80601f0160208091040260200160405190810160405280929190818152602001828054611fe490614d20565b80156120315780601f1061200657610100808354040283529160200191612031565b820191906000526020600020905b81548152906001019060200180831161201457829003601f168201915b505050505081565b736c474099ad6d9af49201a38b9842111d4acd10bc81565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6120ed6128db565b73ffffffffffffffffffffffffffffffffffffffff1661210b6117ed565b73ffffffffffffffffffffffffffffffffffffffff1614612161576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215890614810565b60405180910390fd5b80600c8190555050565b610fa061217661299c565b11156121b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ae906147d0565b60405180910390fd5b600b60019054906101000a900460ff16612206576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121fd906146f0565b60405180910390fd5b600061221061299c565b9050600061222c8560ff16600954612ce790919063ffffffff16565b9050610fa08560ff16836122409190614ac3565b1115612281576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612278906146d0565b60405180910390fd5b61228d8560ff16610faf565b3410156122cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c690614870565b60405180910390fd5b600b60029054906101000a900460ff16156124da57600c548314612328576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231f906148d0565b60405180910390fd5b600585601060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166123829190614b19565b60ff16106123c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123bc90614790565b60405180910390fd5b84601060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661241d9190614b19565b601060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055506124818560ff1685612cfd565b8373ffffffffffffffffffffffffffffffffffffffff167fb4c03061fb5b7fed76389d5af8f2e0ddb09f8c70d1333abbb62582835e10accb86836009546040516124cd93929190614926565b60405180910390a2612688565b600d85601060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166125349190614b19565b60ff1610612577576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161256e90614850565b60405180910390fd5b84601060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166125cf9190614b19565b601060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055506126338560ff1685612cfd565b8373ffffffffffffffffffffffffffffffffffffffff167fb4c03061fb5b7fed76389d5af8f2e0ddb09f8c70d1333abbb62582835e10accb868360095460405161267f93929190614926565b60405180910390a25b5050505050565b6126976128db565b73ffffffffffffffffffffffffffffffffffffffff166126b56117ed565b73ffffffffffffffffffffffffffffffffffffffff161461270b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270290614810565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561277b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277290614630565b60405180910390fd5b61278481612d3d565b50565b60095481565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061285857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612868575061286782613012565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661295683611439565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006129a8600761307c565b905090565b60006129b88261286f565b6129f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129ee90614710565b60405180910390fd5b6000612a0283611439565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612a7157508373ffffffffffffffffffffffffffffffffffffffff16612a5984610b58565b73ffffffffffffffffffffffffffffffffffffffff16145b80612a825750612a818185612051565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612aab82611439565b73ffffffffffffffffffffffffffffffffffffffff1614612b01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612af890614830565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612b71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6890614690565b60405180910390fd5b612b7c83838361308a565b612b876000826128e3565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612bd79190614bdb565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612c2e9190614ac3565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008183612cf59190614b81565b905092915050565b60005b82811015612d3857612d12600761308f565b612d2582612d20600761307c565b6130a5565b8080612d3090614d52565b915050612d00565b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612e0e848484612a8b565b612e1a848484846130c3565b612e59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e5090614610565b60405180910390fd5b50505050565b60606000821415612ea7576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061300d565b600082905060005b60008214612ed9578080612ec290614d52565b915050600a82612ed29190614b50565b9150612eaf565b60008167ffffffffffffffff811115612f1b577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612f4d5781602001600182028036833780820191505090505b50905060008290508593505b6000841461300557600a84612f6e9190614d9b565b6030612f7a9190614ac3565b60f81b8282612f8890614cf6565b92508281518110612fc2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a84612ffe9190614b50565b9350612f59565b819450505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081600001549050919050565b505050565b6001816000016000828254019250508190555050565b6130bf82826040518060200160405280600081525061325a565b5050565b60006130e48473ffffffffffffffffffffffffffffffffffffffff166132b5565b1561324d578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261310d6128db565b8786866040518563ffffffff1660e01b815260040161312f94939291906144e3565b602060405180830381600087803b15801561314957600080fd5b505af192505050801561317a57506040513d601f19601f8201168201806040525081019061317791906138d1565b60015b6131fd573d80600081146131aa576040519150601f19603f3d011682016040523d82523d6000602084013e6131af565b606091505b506000815114156131f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131ec90614610565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613252565b600190505b949350505050565b61326483836132c8565b61327160008484846130c3565b6132b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132a790614610565b60405180910390fd5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613338576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161332f906147b0565b60405180910390fd5b6133418161286f565b15613381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161337890614650565b60405180910390fd5b61338d6000838361308a565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546133dd9190614ac3565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b8280546134a290614d20565b90600052602060002090601f0160209004810192826134c4576000855561350b565b82601f106134dd57805160ff191683800117855561350b565b8280016001018555821561350b579182015b8281111561350a5782518255916020019190600101906134ef565b5b509050613518919061351c565b5090565b5b8082111561353557600081600090555060010161351d565b5090565b600061354c6135478461498e565b61495d565b90508281526020810184848401111561356457600080fd5b61356f848285614cb4565b509392505050565b600061358a613585846149be565b61495d565b9050828152602081018484840111156135a257600080fd5b6135ad848285614cb4565b509392505050565b6000813590506135c481614e99565b92915050565b6000813590506135d981614eb0565b92915050565b6000813590506135ee81614ec7565b92915050565b60008135905061360381614ede565b92915050565b60008151905061361881614ede565b92915050565b600082601f83011261362f57600080fd5b813561363f848260208601613539565b91505092915050565b600082601f83011261365957600080fd5b8135613669848260208601613577565b91505092915050565b60008135905061368181614ef5565b92915050565b60008135905061369681614f0c565b92915050565b6000602082840312156136ae57600080fd5b60006136bc848285016135b5565b91505092915050565b600080604083850312156136d857600080fd5b60006136e6858286016135ca565b92505060206136f785828601613672565b9150509250929050565b6000806040838503121561371457600080fd5b6000613722858286016135b5565b9250506020613733858286016135b5565b9150509250929050565b60008060006060848603121561375257600080fd5b6000613760868287016135b5565b9350506020613771868287016135b5565b925050604061378286828701613672565b9150509250925092565b600080600080608085870312156137a257600080fd5b60006137b0878288016135b5565b94505060206137c1878288016135b5565b93505060406137d287828801613672565b925050606085013567ffffffffffffffff8111156137ef57600080fd5b6137fb8782880161361e565b91505092959194509250565b6000806040838503121561381a57600080fd5b6000613828858286016135b5565b9250506020613839858286016135df565b9150509250929050565b6000806040838503121561385657600080fd5b6000613864858286016135b5565b925050602061387585828601613672565b9150509250929050565b60006020828403121561389157600080fd5b600061389f848285016135df565b91505092915050565b6000602082840312156138ba57600080fd5b60006138c8848285016135f4565b91505092915050565b6000602082840312156138e357600080fd5b60006138f184828501613609565b91505092915050565b60006020828403121561390c57600080fd5b600082013567ffffffffffffffff81111561392657600080fd5b61393284828501613648565b91505092915050565b60006020828403121561394d57600080fd5b600061395b84828501613672565b91505092915050565b6000806040838503121561397757600080fd5b600061398585828601613672565b925050602061399685828601613672565b9150509250929050565b600080604083850312156139b357600080fd5b60006139c185828601613687565b92505060206139d2858286016135b5565b9150509250929050565b6000806000606084860312156139f157600080fd5b60006139ff86828701613687565b9350506020613a10868287016135b5565b9250506040613a2186828701613672565b9150509250925092565b6000613a378383613a5b565b60208301905092915050565b6000613a4f8383614448565b60208301905092915050565b613a6481614c21565b82525050565b613a7381614c0f565b82525050565b6000613a8482614a23565b613a8e8185614a69565b9350613a99836149ee565b8060005b83811015613aca578151613ab18882613a2b565b9750613abc83614a4f565b925050600181019050613a9d565b5085935050505092915050565b6000613ae282614a2e565b613aec8185614a7a565b9350613af7836149fe565b8060005b83811015613b28578151613b0f8882613a43565b9750613b1a83614a5c565b925050600181019050613afb565b5085935050505092915050565b613b3e81614c33565b82525050565b6000613b4f82614a39565b613b598185614a8b565b9350613b69818560208601614cc3565b613b7281614e88565b840191505092915050565b6000613b8882614a44565b613b928185614aa7565b9350613ba2818560208601614cc3565b613bab81614e88565b840191505092915050565b6000613bc182614a44565b613bcb8185614ab8565b9350613bdb818560208601614cc3565b80840191505092915050565b60008154613bf481614d20565b613bfe8186614ab8565b94506001821660008114613c195760018114613c2a57613c5d565b60ff19831686528186019350613c5d565b613c3385614a0e565b60005b83811015613c5557815481890152600182019150602081019050613c36565b838801955050505b50505092915050565b6000613c73603283614aa7565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000613cd9602683614aa7565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613d3f601c83614aa7565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613d7f601483614aa7565b91507f4661696c656420746f2073656e642045746865720000000000000000000000006000830152602082019050919050565b6000613dbf602483614aa7565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613e25601983614aa7565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613e65600983614aa7565b91507f4d6178206c696d697400000000000000000000000000000000000000000000006000830152602082019050919050565b6000613ea5601283614aa7565b91507f53616c65206861736e74207374617274656400000000000000000000000000006000830152602082019050919050565b6000613ee5602c83614aa7565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613f4b603883614aa7565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613fb1602a83614aa7565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000614017602983614aa7565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061407d601e83614aa7565b91507f4d41582057484954454c49535420414d4f554e542050555243484153454400006000830152602082019050919050565b60006140bd602083614aa7565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b60006140fd600883614aa7565b91507f53616c6520656e640000000000000000000000000000000000000000000000006000830152602082019050919050565b600061413d602c83614aa7565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006141a3600583614ab8565b91507f2e6a736f6e0000000000000000000000000000000000000000000000000000006000830152600582019050919050565b60006141e3602083614aa7565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614223602983614aa7565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614289602183614aa7565b91507f4d41582047454e4552414c2053414c4520414d4f554e5420505552434841534560008301527f44000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006142ef601183614aa7565b91507f56616c75652062656c6f772070726963650000000000000000000000000000006000830152602082019050919050565b600061432f602183614aa7565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614395600083614a9c565b9150600082019050919050565b60006143af603183614aa7565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000614415601783614aa7565b91507f53656e646572206e6f74206f6e2077686974656c6973740000000000000000006000830152602082019050919050565b61445181614c8b565b82525050565b61446081614c8b565b82525050565b61446f81614ca2565b82525050565b61447e81614c95565b82525050565b60006144908285613be7565b915061449c8284613bb6565b91506144a782614196565b91508190509392505050565b60006144be82614388565b9150819050919050565b60006020820190506144dd6000830184613a6a565b92915050565b60006080820190506144f86000830187613a6a565b6145056020830186613a6a565b6145126040830185614457565b81810360608301526145248184613b44565b905095945050505050565b60006040820190506145446000830185613a6a565b6145516020830184614457565b9392505050565b600060208201905081810360008301526145728184613a79565b905092915050565b600060408201905081810360008301526145948185613a79565b905081810360208301526145a88184613ad7565b90509392505050565b600060208201905081810360008301526145cb8184613ad7565b905092915050565b60006020820190506145e86000830184613b35565b92915050565b600060208201905081810360008301526146088184613b7d565b905092915050565b6000602082019050818103600083015261462981613c66565b9050919050565b6000602082019050818103600083015261464981613ccc565b9050919050565b6000602082019050818103600083015261466981613d32565b9050919050565b6000602082019050818103600083015261468981613d72565b9050919050565b600060208201905081810360008301526146a981613db2565b9050919050565b600060208201905081810360008301526146c981613e18565b9050919050565b600060208201905081810360008301526146e981613e58565b9050919050565b6000602082019050818103600083015261470981613e98565b9050919050565b6000602082019050818103600083015261472981613ed8565b9050919050565b6000602082019050818103600083015261474981613f3e565b9050919050565b6000602082019050818103600083015261476981613fa4565b9050919050565b600060208201905081810360008301526147898161400a565b9050919050565b600060208201905081810360008301526147a981614070565b9050919050565b600060208201905081810360008301526147c9816140b0565b9050919050565b600060208201905081810360008301526147e9816140f0565b9050919050565b6000602082019050818103600083015261480981614130565b9050919050565b60006020820190508181036000830152614829816141d6565b9050919050565b6000602082019050818103600083015261484981614216565b9050919050565b600060208201905081810360008301526148698161427c565b9050919050565b60006020820190508181036000830152614889816142e2565b9050919050565b600060208201905081810360008301526148a981614322565b9050919050565b600060208201905081810360008301526148c9816143a2565b9050919050565b600060208201905081810360008301526148e981614408565b9050919050565b60006020820190506149056000830184614457565b92915050565b60006020820190506149206000830184614475565b92915050565b600060608201905061493b6000830186614466565b6149486020830185614457565b6149556040830184614457565b949350505050565b6000604051905081810181811067ffffffffffffffff8211171561498457614983614e59565b5b8060405250919050565b600067ffffffffffffffff8211156149a9576149a8614e59565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156149d9576149d8614e59565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614ace82614c8b565b9150614ad983614c8b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614b0e57614b0d614dcc565b5b828201905092915050565b6000614b2482614c95565b9150614b2f83614c95565b92508260ff03821115614b4557614b44614dcc565b5b828201905092915050565b6000614b5b82614c8b565b9150614b6683614c8b565b925082614b7657614b75614dfb565b5b828204905092915050565b6000614b8c82614c8b565b9150614b9783614c8b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614bd057614bcf614dcc565b5b828202905092915050565b6000614be682614c8b565b9150614bf183614c8b565b925082821015614c0457614c03614dcc565b5b828203905092915050565b6000614c1a82614c6b565b9050919050565b6000614c2c82614c6b565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000614cad82614c95565b9050919050565b82818337600083830152505050565b60005b83811015614ce1578082015181840152602081019050614cc6565b83811115614cf0576000848401525b50505050565b6000614d0182614c8b565b91506000821415614d1557614d14614dcc565b5b600182039050919050565b60006002820490506001821680614d3857607f821691505b60208210811415614d4c57614d4b614e2a565b5b50919050565b6000614d5d82614c8b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614d9057614d8f614dcc565b5b600182019050919050565b6000614da682614c8b565b9150614db183614c8b565b925082614dc157614dc0614dfb565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b614ea281614c0f565b8114614ead57600080fd5b50565b614eb981614c21565b8114614ec457600080fd5b50565b614ed081614c33565b8114614edb57600080fd5b50565b614ee781614c3f565b8114614ef257600080fd5b50565b614efe81614c8b565b8114614f0957600080fd5b50565b614f1581614c95565b8114614f2057600080fd5b5056fea2646970667358221220327342c26e4311f78fa2b6b056476c26fc567aa663743e220575714fa19536a864736f6c63430008000033

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

0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000005068747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d515a573369524561664736797477386a666345436d737a766b547478536f5a3145755a5257587a677242356f00000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _uri (string): https://gateway.pinata.cloud/ipfs/QmQZW3iREafG6ytw8jfcECmszvkTtxSoZ1EuZRWXzgrB5o

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000050
Arg [2] : 68747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066
Arg [3] : 732f516d515a573369524561664736797477386a666345436d737a766b547478
Arg [4] : 536f5a3145755a5257587a677242356f00000000000000000000000000000000


Deployed Bytecode Sourcemap

48695:6862:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54687:332;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21196:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22755:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22278:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54219:232;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50299:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52856:83;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52672:89;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23645:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51857:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49192:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54459:156;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;48960:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52239:316;;;;;;;;;;;;;:::i;:::-;;24055:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49607:45;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51300:320;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52563:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20890:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53263:205;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20620:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33943:94;;;;;;;;;;;;;:::i;:::-;;52769:79;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49162:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33292:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49127:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51991:87;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21365:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49560:42;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23048:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24311:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53919:292;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53522:389;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;52947:262;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49096:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49008:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23414:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52086:75;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50400:892;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34192:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48917:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54687:332;54780:4;54804:37;54829:11;54804:24;:37::i;:::-;:91;;;;49397:10;54860:35;;54845:50;;;:11;:50;;;;54804:91;:157;;;;49470:10;54930:31;;54915:46;;;:11;:46;;;;54804:157;:207;;;;49543:10;54980:31;;54965:46;;;:11;:46;;;;54804:207;54797:214;;54687:332;;;:::o;21196:100::-;21250:13;21283:5;21276:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21196:100;:::o;22755:221::-;22831:7;22859:16;22867:7;22859;:16::i;:::-;22851:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22944:15;:24;22960:7;22944:24;;;;;;;;;;;;;;;;;;;;;22937:31;;22755:221;;;:::o;22278:411::-;22359:13;22375:23;22390:7;22375:14;:23::i;:::-;22359:39;;22423:5;22417:11;;:2;:11;;;;22409:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;22517:5;22501:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;22526:37;22543:5;22550:12;:10;:12::i;:::-;22526:16;:37::i;:::-;22501:62;22479:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;22660:21;22669:2;22673:7;22660:8;:21::i;:::-;22278:411;;;:::o;54219:232::-;54270:17;54333:3;54304:33;;:17;;;;;;;;;;;:33;;;54300:123;;54374:1;54360:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54354:22;;54400:11;;54391:3;54395:1;54391:6;;;;;;;;;;;;;;;;;;;;;:20;;;;;54300:123;54219:232;;;:::o;50299:93::-;50343:7;50370:14;:12;:14::i;:::-;50363:21;;50299:93;:::o;52856:83::-;33523:12;:10;:12::i;:::-;33512:23;;:7;:5;:7::i;:::-;:23;;;33504:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52927:4:::1;52916:8;;:15;;;;;;;;;;;;;;;;;;52856:83:::0;:::o;52672:89::-;33523:12;:10;:12::i;:::-;33512:23;;:7;:5;:7::i;:::-;:23;;;33504:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52749:4:::1;52735:11;;:18;;;;;;;;;;;;;;;;;;52672:89:::0;:::o;23645:339::-;23840:41;23859:12;:10;:12::i;:::-;23873:7;23840:18;:41::i;:::-;23832:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;23948:28;23958:4;23964:2;23968:7;23948:9;:28::i;:::-;23645:339;;;:::o;51857:108::-;51909:7;51936:21;51950:6;51936:9;;:13;;:21;;;;:::i;:::-;51929:28;;51857:108;;;:::o;49192:27::-;;;;;;;;;;;;;:::o;54459:156::-;54527:7;54536;54564:17;;;;;;;;;;;54601:5;54589:11;;54583:5;:17;;;;:::i;:::-;:23;;;;:::i;:::-;54556:51;;;;54459:156;;;;;:::o;48960:43::-;48999:4;48960:43;:::o;52239:316::-;33523:12;:10;:12::i;:::-;33512:23;;:7;:5;:7::i;:::-;:23;;;33504:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52286:11:::1;52300:21;52286:35;;52445:12;52463:7;:5;:7::i;:::-;:12;;52483:6;52463:31;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52444:50;;;52513:7;52505:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;33583:1;;52239:316::o:0;24055:185::-;24193:39;24210:4;24216:2;24220:7;24193:39;;;;;;;;;;;;:16;:39::i;:::-;24055:185;;;:::o;49607:45::-;;;;;;;;;;;;;;;;;;;;;;:::o;51300:320::-;48999:4;50178:14;:12;:14::i;:::-;:30;;50170:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;50240:6;;;;;;;;;;;50232:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;33523:12:::1;:10;:12::i;:::-;33512:23;;:7;:5;:7::i;:::-;:23;;;33504:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51390:13:::2;51406:14;:12;:14::i;:::-;51390:30;;51431:12;51446:21;51460:6;51446:21;;:9;;:13;;:21;;;;:::i;:::-;51431:36;;48999:4;51494:6;51486:14;;:5;:14;;;;:::i;:::-;:30;;51478:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;51546:3;51541:34;;;51551:6;51559:4;51565:9;;51541:34;;;;;;;;:::i;:::-;;;;;;;;51586:26;51600:6;51586:26;;51608:3;51586:13;:26::i;:::-;33583:1;;51300:320:::0;;:::o;52563:101::-;33523:12;:10;:12::i;:::-;33512:23;;:7;:5;:7::i;:::-;:23;;;33504:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52649:7:::1;52634:12;:22;;;;;;;;;;;;:::i;:::-;;52563:101:::0;:::o;20890:239::-;20962:7;20982:13;20998:7;:16;21006:7;20998:16;;;;;;;;;;;;;;;;;;;;;20982:32;;21050:1;21033:19;;:5;:19;;;;21025:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21116:5;21109:12;;;20890:239;;;:::o;53263:205::-;33523:12;:10;:12::i;:::-;33512:23;;:7;:5;:7::i;:::-;:23;;;33504:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53378:9:::1;53358:17;;:29;;;;;;;;;;;;;;;;;;53412:3;53398:11;:17;;;;53445:9;53431:29;;;53456:3;53431:29;;;;;;:::i;:::-;;;;;;;;53263:205:::0;;:::o;20620:208::-;20692:7;20737:1;20720:19;;:5;:19;;;;20712:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;20804:9;:16;20814:5;20804:16;;;;;;;;;;;;;;;;20797:23;;20620:208;;;:::o;33943:94::-;33523:12;:10;:12::i;:::-;33512:23;;:7;:5;:7::i;:::-;:23;;;33504:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;34008:21:::1;34026:1;34008:9;:21::i;:::-;33943:94::o:0;52769:79::-;33523:12;:10;:12::i;:::-;33512:23;;:7;:5;:7::i;:::-;:23;;;33504:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52836:4:::1;52827:6;;:13;;;;;;;;;;;;;;;;;;52769:79:::0;:::o;49162:25::-;;;;;;;;;;;;;:::o;33292:87::-;33338:7;33365:6;;;;;;;;;;;33358:13;;33292:87;:::o;49127:30::-;;;;;;;;;;;;;:::o;51991:87::-;33523:12;:10;:12::i;:::-;33512:23;;:7;:5;:7::i;:::-;:23;;;33504:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52064:6:::1;52052:9;:18;;;;51991:87:::0;:::o;21365:104::-;21421:13;21454:7;21447:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21365:104;:::o;49560:42::-;;;;;;;;;;;;;;;;;;;;;;:::o;23048:295::-;23163:12;:10;:12::i;:::-;23151:24;;:8;:24;;;;23143:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;23263:8;23218:18;:32;23237:12;:10;:12::i;:::-;23218:32;;;;;;;;;;;;;;;:42;23251:8;23218:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;23316:8;23287:48;;23302:12;:10;:12::i;:::-;23287:48;;;23326:8;23287:48;;;;;;:::i;:::-;;;;;;;;23048:295;;:::o;24311:328::-;24486:41;24505:12;:10;:12::i;:::-;24519:7;24486:18;:41::i;:::-;24478:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24592:39;24606:4;24612:2;24616:7;24625:5;24592:13;:39::i;:::-;24311:328;;;;:::o;53919:292::-;53977:35;54058:3;54029:33;;:17;;;;;;;;;;;:33;;;54025:151;;54114:1;54092:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54079:37;;54147:17;;;;;;;;;;;54131:10;54142:1;54131:13;;;;;;;;;;;;;;;;;;;;;:33;;;;;;;;;;;54025:151;53919:292;;;:::o;53522:389::-;53576:35;53613:20;53679:3;53650:33;;:17;;;;;;;;;;;:33;;;53646:223;;53735:1;53713:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53700:37;;53768:17;;;;;;;;;;;53752:10;53763:1;53752:13;;;;;;;;;;;;;;;;;;;;;:33;;;;;;;;;;;53820:1;53806:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53800:22;;53846:11;;53837:3;53841:1;53837:6;;;;;;;;;;;;;;;;;;;;;:20;;;;;53646:223;53522:389;;;:::o;52947:262::-;53016:13;53045:11;;;;;;;;;;;53042:160;;;53078:12;53071:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53042:160;53152:12;53166:13;53175:3;53166:8;:13::i;:::-;53135:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;53121:69;;52947:262;;;;:::o;49096:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;49008:83::-;49049:42;49008:83;:::o;23414:164::-;23511:4;23535:18;:25;23554:5;23535:25;;;;;;;;;;;;;;;:35;23561:8;23535:35;;;;;;;;;;;;;;;;;;;;;;;;;23528:42;;23414:164;;;;:::o;52086:75::-;33523:12;:10;:12::i;:::-;33512:23;;:7;:5;:7::i;:::-;:23;;;33504:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52149:4:::1;52143:3;:10;;;;52086:75:::0;:::o;50400:892::-;48999:4;50178:14;:12;:14::i;:::-;:30;;50170:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;50240:6;;;;;;;;;;;50232:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;50492:13:::1;50508:14;:12;:14::i;:::-;50492:30;;50533:12;50548:21;50562:6;50548:21;;:9;;:13;;:21;;;;:::i;:::-;50533:36;;48999:4;50596:6;50588:14;;:5;:14;;;;:::i;:::-;:30;;50580:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;50664:13;50670:6;50664:13;;:5;:13::i;:::-;50651:9;:26;;50643:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;50715:8;;;;;;;;;;;50712:573;;;50756:3;;50748:4;:11;50740:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;50836:1;50827:6;50808:11;:16;50820:3;50808:16;;;;;;;;;;;;;;;;;;;;;;;;;:25;;;;:::i;:::-;:29;;;50800:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;50925:6;50906:11;:16;50918:3;50906:16;;;;;;;;;;;;;;;;;;;;;;;;;:25;;;;:::i;:::-;50887:11;:16;50899:3;50887:16;;;;;;;;;;;;;;;;:44;;;;;;;;;;;;;;;;;;50946:26;50960:6;50946:26;;50968:3;50946:13;:26::i;:::-;50990:3;50985:34;;;50995:6;51003:4;51009:9;;50985:34;;;;;;;;:::i;:::-;;;;;;;;50712:573;;;51090:2;51081:6;51062:11;:16;51074:3;51062:16;;;;;;;;;;;;;;;;;;;;;;;;;:25;;;;:::i;:::-;:30;;;51054:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;51181:6;51162:11;:16;51174:3;51162:16;;;;;;;;;;;;;;;;;;;;;;;;;:25;;;;:::i;:::-;51143:11;:16;51155:3;51143:16;;;;;;;;;;;;;;;;:44;;;;;;;;;;;;;;;;;;51200:26;51214:6;51200:26;;51222:3;51200:13;:26::i;:::-;51244:3;51239:34;;;51249:6;51257:4;51263:9;;51239:34;;;;;;;;:::i;:::-;;;;;;;;50712:573;50282:1;;50400:892:::0;;;:::o;34192:192::-;33523:12;:10;:12::i;:::-;33512:23;;:7;:5;:7::i;:::-;:23;;;33504:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;34301:1:::1;34281:22;;:8;:22;;;;34273:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;34357:19;34367:8;34357:9;:19::i;:::-;34192:192:::0;:::o;48917:38::-;;;;:::o;20251:305::-;20353:4;20405:25;20390:40;;;:11;:40;;;;:105;;;;20462:33;20447:48;;;:11;:48;;;;20390:105;:158;;;;20512:36;20536:11;20512:23;:36::i;:::-;20390:158;20370:178;;20251:305;;;:::o;26149:127::-;26214:4;26266:1;26238:30;;:7;:16;26246:7;26238:16;;;;;;;;;;;;;;;;;;;;;:30;;;;26231:37;;26149:127;;;:::o;15955:98::-;16008:7;16035:10;16028:17;;15955:98;:::o;30131:174::-;30233:2;30206:15;:24;30222:7;30206:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30289:7;30285:2;30251:46;;30260:23;30275:7;30260:14;:23::i;:::-;30251:46;;;;;;;;;;;;30131:174;;:::o;50027:104::-;50074:4;50098:25;:15;:23;:25::i;:::-;50091:32;;50027:104;:::o;26443:348::-;26536:4;26561:16;26569:7;26561;:16::i;:::-;26553:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26637:13;26653:23;26668:7;26653:14;:23::i;:::-;26637:39;;26706:5;26695:16;;:7;:16;;;:51;;;;26739:7;26715:31;;:20;26727:7;26715:11;:20::i;:::-;:31;;;26695:51;:87;;;;26750:32;26767:5;26774:7;26750:16;:32::i;:::-;26695:87;26687:96;;;26443:348;;;;:::o;29435:578::-;29594:4;29567:31;;:23;29582:7;29567:14;:23::i;:::-;:31;;;29559:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;29677:1;29663:16;;:2;:16;;;;29655:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;29733:39;29754:4;29760:2;29764:7;29733:20;:39::i;:::-;29837:29;29854:1;29858:7;29837:8;:29::i;:::-;29898:1;29879:9;:15;29889:4;29879:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;29927:1;29910:9;:13;29920:2;29910:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29958:2;29939:7;:16;29947:7;29939:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29997:7;29993:2;29978:27;;29987:4;29978:27;;;;;;;;;;;;29435:578;;;:::o;38015:98::-;38073:7;38104:1;38100;:5;;;;:::i;:::-;38093:12;;38015:98;;;;:::o;51628:221::-;51704:9;51699:143;51723:6;51719:1;:10;51699:143;;;51749:27;:15;:25;:27::i;:::-;51789:41;51799:3;51804:25;:15;:23;:25::i;:::-;51789:9;:41::i;:::-;51731:3;;;;;:::i;:::-;;;;51699:143;;;;51628:221;;:::o;34392:173::-;34448:16;34467:6;;;;;;;;;;;34448:25;;34493:8;34484:6;;:17;;;;;;;;;;;;;;;;;;34548:8;34517:40;;34538:8;34517:40;;;;;;;;;;;;34392:173;;:::o;25521:315::-;25678:28;25688:4;25694:2;25698:7;25678:9;:28::i;:::-;25725:48;25748:4;25754:2;25758:7;25767:5;25725:22;:48::i;:::-;25717:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25521:315;;;;:::o;55028:524::-;55116:17;55159:1;55153:2;:7;55149:51;;;55180:10;;;;;;;;;;;;;;;;;;;;;55149:51;55208:9;55220:2;55208:14;;55231;55254:69;55266:1;55261;:6;55254:69;;55287:8;;;;;:::i;:::-;;;;55311:2;55306:7;;;;;:::i;:::-;;;55254:69;;;55331:17;55361:6;55351:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55331:37;;55377:9;55389:6;55377:18;;55408:2;55404:6;;55419:99;55431:1;55426;:6;55419:99;;55486:2;55482:1;:6;;;;:::i;:::-;55477:2;:11;;;;:::i;:::-;55464:26;;55452:4;55457:3;;;;:::i;:::-;;;;55452:9;;;;;;;;;;;;;;;;;;;:38;;;;;;;;;;;55506:2;55501:7;;;;;:::i;:::-;;;55419:99;;;55539:4;55526:18;;55028:524;;;;;;;;:::o;18860:157::-;18945:4;18984:25;18969:40;;;:11;:40;;;;18962:47;;18860:157;;;:::o;42177:114::-;42242:7;42269;:14;;;42262:21;;42177:114;;;:::o;32245:126::-;;;;:::o;42299:127::-;42406:1;42388:7;:14;;;:19;;;;;;;;;;;42299:127;:::o;27133:110::-;27209:26;27219:2;27223:7;27209:26;;;;;;;;;;;;:9;:26::i;:::-;27133:110;;:::o;30870:803::-;31025:4;31046:15;:2;:13;;;:15::i;:::-;31042:624;;;31098:2;31082:36;;;31119:12;:10;:12::i;:::-;31133:4;31139:7;31148:5;31082:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;31078:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31345:1;31328:6;:13;:18;31324:272;;;31371:60;;;;;;;;;;:::i;:::-;;;;;;;;31324:272;31546:6;31540:13;31531:6;31527:2;31523:15;31516:38;31078:533;31215:45;;;31205:55;;;:6;:55;;;;31198:62;;;;;31042:624;31650:4;31643:11;;30870:803;;;;;;;:::o;27470:321::-;27600:18;27606:2;27610:7;27600:5;:18::i;:::-;27651:54;27682:1;27686:2;27690:7;27699:5;27651:22;:54::i;:::-;27629:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;27470:321;;;:::o;8298:387::-;8358:4;8566:12;8633:7;8621:20;8613:28;;8676:1;8669:4;:8;8662:15;;;8298:387;;;:::o;28127:382::-;28221:1;28207:16;;:2;:16;;;;28199:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28280:16;28288:7;28280;:16::i;:::-;28279:17;28271:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28342:45;28371:1;28375:2;28379:7;28342:20;:45::i;:::-;28417:1;28400:9;:13;28410:2;28400:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28448:2;28429:7;:16;28437:7;28429:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28493:7;28489:2;28468:33;;28485:1;28468:33;;;;;;;;;;;;28127:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:344::-;;458:65;473:49;515:6;473:49;:::i;:::-;458:65;:::i;:::-;449:74;;546:6;539:5;532:21;584:4;577:5;573:16;622:3;613:6;608:3;604:16;601:25;598:2;;;639:1;636;629:12;598:2;652:41;686:6;681:3;676;652:41;:::i;:::-;439:260;;;;;;:::o;705:139::-;;789:6;776:20;767:29;;805:33;832:5;805:33;:::i;:::-;757:87;;;;:::o;850:155::-;;942:6;929:20;920:29;;958:41;993:5;958:41;:::i;:::-;910:95;;;;:::o;1011:133::-;;1092:6;1079:20;1070:29;;1108:30;1132:5;1108:30;:::i;:::-;1060:84;;;;:::o;1150:137::-;;1233:6;1220:20;1211:29;;1249:32;1275:5;1249:32;:::i;:::-;1201:86;;;;:::o;1293:141::-;;1380:6;1374:13;1365:22;;1396:32;1422:5;1396:32;:::i;:::-;1355:79;;;;:::o;1453:271::-;;1557:3;1550:4;1542:6;1538:17;1534:27;1524:2;;1575:1;1572;1565:12;1524:2;1615:6;1602:20;1640:78;1714:3;1706:6;1699:4;1691:6;1687:17;1640:78;:::i;:::-;1631:87;;1514:210;;;;;:::o;1744:273::-;;1849:3;1842:4;1834:6;1830:17;1826:27;1816:2;;1867:1;1864;1857:12;1816:2;1907:6;1894:20;1932:79;2007:3;1999:6;1992:4;1984:6;1980:17;1932:79;:::i;:::-;1923:88;;1806:211;;;;;:::o;2023:139::-;;2107:6;2094:20;2085:29;;2123:33;2150:5;2123:33;:::i;:::-;2075:87;;;;:::o;2168:135::-;;2250:6;2237:20;2228:29;;2266:31;2291:5;2266:31;:::i;:::-;2218:85;;;;:::o;2309:262::-;;2417:2;2405:9;2396:7;2392:23;2388:32;2385:2;;;2433:1;2430;2423:12;2385:2;2476:1;2501:53;2546:7;2537:6;2526:9;2522:22;2501:53;:::i;:::-;2491:63;;2447:117;2375:196;;;;:::o;2577:423::-;;;2710:2;2698:9;2689:7;2685:23;2681:32;2678:2;;;2726:1;2723;2716:12;2678:2;2769:1;2794:61;2847:7;2838:6;2827:9;2823:22;2794:61;:::i;:::-;2784:71;;2740:125;2904:2;2930:53;2975:7;2966:6;2955:9;2951:22;2930:53;:::i;:::-;2920:63;;2875:118;2668:332;;;;;:::o;3006:407::-;;;3131:2;3119:9;3110:7;3106:23;3102:32;3099:2;;;3147:1;3144;3137:12;3099:2;3190:1;3215:53;3260:7;3251:6;3240:9;3236:22;3215:53;:::i;:::-;3205:63;;3161:117;3317:2;3343:53;3388:7;3379:6;3368:9;3364:22;3343:53;:::i;:::-;3333:63;;3288:118;3089:324;;;;;:::o;3419:552::-;;;;3561:2;3549:9;3540:7;3536:23;3532:32;3529:2;;;3577:1;3574;3567:12;3529:2;3620:1;3645:53;3690:7;3681:6;3670:9;3666:22;3645:53;:::i;:::-;3635:63;;3591:117;3747:2;3773:53;3818:7;3809:6;3798:9;3794:22;3773:53;:::i;:::-;3763:63;;3718:118;3875:2;3901:53;3946:7;3937:6;3926:9;3922:22;3901:53;:::i;:::-;3891:63;;3846:118;3519:452;;;;;:::o;3977:809::-;;;;;4145:3;4133:9;4124:7;4120:23;4116:33;4113:2;;;4162:1;4159;4152:12;4113:2;4205:1;4230:53;4275:7;4266:6;4255:9;4251:22;4230:53;:::i;:::-;4220:63;;4176:117;4332:2;4358:53;4403:7;4394:6;4383:9;4379:22;4358:53;:::i;:::-;4348:63;;4303:118;4460:2;4486:53;4531:7;4522:6;4511:9;4507:22;4486:53;:::i;:::-;4476:63;;4431:118;4616:2;4605:9;4601:18;4588:32;4647:18;4639:6;4636:30;4633:2;;;4679:1;4676;4669:12;4633:2;4707:62;4761:7;4752:6;4741:9;4737:22;4707:62;:::i;:::-;4697:72;;4559:220;4103:683;;;;;;;:::o;4792:401::-;;;4914:2;4902:9;4893:7;4889:23;4885:32;4882:2;;;4930:1;4927;4920:12;4882:2;4973:1;4998:53;5043:7;5034:6;5023:9;5019:22;4998:53;:::i;:::-;4988:63;;4944:117;5100:2;5126:50;5168:7;5159:6;5148:9;5144:22;5126:50;:::i;:::-;5116:60;;5071:115;4872:321;;;;;:::o;5199:407::-;;;5324:2;5312:9;5303:7;5299:23;5295:32;5292:2;;;5340:1;5337;5330:12;5292:2;5383:1;5408:53;5453:7;5444:6;5433:9;5429:22;5408:53;:::i;:::-;5398:63;;5354:117;5510:2;5536:53;5581:7;5572:6;5561:9;5557:22;5536:53;:::i;:::-;5526:63;;5481:118;5282:324;;;;;:::o;5612:256::-;;5717:2;5705:9;5696:7;5692:23;5688:32;5685:2;;;5733:1;5730;5723:12;5685:2;5776:1;5801:50;5843:7;5834:6;5823:9;5819:22;5801:50;:::i;:::-;5791:60;;5747:114;5675:193;;;;:::o;5874:260::-;;5981:2;5969:9;5960:7;5956:23;5952:32;5949:2;;;5997:1;5994;5987:12;5949:2;6040:1;6065:52;6109:7;6100:6;6089:9;6085:22;6065:52;:::i;:::-;6055:62;;6011:116;5939:195;;;;:::o;6140:282::-;;6258:2;6246:9;6237:7;6233:23;6229:32;6226:2;;;6274:1;6271;6264:12;6226:2;6317:1;6342:63;6397:7;6388:6;6377:9;6373:22;6342:63;:::i;:::-;6332:73;;6288:127;6216:206;;;;:::o;6428:375::-;;6546:2;6534:9;6525:7;6521:23;6517:32;6514:2;;;6562:1;6559;6552:12;6514:2;6633:1;6622:9;6618:17;6605:31;6663:18;6655:6;6652:30;6649:2;;;6695:1;6692;6685:12;6649:2;6723:63;6778:7;6769:6;6758:9;6754:22;6723:63;:::i;:::-;6713:73;;6576:220;6504:299;;;;:::o;6809:262::-;;6917:2;6905:9;6896:7;6892:23;6888:32;6885:2;;;6933:1;6930;6923:12;6885:2;6976:1;7001:53;7046:7;7037:6;7026:9;7022:22;7001:53;:::i;:::-;6991:63;;6947:117;6875:196;;;;:::o;7077:407::-;;;7202:2;7190:9;7181:7;7177:23;7173:32;7170:2;;;7218:1;7215;7208:12;7170:2;7261:1;7286:53;7331:7;7322:6;7311:9;7307:22;7286:53;:::i;:::-;7276:63;;7232:117;7388:2;7414:53;7459:7;7450:6;7439:9;7435:22;7414:53;:::i;:::-;7404:63;;7359:118;7160:324;;;;;:::o;7490:403::-;;;7613:2;7601:9;7592:7;7588:23;7584:32;7581:2;;;7629:1;7626;7619:12;7581:2;7672:1;7697:51;7740:7;7731:6;7720:9;7716:22;7697:51;:::i;:::-;7687:61;;7643:115;7797:2;7823:53;7868:7;7859:6;7848:9;7844:22;7823:53;:::i;:::-;7813:63;;7768:118;7571:322;;;;;:::o;7899:548::-;;;;8039:2;8027:9;8018:7;8014:23;8010:32;8007:2;;;8055:1;8052;8045:12;8007:2;8098:1;8123:51;8166:7;8157:6;8146:9;8142:22;8123:51;:::i;:::-;8113:61;;8069:115;8223:2;8249:53;8294:7;8285:6;8274:9;8270:22;8249:53;:::i;:::-;8239:63;;8194:118;8351:2;8377:53;8422:7;8413:6;8402:9;8398:22;8377:53;:::i;:::-;8367:63;;8322:118;7997:450;;;;;:::o;8453:211::-;;8559:62;8617:3;8609:6;8559:62;:::i;:::-;8653:4;8648:3;8644:14;8630:28;;8549:115;;;;:::o;8670:179::-;;8760:46;8802:3;8794:6;8760:46;:::i;:::-;8838:4;8833:3;8829:14;8815:28;;8750:99;;;;:::o;8855:132::-;8948:32;8974:5;8948:32;:::i;:::-;8943:3;8936:45;8926:61;;:::o;8993:118::-;9080:24;9098:5;9080:24;:::i;:::-;9075:3;9068:37;9058:53;;:::o;9163:796::-;;9327:62;9383:5;9327:62;:::i;:::-;9405:94;9492:6;9487:3;9405:94;:::i;:::-;9398:101;;9523:64;9581:5;9523:64;:::i;:::-;9610:7;9641:1;9626:308;9651:6;9648:1;9645:13;9626:308;;;9727:6;9721:13;9754:79;9829:3;9814:13;9754:79;:::i;:::-;9747:86;;9856:68;9917:6;9856:68;:::i;:::-;9846:78;;9686:248;9673:1;9670;9666:9;9661:14;;9626:308;;;9630:14;9950:3;9943:10;;9303:656;;;;;;;:::o;9995:732::-;;10143:54;10191:5;10143:54;:::i;:::-;10213:86;10292:6;10287:3;10213:86;:::i;:::-;10206:93;;10323:56;10373:5;10323:56;:::i;:::-;10402:7;10433:1;10418:284;10443:6;10440:1;10437:13;10418:284;;;10519:6;10513:13;10546:63;10605:3;10590:13;10546:63;:::i;:::-;10539:70;;10632:60;10685:6;10632:60;:::i;:::-;10622:70;;10478:224;10465:1;10462;10458:9;10453:14;;10418:284;;;10422:14;10718:3;10711:10;;10119:608;;;;;;;:::o;10733:109::-;10814:21;10829:5;10814:21;:::i;:::-;10809:3;10802:34;10792:50;;:::o;10848:360::-;;10962:38;10994:5;10962:38;:::i;:::-;11016:70;11079:6;11074:3;11016:70;:::i;:::-;11009:77;;11095:52;11140:6;11135:3;11128:4;11121:5;11117:16;11095:52;:::i;:::-;11172:29;11194:6;11172:29;:::i;:::-;11167:3;11163:39;11156:46;;10938:270;;;;;:::o;11214:364::-;;11330:39;11363:5;11330:39;:::i;:::-;11385:71;11449:6;11444:3;11385:71;:::i;:::-;11378:78;;11465:52;11510:6;11505:3;11498:4;11491:5;11487:16;11465:52;:::i;:::-;11542:29;11564:6;11542:29;:::i;:::-;11537:3;11533:39;11526:46;;11306:272;;;;;:::o;11584:377::-;;11718:39;11751:5;11718:39;:::i;:::-;11773:89;11855:6;11850:3;11773:89;:::i;:::-;11766:96;;11871:52;11916:6;11911:3;11904:4;11897:5;11893:16;11871:52;:::i;:::-;11948:6;11943:3;11939:16;11932:23;;11694:267;;;;;:::o;11991:845::-;;12131:5;12125:12;12160:36;12186:9;12160:36;:::i;:::-;12212:89;12294:6;12289:3;12212:89;:::i;:::-;12205:96;;12332:1;12321:9;12317:17;12348:1;12343:137;;;;12494:1;12489:341;;;;12310:520;;12343:137;12427:4;12423:9;12412;12408:25;12403:3;12396:38;12463:6;12458:3;12454:16;12447:23;;12343:137;;12489:341;12556:38;12588:5;12556:38;:::i;:::-;12616:1;12630:154;12644:6;12641:1;12638:13;12630:154;;;12718:7;12712:14;12708:1;12703:3;12699:11;12692:35;12768:1;12759:7;12755:15;12744:26;;12666:4;12663:1;12659:12;12654:17;;12630:154;;;12813:6;12808:3;12804:16;12797:23;;12496:334;;12310:520;;12098:738;;;;;;:::o;12842:382::-;;13005:67;13069:2;13064:3;13005:67;:::i;:::-;12998:74;;13102:34;13098:1;13093:3;13089:11;13082:55;13168:20;13163:2;13158:3;13154:12;13147:42;13215:2;13210:3;13206:12;13199:19;;12988:236;;;:::o;13230:370::-;;13393:67;13457:2;13452:3;13393:67;:::i;:::-;13386:74;;13490:34;13486:1;13481:3;13477:11;13470:55;13556:8;13551:2;13546:3;13542:12;13535:30;13591:2;13586:3;13582:12;13575:19;;13376:224;;;:::o;13606:326::-;;13769:67;13833:2;13828:3;13769:67;:::i;:::-;13762:74;;13866:30;13862:1;13857:3;13853:11;13846:51;13923:2;13918:3;13914:12;13907:19;;13752:180;;;:::o;13938:318::-;;14101:67;14165:2;14160:3;14101:67;:::i;:::-;14094:74;;14198:22;14194:1;14189:3;14185:11;14178:43;14247:2;14242:3;14238:12;14231:19;;14084:172;;;:::o;14262:368::-;;14425:67;14489:2;14484:3;14425:67;:::i;:::-;14418:74;;14522:34;14518:1;14513:3;14509:11;14502:55;14588:6;14583:2;14578:3;14574:12;14567:28;14621:2;14616:3;14612:12;14605:19;;14408:222;;;:::o;14636:323::-;;14799:67;14863:2;14858:3;14799:67;:::i;:::-;14792:74;;14896:27;14892:1;14887:3;14883:11;14876:48;14950:2;14945:3;14941:12;14934:19;;14782:177;;;:::o;14965:306::-;;15128:66;15192:1;15187:3;15128:66;:::i;:::-;15121:73;;15224:11;15220:1;15215:3;15211:11;15204:32;15262:2;15257:3;15253:12;15246:19;;15111:160;;;:::o;15277:316::-;;15440:67;15504:2;15499:3;15440:67;:::i;:::-;15433:74;;15537:20;15533:1;15528:3;15524:11;15517:41;15584:2;15579:3;15575:12;15568:19;;15423:170;;;:::o;15599:376::-;;15762:67;15826:2;15821:3;15762:67;:::i;:::-;15755:74;;15859:34;15855:1;15850:3;15846:11;15839:55;15925:14;15920:2;15915:3;15911:12;15904:36;15966:2;15961:3;15957:12;15950:19;;15745:230;;;:::o;15981:388::-;;16144:67;16208:2;16203:3;16144:67;:::i;:::-;16137:74;;16241:34;16237:1;16232:3;16228:11;16221:55;16307:26;16302:2;16297:3;16293:12;16286:48;16360:2;16355:3;16351:12;16344:19;;16127:242;;;:::o;16375:374::-;;16538:67;16602:2;16597:3;16538:67;:::i;:::-;16531:74;;16635:34;16631:1;16626:3;16622:11;16615:55;16701:12;16696:2;16691:3;16687:12;16680:34;16740:2;16735:3;16731:12;16724:19;;16521:228;;;:::o;16755:373::-;;16918:67;16982:2;16977:3;16918:67;:::i;:::-;16911:74;;17015:34;17011:1;17006:3;17002:11;16995:55;17081:11;17076:2;17071:3;17067:12;17060:33;17119:2;17114:3;17110:12;17103:19;;16901:227;;;:::o;17134:328::-;;17297:67;17361:2;17356:3;17297:67;:::i;:::-;17290:74;;17394:32;17390:1;17385:3;17381:11;17374:53;17453:2;17448:3;17444:12;17437:19;;17280:182;;;:::o;17468:330::-;;17631:67;17695:2;17690:3;17631:67;:::i;:::-;17624:74;;17728:34;17724:1;17719:3;17715:11;17708:55;17789:2;17784:3;17780:12;17773:19;;17614:184;;;:::o;17804:305::-;;17967:66;18031:1;18026:3;17967:66;:::i;:::-;17960:73;;18063:10;18059:1;18054:3;18050:11;18043:31;18100:2;18095:3;18091:12;18084:19;;17950:159;;;:::o;18115:376::-;;18278:67;18342:2;18337:3;18278:67;:::i;:::-;18271:74;;18375:34;18371:1;18366:3;18362:11;18355:55;18441:14;18436:2;18431:3;18427:12;18420:36;18482:2;18477:3;18473:12;18466:19;;18261:230;;;:::o;18497:337::-;;18678:84;18760:1;18755:3;18678:84;:::i;:::-;18671:91;;18792:7;18788:1;18783:3;18779:11;18772:28;18826:1;18821:3;18817:11;18810:18;;18661:173;;;:::o;18840:330::-;;19003:67;19067:2;19062:3;19003:67;:::i;:::-;18996:74;;19100:34;19096:1;19091:3;19087:11;19080:55;19161:2;19156:3;19152:12;19145:19;;18986:184;;;:::o;19176:373::-;;19339:67;19403:2;19398:3;19339:67;:::i;:::-;19332:74;;19436:34;19432:1;19427:3;19423:11;19416:55;19502:11;19497:2;19492:3;19488:12;19481:33;19540:2;19535:3;19531:12;19524:19;;19322:227;;;:::o;19555:365::-;;19718:67;19782:2;19777:3;19718:67;:::i;:::-;19711:74;;19815:34;19811:1;19806:3;19802:11;19795:55;19881:3;19876:2;19871:3;19867:12;19860:25;19911:2;19906:3;19902:12;19895:19;;19701:219;;;:::o;19926:315::-;;20089:67;20153:2;20148:3;20089:67;:::i;:::-;20082:74;;20186:19;20182:1;20177:3;20173:11;20166:40;20232:2;20227:3;20223:12;20216:19;;20072:169;;;:::o;20247:365::-;;20410:67;20474:2;20469:3;20410:67;:::i;:::-;20403:74;;20507:34;20503:1;20498:3;20494:11;20487:55;20573:3;20568:2;20563:3;20559:12;20552:25;20603:2;20598:3;20594:12;20587:19;;20393:219;;;:::o;20618:297::-;;20798:83;20879:1;20874:3;20798:83;:::i;:::-;20791:90;;20907:1;20902:3;20898:11;20891:18;;20781:134;;;:::o;20921:381::-;;21084:67;21148:2;21143:3;21084:67;:::i;:::-;21077:74;;21181:34;21177:1;21172:3;21168:11;21161:55;21247:19;21242:2;21237:3;21233:12;21226:41;21293:2;21288:3;21284:12;21277:19;;21067:235;;;:::o;21308:321::-;;21471:67;21535:2;21530:3;21471:67;:::i;:::-;21464:74;;21568:25;21564:1;21559:3;21555:11;21548:46;21620:2;21615:3;21611:12;21604:19;;21454:175;;;:::o;21635:108::-;21712:24;21730:5;21712:24;:::i;:::-;21707:3;21700:37;21690:53;;:::o;21749:118::-;21836:24;21854:5;21836:24;:::i;:::-;21831:3;21824:37;21814:53;;:::o;21873:127::-;21958:35;21987:5;21958:35;:::i;:::-;21953:3;21946:48;21936:64;;:::o;22006:112::-;22089:22;22105:5;22089:22;:::i;:::-;22084:3;22077:35;22067:51;;:::o;22124:695::-;;22424:92;22512:3;22503:6;22424:92;:::i;:::-;22417:99;;22533:95;22624:3;22615:6;22533:95;:::i;:::-;22526:102;;22645:148;22789:3;22645:148;:::i;:::-;22638:155;;22810:3;22803:10;;22406:413;;;;;:::o;22825:379::-;;23031:147;23174:3;23031:147;:::i;:::-;23024:154;;23195:3;23188:10;;23013:191;;;:::o;23210:222::-;;23341:2;23330:9;23326:18;23318:26;;23354:71;23422:1;23411:9;23407:17;23398:6;23354:71;:::i;:::-;23308:124;;;;:::o;23438:640::-;;23671:3;23660:9;23656:19;23648:27;;23685:71;23753:1;23742:9;23738:17;23729:6;23685:71;:::i;:::-;23766:72;23834:2;23823:9;23819:18;23810:6;23766:72;:::i;:::-;23848;23916:2;23905:9;23901:18;23892:6;23848:72;:::i;:::-;23967:9;23961:4;23957:20;23952:2;23941:9;23937:18;23930:48;23995:76;24066:4;24057:6;23995:76;:::i;:::-;23987:84;;23638:440;;;;;;;:::o;24084:332::-;;24243:2;24232:9;24228:18;24220:26;;24256:71;24324:1;24313:9;24309:17;24300:6;24256:71;:::i;:::-;24337:72;24405:2;24394:9;24390:18;24381:6;24337:72;:::i;:::-;24210:206;;;;;:::o;24422:405::-;;24619:2;24608:9;24604:18;24596:26;;24668:9;24662:4;24658:20;24654:1;24643:9;24639:17;24632:47;24696:124;24815:4;24806:6;24696:124;:::i;:::-;24688:132;;24586:241;;;;:::o;24833:666::-;;25108:2;25097:9;25093:18;25085:26;;25157:9;25151:4;25147:20;25143:1;25132:9;25128:17;25121:47;25185:124;25304:4;25295:6;25185:124;:::i;:::-;25177:132;;25356:9;25350:4;25346:20;25341:2;25330:9;25326:18;25319:48;25384:108;25487:4;25478:6;25384:108;:::i;:::-;25376:116;;25075:424;;;;;:::o;25505:373::-;;25686:2;25675:9;25671:18;25663:26;;25735:9;25729:4;25725:20;25721:1;25710:9;25706:17;25699:47;25763:108;25866:4;25857:6;25763:108;:::i;:::-;25755:116;;25653:225;;;;:::o;25884:210::-;;26009:2;25998:9;25994:18;25986:26;;26022:65;26084:1;26073:9;26069:17;26060:6;26022:65;:::i;:::-;25976:118;;;;:::o;26100:313::-;;26251:2;26240:9;26236:18;26228:26;;26300:9;26294:4;26290:20;26286:1;26275:9;26271:17;26264:47;26328:78;26401:4;26392:6;26328:78;:::i;:::-;26320:86;;26218:195;;;;:::o;26419:419::-;;26623:2;26612:9;26608:18;26600:26;;26672:9;26666:4;26662:20;26658:1;26647:9;26643:17;26636:47;26700:131;26826:4;26700:131;:::i;:::-;26692:139;;26590:248;;;:::o;26844:419::-;;27048:2;27037:9;27033:18;27025:26;;27097:9;27091:4;27087:20;27083:1;27072:9;27068:17;27061:47;27125:131;27251:4;27125:131;:::i;:::-;27117:139;;27015:248;;;:::o;27269:419::-;;27473:2;27462:9;27458:18;27450:26;;27522:9;27516:4;27512:20;27508:1;27497:9;27493:17;27486:47;27550:131;27676:4;27550:131;:::i;:::-;27542:139;;27440:248;;;:::o;27694:419::-;;27898:2;27887:9;27883:18;27875:26;;27947:9;27941:4;27937:20;27933:1;27922:9;27918:17;27911:47;27975:131;28101:4;27975:131;:::i;:::-;27967:139;;27865:248;;;:::o;28119:419::-;;28323:2;28312:9;28308:18;28300:26;;28372:9;28366:4;28362:20;28358:1;28347:9;28343:17;28336:47;28400:131;28526:4;28400:131;:::i;:::-;28392:139;;28290:248;;;:::o;28544:419::-;;28748:2;28737:9;28733:18;28725:26;;28797:9;28791:4;28787:20;28783:1;28772:9;28768:17;28761:47;28825:131;28951:4;28825:131;:::i;:::-;28817:139;;28715:248;;;:::o;28969:419::-;;29173:2;29162:9;29158:18;29150:26;;29222:9;29216:4;29212:20;29208:1;29197:9;29193:17;29186:47;29250:131;29376:4;29250:131;:::i;:::-;29242:139;;29140:248;;;:::o;29394:419::-;;29598:2;29587:9;29583:18;29575:26;;29647:9;29641:4;29637:20;29633:1;29622:9;29618:17;29611:47;29675:131;29801:4;29675:131;:::i;:::-;29667:139;;29565:248;;;:::o;29819:419::-;;30023:2;30012:9;30008:18;30000:26;;30072:9;30066:4;30062:20;30058:1;30047:9;30043:17;30036:47;30100:131;30226:4;30100:131;:::i;:::-;30092:139;;29990:248;;;:::o;30244:419::-;;30448:2;30437:9;30433:18;30425:26;;30497:9;30491:4;30487:20;30483:1;30472:9;30468:17;30461:47;30525:131;30651:4;30525:131;:::i;:::-;30517:139;;30415:248;;;:::o;30669:419::-;;30873:2;30862:9;30858:18;30850:26;;30922:9;30916:4;30912:20;30908:1;30897:9;30893:17;30886:47;30950:131;31076:4;30950:131;:::i;:::-;30942:139;;30840:248;;;:::o;31094:419::-;;31298:2;31287:9;31283:18;31275:26;;31347:9;31341:4;31337:20;31333:1;31322:9;31318:17;31311:47;31375:131;31501:4;31375:131;:::i;:::-;31367:139;;31265:248;;;:::o;31519:419::-;;31723:2;31712:9;31708:18;31700:26;;31772:9;31766:4;31762:20;31758:1;31747:9;31743:17;31736:47;31800:131;31926:4;31800:131;:::i;:::-;31792:139;;31690:248;;;:::o;31944:419::-;;32148:2;32137:9;32133:18;32125:26;;32197:9;32191:4;32187:20;32183:1;32172:9;32168:17;32161:47;32225:131;32351:4;32225:131;:::i;:::-;32217:139;;32115:248;;;:::o;32369:419::-;;32573:2;32562:9;32558:18;32550:26;;32622:9;32616:4;32612:20;32608:1;32597:9;32593:17;32586:47;32650:131;32776:4;32650:131;:::i;:::-;32642:139;;32540:248;;;:::o;32794:419::-;;32998:2;32987:9;32983:18;32975:26;;33047:9;33041:4;33037:20;33033:1;33022:9;33018:17;33011:47;33075:131;33201:4;33075:131;:::i;:::-;33067:139;;32965:248;;;:::o;33219:419::-;;33423:2;33412:9;33408:18;33400:26;;33472:9;33466:4;33462:20;33458:1;33447:9;33443:17;33436:47;33500:131;33626:4;33500:131;:::i;:::-;33492:139;;33390:248;;;:::o;33644:419::-;;33848:2;33837:9;33833:18;33825:26;;33897:9;33891:4;33887:20;33883:1;33872:9;33868:17;33861:47;33925:131;34051:4;33925:131;:::i;:::-;33917:139;;33815:248;;;:::o;34069:419::-;;34273:2;34262:9;34258:18;34250:26;;34322:9;34316:4;34312:20;34308:1;34297:9;34293:17;34286:47;34350:131;34476:4;34350:131;:::i;:::-;34342:139;;34240:248;;;:::o;34494:419::-;;34698:2;34687:9;34683:18;34675:26;;34747:9;34741:4;34737:20;34733:1;34722:9;34718:17;34711:47;34775:131;34901:4;34775:131;:::i;:::-;34767:139;;34665:248;;;:::o;34919:419::-;;35123:2;35112:9;35108:18;35100:26;;35172:9;35166:4;35162:20;35158:1;35147:9;35143:17;35136:47;35200:131;35326:4;35200:131;:::i;:::-;35192:139;;35090:248;;;:::o;35344:419::-;;35548:2;35537:9;35533:18;35525:26;;35597:9;35591:4;35587:20;35583:1;35572:9;35568:17;35561:47;35625:131;35751:4;35625:131;:::i;:::-;35617:139;;35515:248;;;:::o;35769:419::-;;35973:2;35962:9;35958:18;35950:26;;36022:9;36016:4;36012:20;36008:1;35997:9;35993:17;35986:47;36050:131;36176:4;36050:131;:::i;:::-;36042:139;;35940:248;;;:::o;36194:222::-;;36325:2;36314:9;36310:18;36302:26;;36338:71;36406:1;36395:9;36391:17;36382:6;36338:71;:::i;:::-;36292:124;;;;:::o;36422:214::-;;36549:2;36538:9;36534:18;36526:26;;36562:67;36626:1;36615:9;36611:17;36602:6;36562:67;:::i;:::-;36516:120;;;;:::o;36642:438::-;;36827:2;36816:9;36812:18;36804:26;;36840:69;36906:1;36895:9;36891:17;36882:6;36840:69;:::i;:::-;36919:72;36987:2;36976:9;36972:18;36963:6;36919:72;:::i;:::-;37001;37069:2;37058:9;37054:18;37045:6;37001:72;:::i;:::-;36794:286;;;;;;:::o;37086:283::-;;37152:2;37146:9;37136:19;;37194:4;37186:6;37182:17;37301:6;37289:10;37286:22;37265:18;37253:10;37250:34;37247:62;37244:2;;;37312:18;;:::i;:::-;37244:2;37352:10;37348:2;37341:22;37126:243;;;;:::o;37375:331::-;;37526:18;37518:6;37515:30;37512:2;;;37548:18;;:::i;:::-;37512:2;37633:4;37629:9;37622:4;37614:6;37610:17;37606:33;37598:41;;37694:4;37688;37684:15;37676:23;;37441:265;;;:::o;37712:332::-;;37864:18;37856:6;37853:30;37850:2;;;37886:18;;:::i;:::-;37850:2;37971:4;37967:9;37960:4;37952:6;37948:17;37944:33;37936:41;;38032:4;38026;38022:15;38014:23;;37779:265;;;:::o;38050:140::-;;38148:3;38140:11;;38178:4;38173:3;38169:14;38161:22;;38130:60;;;:::o;38196:132::-;;38286:3;38278:11;;38316:4;38311:3;38307:14;38299:22;;38268:60;;;:::o;38334:141::-;;38406:3;38398:11;;38429:3;38426:1;38419:14;38463:4;38460:1;38450:18;38442:26;;38388:87;;;:::o;38481:122::-;;38590:5;38584:12;38574:22;;38563:40;;;:::o;38609:114::-;;38710:5;38704:12;38694:22;;38683:40;;;:::o;38729:98::-;;38814:5;38808:12;38798:22;;38787:40;;;:::o;38833:99::-;;38919:5;38913:12;38903:22;;38892:40;;;:::o;38938:121::-;;39048:4;39043:3;39039:14;39031:22;;39021:38;;;:::o;39065:113::-;;39167:4;39162:3;39158:14;39150:22;;39140:38;;;:::o;39184:192::-;;39325:6;39320:3;39313:19;39365:4;39360:3;39356:14;39341:29;;39303:73;;;;:::o;39382:184::-;;39515:6;39510:3;39503:19;39555:4;39550:3;39546:14;39531:29;;39493:73;;;;:::o;39572:168::-;;39689:6;39684:3;39677:19;39729:4;39724:3;39720:14;39705:29;;39667:73;;;;:::o;39746:147::-;;39884:3;39869:18;;39859:34;;;;:::o;39899:169::-;;40017:6;40012:3;40005:19;40057:4;40052:3;40048:14;40033:29;;39995:73;;;;:::o;40074:148::-;;40213:3;40198:18;;40188:34;;;;:::o;40228:305::-;;40287:20;40305:1;40287:20;:::i;:::-;40282:25;;40321:20;40339:1;40321:20;:::i;:::-;40316:25;;40475:1;40407:66;40403:74;40400:1;40397:81;40394:2;;;40481:18;;:::i;:::-;40394:2;40525:1;40522;40518:9;40511:16;;40272:261;;;;:::o;40539:237::-;;40596:18;40612:1;40596:18;:::i;:::-;40591:23;;40628:18;40644:1;40628:18;:::i;:::-;40623:23;;40718:1;40712:4;40708:12;40705:1;40702:19;40699:2;;;40724:18;;:::i;:::-;40699:2;40768:1;40765;40761:9;40754:16;;40581:195;;;;:::o;40782:185::-;;40839:20;40857:1;40839:20;:::i;:::-;40834:25;;40873:20;40891:1;40873:20;:::i;:::-;40868:25;;40912:1;40902:2;;40917:18;;:::i;:::-;40902:2;40959:1;40956;40952:9;40947:14;;40824:143;;;;:::o;40973:348::-;;41036:20;41054:1;41036:20;:::i;:::-;41031:25;;41070:20;41088:1;41070:20;:::i;:::-;41065:25;;41258:1;41190:66;41186:74;41183:1;41180:81;41175:1;41168:9;41161:17;41157:105;41154:2;;;41265:18;;:::i;:::-;41154:2;41313:1;41310;41306:9;41295:20;;41021:300;;;;:::o;41327:191::-;;41387:20;41405:1;41387:20;:::i;:::-;41382:25;;41421:20;41439:1;41421:20;:::i;:::-;41416:25;;41460:1;41457;41454:8;41451:2;;;41465:18;;:::i;:::-;41451:2;41510:1;41507;41503:9;41495:17;;41372:146;;;;:::o;41524:96::-;;41590:24;41608:5;41590:24;:::i;:::-;41579:35;;41569:51;;;:::o;41626:104::-;;41700:24;41718:5;41700:24;:::i;:::-;41689:35;;41679:51;;;:::o;41736:90::-;;41813:5;41806:13;41799:21;41788:32;;41778:48;;;:::o;41832:149::-;;41908:66;41901:5;41897:78;41886:89;;41876:105;;;:::o;41987:126::-;;42064:42;42057:5;42053:54;42042:65;;42032:81;;;:::o;42119:77::-;;42185:5;42174:16;;42164:32;;;:::o;42202:86::-;;42277:4;42270:5;42266:16;42255:27;;42245:43;;;:::o;42294:109::-;;42375:22;42391:5;42375:22;:::i;:::-;42362:35;;42352:51;;;:::o;42409:154::-;42493:6;42488:3;42483;42470:30;42555:1;42546:6;42541:3;42537:16;42530:27;42460:103;;;:::o;42569:307::-;42637:1;42647:113;42661:6;42658:1;42655:13;42647:113;;;42746:1;42741:3;42737:11;42731:18;42727:1;42722:3;42718:11;42711:39;42683:2;42680:1;42676:10;42671:15;;42647:113;;;42778:6;42775:1;42772:13;42769:2;;;42858:1;42849:6;42844:3;42840:16;42833:27;42769:2;42618:258;;;;:::o;42882:171::-;;42944:24;42962:5;42944:24;:::i;:::-;42935:33;;42990:4;42983:5;42980:15;42977:2;;;42998:18;;:::i;:::-;42977:2;43045:1;43038:5;43034:13;43027:20;;42925:128;;;:::o;43059:320::-;;43140:1;43134:4;43130:12;43120:22;;43187:1;43181:4;43177:12;43208:18;43198:2;;43264:4;43256:6;43252:17;43242:27;;43198:2;43326;43318:6;43315:14;43295:18;43292:38;43289:2;;;43345:18;;:::i;:::-;43289:2;43110:269;;;;:::o;43385:233::-;;43447:24;43465:5;43447:24;:::i;:::-;43438:33;;43493:66;43486:5;43483:77;43480:2;;;43563:18;;:::i;:::-;43480:2;43610:1;43603:5;43599:13;43592:20;;43428:190;;;:::o;43624:176::-;;43673:20;43691:1;43673:20;:::i;:::-;43668:25;;43707:20;43725:1;43707:20;:::i;:::-;43702:25;;43746:1;43736:2;;43751:18;;:::i;:::-;43736:2;43792:1;43789;43785:9;43780:14;;43658:142;;;;:::o;43806:180::-;43854:77;43851:1;43844:88;43951:4;43948:1;43941:15;43975:4;43972:1;43965:15;43992:180;44040:77;44037:1;44030:88;44137:4;44134:1;44127:15;44161:4;44158:1;44151:15;44178:180;44226:77;44223:1;44216:88;44323:4;44320:1;44313:15;44347:4;44344:1;44337:15;44364:180;44412:77;44409:1;44402:88;44509:4;44506:1;44499:15;44533:4;44530:1;44523:15;44550:102;;44642:2;44638:7;44633:2;44626:5;44622:14;44618:28;44608:38;;44598:54;;;:::o;44658:122::-;44731:24;44749:5;44731:24;:::i;:::-;44724:5;44721:35;44711:2;;44770:1;44767;44760:12;44711:2;44701:79;:::o;44786:138::-;44867:32;44893:5;44867:32;:::i;:::-;44860:5;44857:43;44847:2;;44914:1;44911;44904:12;44847:2;44837:87;:::o;44930:116::-;45000:21;45015:5;45000:21;:::i;:::-;44993:5;44990:32;44980:2;;45036:1;45033;45026:12;44980:2;44970:76;:::o;45052:120::-;45124:23;45141:5;45124:23;:::i;:::-;45117:5;45114:34;45104:2;;45162:1;45159;45152:12;45104:2;45094:78;:::o;45178:122::-;45251:24;45269:5;45251:24;:::i;:::-;45244:5;45241:35;45231:2;;45290:1;45287;45280:12;45231:2;45221:79;:::o;45306:118::-;45377:22;45393:5;45377:22;:::i;:::-;45370:5;45367:33;45357:2;;45414:1;45411;45404:12;45357:2;45347:77;:::o

Swarm Source

ipfs://327342c26e4311f78fa2b6b056476c26fc567aa663743e220575714fa19536a8
Loading...
Loading
Loading...
Loading
[ 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.