ETH Price: $3,064.03 (+2.80%)
Gas: 1 Gwei

Token

CryptoLand (CL)
 

Overview

Max Total Supply

1,037 CL

Holders

756

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
3 CL
0x82806Bd59F60bf3ab6b579Cf2c70cb057D8FEC82
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
CryptoLand

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;

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

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



pragma solidity ^0.8.0;


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

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

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

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



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;

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

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

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



pragma solidity ^0.8.0;

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

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

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

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

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

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



pragma solidity ^0.8.0;


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

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



pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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



pragma solidity ^0.8.0;


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

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

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

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



pragma solidity ^0.8.0;



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

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

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

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

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

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

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

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

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

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

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

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

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

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

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

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

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

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

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

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

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

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

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



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

// File: interfaces/ICryptoLand.sol


pragma solidity ^0.8.7;

interface ICryptoLand {

    function whiteListClaimedBy(address owner) external returns (uint256);

    function purchase(string memory _parcelId) external payable;

    function claimWhiteList(bytes memory _sig) external;

    function claimTeam() external;

    function claimGiveAway() external;

    function setIsActive(bool isActive) external;

    function setIsWhiteListActive(bool isAllowListActive) external;

    function setProof(string memory proofString) external;

    function withdraw() external;
}

// File: interfaces/ICryptoLandMetadata.sol


pragma solidity ^0.8.7;

interface ICryptoLandMetadata {
    function setContractURI(string calldata URI) external;

    function setBaseURI(string calldata URI) external;

    function setRevealedBaseURI(string calldata revealedBaseURI) external;

    function contractURI() external view returns(string memory);
}

// File: contracts/CryptoLand.sol


/**
 *
 *
         ____  ____ ___  _ ____  _____  ____  _     ____  _      ____
        /   _\/  __\\  \///  __\/__ __\/  _ \/ \   /  _ \/ \  /|/  _ \
        |  /  |  \/| \  / |  \/|  / \  | / \|| |   | / \|| |\ ||| | \|
        |  \__|    / / /  |  __/  | |  | \_/|| |_/\| |-||| | \||| |_/|
        \____/\_/\_\/_/   \_/     \_/  \____/\____/\_/ \|\_/  \|\____/


 *      This contract generates ERC721 tokens were the 1 to 60 represents the parcels owned by a wallet in the island.
 *      From the token 61 to 72 will be assigned to the team
 *      From 73 to 172 will be saved for giveaways
 *      And the 173 to 10,000.00 (10k) represents the right to access the Vladimir Club
 *      Disclaimer: Before purchase please reach the team or refer to the projects website to accept the claiming conditions
 *
 */

pragma solidity ^0.8.7;






