ETH Price: $2,438.29 (-0.71%)
 

Overview

TokenID

5962

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

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

OVERVIEW

Presale of 1177 gurus Sold out. Public sale on 19th at 11:30am EST. Mint here: https://nftgurus.co at 0.09 ETH.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
NFTgurus

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: UNLICENSED

pragma solidity 0.8.0;

library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    function toString(uint256 value) internal pure returns (string memory) {

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

    function 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);
    }

    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);
    }
}



abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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



abstract contract Ownable is Context {
    address private _owner;

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

    constructor() {
        _setOwner(_msgSender());
    }

    function owner() public view virtual returns (address) {
        return _owner;
    }

    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    function renounceOwnership() public virtual onlyOwner {
        _setOwner(address(0));
    }

    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);
    }
}



library Address {
    function isContract(address account) internal view returns (bool) {
        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    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");
    }

    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);
            }
        }
    }
}



interface IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}



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);
}



abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}



interface IERC721 is IERC165 {
    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;
}



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);
}



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);
}



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(), ".json")) : "";
    }

    /**
     * @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"
        );
        
        emit Transfer(address(0), to, tokenId);
        
    }

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



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();
    }
}



contract NFTgurus is ERC721Enumerable, Ownable {

    using Strings for uint256;

    string _baseTokenURI;
    uint256 public _maxperTX = 77;
    uint256 public _limit = 1100;
    uint256 public _reserved = 323;
    uint256 public _price = 0.09 ether;
    address public fundWallet;
    bool public _paused = true;

    constructor(string memory baseURI, address _fundWallet) ERC721("NFT Gurus", "GURU")  {
        require(_fundWallet != address(0), "Zero address error");
        setBaseURI(baseURI);
        fundWallet = _fundWallet;
    }
    
    function MINT(uint256 num) public payable {
        uint256 supply = totalSupply();
        require( !_paused,                                       "Sale paused" );
        require( num <= _maxperTX,                               "You are exceeding limit of per transaction GURUS" );
        require( supply + num <= _limit - _reserved,             "Exceeds maximum GURUS supply" );
        require( msg.value >= _price * num,                      "Ether sent is not correct" );

        for(uint256 i; i < num; i++){
            _safeMint( msg.sender, supply + i );
        }
    }

    function giveAway(address _to, uint256 _amount) external onlyOwner() {
        require( _to !=  address(0), "Zero address error");
        require( _amount <= _reserved, "Exceeds reserved GURUS supply");

        uint256 supply = totalSupply();
        for(uint256 i; i < _amount; i++){
            _safeMint( _to, supply + i );
        }
        _reserved -= _amount;
    }
    
    function walletOfOwner(address _owner) public view returns(uint256[] memory) {
        uint256 tokenCount = balanceOf(_owner);

        uint256[] memory tokensId = new uint256[](tokenCount);
        for(uint256 i; i < tokenCount; i++){
            tokensId[i] = tokenOfOwnerByIndex(_owner, i);
        }
        return tokensId;
    }

    // Just in case Eth does some crazy stuff
    function setPrice(uint256 _newPrice) public onlyOwner() {
        _price = _newPrice;
    }

    function setFundWallet(address _fundWallet) public onlyOwner() {
        require(_fundWallet != address(0), "Zero address error");
        fundWallet = _fundWallet;
    }

    function _baseURI() internal view virtual override returns (string memory) {
        return _baseTokenURI;
    }

    function setLimit(uint256 limit) public onlyOwner {
        _limit = limit;
    }

    function setMaxPerWallet(uint256 limit) public onlyOwner {
        _maxperTX = limit;
    }

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

    function pause() public onlyOwner {
        _paused = !_paused;
    }

    function withdrawAll() public payable onlyOwner {
        require(payable(fundWallet).send(address(this).balance));
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"baseURI","type":"string"},{"internalType":"address","name":"_fundWallet","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"MINT","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"_limit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxperTX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_reserved","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":"fundWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"giveAway","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"pause","outputs":[],"stateMutability":"nonpayable","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":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_fundWallet","type":"address"}],"name":"setFundWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"limit","type":"uint256"}],"name":"setLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"limit","type":"uint256"}],"name":"setMaxPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"payable","type":"function"}]

6080604052604d600c5561044c600d55610143600e5567013fbe85edc90000600f556001601060146101000a81548160ff0219169083151502179055503480156200004957600080fd5b5060405162004d1d38038062004d1d83398181016040528101906200006f9190620004d8565b6040518060400160405280600981526020017f4e465420477572757300000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f47555255000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000f39291906200039f565b5080600190805190602001906200010c9291906200039f565b5050506200012f62000123620001fc60201b60201c565b6200020460201b60201c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415620001a2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200019990620005b6565b60405180910390fd5b620001b382620002ca60201b60201c565b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050506200078a565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002da620001fc60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620003006200037560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000359576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200035090620005d8565b60405180910390fd5b80600b9080519060200190620003719291906200039f565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620003ad90620006dc565b90600052602060002090601f016020900481019282620003d157600085556200041d565b82601f10620003ec57805160ff19168380011785556200041d565b828001600101855582156200041d579182015b828111156200041c578251825591602001919060010190620003ff565b5b5090506200042c919062000430565b5090565b5b808211156200044b57600081600090555060010162000431565b5090565b60006200046662000460846200062e565b620005fa565b9050828152602081018484840111156200047f57600080fd5b6200048c848285620006a6565b509392505050565b600081519050620004a58162000770565b92915050565b600082601f830112620004bd57600080fd5b8151620004cf8482602086016200044f565b91505092915050565b60008060408385031215620004ec57600080fd5b600083015167ffffffffffffffff8111156200050757600080fd5b6200051585828601620004ab565b9250506020620005288582860162000494565b9150509250929050565b60006200054160128362000661565b91507f5a65726f2061646472657373206572726f7200000000000000000000000000006000830152602082019050919050565b60006200058360208362000661565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006020820190508181036000830152620005d18162000532565b9050919050565b60006020820190508181036000830152620005f38162000574565b9050919050565b6000604051905081810181811067ffffffffffffffff8211171562000624576200062362000741565b5b8060405250919050565b600067ffffffffffffffff8211156200064c576200064b62000741565b5b601f19601f8301169050602081019050919050565b600082825260208201905092915050565b60006200067f8262000686565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60005b83811015620006c6578082015181840152602081019050620006a9565b83811115620006d6576000848401525b50505050565b60006002820490506001821680620006f557607f821691505b602082108114156200070c576200070b62000712565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200077b8162000672565b81146200078757600080fd5b50565b614583806200079a6000396000f3fe6080604052600436106102045760003560e01c8063664a1ad61161011857806395d89b41116100a0578063ca8001441161006f578063ca80014414610739578063df2fb92c14610762578063e268e4d31461078d578063e985e9c5146107b6578063f2fde38b146107f357610204565b806395d89b411461067f578063a22cb465146106aa578063b88d4fde146106d3578063c87b56dd146106fc57610204565b8063808bdf71116100e7578063808bdf71146105df5780638456cb591461060a578063853828b6146106215780638da5cb5b1461062b57806391b7f5ed1461065657610204565b8063664a1ad6146105355780636aaa571d1461056057806370a082311461058b578063715018a6146105c857610204565b806327ea6f2b1161019b5780634f6ccce71161016a5780634f6ccce71461044d57806355ce3b9a1461048a57806355f804b3146104b35780636352211e146104dc578063655433201461051957610204565b806327ea6f2b146103815780632f745c59146103aa57806342842e0e146103e7578063438b63001461041057610204565b806316c61ccc116101d757806316c61ccc146102d757806318160ddd14610302578063235b6ea11461032d57806323b872dd1461035857610204565b806301ffc9a71461020957806306fdde0314610246578063081812fc14610271578063095ea7b3146102ae575b600080fd5b34801561021557600080fd5b50610230600480360381019061022b9190613205565b61081c565b60405161023d9190613d48565b60405180910390f35b34801561025257600080fd5b5061025b610896565b6040516102689190613d63565b60405180910390f35b34801561027d57600080fd5b5061029860048036038101906102939190613298565b610928565b6040516102a59190613cbf565b60405180910390f35b3480156102ba57600080fd5b506102d560048036038101906102d091906131c9565b6109ad565b005b3480156102e357600080fd5b506102ec610ac5565b6040516102f99190613d48565b60405180910390f35b34801561030e57600080fd5b50610317610ad8565b6040516103249190614085565b60405180910390f35b34801561033957600080fd5b50610342610ae5565b60405161034f9190614085565b60405180910390f35b34801561036457600080fd5b5061037f600480360381019061037a91906130c3565b610aeb565b005b34801561038d57600080fd5b506103a860048036038101906103a39190613298565b610b4b565b005b3480156103b657600080fd5b506103d160048036038101906103cc91906131c9565b610bd1565b6040516103de9190614085565b60405180910390f35b3480156103f357600080fd5b5061040e600480360381019061040991906130c3565b610c76565b005b34801561041c57600080fd5b506104376004803603810190610432919061305e565b610c96565b6040516104449190613d26565b60405180910390f35b34801561045957600080fd5b50610474600480360381019061046f9190613298565b610d90565b6040516104819190614085565b60405180910390f35b34801561049657600080fd5b506104b160048036038101906104ac919061305e565b610e27565b005b3480156104bf57600080fd5b506104da60048036038101906104d59190613257565b610f57565b005b3480156104e857600080fd5b5061050360048036038101906104fe9190613298565b610fed565b6040516105109190613cbf565b60405180910390f35b610533600480360381019061052e9190613298565b61109f565b005b34801561054157600080fd5b5061054a611225565b6040516105579190613cbf565b60405180910390f35b34801561056c57600080fd5b5061057561124b565b6040516105829190614085565b60405180910390f35b34801561059757600080fd5b506105b260048036038101906105ad919061305e565b611251565b6040516105bf9190614085565b60405180910390f35b3480156105d457600080fd5b506105dd611309565b005b3480156105eb57600080fd5b506105f4611391565b6040516106019190614085565b60405180910390f35b34801561061657600080fd5b5061061f611397565b005b61062961143f565b005b34801561063757600080fd5b5061064061151d565b60405161064d9190613cbf565b60405180910390f35b34801561066257600080fd5b5061067d60048036038101906106789190613298565b611547565b005b34801561068b57600080fd5b506106946115cd565b6040516106a19190613d63565b60405180910390f35b3480156106b657600080fd5b506106d160048036038101906106cc919061318d565b61165f565b005b3480156106df57600080fd5b506106fa60048036038101906106f59190613112565b6117e0565b005b34801561070857600080fd5b50610723600480360381019061071e9190613298565b611842565b6040516107309190613d63565b60405180910390f35b34801561074557600080fd5b50610760600480360381019061075b91906131c9565b6118e9565b005b34801561076e57600080fd5b50610777611a78565b6040516107849190614085565b60405180910390f35b34801561079957600080fd5b506107b460048036038101906107af9190613298565b611a7e565b005b3480156107c257600080fd5b506107dd60048036038101906107d89190613087565b611b04565b6040516107ea9190613d48565b60405180910390f35b3480156107ff57600080fd5b5061081a6004803603810190610815919061305e565b611b98565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061088f575061088e82611c90565b5b9050919050565b6060600080546108a590614378565b80601f01602080910402602001604051908101604052809291908181526020018280546108d190614378565b801561091e5780601f106108f35761010080835404028352916020019161091e565b820191906000526020600020905b81548152906001019060200180831161090157829003601f168201915b5050505050905090565b600061093382611d72565b610972576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096990613f65565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109b882610fed565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2090613fe5565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a48611dde565b73ffffffffffffffffffffffffffffffffffffffff161480610a775750610a7681610a71611dde565b611b04565b5b610ab6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aad90613ec5565b60405180910390fd5b610ac08383611de6565b505050565b601060149054906101000a900460ff1681565b6000600880549050905090565b600f5481565b610afc610af6611dde565b82611e9f565b610b3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3290614045565b60405180910390fd5b610b46838383611f7d565b505050565b610b53611dde565b73ffffffffffffffffffffffffffffffffffffffff16610b7161151d565b73ffffffffffffffffffffffffffffffffffffffff1614610bc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bbe90613f85565b60405180910390fd5b80600d8190555050565b6000610bdc83611251565b8210610c1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1490613dc5565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610c91838383604051806020016040528060008152506117e0565b505050565b60606000610ca383611251565b905060008167ffffffffffffffff811115610ce7577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015610d155781602001602082028036833780820191505090505b50905060005b82811015610d8557610d2d8582610bd1565b828281518110610d66577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080610d7d906143aa565b915050610d1b565b508092505050919050565b6000610d9a610ad8565b8210610ddb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd290614065565b60405180910390fd5b60088281548110610e15577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610e2f611dde565b73ffffffffffffffffffffffffffffffffffffffff16610e4d61151d565b73ffffffffffffffffffffffffffffffffffffffff1614610ea3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9a90613f85565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0a90613e45565b60405180910390fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610f5f611dde565b73ffffffffffffffffffffffffffffffffffffffff16610f7d61151d565b73ffffffffffffffffffffffffffffffffffffffff1614610fd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fca90613f85565b60405180910390fd5b80600b9080519060200190610fe9929190612e82565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611096576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108d90613f05565b60405180910390fd5b80915050919050565b60006110a9610ad8565b9050601060149054906101000a900460ff16156110fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f290613d85565b60405180910390fd5b600c54821115611140576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113790613f25565b60405180910390fd5b600e54600d54611150919061428e565b828261115c91906141ad565b111561119d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119490614025565b60405180910390fd5b81600f546111ab9190614234565b3410156111ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e490614005565b60405180910390fd5b60005b828110156112205761120d33828461120891906141ad565b6121d9565b8080611218906143aa565b9150506111f0565b505050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b990613ee5565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611311611dde565b73ffffffffffffffffffffffffffffffffffffffff1661132f61151d565b73ffffffffffffffffffffffffffffffffffffffff1614611385576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137c90613f85565b60405180910390fd5b61138f60006121f7565b565b600c5481565b61139f611dde565b73ffffffffffffffffffffffffffffffffffffffff166113bd61151d565b73ffffffffffffffffffffffffffffffffffffffff1614611413576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140a90613f85565b60405180910390fd5b601060149054906101000a900460ff1615601060146101000a81548160ff021916908315150217905550565b611447611dde565b73ffffffffffffffffffffffffffffffffffffffff1661146561151d565b73ffffffffffffffffffffffffffffffffffffffff16146114bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b290613f85565b60405180910390fd5b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505061151b57600080fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61154f611dde565b73ffffffffffffffffffffffffffffffffffffffff1661156d61151d565b73ffffffffffffffffffffffffffffffffffffffff16146115c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ba90613f85565b60405180910390fd5b80600f8190555050565b6060600180546115dc90614378565b80601f016020809104026020016040519081016040528092919081815260200182805461160890614378565b80156116555780601f1061162a57610100808354040283529160200191611655565b820191906000526020600020905b81548152906001019060200180831161163857829003601f168201915b5050505050905090565b611667611dde565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116cc90613e85565b60405180910390fd5b80600560006116e2611dde565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661178f611dde565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117d49190613d48565b60405180910390a35050565b6117f16117eb611dde565b83611e9f565b611830576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182790614045565b60405180910390fd5b61183c848484846122bd565b50505050565b606061184d82611d72565b61188c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188390613fc5565b60405180910390fd5b6000611896612319565b905060008151116118b657604051806020016040528060008152506118e1565b806118c0846123ab565b6040516020016118d1929190613c90565b6040516020818303038152906040525b915050919050565b6118f1611dde565b73ffffffffffffffffffffffffffffffffffffffff1661190f61151d565b73ffffffffffffffffffffffffffffffffffffffff1614611965576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195c90613f85565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119cc90613e45565b60405180910390fd5b600e54811115611a1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1190613da5565b60405180910390fd5b6000611a24610ad8565b905060005b82811015611a5957611a46848284611a4191906141ad565b6121d9565b8080611a51906143aa565b915050611a29565b5081600e6000828254611a6c919061428e565b92505081905550505050565b600d5481565b611a86611dde565b73ffffffffffffffffffffffffffffffffffffffff16611aa461151d565b73ffffffffffffffffffffffffffffffffffffffff1614611afa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af190613f85565b60405180910390fd5b80600c8190555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611ba0611dde565b73ffffffffffffffffffffffffffffffffffffffff16611bbe61151d565b73ffffffffffffffffffffffffffffffffffffffff1614611c14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0b90613f85565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7b90613e05565b60405180910390fd5b611c8d816121f7565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611d5b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611d6b5750611d6a82612558565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611e5983610fed565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611eaa82611d72565b611ee9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee090613ea5565b60405180910390fd5b6000611ef483610fed565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611f6357508373ffffffffffffffffffffffffffffffffffffffff16611f4b84610928565b73ffffffffffffffffffffffffffffffffffffffff16145b80611f745750611f738185611b04565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611f9d82610fed565b73ffffffffffffffffffffffffffffffffffffffff1614611ff3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fea90613fa5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612063576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205a90613e65565b60405180910390fd5b61206e8383836125c2565b612079600082611de6565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120c9919061428e565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461212091906141ad565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6121f38282604051806020016040528060008152506126d6565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6122c8848484611f7d565b6122d48484848461278d565b612313576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230a90613de5565b60405180910390fd5b50505050565b6060600b805461232890614378565b80601f016020809104026020016040519081016040528092919081815260200182805461235490614378565b80156123a15780601f10612376576101008083540402835291602001916123a1565b820191906000526020600020905b81548152906001019060200180831161238457829003601f168201915b5050505050905090565b606060008214156123f3576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612553565b600082905060005b6000821461242557808061240e906143aa565b915050600a8261241e9190614203565b91506123fb565b60008167ffffffffffffffff811115612467577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156124995781602001600182028036833780820191505090505b5090505b6000851461254c576001826124b2919061428e565b9150600a856124c191906143f3565b60306124cd91906141ad565b60f81b818381518110612509577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856125459190614203565b945061249d565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6125cd838383612924565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156126105761260b81612929565b61264f565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461264e5761264d8382612972565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126925761268d81612adf565b6126d1565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146126d0576126cf8282612c22565b5b5b505050565b6126e08383612ca1565b6126ed600084848461278d565b61272c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272390613de5565b60405180910390fd5b818373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006127ae8473ffffffffffffffffffffffffffffffffffffffff16612e6f565b15612917578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026127d7611dde565b8786866040518563ffffffff1660e01b81526004016127f99493929190613cda565b602060405180830381600087803b15801561281357600080fd5b505af192505050801561284457506040513d601f19601f82011682018060405250810190612841919061322e565b60015b6128c7573d8060008114612874576040519150601f19603f3d011682016040523d82523d6000602084013e612879565b606091505b506000815114156128bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128b690613de5565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061291c565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161297f84611251565b612989919061428e565b9050600060076000848152602001908152602001600020549050818114612a6e576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612af3919061428e565b9050600060096000848152602001908152602001600020549050600060088381548110612b49577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612b91577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612c06577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612c2d83611251565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d0890613f45565b60405180910390fd5b612d1a81611d72565b15612d5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d5190613e25565b60405180910390fd5b612d66600083836125c2565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612db691906141ad565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054612e8e90614378565b90600052602060002090601f016020900481019282612eb05760008555612ef7565b82601f10612ec957805160ff1916838001178555612ef7565b82800160010185558215612ef7579182015b82811115612ef6578251825591602001919060010190612edb565b5b509050612f049190612f08565b5090565b5b80821115612f21576000816000905550600101612f09565b5090565b6000612f38612f33846140d1565b6140a0565b905082815260208101848484011115612f5057600080fd5b612f5b848285614336565b509392505050565b6000612f76612f7184614101565b6140a0565b905082815260208101848484011115612f8e57600080fd5b612f99848285614336565b509392505050565b600081359050612fb0816144f1565b92915050565b600081359050612fc581614508565b92915050565b600081359050612fda8161451f565b92915050565b600081519050612fef8161451f565b92915050565b600082601f83011261300657600080fd5b8135613016848260208601612f25565b91505092915050565b600082601f83011261303057600080fd5b8135613040848260208601612f63565b91505092915050565b60008135905061305881614536565b92915050565b60006020828403121561307057600080fd5b600061307e84828501612fa1565b91505092915050565b6000806040838503121561309a57600080fd5b60006130a885828601612fa1565b92505060206130b985828601612fa1565b9150509250929050565b6000806000606084860312156130d857600080fd5b60006130e686828701612fa1565b93505060206130f786828701612fa1565b925050604061310886828701613049565b9150509250925092565b6000806000806080858703121561312857600080fd5b600061313687828801612fa1565b945050602061314787828801612fa1565b935050604061315887828801613049565b925050606085013567ffffffffffffffff81111561317557600080fd5b61318187828801612ff5565b91505092959194509250565b600080604083850312156131a057600080fd5b60006131ae85828601612fa1565b92505060206131bf85828601612fb6565b9150509250929050565b600080604083850312156131dc57600080fd5b60006131ea85828601612fa1565b92505060206131fb85828601613049565b9150509250929050565b60006020828403121561321757600080fd5b600061322584828501612fcb565b91505092915050565b60006020828403121561324057600080fd5b600061324e84828501612fe0565b91505092915050565b60006020828403121561326957600080fd5b600082013567ffffffffffffffff81111561328357600080fd5b61328f8482850161301f565b91505092915050565b6000602082840312156132aa57600080fd5b60006132b884828501613049565b91505092915050565b60006132cd8383613c72565b60208301905092915050565b6132e2816142c2565b82525050565b60006132f382614141565b6132fd818561416f565b935061330883614131565b8060005b8381101561333957815161332088826132c1565b975061332b83614162565b92505060018101905061330c565b5085935050505092915050565b61334f816142d4565b82525050565b60006133608261414c565b61336a8185614180565b935061337a818560208601614345565b613383816144e0565b840191505092915050565b600061339982614157565b6133a38185614191565b93506133b3818560208601614345565b6133bc816144e0565b840191505092915050565b60006133d282614157565b6133dc81856141a2565b93506133ec818560208601614345565b80840191505092915050565b6000613405600b83614191565b91507f53616c65207061757365640000000000000000000000000000000000000000006000830152602082019050919050565b6000613445601d83614191565b91507f4578636565647320726573657276656420475552555320737570706c790000006000830152602082019050919050565b6000613485602b83614191565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b60006134eb603283614191565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000613551602683614191565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006135b7601c83614191565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006135f7601283614191565b91507f5a65726f2061646472657373206572726f7200000000000000000000000000006000830152602082019050919050565b6000613637602483614191565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061369d601983614191565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b60006136dd602c83614191565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613743603883614191565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b60006137a9602a83614191565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b600061380f602983614191565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613875603083614191565b91507f596f752061726520657863656564696e67206c696d6974206f6620706572207460008301527f72616e73616374696f6e204755525553000000000000000000000000000000006020830152604082019050919050565b60006138db602083614191565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b600061391b602c83614191565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006139816005836141a2565b91507f2e6a736f6e0000000000000000000000000000000000000000000000000000006000830152600582019050919050565b60006139c1602083614191565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613a01602983614191565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613a67602f83614191565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000613acd602183614191565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613b33601983614191565b91507f45746865722073656e74206973206e6f7420636f7272656374000000000000006000830152602082019050919050565b6000613b73601c83614191565b91507f45786365656473206d6178696d756d20475552555320737570706c79000000006000830152602082019050919050565b6000613bb3603183614191565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613c19602c83614191565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b613c7b8161432c565b82525050565b613c8a8161432c565b82525050565b6000613c9c82856133c7565b9150613ca882846133c7565b9150613cb382613974565b91508190509392505050565b6000602082019050613cd460008301846132d9565b92915050565b6000608082019050613cef60008301876132d9565b613cfc60208301866132d9565b613d096040830185613c81565b8181036060830152613d1b8184613355565b905095945050505050565b60006020820190508181036000830152613d4081846132e8565b905092915050565b6000602082019050613d5d6000830184613346565b92915050565b60006020820190508181036000830152613d7d818461338e565b905092915050565b60006020820190508181036000830152613d9e816133f8565b9050919050565b60006020820190508181036000830152613dbe81613438565b9050919050565b60006020820190508181036000830152613dde81613478565b9050919050565b60006020820190508181036000830152613dfe816134de565b9050919050565b60006020820190508181036000830152613e1e81613544565b9050919050565b60006020820190508181036000830152613e3e816135aa565b9050919050565b60006020820190508181036000830152613e5e816135ea565b9050919050565b60006020820190508181036000830152613e7e8161362a565b9050919050565b60006020820190508181036000830152613e9e81613690565b9050919050565b60006020820190508181036000830152613ebe816136d0565b9050919050565b60006020820190508181036000830152613ede81613736565b9050919050565b60006020820190508181036000830152613efe8161379c565b9050919050565b60006020820190508181036000830152613f1e81613802565b9050919050565b60006020820190508181036000830152613f3e81613868565b9050919050565b60006020820190508181036000830152613f5e816138ce565b9050919050565b60006020820190508181036000830152613f7e8161390e565b9050919050565b60006020820190508181036000830152613f9e816139b4565b9050919050565b60006020820190508181036000830152613fbe816139f4565b9050919050565b60006020820190508181036000830152613fde81613a5a565b9050919050565b60006020820190508181036000830152613ffe81613ac0565b9050919050565b6000602082019050818103600083015261401e81613b26565b9050919050565b6000602082019050818103600083015261403e81613b66565b9050919050565b6000602082019050818103600083015261405e81613ba6565b9050919050565b6000602082019050818103600083015261407e81613c0c565b9050919050565b600060208201905061409a6000830184613c81565b92915050565b6000604051905081810181811067ffffffffffffffff821117156140c7576140c66144b1565b5b8060405250919050565b600067ffffffffffffffff8211156140ec576140eb6144b1565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561411c5761411b6144b1565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006141b88261432c565b91506141c38361432c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156141f8576141f7614424565b5b828201905092915050565b600061420e8261432c565b91506142198361432c565b92508261422957614228614453565b5b828204905092915050565b600061423f8261432c565b915061424a8361432c565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561428357614282614424565b5b828202905092915050565b60006142998261432c565b91506142a48361432c565b9250828210156142b7576142b6614424565b5b828203905092915050565b60006142cd8261430c565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614363578082015181840152602081019050614348565b83811115614372576000848401525b50505050565b6000600282049050600182168061439057607f821691505b602082108114156143a4576143a3614482565b5b50919050565b60006143b58261432c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156143e8576143e7614424565b5b600182019050919050565b60006143fe8261432c565b91506144098361432c565b92508261441957614418614453565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6144fa816142c2565b811461450557600080fd5b50565b614511816142d4565b811461451c57600080fd5b50565b614528816142e0565b811461453357600080fd5b50565b61453f8161432c565b811461454a57600080fd5b5056fea264697066735822122034097b2a4a347681f1a52ab2bdc091b6a38d8a72d1d8487d55d401e2bcffc85064736f6c63430008000033000000000000000000000000000000000000000000000000000000000000004000000000000000000000000041482597cb31994681e395655530a859248b4f9c000000000000000000000000000000000000000000000000000000000000005168747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d5a6e74347745704e4d5a644e74316951634e524d424e5a7376457239444855486e716437376a586b447552322f000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102045760003560e01c8063664a1ad61161011857806395d89b41116100a0578063ca8001441161006f578063ca80014414610739578063df2fb92c14610762578063e268e4d31461078d578063e985e9c5146107b6578063f2fde38b146107f357610204565b806395d89b411461067f578063a22cb465146106aa578063b88d4fde146106d3578063c87b56dd146106fc57610204565b8063808bdf71116100e7578063808bdf71146105df5780638456cb591461060a578063853828b6146106215780638da5cb5b1461062b57806391b7f5ed1461065657610204565b8063664a1ad6146105355780636aaa571d1461056057806370a082311461058b578063715018a6146105c857610204565b806327ea6f2b1161019b5780634f6ccce71161016a5780634f6ccce71461044d57806355ce3b9a1461048a57806355f804b3146104b35780636352211e146104dc578063655433201461051957610204565b806327ea6f2b146103815780632f745c59146103aa57806342842e0e146103e7578063438b63001461041057610204565b806316c61ccc116101d757806316c61ccc146102d757806318160ddd14610302578063235b6ea11461032d57806323b872dd1461035857610204565b806301ffc9a71461020957806306fdde0314610246578063081812fc14610271578063095ea7b3146102ae575b600080fd5b34801561021557600080fd5b50610230600480360381019061022b9190613205565b61081c565b60405161023d9190613d48565b60405180910390f35b34801561025257600080fd5b5061025b610896565b6040516102689190613d63565b60405180910390f35b34801561027d57600080fd5b5061029860048036038101906102939190613298565b610928565b6040516102a59190613cbf565b60405180910390f35b3480156102ba57600080fd5b506102d560048036038101906102d091906131c9565b6109ad565b005b3480156102e357600080fd5b506102ec610ac5565b6040516102f99190613d48565b60405180910390f35b34801561030e57600080fd5b50610317610ad8565b6040516103249190614085565b60405180910390f35b34801561033957600080fd5b50610342610ae5565b60405161034f9190614085565b60405180910390f35b34801561036457600080fd5b5061037f600480360381019061037a91906130c3565b610aeb565b005b34801561038d57600080fd5b506103a860048036038101906103a39190613298565b610b4b565b005b3480156103b657600080fd5b506103d160048036038101906103cc91906131c9565b610bd1565b6040516103de9190614085565b60405180910390f35b3480156103f357600080fd5b5061040e600480360381019061040991906130c3565b610c76565b005b34801561041c57600080fd5b506104376004803603810190610432919061305e565b610c96565b6040516104449190613d26565b60405180910390f35b34801561045957600080fd5b50610474600480360381019061046f9190613298565b610d90565b6040516104819190614085565b60405180910390f35b34801561049657600080fd5b506104b160048036038101906104ac919061305e565b610e27565b005b3480156104bf57600080fd5b506104da60048036038101906104d59190613257565b610f57565b005b3480156104e857600080fd5b5061050360048036038101906104fe9190613298565b610fed565b6040516105109190613cbf565b60405180910390f35b610533600480360381019061052e9190613298565b61109f565b005b34801561054157600080fd5b5061054a611225565b6040516105579190613cbf565b60405180910390f35b34801561056c57600080fd5b5061057561124b565b6040516105829190614085565b60405180910390f35b34801561059757600080fd5b506105b260048036038101906105ad919061305e565b611251565b6040516105bf9190614085565b60405180910390f35b3480156105d457600080fd5b506105dd611309565b005b3480156105eb57600080fd5b506105f4611391565b6040516106019190614085565b60405180910390f35b34801561061657600080fd5b5061061f611397565b005b61062961143f565b005b34801561063757600080fd5b5061064061151d565b60405161064d9190613cbf565b60405180910390f35b34801561066257600080fd5b5061067d60048036038101906106789190613298565b611547565b005b34801561068b57600080fd5b506106946115cd565b6040516106a19190613d63565b60405180910390f35b3480156106b657600080fd5b506106d160048036038101906106cc919061318d565b61165f565b005b3480156106df57600080fd5b506106fa60048036038101906106f59190613112565b6117e0565b005b34801561070857600080fd5b50610723600480360381019061071e9190613298565b611842565b6040516107309190613d63565b60405180910390f35b34801561074557600080fd5b50610760600480360381019061075b91906131c9565b6118e9565b005b34801561076e57600080fd5b50610777611a78565b6040516107849190614085565b60405180910390f35b34801561079957600080fd5b506107b460048036038101906107af9190613298565b611a7e565b005b3480156107c257600080fd5b506107dd60048036038101906107d89190613087565b611b04565b6040516107ea9190613d48565b60405180910390f35b3480156107ff57600080fd5b5061081a6004803603810190610815919061305e565b611b98565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061088f575061088e82611c90565b5b9050919050565b6060600080546108a590614378565b80601f01602080910402602001604051908101604052809291908181526020018280546108d190614378565b801561091e5780601f106108f35761010080835404028352916020019161091e565b820191906000526020600020905b81548152906001019060200180831161090157829003601f168201915b5050505050905090565b600061093382611d72565b610972576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096990613f65565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109b882610fed565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2090613fe5565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a48611dde565b73ffffffffffffffffffffffffffffffffffffffff161480610a775750610a7681610a71611dde565b611b04565b5b610ab6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aad90613ec5565b60405180910390fd5b610ac08383611de6565b505050565b601060149054906101000a900460ff1681565b6000600880549050905090565b600f5481565b610afc610af6611dde565b82611e9f565b610b3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3290614045565b60405180910390fd5b610b46838383611f7d565b505050565b610b53611dde565b73ffffffffffffffffffffffffffffffffffffffff16610b7161151d565b73ffffffffffffffffffffffffffffffffffffffff1614610bc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bbe90613f85565b60405180910390fd5b80600d8190555050565b6000610bdc83611251565b8210610c1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1490613dc5565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610c91838383604051806020016040528060008152506117e0565b505050565b60606000610ca383611251565b905060008167ffffffffffffffff811115610ce7577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015610d155781602001602082028036833780820191505090505b50905060005b82811015610d8557610d2d8582610bd1565b828281518110610d66577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080610d7d906143aa565b915050610d1b565b508092505050919050565b6000610d9a610ad8565b8210610ddb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd290614065565b60405180910390fd5b60088281548110610e15577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610e2f611dde565b73ffffffffffffffffffffffffffffffffffffffff16610e4d61151d565b73ffffffffffffffffffffffffffffffffffffffff1614610ea3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9a90613f85565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0a90613e45565b60405180910390fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610f5f611dde565b73ffffffffffffffffffffffffffffffffffffffff16610f7d61151d565b73ffffffffffffffffffffffffffffffffffffffff1614610fd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fca90613f85565b60405180910390fd5b80600b9080519060200190610fe9929190612e82565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611096576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108d90613f05565b60405180910390fd5b80915050919050565b60006110a9610ad8565b9050601060149054906101000a900460ff16156110fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f290613d85565b60405180910390fd5b600c54821115611140576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113790613f25565b60405180910390fd5b600e54600d54611150919061428e565b828261115c91906141ad565b111561119d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119490614025565b60405180910390fd5b81600f546111ab9190614234565b3410156111ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e490614005565b60405180910390fd5b60005b828110156112205761120d33828461120891906141ad565b6121d9565b8080611218906143aa565b9150506111f0565b505050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b990613ee5565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611311611dde565b73ffffffffffffffffffffffffffffffffffffffff1661132f61151d565b73ffffffffffffffffffffffffffffffffffffffff1614611385576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137c90613f85565b60405180910390fd5b61138f60006121f7565b565b600c5481565b61139f611dde565b73ffffffffffffffffffffffffffffffffffffffff166113bd61151d565b73ffffffffffffffffffffffffffffffffffffffff1614611413576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140a90613f85565b60405180910390fd5b601060149054906101000a900460ff1615601060146101000a81548160ff021916908315150217905550565b611447611dde565b73ffffffffffffffffffffffffffffffffffffffff1661146561151d565b73ffffffffffffffffffffffffffffffffffffffff16146114bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b290613f85565b60405180910390fd5b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505061151b57600080fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61154f611dde565b73ffffffffffffffffffffffffffffffffffffffff1661156d61151d565b73ffffffffffffffffffffffffffffffffffffffff16146115c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ba90613f85565b60405180910390fd5b80600f8190555050565b6060600180546115dc90614378565b80601f016020809104026020016040519081016040528092919081815260200182805461160890614378565b80156116555780601f1061162a57610100808354040283529160200191611655565b820191906000526020600020905b81548152906001019060200180831161163857829003601f168201915b5050505050905090565b611667611dde565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116cc90613e85565b60405180910390fd5b80600560006116e2611dde565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661178f611dde565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117d49190613d48565b60405180910390a35050565b6117f16117eb611dde565b83611e9f565b611830576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182790614045565b60405180910390fd5b61183c848484846122bd565b50505050565b606061184d82611d72565b61188c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188390613fc5565b60405180910390fd5b6000611896612319565b905060008151116118b657604051806020016040528060008152506118e1565b806118c0846123ab565b6040516020016118d1929190613c90565b6040516020818303038152906040525b915050919050565b6118f1611dde565b73ffffffffffffffffffffffffffffffffffffffff1661190f61151d565b73ffffffffffffffffffffffffffffffffffffffff1614611965576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195c90613f85565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119cc90613e45565b60405180910390fd5b600e54811115611a1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1190613da5565b60405180910390fd5b6000611a24610ad8565b905060005b82811015611a5957611a46848284611a4191906141ad565b6121d9565b8080611a51906143aa565b915050611a29565b5081600e6000828254611a6c919061428e565b92505081905550505050565b600d5481565b611a86611dde565b73ffffffffffffffffffffffffffffffffffffffff16611aa461151d565b73ffffffffffffffffffffffffffffffffffffffff1614611afa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af190613f85565b60405180910390fd5b80600c8190555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611ba0611dde565b73ffffffffffffffffffffffffffffffffffffffff16611bbe61151d565b73ffffffffffffffffffffffffffffffffffffffff1614611c14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0b90613f85565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7b90613e05565b60405180910390fd5b611c8d816121f7565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611d5b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611d6b5750611d6a82612558565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611e5983610fed565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611eaa82611d72565b611ee9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee090613ea5565b60405180910390fd5b6000611ef483610fed565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611f6357508373ffffffffffffffffffffffffffffffffffffffff16611f4b84610928565b73ffffffffffffffffffffffffffffffffffffffff16145b80611f745750611f738185611b04565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611f9d82610fed565b73ffffffffffffffffffffffffffffffffffffffff1614611ff3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fea90613fa5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612063576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205a90613e65565b60405180910390fd5b61206e8383836125c2565b612079600082611de6565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120c9919061428e565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461212091906141ad565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6121f38282604051806020016040528060008152506126d6565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6122c8848484611f7d565b6122d48484848461278d565b612313576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230a90613de5565b60405180910390fd5b50505050565b6060600b805461232890614378565b80601f016020809104026020016040519081016040528092919081815260200182805461235490614378565b80156123a15780601f10612376576101008083540402835291602001916123a1565b820191906000526020600020905b81548152906001019060200180831161238457829003601f168201915b5050505050905090565b606060008214156123f3576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612553565b600082905060005b6000821461242557808061240e906143aa565b915050600a8261241e9190614203565b91506123fb565b60008167ffffffffffffffff811115612467577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156124995781602001600182028036833780820191505090505b5090505b6000851461254c576001826124b2919061428e565b9150600a856124c191906143f3565b60306124cd91906141ad565b60f81b818381518110612509577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856125459190614203565b945061249d565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6125cd838383612924565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156126105761260b81612929565b61264f565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461264e5761264d8382612972565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126925761268d81612adf565b6126d1565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146126d0576126cf8282612c22565b5b5b505050565b6126e08383612ca1565b6126ed600084848461278d565b61272c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272390613de5565b60405180910390fd5b818373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006127ae8473ffffffffffffffffffffffffffffffffffffffff16612e6f565b15612917578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026127d7611dde565b8786866040518563ffffffff1660e01b81526004016127f99493929190613cda565b602060405180830381600087803b15801561281357600080fd5b505af192505050801561284457506040513d601f19601f82011682018060405250810190612841919061322e565b60015b6128c7573d8060008114612874576040519150601f19603f3d011682016040523d82523d6000602084013e612879565b606091505b506000815114156128bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128b690613de5565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061291c565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161297f84611251565b612989919061428e565b9050600060076000848152602001908152602001600020549050818114612a6e576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612af3919061428e565b9050600060096000848152602001908152602001600020549050600060088381548110612b49577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612b91577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612c06577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612c2d83611251565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d0890613f45565b60405180910390fd5b612d1a81611d72565b15612d5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d5190613e25565b60405180910390fd5b612d66600083836125c2565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612db691906141ad565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054612e8e90614378565b90600052602060002090601f016020900481019282612eb05760008555612ef7565b82601f10612ec957805160ff1916838001178555612ef7565b82800160010185558215612ef7579182015b82811115612ef6578251825591602001919060010190612edb565b5b509050612f049190612f08565b5090565b5b80821115612f21576000816000905550600101612f09565b5090565b6000612f38612f33846140d1565b6140a0565b905082815260208101848484011115612f5057600080fd5b612f5b848285614336565b509392505050565b6000612f76612f7184614101565b6140a0565b905082815260208101848484011115612f8e57600080fd5b612f99848285614336565b509392505050565b600081359050612fb0816144f1565b92915050565b600081359050612fc581614508565b92915050565b600081359050612fda8161451f565b92915050565b600081519050612fef8161451f565b92915050565b600082601f83011261300657600080fd5b8135613016848260208601612f25565b91505092915050565b600082601f83011261303057600080fd5b8135613040848260208601612f63565b91505092915050565b60008135905061305881614536565b92915050565b60006020828403121561307057600080fd5b600061307e84828501612fa1565b91505092915050565b6000806040838503121561309a57600080fd5b60006130a885828601612fa1565b92505060206130b985828601612fa1565b9150509250929050565b6000806000606084860312156130d857600080fd5b60006130e686828701612fa1565b93505060206130f786828701612fa1565b925050604061310886828701613049565b9150509250925092565b6000806000806080858703121561312857600080fd5b600061313687828801612fa1565b945050602061314787828801612fa1565b935050604061315887828801613049565b925050606085013567ffffffffffffffff81111561317557600080fd5b61318187828801612ff5565b91505092959194509250565b600080604083850312156131a057600080fd5b60006131ae85828601612fa1565b92505060206131bf85828601612fb6565b9150509250929050565b600080604083850312156131dc57600080fd5b60006131ea85828601612fa1565b92505060206131fb85828601613049565b9150509250929050565b60006020828403121561321757600080fd5b600061322584828501612fcb565b91505092915050565b60006020828403121561324057600080fd5b600061324e84828501612fe0565b91505092915050565b60006020828403121561326957600080fd5b600082013567ffffffffffffffff81111561328357600080fd5b61328f8482850161301f565b91505092915050565b6000602082840312156132aa57600080fd5b60006132b884828501613049565b91505092915050565b60006132cd8383613c72565b60208301905092915050565b6132e2816142c2565b82525050565b60006132f382614141565b6132fd818561416f565b935061330883614131565b8060005b8381101561333957815161332088826132c1565b975061332b83614162565b92505060018101905061330c565b5085935050505092915050565b61334f816142d4565b82525050565b60006133608261414c565b61336a8185614180565b935061337a818560208601614345565b613383816144e0565b840191505092915050565b600061339982614157565b6133a38185614191565b93506133b3818560208601614345565b6133bc816144e0565b840191505092915050565b60006133d282614157565b6133dc81856141a2565b93506133ec818560208601614345565b80840191505092915050565b6000613405600b83614191565b91507f53616c65207061757365640000000000000000000000000000000000000000006000830152602082019050919050565b6000613445601d83614191565b91507f4578636565647320726573657276656420475552555320737570706c790000006000830152602082019050919050565b6000613485602b83614191565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b60006134eb603283614191565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000613551602683614191565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006135b7601c83614191565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006135f7601283614191565b91507f5a65726f2061646472657373206572726f7200000000000000000000000000006000830152602082019050919050565b6000613637602483614191565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061369d601983614191565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b60006136dd602c83614191565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613743603883614191565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b60006137a9602a83614191565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b600061380f602983614191565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613875603083614191565b91507f596f752061726520657863656564696e67206c696d6974206f6620706572207460008301527f72616e73616374696f6e204755525553000000000000000000000000000000006020830152604082019050919050565b60006138db602083614191565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b600061391b602c83614191565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006139816005836141a2565b91507f2e6a736f6e0000000000000000000000000000000000000000000000000000006000830152600582019050919050565b60006139c1602083614191565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613a01602983614191565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613a67602f83614191565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000613acd602183614191565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613b33601983614191565b91507f45746865722073656e74206973206e6f7420636f7272656374000000000000006000830152602082019050919050565b6000613b73601c83614191565b91507f45786365656473206d6178696d756d20475552555320737570706c79000000006000830152602082019050919050565b6000613bb3603183614191565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613c19602c83614191565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b613c7b8161432c565b82525050565b613c8a8161432c565b82525050565b6000613c9c82856133c7565b9150613ca882846133c7565b9150613cb382613974565b91508190509392505050565b6000602082019050613cd460008301846132d9565b92915050565b6000608082019050613cef60008301876132d9565b613cfc60208301866132d9565b613d096040830185613c81565b8181036060830152613d1b8184613355565b905095945050505050565b60006020820190508181036000830152613d4081846132e8565b905092915050565b6000602082019050613d5d6000830184613346565b92915050565b60006020820190508181036000830152613d7d818461338e565b905092915050565b60006020820190508181036000830152613d9e816133f8565b9050919050565b60006020820190508181036000830152613dbe81613438565b9050919050565b60006020820190508181036000830152613dde81613478565b9050919050565b60006020820190508181036000830152613dfe816134de565b9050919050565b60006020820190508181036000830152613e1e81613544565b9050919050565b60006020820190508181036000830152613e3e816135aa565b9050919050565b60006020820190508181036000830152613e5e816135ea565b9050919050565b60006020820190508181036000830152613e7e8161362a565b9050919050565b60006020820190508181036000830152613e9e81613690565b9050919050565b60006020820190508181036000830152613ebe816136d0565b9050919050565b60006020820190508181036000830152613ede81613736565b9050919050565b60006020820190508181036000830152613efe8161379c565b9050919050565b60006020820190508181036000830152613f1e81613802565b9050919050565b60006020820190508181036000830152613f3e81613868565b9050919050565b60006020820190508181036000830152613f5e816138ce565b9050919050565b60006020820190508181036000830152613f7e8161390e565b9050919050565b60006020820190508181036000830152613f9e816139b4565b9050919050565b60006020820190508181036000830152613fbe816139f4565b9050919050565b60006020820190508181036000830152613fde81613a5a565b9050919050565b60006020820190508181036000830152613ffe81613ac0565b9050919050565b6000602082019050818103600083015261401e81613b26565b9050919050565b6000602082019050818103600083015261403e81613b66565b9050919050565b6000602082019050818103600083015261405e81613ba6565b9050919050565b6000602082019050818103600083015261407e81613c0c565b9050919050565b600060208201905061409a6000830184613c81565b92915050565b6000604051905081810181811067ffffffffffffffff821117156140c7576140c66144b1565b5b8060405250919050565b600067ffffffffffffffff8211156140ec576140eb6144b1565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561411c5761411b6144b1565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006141b88261432c565b91506141c38361432c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156141f8576141f7614424565b5b828201905092915050565b600061420e8261432c565b91506142198361432c565b92508261422957614228614453565b5b828204905092915050565b600061423f8261432c565b915061424a8361432c565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561428357614282614424565b5b828202905092915050565b60006142998261432c565b91506142a48361432c565b9250828210156142b7576142b6614424565b5b828203905092915050565b60006142cd8261430c565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614363578082015181840152602081019050614348565b83811115614372576000848401525b50505050565b6000600282049050600182168061439057607f821691505b602082108114156143a4576143a3614482565b5b50919050565b60006143b58261432c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156143e8576143e7614424565b5b600182019050919050565b60006143fe8261432c565b91506144098361432c565b92508261441957614418614453565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6144fa816142c2565b811461450557600080fd5b50565b614511816142d4565b811461451c57600080fd5b50565b614528816142e0565b811461453357600080fd5b50565b61453f8161432c565b811461454a57600080fd5b5056fea264697066735822122034097b2a4a347681f1a52ab2bdc091b6a38d8a72d1d8487d55d401e2bcffc85064736f6c63430008000033

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

000000000000000000000000000000000000000000000000000000000000004000000000000000000000000041482597cb31994681e395655530a859248b4f9c000000000000000000000000000000000000000000000000000000000000005168747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d5a6e74347745704e4d5a644e74316951634e524d424e5a7376457239444855486e716437376a586b447552322f000000000000000000000000000000

-----Decoded View---------------
Arg [0] : baseURI (string): https://gateway.pinata.cloud/ipfs/QmZnt4wEpNMZdNt1iQcNRMBNZsvEr9DHUHnqd77jXkDuR2/
Arg [1] : _fundWallet (address): 0x41482597Cb31994681e395655530A859248B4F9C

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 00000000000000000000000041482597cb31994681e395655530a859248b4f9c
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000051
Arg [3] : 68747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066
Arg [4] : 732f516d5a6e74347745704e4d5a644e74316951634e524d424e5a7376457239
Arg [5] : 444855486e716437376a586b447552322f000000000000000000000000000000


Deployed Bytecode Sourcemap

34846:2874:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28694:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16825:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18393:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17916:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35144:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29334:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35071:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19283:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37213:83;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29002:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19693:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36412:342;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29524:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36910:173;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37405:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16519:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35416:593;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35112:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35034:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16249:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2215:94;;;;;;;;;;;;;:::i;:::-;;34963:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37515:71;;;;;;;;;;;;;:::i;:::-;;37594:123;;;:::i;:::-;;1992:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36809:93;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16994:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18686:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19949:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17169:343;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36017:383;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34999:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37304:93;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19052:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2317:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28694:224;28796:4;28835:35;28820:50;;;:11;:50;;;;:90;;;;28874:36;28898:11;28874:23;:36::i;:::-;28820:90;28813:97;;28694:224;;;:::o;16825:100::-;16879:13;16912:5;16905:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16825:100;:::o;18393:221::-;18469:7;18497:16;18505:7;18497;:16::i;:::-;18489:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;18582:15;:24;18598:7;18582:24;;;;;;;;;;;;;;;;;;;;;18575:31;;18393:221;;;:::o;17916:411::-;17997:13;18013:23;18028:7;18013:14;:23::i;:::-;17997:39;;18061:5;18055:11;;:2;:11;;;;18047:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;18155:5;18139:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;18164:37;18181:5;18188:12;:10;:12::i;:::-;18164:16;:37::i;:::-;18139:62;18117:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;18298:21;18307:2;18311:7;18298:8;:21::i;:::-;17916:411;;;:::o;35144:26::-;;;;;;;;;;;;;:::o;29334:113::-;29395:7;29422:10;:17;;;;29415:24;;29334:113;:::o;35071:34::-;;;;:::o;19283:339::-;19478:41;19497:12;:10;:12::i;:::-;19511:7;19478:18;:41::i;:::-;19470:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;19586:28;19596:4;19602:2;19606:7;19586:9;:28::i;:::-;19283:339;;;:::o;37213:83::-;2138:12;:10;:12::i;:::-;2127:23;;:7;:5;:7::i;:::-;:23;;;2119:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37283:5:::1;37274:6;:14;;;;37213:83:::0;:::o;29002:256::-;29099:7;29135:23;29152:5;29135:16;:23::i;:::-;29127:5;:31;29119:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;29224:12;:19;29237:5;29224:19;;;;;;;;;;;;;;;:26;29244:5;29224:26;;;;;;;;;;;;29217:33;;29002:256;;;;:::o;19693:185::-;19831:39;19848:4;19854:2;19858:7;19831:39;;;;;;;;;;;;:16;:39::i;:::-;19693:185;;;:::o;36412:342::-;36471:16;36500:18;36521:17;36531:6;36521:9;:17::i;:::-;36500:38;;36551:25;36593:10;36579:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36551:53;;36619:9;36615:106;36634:10;36630:1;:14;36615:106;;;36679:30;36699:6;36707:1;36679:19;:30::i;:::-;36665:8;36674:1;36665:11;;;;;;;;;;;;;;;;;;;;;:44;;;;;36646:3;;;;;:::i;:::-;;;;36615:106;;;;36738:8;36731:15;;;;36412:342;;;:::o;29524:233::-;29599:7;29635:30;:28;:30::i;:::-;29627:5;:38;29619:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;29732:10;29743:5;29732:17;;;;;;;;;;;;;;;;;;;;;;;;29725:24;;29524:233;;;:::o;36910:173::-;2138:12;:10;:12::i;:::-;2127:23;;:7;:5;:7::i;:::-;:23;;;2119:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37015:1:::1;36992:25;;:11;:25;;;;36984:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;37064:11;37051:10;;:24;;;;;;;;;;;;;;;;;;36910:173:::0;:::o;37405:102::-;2138:12;:10;:12::i;:::-;2127:23;;:7;:5;:7::i;:::-;:23;;;2119:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37492:7:::1;37476:13;:23;;;;;;;;;;;;:::i;:::-;;37405:102:::0;:::o;16519:239::-;16591:7;16611:13;16627:7;:16;16635:7;16627:16;;;;;;;;;;;;;;;;;;;;;16611:32;;16679:1;16662:19;;:5;:19;;;;16654:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;16745:5;16738:12;;;16519:239;;;:::o;35416:593::-;35469:14;35486:13;:11;:13::i;:::-;35469:30;;35520:7;;;;;;;;;;;35519:8;35510:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;35609:9;;35602:3;:16;;35593:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;35747:9;;35738:6;;:18;;;;:::i;:::-;35731:3;35722:6;:12;;;;:::i;:::-;:34;;35713:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;35844:3;35835:6;;:12;;;;:::i;:::-;35822:9;:25;;35813:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;35916:9;35912:90;35931:3;35927:1;:7;35912:90;;;35955:35;35966:10;35987:1;35978:6;:10;;;;:::i;:::-;35955:9;:35::i;:::-;35936:3;;;;;:::i;:::-;;;;35912:90;;;;35416:593;;:::o;35112:25::-;;;;;;;;;;;;;:::o;35034:30::-;;;;:::o;16249:208::-;16321:7;16366:1;16349:19;;:5;:19;;;;16341:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;16433:9;:16;16443:5;16433:16;;;;;;;;;;;;;;;;16426:23;;16249:208;;;:::o;2215:94::-;2138:12;:10;:12::i;:::-;2127:23;;:7;:5;:7::i;:::-;:23;;;2119:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2280:21:::1;2298:1;2280:9;:21::i;:::-;2215:94::o:0;34963:29::-;;;;:::o;37515:71::-;2138:12;:10;:12::i;:::-;2127:23;;:7;:5;:7::i;:::-;:23;;;2119:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37571:7:::1;;;;;;;;;;;37570:8;37560:7;;:18;;;;;;;;;;;;;;;;;;37515:71::o:0;37594:123::-;2138:12;:10;:12::i;:::-;2127:23;;:7;:5;:7::i;:::-;:23;;;2119:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37669:10:::1;;;;;;;;;;;37661:24;;:47;37686:21;37661:47;;;;;;;;;;;;;;;;;;;;;;;37653:56;;;::::0;::::1;;37594:123::o:0;1992:87::-;2038:7;2065:6;;;;;;;;;;;2058:13;;1992:87;:::o;36809:93::-;2138:12;:10;:12::i;:::-;2127:23;;:7;:5;:7::i;:::-;:23;;;2119:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36885:9:::1;36876:6;:18;;;;36809:93:::0;:::o;16994:104::-;17050:13;17083:7;17076:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16994:104;:::o;18686:295::-;18801:12;:10;:12::i;:::-;18789:24;;:8;:24;;;;18781:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;18901:8;18856:18;:32;18875:12;:10;:12::i;:::-;18856:32;;;;;;;;;;;;;;;:42;18889:8;18856:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;18954:8;18925:48;;18940:12;:10;:12::i;:::-;18925:48;;;18964:8;18925:48;;;;;;:::i;:::-;;;;;;;;18686:295;;:::o;19949:328::-;20124:41;20143:12;:10;:12::i;:::-;20157:7;20124:18;:41::i;:::-;20116:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;20230:39;20244:4;20250:2;20254:7;20263:5;20230:13;:39::i;:::-;19949:328;;;;:::o;17169:343::-;17242:13;17276:16;17284:7;17276;:16::i;:::-;17268:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;17357:21;17381:10;:8;:10::i;:::-;17357:34;;17433:1;17415:7;17409:21;:25;:95;;;;;;;;;;;;;;;;;17461:7;17470:18;:7;:16;:18::i;:::-;17444:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;17409:95;17402:102;;;17169:343;;;:::o;36017:383::-;2138:12;:10;:12::i;:::-;2127:23;;:7;:5;:7::i;:::-;:23;;;2119:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36122:1:::1;36106:18;;:3;:18;;;;36097:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;36178:9;;36167:7;:20;;36158:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;36234:14;36251:13;:11;:13::i;:::-;36234:30;;36279:9;36275:87;36294:7;36290:1;:11;36275:87;;;36322:28;36333:3;36347:1;36338:6;:10;;;;:::i;:::-;36322:9;:28::i;:::-;36303:3;;;;;:::i;:::-;;;;36275:87;;;;36385:7;36372:9;;:20;;;;;;;:::i;:::-;;;;;;;;2198:1;36017:383:::0;;:::o;34999:28::-;;;;:::o;37304:93::-;2138:12;:10;:12::i;:::-;2127:23;;:7;:5;:7::i;:::-;:23;;;2119:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37384:5:::1;37372:9;:17;;;;37304:93:::0;:::o;19052:164::-;19149:4;19173:18;:25;19192:5;19173:25;;;;;;;;;;;;;;;:35;19199:8;19173:35;;;;;;;;;;;;;;;;;;;;;;;;;19166:42;;19052:164;;;;:::o;2317:192::-;2138:12;:10;:12::i;:::-;2127:23;;:7;:5;:7::i;:::-;:23;;;2119:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2426:1:::1;2406:22;;:8;:22;;;;2398:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2482:19;2492:8;2482:9;:19::i;:::-;2317:192:::0;:::o;15880:305::-;15982:4;16034:25;16019:40;;;:11;:40;;;;:105;;;;16091:33;16076:48;;;:11;:48;;;;16019:105;:158;;;;16141:36;16165:11;16141:23;:36::i;:::-;16019:158;15999:178;;15880:305;;;:::o;21787:127::-;21852:4;21904:1;21876:30;;:7;:16;21884:7;21876:16;;;;;;;;;;;;;;;;;;;;;:30;;;;21869:37;;21787:127;;;:::o;1543:98::-;1596:7;1623:10;1616:17;;1543:98;:::o;25838:174::-;25940:2;25913:15;:24;25929:7;25913:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;25996:7;25992:2;25958:46;;25967:23;25982:7;25967:14;:23::i;:::-;25958:46;;;;;;;;;;;;25838:174;;:::o;22081:348::-;22174:4;22199:16;22207:7;22199;:16::i;:::-;22191:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22275:13;22291:23;22306:7;22291:14;:23::i;:::-;22275:39;;22344:5;22333:16;;:7;:16;;;:51;;;;22377:7;22353:31;;:20;22365:7;22353:11;:20::i;:::-;:31;;;22333:51;:87;;;;22388:32;22405:5;22412:7;22388:16;:32::i;:::-;22333:87;22325:96;;;22081:348;;;;:::o;25142:578::-;25301:4;25274:31;;:23;25289:7;25274:14;:23::i;:::-;:31;;;25266:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;25384:1;25370:16;;:2;:16;;;;25362:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;25440:39;25461:4;25467:2;25471:7;25440:20;:39::i;:::-;25544:29;25561:1;25565:7;25544:8;:29::i;:::-;25605:1;25586:9;:15;25596:4;25586:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;25634:1;25617:9;:13;25627:2;25617:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;25665:2;25646:7;:16;25654:7;25646:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;25704:7;25700:2;25685:27;;25694:4;25685:27;;;;;;;;;;;;25142:578;;;:::o;22771:110::-;22847:26;22857:2;22861:7;22847:26;;;;;;;;;;;;:9;:26::i;:::-;22771:110;;:::o;2517:173::-;2573:16;2592:6;;;;;;;;;;;2573:25;;2618:8;2609:6;;:17;;;;;;;;;;;;;;;;;;2673:8;2642:40;;2663:8;2642:40;;;;;;;;;;;;2517:173;;:::o;21159:315::-;21316:28;21326:4;21332:2;21336:7;21316:9;:28::i;:::-;21363:48;21386:4;21392:2;21396:7;21405:5;21363:22;:48::i;:::-;21355:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;21159:315;;;;:::o;37091:114::-;37151:13;37184;37177:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37091:114;:::o;158:534::-;214:13;255:1;246:5;:10;242:53;;;273:10;;;;;;;;;;;;;;;;;;;;;242:53;305:12;320:5;305:20;;336:14;361:78;376:1;368:4;:9;361:78;;394:8;;;;;:::i;:::-;;;;425:2;417:10;;;;;:::i;:::-;;;361:78;;;449:19;481:6;471:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;449:39;;499:154;515:1;506:5;:10;499:154;;543:1;533:11;;;;;:::i;:::-;;;610:2;602:5;:10;;;;:::i;:::-;589:2;:24;;;;:::i;:::-;576:39;;559:6;566;559:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;639:2;630:11;;;;;:::i;:::-;;;499:154;;;677:6;663:21;;;;;158:534;;;;:::o;8968:157::-;9053:4;9092:25;9077:40;;;:11;:40;;;;9070:47;;8968:157;;;:::o;30370:589::-;30514:45;30541:4;30547:2;30551:7;30514:26;:45::i;:::-;30592:1;30576:18;;:4;:18;;;30572:187;;;30611:40;30643:7;30611:31;:40::i;:::-;30572:187;;;30681:2;30673:10;;:4;:10;;;30669:90;;30700:47;30733:4;30739:7;30700:32;:47::i;:::-;30669:90;30572:187;30787:1;30773:16;;:2;:16;;;30769:183;;;30806:45;30843:7;30806:36;:45::i;:::-;30769:183;;;30879:4;30873:10;;:2;:10;;;30869:83;;30900:40;30928:2;30932:7;30900:27;:40::i;:::-;30869:83;30769:183;30370:589;;;:::o;23108:390::-;23238:18;23244:2;23248:7;23238:5;:18::i;:::-;23289:54;23320:1;23324:2;23328:7;23337:5;23289:22;:54::i;:::-;23267:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;23472:7;23468:2;23447:33;;23464:1;23447:33;;;;;;;;;;;;23108:390;;;:::o;26577:799::-;26732:4;26753:15;:2;:13;;;:15::i;:::-;26749:620;;;26805:2;26789:36;;;26826:12;:10;:12::i;:::-;26840:4;26846:7;26855:5;26789:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;26785:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27048:1;27031:6;:13;:18;27027:272;;;27074:60;;;;;;;;;;:::i;:::-;;;;;;;;27027:272;27249:6;27243:13;27234:6;27230:2;27226:15;27219:38;26785:529;26922:41;;;26912:51;;;:6;:51;;;;26905:58;;;;;26749:620;27353:4;27346:11;;26577:799;;;;;;;:::o;27948:126::-;;;;:::o;31682:164::-;31786:10;:17;;;;31759:15;:24;31775:7;31759:24;;;;;;;;;;;:44;;;;31814:10;31830:7;31814:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31682:164;:::o;32473:988::-;32739:22;32789:1;32764:22;32781:4;32764:16;:22::i;:::-;:26;;;;:::i;:::-;32739:51;;32801:18;32822:17;:26;32840:7;32822:26;;;;;;;;;;;;32801:47;;32969:14;32955:10;:28;32951:328;;33000:19;33022:12;:18;33035:4;33022:18;;;;;;;;;;;;;;;:34;33041:14;33022:34;;;;;;;;;;;;33000:56;;33106:11;33073:12;:18;33086:4;33073:18;;;;;;;;;;;;;;;:30;33092:10;33073:30;;;;;;;;;;;:44;;;;33223:10;33190:17;:30;33208:11;33190:30;;;;;;;;;;;:43;;;;32951:328;;33375:17;:26;33393:7;33375:26;;;;;;;;;;;33368:33;;;33419:12;:18;33432:4;33419:18;;;;;;;;;;;;;;;:34;33438:14;33419:34;;;;;;;;;;;33412:41;;;32473:988;;;;:::o;33756:1079::-;34009:22;34054:1;34034:10;:17;;;;:21;;;;:::i;:::-;34009:46;;34066:18;34087:15;:24;34103:7;34087:24;;;;;;;;;;;;34066:45;;34438:19;34460:10;34471:14;34460:26;;;;;;;;;;;;;;;;;;;;;;;;34438:48;;34524:11;34499:10;34510;34499:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;34635:10;34604:15;:28;34620:11;34604:28;;;;;;;;;;;:41;;;;34776:15;:24;34792:7;34776:24;;;;;;;;;;;34769:31;;;34811:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33756:1079;;;;:::o;31260:221::-;31345:14;31362:20;31379:2;31362:16;:20::i;:::-;31345:37;;31420:7;31393:12;:16;31406:2;31393:16;;;;;;;;;;;;;;;:24;31410:6;31393:24;;;;;;;;;;;:34;;;;31467:6;31438:17;:26;31456:7;31438:26;;;;;;;;;;;:35;;;;31260:221;;;:::o;23834:382::-;23928:1;23914:16;;:2;:16;;;;23906:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;23987:16;23995:7;23987;:16::i;:::-;23986:17;23978:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;24049:45;24078:1;24082:2;24086:7;24049:20;:45::i;:::-;24124:1;24107:9;:13;24117:2;24107:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;24155:2;24136:7;:16;24144:7;24136:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;24200:7;24196:2;24175:33;;24192:1;24175:33;;;;;;;;;;;;23834:382;;:::o;2724:196::-;2784:4;2801:12;2868:7;2856:20;2848:28;;2911:1;2904:4;:8;2897:15;;;2724:196;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:344::-;;458:65;473:49;515:6;473:49;:::i;:::-;458:65;:::i;:::-;449:74;;546:6;539:5;532:21;584:4;577:5;573:16;622:3;613:6;608:3;604:16;601:25;598:2;;;639:1;636;629:12;598:2;652:41;686:6;681:3;676;652:41;:::i;:::-;439:260;;;;;;:::o;705:139::-;;789:6;776:20;767:29;;805:33;832:5;805:33;:::i;:::-;757:87;;;;:::o;850:133::-;;931:6;918:20;909:29;;947:30;971:5;947:30;:::i;:::-;899:84;;;;:::o;989:137::-;;1072:6;1059:20;1050:29;;1088:32;1114:5;1088:32;:::i;:::-;1040:86;;;;:::o;1132:141::-;;1219:6;1213:13;1204:22;;1235:32;1261:5;1235:32;:::i;:::-;1194:79;;;;:::o;1292:271::-;;1396:3;1389:4;1381:6;1377:17;1373:27;1363:2;;1414:1;1411;1404:12;1363:2;1454:6;1441:20;1479:78;1553:3;1545:6;1538:4;1530:6;1526:17;1479:78;:::i;:::-;1470:87;;1353:210;;;;;:::o;1583:273::-;;1688:3;1681:4;1673:6;1669:17;1665:27;1655:2;;1706:1;1703;1696:12;1655:2;1746:6;1733:20;1771:79;1846:3;1838:6;1831:4;1823:6;1819:17;1771:79;:::i;:::-;1762:88;;1645:211;;;;;:::o;1862:139::-;;1946:6;1933:20;1924:29;;1962:33;1989:5;1962:33;:::i;:::-;1914:87;;;;:::o;2007:262::-;;2115:2;2103:9;2094:7;2090:23;2086:32;2083:2;;;2131:1;2128;2121:12;2083:2;2174:1;2199:53;2244:7;2235:6;2224:9;2220:22;2199:53;:::i;:::-;2189:63;;2145:117;2073:196;;;;:::o;2275:407::-;;;2400:2;2388:9;2379:7;2375:23;2371:32;2368:2;;;2416:1;2413;2406:12;2368:2;2459:1;2484:53;2529:7;2520:6;2509:9;2505:22;2484:53;:::i;:::-;2474:63;;2430:117;2586:2;2612:53;2657:7;2648:6;2637:9;2633:22;2612:53;:::i;:::-;2602:63;;2557:118;2358:324;;;;;:::o;2688:552::-;;;;2830:2;2818:9;2809:7;2805:23;2801:32;2798:2;;;2846:1;2843;2836:12;2798:2;2889:1;2914:53;2959:7;2950:6;2939:9;2935:22;2914:53;:::i;:::-;2904:63;;2860:117;3016:2;3042:53;3087:7;3078:6;3067:9;3063:22;3042:53;:::i;:::-;3032:63;;2987:118;3144:2;3170:53;3215:7;3206:6;3195:9;3191:22;3170:53;:::i;:::-;3160:63;;3115:118;2788:452;;;;;:::o;3246:809::-;;;;;3414:3;3402:9;3393:7;3389:23;3385:33;3382:2;;;3431:1;3428;3421:12;3382:2;3474:1;3499:53;3544:7;3535:6;3524:9;3520:22;3499:53;:::i;:::-;3489:63;;3445:117;3601:2;3627:53;3672:7;3663:6;3652:9;3648:22;3627:53;:::i;:::-;3617:63;;3572:118;3729:2;3755:53;3800:7;3791:6;3780:9;3776:22;3755:53;:::i;:::-;3745:63;;3700:118;3885:2;3874:9;3870:18;3857:32;3916:18;3908:6;3905:30;3902:2;;;3948:1;3945;3938:12;3902:2;3976:62;4030:7;4021:6;4010:9;4006:22;3976:62;:::i;:::-;3966:72;;3828:220;3372:683;;;;;;;:::o;4061:401::-;;;4183:2;4171:9;4162:7;4158:23;4154:32;4151:2;;;4199:1;4196;4189:12;4151:2;4242:1;4267:53;4312:7;4303:6;4292:9;4288:22;4267:53;:::i;:::-;4257:63;;4213:117;4369:2;4395:50;4437:7;4428:6;4417:9;4413:22;4395:50;:::i;:::-;4385:60;;4340:115;4141:321;;;;;:::o;4468:407::-;;;4593:2;4581:9;4572:7;4568:23;4564:32;4561:2;;;4609:1;4606;4599:12;4561:2;4652:1;4677:53;4722:7;4713:6;4702:9;4698:22;4677:53;:::i;:::-;4667:63;;4623:117;4779:2;4805:53;4850:7;4841:6;4830:9;4826:22;4805:53;:::i;:::-;4795:63;;4750:118;4551:324;;;;;:::o;4881:260::-;;4988:2;4976:9;4967:7;4963:23;4959:32;4956:2;;;5004:1;5001;4994:12;4956:2;5047:1;5072:52;5116:7;5107:6;5096:9;5092:22;5072:52;:::i;:::-;5062:62;;5018:116;4946:195;;;;:::o;5147:282::-;;5265:2;5253:9;5244:7;5240:23;5236:32;5233:2;;;5281:1;5278;5271:12;5233:2;5324:1;5349:63;5404:7;5395:6;5384:9;5380:22;5349:63;:::i;:::-;5339:73;;5295:127;5223:206;;;;:::o;5435:375::-;;5553:2;5541:9;5532:7;5528:23;5524:32;5521:2;;;5569:1;5566;5559:12;5521:2;5640:1;5629:9;5625:17;5612:31;5670:18;5662:6;5659:30;5656:2;;;5702:1;5699;5692:12;5656:2;5730:63;5785:7;5776:6;5765:9;5761:22;5730:63;:::i;:::-;5720:73;;5583:220;5511:299;;;;:::o;5816:262::-;;5924:2;5912:9;5903:7;5899:23;5895:32;5892:2;;;5940:1;5937;5930:12;5892:2;5983:1;6008:53;6053:7;6044:6;6033:9;6029:22;6008:53;:::i;:::-;5998:63;;5954:117;5882:196;;;;:::o;6084:179::-;;6174:46;6216:3;6208:6;6174:46;:::i;:::-;6252:4;6247:3;6243:14;6229:28;;6164:99;;;;:::o;6269:118::-;6356:24;6374:5;6356:24;:::i;:::-;6351:3;6344:37;6334:53;;:::o;6423:732::-;;6571:54;6619:5;6571:54;:::i;:::-;6641:86;6720:6;6715:3;6641:86;:::i;:::-;6634:93;;6751:56;6801:5;6751:56;:::i;:::-;6830:7;6861:1;6846:284;6871:6;6868:1;6865:13;6846:284;;;6947:6;6941:13;6974:63;7033:3;7018:13;6974:63;:::i;:::-;6967:70;;7060:60;7113:6;7060:60;:::i;:::-;7050:70;;6906:224;6893:1;6890;6886:9;6881:14;;6846:284;;;6850:14;7146:3;7139:10;;6547:608;;;;;;;:::o;7161:109::-;7242:21;7257:5;7242:21;:::i;:::-;7237:3;7230:34;7220:50;;:::o;7276:360::-;;7390:38;7422:5;7390:38;:::i;:::-;7444:70;7507:6;7502:3;7444:70;:::i;:::-;7437:77;;7523:52;7568:6;7563:3;7556:4;7549:5;7545:16;7523:52;:::i;:::-;7600:29;7622:6;7600:29;:::i;:::-;7595:3;7591:39;7584:46;;7366:270;;;;;:::o;7642:364::-;;7758:39;7791:5;7758:39;:::i;:::-;7813:71;7877:6;7872:3;7813:71;:::i;:::-;7806:78;;7893:52;7938:6;7933:3;7926:4;7919:5;7915:16;7893:52;:::i;:::-;7970:29;7992:6;7970:29;:::i;:::-;7965:3;7961:39;7954:46;;7734:272;;;;;:::o;8012:377::-;;8146:39;8179:5;8146:39;:::i;:::-;8201:89;8283:6;8278:3;8201:89;:::i;:::-;8194:96;;8299:52;8344:6;8339:3;8332:4;8325:5;8321:16;8299:52;:::i;:::-;8376:6;8371:3;8367:16;8360:23;;8122:267;;;;;:::o;8395:309::-;;8558:67;8622:2;8617:3;8558:67;:::i;:::-;8551:74;;8655:13;8651:1;8646:3;8642:11;8635:34;8695:2;8690:3;8686:12;8679:19;;8541:163;;;:::o;8710:327::-;;8873:67;8937:2;8932:3;8873:67;:::i;:::-;8866:74;;8970:31;8966:1;8961:3;8957:11;8950:52;9028:2;9023:3;9019:12;9012:19;;8856:181;;;:::o;9043:375::-;;9206:67;9270:2;9265:3;9206:67;:::i;:::-;9199:74;;9303:34;9299:1;9294:3;9290:11;9283:55;9369:13;9364:2;9359:3;9355:12;9348:35;9409:2;9404:3;9400:12;9393:19;;9189:229;;;:::o;9424:382::-;;9587:67;9651:2;9646:3;9587:67;:::i;:::-;9580:74;;9684:34;9680:1;9675:3;9671:11;9664:55;9750:20;9745:2;9740:3;9736:12;9729:42;9797:2;9792:3;9788:12;9781:19;;9570:236;;;:::o;9812:370::-;;9975:67;10039:2;10034:3;9975:67;:::i;:::-;9968:74;;10072:34;10068:1;10063:3;10059:11;10052:55;10138:8;10133:2;10128:3;10124:12;10117:30;10173:2;10168:3;10164:12;10157:19;;9958:224;;;:::o;10188:326::-;;10351:67;10415:2;10410:3;10351:67;:::i;:::-;10344:74;;10448:30;10444:1;10439:3;10435:11;10428:51;10505:2;10500:3;10496:12;10489:19;;10334:180;;;:::o;10520:316::-;;10683:67;10747:2;10742:3;10683:67;:::i;:::-;10676:74;;10780:20;10776:1;10771:3;10767:11;10760:41;10827:2;10822:3;10818:12;10811:19;;10666:170;;;:::o;10842:368::-;;11005:67;11069:2;11064:3;11005:67;:::i;:::-;10998:74;;11102:34;11098:1;11093:3;11089:11;11082:55;11168:6;11163:2;11158:3;11154:12;11147:28;11201:2;11196:3;11192:12;11185:19;;10988:222;;;:::o;11216:323::-;;11379:67;11443:2;11438:3;11379:67;:::i;:::-;11372:74;;11476:27;11472:1;11467:3;11463:11;11456:48;11530:2;11525:3;11521:12;11514:19;;11362:177;;;:::o;11545:376::-;;11708:67;11772:2;11767:3;11708:67;:::i;:::-;11701:74;;11805:34;11801:1;11796:3;11792:11;11785:55;11871:14;11866:2;11861:3;11857:12;11850:36;11912:2;11907:3;11903:12;11896:19;;11691:230;;;:::o;11927:388::-;;12090:67;12154:2;12149:3;12090:67;:::i;:::-;12083:74;;12187:34;12183:1;12178:3;12174:11;12167:55;12253:26;12248:2;12243:3;12239:12;12232:48;12306:2;12301:3;12297:12;12290:19;;12073:242;;;:::o;12321:374::-;;12484:67;12548:2;12543:3;12484:67;:::i;:::-;12477:74;;12581:34;12577:1;12572:3;12568:11;12561:55;12647:12;12642:2;12637:3;12633:12;12626:34;12686:2;12681:3;12677:12;12670:19;;12467:228;;;:::o;12701:373::-;;12864:67;12928:2;12923:3;12864:67;:::i;:::-;12857:74;;12961:34;12957:1;12952:3;12948:11;12941:55;13027:11;13022:2;13017:3;13013:12;13006:33;13065:2;13060:3;13056:12;13049:19;;12847:227;;;:::o;13080:380::-;;13243:67;13307:2;13302:3;13243:67;:::i;:::-;13236:74;;13340:34;13336:1;13331:3;13327:11;13320:55;13406:18;13401:2;13396:3;13392:12;13385:40;13451:2;13446:3;13442:12;13435:19;;13226:234;;;:::o;13466:330::-;;13629:67;13693:2;13688:3;13629:67;:::i;:::-;13622:74;;13726:34;13722:1;13717:3;13713:11;13706:55;13787:2;13782:3;13778:12;13771:19;;13612:184;;;:::o;13802:376::-;;13965:67;14029:2;14024:3;13965:67;:::i;:::-;13958:74;;14062:34;14058:1;14053:3;14049:11;14042:55;14128:14;14123:2;14118:3;14114:12;14107:36;14169:2;14164:3;14160:12;14153:19;;13948:230;;;:::o;14184:337::-;;14365:84;14447:1;14442:3;14365:84;:::i;:::-;14358:91;;14479:7;14475:1;14470:3;14466:11;14459:28;14513:1;14508:3;14504:11;14497:18;;14348:173;;;:::o;14527:330::-;;14690:67;14754:2;14749:3;14690:67;:::i;:::-;14683:74;;14787:34;14783:1;14778:3;14774:11;14767:55;14848:2;14843:3;14839:12;14832:19;;14673:184;;;:::o;14863:373::-;;15026:67;15090:2;15085:3;15026:67;:::i;:::-;15019:74;;15123:34;15119:1;15114:3;15110:11;15103:55;15189:11;15184:2;15179:3;15175:12;15168:33;15227:2;15222:3;15218:12;15211:19;;15009:227;;;:::o;15242:379::-;;15405:67;15469:2;15464:3;15405:67;:::i;:::-;15398:74;;15502:34;15498:1;15493:3;15489:11;15482:55;15568:17;15563:2;15558:3;15554:12;15547:39;15612:2;15607:3;15603:12;15596:19;;15388:233;;;:::o;15627:365::-;;15790:67;15854:2;15849:3;15790:67;:::i;:::-;15783:74;;15887:34;15883:1;15878:3;15874:11;15867:55;15953:3;15948:2;15943:3;15939:12;15932:25;15983:2;15978:3;15974:12;15967:19;;15773:219;;;:::o;15998:323::-;;16161:67;16225:2;16220:3;16161:67;:::i;:::-;16154:74;;16258:27;16254:1;16249:3;16245:11;16238:48;16312:2;16307:3;16303:12;16296:19;;16144:177;;;:::o;16327:326::-;;16490:67;16554:2;16549:3;16490:67;:::i;:::-;16483:74;;16587:30;16583:1;16578:3;16574:11;16567:51;16644:2;16639:3;16635:12;16628:19;;16473:180;;;:::o;16659:381::-;;16822:67;16886:2;16881:3;16822:67;:::i;:::-;16815:74;;16919:34;16915:1;16910:3;16906:11;16899:55;16985:19;16980:2;16975:3;16971:12;16964:41;17031:2;17026:3;17022:12;17015:19;;16805:235;;;:::o;17046:376::-;;17209:67;17273:2;17268:3;17209:67;:::i;:::-;17202:74;;17306:34;17302:1;17297:3;17293:11;17286:55;17372:14;17367:2;17362:3;17358:12;17351:36;17413:2;17408:3;17404:12;17397:19;;17192:230;;;:::o;17428:108::-;17505:24;17523:5;17505:24;:::i;:::-;17500:3;17493:37;17483:53;;:::o;17542:118::-;17629:24;17647:5;17629:24;:::i;:::-;17624:3;17617:37;17607:53;;:::o;17666:701::-;;17969:95;18060:3;18051:6;17969:95;:::i;:::-;17962:102;;18081:95;18172:3;18163:6;18081:95;:::i;:::-;18074:102;;18193:148;18337:3;18193:148;:::i;:::-;18186:155;;18358:3;18351:10;;17951:416;;;;;:::o;18373:222::-;;18504:2;18493:9;18489:18;18481:26;;18517:71;18585:1;18574:9;18570:17;18561:6;18517:71;:::i;:::-;18471:124;;;;:::o;18601:640::-;;18834:3;18823:9;18819:19;18811:27;;18848:71;18916:1;18905:9;18901:17;18892:6;18848:71;:::i;:::-;18929:72;18997:2;18986:9;18982:18;18973:6;18929:72;:::i;:::-;19011;19079:2;19068:9;19064:18;19055:6;19011:72;:::i;:::-;19130:9;19124:4;19120:20;19115:2;19104:9;19100:18;19093:48;19158:76;19229:4;19220:6;19158:76;:::i;:::-;19150:84;;18801:440;;;;;;;:::o;19247:373::-;;19428:2;19417:9;19413:18;19405:26;;19477:9;19471:4;19467:20;19463:1;19452:9;19448:17;19441:47;19505:108;19608:4;19599:6;19505:108;:::i;:::-;19497:116;;19395:225;;;;:::o;19626:210::-;;19751:2;19740:9;19736:18;19728:26;;19764:65;19826:1;19815:9;19811:17;19802:6;19764:65;:::i;:::-;19718:118;;;;:::o;19842:313::-;;19993:2;19982:9;19978:18;19970:26;;20042:9;20036:4;20032:20;20028:1;20017:9;20013:17;20006:47;20070:78;20143:4;20134:6;20070:78;:::i;:::-;20062:86;;19960:195;;;;:::o;20161:419::-;;20365:2;20354:9;20350:18;20342:26;;20414:9;20408:4;20404:20;20400:1;20389:9;20385:17;20378:47;20442:131;20568:4;20442:131;:::i;:::-;20434:139;;20332:248;;;:::o;20586:419::-;;20790:2;20779:9;20775:18;20767:26;;20839:9;20833:4;20829:20;20825:1;20814:9;20810:17;20803:47;20867:131;20993:4;20867:131;:::i;:::-;20859:139;;20757:248;;;:::o;21011:419::-;;21215:2;21204:9;21200:18;21192:26;;21264:9;21258:4;21254:20;21250:1;21239:9;21235:17;21228:47;21292:131;21418:4;21292:131;:::i;:::-;21284:139;;21182:248;;;:::o;21436:419::-;;21640:2;21629:9;21625:18;21617:26;;21689:9;21683:4;21679:20;21675:1;21664:9;21660:17;21653:47;21717:131;21843:4;21717:131;:::i;:::-;21709:139;;21607:248;;;:::o;21861:419::-;;22065:2;22054:9;22050:18;22042:26;;22114:9;22108:4;22104:20;22100:1;22089:9;22085:17;22078:47;22142:131;22268:4;22142:131;:::i;:::-;22134:139;;22032:248;;;:::o;22286:419::-;;22490:2;22479:9;22475:18;22467:26;;22539:9;22533:4;22529:20;22525:1;22514:9;22510:17;22503:47;22567:131;22693:4;22567:131;:::i;:::-;22559:139;;22457:248;;;:::o;22711:419::-;;22915:2;22904:9;22900:18;22892:26;;22964:9;22958:4;22954:20;22950:1;22939:9;22935:17;22928:47;22992:131;23118:4;22992:131;:::i;:::-;22984:139;;22882:248;;;:::o;23136:419::-;;23340:2;23329:9;23325:18;23317:26;;23389:9;23383:4;23379:20;23375:1;23364:9;23360:17;23353:47;23417:131;23543:4;23417:131;:::i;:::-;23409:139;;23307:248;;;:::o;23561:419::-;;23765:2;23754:9;23750:18;23742:26;;23814:9;23808:4;23804:20;23800:1;23789:9;23785:17;23778:47;23842:131;23968:4;23842:131;:::i;:::-;23834:139;;23732:248;;;:::o;23986:419::-;;24190:2;24179:9;24175:18;24167:26;;24239:9;24233:4;24229:20;24225:1;24214:9;24210:17;24203:47;24267:131;24393:4;24267:131;:::i;:::-;24259:139;;24157:248;;;:::o;24411:419::-;;24615:2;24604:9;24600:18;24592:26;;24664:9;24658:4;24654:20;24650:1;24639:9;24635:17;24628:47;24692:131;24818:4;24692:131;:::i;:::-;24684:139;;24582:248;;;:::o;24836:419::-;;25040:2;25029:9;25025:18;25017:26;;25089:9;25083:4;25079:20;25075:1;25064:9;25060:17;25053:47;25117:131;25243:4;25117:131;:::i;:::-;25109:139;;25007:248;;;:::o;25261:419::-;;25465:2;25454:9;25450:18;25442:26;;25514:9;25508:4;25504:20;25500:1;25489:9;25485:17;25478:47;25542:131;25668:4;25542:131;:::i;:::-;25534:139;;25432:248;;;:::o;25686:419::-;;25890:2;25879:9;25875:18;25867:26;;25939:9;25933:4;25929:20;25925:1;25914:9;25910:17;25903:47;25967:131;26093:4;25967:131;:::i;:::-;25959:139;;25857:248;;;:::o;26111:419::-;;26315:2;26304:9;26300:18;26292:26;;26364:9;26358:4;26354:20;26350:1;26339:9;26335:17;26328:47;26392:131;26518:4;26392:131;:::i;:::-;26384:139;;26282:248;;;:::o;26536:419::-;;26740:2;26729:9;26725:18;26717:26;;26789:9;26783:4;26779:20;26775:1;26764:9;26760:17;26753:47;26817:131;26943:4;26817:131;:::i;:::-;26809:139;;26707:248;;;:::o;26961:419::-;;27165:2;27154:9;27150:18;27142:26;;27214:9;27208:4;27204:20;27200:1;27189:9;27185:17;27178:47;27242:131;27368:4;27242:131;:::i;:::-;27234:139;;27132:248;;;:::o;27386:419::-;;27590:2;27579:9;27575:18;27567:26;;27639:9;27633:4;27629:20;27625:1;27614:9;27610:17;27603:47;27667:131;27793:4;27667:131;:::i;:::-;27659:139;;27557:248;;;:::o;27811:419::-;;28015:2;28004:9;28000:18;27992:26;;28064:9;28058:4;28054:20;28050:1;28039:9;28035:17;28028:47;28092:131;28218:4;28092:131;:::i;:::-;28084:139;;27982:248;;;:::o;28236:419::-;;28440:2;28429:9;28425:18;28417:26;;28489:9;28483:4;28479:20;28475:1;28464:9;28460:17;28453:47;28517:131;28643:4;28517:131;:::i;:::-;28509:139;;28407:248;;;:::o;28661:419::-;;28865:2;28854:9;28850:18;28842:26;;28914:9;28908:4;28904:20;28900:1;28889:9;28885:17;28878:47;28942:131;29068:4;28942:131;:::i;:::-;28934:139;;28832:248;;;:::o;29086:419::-;;29290:2;29279:9;29275:18;29267:26;;29339:9;29333:4;29329:20;29325:1;29314:9;29310:17;29303:47;29367:131;29493:4;29367:131;:::i;:::-;29359:139;;29257:248;;;:::o;29511:419::-;;29715:2;29704:9;29700:18;29692:26;;29764:9;29758:4;29754:20;29750:1;29739:9;29735:17;29728:47;29792:131;29918:4;29792:131;:::i;:::-;29784:139;;29682:248;;;:::o;29936:419::-;;30140:2;30129:9;30125:18;30117:26;;30189:9;30183:4;30179:20;30175:1;30164:9;30160:17;30153:47;30217:131;30343:4;30217:131;:::i;:::-;30209:139;;30107:248;;;:::o;30361:222::-;;30492:2;30481:9;30477:18;30469:26;;30505:71;30573:1;30562:9;30558:17;30549:6;30505:71;:::i;:::-;30459:124;;;;:::o;30589:283::-;;30655:2;30649:9;30639:19;;30697:4;30689:6;30685:17;30804:6;30792:10;30789:22;30768:18;30756:10;30753:34;30750:62;30747:2;;;30815:18;;:::i;:::-;30747:2;30855:10;30851:2;30844:22;30629:243;;;;:::o;30878:331::-;;31029:18;31021:6;31018:30;31015:2;;;31051:18;;:::i;:::-;31015:2;31136:4;31132:9;31125:4;31117:6;31113:17;31109:33;31101:41;;31197:4;31191;31187:15;31179:23;;30944:265;;;:::o;31215:332::-;;31367:18;31359:6;31356:30;31353:2;;;31389:18;;:::i;:::-;31353:2;31474:4;31470:9;31463:4;31455:6;31451:17;31447:33;31439:41;;31535:4;31529;31525:15;31517:23;;31282:265;;;:::o;31553:132::-;;31643:3;31635:11;;31673:4;31668:3;31664:14;31656:22;;31625:60;;;:::o;31691:114::-;;31792:5;31786:12;31776:22;;31765:40;;;:::o;31811:98::-;;31896:5;31890:12;31880:22;;31869:40;;;:::o;31915:99::-;;32001:5;31995:12;31985:22;;31974:40;;;:::o;32020:113::-;;32122:4;32117:3;32113:14;32105:22;;32095:38;;;:::o;32139:184::-;;32272:6;32267:3;32260:19;32312:4;32307:3;32303:14;32288:29;;32250:73;;;;:::o;32329:168::-;;32446:6;32441:3;32434:19;32486:4;32481:3;32477:14;32462:29;;32424:73;;;;:::o;32503:169::-;;32621:6;32616:3;32609:19;32661:4;32656:3;32652:14;32637:29;;32599:73;;;;:::o;32678:148::-;;32817:3;32802:18;;32792:34;;;;:::o;32832:305::-;;32891:20;32909:1;32891:20;:::i;:::-;32886:25;;32925:20;32943:1;32925:20;:::i;:::-;32920:25;;33079:1;33011:66;33007:74;33004:1;33001:81;32998:2;;;33085:18;;:::i;:::-;32998:2;33129:1;33126;33122:9;33115:16;;32876:261;;;;:::o;33143:185::-;;33200:20;33218:1;33200:20;:::i;:::-;33195:25;;33234:20;33252:1;33234:20;:::i;:::-;33229:25;;33273:1;33263:2;;33278:18;;:::i;:::-;33263:2;33320:1;33317;33313:9;33308:14;;33185:143;;;;:::o;33334:348::-;;33397:20;33415:1;33397:20;:::i;:::-;33392:25;;33431:20;33449:1;33431:20;:::i;:::-;33426:25;;33619:1;33551:66;33547:74;33544:1;33541:81;33536:1;33529:9;33522:17;33518:105;33515:2;;;33626:18;;:::i;:::-;33515:2;33674:1;33671;33667:9;33656:20;;33382:300;;;;:::o;33688:191::-;;33748:20;33766:1;33748:20;:::i;:::-;33743:25;;33782:20;33800:1;33782:20;:::i;:::-;33777:25;;33821:1;33818;33815:8;33812:2;;;33826:18;;:::i;:::-;33812:2;33871:1;33868;33864:9;33856:17;;33733:146;;;;:::o;33885:96::-;;33951:24;33969:5;33951:24;:::i;:::-;33940:35;;33930:51;;;:::o;33987:90::-;;34064:5;34057:13;34050:21;34039:32;;34029:48;;;:::o;34083:149::-;;34159:66;34152:5;34148:78;34137:89;;34127:105;;;:::o;34238:126::-;;34315:42;34308:5;34304:54;34293:65;;34283:81;;;:::o;34370:77::-;;34436:5;34425:16;;34415:32;;;:::o;34453:154::-;34537:6;34532:3;34527;34514:30;34599:1;34590:6;34585:3;34581:16;34574:27;34504:103;;;:::o;34613:307::-;34681:1;34691:113;34705:6;34702:1;34699:13;34691:113;;;34790:1;34785:3;34781:11;34775:18;34771:1;34766:3;34762:11;34755:39;34727:2;34724:1;34720:10;34715:15;;34691:113;;;34822:6;34819:1;34816:13;34813:2;;;34902:1;34893:6;34888:3;34884:16;34877:27;34813:2;34662:258;;;;:::o;34926:320::-;;35007:1;35001:4;34997:12;34987:22;;35054:1;35048:4;35044:12;35075:18;35065:2;;35131:4;35123:6;35119:17;35109:27;;35065:2;35193;35185:6;35182:14;35162:18;35159:38;35156:2;;;35212:18;;:::i;:::-;35156:2;34977:269;;;;:::o;35252:233::-;;35314:24;35332:5;35314:24;:::i;:::-;35305:33;;35360:66;35353:5;35350:77;35347:2;;;35430:18;;:::i;:::-;35347:2;35477:1;35470:5;35466:13;35459:20;;35295:190;;;:::o;35491:176::-;;35540:20;35558:1;35540:20;:::i;:::-;35535:25;;35574:20;35592:1;35574:20;:::i;:::-;35569:25;;35613:1;35603:2;;35618:18;;:::i;:::-;35603:2;35659:1;35656;35652:9;35647:14;;35525:142;;;;:::o;35673:180::-;35721:77;35718:1;35711:88;35818:4;35815:1;35808:15;35842:4;35839:1;35832:15;35859:180;35907:77;35904:1;35897:88;36004:4;36001:1;35994:15;36028:4;36025:1;36018:15;36045:180;36093:77;36090:1;36083:88;36190:4;36187:1;36180:15;36214:4;36211:1;36204:15;36231:180;36279:77;36276:1;36269:88;36376:4;36373:1;36366:15;36400:4;36397:1;36390:15;36417:102;;36509:2;36505:7;36500:2;36493:5;36489:14;36485:28;36475:38;;36465:54;;;:::o;36525:122::-;36598:24;36616:5;36598:24;:::i;:::-;36591:5;36588:35;36578:2;;36637:1;36634;36627:12;36578:2;36568:79;:::o;36653:116::-;36723:21;36738:5;36723:21;:::i;:::-;36716:5;36713:32;36703:2;;36759:1;36756;36749:12;36703:2;36693:76;:::o;36775:120::-;36847:23;36864:5;36847:23;:::i;:::-;36840:5;36837:34;36827:2;;36885:1;36882;36875:12;36827:2;36817:78;:::o;36901:122::-;36974:24;36992:5;36974:24;:::i;:::-;36967:5;36964:35;36954:2;;37013:1;37010;37003:12;36954:2;36944:79;:::o

Swarm Source

ipfs://34097b2a4a347681f1a52ab2bdc091b6a38d8a72d1d8487d55d401e2bcffc850
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]

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