contract CryptoLand is ERC721Enumerable, Ownable, ICryptoLand, ICryptoLandMetadata {
    using Strings for uint256;

    uint256 public constant TOKEN_PURCHASE = 60;        // @dev 60 tokens for purchase
    uint256 public constant TOKEN_TEAM_ASSIGNED = 72;   // @dev 12 tokens assigned     to the team, not for sale
    uint256 public constant TOKEN_GIVEAWAY = 173;       // @dev 100 tokens assigned for giveaways
    uint256 public constant TOKEN_PUBLIC = 9_828;       //@dev 60+12+100+9,9_828 = 10,000 tokens
    uint256 public constant TOKEN_MAX = 10_000;
    uint256 private constant WEI_ETH = 1000000000000000000;

    bool public isActive = false;
    bool public isWhiteListActive = false;
    string public proof;
    uint256 public priceConverter;

    uint256 public whiteListMaxMint = 1;

    /// @dev We will use these to be able to calculate remaining correctly.
    uint256 public totalPurchaseSupply = 0;         // from 1 to 60
    uint256 public totalTeamAssignedSupply = 60;    // from 61 to 72
    uint256 public totalGiveAwaySupply = 72;        // from 73 to 173
    uint256 public totalPublicSupply = 173;         // from 174 to 9_828


    mapping(address => uint256) private _whiteListClaimed;

    string private _contractURI = '';
    string private _tokenBaseURI = '';
    string private _tokenRevealedBaseURI = '';


    //Price Table

    uint256[60] private prices  = [
    1_500_000.00,
    1_510_000.00,
    1_520_000.00,
    1_530_000.00,
    1_540_000.00,
    1_550_000.00,
    1_560_000.00,
    1_570_000.00,
    1_580_000.00,
    1_590_000.00,
    1_600_000.00,
    1_610_000.00,
    1_620_000.00,
    1_630_000.00,
    1_640_000.00,
    1_650_000.00,
    1_660_000.00,
    1_670_000.00,
    1_680_000.00,
    1_690_000.00,
    1_700_000.00,
    1_710_000.00,
    1_720_000.00,
    1_730_000.00,
    1_740_000.00,
    1_750_000.00,
    1_760_000.00,
    1_770_000.00,
    1_780_000.00,
    1_790_000.00,
    1_800_000.00,
    1_810_000.00,
    1_820_000.00,
    1_830_000.00,
    1_840_000.00,
    1_850_000.00,
    1_860_000.00,
    1_870_000.00,
    1_880_000.00,
    1_890_000.00,
    1_900_000.00,
    1_910_000.00,
    1_920_000.00,
    1_930_000.00,
    1_940_000.00,
    1_950_000.00,
    1_960_000.00,
    1_970_000.00,
    1_980_000.00,
    1_990_000.00,
    2_000_000.00,
    2_010_000.00,
    2_030_000.00,
    2_050_000.00,
    2_070_000.00,
    2_090_000.00,
    2_110_000.00,
    2_130_000.00,
    2_150_000.00,
    2_170_000.00
    ];

    //EVENTS

    event whiteList(address indexed _account, bool _value);
    event tokenClaimed(address indexed _account, uint256 _id);
    event tokenPurchased(address indexed _account, uint256 _id, uint256 _priceOfPurchase, string _parcelId);
    event contractURIUpdated(address indexed _account);
    event baseURIUpdated(address indexed _account);
    event isRevealedBaseURI(address indexed _account);

    constructor(string memory name, string memory symbol) ERC721(name, symbol) {}

    /*
    * @dev Verifies if message was signed by owner to give access to _add for this contract.
    *      Assumes Geth signature prefix.
    * @param _sig Message signature.
    * @return Validity of access message for a given address.
    */
    function isValidAccessMessage(bytes memory _sig) internal view returns (bool) {
        bytes32 hash = keccak256(abi.encodePacked(address(this), msg.sender));

        bytes32 r;
        bytes32 s;
        uint8 v;

        // Divide the signature in r, s and v variables
        assembly {
            r := mload(add(_sig, 32))
            s := mload(add(_sig, 64))
            v := byte(0, mload(add(_sig, 96)))
        }

        return owner() == ecrecover(hash, v, r, s);
    }


    /**
    * @dev We want to be able to distinguish tokens bought during isWhiteListActive
    * and tokens bought outside of isWhiteListActive
    */
    function whiteListClaimedBy(address _add) external view override returns (uint256){
        require(_add != address(0), 'Zero address not on Allow List');

        return _whiteListClaimed[_add];
    }


    /**
     * setPrice Converter
     *
     */

    function setPriceConversion(uint256 _priceConverter) external onlyOwner {
        priceConverter = _priceConverter;
    }

    /**
     *
     * Get the price from given Token ID
     *
     */
    function getCalculatedPriceByToken(uint256 tokenNumber) external view returns (uint256) {

        require (tokenNumber > 0 && tokenNumber<= 60, 'Token Overflow');

        return getCalculatedPrice(tokenNumber);
    }

    /**
     *
     * Get the current price of the token that is next to be purchased
     *
     */
    function getCurrentCalculatedPrice() external view returns (uint256) {

        return getCalculatedPrice(totalPurchaseSupply + 1);
    }

    /**
     *
     * calculate the price
     *
     */

    function getCalculatedPrice(uint256 tokenNumber) internal view returns (uint256) {

        require(priceConverter > 0, 'Price conversion must be greater than 0');

        uint256 priceUSD = prices[tokenNumber - 1];
        uint256 priceETH = priceUSD / priceConverter;

        return priceETH;
    }

    /**
     *
     * Purchase parcels from 1 to 60 according to the price
     *
     */

    function purchase(string memory parcelId) external override payable {

        require(isActive, 'Contract is not active');
        require(totalSupply() < TOKEN_MAX, 'All tokens have been minted');
        require(totalPurchaseSupply < TOKEN_PURCHASE, 'Purchase would exceed TOKEN_PURCHASE');
        require(getCalculatedPrice(totalPurchaseSupply + 1) * WEI_ETH <= msg.value, 'ETH amount is not sufficient');

        uint256 tokenId = totalPurchaseSupply + 1;

        totalPurchaseSupply += 1;
        _safeMint(msg.sender, tokenId);

        //@dev we return the _parcelId to register it in the Metadada.

        emit tokenPurchased(msg.sender, tokenId, getCalculatedPrice(totalPurchaseSupply + 1), parcelId);
    }



    /**
     *
     * Claim From White List, not payable but claimable only trough White list
     *
     */

    function claimWhiteList(bytes memory _sig) external override {

        require(isActive, 'Contract is not active');
        require(isWhiteListActive, 'White List is not active');
        require(totalSupply() < TOKEN_MAX, 'All tokens have been minted');
        require(totalPublicSupply + 1 <= TOKEN_PUBLIC, 'Purchase would exceed TOKEN_PUBLIC');
        require(isValidAccessMessage(_sig), 'Not on the whitelist');
        require(_whiteListClaimed[msg.sender] + 1 <= whiteListMaxMint, 'Purchase exceeds max allowed');

        uint256 tokenId = totalPublicSupply + 1;

        totalPublicSupply += 1;
        _whiteListClaimed[msg.sender] += 1;
        _safeMint(msg.sender, tokenId);

        emit tokenClaimed(msg.sender, tokenId);
    }

    /**
     *
     * Claim tokens assigned for the team
     *
     **/

    function claimTeam() external override onlyOwner {

        require(isActive, 'Contract is not active');
        require(totalSupply() < TOKEN_MAX, 'All tokens have been minted');
        require(totalTeamAssignedSupply + 1 <= TOKEN_TEAM_ASSIGNED, 'claimTeam would exceed TOKEN_TEAM_ASSIGNED');

        for (uint i = 0; i < 12; i++) {

            uint256 tokenId = totalTeamAssignedSupply + 1;

            totalTeamAssignedSupply += 1;
            _safeMint(msg.sender, tokenId);

            emit tokenClaimed(msg.sender, tokenId);

        }

    }

    /**
     *
     * Claim tokens assigned for giveaways
     *
     **/

    function claimGiveAway() external override onlyOwner {

        require(isActive, 'Contract is not active');
        require(totalSupply() < TOKEN_MAX, 'All tokens have been minted');
        require(totalGiveAwaySupply + 1 <= TOKEN_GIVEAWAY, 'claimGiveAway would exceed TOKEN_GIVEAWAY');

        for (uint i = 0; i < 100; i++) {

            uint256 tokenId = totalGiveAwaySupply + 1;

            totalGiveAwaySupply += 1;
            _safeMint(msg.sender, tokenId);

            emit tokenClaimed(msg.sender, tokenId);

        }

    }


    function setIsActive(bool _isActive) external override onlyOwner {

        require(priceConverter > 0, 'Must set a price convertion first');

        isActive = _isActive;
    }

    function setIsWhiteListActive(bool _isWhiteListActive) external override onlyOwner {
        isWhiteListActive = _isWhiteListActive;
    }

    function setProof(string calldata proofString) external override onlyOwner {
        proof = proofString;
    }

    function withdraw() external override onlyOwner {
        uint256 balance = address(this).balance;

        payable(msg.sender).transfer(balance);
    }

    function setContractURI(string calldata URI) external override onlyOwner {
        _contractURI = URI;

        emit contractURIUpdated(msg.sender);
    }

    function setBaseURI(string calldata URI) external override onlyOwner {
        _tokenBaseURI = URI;

        emit baseURIUpdated(msg.sender);
    }

    function setRevealedBaseURI(string calldata revealedBaseURI) external override onlyOwner {
        _tokenRevealedBaseURI = revealedBaseURI;

        emit isRevealedBaseURI(msg.sender);
    }

    function contractURI() public view override returns (string memory) {
        return _contractURI;
    }

    function tokenURI(uint256 tokenId) public view override(ERC721) returns (string memory) {
        require(_exists(tokenId), 'Token does not exist');

        string memory revealedBaseURI = _tokenRevealedBaseURI;
        return bytes(revealedBaseURI).length > 0 ?
        string(abi.encodePacked(revealedBaseURI, tokenId.toString())) :
        _tokenBaseURI;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_account","type":"address"}],"name":"baseURIUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_account","type":"address"}],"name":"contractURIUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_account","type":"address"}],"name":"isRevealedBaseURI","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_account","type":"address"},{"indexed":false,"internalType":"uint256","name":"_id","type":"uint256"}],"name":"tokenClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_account","type":"address"},{"indexed":false,"internalType":"uint256","name":"_id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_priceOfPurchase","type":"uint256"},{"indexed":false,"internalType":"string","name":"_parcelId","type":"string"}],"name":"tokenPurchased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_account","type":"address"},{"indexed":false,"internalType":"bool","name":"_value","type":"bool"}],"name":"whiteList","type":"event"},{"inputs":[],"name":"TOKEN_GIVEAWAY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKEN_MAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKEN_PUBLIC","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKEN_PURCHASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKEN_TEAM_ASSIGNED","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":"claimGiveAway","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimTeam","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_sig","type":"bytes"}],"name":"claimWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenNumber","type":"uint256"}],"name":"getCalculatedPriceByToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentCalculatedPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"isWhiteListActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"priceConverter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proof","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"parcelId","type":"string"}],"name":"purchase","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"URI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"URI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isActive","type":"bool"}],"name":"setIsActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isWhiteListActive","type":"bool"}],"name":"setIsWhiteListActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_priceConverter","type":"uint256"}],"name":"setPriceConversion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"proofString","type":"string"}],"name":"setProof","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"revealedBaseURI","type":"string"}],"name":"setRevealedBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalGiveAwaySupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalPublicSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalPurchaseSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalTeamAssignedSupply","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","name":"_add","type":"address"}],"name":"whiteListClaimedBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whiteListMaxMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600a60146101000a81548160ff0219169083151502179055506000600a60156101000a81548160ff0219169083151502179055506001600d556000600e55603c600f55604860105560ad60115560405180602001604052806000815250601390805190602001906200007a9291906200058f565b506040518060200160405280600081525060149080519060200190620000a29291906200058f565b506040518060200160405280600081525060159080519060200190620000ca9291906200058f565b506040518061078001604052806216e36062ffffff16815260200162170a7062ffffff1681526020016217318062ffffff1681526020016217589062ffffff16815260200162177fa062ffffff1681526020016217a6b062ffffff1681526020016217cdc062ffffff1681526020016217f4d062ffffff16815260200162181be062ffffff168152602001621842f062ffffff16815260200162186a0062ffffff1681526020016218911062ffffff1681526020016218b82062ffffff1681526020016218df3062ffffff1681526020016219064062ffffff16815260200162192d5062ffffff1681526020016219546062ffffff16815260200162197b7062ffffff1681526020016219a28062ffffff1681526020016219c99062ffffff1681526020016219f0a062ffffff168152602001621a17b062ffffff168152602001621a3ec062ffffff168152602001621a65d062ffffff168152602001621a8ce062ffffff168152602001621ab3f062ffffff168152602001621adb0062ffffff168152602001621b021062ffffff168152602001621b292062ffffff168152602001621b503062ffffff168152602001621b774062ffffff168152602001621b9e5062ffffff168152602001621bc56062ffffff168152602001621bec7062ffffff168152602001621c138062ffffff168152602001621c3a9062ffffff168152602001621c61a062ffffff168152602001621c88b062ffffff168152602001621cafc062ffffff168152602001621cd6d062ffffff168152602001621cfde062ffffff168152602001621d24f062ffffff168152602001621d4c0062ffffff168152602001621d731062ffffff168152602001621d9a2062ffffff168152602001621dc13062ffffff168152602001621de84062ffffff168152602001621e0f5062ffffff168152602001621e366062ffffff168152602001621e5d7062ffffff168152602001621e848062ffffff168152602001621eab9062ffffff168152602001621ef9b062ffffff168152602001621f47d062ffffff168152602001621f95f062ffffff168152602001621fe41062ffffff1681526020016220323062ffffff1681526020016220805062ffffff1681526020016220ce7062ffffff16815260200162211c9062ffffff16815250601690603c6200042f92919062000620565b503480156200043d57600080fd5b50604051620061ac380380620061ac833981810160405281019062000463919062000709565b818181600090805190602001906200047d9291906200058f565b508060019080519060200190620004969291906200058f565b505050620004b9620004ad620004c160201b60201c565b620004c960201b60201c565b505062000912565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200059d9062000823565b90600052602060002090601f016020900481019282620005c157600085556200060d565b82601f10620005dc57805160ff19168380011785556200060d565b828001600101855582156200060d579182015b828111156200060c578251825591602001919060010190620005ef565b5b5090506200061c91906200066c565b5090565b82603c810192821562000659579160200282015b8281111562000658578251829062ffffff1690559160200191906001019062000634565b5b5090506200066891906200066c565b5090565b5b80821115620006875760008160009055506001016200066d565b5090565b6000620006a26200069c84620007b7565b6200078e565b905082815260208101848484011115620006c157620006c0620008f2565b5b620006ce848285620007ed565b509392505050565b600082601f830112620006ee57620006ed620008ed565b5b8151620007008482602086016200068b565b91505092915050565b60008060408385031215620007235762000722620008fc565b5b600083015167ffffffffffffffff811115620007445762000743620008f7565b5b6200075285828601620006d6565b925050602083015167ffffffffffffffff811115620007765762000775620008f7565b5b6200078485828601620006d6565b9150509250929050565b60006200079a620007ad565b9050620007a8828262000859565b919050565b6000604051905090565b600067ffffffffffffffff821115620007d557620007d4620008be565b5b620007e08262000901565b9050602081019050919050565b60005b838110156200080d578082015181840152602081019050620007f0565b838111156200081d576000848401525b50505050565b600060028204905060018216806200083c57607f821691505b602082108114156200085357620008526200088f565b5b50919050565b620008648262000901565b810181811067ffffffffffffffff82111715620008865762000885620008be565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b61588a80620009226000396000f3fe6080604052600436106102ae5760003560e01c8063715018a611610175578063c87b56dd116100dc578063e985e9c511610095578063f7306fd91161006f578063f7306fd914610a91578063faf924cf14610aa8578063fea6edbd14610ad3578063ff37e30614610afe576102ae565b8063e985e9c514610a00578063ee6545e514610a3d578063f2fde38b14610a68576102ae565b8063c87b56dd146108ee578063d83c5e211461092b578063d9f00e7014610956578063e077bc2714610981578063e6a5931e146109aa578063e8a3d485146109d5576102ae565b806395d89b411161012e57806395d89b41146107f0578063a22cb4651461081b578063b350878314610844578063b76f1a881461086f578063b88d4fde1461089a578063b9385510146108c3576102ae565b8063715018a6146107185780637cdd702e1461072f57806382cbb41f1461075a5780638732f826146107715780638da5cb5b1461079c578063938e3d7b146107c7576102ae565b806336279c561161021957806355f804b3116101d257806355f804b314610605578063573f5dae1461062e57806359f5e0ce146106595780636352211e146106755780636e83843a146106b257806370a08231146106db576102ae565b806336279c56146105095780633ccfd60b1461053457806342842e0e1461054b57806349ec975b146105745780634f6ccce71461059d578063536dc1b1146105da576102ae565b80631984b2861161026b5780631984b286146103d557806322f3e2d41461041257806323b872dd1461043d5780632750fc78146104665780632f745c591461048f57806333d63d95146104cc576102ae565b806301ffc9a7146102b357806306fdde03146102f0578063081812fc1461031b578063095ea7b31461035857806315336f801461038157806318160ddd146103aa575b600080fd5b3480156102bf57600080fd5b506102da60048036038101906102d59190613ea6565b610b27565b6040516102e79190614628565b60405180910390f35b3480156102fc57600080fd5b50610305610ba1565b6040516103129190614688565b60405180910390f35b34801561032757600080fd5b50610342600480360381019061033d9190613fdf565b610c33565b60405161034f91906145c1565b60405180910390f35b34801561036457600080fd5b5061037f600480360381019061037a9190613e39565b610cb8565b005b34801561038d57600080fd5b506103a860048036038101906103a39190613f49565b610dd0565b005b3480156103b657600080fd5b506103bf610e62565b6040516103cc9190614aaa565b60405180910390f35b3480156103e157600080fd5b506103fc60048036038101906103f79190613cb6565b610e6f565b6040516104099190614aaa565b60405180910390f35b34801561041e57600080fd5b50610427610f27565b6040516104349190614628565b60405180910390f35b34801561044957600080fd5b50610464600480360381019061045f9190613d23565b610f3a565b005b34801561047257600080fd5b5061048d60048036038101906104889190613e79565b610f9a565b005b34801561049b57600080fd5b506104b660048036038101906104b19190613e39565b611078565b6040516104c39190614aaa565b60405180910390f35b3480156104d857600080fd5b506104f360048036038101906104ee9190613fdf565b61111d565b6040516105009190614aaa565b60405180910390f35b34801561051557600080fd5b5061051e61117e565b60405161052b9190614aaa565b60405180910390f35b34801561054057600080fd5b50610549611184565b005b34801561055757600080fd5b50610572600480360381019061056d9190613d23565b61124f565b005b34801561058057600080fd5b5061059b60048036038101906105969190613e79565b61126f565b005b3480156105a957600080fd5b506105c460048036038101906105bf9190613fdf565b611308565b6040516105d19190614aaa565b60405180910390f35b3480156105e657600080fd5b506105ef611379565b6040516105fc9190614aaa565b60405180910390f35b34801561061157600080fd5b5061062c60048036038101906106279190613f49565b61137e565b005b34801561063a57600080fd5b50610643611453565b6040516106509190614628565b60405180910390f35b610673600480360381019061066e9190613f96565b611466565b005b34801561068157600080fd5b5061069c60048036038101906106979190613fdf565b611654565b6040516106a991906145c1565b60405180910390f35b3480156106be57600080fd5b506106d960048036038101906106d49190613f49565b611706565b005b3480156106e757600080fd5b5061070260048036038101906106fd9190613cb6565b6117db565b60405161070f9190614aaa565b60405180910390f35b34801561072457600080fd5b5061072d611893565b005b34801561073b57600080fd5b5061074461191b565b6040516107519190614aaa565b60405180910390f35b34801561076657600080fd5b5061076f611921565b005b34801561077d57600080fd5b50610786611b31565b6040516107939190614aaa565b60405180910390f35b3480156107a857600080fd5b506107b1611b36565b6040516107be91906145c1565b60405180910390f35b3480156107d357600080fd5b506107ee60048036038101906107e99190613f49565b611b60565b005b3480156107fc57600080fd5b50610805611c35565b6040516108129190614688565b60405180910390f35b34801561082757600080fd5b50610842600480360381019061083d9190613df9565b611cc7565b005b34801561085057600080fd5b50610859611e48565b6040516108669190614aaa565b60405180910390f35b34801561087b57600080fd5b50610884611e4e565b6040516108919190614aaa565b60405180910390f35b3480156108a657600080fd5b506108c160048036038101906108bc9190613d76565b611e54565b005b3480156108cf57600080fd5b506108d8611eb6565b6040516108e59190614aaa565b60405180910390f35b3480156108fa57600080fd5b5061091560048036038101906109109190613fdf565b611ebc565b6040516109229190614688565b60405180910390f35b34801561093757600080fd5b50610940612061565b60405161094d9190614aaa565b60405180910390f35b34801561096257600080fd5b5061096b612067565b6040516109789190614aaa565b60405180910390f35b34801561098d57600080fd5b506109a860048036038101906109a39190613f00565b61206d565b005b3480156109b657600080fd5b506109bf612361565b6040516109cc9190614aaa565b60405180910390f35b3480156109e157600080fd5b506109ea612367565b6040516109f79190614688565b60405180910390f35b348015610a0c57600080fd5b50610a276004803603810190610a229190613ce3565b6123f9565b604051610a349190614628565b60405180910390f35b348015610a4957600080fd5b50610a5261248d565b604051610a5f9190614aaa565b60405180910390f35b348015610a7457600080fd5b50610a8f6004803603810190610a8a9190613cb6565b6124ab565b005b348015610a9d57600080fd5b50610aa66125a3565b005b348015610ab457600080fd5b50610abd6127b3565b604051610aca9190614688565b60405180910390f35b348015610adf57600080fd5b50610ae8612841565b604051610af59190614aaa565b60405180910390f35b348015610b0a57600080fd5b50610b256004803603810190610b209190613fdf565b612846565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b9a5750610b99826128cc565b5b9050919050565b606060008054610bb090614daf565b80601f0160208091040260200160405190810160405280929190818152602001828054610bdc90614daf565b8015610c295780601f10610bfe57610100808354040283529160200191610c29565b820191906000526020600020905b815481529060010190602001808311610c0c57829003601f168201915b5050505050905090565b6000610c3e826129ae565b610c7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c749061494a565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610cc382611654565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2b906149ca565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d53612a1a565b73ffffffffffffffffffffffffffffffffffffffff161480610d825750610d8181610d7c612a1a565b6123f9565b5b610dc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db89061488a565b60405180910390fd5b610dcb8383612a22565b505050565b610dd8612a1a565b73ffffffffffffffffffffffffffffffffffffffff16610df6611b36565b73ffffffffffffffffffffffffffffffffffffffff1614610e4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e439061496a565b60405180910390fd5b8181600b9190610e5d929190613a74565b505050565b6000600880549050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ee0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed79061498a565b60405180910390fd5b601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600a60149054906101000a900460ff1681565b610f4b610f45612a1a565b82612adb565b610f8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8190614a0a565b60405180910390fd5b610f95838383612bb9565b505050565b610fa2612a1a565b73ffffffffffffffffffffffffffffffffffffffff16610fc0611b36565b73ffffffffffffffffffffffffffffffffffffffff1614611016576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100d9061496a565b60405180910390fd5b6000600c541161105b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105290614a8a565b60405180910390fd5b80600a60146101000a81548160ff02191690831515021790555050565b6000611083836117db565b82106110c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110bb906146ca565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6000808211801561112f5750603c8211155b61116e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611165906147ca565b60405180910390fd5b61117782612e15565b9050919050565b600f5481565b61118c612a1a565b73ffffffffffffffffffffffffffffffffffffffff166111aa611b36565b73ffffffffffffffffffffffffffffffffffffffff1614611200576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f79061496a565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561124b573d6000803e3d6000fd5b5050565b61126a83838360405180602001604052806000815250611e54565b505050565b611277612a1a565b73ffffffffffffffffffffffffffffffffffffffff16611295611b36565b73ffffffffffffffffffffffffffffffffffffffff16146112eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e29061496a565b60405180910390fd5b80600a60156101000a81548160ff02191690831515021790555050565b6000611312610e62565b8210611353576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134a90614a2a565b60405180910390fd5b6008828154811061136757611366614f6c565b5b90600052602060002001549050919050565b603c81565b611386612a1a565b73ffffffffffffffffffffffffffffffffffffffff166113a4611b36565b73ffffffffffffffffffffffffffffffffffffffff16146113fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f19061496a565b60405180910390fd5b81816014919061140b929190613a74565b503373ffffffffffffffffffffffffffffffffffffffff167fc842f4dfe4215c408fa650bb88f234a80088c930fbab638c4b2c4bfddba8ebd760405160405180910390a25050565b600a60159054906101000a900460ff1681565b600a60149054906101000a900460ff166114b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ac9061492a565b60405180910390fd5b6127106114c0610e62565b10611500576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f790614a6a565b60405180910390fd5b603c600e5410611545576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153c9061486a565b60405180910390fd5b34670de0b6b3a76400006115666001600e546115619190614bcd565b612e15565b6115709190614c54565b11156115b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a89061480a565b60405180910390fd5b60006001600e546115c29190614bcd565b90506001600e60008282546115d79190614bcd565b925050819055506115e83382612e9d565b3373ffffffffffffffffffffffffffffffffffffffff167faf1dc3f9bb86e57c82d5576ef3f942de85524b91ab570b5f2a3fc5fb401358c3826116386001600e546116339190614bcd565b612e15565b8560405161164893929190614ac5565b60405180910390a25050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156116fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f4906148ca565b60405180910390fd5b80915050919050565b61170e612a1a565b73ffffffffffffffffffffffffffffffffffffffff1661172c611b36565b73ffffffffffffffffffffffffffffffffffffffff1614611782576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117799061496a565b60405180910390fd5b818160159190611793929190613a74565b503373ffffffffffffffffffffffffffffffffffffffff167f3fae34e5ef124a15bcb1a113d5473f9a1344a33edf274a9e351430c35202b69b60405160405180910390a25050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561184c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611843906148aa565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61189b612a1a565b73ffffffffffffffffffffffffffffffffffffffff166118b9611b36565b73ffffffffffffffffffffffffffffffffffffffff161461190f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119069061496a565b60405180910390fd5b6119196000612ebb565b565b600d5481565b611929612a1a565b73ffffffffffffffffffffffffffffffffffffffff16611947611b36565b73ffffffffffffffffffffffffffffffffffffffff161461199d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119949061496a565b60405180910390fd5b600a60149054906101000a900460ff166119ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e39061492a565b60405180910390fd5b6127106119f7610e62565b10611a37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2e90614a6a565b60405180910390fd5b60ad6001601054611a489190614bcd565b1115611a89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a809061476a565b60405180910390fd5b60005b6064811015611b2e5760006001601054611aa69190614bcd565b9050600160106000828254611abb9190614bcd565b92505081905550611acc3382612e9d565b3373ffffffffffffffffffffffffffffffffffffffff167fea3bb667c143cc56206b0480550c1c922ab78540548a0504f750fb2fe61ac86582604051611b129190614aaa565b60405180910390a2508080611b2690614e12565b915050611a8c565b50565b60ad81565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611b68612a1a565b73ffffffffffffffffffffffffffffffffffffffff16611b86611b36565b73ffffffffffffffffffffffffffffffffffffffff1614611bdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd39061496a565b60405180910390fd5b818160139190611bed929190613a74565b503373ffffffffffffffffffffffffffffffffffffffff167fef3a19841c5daf8605d9a6c265371c4bb03075204df6bb0f9173b36afd70dccc60405160405180910390a25050565b606060018054611c4490614daf565b80601f0160208091040260200160405190810160405280929190818152602001828054611c7090614daf565b8015611cbd5780601f10611c9257610100808354040283529160200191611cbd565b820191906000526020600020905b815481529060010190602001808311611ca057829003601f168201915b5050505050905090565b611ccf612a1a565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d34906147aa565b60405180910390fd5b8060056000611d4a612a1a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611df7612a1a565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e3c9190614628565b60405180910390a35050565b61271081565b61266481565b611e65611e5f612a1a565b83612adb565b611ea4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9b90614a0a565b60405180910390fd5b611eb084848484612f81565b50505050565b600c5481565b6060611ec7826129ae565b611f06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611efd906147ea565b60405180910390fd5b600060158054611f1590614daf565b80601f0160208091040260200160405190810160405280929190818152602001828054611f4190614daf565b8015611f8e5780601f10611f6357610100808354040283529160200191611f8e565b820191906000526020600020905b815481529060010190602001808311611f7157829003601f168201915b50505050509050600081511161202e5760148054611fab90614daf565b80601f0160208091040260200160405190810160405280929190818152602001828054611fd790614daf565b80156120245780601f10611ff957610100808354040283529160200191612024565b820191906000526020600020905b81548152906001019060200180831161200757829003601f168201915b5050505050612059565b8061203884612fdd565b60405160200161204992919061459d565b6040516020818303038152906040525b915050919050565b60105481565b600e5481565b600a60149054906101000a900460ff166120bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b39061492a565b60405180910390fd5b600a60159054906101000a900460ff1661210b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612102906146aa565b60405180910390fd5b612710612116610e62565b10612156576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214d90614a6a565b60405180910390fd5b61266460016011546121689190614bcd565b11156121a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a0906149ea565b60405180910390fd5b6121b28161313e565b6121f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e89061472a565b60405180910390fd5b600d546001601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546122409190614bcd565b1115612281576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227890614a4a565b60405180910390fd5b600060016011546122929190614bcd565b90506001601160008282546122a79190614bcd565b925050819055506001601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122fe9190614bcd565b9250508190555061230f3382612e9d565b3373ffffffffffffffffffffffffffffffffffffffff167fea3bb667c143cc56206b0480550c1c922ab78540548a0504f750fb2fe61ac865826040516123559190614aaa565b60405180910390a25050565b60115481565b60606013805461237690614daf565b80601f01602080910402602001604051908101604052809291908181526020018280546123a290614daf565b80156123ef5780601f106123c4576101008083540402835291602001916123ef565b820191906000526020600020905b8154815290600101906020018083116123d257829003601f168201915b5050505050905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60006124a66001600e546124a19190614bcd565b612e15565b905090565b6124b3612a1a565b73ffffffffffffffffffffffffffffffffffffffff166124d1611b36565b73ffffffffffffffffffffffffffffffffffffffff1614612527576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251e9061496a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612597576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258e9061470a565b60405180910390fd5b6125a081612ebb565b50565b6125ab612a1a565b73ffffffffffffffffffffffffffffffffffffffff166125c9611b36565b73ffffffffffffffffffffffffffffffffffffffff161461261f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126169061496a565b60405180910390fd5b600a60149054906101000a900460ff1661266e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126659061492a565b60405180910390fd5b612710612679610e62565b106126b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126b090614a6a565b60405180910390fd5b60486001600f546126ca9190614bcd565b111561270b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127029061484a565b60405180910390fd5b60005b600c8110156127b05760006001600f546127289190614bcd565b90506001600f600082825461273d9190614bcd565b9250508190555061274e3382612e9d565b3373ffffffffffffffffffffffffffffffffffffffff167fea3bb667c143cc56206b0480550c1c922ab78540548a0504f750fb2fe61ac865826040516127949190614aaa565b60405180910390a25080806127a890614e12565b91505061270e565b50565b600b80546127c090614daf565b80601f01602080910402602001604051908101604052809291908181526020018280546127ec90614daf565b80156128395780601f1061280e57610100808354040283529160200191612839565b820191906000526020600020905b81548152906001019060200180831161281c57829003601f168201915b505050505081565b604881565b61284e612a1a565b73ffffffffffffffffffffffffffffffffffffffff1661286c611b36565b73ffffffffffffffffffffffffffffffffffffffff16146128c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128b99061496a565b60405180910390fd5b80600c8190555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061299757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806129a757506129a682613218565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612a9583611654565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612ae6826129ae565b612b25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1c9061482a565b60405180910390fd5b6000612b3083611654565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612b9f57508373ffffffffffffffffffffffffffffffffffffffff16612b8784610c33565b73ffffffffffffffffffffffffffffffffffffffff16145b80612bb05750612baf81856123f9565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612bd982611654565b73ffffffffffffffffffffffffffffffffffffffff1614612c2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c26906149aa565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c969061478a565b60405180910390fd5b612caa838383613282565b612cb5600082612a22565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d059190614cae565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d5c9190614bcd565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600080600c5411612e5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e52906148ea565b60405180910390fd5b60006016600184612e6c9190614cae565b603c8110612e7d57612e7c614f6c565b5b015490506000600c5482612e919190614c23565b90508092505050919050565b612eb7828260405180602001604052806000815250613396565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612f8c848484612bb9565b612f98848484846133f1565b612fd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fce906146ea565b60405180910390fd5b50505050565b60606000821415613025576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613139565b600082905060005b6000821461305757808061304090614e12565b915050600a826130509190614c23565b915061302d565b60008167ffffffffffffffff81111561307357613072614f9b565b5b6040519080825280601f01601f1916602001820160405280156130a55781602001600182028036833780820191505090505b5090505b60008514613132576001826130be9190614cae565b9150600a856130cd9190614e7f565b60306130d99190614bcd565b60f81b8183815181106130ef576130ee614f6c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561312b9190614c23565b94506130a9565b8093505050505b919050565b6000803033604051602001613154929190614571565b60405160208183030381529060405280519060200120905060008060006020860151925060408601519150606086015160001a9050600184828585604051600081526020016040526040516131ac9493929190614643565b6020604051602081039080840390855afa1580156131ce573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff166131f6611b36565b73ffffffffffffffffffffffffffffffffffffffff1614945050505050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61328d838383613588565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156132d0576132cb8161358d565b61330f565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461330e5761330d83826135d6565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156133525761334d81613743565b613391565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146133905761338f8282613814565b5b5b505050565b6133a08383613893565b6133ad60008484846133f1565b6133ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133e3906146ea565b60405180910390fd5b505050565b60006134128473ffffffffffffffffffffffffffffffffffffffff16613a61565b1561357b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261343b612a1a565b8786866040518563ffffffff1660e01b815260040161345d94939291906145dc565b602060405180830381600087803b15801561347757600080fd5b505af19250505080156134a857506040513d601f19601f820116820180604052508101906134a59190613ed3565b60015b61352b573d80600081146134d8576040519150601f19603f3d011682016040523d82523d6000602084013e6134dd565b606091505b50600081511415613523576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161351a906146ea565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613580565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016135e3846117db565b6135ed9190614cae565b90506000600760008481526020019081526020016000205490508181146136d2576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506137579190614cae565b905060006009600084815260200190815260200160002054905060006008838154811061378757613786614f6c565b5b9060005260206000200154905080600883815481106137a9576137a8614f6c565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806137f8576137f7614f3d565b5b6001900381819060005260206000200160009055905550505050565b600061381f836117db565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613903576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138fa9061490a565b60405180910390fd5b61390c816129ae565b1561394c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139439061474a565b60405180910390fd5b61395860008383613282565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546139a89190614bcd565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054613a8090614daf565b90600052602060002090601f016020900481019282613aa25760008555613ae9565b82601f10613abb57803560ff1916838001178555613ae9565b82800160010185558215613ae9579182015b82811115613ae8578235825591602001919060010190613acd565b5b509050613af69190613afa565b5090565b5b80821115613b13576000816000905550600101613afb565b5090565b6000613b2a613b2584614b28565b614b03565b905082815260208101848484011115613b4657613b45614fd9565b5b613b51848285614d6d565b509392505050565b6000613b6c613b6784614b59565b614b03565b905082815260208101848484011115613b8857613b87614fd9565b5b613b93848285614d6d565b509392505050565b600081359050613baa816157f8565b92915050565b600081359050613bbf8161580f565b92915050565b600081359050613bd481615826565b92915050565b600081519050613be981615826565b92915050565b600082601f830112613c0457613c03614fcf565b5b8135613c14848260208601613b17565b91505092915050565b60008083601f840112613c3357613c32614fcf565b5b8235905067ffffffffffffffff811115613c5057613c4f614fca565b5b602083019150836001820283011115613c6c57613c6b614fd4565b5b9250929050565b600082601f830112613c8857613c87614fcf565b5b8135613c98848260208601613b59565b91505092915050565b600081359050613cb08161583d565b92915050565b600060208284031215613ccc57613ccb614fe3565b5b6000613cda84828501613b9b565b91505092915050565b60008060408385031215613cfa57613cf9614fe3565b5b6000613d0885828601613b9b565b9250506020613d1985828601613b9b565b9150509250929050565b600080600060608486031215613d3c57613d3b614fe3565b5b6000613d4a86828701613b9b565b9350506020613d5b86828701613b9b565b9250506040613d6c86828701613ca1565b9150509250925092565b60008060008060808587031215613d9057613d8f614fe3565b5b6000613d9e87828801613b9b565b9450506020613daf87828801613b9b565b9350506040613dc087828801613ca1565b925050606085013567ffffffffffffffff811115613de157613de0614fde565b5b613ded87828801613bef565b91505092959194509250565b60008060408385031215613e1057613e0f614fe3565b5b6000613e1e85828601613b9b565b9250506020613e2f85828601613bb0565b9150509250929050565b60008060408385031215613e5057613e4f614fe3565b5b6000613e5e85828601613b9b565b9250506020613e6f85828601613ca1565b9150509250929050565b600060208284031215613e8f57613e8e614fe3565b5b6000613e9d84828501613bb0565b91505092915050565b600060208284031215613ebc57613ebb614fe3565b5b6000613eca84828501613bc5565b91505092915050565b600060208284031215613ee957613ee8614fe3565b5b6000613ef784828501613bda565b91505092915050565b600060208284031215613f1657613f15614fe3565b5b600082013567ffffffffffffffff811115613f3457613f33614fde565b5b613f4084828501613bef565b91505092915050565b60008060208385031215613f6057613f5f614fe3565b5b600083013567ffffffffffffffff811115613f7e57613f7d614fde565b5b613f8a85828601613c1d565b92509250509250929050565b600060208284031215613fac57613fab614fe3565b5b600082013567ffffffffffffffff811115613fca57613fc9614fde565b5b613fd684828501613c73565b91505092915050565b600060208284031215613ff557613ff4614fe3565b5b600061400384828501613ca1565b91505092915050565b61401581614ce2565b82525050565b61402c61402782614ce2565b614e5b565b82525050565b61403b81614cf4565b82525050565b61404a81614d00565b82525050565b600061405b82614b8a565b6140658185614ba0565b9350614075818560208601614d7c565b61407e81614fe8565b840191505092915050565b600061409482614b95565b61409e8185614bb1565b93506140ae818560208601614d7c565b6140b781614fe8565b840191505092915050565b60006140cd82614b95565b6140d78185614bc2565b93506140e7818560208601614d7c565b80840191505092915050565b6000614100601883614bb1565b915061410b82615006565b602082019050919050565b6000614123602b83614bb1565b915061412e8261502f565b604082019050919050565b6000614146603283614bb1565b91506141518261507e565b604082019050919050565b6000614169602683614bb1565b9150614174826150cd565b604082019050919050565b600061418c601483614bb1565b91506141978261511c565b602082019050919050565b60006141af601c83614bb1565b91506141ba82615145565b602082019050919050565b60006141d2602983614bb1565b91506141dd8261516e565b604082019050919050565b60006141f5602483614bb1565b9150614200826151bd565b604082019050919050565b6000614218601983614bb1565b91506142238261520c565b602082019050919050565b600061423b600e83614bb1565b915061424682615235565b602082019050919050565b600061425e601483614bb1565b91506142698261525e565b602082019050919050565b6000614281601c83614bb1565b915061428c82615287565b602082019050919050565b60006142a4602c83614bb1565b91506142af826152b0565b604082019050919050565b60006142c7602a83614bb1565b91506142d2826152ff565b604082019050919050565b60006142ea602483614bb1565b91506142f58261534e565b604082019050919050565b600061430d603883614bb1565b91506143188261539d565b604082019050919050565b6000614330602a83614bb1565b915061433b826153ec565b604082019050919050565b6000614353602983614bb1565b915061435e8261543b565b604082019050919050565b6000614376602783614bb1565b91506143818261548a565b604082019050919050565b6000614399602083614bb1565b91506143a4826154d9565b602082019050919050565b60006143bc601683614bb1565b91506143c782615502565b602082019050919050565b60006143df602c83614bb1565b91506143ea8261552b565b604082019050919050565b6000614402602083614bb1565b915061440d8261557a565b602082019050919050565b6000614425601e83614bb1565b9150614430826155a3565b602082019050919050565b6000614448602983614bb1565b9150614453826155cc565b604082019050919050565b600061446b602183614bb1565b91506144768261561b565b604082019050919050565b600061448e602283614bb1565b91506144998261566a565b604082019050919050565b60006144b1603183614bb1565b91506144bc826156b9565b604082019050919050565b60006144d4602c83614bb1565b91506144df82615708565b604082019050919050565b60006144f7601c83614bb1565b915061450282615757565b602082019050919050565b600061451a601b83614bb1565b915061452582615780565b602082019050919050565b600061453d602183614bb1565b9150614548826157a9565b604082019050919050565b61455c81614d56565b82525050565b61456b81614d60565b82525050565b600061457d828561401b565b60148201915061458d828461401b565b6014820191508190509392505050565b60006145a982856140c2565b91506145b582846140c2565b91508190509392505050565b60006020820190506145d6600083018461400c565b92915050565b60006080820190506145f1600083018761400c565b6145fe602083018661400c565b61460b6040830185614553565b818103606083015261461d8184614050565b905095945050505050565b600060208201905061463d6000830184614032565b92915050565b60006080820190506146586000830187614041565b6146656020830186614562565b6146726040830185614041565b61467f6060830184614041565b95945050505050565b600060208201905081810360008301526146a28184614089565b905092915050565b600060208201905081810360008301526146c3816140f3565b9050919050565b600060208201905081810360008301526146e381614116565b9050919050565b6000602082019050818103600083015261470381614139565b9050919050565b600060208201905081810360008301526147238161415c565b9050919050565b600060208201905081810360008301526147438161417f565b9050919050565b60006020820190508181036000830152614763816141a2565b9050919050565b60006020820190508181036000830152614783816141c5565b9050919050565b600060208201905081810360008301526147a3816141e8565b9050919050565b600060208201905081810360008301526147c38161420b565b9050919050565b600060208201905081810360008301526147e38161422e565b9050919050565b6000602082019050818103600083015261480381614251565b9050919050565b6000602082019050818103600083015261482381614274565b9050919050565b6000602082019050818103600083015261484381614297565b9050919050565b60006020820190508181036000830152614863816142ba565b9050919050565b60006020820190508181036000830152614883816142dd565b9050919050565b600060208201905081810360008301526148a381614300565b9050919050565b600060208201905081810360008301526148c381614323565b9050919050565b600060208201905081810360008301526148e381614346565b9050919050565b6000602082019050818103600083015261490381614369565b9050919050565b600060208201905081810360008301526149238161438c565b9050919050565b60006020820190508181036000830152614943816143af565b9050919050565b60006020820190508181036000830152614963816143d2565b9050919050565b60006020820190508181036000830152614983816143f5565b9050919050565b600060208201905081810360008301526149a381614418565b9050919050565b600060208201905081810360008301526149c38161443b565b9050919050565b600060208201905081810360008301526149e38161445e565b9050919050565b60006020820190508181036000830152614a0381614481565b9050919050565b60006020820190508181036000830152614a23816144a4565b9050919050565b60006020820190508181036000830152614a43816144c7565b9050919050565b60006020820190508181036000830152614a63816144ea565b9050919050565b60006020820190508181036000830152614a838161450d565b9050919050565b60006020820190508181036000830152614aa381614530565b9050919050565b6000602082019050614abf6000830184614553565b92915050565b6000606082019050614ada6000830186614553565b614ae76020830185614553565b8181036040830152614af98184614089565b9050949350505050565b6000614b0d614b1e565b9050614b198282614de1565b919050565b6000604051905090565b600067ffffffffffffffff821115614b4357614b42614f9b565b5b614b4c82614fe8565b9050602081019050919050565b600067ffffffffffffffff821115614b7457614b73614f9b565b5b614b7d82614fe8565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614bd882614d56565b9150614be383614d56565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614c1857614c17614eb0565b5b828201905092915050565b6000614c2e82614d56565b9150614c3983614d56565b925082614c4957614c48614edf565b5b828204905092915050565b6000614c5f82614d56565b9150614c6a83614d56565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614ca357614ca2614eb0565b5b828202905092915050565b6000614cb982614d56565b9150614cc483614d56565b925082821015614cd757614cd6614eb0565b5b828203905092915050565b6000614ced82614d36565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015614d9a578082015181840152602081019050614d7f565b83811115614da9576000848401525b50505050565b60006002820490506001821680614dc757607f821691505b60208210811415614ddb57614dda614f0e565b5b50919050565b614dea82614fe8565b810181811067ffffffffffffffff82111715614e0957614e08614f9b565b5b80604052505050565b6000614e1d82614d56565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614e5057614e4f614eb0565b5b600182019050919050565b6000614e6682614e6d565b9050919050565b6000614e7882614ff9565b9050919050565b6000614e8a82614d56565b9150614e9583614d56565b925082614ea557614ea4614edf565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f5768697465204c697374206973206e6f74206163746976650000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4e6f74206f6e207468652077686974656c697374000000000000000000000000600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f636c61696d476976654177617920776f756c642065786365656420544f4b454e60008201527f5f47495645415741590000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f546f6b656e204f766572666c6f77000000000000000000000000000000000000600082015250565b7f546f6b656e20646f6573206e6f74206578697374000000000000000000000000600082015250565b7f45544820616d6f756e74206973206e6f742073756666696369656e7400000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f636c61696d5465616d20776f756c642065786365656420544f4b454e5f54454160008201527f4d5f41535349474e454400000000000000000000000000000000000000000000602082015250565b7f507572636861736520776f756c642065786365656420544f4b454e5f5055524360008201527f4841534500000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f507269636520636f6e76657273696f6e206d757374206265206772656174657260008201527f207468616e203000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f436f6e7472616374206973206e6f742061637469766500000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f5a65726f2061646472657373206e6f74206f6e20416c6c6f77204c6973740000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f507572636861736520776f756c642065786365656420544f4b454e5f5055424c60008201527f4943000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f50757263686173652065786365656473206d617820616c6c6f77656400000000600082015250565b7f416c6c20746f6b656e732068617665206265656e206d696e7465640000000000600082015250565b7f4d75737420736574206120707269636520636f6e76657274696f6e206669727360008201527f7400000000000000000000000000000000000000000000000000000000000000602082015250565b61580181614ce2565b811461580c57600080fd5b50565b61581881614cf4565b811461582357600080fd5b50565b61582f81614d0a565b811461583a57600080fd5b50565b61584681614d56565b811461585157600080fd5b5056fea264697066735822122024c0a9e7345ff1d610fdf1da6a370a13fa401cff528db0b74f4660ead3433ecf64736f6c6343000807003300000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000a43727970746f4c616e64000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002434c000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102ae5760003560e01c8063715018a611610175578063c87b56dd116100dc578063e985e9c511610095578063f7306fd91161006f578063f7306fd914610a91578063faf924cf14610aa8578063fea6edbd14610ad3578063ff37e30614610afe576102ae565b8063e985e9c514610a00578063ee6545e514610a3d578063f2fde38b14610a68576102ae565b8063c87b56dd146108ee578063d83c5e211461092b578063d9f00e7014610956578063e077bc2714610981578063e6a5931e146109aa578063e8a3d485146109d5576102ae565b806395d89b411161012e57806395d89b41146107f0578063a22cb4651461081b578063b350878314610844578063b76f1a881461086f578063b88d4fde1461089a578063b9385510146108c3576102ae565b8063715018a6146107185780637cdd702e1461072f57806382cbb41f1461075a5780638732f826146107715780638da5cb5b1461079c578063938e3d7b146107c7576102ae565b806336279c561161021957806355f804b3116101d257806355f804b314610605578063573f5dae1461062e57806359f5e0ce146106595780636352211e146106755780636e83843a146106b257806370a08231146106db576102ae565b806336279c56146105095780633ccfd60b1461053457806342842e0e1461054b57806349ec975b146105745780634f6ccce71461059d578063536dc1b1146105da576102ae565b80631984b2861161026b5780631984b286146103d557806322f3e2d41461041257806323b872dd1461043d5780632750fc78146104665780632f745c591461048f57806333d63d95146104cc576102ae565b806301ffc9a7146102b357806306fdde03146102f0578063081812fc1461031b578063095ea7b31461035857806315336f801461038157806318160ddd146103aa575b600080fd5b3480156102bf57600080fd5b506102da60048036038101906102d59190613ea6565b610b27565b6040516102e79190614628565b60405180910390f35b3480156102fc57600080fd5b50610305610ba1565b6040516103129190614688565b60405180910390f35b34801561032757600080fd5b50610342600480360381019061033d9190613fdf565b610c33565b60405161034f91906145c1565b60405180910390f35b34801561036457600080fd5b5061037f600480360381019061037a9190613e39565b610cb8565b005b34801561038d57600080fd5b506103a860048036038101906103a39190613f49565b610dd0565b005b3480156103b657600080fd5b506103bf610e62565b6040516103cc9190614aaa565b60405180910390f35b3480156103e157600080fd5b506103fc60048036038101906103f79190613cb6565b610e6f565b6040516104099190614aaa565b60405180910390f35b34801561041e57600080fd5b50610427610f27565b6040516104349190614628565b60405180910390f35b34801561044957600080fd5b50610464600480360381019061045f9190613d23565b610f3a565b005b34801561047257600080fd5b5061048d60048036038101906104889190613e79565b610f9a565b005b34801561049b57600080fd5b506104b660048036038101906104b19190613e39565b611078565b6040516104c39190614aaa565b60405180910390f35b3480156104d857600080fd5b506104f360048036038101906104ee9190613fdf565b61111d565b6040516105009190614aaa565b60405180910390f35b34801561051557600080fd5b5061051e61117e565b60405161052b9190614aaa565b60405180910390f35b34801561054057600080fd5b50610549611184565b005b34801561055757600080fd5b50610572600480360381019061056d9190613d23565b61124f565b005b34801561058057600080fd5b5061059b60048036038101906105969190613e79565b61126f565b005b3480156105a957600080fd5b506105c460048036038101906105bf9190613fdf565b611308565b6040516105d19190614aaa565b60405180910390f35b3480156105e657600080fd5b506105ef611379565b6040516105fc9190614aaa565b60405180910390f35b34801561061157600080fd5b5061062c60048036038101906106279190613f49565b61137e565b005b34801561063a57600080fd5b50610643611453565b6040516106509190614628565b60405180910390f35b610673600480360381019061066e9190613f96565b611466565b005b34801561068157600080fd5b5061069c60048036038101906106979190613fdf565b611654565b6040516106a991906145c1565b60405180910390f35b3480156106be57600080fd5b506106d960048036038101906106d49190613f49565b611706565b005b3480156106e757600080fd5b5061070260048036038101906106fd9190613cb6565b6117db565b60405161070f9190614aaa565b60405180910390f35b34801561072457600080fd5b5061072d611893565b005b34801561073b57600080fd5b5061074461191b565b6040516107519190614aaa565b60405180910390f35b34801561076657600080fd5b5061076f611921565b005b34801561077d57600080fd5b50610786611b31565b6040516107939190614aaa565b60405180910390f35b3480156107a857600080fd5b506107b1611b36565b6040516107be91906145c1565b60405180910390f35b3480156107d357600080fd5b506107ee60048036038101906107e99190613f49565b611b60565b005b3480156107fc57600080fd5b50610805611c35565b6040516108129190614688565b60405180910390f35b34801561082757600080fd5b50610842600480360381019061083d9190613df9565b611cc7565b005b34801561085057600080fd5b50610859611e48565b6040516108669190614aaa565b60405180910390f35b34801561087b57600080fd5b50610884611e4e565b6040516108919190614aaa565b60405180910390f35b3480156108a657600080fd5b506108c160048036038101906108bc9190613d76565b611e54565b005b3480156108cf57600080fd5b506108d8611eb6565b6040516108e59190614aaa565b60405180910390f35b3480156108fa57600080fd5b5061091560048036038101906109109190613fdf565b611ebc565b6040516109229190614688565b60405180910390f35b34801561093757600080fd5b50610940612061565b60405161094d9190614aaa565b60405180910390f35b34801561096257600080fd5b5061096b612067565b6040516109789190614aaa565b60405180910390f35b34801561098d57600080fd5b506109a860048036038101906109a39190613f00565b61206d565b005b3480156109b657600080fd5b506109bf612361565b6040516109cc9190614aaa565b60405180910390f35b3480156109e157600080fd5b506109ea612367565b6040516109f79190614688565b60405180910390f35b348015610a0c57600080fd5b50610a276004803603810190610a229190613ce3565b6123f9565b604051610a349190614628565b60405180910390f35b348015610a4957600080fd5b50610a5261248d565b604051610a5f9190614aaa565b60405180910390f35b348015610a7457600080fd5b50610a8f6004803603810190610a8a9190613cb6565b6124ab565b005b348015610a9d57600080fd5b50610aa66125a3565b005b348015610ab457600080fd5b50610abd6127b3565b604051610aca9190614688565b60405180910390f35b348015610adf57600080fd5b50610ae8612841565b604051610af59190614aaa565b60405180910390f35b348015610b0a57600080fd5b50610b256004803603810190610b209190613fdf565b612846565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b9a5750610b99826128cc565b5b9050919050565b606060008054610bb090614daf565b80601f0160208091040260200160405190810160405280929190818152602001828054610bdc90614daf565b8015610c295780601f10610bfe57610100808354040283529160200191610c29565b820191906000526020600020905b815481529060010190602001808311610c0c57829003601f168201915b5050505050905090565b6000610c3e826129ae565b610c7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c749061494a565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610cc382611654565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2b906149ca565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d53612a1a565b73ffffffffffffffffffffffffffffffffffffffff161480610d825750610d8181610d7c612a1a565b6123f9565b5b610dc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db89061488a565b60405180910390fd5b610dcb8383612a22565b505050565b610dd8612a1a565b73ffffffffffffffffffffffffffffffffffffffff16610df6611b36565b73ffffffffffffffffffffffffffffffffffffffff1614610e4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e439061496a565b60405180910390fd5b8181600b9190610e5d929190613a74565b505050565b6000600880549050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ee0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed79061498a565b60405180910390fd5b601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600a60149054906101000a900460ff1681565b610f4b610f45612a1a565b82612adb565b610f8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8190614a0a565b60405180910390fd5b610f95838383612bb9565b505050565b610fa2612a1a565b73ffffffffffffffffffffffffffffffffffffffff16610fc0611b36565b73ffffffffffffffffffffffffffffffffffffffff1614611016576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100d9061496a565b60405180910390fd5b6000600c541161105b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105290614a8a565b60405180910390fd5b80600a60146101000a81548160ff02191690831515021790555050565b6000611083836117db565b82106110c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110bb906146ca565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6000808211801561112f5750603c8211155b61116e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611165906147ca565b60405180910390fd5b61117782612e15565b9050919050565b600f5481565b61118c612a1a565b73ffffffffffffffffffffffffffffffffffffffff166111aa611b36565b73ffffffffffffffffffffffffffffffffffffffff1614611200576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f79061496a565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561124b573d6000803e3d6000fd5b5050565b61126a83838360405180602001604052806000815250611e54565b505050565b611277612a1a565b73ffffffffffffffffffffffffffffffffffffffff16611295611b36565b73ffffffffffffffffffffffffffffffffffffffff16146112eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e29061496a565b60405180910390fd5b80600a60156101000a81548160ff02191690831515021790555050565b6000611312610e62565b8210611353576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134a90614a2a565b60405180910390fd5b6008828154811061136757611366614f6c565b5b90600052602060002001549050919050565b603c81565b611386612a1a565b73ffffffffffffffffffffffffffffffffffffffff166113a4611b36565b73ffffffffffffffffffffffffffffffffffffffff16146113fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f19061496a565b60405180910390fd5b81816014919061140b929190613a74565b503373ffffffffffffffffffffffffffffffffffffffff167fc842f4dfe4215c408fa650bb88f234a80088c930fbab638c4b2c4bfddba8ebd760405160405180910390a25050565b600a60159054906101000a900460ff1681565b600a60149054906101000a900460ff166114b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ac9061492a565b60405180910390fd5b6127106114c0610e62565b10611500576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f790614a6a565b60405180910390fd5b603c600e5410611545576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153c9061486a565b60405180910390fd5b34670de0b6b3a76400006115666001600e546115619190614bcd565b612e15565b6115709190614c54565b11156115b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a89061480a565b60405180910390fd5b60006001600e546115c29190614bcd565b90506001600e60008282546115d79190614bcd565b925050819055506115e83382612e9d565b3373ffffffffffffffffffffffffffffffffffffffff167faf1dc3f9bb86e57c82d5576ef3f942de85524b91ab570b5f2a3fc5fb401358c3826116386001600e546116339190614bcd565b612e15565b8560405161164893929190614ac5565b60405180910390a25050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156116fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f4906148ca565b60405180910390fd5b80915050919050565b61170e612a1a565b73ffffffffffffffffffffffffffffffffffffffff1661172c611b36565b73ffffffffffffffffffffffffffffffffffffffff1614611782576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117799061496a565b60405180910390fd5b818160159190611793929190613a74565b503373ffffffffffffffffffffffffffffffffffffffff167f3fae34e5ef124a15bcb1a113d5473f9a1344a33edf274a9e351430c35202b69b60405160405180910390a25050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561184c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611843906148aa565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61189b612a1a565b73ffffffffffffffffffffffffffffffffffffffff166118b9611b36565b73ffffffffffffffffffffffffffffffffffffffff161461190f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119069061496a565b60405180910390fd5b6119196000612ebb565b565b600d5481565b611929612a1a565b73ffffffffffffffffffffffffffffffffffffffff16611947611b36565b73ffffffffffffffffffffffffffffffffffffffff161461199d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119949061496a565b60405180910390fd5b600a60149054906101000a900460ff166119ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e39061492a565b60405180910390fd5b6127106119f7610e62565b10611a37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2e90614a6a565b60405180910390fd5b60ad6001601054611a489190614bcd565b1115611a89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a809061476a565b60405180910390fd5b60005b6064811015611b2e5760006001601054611aa69190614bcd565b9050600160106000828254611abb9190614bcd565b92505081905550611acc3382612e9d565b3373ffffffffffffffffffffffffffffffffffffffff167fea3bb667c143cc56206b0480550c1c922ab78540548a0504f750fb2fe61ac86582604051611b129190614aaa565b60405180910390a2508080611b2690614e12565b915050611a8c565b50565b60ad81565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611b68612a1a565b73ffffffffffffffffffffffffffffffffffffffff16611b86611b36565b73ffffffffffffffffffffffffffffffffffffffff1614611bdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd39061496a565b60405180910390fd5b818160139190611bed929190613a74565b503373ffffffffffffffffffffffffffffffffffffffff167fef3a19841c5daf8605d9a6c265371c4bb03075204df6bb0f9173b36afd70dccc60405160405180910390a25050565b606060018054611c4490614daf565b80601f0160208091040260200160405190810160405280929190818152602001828054611c7090614daf565b8015611cbd5780601f10611c9257610100808354040283529160200191611cbd565b820191906000526020600020905b815481529060010190602001808311611ca057829003601f168201915b5050505050905090565b611ccf612a1a565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d34906147aa565b60405180910390fd5b8060056000611d4a612a1a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611df7612a1a565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e3c9190614628565b60405180910390a35050565b61271081565b61266481565b611e65611e5f612a1a565b83612adb565b611ea4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9b90614a0a565b60405180910390fd5b611eb084848484612f81565b50505050565b600c5481565b6060611ec7826129ae565b611f06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611efd906147ea565b60405180910390fd5b600060158054611f1590614daf565b80601f0160208091040260200160405190810160405280929190818152602001828054611f4190614daf565b8015611f8e5780601f10611f6357610100808354040283529160200191611f8e565b820191906000526020600020905b815481529060010190602001808311611f7157829003601f168201915b50505050509050600081511161202e5760148054611fab90614daf565b80601f0160208091040260200160405190810160405280929190818152602001828054611fd790614daf565b80156120245780601f10611ff957610100808354040283529160200191612024565b820191906000526020600020905b81548152906001019060200180831161200757829003601f168201915b5050505050612059565b8061203884612fdd565b60405160200161204992919061459d565b6040516020818303038152906040525b915050919050565b60105481565b600e5481565b600a60149054906101000a900460ff166120bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b39061492a565b60405180910390fd5b600a60159054906101000a900460ff1661210b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612102906146aa565b60405180910390fd5b612710612116610e62565b10612156576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214d90614a6a565b60405180910390fd5b61266460016011546121689190614bcd565b11156121a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a0906149ea565b60405180910390fd5b6121b28161313e565b6121f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e89061472a565b60405180910390fd5b600d546001601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546122409190614bcd565b1115612281576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227890614a4a565b60405180910390fd5b600060016011546122929190614bcd565b90506001601160008282546122a79190614bcd565b925050819055506001601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122fe9190614bcd565b9250508190555061230f3382612e9d565b3373ffffffffffffffffffffffffffffffffffffffff167fea3bb667c143cc56206b0480550c1c922ab78540548a0504f750fb2fe61ac865826040516123559190614aaa565b60405180910390a25050565b60115481565b60606013805461237690614daf565b80601f01602080910402602001604051908101604052809291908181526020018280546123a290614daf565b80156123ef5780601f106123c4576101008083540402835291602001916123ef565b820191906000526020600020905b8154815290600101906020018083116123d257829003601f168201915b5050505050905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60006124a66001600e546124a19190614bcd565b612e15565b905090565b6124b3612a1a565b73ffffffffffffffffffffffffffffffffffffffff166124d1611b36565b73ffffffffffffffffffffffffffffffffffffffff1614612527576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251e9061496a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612597576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258e9061470a565b60405180910390fd5b6125a081612ebb565b50565b6125ab612a1a565b73ffffffffffffffffffffffffffffffffffffffff166125c9611b36565b73ffffffffffffffffffffffffffffffffffffffff161461261f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126169061496a565b60405180910390fd5b600a60149054906101000a900460ff1661266e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126659061492a565b60405180910390fd5b612710612679610e62565b106126b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126b090614a6a565b60405180910390fd5b60486001600f546126ca9190614bcd565b111561270b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127029061484a565b60405180910390fd5b60005b600c8110156127b05760006001600f546127289190614bcd565b90506001600f600082825461273d9190614bcd565b9250508190555061274e3382612e9d565b3373ffffffffffffffffffffffffffffffffffffffff167fea3bb667c143cc56206b0480550c1c922ab78540548a0504f750fb2fe61ac865826040516127949190614aaa565b60405180910390a25080806127a890614e12565b91505061270e565b50565b600b80546127c090614daf565b80601f01602080910402602001604051908101604052809291908181526020018280546127ec90614daf565b80156128395780601f1061280e57610100808354040283529160200191612839565b820191906000526020600020905b81548152906001019060200180831161281c57829003601f168201915b505050505081565b604881565b61284e612a1a565b73ffffffffffffffffffffffffffffffffffffffff1661286c611b36565b73ffffffffffffffffffffffffffffffffffffffff16146128c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128b99061496a565b60405180910390fd5b80600c8190555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061299757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806129a757506129a682613218565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612a9583611654565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612ae6826129ae565b612b25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1c9061482a565b60405180910390fd5b6000612b3083611654565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612b9f57508373ffffffffffffffffffffffffffffffffffffffff16612b8784610c33565b73ffffffffffffffffffffffffffffffffffffffff16145b80612bb05750612baf81856123f9565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612bd982611654565b73ffffffffffffffffffffffffffffffffffffffff1614612c2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c26906149aa565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c969061478a565b60405180910390fd5b612caa838383613282565b612cb5600082612a22565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d059190614cae565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d5c9190614bcd565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600080600c5411612e5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e52906148ea565b60405180910390fd5b60006016600184612e6c9190614cae565b603c8110612e7d57612e7c614f6c565b5b015490506000600c5482612e919190614c23565b90508092505050919050565b612eb7828260405180602001604052806000815250613396565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612f8c848484612bb9565b612f98848484846133f1565b612fd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fce906146ea565b60405180910390fd5b50505050565b60606000821415613025576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613139565b600082905060005b6000821461305757808061304090614e12565b915050600a826130509190614c23565b915061302d565b60008167ffffffffffffffff81111561307357613072614f9b565b5b6040519080825280601f01601f1916602001820160405280156130a55781602001600182028036833780820191505090505b5090505b60008514613132576001826130be9190614cae565b9150600a856130cd9190614e7f565b60306130d99190614bcd565b60f81b8183815181106130ef576130ee614f6c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561312b9190614c23565b94506130a9565b8093505050505b919050565b6000803033604051602001613154929190614571565b60405160208183030381529060405280519060200120905060008060006020860151925060408601519150606086015160001a9050600184828585604051600081526020016040526040516131ac9493929190614643565b6020604051602081039080840390855afa1580156131ce573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff166131f6611b36565b73ffffffffffffffffffffffffffffffffffffffff1614945050505050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61328d838383613588565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156132d0576132cb8161358d565b61330f565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461330e5761330d83826135d6565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156133525761334d81613743565b613391565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146133905761338f8282613814565b5b5b505050565b6133a08383613893565b6133ad60008484846133f1565b6133ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133e3906146ea565b60405180910390fd5b505050565b60006134128473ffffffffffffffffffffffffffffffffffffffff16613a61565b1561357b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261343b612a1a565b8786866040518563ffffffff1660e01b815260040161345d94939291906145dc565b602060405180830381600087803b15801561347757600080fd5b505af19250505080156134a857506040513d601f19601f820116820180604052508101906134a59190613ed3565b60015b61352b573d80600081146134d8576040519150601f19603f3d011682016040523d82523d6000602084013e6134dd565b606091505b50600081511415613523576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161351a906146ea565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613580565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016135e3846117db565b6135ed9190614cae565b90506000600760008481526020019081526020016000205490508181146136d2576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506137579190614cae565b905060006009600084815260200190815260200160002054905060006008838154811061378757613786614f6c565b5b9060005260206000200154905080600883815481106137a9576137a8614f6c565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806137f8576137f7614f3d565b5b6001900381819060005260206000200160009055905550505050565b600061381f836117db565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613903576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138fa9061490a565b60405180910390fd5b61390c816129ae565b1561394c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139439061474a565b60405180910390fd5b61395860008383613282565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546139a89190614bcd565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054613a8090614daf565b90600052602060002090601f016020900481019282613aa25760008555613ae9565b82601f10613abb57803560ff1916838001178555613ae9565b82800160010185558215613ae9579182015b82811115613ae8578235825591602001919060010190613acd565b5b509050613af69190613afa565b5090565b5b80821115613b13576000816000905550600101613afb565b5090565b6000613b2a613b2584614b28565b614b03565b905082815260208101848484011115613b4657613b45614fd9565b5b613b51848285614d6d565b509392505050565b6000613b6c613b6784614b59565b614b03565b905082815260208101848484011115613b8857613b87614fd9565b5b613b93848285614d6d565b509392505050565b600081359050613baa816157f8565b92915050565b600081359050613bbf8161580f565b92915050565b600081359050613bd481615826565b92915050565b600081519050613be981615826565b92915050565b600082601f830112613c0457613c03614fcf565b5b8135613c14848260208601613b17565b91505092915050565b60008083601f840112613c3357613c32614fcf565b5b8235905067ffffffffffffffff811115613c5057613c4f614fca565b5b602083019150836001820283011115613c6c57613c6b614fd4565b5b9250929050565b600082601f830112613c8857613c87614fcf565b5b8135613c98848260208601613b59565b91505092915050565b600081359050613cb08161583d565b92915050565b600060208284031215613ccc57613ccb614fe3565b5b6000613cda84828501613b9b565b91505092915050565b60008060408385031215613cfa57613cf9614fe3565b5b6000613d0885828601613b9b565b9250506020613d1985828601613b9b565b9150509250929050565b600080600060608486031215613d3c57613d3b614fe3565b5b6000613d4a86828701613b9b565b9350506020613d5b86828701613b9b565b9250506040613d6c86828701613ca1565b9150509250925092565b60008060008060808587031215613d9057613d8f614fe3565b5b6000613d9e87828801613b9b565b9450506020613daf87828801613b9b565b9350506040613dc087828801613ca1565b925050606085013567ffffffffffffffff811115613de157613de0614fde565b5b613ded87828801613bef565b91505092959194509250565b60008060408385031215613e1057613e0f614fe3565b5b6000613e1e85828601613b9b565b9250506020613e2f85828601613bb0565b9150509250929050565b60008060408385031215613e5057613e4f614fe3565b5b6000613e5e85828601613b9b565b9250506020613e6f85828601613ca1565b9150509250929050565b600060208284031215613e8f57613e8e614fe3565b5b6000613e9d84828501613bb0565b91505092915050565b600060208284031215613ebc57613ebb614fe3565b5b6000613eca84828501613bc5565b91505092915050565b600060208284031215613ee957613ee8614fe3565b5b6000613ef784828501613bda565b91505092915050565b600060208284031215613f1657613f15614fe3565b5b600082013567ffffffffffffffff811115613f3457613f33614fde565b5b613f4084828501613bef565b91505092915050565b60008060208385031215613f6057613f5f614fe3565b5b600083013567ffffffffffffffff811115613f7e57613f7d614fde565b5b613f8a85828601613c1d565b92509250509250929050565b600060208284031215613fac57613fab614fe3565b5b600082013567ffffffffffffffff811115613fca57613fc9614fde565b5b613fd684828501613c73565b91505092915050565b600060208284031215613ff557613ff4614fe3565b5b600061400384828501613ca1565b91505092915050565b61401581614ce2565b82525050565b61402c61402782614ce2565b614e5b565b82525050565b61403b81614cf4565b82525050565b61404a81614d00565b82525050565b600061405b82614b8a565b6140658185614ba0565b9350614075818560208601614d7c565b61407e81614fe8565b840191505092915050565b600061409482614b95565b61409e8185614bb1565b93506140ae818560208601614d7c565b6140b781614fe8565b840191505092915050565b60006140cd82614b95565b6140d78185614bc2565b93506140e7818560208601614d7c565b80840191505092915050565b6000614100601883614bb1565b915061410b82615006565b602082019050919050565b6000614123602b83614bb1565b915061412e8261502f565b604082019050919050565b6000614146603283614bb1565b91506141518261507e565b604082019050919050565b6000614169602683614bb1565b9150614174826150cd565b604082019050919050565b600061418c601483614bb1565b91506141978261511c565b602082019050919050565b60006141af601c83614bb1565b91506141ba82615145565b602082019050919050565b60006141d2602983614bb1565b91506141dd8261516e565b604082019050919050565b60006141f5602483614bb1565b9150614200826151bd565b604082019050919050565b6000614218601983614bb1565b91506142238261520c565b602082019050919050565b600061423b600e83614bb1565b915061424682615235565b602082019050919050565b600061425e601483614bb1565b91506142698261525e565b602082019050919050565b6000614281601c83614bb1565b915061428c82615287565b602082019050919050565b60006142a4602c83614bb1565b91506142af826152b0565b604082019050919050565b60006142c7602a83614bb1565b91506142d2826152ff565b604082019050919050565b60006142ea602483614bb1565b91506142f58261534e565b604082019050919050565b600061430d603883614bb1565b91506143188261539d565b604082019050919050565b6000614330602a83614bb1565b915061433b826153ec565b604082019050919050565b6000614353602983614bb1565b915061435e8261543b565b604082019050919050565b6000614376602783614bb1565b91506143818261548a565b604082019050919050565b6000614399602083614bb1565b91506143a4826154d9565b602082019050919050565b60006143bc601683614bb1565b91506143c782615502565b602082019050919050565b60006143df602c83614bb1565b91506143ea8261552b565b604082019050919050565b6000614402602083614bb1565b915061440d8261557a565b602082019050919050565b6000614425601e83614bb1565b9150614430826155a3565b602082019050919050565b6000614448602983614bb1565b9150614453826155cc565b604082019050919050565b600061446b602183614bb1565b91506144768261561b565b604082019050919050565b600061448e602283614bb1565b91506144998261566a565b604082019050919050565b60006144b1603183614bb1565b91506144bc826156b9565b604082019050919050565b60006144d4602c83614bb1565b91506144df82615708565b604082019050919050565b60006144f7601c83614bb1565b915061450282615757565b602082019050919050565b600061451a601b83614bb1565b915061452582615780565b602082019050919050565b600061453d602183614bb1565b9150614548826157a9565b604082019050919050565b61455c81614d56565b82525050565b61456b81614d60565b82525050565b600061457d828561401b565b60148201915061458d828461401b565b6014820191508190509392505050565b60006145a982856140c2565b91506145b582846140c2565b91508190509392505050565b60006020820190506145d6600083018461400c565b92915050565b60006080820190506145f1600083018761400c565b6145fe602083018661400c565b61460b6040830185614553565b818103606083015261461d8184614050565b905095945050505050565b600060208201905061463d6000830184614032565b92915050565b60006080820190506146586000830187614041565b6146656020830186614562565b6146726040830185614041565b61467f6060830184614041565b95945050505050565b600060208201905081810360008301526146a28184614089565b905092915050565b600060208201905081810360008301526146c3816140f3565b9050919050565b600060208201905081810360008301526146e381614116565b9050919050565b6000602082019050818103600083015261470381614139565b9050919050565b600060208201905081810360008301526147238161415c565b9050919050565b600060208201905081810360008301526147438161417f565b9050919050565b60006020820190508181036000830152614763816141a2565b9050919050565b60006020820190508181036000830152614783816141c5565b9050919050565b600060208201905081810360008301526147a3816141e8565b9050919050565b600060208201905081810360008301526147c38161420b565b9050919050565b600060208201905081810360008301526147e38161422e565b9050919050565b6000602082019050818103600083015261480381614251565b9050919050565b6000602082019050818103600083015261482381614274565b9050919050565b6000602082019050818103600083015261484381614297565b9050919050565b60006020820190508181036000830152614863816142ba565b9050919050565b60006020820190508181036000830152614883816142dd565b9050919050565b600060208201905081810360008301526148a381614300565b9050919050565b600060208201905081810360008301526148c381614323565b9050919050565b600060208201905081810360008301526148e381614346565b9050919050565b6000602082019050818103600083015261490381614369565b9050919050565b600060208201905081810360008301526149238161438c565b9050919050565b60006020820190508181036000830152614943816143af565b9050919050565b60006020820190508181036000830152614963816143d2565b9050919050565b60006020820190508181036000830152614983816143f5565b9050919050565b600060208201905081810360008301526149a381614418565b9050919050565b600060208201905081810360008301526149c38161443b565b9050919050565b600060208201905081810360008301526149e38161445e565b9050919050565b60006020820190508181036000830152614a0381614481565b9050919050565b60006020820190508181036000830152614a23816144a4565b9050919050565b60006020820190508181036000830152614a43816144c7565b9050919050565b60006020820190508181036000830152614a63816144ea565b9050919050565b60006020820190508181036000830152614a838161450d565b9050919050565b60006020820190508181036000830152614aa381614530565b9050919050565b6000602082019050614abf6000830184614553565b92915050565b6000606082019050614ada6000830186614553565b614ae76020830185614553565b8181036040830152614af98184614089565b9050949350505050565b6000614b0d614b1e565b9050614b198282614de1565b919050565b6000604051905090565b600067ffffffffffffffff821115614b4357614b42614f9b565b5b614b4c82614fe8565b9050602081019050919050565b600067ffffffffffffffff821115614b7457614b73614f9b565b5b614b7d82614fe8565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614bd882614d56565b9150614be383614d56565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614c1857614c17614eb0565b5b828201905092915050565b6000614c2e82614d56565b9150614c3983614d56565b925082614c4957614c48614edf565b5b828204905092915050565b6000614c5f82614d56565b9150614c6a83614d56565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614ca357614ca2614eb0565b5b828202905092915050565b6000614cb982614d56565b9150614cc483614d56565b925082821015614cd757614cd6614eb0565b5b828203905092915050565b6000614ced82614d36565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015614d9a578082015181840152602081019050614d7f565b83811115614da9576000848401525b50505050565b60006002820490506001821680614dc757607f821691505b60208210811415614ddb57614dda614f0e565b5b50919050565b614dea82614fe8565b810181811067ffffffffffffffff82111715614e0957614e08614f9b565b5b80604052505050565b6000614e1d82614d56565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614e5057614e4f614eb0565b5b600182019050919050565b6000614e6682614e6d565b9050919050565b6000614e7882614ff9565b9050919050565b6000614e8a82614d56565b9150614e9583614d56565b925082614ea557614ea4614edf565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f5768697465204c697374206973206e6f74206163746976650000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4e6f74206f6e207468652077686974656c697374000000000000000000000000600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f636c61696d476976654177617920776f756c642065786365656420544f4b454e60008201527f5f47495645415741590000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f546f6b656e204f766572666c6f77000000000000000000000000000000000000600082015250565b7f546f6b656e20646f6573206e6f74206578697374000000000000000000000000600082015250565b7f45544820616d6f756e74206973206e6f742073756666696369656e7400000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f636c61696d5465616d20776f756c642065786365656420544f4b454e5f54454160008201527f4d5f41535349474e454400000000000000000000000000000000000000000000602082015250565b7f507572636861736520776f756c642065786365656420544f4b454e5f5055524360008201527f4841534500000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f507269636520636f6e76657273696f6e206d757374206265206772656174657260008201527f207468616e203000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f436f6e7472616374206973206e6f742061637469766500000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f5a65726f2061646472657373206e6f74206f6e20416c6c6f77204c6973740000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f507572636861736520776f756c642065786365656420544f4b454e5f5055424c60008201527f4943000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f50757263686173652065786365656473206d617820616c6c6f77656400000000600082015250565b7f416c6c20746f6b656e732068617665206265656e206d696e7465640000000000600082015250565b7f4d75737420736574206120707269636520636f6e76657274696f6e206669727360008201527f7400000000000000000000000000000000000000000000000000000000000000602082015250565b61580181614ce2565b811461580c57600080fd5b50565b61581881614cf4565b811461582357600080fd5b50565b61582f81614d0a565b811461583a57600080fd5b50565b61584681614d56565b811461585157600080fd5b5056fea264697066735822122024c0a9e7345ff1d610fdf1da6a370a13fa401cff528db0b74f4660ead3433ecf64736f6c63430008070033

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

00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000a43727970746f4c616e64000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002434c000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name (string): CryptoLand
Arg [1] : symbol (string): CL

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [3] : 43727970746f4c616e6400000000000000000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [5] : 434c000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

45043:10026:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34720:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21621:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23180:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22703:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53769:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35360;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49051:205;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45678:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24070:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53430:183;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35028:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49528:223;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46011:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53890:156;;;;;;;;;;;;;:::i;:::-;;24480:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53621:140;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35550:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45167:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54220:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45713:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50492:736;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21315:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54379:194;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21045:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42517:94;;;;;;;;;;;;;:::i;:::-;;45821:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52863:557;;;;;;;;;;;;;:::i;:::-;;45369:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41866:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54054:158;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21790:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23473:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45566:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45468:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24736:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45783:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54695:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46081:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45942:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51356:760;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46152:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54581:106;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23839:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49865:140;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42766:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52204:570;;;;;;;;;;;;;:::i;:::-;;45757:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45255:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49321:123;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34720:224;34822:4;34861:35;34846:50;;;:11;:50;;;;:90;;;;34900:36;34924:11;34900:23;:36::i;:::-;34846:90;34839:97;;34720:224;;;:::o;21621:100::-;21675:13;21708:5;21701:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21621:100;:::o;23180:221::-;23256:7;23284:16;23292:7;23284;:16::i;:::-;23276:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23369:15;:24;23385:7;23369:24;;;;;;;;;;;;;;;;;;;;;23362:31;;23180:221;;;:::o;22703:411::-;22784:13;22800:23;22815:7;22800:14;:23::i;:::-;22784:39;;22848:5;22842:11;;:2;:11;;;;22834:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;22942:5;22926:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;22951:37;22968:5;22975:12;:10;:12::i;:::-;22951:16;:37::i;:::-;22926:62;22904:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;23085:21;23094:2;23098:7;23085:8;:21::i;:::-;22773:341;22703:411;;:::o;53769:113::-;42097:12;:10;:12::i;:::-;42086:23;;:7;:5;:7::i;:::-;:23;;;42078:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53863:11:::1;;53855:5;:19;;;;;;;:::i;:::-;;53769:113:::0;;:::o;35360:::-;35421:7;35448:10;:17;;;;35441:24;;35360:113;:::o;49051:205::-;49125:7;49168:1;49152:18;;:4;:18;;;;49144:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;49225:17;:23;49243:4;49225:23;;;;;;;;;;;;;;;;49218:30;;49051:205;;;:::o;45678:28::-;;;;;;;;;;;;;:::o;24070:339::-;24265:41;24284:12;:10;:12::i;:::-;24298:7;24265:18;:41::i;:::-;24257:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24373:28;24383:4;24389:2;24393:7;24373:9;:28::i;:::-;24070:339;;;:::o;53430:183::-;42097:12;:10;:12::i;:::-;42086:23;;:7;:5;:7::i;:::-;:23;;;42078:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53533:1:::1;53516:14;;:18;53508:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;53596:9;53585:8;;:20;;;;;;;;;;;;;;;;;;53430:183:::0;:::o;35028:256::-;35125:7;35161:23;35178:5;35161:16;:23::i;:::-;35153:5;:31;35145:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;35250:12;:19;35263:5;35250:19;;;;;;;;;;;;;;;:26;35270:5;35250:26;;;;;;;;;;;;35243:33;;35028:256;;;;:::o;49528:223::-;49607:7;49652:1;49638:11;:15;:35;;;;;49671:2;49657:11;:16;;49638:35;49629:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;49712:31;49731:11;49712:18;:31::i;:::-;49705:38;;49528:223;;;:::o;46011:43::-;;;;:::o;53890:156::-;42097:12;:10;:12::i;:::-;42086:23;;:7;:5;:7::i;:::-;:23;;;42078:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53949:15:::1;53967:21;53949:39;;54009:10;54001:28;;:37;54030:7;54001:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;53938:108;53890:156::o:0;24480:185::-;24618:39;24635:4;24641:2;24645:7;24618:39;;;;;;;;;;;;:16;:39::i;:::-;24480:185;;;:::o;53621:140::-;42097:12;:10;:12::i;:::-;42086:23;;:7;:5;:7::i;:::-;:23;;;42078:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53735:18:::1;53715:17;;:38;;;;;;;;;;;;;;;;;;53621:140:::0;:::o;35550:233::-;35625:7;35661:30;:28;:30::i;:::-;35653:5;:38;35645:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;35758:10;35769:5;35758:17;;;;;;;;:::i;:::-;;;;;;;;;;35751:24;;35550:233;;;:::o;45167:43::-;45208:2;45167:43;:::o;54220:151::-;42097:12;:10;:12::i;:::-;42086:23;;:7;:5;:7::i;:::-;:23;;;42078:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54316:3:::1;;54300:13;:19;;;;;;;:::i;:::-;;54352:10;54337:26;;;;;;;;;;;;54220:151:::0;;:::o;45713:37::-;;;;;;;;;;;;;:::o;50492:736::-;50581:8;;;;;;;;;;;50573:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;45602:6;50635:13;:11;:13::i;:::-;:25;50627:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;45208:2;50711:19;;:36;50703:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;50864:9;45650:19;50807:43;50848:1;50826:19;;:23;;;;:::i;:::-;50807:18;:43::i;:::-;:53;;;;:::i;:::-;:66;;50799:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;50919:15;50959:1;50937:19;;:23;;;;:::i;:::-;50919:41;;50996:1;50973:19;;:24;;;;;;;:::i;:::-;;;;;;;;51008:30;51018:10;51030:7;51008:9;:30::i;:::-;51145:10;51130:90;;;51157:7;51166:43;51207:1;51185:19;;:23;;;;:::i;:::-;51166:18;:43::i;:::-;51211:8;51130:90;;;;;;;;:::i;:::-;;;;;;;;50560:668;50492:736;:::o;21315:239::-;21387:7;21407:13;21423:7;:16;21431:7;21423:16;;;;;;;;;;;;;;;;;;;;;21407:32;;21475:1;21458:19;;:5;:19;;;;21450:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21541:5;21534:12;;;21315:239;;;:::o;54379:194::-;42097:12;:10;:12::i;:::-;42086:23;;:7;:5;:7::i;:::-;:23;;;42078:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54503:15:::1;;54479:21;:39;;;;;;;:::i;:::-;;54554:10;54536:29;;;;;;;;;;;;54379:194:::0;;:::o;21045:208::-;21117:7;21162:1;21145:19;;:5;:19;;;;21137:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21229:9;:16;21239:5;21229:16;;;;;;;;;;;;;;;;21222:23;;21045:208;;;:::o;42517:94::-;42097:12;:10;:12::i;:::-;42086:23;;:7;:5;:7::i;:::-;:23;;;42078:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42582:21:::1;42600:1;42582:9;:21::i;:::-;42517:94::o:0;45821:35::-;;;;:::o;52863:557::-;42097:12;:10;:12::i;:::-;42086:23;;:7;:5;:7::i;:::-;:23;;;42078:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52937:8:::1;;;;;;;;;;;52929:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;45602:6;52991:13;:11;:13::i;:::-;:25;52983:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;45410:3;53089:1;53067:19;;:23;;;;:::i;:::-;:41;;53059:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;53172:6;53167:244;53188:3;53184:1;:7;53167:244;;;53215:15;53255:1;53233:19;;:23;;;;:::i;:::-;53215:41;;53296:1;53273:19;;:24;;;;;;;:::i;:::-;;;;;;;;53312:30;53322:10;53334:7;53312:9;:30::i;:::-;53377:10;53364:33;;;53389:7;53364:33;;;;;;:::i;:::-;;;;;;;;53198:213;53193:3;;;;;:::i;:::-;;;;53167:244;;;;52863:557::o:0;45369:44::-;45410:3;45369:44;:::o;41866:87::-;41912:7;41939:6;;;;;;;;;;;41932:13;;41866:87;:::o;54054:158::-;42097:12;:10;:12::i;:::-;42086:23;;:7;:5;:7::i;:::-;:23;;;42078:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54153:3:::1;;54138:12;:18;;;;;;;:::i;:::-;;54193:10;54174:30;;;;;;;;;;;;54054:158:::0;;:::o;21790:104::-;21846:13;21879:7;21872:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21790:104;:::o;23473:295::-;23588:12;:10;:12::i;:::-;23576:24;;:8;:24;;;;23568:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;23688:8;23643:18;:32;23662:12;:10;:12::i;:::-;23643:32;;;;;;;;;;;;;;;:42;23676:8;23643:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;23741:8;23712:48;;23727:12;:10;:12::i;:::-;23712:48;;;23751:8;23712:48;;;;;;:::i;:::-;;;;;;;;23473:295;;:::o;45566:42::-;45602:6;45566:42;:::o;45468:44::-;45507:5;45468:44;:::o;24736:328::-;24911:41;24930:12;:10;:12::i;:::-;24944:7;24911:18;:41::i;:::-;24903:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25017:39;25031:4;25037:2;25041:7;25050:5;25017:13;:39::i;:::-;24736:328;;;;:::o;45783:29::-;;;;:::o;54695:371::-;54768:13;54802:16;54810:7;54802;:16::i;:::-;54794:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;54856:29;54888:21;54856:53;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54959:1;54933:15;54927:29;:33;:131;;55045:13;54927:131;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54996:15;55013:18;:7;:16;:18::i;:::-;54979:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54927:131;54920:138;;;54695:371;;;:::o;46081:39::-;;;;:::o;45942:38::-;;;;:::o;51356:760::-;51438:8;;;;;;;;;;;51430:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;51492:17;;;;;;;;;;;51484:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;45602:6;51557:13;:11;:13::i;:::-;:25;51549:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;45507:5;51653:1;51633:17;;:21;;;;:::i;:::-;:37;;51625:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;51728:26;51749:4;51728:20;:26::i;:::-;51720:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;51835:16;;51830:1;51798:17;:29;51816:10;51798:29;;;;;;;;;;;;;;;;:33;;;;:::i;:::-;:53;;51790:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;51897:15;51935:1;51915:17;;:21;;;;:::i;:::-;51897:39;;51970:1;51949:17;;:22;;;;;;;:::i;:::-;;;;;;;;52015:1;51982:17;:29;52000:10;51982:29;;;;;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;;;;;52027:30;52037:10;52049:7;52027:9;:30::i;:::-;52088:10;52075:33;;;52100:7;52075:33;;;;;;:::i;:::-;;;;;;;;51417:699;51356:760;:::o;46152:38::-;;;;:::o;54581:106::-;54634:13;54667:12;54660:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54581:106;:::o;23839:164::-;23936:4;23960:18;:25;23979:5;23960:25;;;;;;;;;;;;;;;:35;23986:8;23960:35;;;;;;;;;;;;;;;;;;;;;;;;;23953:42;;23839:164;;;;:::o;49865:140::-;49925:7;49954:43;49995:1;49973:19;;:23;;;;:::i;:::-;49954:18;:43::i;:::-;49947:50;;49865:140;:::o;42766:192::-;42097:12;:10;:12::i;:::-;42086:23;;:7;:5;:7::i;:::-;:23;;;42078:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42875:1:::1;42855:22;;:8;:22;;;;42847:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;42931:19;42941:8;42931:9;:19::i;:::-;42766:192:::0;:::o;52204:570::-;42097:12;:10;:12::i;:::-;42086:23;;:7;:5;:7::i;:::-;:23;;;42078:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52274:8:::1;;;;;;;;;;;52266:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;45602:6;52328:13;:11;:13::i;:::-;:25;52320:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;45301:2;52430:1;52404:23;;:27;;;;:::i;:::-;:50;;52396:105;;;;;;;;;;;;:::i;:::-;;;;;;;;;52519:6;52514:251;52535:2;52531:1;:6;52514:251;;;52561:15;52605:1;52579:23;;:27;;;;:::i;:::-;52561:45;;52650:1;52623:23;;:28;;;;;;;:::i;:::-;;;;;;;;52666:30;52676:10;52688:7;52666:9;:30::i;:::-;52731:10;52718:33;;;52743:7;52718:33;;;;;;:::i;:::-;;;;;;;;52544:221;52539:3;;;;;:::i;:::-;;;;52514:251;;;;52204:570::o:0;45757:19::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;45255:48::-;45301:2;45255:48;:::o;49321:123::-;42097:12;:10;:12::i;:::-;42086:23;;:7;:5;:7::i;:::-;:23;;;42078:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49421:15:::1;49404:14;:32;;;;49321:123:::0;:::o;20676:305::-;20778:4;20830:25;20815:40;;;:11;:40;;;;:105;;;;20887:33;20872:48;;;:11;:48;;;;20815:105;:158;;;;20937:36;20961:11;20937:23;:36::i;:::-;20815:158;20795:178;;20676:305;;;:::o;26574:127::-;26639:4;26691:1;26663:30;;:7;:16;26671:7;26663:16;;;;;;;;;;;;;;;;;;;;;:30;;;;26656:37;;26574:127;;;:::o;16098:98::-;16151:7;16178:10;16171:17;;16098:98;:::o;30556:174::-;30658:2;30631:15;:24;30647:7;30631:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30714:7;30710:2;30676:46;;30685:23;30700:7;30685:14;:23::i;:::-;30676:46;;;;;;;;;;;;30556:174;;:::o;26868:348::-;26961:4;26986:16;26994:7;26986;:16::i;:::-;26978:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27062:13;27078:23;27093:7;27078:14;:23::i;:::-;27062:39;;27131:5;27120:16;;:7;:16;;;:51;;;;27164:7;27140:31;;:20;27152:7;27140:11;:20::i;:::-;:31;;;27120:51;:87;;;;27175:32;27192:5;27199:7;27175:16;:32::i;:::-;27120:87;27112:96;;;26868:348;;;;:::o;29860:578::-;30019:4;29992:31;;:23;30007:7;29992:14;:23::i;:::-;:31;;;29984:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;30102:1;30088:16;;:2;:16;;;;30080:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;30158:39;30179:4;30185:2;30189:7;30158:20;:39::i;:::-;30262:29;30279:1;30283:7;30262:8;:29::i;:::-;30323:1;30304:9;:15;30314:4;30304:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;30352:1;30335:9;:13;30345:2;30335:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30383:2;30364:7;:16;30372:7;30364:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30422:7;30418:2;30403:27;;30412:4;30403:27;;;;;;;;;;;;29860:578;;;:::o;50077:310::-;50149:7;50196:1;50179:14;;:18;50171:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;50254:16;50273:6;50294:1;50280:11;:15;;;;:::i;:::-;50273:23;;;;;;;:::i;:::-;;;;50254:42;;50307:16;50337:14;;50326:8;:25;;;;:::i;:::-;50307:44;;50371:8;50364:15;;;;50077:310;;;:::o;27558:110::-;27634:26;27644:2;27648:7;27634:26;;;;;;;;;;;;:9;:26::i;:::-;27558:110;;:::o;42966:173::-;43022:16;43041:6;;;;;;;;;;;43022:25;;43067:8;43058:6;;:17;;;;;;;;;;;;;;;;;;43122:8;43091:40;;43112:8;43091:40;;;;;;;;;;;;43011:128;42966:173;:::o;25946:315::-;26103:28;26113:4;26119:2;26123:7;26103:9;:28::i;:::-;26150:48;26173:4;26179:2;26183:7;26192:5;26150:22;:48::i;:::-;26142:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25946:315;;;;:::o;16623:723::-;16679:13;16909:1;16900:5;:10;16896:53;;;16927:10;;;;;;;;;;;;;;;;;;;;;16896:53;16959:12;16974:5;16959:20;;16990:14;17015:78;17030:1;17022:4;:9;17015:78;;17048:8;;;;;:::i;:::-;;;;17079:2;17071:10;;;;;:::i;:::-;;;17015:78;;;17103:19;17135:6;17125:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17103:39;;17153:154;17169:1;17160:5;:10;17153:154;;17197:1;17187:11;;;;;:::i;:::-;;;17264:2;17256:5;:10;;;;:::i;:::-;17243:2;:24;;;;:::i;:::-;17230:39;;17213:6;17220;17213:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;17293:2;17284:11;;;;;:::i;:::-;;;17153:154;;;17331:6;17317:21;;;;;16623:723;;;;:::o;48388:497::-;48460:4;48477:12;48527:4;48534:10;48502:43;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48492:54;;;;;;48477:69;;48559:9;48579;48599:7;48721:2;48715:4;48711:13;48705:20;48700:25;;48760:2;48754:4;48750:13;48744:20;48739:25;;48807:2;48801:4;48797:13;48791:20;48788:1;48783:29;48778:34;;48853:24;48863:4;48869:1;48872;48875;48853:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48842:35;;:7;:5;:7::i;:::-;:35;;;48835:42;;;;;;48388:497;;;:::o;19180:157::-;19265:4;19304:25;19289:40;;;:11;:40;;;;19282:47;;19180:157;;;:::o;36396:589::-;36540:45;36567:4;36573:2;36577:7;36540:26;:45::i;:::-;36618:1;36602:18;;:4;:18;;;36598:187;;;36637:40;36669:7;36637:31;:40::i;:::-;36598:187;;;36707:2;36699:10;;:4;:10;;;36695:90;;36726:47;36759:4;36765:7;36726:32;:47::i;:::-;36695:90;36598:187;36813:1;36799:16;;:2;:16;;;36795:183;;;36832:45;36869:7;36832:36;:45::i;:::-;36795:183;;;36905:4;36899:10;;:2;:10;;;36895:83;;36926:40;36954:2;36958:7;36926:27;:40::i;:::-;36895:83;36795:183;36396:589;;;:::o;27895:321::-;28025:18;28031:2;28035:7;28025:5;:18::i;:::-;28076:54;28107:1;28111:2;28115:7;28124:5;28076:22;:54::i;:::-;28054:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;27895:321;;;:::o;31295:799::-;31450:4;31471:15;:2;:13;;;:15::i;:::-;31467:620;;;31523:2;31507:36;;;31544:12;:10;:12::i;:::-;31558:4;31564:7;31573:5;31507:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;31503:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31766:1;31749:6;:13;:18;31745:272;;;31792:60;;;;;;;;;;:::i;:::-;;;;;;;;31745:272;31967:6;31961:13;31952:6;31948:2;31944:15;31937:38;31503:529;31640:41;;;31630:51;;;:6;:51;;;;31623:58;;;;;31467:620;32071:4;32064:11;;31295:799;;;;;;;:::o;32666:126::-;;;;:::o;37708:164::-;37812:10;:17;;;;37785:15;:24;37801:7;37785:24;;;;;;;;;;;:44;;;;37840:10;37856:7;37840:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37708:164;:::o;38499:988::-;38765:22;38815:1;38790:22;38807:4;38790:16;:22::i;:::-;:26;;;;:::i;:::-;38765:51;;38827:18;38848:17;:26;38866:7;38848:26;;;;;;;;;;;;38827:47;;38995:14;38981:10;:28;38977:328;;39026:19;39048:12;:18;39061:4;39048:18;;;;;;;;;;;;;;;:34;39067:14;39048:34;;;;;;;;;;;;39026:56;;39132:11;39099:12;:18;39112:4;39099:18;;;;;;;;;;;;;;;:30;39118:10;39099:30;;;;;;;;;;;:44;;;;39249:10;39216:17;:30;39234:11;39216:30;;;;;;;;;;;:43;;;;39011:294;38977:328;39401:17;:26;39419:7;39401:26;;;;;;;;;;;39394:33;;;39445:12;:18;39458:4;39445:18;;;;;;;;;;;;;;;:34;39464:14;39445:34;;;;;;;;;;;39438:41;;;38580:907;;38499:988;;:::o;39782:1079::-;40035:22;40080:1;40060:10;:17;;;;:21;;;;:::i;:::-;40035:46;;40092:18;40113:15;:24;40129:7;40113:24;;;;;;;;;;;;40092:45;;40464:19;40486:10;40497:14;40486:26;;;;;;;;:::i;:::-;;;;;;;;;;40464:48;;40550:11;40525:10;40536;40525:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;40661:10;40630:15;:28;40646:11;40630:28;;;;;;;;;;;:41;;;;40802:15;:24;40818:7;40802:24;;;;;;;;;;;40795:31;;;40837:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;39853:1008;;;39782:1079;:::o;37286:221::-;37371:14;37388:20;37405:2;37388:16;:20::i;:::-;37371:37;;37446:7;37419:12;:16;37432:2;37419:16;;;;;;;;;;;;;;;:24;37436:6;37419:24;;;;;;;;;;;:34;;;;37493:6;37464:17;:26;37482:7;37464:26;;;;;;;;;;;:35;;;;37360:147;37286:221;;:::o;28552:382::-;28646:1;28632:16;;:2;:16;;;;28624:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28705:16;28713:7;28705;:16::i;:::-;28704:17;28696:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28767:45;28796:1;28800:2;28804:7;28767:20;:45::i;:::-;28842:1;28825:9;:13;28835:2;28825:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28873:2;28854:7;:16;28862:7;28854:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28918:7;28914:2;28893:33;;28910:1;28893:33;;;;;;;;;;;;28552:382;;:::o;8142:387::-;8202:4;8410:12;8477:7;8465:20;8457:28;;8520:1;8513:4;:8;8506:15;;;8142:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:553::-;1844:8;1854:6;1904:3;1897:4;1889:6;1885:17;1881:27;1871:122;;1912:79;;:::i;:::-;1871:122;2025:6;2012:20;2002:30;;2055:18;2047:6;2044:30;2041:117;;;2077:79;;:::i;:::-;2041:117;2191:4;2183:6;2179:17;2167:29;;2245:3;2237:4;2229:6;2225:17;2215:8;2211:32;2208:41;2205:128;;;2252:79;;:::i;:::-;2205:128;1786:553;;;;;:::o;2359:340::-;2415:5;2464:3;2457:4;2449:6;2445:17;2441:27;2431:122;;2472:79;;:::i;:::-;2431:122;2589:6;2576:20;2614:79;2689:3;2681:6;2674:4;2666:6;2662:17;2614:79;:::i;:::-;2605:88;;2421:278;2359:340;;;;:::o;2705:139::-;2751:5;2789:6;2776:20;2767:29;;2805:33;2832:5;2805:33;:::i;:::-;2705:139;;;;:::o;2850:329::-;2909:6;2958:2;2946:9;2937:7;2933:23;2929:32;2926:119;;;2964:79;;:::i;:::-;2926:119;3084:1;3109:53;3154:7;3145:6;3134:9;3130:22;3109:53;:::i;:::-;3099:63;;3055:117;2850:329;;;;:::o;3185:474::-;3253:6;3261;3310:2;3298:9;3289:7;3285:23;3281:32;3278:119;;;3316:79;;:::i;:::-;3278:119;3436:1;3461:53;3506:7;3497:6;3486:9;3482:22;3461:53;:::i;:::-;3451:63;;3407:117;3563:2;3589:53;3634:7;3625:6;3614:9;3610:22;3589:53;:::i;:::-;3579:63;;3534:118;3185:474;;;;;:::o;3665:619::-;3742:6;3750;3758;3807:2;3795:9;3786:7;3782:23;3778:32;3775:119;;;3813:79;;:::i;:::-;3775:119;3933:1;3958:53;4003:7;3994:6;3983:9;3979:22;3958:53;:::i;:::-;3948:63;;3904:117;4060:2;4086:53;4131:7;4122:6;4111:9;4107:22;4086:53;:::i;:::-;4076:63;;4031:118;4188:2;4214:53;4259:7;4250:6;4239:9;4235:22;4214:53;:::i;:::-;4204:63;;4159:118;3665:619;;;;;:::o;4290:943::-;4385:6;4393;4401;4409;4458:3;4446:9;4437:7;4433:23;4429:33;4426:120;;;4465:79;;:::i;:::-;4426:120;4585:1;4610:53;4655:7;4646:6;4635:9;4631:22;4610:53;:::i;:::-;4600:63;;4556:117;4712:2;4738:53;4783:7;4774:6;4763:9;4759:22;4738:53;:::i;:::-;4728:63;;4683:118;4840:2;4866:53;4911:7;4902:6;4891:9;4887:22;4866:53;:::i;:::-;4856:63;;4811:118;4996:2;4985:9;4981:18;4968:32;5027:18;5019:6;5016:30;5013:117;;;5049:79;;:::i;:::-;5013:117;5154:62;5208:7;5199:6;5188:9;5184:22;5154:62;:::i;:::-;5144:72;;4939:287;4290:943;;;;;;;:::o;5239:468::-;5304:6;5312;5361:2;5349:9;5340:7;5336:23;5332:32;5329:119;;;5367:79;;:::i;:::-;5329:119;5487:1;5512:53;5557:7;5548:6;5537:9;5533:22;5512:53;:::i;:::-;5502:63;;5458:117;5614:2;5640:50;5682:7;5673:6;5662:9;5658:22;5640:50;:::i;:::-;5630:60;;5585:115;5239:468;;;;;:::o;5713:474::-;5781:6;5789;5838:2;5826:9;5817:7;5813:23;5809:32;5806:119;;;5844:79;;:::i;:::-;5806:119;5964:1;5989:53;6034:7;6025:6;6014:9;6010:22;5989:53;:::i;:::-;5979:63;;5935:117;6091:2;6117:53;6162:7;6153:6;6142:9;6138:22;6117:53;:::i;:::-;6107:63;;6062:118;5713:474;;;;;:::o;6193:323::-;6249:6;6298:2;6286:9;6277:7;6273:23;6269:32;6266:119;;;6304:79;;:::i;:::-;6266:119;6424:1;6449:50;6491:7;6482:6;6471:9;6467:22;6449:50;:::i;:::-;6439:60;;6395:114;6193:323;;;;:::o;6522:327::-;6580:6;6629:2;6617:9;6608:7;6604:23;6600:32;6597:119;;;6635:79;;:::i;:::-;6597:119;6755:1;6780:52;6824:7;6815:6;6804:9;6800:22;6780:52;:::i;:::-;6770:62;;6726:116;6522:327;;;;:::o;6855:349::-;6924:6;6973:2;6961:9;6952:7;6948:23;6944:32;6941:119;;;6979:79;;:::i;:::-;6941:119;7099:1;7124:63;7179:7;7170:6;7159:9;7155:22;7124:63;:::i;:::-;7114:73;;7070:127;6855:349;;;;:::o;7210:507::-;7278:6;7327:2;7315:9;7306:7;7302:23;7298:32;7295:119;;;7333:79;;:::i;:::-;7295:119;7481:1;7470:9;7466:17;7453:31;7511:18;7503:6;7500:30;7497:117;;;7533:79;;:::i;:::-;7497:117;7638:62;7692:7;7683:6;7672:9;7668:22;7638:62;:::i;:::-;7628:72;;7424:286;7210:507;;;;:::o;7723:529::-;7794:6;7802;7851:2;7839:9;7830:7;7826:23;7822:32;7819:119;;;7857:79;;:::i;:::-;7819:119;8005:1;7994:9;7990:17;7977:31;8035:18;8027:6;8024:30;8021:117;;;8057:79;;:::i;:::-;8021:117;8170:65;8227:7;8218:6;8207:9;8203:22;8170:65;:::i;:::-;8152:83;;;;7948:297;7723:529;;;;;:::o;8258:509::-;8327:6;8376:2;8364:9;8355:7;8351:23;8347:32;8344:119;;;8382:79;;:::i;:::-;8344:119;8530:1;8519:9;8515:17;8502:31;8560:18;8552:6;8549:30;8546:117;;;8582:79;;:::i;:::-;8546:117;8687:63;8742:7;8733:6;8722:9;8718:22;8687:63;:::i;:::-;8677:73;;8473:287;8258:509;;;;:::o;8773:329::-;8832:6;8881:2;8869:9;8860:7;8856:23;8852:32;8849:119;;;8887:79;;:::i;:::-;8849:119;9007:1;9032:53;9077:7;9068:6;9057:9;9053:22;9032:53;:::i;:::-;9022:63;;8978:117;8773:329;;;;:::o;9108:118::-;9195:24;9213:5;9195:24;:::i;:::-;9190:3;9183:37;9108:118;;:::o;9232:157::-;9337:45;9357:24;9375:5;9357:24;:::i;:::-;9337:45;:::i;:::-;9332:3;9325:58;9232:157;;:::o;9395:109::-;9476:21;9491:5;9476:21;:::i;:::-;9471:3;9464:34;9395:109;;:::o;9510:118::-;9597:24;9615:5;9597:24;:::i;:::-;9592:3;9585:37;9510:118;;:::o;9634:360::-;9720:3;9748:38;9780:5;9748:38;:::i;:::-;9802:70;9865:6;9860:3;9802:70;:::i;:::-;9795:77;;9881:52;9926:6;9921:3;9914:4;9907:5;9903:16;9881:52;:::i;:::-;9958:29;9980:6;9958:29;:::i;:::-;9953:3;9949:39;9942:46;;9724:270;9634:360;;;;:::o;10000:364::-;10088:3;10116:39;10149:5;10116:39;:::i;:::-;10171:71;10235:6;10230:3;10171:71;:::i;:::-;10164:78;;10251:52;10296:6;10291:3;10284:4;10277:5;10273:16;10251:52;:::i;:::-;10328:29;10350:6;10328:29;:::i;:::-;10323:3;10319:39;10312:46;;10092:272;10000:364;;;;:::o;10370:377::-;10476:3;10504:39;10537:5;10504:39;:::i;:::-;10559:89;10641:6;10636:3;10559:89;:::i;:::-;10552:96;;10657:52;10702:6;10697:3;10690:4;10683:5;10679:16;10657:52;:::i;:::-;10734:6;10729:3;10725:16;10718:23;;10480:267;10370:377;;;;:::o;10753:366::-;10895:3;10916:67;10980:2;10975:3;10916:67;:::i;:::-;10909:74;;10992:93;11081:3;10992:93;:::i;:::-;11110:2;11105:3;11101:12;11094:19;;10753:366;;;:::o;11125:::-;11267:3;11288:67;11352:2;11347:3;11288:67;:::i;:::-;11281:74;;11364:93;11453:3;11364:93;:::i;:::-;11482:2;11477:3;11473:12;11466:19;;11125:366;;;:::o;11497:::-;11639:3;11660:67;11724:2;11719:3;11660:67;:::i;:::-;11653:74;;11736:93;11825:3;11736:93;:::i;:::-;11854:2;11849:3;11845:12;11838:19;;11497:366;;;:::o;11869:::-;12011:3;12032:67;12096:2;12091:3;12032:67;:::i;:::-;12025:74;;12108:93;12197:3;12108:93;:::i;:::-;12226:2;12221:3;12217:12;12210:19;;11869:366;;;:::o;12241:::-;12383:3;12404:67;12468:2;12463:3;12404:67;:::i;:::-;12397:74;;12480:93;12569:3;12480:93;:::i;:::-;12598:2;12593:3;12589:12;12582:19;;12241:366;;;:::o;12613:::-;12755:3;12776:67;12840:2;12835:3;12776:67;:::i;:::-;12769:74;;12852:93;12941:3;12852:93;:::i;:::-;12970:2;12965:3;12961:12;12954:19;;12613:366;;;:::o;12985:::-;13127:3;13148:67;13212:2;13207:3;13148:67;:::i;:::-;13141:74;;13224:93;13313:3;13224:93;:::i;:::-;13342:2;13337:3;13333:12;13326:19;;12985:366;;;:::o;13357:::-;13499:3;13520:67;13584:2;13579:3;13520:67;:::i;:::-;13513:74;;13596:93;13685:3;13596:93;:::i;:::-;13714:2;13709:3;13705:12;13698:19;;13357:366;;;:::o;13729:::-;13871:3;13892:67;13956:2;13951:3;13892:67;:::i;:::-;13885:74;;13968:93;14057:3;13968:93;:::i;:::-;14086:2;14081:3;14077:12;14070:19;;13729:366;;;:::o;14101:::-;14243:3;14264:67;14328:2;14323:3;14264:67;:::i;:::-;14257:74;;14340:93;14429:3;14340:93;:::i;:::-;14458:2;14453:3;14449:12;14442:19;;14101:366;;;:::o;14473:::-;14615:3;14636:67;14700:2;14695:3;14636:67;:::i;:::-;14629:74;;14712:93;14801:3;14712:93;:::i;:::-;14830:2;14825:3;14821:12;14814:19;;14473:366;;;:::o;14845:::-;14987:3;15008:67;15072:2;15067:3;15008:67;:::i;:::-;15001:74;;15084:93;15173:3;15084:93;:::i;:::-;15202:2;15197:3;15193:12;15186:19;;14845:366;;;:::o;15217:::-;15359:3;15380:67;15444:2;15439:3;15380:67;:::i;:::-;15373:74;;15456:93;15545:3;15456:93;:::i;:::-;15574:2;15569:3;15565:12;15558:19;;15217:366;;;:::o;15589:::-;15731:3;15752:67;15816:2;15811:3;15752:67;:::i;:::-;15745:74;;15828:93;15917:3;15828:93;:::i;:::-;15946:2;15941:3;15937:12;15930:19;;15589:366;;;:::o;15961:::-;16103:3;16124:67;16188:2;16183:3;16124:67;:::i;:::-;16117:74;;16200:93;16289:3;16200:93;:::i;:::-;16318:2;16313:3;16309:12;16302:19;;15961:366;;;:::o;16333:::-;16475:3;16496:67;16560:2;16555:3;16496:67;:::i;:::-;16489:74;;16572:93;16661:3;16572:93;:::i;:::-;16690:2;16685:3;16681:12;16674:19;;16333:366;;;:::o;16705:::-;16847:3;16868:67;16932:2;16927:3;16868:67;:::i;:::-;16861:74;;16944:93;17033:3;16944:93;:::i;:::-;17062:2;17057:3;17053:12;17046:19;;16705:366;;;:::o;17077:::-;17219:3;17240:67;17304:2;17299:3;17240:67;:::i;:::-;17233:74;;17316:93;17405:3;17316:93;:::i;:::-;17434:2;17429:3;17425:12;17418:19;;17077:366;;;:::o;17449:::-;17591:3;17612:67;17676:2;17671:3;17612:67;:::i;:::-;17605:74;;17688:93;17777:3;17688:93;:::i;:::-;17806:2;17801:3;17797:12;17790:19;;17449:366;;;:::o;17821:::-;17963:3;17984:67;18048:2;18043:3;17984:67;:::i;:::-;17977:74;;18060:93;18149:3;18060:93;:::i;:::-;18178:2;18173:3;18169:12;18162:19;;17821:366;;;:::o;18193:::-;18335:3;18356:67;18420:2;18415:3;18356:67;:::i;:::-;18349:74;;18432:93;18521:3;18432:93;:::i;:::-;18550:2;18545:3;18541:12;18534:19;;18193:366;;;:::o;18565:::-;18707:3;18728:67;18792:2;18787:3;18728:67;:::i;:::-;18721:74;;18804:93;18893:3;18804:93;:::i;:::-;18922:2;18917:3;18913:12;18906:19;;18565:366;;;:::o;18937:::-;19079:3;19100:67;19164:2;19159:3;19100:67;:::i;:::-;19093:74;;19176:93;19265:3;19176:93;:::i;:::-;19294:2;19289:3;19285:12;19278:19;;18937:366;;;:::o;19309:::-;19451:3;19472:67;19536:2;19531:3;19472:67;:::i;:::-;19465:74;;19548:93;19637:3;19548:93;:::i;:::-;19666:2;19661:3;19657:12;19650:19;;19309:366;;;:::o;19681:::-;19823:3;19844:67;19908:2;19903:3;19844:67;:::i;:::-;19837:74;;19920:93;20009:3;19920:93;:::i;:::-;20038:2;20033:3;20029:12;20022:19;;19681:366;;;:::o;20053:::-;20195:3;20216:67;20280:2;20275:3;20216:67;:::i;:::-;20209:74;;20292:93;20381:3;20292:93;:::i;:::-;20410:2;20405:3;20401:12;20394:19;;20053:366;;;:::o;20425:::-;20567:3;20588:67;20652:2;20647:3;20588:67;:::i;:::-;20581:74;;20664:93;20753:3;20664:93;:::i;:::-;20782:2;20777:3;20773:12;20766:19;;20425:366;;;:::o;20797:::-;20939:3;20960:67;21024:2;21019:3;20960:67;:::i;:::-;20953:74;;21036:93;21125:3;21036:93;:::i;:::-;21154:2;21149:3;21145:12;21138:19;;20797:366;;;:::o;21169:::-;21311:3;21332:67;21396:2;21391:3;21332:67;:::i;:::-;21325:74;;21408:93;21497:3;21408:93;:::i;:::-;21526:2;21521:3;21517:12;21510:19;;21169:366;;;:::o;21541:::-;21683:3;21704:67;21768:2;21763:3;21704:67;:::i;:::-;21697:74;;21780:93;21869:3;21780:93;:::i;:::-;21898:2;21893:3;21889:12;21882:19;;21541:366;;;:::o;21913:::-;22055:3;22076:67;22140:2;22135:3;22076:67;:::i;:::-;22069:74;;22152:93;22241:3;22152:93;:::i;:::-;22270:2;22265:3;22261:12;22254:19;;21913:366;;;:::o;22285:::-;22427:3;22448:67;22512:2;22507:3;22448:67;:::i;:::-;22441:74;;22524:93;22613:3;22524:93;:::i;:::-;22642:2;22637:3;22633:12;22626:19;;22285:366;;;:::o;22657:118::-;22744:24;22762:5;22744:24;:::i;:::-;22739:3;22732:37;22657:118;;:::o;22781:112::-;22864:22;22880:5;22864:22;:::i;:::-;22859:3;22852:35;22781:112;;:::o;22899:397::-;23039:3;23054:75;23125:3;23116:6;23054:75;:::i;:::-;23154:2;23149:3;23145:12;23138:19;;23167:75;23238:3;23229:6;23167:75;:::i;:::-;23267:2;23262:3;23258:12;23251:19;;23287:3;23280:10;;22899:397;;;;;:::o;23302:435::-;23482:3;23504:95;23595:3;23586:6;23504:95;:::i;:::-;23497:102;;23616:95;23707:3;23698:6;23616:95;:::i;:::-;23609:102;;23728:3;23721:10;;23302:435;;;;;:::o;23743:222::-;23836:4;23874:2;23863:9;23859:18;23851:26;;23887:71;23955:1;23944:9;23940:17;23931:6;23887:71;:::i;:::-;23743:222;;;;:::o;23971:640::-;24166:4;24204:3;24193:9;24189:19;24181:27;;24218:71;24286:1;24275:9;24271:17;24262:6;24218:71;:::i;:::-;24299:72;24367:2;24356:9;24352:18;24343:6;24299:72;:::i;:::-;24381;24449:2;24438:9;24434:18;24425:6;24381:72;:::i;:::-;24500:9;24494:4;24490:20;24485:2;24474:9;24470:18;24463:48;24528:76;24599:4;24590:6;24528:76;:::i;:::-;24520:84;;23971:640;;;;;;;:::o;24617:210::-;24704:4;24742:2;24731:9;24727:18;24719:26;;24755:65;24817:1;24806:9;24802:17;24793:6;24755:65;:::i;:::-;24617:210;;;;:::o;24833:545::-;25006:4;25044:3;25033:9;25029:19;25021:27;;25058:71;25126:1;25115:9;25111:17;25102:6;25058:71;:::i;:::-;25139:68;25203:2;25192:9;25188:18;25179:6;25139:68;:::i;:::-;25217:72;25285:2;25274:9;25270:18;25261:6;25217:72;:::i;:::-;25299;25367:2;25356:9;25352:18;25343:6;25299:72;:::i;:::-;24833:545;;;;;;;:::o;25384:313::-;25497:4;25535:2;25524:9;25520:18;25512:26;;25584:9;25578:4;25574:20;25570:1;25559:9;25555:17;25548:47;25612:78;25685:4;25676:6;25612:78;:::i;:::-;25604:86;;25384:313;;;;:::o;25703:419::-;25869:4;25907:2;25896:9;25892:18;25884:26;;25956:9;25950:4;25946:20;25942:1;25931:9;25927:17;25920:47;25984:131;26110:4;25984:131;:::i;:::-;25976:139;;25703:419;;;:::o;26128:::-;26294:4;26332:2;26321:9;26317:18;26309:26;;26381:9;26375:4;26371:20;26367:1;26356:9;26352:17;26345:47;26409:131;26535:4;26409:131;:::i;:::-;26401:139;;26128:419;;;:::o;26553:::-;26719:4;26757:2;26746:9;26742:18;26734:26;;26806:9;26800:4;26796:20;26792:1;26781:9;26777:17;26770:47;26834:131;26960:4;26834:131;:::i;:::-;26826:139;;26553:419;;;:::o;26978:::-;27144:4;27182:2;27171:9;27167:18;27159:26;;27231:9;27225:4;27221:20;27217:1;27206:9;27202:17;27195:47;27259:131;27385:4;27259:131;:::i;:::-;27251:139;;26978:419;;;:::o;27403:::-;27569:4;27607:2;27596:9;27592:18;27584:26;;27656:9;27650:4;27646:20;27642:1;27631:9;27627:17;27620:47;27684:131;27810:4;27684:131;:::i;:::-;27676:139;;27403:419;;;:::o;27828:::-;27994:4;28032:2;28021:9;28017:18;28009:26;;28081:9;28075:4;28071:20;28067:1;28056:9;28052:17;28045:47;28109:131;28235:4;28109:131;:::i;:::-;28101:139;;27828:419;;;:::o;28253:::-;28419:4;28457:2;28446:9;28442:18;28434:26;;28506:9;28500:4;28496:20;28492:1;28481:9;28477:17;28470:47;28534:131;28660:4;28534:131;:::i;:::-;28526:139;;28253:419;;;:::o;28678:::-;28844:4;28882:2;28871:9;28867:18;28859:26;;28931:9;28925:4;28921:20;28917:1;28906:9;28902:17;28895:47;28959:131;29085:4;28959:131;:::i;:::-;28951:139;;28678:419;;;:::o;29103:::-;29269:4;29307:2;29296:9;29292:18;29284:26;;29356:9;29350:4;29346:20;29342:1;29331:9;29327:17;29320:47;29384:131;29510:4;29384:131;:::i;:::-;29376:139;;29103:419;;;:::o;29528:::-;29694:4;29732:2;29721:9;29717:18;29709:26;;29781:9;29775:4;29771:20;29767:1;29756:9;29752:17;29745:47;29809:131;29935:4;29809:131;:::i;:::-;29801:139;;29528:419;;;:::o;29953:::-;30119:4;30157:2;30146:9;30142:18;30134:26;;30206:9;30200:4;30196:20;30192:1;30181:9;30177:17;30170:47;30234:131;30360:4;30234:131;:::i;:::-;30226:139;;29953:419;;;:::o;30378:::-;30544:4;30582:2;30571:9;30567:18;30559:26;;30631:9;30625:4;30621:20;30617:1;30606:9;30602:17;30595:47;30659:131;30785:4;30659:131;:::i;:::-;30651:139;;30378:419;;;:::o;30803:::-;30969:4;31007:2;30996:9;30992:18;30984:26;;31056:9;31050:4;31046:20;31042:1;31031:9;31027:17;31020:47;31084:131;31210:4;31084:131;:::i;:::-;31076:139;;30803:419;;;:::o;31228:::-;31394:4;31432:2;31421:9;31417:18;31409:26;;31481:9;31475:4;31471:20;31467:1;31456:9;31452:17;31445:47;31509:131;31635:4;31509:131;:::i;:::-;31501:139;;31228:419;;;:::o;31653:::-;31819:4;31857:2;31846:9;31842:18;31834:26;;31906:9;31900:4;31896:20;31892:1;31881:9;31877:17;31870:47;31934:131;32060:4;31934:131;:::i;:::-;31926:139;;31653:419;;;:::o;32078:::-;32244:4;32282:2;32271:9;32267:18;32259:26;;32331:9;32325:4;32321:20;32317:1;32306:9;32302:17;32295:47;32359:131;32485:4;32359:131;:::i;:::-;32351:139;;32078:419;;;:::o;32503:::-;32669:4;32707:2;32696:9;32692:18;32684:26;;32756:9;32750:4;32746:20;32742:1;32731:9;32727:17;32720:47;32784:131;32910:4;32784:131;:::i;:::-;32776:139;;32503:419;;;:::o;32928:::-;33094:4;33132:2;33121:9;33117:18;33109:26;;33181:9;33175:4;33171:20;33167:1;33156:9;33152:17;33145:47;33209:131;33335:4;33209:131;:::i;:::-;33201:139;;32928:419;;;:::o;33353:::-;33519:4;33557:2;33546:9;33542:18;33534:26;;33606:9;33600:4;33596:20;33592:1;33581:9;33577:17;33570:47;33634:131;33760:4;33634:131;:::i;:::-;33626:139;;33353:419;;;:::o;33778:::-;33944:4;33982:2;33971:9;33967:18;33959:26;;34031:9;34025:4;34021:20;34017:1;34006:9;34002:17;33995:47;34059:131;34185:4;34059:131;:::i;:::-;34051:139;;33778:419;;;:::o;34203:::-;34369:4;34407:2;34396:9;34392:18;34384:26;;34456:9;34450:4;34446:20;34442:1;34431:9;34427:17;34420:47;34484:131;34610:4;34484:131;:::i;:::-;34476:139;;34203:419;;;:::o;34628:::-;34794:4;34832:2;34821:9;34817:18;34809:26;;34881:9;34875:4;34871:20;34867:1;34856:9;34852:17;34845:47;34909:131;35035:4;34909:131;:::i;:::-;34901:139;;34628:419;;;:::o;35053:::-;35219:4;35257:2;35246:9;35242:18;35234:26;;35306:9;35300:4;35296:20;35292:1;35281:9;35277:17;35270:47;35334:131;35460:4;35334:131;:::i;:::-;35326:139;;35053:419;;;:::o;35478:::-;35644:4;35682:2;35671:9;35667:18;35659:26;;35731:9;35725:4;35721:20;35717:1;35706:9;35702:17;35695:47;35759:131;35885:4;35759:131;:::i;:::-;35751:139;;35478:419;;;:::o;35903:::-;36069:4;36107:2;36096:9;36092:18;36084:26;;36156:9;36150:4;36146:20;36142:1;36131:9;36127:17;36120:47;36184:131;36310:4;36184:131;:::i;:::-;36176:139;;35903:419;;;:::o;36328:::-;36494:4;36532:2;36521:9;36517:18;36509:26;;36581:9;36575:4;36571:20;36567:1;36556:9;36552:17;36545:47;36609:131;36735:4;36609:131;:::i;:::-;36601:139;;36328:419;;;:::o;36753:::-;36919:4;36957:2;36946:9;36942:18;36934:26;;37006:9;37000:4;36996:20;36992:1;36981:9;36977:17;36970:47;37034:131;37160:4;37034:131;:::i;:::-;37026:139;;36753:419;;;:::o;37178:::-;37344:4;37382:2;37371:9;37367:18;37359:26;;37431:9;37425:4;37421:20;37417:1;37406:9;37402:17;37395:47;37459:131;37585:4;37459:131;:::i;:::-;37451:139;;37178:419;;;:::o;37603:::-;37769:4;37807:2;37796:9;37792:18;37784:26;;37856:9;37850:4;37846:20;37842:1;37831:9;37827:17;37820:47;37884:131;38010:4;37884:131;:::i;:::-;37876:139;;37603:419;;;:::o;38028:::-;38194:4;38232:2;38221:9;38217:18;38209:26;;38281:9;38275:4;38271:20;38267:1;38256:9;38252:17;38245:47;38309:131;38435:4;38309:131;:::i;:::-;38301:139;;38028:419;;;:::o;38453:::-;38619:4;38657:2;38646:9;38642:18;38634:26;;38706:9;38700:4;38696:20;38692:1;38681:9;38677:17;38670:47;38734:131;38860:4;38734:131;:::i;:::-;38726:139;;38453:419;;;:::o;38878:::-;39044:4;39082:2;39071:9;39067:18;39059:26;;39131:9;39125:4;39121:20;39117:1;39106:9;39102:17;39095:47;39159:131;39285:4;39159:131;:::i;:::-;39151:139;;38878:419;;;:::o;39303:222::-;39396:4;39434:2;39423:9;39419:18;39411:26;;39447:71;39515:1;39504:9;39500:17;39491:6;39447:71;:::i;:::-;39303:222;;;;:::o;39531:533::-;39700:4;39738:2;39727:9;39723:18;39715:26;;39751:71;39819:1;39808:9;39804:17;39795:6;39751:71;:::i;:::-;39832:72;39900:2;39889:9;39885:18;39876:6;39832:72;:::i;:::-;39951:9;39945:4;39941:20;39936:2;39925:9;39921:18;39914:48;39979:78;40052:4;40043:6;39979:78;:::i;:::-;39971:86;;39531:533;;;;;;:::o;40070:129::-;40104:6;40131:20;;:::i;:::-;40121:30;;40160:33;40188:4;40180:6;40160:33;:::i;:::-;40070:129;;;:::o;40205:75::-;40238:6;40271:2;40265:9;40255:19;;40205:75;:::o;40286:307::-;40347:4;40437:18;40429:6;40426:30;40423:56;;;40459:18;;:::i;:::-;40423:56;40497:29;40519:6;40497:29;:::i;:::-;40489:37;;40581:4;40575;40571:15;40563:23;;40286:307;;;:::o;40599:308::-;40661:4;40751:18;40743:6;40740:30;40737:56;;;40773:18;;:::i;:::-;40737:56;40811:29;40833:6;40811:29;:::i;:::-;40803:37;;40895:4;40889;40885:15;40877:23;;40599:308;;;:::o;40913:98::-;40964:6;40998:5;40992:12;40982:22;;40913:98;;;:::o;41017:99::-;41069:6;41103:5;41097:12;41087:22;;41017:99;;;:::o;41122:168::-;41205:11;41239:6;41234:3;41227:19;41279:4;41274:3;41270:14;41255:29;;41122:168;;;;:::o;41296:169::-;41380:11;41414:6;41409:3;41402:19;41454:4;41449:3;41445:14;41430:29;;41296:169;;;;:::o;41471:148::-;41573:11;41610:3;41595:18;;41471:148;;;;:::o;41625:305::-;41665:3;41684:20;41702:1;41684:20;:::i;:::-;41679:25;;41718:20;41736:1;41718:20;:::i;:::-;41713:25;;41872:1;41804:66;41800:74;41797:1;41794:81;41791:107;;;41878:18;;:::i;:::-;41791:107;41922:1;41919;41915:9;41908:16;;41625:305;;;;:::o;41936:185::-;41976:1;41993:20;42011:1;41993:20;:::i;:::-;41988:25;;42027:20;42045:1;42027:20;:::i;:::-;42022:25;;42066:1;42056:35;;42071:18;;:::i;:::-;42056:35;42113:1;42110;42106:9;42101:14;;41936:185;;;;:::o;42127:348::-;42167:7;42190:20;42208:1;42190:20;:::i;:::-;42185:25;;42224:20;42242:1;42224:20;:::i;:::-;42219:25;;42412:1;42344:66;42340:74;42337:1;42334:81;42329:1;42322:9;42315:17;42311:105;42308:131;;;42419:18;;:::i;:::-;42308:131;42467:1;42464;42460:9;42449:20;;42127:348;;;;:::o;42481:191::-;42521:4;42541:20;42559:1;42541:20;:::i;:::-;42536:25;;42575:20;42593:1;42575:20;:::i;:::-;42570:25;;42614:1;42611;42608:8;42605:34;;;42619:18;;:::i;:::-;42605:34;42664:1;42661;42657:9;42649:17;;42481:191;;;;:::o;42678:96::-;42715:7;42744:24;42762:5;42744:24;:::i;:::-;42733:35;;42678:96;;;:::o;42780:90::-;42814:7;42857:5;42850:13;42843:21;42832:32;;42780:90;;;:::o;42876:77::-;42913:7;42942:5;42931:16;;42876:77;;;:::o;42959:149::-;42995:7;43035:66;43028:5;43024:78;43013:89;;42959:149;;;:::o;43114:126::-;43151:7;43191:42;43184:5;43180:54;43169:65;;43114:126;;;:::o;43246:77::-;43283:7;43312:5;43301:16;;43246:77;;;:::o;43329:86::-;43364:7;43404:4;43397:5;43393:16;43382:27;;43329:86;;;:::o;43421:154::-;43505:6;43500:3;43495;43482:30;43567:1;43558:6;43553:3;43549:16;43542:27;43421:154;;;:::o;43581:307::-;43649:1;43659:113;43673:6;43670:1;43667:13;43659:113;;;43758:1;43753:3;43749:11;43743:18;43739:1;43734:3;43730:11;43723:39;43695:2;43692:1;43688:10;43683:15;;43659:113;;;43790:6;43787:1;43784:13;43781:101;;;43870:1;43861:6;43856:3;43852:16;43845:27;43781:101;43630:258;43581:307;;;:::o;43894:320::-;43938:6;43975:1;43969:4;43965:12;43955:22;;44022:1;44016:4;44012:12;44043:18;44033:81;;44099:4;44091:6;44087:17;44077:27;;44033:81;44161:2;44153:6;44150:14;44130:18;44127:38;44124:84;;;44180:18;;:::i;:::-;44124:84;43945:269;43894:320;;;:::o;44220:281::-;44303:27;44325:4;44303:27;:::i;:::-;44295:6;44291:40;44433:6;44421:10;44418:22;44397:18;44385:10;44382:34;44379:62;44376:88;;;44444:18;;:::i;:::-;44376:88;44484:10;44480:2;44473:22;44263:238;44220:281;;:::o;44507:233::-;44546:3;44569:24;44587:5;44569:24;:::i;:::-;44560:33;;44615:66;44608:5;44605:77;44602:103;;;44685:18;;:::i;:::-;44602:103;44732:1;44725:5;44721:13;44714:20;;44507:233;;;:::o;44746:100::-;44785:7;44814:26;44834:5;44814:26;:::i;:::-;44803:37;;44746:100;;;:::o;44852:94::-;44891:7;44920:20;44934:5;44920:20;:::i;:::-;44909:31;;44852:94;;;:::o;44952:176::-;44984:1;45001:20;45019:1;45001:20;:::i;:::-;44996:25;;45035:20;45053:1;45035:20;:::i;:::-;45030:25;;45074:1;45064:35;;45079:18;;:::i;:::-;45064:35;45120:1;45117;45113:9;45108:14;;44952:176;;;;:::o;45134:180::-;45182:77;45179:1;45172:88;45279:4;45276:1;45269:15;45303:4;45300:1;45293:15;45320:180;45368:77;45365:1;45358:88;45465:4;45462:1;45455:15;45489:4;45486:1;45479:15;45506:180;45554:77;45551:1;45544:88;45651:4;45648:1;45641:15;45675:4;45672:1;45665:15;45692:180;45740:77;45737:1;45730:88;45837:4;45834:1;45827:15;45861:4;45858:1;45851:15;45878:180;45926:77;45923:1;45916:88;46023:4;46020:1;46013:15;46047:4;46044:1;46037:15;46064:180;46112:77;46109:1;46102:88;46209:4;46206:1;46199:15;46233:4;46230:1;46223:15;46250:117;46359:1;46356;46349:12;46373:117;46482:1;46479;46472:12;46496:117;46605:1;46602;46595:12;46619:117;46728:1;46725;46718:12;46742:117;46851:1;46848;46841:12;46865:117;46974:1;46971;46964:12;46988:102;47029:6;47080:2;47076:7;47071:2;47064:5;47060:14;47056:28;47046:38;;46988:102;;;:::o;47096:94::-;47129:8;47177:5;47173:2;47169:14;47148:35;;47096:94;;;:::o;47196:174::-;47336:26;47332:1;47324:6;47320:14;47313:50;47196:174;:::o;47376:230::-;47516:34;47512:1;47504:6;47500:14;47493:58;47585:13;47580:2;47572:6;47568:15;47561:38;47376:230;:::o;47612:237::-;47752:34;47748:1;47740:6;47736:14;47729:58;47821:20;47816:2;47808:6;47804:15;47797:45;47612:237;:::o;47855:225::-;47995:34;47991:1;47983:6;47979:14;47972:58;48064:8;48059:2;48051:6;48047:15;48040:33;47855:225;:::o;48086:170::-;48226:22;48222:1;48214:6;48210:14;48203:46;48086:170;:::o;48262:178::-;48402:30;48398:1;48390:6;48386:14;48379:54;48262:178;:::o;48446:228::-;48586:34;48582:1;48574:6;48570:14;48563:58;48655:11;48650:2;48642:6;48638:15;48631:36;48446:228;:::o;48680:223::-;48820:34;48816:1;48808:6;48804:14;48797:58;48889:6;48884:2;48876:6;48872:15;48865:31;48680:223;:::o;48909:175::-;49049:27;49045:1;49037:6;49033:14;49026:51;48909:175;:::o;49090:164::-;49230:16;49226:1;49218:6;49214:14;49207:40;49090:164;:::o;49260:170::-;49400:22;49396:1;49388:6;49384:14;49377:46;49260:170;:::o;49436:178::-;49576:30;49572:1;49564:6;49560:14;49553:54;49436:178;:::o;49620:231::-;49760:34;49756:1;49748:6;49744:14;49737:58;49829:14;49824:2;49816:6;49812:15;49805:39;49620:231;:::o;49857:229::-;49997:34;49993:1;49985:6;49981:14;49974:58;50066:12;50061:2;50053:6;50049:15;50042:37;49857:229;:::o;50092:223::-;50232:34;50228:1;50220:6;50216:14;50209:58;50301:6;50296:2;50288:6;50284:15;50277:31;50092:223;:::o;50321:243::-;50461:34;50457:1;50449:6;50445:14;50438:58;50530:26;50525:2;50517:6;50513:15;50506:51;50321:243;:::o;50570:229::-;50710:34;50706:1;50698:6;50694:14;50687:58;50779:12;50774:2;50766:6;50762:15;50755:37;50570:229;:::o;50805:228::-;50945:34;50941:1;50933:6;50929:14;50922:58;51014:11;51009:2;51001:6;50997:15;50990:36;50805:228;:::o;51039:226::-;51179:34;51175:1;51167:6;51163:14;51156:58;51248:9;51243:2;51235:6;51231:15;51224:34;51039:226;:::o;51271:182::-;51411:34;51407:1;51399:6;51395:14;51388:58;51271:182;:::o;51459:172::-;51599:24;51595:1;51587:6;51583:14;51576:48;51459:172;:::o;51637:231::-;51777:34;51773:1;51765:6;51761:14;51754:58;51846:14;51841:2;51833:6;51829:15;51822:39;51637:231;:::o;51874:182::-;52014:34;52010:1;52002:6;51998:14;51991:58;51874:182;:::o;52062:180::-;52202:32;52198:1;52190:6;52186:14;52179:56;52062:180;:::o;52248:228::-;52388:34;52384:1;52376:6;52372:14;52365:58;52457:11;52452:2;52444:6;52440:15;52433:36;52248:228;:::o;52482:220::-;52622:34;52618:1;52610:6;52606:14;52599:58;52691:3;52686:2;52678:6;52674:15;52667:28;52482:220;:::o;52708:221::-;52848:34;52844:1;52836:6;52832:14;52825:58;52917:4;52912:2;52904:6;52900:15;52893:29;52708:221;:::o;52935:236::-;53075:34;53071:1;53063:6;53059:14;53052:58;53144:19;53139:2;53131:6;53127:15;53120:44;52935:236;:::o;53177:231::-;53317:34;53313:1;53305:6;53301:14;53294:58;53386:14;53381:2;53373:6;53369:15;53362:39;53177:231;:::o;53414:178::-;53554:30;53550:1;53542:6;53538:14;53531:54;53414:178;:::o;53598:177::-;53738:29;53734:1;53726:6;53722:14;53715:53;53598:177;:::o;53781:220::-;53921:34;53917:1;53909:6;53905:14;53898:58;53990:3;53985:2;53977:6;53973:15;53966:28;53781:220;:::o;54007:122::-;54080:24;54098:5;54080:24;:::i;:::-;54073:5;54070:35;54060:63;;54119:1;54116;54109:12;54060:63;54007:122;:::o;54135:116::-;54205:21;54220:5;54205:21;:::i;:::-;54198:5;54195:32;54185:60;;54241:1;54238;54231:12;54185:60;54135:116;:::o;54257:120::-;54329:23;54346:5;54329:23;:::i;:::-;54322:5;54319:34;54309:62;;54367:1;54364;54357:12;54309:62;54257:120;:::o;54383:122::-;54456:24;54474:5;54456:24;:::i;:::-;54449:5;54446:35;54436:63;;54495:1;54492;54485:12;54436:63;54383:122;:::o

Swarm Source

ipfs://24c0a9e7345ff1d610fdf1da6a370a13fa401cff528db0b74f4660ead3433ecf
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.