ETH Price: $3,483.96 (+3.63%)
Gas: 1 Gwei

Token

Gnomies (G)
 

Overview

Max Total Supply

2,680 G

Holders

1,093

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 G
0x14298a80f8f3a5ffc5f94931f4c5e51d21ddd73c
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
nft

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-02-20
*/

// SPDX-License-Identifier: GPL-3.0
// File: @openzeppelin/contracts/utils/Strings.sol

pragma solidity ^0.8.0;

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

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

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

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

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

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



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

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

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



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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



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

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


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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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;
    
    //Mapping para atribuirle un URI para cada token
    mapping(uint256 => string) internal id_to_URI;

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

    /**
     * @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 overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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

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 nft is ERC721Enumerable, Ownable {
    using Strings for uint256;

    //declares the maximum amount of tokens that can be minted, total and in presale
    uint256 private maxTotalTokens;
    //declares the amount of tokens able to be sold in presale
    uint256 private maxTokensPresale;
    
    //initial part of the URI for the metadata
    string private _currentBaseURI;
    //uri for unrevealed stage of NFTs
    string private unrevealedURI;
        
    //cost of mints depending on state of sale    
    uint private _mintCost = 0.0777 ether;
    
    //the amount of reserved mints that have currently been executed by creator and by marketing wallet
    uint private _reservedMints;
    //the maximum amount of reserved mints allowed for creator and marketing wallet
    uint private maxReservedMints;
    
    //number of mints an address can have maximum
    uint private maxMints;
    
    //the addresses of the shareholders
    address public shareholder1 = 0x318cBF186eB13C74533943b054959867eE44eFFE; //Dev
    address public shareholder2 = 0xAC5bECB84A3F732150D2333992339dd0E45F48cE; //Gnosis Safe
    
    //dummy address that we use to sign the mint transaction to make sure it is valid
    address private dummy = 0x80E4929c869102140E69550BBECC20bEd61B080c;

    //amount of mints that each address has executed
    mapping(address => uint256) public mintsPerAddress;
    
    //current state os sale
    enum State {NoSale, Presale, PublicSale}
    
    //the timestamp of when presale opens
    uint256 private presaleLaunchTime;
    //the timestamp of when presale opens
    uint256 private publicSaleLaunchTime;
    //the timestamp of when the NFTs get revealed
    uint256 private revealTime;
        
    //declaring initial values for variables
    constructor() ERC721('Gnomies', 'G') {
        //max number of NFTs that will be minted
        maxTotalTokens = 10000;
        //limit for presale
        maxTokensPresale = 5000;
        //URI of the placeholder image and metadata that will show before the collection has been revealed
        unrevealedURI = 'ipfs://QmfMH95cX9no1gfYPk3vKqbvUarFkznd3niU21XLX2BSiM/';
        
        //the max number of reserved mints for team/giveaway/marketing will be 100
        maxReservedMints = 777;

        //setting the amount of maxMints per person
        maxMints = 2;
        
    }
    
    //in case somebody accidentaly sends funds or transaction to contract
    receive() payable external {}
    fallback() payable external {
        revert();
    }
    
    //visualize baseURI
    function _baseURI() internal view virtual override returns (string memory) {
        return _currentBaseURI;
    }
    
    //change baseURI in case needed for IPFS
    function changeBaseURI(string memory baseURI_) public onlyOwner {
        _currentBaseURI = baseURI_;
    }
    
    //gets the tokenID of NFT to be minted
    function tokenId() internal view returns(uint256) {
        return totalSupply() + 1;
    }
    
    modifier onlyValidAccess(uint8 _v, bytes32 _r, bytes32 _s) {
        require( isValidAccessMessage(msg.sender,_v,_r,_s), 'Invalid Signature' );
        _;
    }
 
    /* 
    * @dev Verifies if message was signed by owner to give access to _add for this contract.
    *      Assumes Geth signature prefix.
    * @param _add Address of agent with access
    * @param _v ECDSA signature parameter v.
    * @param _r ECDSA signature parameters r.
    * @param _s ECDSA signature parameters s.
    * @return Validity of access message for a given address.
    */
    function isValidAccessMessage(address _add, uint8 _v, bytes32 _r, bytes32 _s) view public returns (bool) {
        bytes32 hash = keccak256(abi.encodePacked(address(this), _add));
        return dummy == ecrecover(keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)), _v, _r, _s);
    }
    
    //mint a @param number of NFTs
    //@param _v ECDSA signature parameter v.
    //@param _r ECDSA signature parameters r.
    //@param _s ECDSA signature parameters s.
    function presaleMint(uint256 number, uint8 _v, bytes32 _r, bytes32 _s) onlyValidAccess(_v,  _r, _s) external payable {
        require(saleState() != State.NoSale, "Sale in not open yet!");
        require(saleState() != State.PublicSale, "Presale has closed!");
        require(totalSupply() + number <= maxTokensPresale, "Not enough NFTs left to mint in Presale..");
        require(mintsPerAddress[msg.sender] + number <= maxMints, "Only 2 Mints are allowed per Address");
        require(msg.value >= number * mintCost(), "Insufficient Funds to mint this number of Tokens!");
        
        /*
        //function to blacklist bots
        if (block.timestamp == saleLaunchTime) {
            blacklist[msg.sender] = true;
        }
        */
        
        for (uint256 i = 0; i < number; i++) {
            uint256 tid = tokenId();
            _safeMint(msg.sender, tid);
            mintsPerAddress[msg.sender] += 1;
        }

    }

    function publicSaleMint(uint256 number) external payable {
        require(saleState() != State.NoSale, "Sale in not open yet!");
        require(saleState() == State.PublicSale, "Public Sale in not open yet!");
        require(totalSupply() + number <= maxTotalTokens - (maxReservedMints -  _reservedMints), "Not enough NFTs left to mint..");
        require(mintsPerAddress[msg.sender] + number <= maxMints + 1, "Only 3 Mints are allowed per Address");
        require(msg.value >= number * mintCost(), "Insufficient Funds to mint this number of Tokens!");
        
        /*
        //function to blacklist bots
        if (block.timestamp == saleLaunchTime) {
            blacklist[msg.sender] = true;
        }
        */
        
        for (uint256 i = 0; i < number; i++) {
            uint256 tid = tokenId();
            _safeMint(msg.sender, tid);
            mintsPerAddress[msg.sender] += 1;
        }

    }

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

        if (revealTime == 0) {
            return unrevealedURI;
        }    
        else {
            string memory baseURI = _baseURI();
            return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId_.toString(), '.json')) : "";
        }
        
            
    }
    
    //reserved NFTs for creatorç
    //mint a @param number of reserved NFTs
    function reservedMint(uint256 number) public onlyOwner {
        require(totalSupply() + number <= maxTotalTokens, "No NFTs left to mint.."); //In case we burn tokens
        require(_reservedMints + number <= maxReservedMints, "Not enough Reserved NFTs for Creator left to mint..");
        for (uint256 i = 0; i < number; i++) {
            uint256 tid = tokenId();
            _safeMint(msg.sender, tid);
            mintsPerAddress[msg.sender] += 1;
            _reservedMints += 1;
        }
    }
    
    //begins the minting of the NFTs
    function switchToPresale() public onlyOwner{
        require(saleState() == State.NoSale, "Sale has already opened!");
        presaleLaunchTime = block.timestamp;
    }

    //begins the minting of the NFTs
    function switchToPublicSale() public onlyOwner{
        require(saleState() != State.PublicSale, "Already in Public Sale!");
        require(saleState() == State.Presale, "Sale has not opened yet!");
        publicSaleLaunchTime = block.timestamp;
    }
    
    function reveal() public onlyOwner {
        revealTime = block.timestamp;
    }

    //burn the tokens that have not been sold yet
    function burnUnmintedTokens() public onlyOwner {
        maxTotalTokens = totalSupply();
        maxTokensPresale = totalSupply();
    }
    
    //se the current account balance
    function accountBalance() public onlyOwner view returns(uint) {
        return address(this).balance;
    }
    
    //change the dummy account used for signing transactions
    function changeDummy(address _dummy) public onlyOwner {
        dummy = _dummy;
    }
    
    //see the total amount of reserved mints that creator has left
    function reservedMintsLeft() public onlyOwner view returns(uint) {
        return maxReservedMints - _reservedMints;
    }
    
    //withdraw funds and distribute them to the shareholders
    function withdrawAll() public onlyOwner {
        uint balance = accountBalance();
        require(balance > 0, "Balance must be greater than 0");
        
        withdraw(payable(shareholder1), ((balance * 35) / 1000));
        withdraw(payable(shareholder2), accountBalance());
    }
    
    function withdraw(address payable _address, uint amount) internal {
        (bool sent, ) = _address.call{value: amount}("");
        require(sent, "Failed to send Ether");
    }
    
    //see the time that sale launched
    function publicSalelaunch() public view returns(uint256) {
        require(publicSaleLaunchTime != 0, 'Public Sale has not opened yet!');
        return publicSaleLaunchTime;
    }

    //see the time that sale launched
    function presalelaunch() public view returns(uint256) {
        require(presaleLaunchTime != 0, 'Presale has not opened yet!');
        return presaleLaunchTime;
    }

    //see the current state of sale
    function saleState() public view returns(State) {
        if (presaleLaunchTime == 0) {
            return State.NoSale;
        }
        else if (publicSaleLaunchTime == 0) {
            return State.Presale;
        }
        else {
            return State.PublicSale;
        }
    }

    //see the price to mint
    function mintCost() public view returns(uint) {
        return _mintCost;
    }

    function changeMintCost(uint256 newCost) public onlyOwner {
        _mintCost = newCost;
    }
    
   
}

Contract Security Audit

Contract ABI

[{"inputs":[],"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"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"accountBalance","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":"burnUnmintedTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"changeBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_dummy","type":"address"}],"name":"changeDummy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newCost","type":"uint256"}],"name":"changeMintCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_add","type":"address"},{"internalType":"uint8","name":"_v","type":"uint8"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"}],"name":"isValidAccessMessage","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintsPerAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"internalType":"uint256","name":"number","type":"uint256"},{"internalType":"uint8","name":"_v","type":"uint8"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"}],"name":"presaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"presalelaunch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"}],"name":"publicSaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicSalelaunch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"}],"name":"reservedMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reservedMintsLeft","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reveal","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":[],"name":"saleState","outputs":[{"internalType":"enum nft.State","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"shareholder1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"shareholder2","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"switchToPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"switchToPublicSale","outputs":[],"stateMutability":"nonpayable","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":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526701140bbd030c400060105573318cbf186eb13c74533943b054959867ee44effe601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073ac5becb84a3f732150d2333992339dd0e45f48ce601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507380e4929c869102140e69550bbecc20bed61b080c601660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200011c57600080fd5b506040518060400160405280600781526020017f476e6f6d696573000000000000000000000000000000000000000000000000008152506040518060400160405280600181526020017f47000000000000000000000000000000000000000000000000000000000000008152508160009080519060200190620001a192919062000306565b508060019080519060200190620001ba92919062000306565b505050620001dd620001d16200023860201b60201c565b6200024060201b60201c565b612710600c81905550611388600d8190555060405180606001604052806036815260200162005d5660369139600f90805190602001906200022092919062000306565b5061030960128190555060026013819055506200041b565b600033905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200031490620003b6565b90600052602060002090601f01602090048101928262000338576000855562000384565b82601f106200035357805160ff191683800117855562000384565b8280016001018555821562000384579182015b828111156200038357825182559160200191906001019062000366565b5b50905062000393919062000397565b5090565b5b80821115620003b257600081600090555060010162000398565b5090565b60006002820490506001821680620003cf57607f821691505b60208210811415620003e657620003e5620003ec565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61592b806200042b6000396000f3fe60806040526004361061023f5760003560e01c8063715018a61161012e578063b3ab66b0116100ab578063e39433a11161006f578063e39433a11461084e578063e985e9c514610879578063eab41782146108b6578063f2fde38b146108cd578063ff984994146108f657610246565b8063b3ab66b014610785578063b88d4fde146107a1578063bdb4b848146107ca578063c87b56dd146107f5578063dcd4e7321461083257610246565b806395d89b41116100f257806395d89b41146106d85780639e6be7ee14610703578063a22cb4651461071a578063a475b5dd14610743578063b0a1c1c41461075a57610246565b8063715018a61461062d5780637f1921ef14610644578063853828b61461066d5780638c74bf0e146106845780638da5cb5b146106ad57610246565b806332624114116101bc5780635e1dca04116101805780635e1dca0414610532578063603f4d521461055d5780636352211e1461058857806370780a7a146105c557806370a08231146105f057610246565b8063326241141461043b57806339a0c6f91461047857806342842e0e146104a15780634520e916146104ca5780634f6ccce7146104f557610246565b806318160ddd1161020357806318160ddd1461034257806323b872dd1461036d5780632f745c5914610396578063301702f3146103d35780633023eba6146103fe57610246565b80630191a6571461024b57806301ffc9a71461027457806306fdde03146102b1578063081812fc146102dc578063095ea7b31461031957610246565b3661024657005b600080fd5b34801561025757600080fd5b50610272600480360381019061026d91906139f4565b61090d565b005b34801561028057600080fd5b5061029b60048036038101906102969190613c1e565b6109cd565b6040516102a891906144d2565b60405180910390f35b3480156102bd57600080fd5b506102c6610a47565b6040516102d3919061454d565b60405180910390f35b3480156102e857600080fd5b5061030360048036038101906102fe9190613cc1565b610ad9565b604051610310919061446b565b60405180910390f35b34801561032557600080fd5b50610340600480360381019061033b9190613b77565b610b5e565b005b34801561034e57600080fd5b50610357610c76565b60405161036491906149ef565b60405180910390f35b34801561037957600080fd5b50610394600480360381019061038f9190613a61565b610c83565b005b3480156103a257600080fd5b506103bd60048036038101906103b89190613b77565b610ce3565b6040516103ca91906149ef565b60405180910390f35b3480156103df57600080fd5b506103e8610d88565b6040516103f591906149ef565b60405180910390f35b34801561040a57600080fd5b50610425600480360381019061042091906139f4565b610dd7565b60405161043291906149ef565b60405180910390f35b34801561044757600080fd5b50610462600480360381019061045d9190613bb7565b610def565b60405161046f91906144d2565b60405180910390f35b34801561048457600080fd5b5061049f600480360381019061049a9190613c78565b610eed565b005b3480156104ad57600080fd5b506104c860048036038101906104c39190613a61565b610f83565b005b3480156104d657600080fd5b506104df610fa3565b6040516104ec91906149ef565b60405180910390f35b34801561050157600080fd5b5061051c60048036038101906105179190613cc1565b611036565b60405161052991906149ef565b60405180910390f35b34801561053e57600080fd5b506105476110a7565b604051610554919061446b565b60405180910390f35b34801561056957600080fd5b506105726110cd565b60405161057f9190614532565b60405180910390f35b34801561059457600080fd5b506105af60048036038101906105aa9190613cc1565b6110fe565b6040516105bc919061446b565b60405180910390f35b3480156105d157600080fd5b506105da6111b0565b6040516105e7919061446b565b60405180910390f35b3480156105fc57600080fd5b50610617600480360381019061061291906139f4565b6111d6565b60405161062491906149ef565b60405180910390f35b34801561063957600080fd5b5061064261128e565b005b34801561065057600080fd5b5061066b60048036038101906106669190613cc1565b611316565b005b34801561067957600080fd5b5061068261139c565b005b34801561069057600080fd5b506106ab60048036038101906106a69190613cc1565b6114e2565b005b3480156106b957600080fd5b506106c26116b1565b6040516106cf919061446b565b60405180910390f35b3480156106e457600080fd5b506106ed6116db565b6040516106fa919061454d565b60405180910390f35b34801561070f57600080fd5b5061071861176d565b005b34801561072657600080fd5b50610741600480360381019061073c9190613b37565b611807565b005b34801561074f57600080fd5b50610758611988565b005b34801561076657600080fd5b5061076f611a0d565b60405161077c91906149ef565b60405180910390f35b61079f600480360381019061079a9190613cc1565b611a91565b005b3480156107ad57600080fd5b506107c860048036038101906107c39190613ab4565b611d5e565b005b3480156107d657600080fd5b506107df611dc0565b6040516107ec91906149ef565b60405180910390f35b34801561080157600080fd5b5061081c60048036038101906108179190613cc1565b611dca565b604051610829919061454d565b60405180910390f35b61084c60048036038101906108479190613cee565b611f0f565b005b34801561085a57600080fd5b5061086361220b565b60405161087091906149ef565b60405180910390f35b34801561088557600080fd5b506108a0600480360381019061089b9190613a21565b61225a565b6040516108ad91906144d2565b60405180910390f35b3480156108c257600080fd5b506108cb6122ee565b005b3480156108d957600080fd5b506108f460048036038101906108ef91906139f4565b6123e1565b005b34801561090257600080fd5b5061090b6124d9565b005b61091561263a565b73ffffffffffffffffffffffffffffffffffffffff166109336116b1565b73ffffffffffffffffffffffffffffffffffffffff1614610989576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109809061482f565b60405180910390fd5b80601660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a405750610a3f82612642565b5b9050919050565b606060008054610a5690614ce6565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8290614ce6565b8015610acf5780601f10610aa457610100808354040283529160200191610acf565b820191906000526020600020905b815481529060010190602001808311610ab257829003601f168201915b5050505050905090565b6000610ae482612724565b610b23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1a906147ef565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b69826110fe565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610bda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd1906148cf565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bf961263a565b73ffffffffffffffffffffffffffffffffffffffff161480610c285750610c2781610c2261263a565b61225a565b5b610c67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5e9061472f565b60405180910390fd5b610c718383612790565b505050565b6000600980549050905090565b610c94610c8e61263a565b82612849565b610cd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cca9061492f565b60405180910390fd5b610cde838383612927565b505050565b6000610cee836111d6565b8210610d2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d26906145af565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6000806018541415610dcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc69061466f565b60405180910390fd5b601854905090565b60176020528060005260406000206000915090505481565b6000803086604051602001610e059291906143d5565b604051602081830303815290604052805190602001209050600181604051602001610e309190614430565b6040516020818303038152906040528051906020012086868660405160008152602001604052604051610e6694939291906144ed565b6020604051602081039080840390855afa158015610e88573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff16601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614915050949350505050565b610ef561263a565b73ffffffffffffffffffffffffffffffffffffffff16610f136116b1565b73ffffffffffffffffffffffffffffffffffffffff1614610f69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f609061482f565b60405180910390fd5b80600e9080519060200190610f7f9291906137de565b5050565b610f9e83838360405180602001604052806000815250611d5e565b505050565b6000610fad61263a565b73ffffffffffffffffffffffffffffffffffffffff16610fcb6116b1565b73ffffffffffffffffffffffffffffffffffffffff1614611021576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110189061482f565b60405180910390fd5b6011546012546110319190614bc0565b905090565b6000611040610c76565b8210611081576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110789061494f565b60405180910390fd5b6009828154811061109557611094614edc565b5b90600052602060002001549050919050565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060185414156110e257600090506110fb565b600060195414156110f657600190506110fb565b600290505b90565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156111a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119e9061476f565b60405180910390fd5b80915050919050565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611247576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123e9061474f565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61129661263a565b73ffffffffffffffffffffffffffffffffffffffff166112b46116b1565b73ffffffffffffffffffffffffffffffffffffffff161461130a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113019061482f565b60405180910390fd5b6113146000612b83565b565b61131e61263a565b73ffffffffffffffffffffffffffffffffffffffff1661133c6116b1565b73ffffffffffffffffffffffffffffffffffffffff1614611392576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113899061482f565b60405180910390fd5b8060108190555050565b6113a461263a565b73ffffffffffffffffffffffffffffffffffffffff166113c26116b1565b73ffffffffffffffffffffffffffffffffffffffff1614611418576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140f9061482f565b60405180910390fd5b6000611422611a0d565b905060008111611467576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145e906149af565b60405180910390fd5b6114ac601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166103e860238461149d9190614b66565b6114a79190614b35565b612c49565b6114df601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166114da611a0d565b612c49565b50565b6114ea61263a565b73ffffffffffffffffffffffffffffffffffffffff166115086116b1565b73ffffffffffffffffffffffffffffffffffffffff161461155e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115559061482f565b60405180910390fd5b600c548161156a610c76565b6115749190614adf565b11156115b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ac9061496f565b60405180910390fd5b601254816011546115c69190614adf565b1115611607576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115fe9061462f565b60405180910390fd5b60005b818110156116ad57600061161c612cfa565b90506116283382612d15565b6001601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116789190614adf565b925050819055506001601160008282546116929190614adf565b925050819055505080806116a590614d49565b91505061160a565b5050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546116ea90614ce6565b80601f016020809104026020016040519081016040528092919081815260200182805461171690614ce6565b80156117635780601f1061173857610100808354040283529160200191611763565b820191906000526020600020905b81548152906001019060200180831161174657829003601f168201915b5050505050905090565b61177561263a565b73ffffffffffffffffffffffffffffffffffffffff166117936116b1565b73ffffffffffffffffffffffffffffffffffffffff16146117e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e09061482f565b60405180910390fd5b6117f1610c76565b600c819055506117ff610c76565b600d81905550565b61180f61263a565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561187d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611874906146cf565b60405180910390fd5b806005600061188a61263a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661193761263a565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161197c91906144d2565b60405180910390a35050565b61199061263a565b73ffffffffffffffffffffffffffffffffffffffff166119ae6116b1565b73ffffffffffffffffffffffffffffffffffffffff1614611a04576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119fb9061482f565b60405180910390fd5b42601a81905550565b6000611a1761263a565b73ffffffffffffffffffffffffffffffffffffffff16611a356116b1565b73ffffffffffffffffffffffffffffffffffffffff1614611a8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a829061482f565b60405180910390fd5b47905090565b60006002811115611aa557611aa4614e4f565b5b611aad6110cd565b6002811115611abf57611abe614e4f565b5b1415611b00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af79061498f565b60405180910390fd5b600280811115611b1357611b12614e4f565b5b611b1b6110cd565b6002811115611b2d57611b2c614e4f565b5b14611b6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b649061478f565b60405180910390fd5b601154601254611b7d9190614bc0565b600c54611b8a9190614bc0565b81611b93610c76565b611b9d9190614adf565b1115611bde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd5906146ef565b60405180910390fd5b6001601354611bed9190614adf565b81601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611c389190614adf565b1115611c79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c70906147af565b60405180910390fd5b611c81611dc0565b81611c8c9190614b66565b341015611cce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc59061484f565b60405180910390fd5b60005b81811015611d5a576000611ce3612cfa565b9050611cef3382612d15565b6001601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d3f9190614adf565b92505081905550508080611d5290614d49565b915050611cd1565b5050565b611d6f611d6961263a565b83612849565b611dae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da59061492f565b60405180910390fd5b611dba84848484612d33565b50505050565b6000601054905090565b6060611dd582612724565b611e14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0b906148af565b60405180910390fd5b6000601a541415611eb157600f8054611e2c90614ce6565b80601f0160208091040260200160405190810160405280929190818152602001828054611e5890614ce6565b8015611ea55780601f10611e7a57610100808354040283529160200191611ea5565b820191906000526020600020905b815481529060010190602001808311611e8857829003601f168201915b50505050509050611f0a565b6000611ebb612d8f565b90506000815111611edb5760405180602001604052806000815250611f06565b80611ee584612e21565b604051602001611ef6929190614401565b6040516020818303038152906040525b9150505b919050565b828282611f1e33848484610def565b611f5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f549061480f565b60405180910390fd5b60006002811115611f7157611f70614e4f565b5b611f796110cd565b6002811115611f8b57611f8a614e4f565b5b1415611fcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc39061498f565b60405180910390fd5b600280811115611fdf57611fde614e4f565b5b611fe76110cd565b6002811115611ff957611ff8614e4f565b5b141561203a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612031906148ef565b60405180910390fd5b600d5487612046610c76565b6120509190614adf565b1115612091576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120889061458f565b60405180910390fd5b60135487601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546120df9190614adf565b1115612120576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121179061456f565b60405180910390fd5b612128611dc0565b876121339190614b66565b341015612175576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216c9061484f565b60405180910390fd5b60005b8781101561220157600061218a612cfa565b90506121963382612d15565b6001601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121e69190614adf565b925050819055505080806121f990614d49565b915050612178565b5050505050505050565b6000806019541415612252576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612249906149cf565b60405180910390fd5b601954905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6122f661263a565b73ffffffffffffffffffffffffffffffffffffffff166123146116b1565b73ffffffffffffffffffffffffffffffffffffffff161461236a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123619061482f565b60405180910390fd5b6000600281111561237e5761237d614e4f565b5b6123866110cd565b600281111561239857612397614e4f565b5b146123d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123cf9061464f565b60405180910390fd5b42601881905550565b6123e961263a565b73ffffffffffffffffffffffffffffffffffffffff166124076116b1565b73ffffffffffffffffffffffffffffffffffffffff161461245d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124549061482f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156124cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124c4906145ef565b60405180910390fd5b6124d681612b83565b50565b6124e161263a565b73ffffffffffffffffffffffffffffffffffffffff166124ff6116b1565b73ffffffffffffffffffffffffffffffffffffffff1614612555576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254c9061482f565b60405180910390fd5b60028081111561256857612567614e4f565b5b6125706110cd565b600281111561258257612581614e4f565b5b14156125c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ba9061486f565b60405180910390fd5b600160028111156125d7576125d6614e4f565b5b6125df6110cd565b60028111156125f1576125f0614e4f565b5b14612631576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126289061490f565b60405180910390fd5b42601981905550565b600033905090565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061270d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061271d575061271c82612f82565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612803836110fe565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061285482612724565b612893576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161288a9061470f565b60405180910390fd5b600061289e836110fe565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061290d57508373ffffffffffffffffffffffffffffffffffffffff166128f584610ad9565b73ffffffffffffffffffffffffffffffffffffffff16145b8061291e575061291d818561225a565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612947826110fe565b73ffffffffffffffffffffffffffffffffffffffff161461299d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129949061488f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a04906146af565b60405180910390fd5b612a18838383612fec565b612a23600082612790565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a739190614bc0565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612aca9190614adf565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612c6f90614456565b60006040518083038185875af1925050503d8060008114612cac576040519150601f19603f3d011682016040523d82523d6000602084013e612cb1565b606091505b5050905080612cf5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cec9061468f565b60405180910390fd5b505050565b60006001612d06610c76565b612d109190614adf565b905090565b612d2f828260405180602001604052806000815250613100565b5050565b612d3e848484612927565b612d4a8484848461315b565b612d89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d80906145cf565b60405180910390fd5b50505050565b6060600e8054612d9e90614ce6565b80601f0160208091040260200160405190810160405280929190818152602001828054612dca90614ce6565b8015612e175780601f10612dec57610100808354040283529160200191612e17565b820191906000526020600020905b815481529060010190602001808311612dfa57829003601f168201915b5050505050905090565b60606000821415612e69576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612f7d565b600082905060005b60008214612e9b578080612e8490614d49565b915050600a82612e949190614b35565b9150612e71565b60008167ffffffffffffffff811115612eb757612eb6614f0b565b5b6040519080825280601f01601f191660200182016040528015612ee95781602001600182028036833780820191505090505b5090505b60008514612f7657600182612f029190614bc0565b9150600a85612f119190614dc0565b6030612f1d9190614adf565b60f81b818381518110612f3357612f32614edc565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612f6f9190614b35565b9450612eed565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612ff78383836132f2565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561303a57613035816132f7565b613079565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613078576130778382613340565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130bc576130b7816134ad565b6130fb565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146130fa576130f9828261357e565b5b5b505050565b61310a83836135fd565b613117600084848461315b565b613156576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161314d906145cf565b60405180910390fd5b505050565b600061317c8473ffffffffffffffffffffffffffffffffffffffff166137cb565b156132e5578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026131a561263a565b8786866040518563ffffffff1660e01b81526004016131c79493929190614486565b602060405180830381600087803b1580156131e157600080fd5b505af192505050801561321257506040513d601f19601f8201168201806040525081019061320f9190613c4b565b60015b613295573d8060008114613242576040519150601f19603f3d011682016040523d82523d6000602084013e613247565b606091505b5060008151141561328d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613284906145cf565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506132ea565b600190505b949350505050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161334d846111d6565b6133579190614bc0565b905060006008600084815260200190815260200160002054905081811461343c576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016009805490506134c19190614bc0565b90506000600a60008481526020019081526020016000205490506000600983815481106134f1576134f0614edc565b5b90600052602060002001549050806009838154811061351357613512614edc565b5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a600085815260200190815260200160002060009055600980548061356257613561614ead565b5b6001900381819060005260206000200160009055905550505050565b6000613589836111d6565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561366d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613664906147cf565b60405180910390fd5b61367681612724565b156136b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136ad9061460f565b60405180910390fd5b6136c260008383612fec565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546137129190614adf565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b8280546137ea90614ce6565b90600052602060002090601f01602090048101928261380c5760008555613853565b82601f1061382557805160ff1916838001178555613853565b82800160010185558215613853579182015b82811115613852578251825591602001919060010190613837565b5b5090506138609190613864565b5090565b5b8082111561387d576000816000905550600101613865565b5090565b600061389461388f84614a2f565b614a0a565b9050828152602081018484840111156138b0576138af614f3f565b5b6138bb848285614ca4565b509392505050565b60006138d66138d184614a60565b614a0a565b9050828152602081018484840111156138f2576138f1614f3f565b5b6138fd848285614ca4565b509392505050565b6000813590506139148161586b565b92915050565b60008135905061392981615882565b92915050565b60008135905061393e81615899565b92915050565b600081359050613953816158b0565b92915050565b600081519050613968816158b0565b92915050565b600082601f83011261398357613982614f3a565b5b8135613993848260208601613881565b91505092915050565b600082601f8301126139b1576139b0614f3a565b5b81356139c18482602086016138c3565b91505092915050565b6000813590506139d9816158c7565b92915050565b6000813590506139ee816158de565b92915050565b600060208284031215613a0a57613a09614f49565b5b6000613a1884828501613905565b91505092915050565b60008060408385031215613a3857613a37614f49565b5b6000613a4685828601613905565b9250506020613a5785828601613905565b9150509250929050565b600080600060608486031215613a7a57613a79614f49565b5b6000613a8886828701613905565b9350506020613a9986828701613905565b9250506040613aaa868287016139ca565b9150509250925092565b60008060008060808587031215613ace57613acd614f49565b5b6000613adc87828801613905565b9450506020613aed87828801613905565b9350506040613afe878288016139ca565b925050606085013567ffffffffffffffff811115613b1f57613b1e614f44565b5b613b2b8782880161396e565b91505092959194509250565b60008060408385031215613b4e57613b4d614f49565b5b6000613b5c85828601613905565b9250506020613b6d8582860161391a565b9150509250929050565b60008060408385031215613b8e57613b8d614f49565b5b6000613b9c85828601613905565b9250506020613bad858286016139ca565b9150509250929050565b60008060008060808587031215613bd157613bd0614f49565b5b6000613bdf87828801613905565b9450506020613bf0878288016139df565b9350506040613c018782880161392f565b9250506060613c128782880161392f565b91505092959194509250565b600060208284031215613c3457613c33614f49565b5b6000613c4284828501613944565b91505092915050565b600060208284031215613c6157613c60614f49565b5b6000613c6f84828501613959565b91505092915050565b600060208284031215613c8e57613c8d614f49565b5b600082013567ffffffffffffffff811115613cac57613cab614f44565b5b613cb88482850161399c565b91505092915050565b600060208284031215613cd757613cd6614f49565b5b6000613ce5848285016139ca565b91505092915050565b60008060008060808587031215613d0857613d07614f49565b5b6000613d16878288016139ca565b9450506020613d27878288016139df565b9350506040613d388782880161392f565b9250506060613d498782880161392f565b91505092959194509250565b613d5e81614bf4565b82525050565b613d75613d7082614bf4565b614d92565b82525050565b613d8481614c06565b82525050565b613d9381614c12565b82525050565b613daa613da582614c12565b614da4565b82525050565b6000613dbb82614a91565b613dc58185614aa7565b9350613dd5818560208601614cb3565b613dde81614f4e565b840191505092915050565b613df281614c92565b82525050565b6000613e0382614a9c565b613e0d8185614ac3565b9350613e1d818560208601614cb3565b613e2681614f4e565b840191505092915050565b6000613e3c82614a9c565b613e468185614ad4565b9350613e56818560208601614cb3565b80840191505092915050565b6000613e6f602483614ac3565b9150613e7a82614f6c565b604082019050919050565b6000613e92601c83614ad4565b9150613e9d82614fbb565b601c82019050919050565b6000613eb5602983614ac3565b9150613ec082614fe4565b604082019050919050565b6000613ed8602b83614ac3565b9150613ee382615033565b604082019050919050565b6000613efb603283614ac3565b9150613f0682615082565b604082019050919050565b6000613f1e602683614ac3565b9150613f29826150d1565b604082019050919050565b6000613f41601c83614ac3565b9150613f4c82615120565b602082019050919050565b6000613f64603383614ac3565b9150613f6f82615149565b604082019050919050565b6000613f87601883614ac3565b9150613f9282615198565b602082019050919050565b6000613faa601b83614ac3565b9150613fb5826151c1565b602082019050919050565b6000613fcd601483614ac3565b9150613fd8826151ea565b602082019050919050565b6000613ff0602483614ac3565b9150613ffb82615213565b604082019050919050565b6000614013601983614ac3565b915061401e82615262565b602082019050919050565b6000614036601e83614ac3565b91506140418261528b565b602082019050919050565b6000614059602c83614ac3565b9150614064826152b4565b604082019050919050565b600061407c603883614ac3565b915061408782615303565b604082019050919050565b600061409f602a83614ac3565b91506140aa82615352565b604082019050919050565b60006140c2602983614ac3565b91506140cd826153a1565b604082019050919050565b60006140e5601c83614ac3565b91506140f0826153f0565b602082019050919050565b6000614108602483614ac3565b915061411382615419565b604082019050919050565b600061412b602083614ac3565b915061413682615468565b602082019050919050565b600061414e602c83614ac3565b915061415982615491565b604082019050919050565b6000614171600583614ad4565b915061417c826154e0565b600582019050919050565b6000614194601183614ac3565b915061419f82615509565b602082019050919050565b60006141b7602083614ac3565b91506141c282615532565b602082019050919050565b60006141da603183614ac3565b91506141e58261555b565b604082019050919050565b60006141fd601783614ac3565b9150614208826155aa565b602082019050919050565b6000614220602983614ac3565b915061422b826155d3565b604082019050919050565b6000614243602f83614ac3565b915061424e82615622565b604082019050919050565b6000614266602183614ac3565b915061427182615671565b604082019050919050565b6000614289601383614ac3565b9150614294826156c0565b602082019050919050565b60006142ac601883614ac3565b91506142b7826156e9565b602082019050919050565b60006142cf600083614ab8565b91506142da82615712565b600082019050919050565b60006142f2603183614ac3565b91506142fd82615715565b604082019050919050565b6000614315602c83614ac3565b915061432082615764565b604082019050919050565b6000614338601683614ac3565b9150614343826157b3565b602082019050919050565b600061435b601583614ac3565b9150614366826157dc565b602082019050919050565b600061437e601e83614ac3565b915061438982615805565b602082019050919050565b60006143a1601f83614ac3565b91506143ac8261582e565b602082019050919050565b6143c081614c7b565b82525050565b6143cf81614c85565b82525050565b60006143e18285613d64565b6014820191506143f18284613d64565b6014820191508190509392505050565b600061440d8285613e31565b91506144198284613e31565b915061442482614164565b91508190509392505050565b600061443b82613e85565b91506144478284613d99565b60208201915081905092915050565b6000614461826142c2565b9150819050919050565b60006020820190506144806000830184613d55565b92915050565b600060808201905061449b6000830187613d55565b6144a86020830186613d55565b6144b560408301856143b7565b81810360608301526144c78184613db0565b905095945050505050565b60006020820190506144e76000830184613d7b565b92915050565b60006080820190506145026000830187613d8a565b61450f60208301866143c6565b61451c6040830185613d8a565b6145296060830184613d8a565b95945050505050565b60006020820190506145476000830184613de9565b92915050565b600060208201905081810360008301526145678184613df8565b905092915050565b6000602082019050818103600083015261458881613e62565b9050919050565b600060208201905081810360008301526145a881613ea8565b9050919050565b600060208201905081810360008301526145c881613ecb565b9050919050565b600060208201905081810360008301526145e881613eee565b9050919050565b6000602082019050818103600083015261460881613f11565b9050919050565b6000602082019050818103600083015261462881613f34565b9050919050565b6000602082019050818103600083015261464881613f57565b9050919050565b6000602082019050818103600083015261466881613f7a565b9050919050565b6000602082019050818103600083015261468881613f9d565b9050919050565b600060208201905081810360008301526146a881613fc0565b9050919050565b600060208201905081810360008301526146c881613fe3565b9050919050565b600060208201905081810360008301526146e881614006565b9050919050565b6000602082019050818103600083015261470881614029565b9050919050565b600060208201905081810360008301526147288161404c565b9050919050565b600060208201905081810360008301526147488161406f565b9050919050565b6000602082019050818103600083015261476881614092565b9050919050565b60006020820190508181036000830152614788816140b5565b9050919050565b600060208201905081810360008301526147a8816140d8565b9050919050565b600060208201905081810360008301526147c8816140fb565b9050919050565b600060208201905081810360008301526147e88161411e565b9050919050565b6000602082019050818103600083015261480881614141565b9050919050565b6000602082019050818103600083015261482881614187565b9050919050565b60006020820190508181036000830152614848816141aa565b9050919050565b60006020820190508181036000830152614868816141cd565b9050919050565b60006020820190508181036000830152614888816141f0565b9050919050565b600060208201905081810360008301526148a881614213565b9050919050565b600060208201905081810360008301526148c881614236565b9050919050565b600060208201905081810360008301526148e881614259565b9050919050565b600060208201905081810360008301526149088161427c565b9050919050565b600060208201905081810360008301526149288161429f565b9050919050565b60006020820190508181036000830152614948816142e5565b9050919050565b6000602082019050818103600083015261496881614308565b9050919050565b600060208201905081810360008301526149888161432b565b9050919050565b600060208201905081810360008301526149a88161434e565b9050919050565b600060208201905081810360008301526149c881614371565b9050919050565b600060208201905081810360008301526149e881614394565b9050919050565b6000602082019050614a0460008301846143b7565b92915050565b6000614a14614a25565b9050614a208282614d18565b919050565b6000604051905090565b600067ffffffffffffffff821115614a4a57614a49614f0b565b5b614a5382614f4e565b9050602081019050919050565b600067ffffffffffffffff821115614a7b57614a7a614f0b565b5b614a8482614f4e565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614aea82614c7b565b9150614af583614c7b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614b2a57614b29614df1565b5b828201905092915050565b6000614b4082614c7b565b9150614b4b83614c7b565b925082614b5b57614b5a614e20565b5b828204905092915050565b6000614b7182614c7b565b9150614b7c83614c7b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614bb557614bb4614df1565b5b828202905092915050565b6000614bcb82614c7b565b9150614bd683614c7b565b925082821015614be957614be8614df1565b5b828203905092915050565b6000614bff82614c5b565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000819050614c5682615857565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000614c9d82614c48565b9050919050565b82818337600083830152505050565b60005b83811015614cd1578082015181840152602081019050614cb6565b83811115614ce0576000848401525b50505050565b60006002820490506001821680614cfe57607f821691505b60208210811415614d1257614d11614e7e565b5b50919050565b614d2182614f4e565b810181811067ffffffffffffffff82111715614d4057614d3f614f0b565b5b80604052505050565b6000614d5482614c7b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614d8757614d86614df1565b5b600182019050919050565b6000614d9d82614dae565b9050919050565b6000819050919050565b6000614db982614f5f565b9050919050565b6000614dcb82614c7b565b9150614dd683614c7b565b925082614de657614de5614e20565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4f6e6c792032204d696e74732061726520616c6c6f776564207065722041646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f4e6f7420656e6f756768204e465473206c65667420746f206d696e7420696e2060008201527f50726573616c652e2e0000000000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4e6f7420656e6f756768205265736572766564204e46547320666f722043726560008201527f61746f72206c65667420746f206d696e742e2e00000000000000000000000000602082015250565b7f53616c652068617320616c7265616479206f70656e6564210000000000000000600082015250565b7f50726573616c6520686173206e6f74206f70656e656420796574210000000000600082015250565b7f4661696c656420746f2073656e64204574686572000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4e6f7420656e6f756768204e465473206c65667420746f206d696e742e2e0000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f5075626c69632053616c6520696e206e6f74206f70656e207965742100000000600082015250565b7f4f6e6c792033204d696e74732061726520616c6c6f776564207065722041646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f496e76616c6964205369676e6174757265000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f496e73756666696369656e742046756e647320746f206d696e7420746869732060008201527f6e756d626572206f6620546f6b656e7321000000000000000000000000000000602082015250565b7f416c726561647920696e205075626c69632053616c6521000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f50726573616c652068617320636c6f7365642100000000000000000000000000600082015250565b7f53616c6520686173206e6f74206f70656e656420796574210000000000000000600082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4e6f204e465473206c65667420746f206d696e742e2e00000000000000000000600082015250565b7f53616c6520696e206e6f74206f70656e20796574210000000000000000000000600082015250565b7f42616c616e6365206d7573742062652067726561746572207468616e20300000600082015250565b7f5075626c69632053616c6520686173206e6f74206f70656e6564207965742100600082015250565b6003811061586857615867614e4f565b5b50565b61587481614bf4565b811461587f57600080fd5b50565b61588b81614c06565b811461589657600080fd5b50565b6158a281614c12565b81146158ad57600080fd5b50565b6158b981614c1c565b81146158c457600080fd5b50565b6158d081614c7b565b81146158db57600080fd5b50565b6158e781614c85565b81146158f257600080fd5b5056fea2646970667358221220c2900dde352fadf445d17ddcf4f3e2c2c61087e6aeee4a63670136713314a61164736f6c63430008070033697066733a2f2f516d664d4839356358396e6f31676659506b33764b716276556172466b7a6e64336e69553231584c58324253694d2f

Deployed Bytecode

0x60806040526004361061023f5760003560e01c8063715018a61161012e578063b3ab66b0116100ab578063e39433a11161006f578063e39433a11461084e578063e985e9c514610879578063eab41782146108b6578063f2fde38b146108cd578063ff984994146108f657610246565b8063b3ab66b014610785578063b88d4fde146107a1578063bdb4b848146107ca578063c87b56dd146107f5578063dcd4e7321461083257610246565b806395d89b41116100f257806395d89b41146106d85780639e6be7ee14610703578063a22cb4651461071a578063a475b5dd14610743578063b0a1c1c41461075a57610246565b8063715018a61461062d5780637f1921ef14610644578063853828b61461066d5780638c74bf0e146106845780638da5cb5b146106ad57610246565b806332624114116101bc5780635e1dca04116101805780635e1dca0414610532578063603f4d521461055d5780636352211e1461058857806370780a7a146105c557806370a08231146105f057610246565b8063326241141461043b57806339a0c6f91461047857806342842e0e146104a15780634520e916146104ca5780634f6ccce7146104f557610246565b806318160ddd1161020357806318160ddd1461034257806323b872dd1461036d5780632f745c5914610396578063301702f3146103d35780633023eba6146103fe57610246565b80630191a6571461024b57806301ffc9a71461027457806306fdde03146102b1578063081812fc146102dc578063095ea7b31461031957610246565b3661024657005b600080fd5b34801561025757600080fd5b50610272600480360381019061026d91906139f4565b61090d565b005b34801561028057600080fd5b5061029b60048036038101906102969190613c1e565b6109cd565b6040516102a891906144d2565b60405180910390f35b3480156102bd57600080fd5b506102c6610a47565b6040516102d3919061454d565b60405180910390f35b3480156102e857600080fd5b5061030360048036038101906102fe9190613cc1565b610ad9565b604051610310919061446b565b60405180910390f35b34801561032557600080fd5b50610340600480360381019061033b9190613b77565b610b5e565b005b34801561034e57600080fd5b50610357610c76565b60405161036491906149ef565b60405180910390f35b34801561037957600080fd5b50610394600480360381019061038f9190613a61565b610c83565b005b3480156103a257600080fd5b506103bd60048036038101906103b89190613b77565b610ce3565b6040516103ca91906149ef565b60405180910390f35b3480156103df57600080fd5b506103e8610d88565b6040516103f591906149ef565b60405180910390f35b34801561040a57600080fd5b50610425600480360381019061042091906139f4565b610dd7565b60405161043291906149ef565b60405180910390f35b34801561044757600080fd5b50610462600480360381019061045d9190613bb7565b610def565b60405161046f91906144d2565b60405180910390f35b34801561048457600080fd5b5061049f600480360381019061049a9190613c78565b610eed565b005b3480156104ad57600080fd5b506104c860048036038101906104c39190613a61565b610f83565b005b3480156104d657600080fd5b506104df610fa3565b6040516104ec91906149ef565b60405180910390f35b34801561050157600080fd5b5061051c60048036038101906105179190613cc1565b611036565b60405161052991906149ef565b60405180910390f35b34801561053e57600080fd5b506105476110a7565b604051610554919061446b565b60405180910390f35b34801561056957600080fd5b506105726110cd565b60405161057f9190614532565b60405180910390f35b34801561059457600080fd5b506105af60048036038101906105aa9190613cc1565b6110fe565b6040516105bc919061446b565b60405180910390f35b3480156105d157600080fd5b506105da6111b0565b6040516105e7919061446b565b60405180910390f35b3480156105fc57600080fd5b50610617600480360381019061061291906139f4565b6111d6565b60405161062491906149ef565b60405180910390f35b34801561063957600080fd5b5061064261128e565b005b34801561065057600080fd5b5061066b60048036038101906106669190613cc1565b611316565b005b34801561067957600080fd5b5061068261139c565b005b34801561069057600080fd5b506106ab60048036038101906106a69190613cc1565b6114e2565b005b3480156106b957600080fd5b506106c26116b1565b6040516106cf919061446b565b60405180910390f35b3480156106e457600080fd5b506106ed6116db565b6040516106fa919061454d565b60405180910390f35b34801561070f57600080fd5b5061071861176d565b005b34801561072657600080fd5b50610741600480360381019061073c9190613b37565b611807565b005b34801561074f57600080fd5b50610758611988565b005b34801561076657600080fd5b5061076f611a0d565b60405161077c91906149ef565b60405180910390f35b61079f600480360381019061079a9190613cc1565b611a91565b005b3480156107ad57600080fd5b506107c860048036038101906107c39190613ab4565b611d5e565b005b3480156107d657600080fd5b506107df611dc0565b6040516107ec91906149ef565b60405180910390f35b34801561080157600080fd5b5061081c60048036038101906108179190613cc1565b611dca565b604051610829919061454d565b60405180910390f35b61084c60048036038101906108479190613cee565b611f0f565b005b34801561085a57600080fd5b5061086361220b565b60405161087091906149ef565b60405180910390f35b34801561088557600080fd5b506108a0600480360381019061089b9190613a21565b61225a565b6040516108ad91906144d2565b60405180910390f35b3480156108c257600080fd5b506108cb6122ee565b005b3480156108d957600080fd5b506108f460048036038101906108ef91906139f4565b6123e1565b005b34801561090257600080fd5b5061090b6124d9565b005b61091561263a565b73ffffffffffffffffffffffffffffffffffffffff166109336116b1565b73ffffffffffffffffffffffffffffffffffffffff1614610989576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109809061482f565b60405180910390fd5b80601660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a405750610a3f82612642565b5b9050919050565b606060008054610a5690614ce6565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8290614ce6565b8015610acf5780601f10610aa457610100808354040283529160200191610acf565b820191906000526020600020905b815481529060010190602001808311610ab257829003601f168201915b5050505050905090565b6000610ae482612724565b610b23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1a906147ef565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b69826110fe565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610bda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd1906148cf565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bf961263a565b73ffffffffffffffffffffffffffffffffffffffff161480610c285750610c2781610c2261263a565b61225a565b5b610c67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5e9061472f565b60405180910390fd5b610c718383612790565b505050565b6000600980549050905090565b610c94610c8e61263a565b82612849565b610cd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cca9061492f565b60405180910390fd5b610cde838383612927565b505050565b6000610cee836111d6565b8210610d2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d26906145af565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6000806018541415610dcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc69061466f565b60405180910390fd5b601854905090565b60176020528060005260406000206000915090505481565b6000803086604051602001610e059291906143d5565b604051602081830303815290604052805190602001209050600181604051602001610e309190614430565b6040516020818303038152906040528051906020012086868660405160008152602001604052604051610e6694939291906144ed565b6020604051602081039080840390855afa158015610e88573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff16601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614915050949350505050565b610ef561263a565b73ffffffffffffffffffffffffffffffffffffffff16610f136116b1565b73ffffffffffffffffffffffffffffffffffffffff1614610f69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f609061482f565b60405180910390fd5b80600e9080519060200190610f7f9291906137de565b5050565b610f9e83838360405180602001604052806000815250611d5e565b505050565b6000610fad61263a565b73ffffffffffffffffffffffffffffffffffffffff16610fcb6116b1565b73ffffffffffffffffffffffffffffffffffffffff1614611021576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110189061482f565b60405180910390fd5b6011546012546110319190614bc0565b905090565b6000611040610c76565b8210611081576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110789061494f565b60405180910390fd5b6009828154811061109557611094614edc565b5b90600052602060002001549050919050565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060185414156110e257600090506110fb565b600060195414156110f657600190506110fb565b600290505b90565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156111a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119e9061476f565b60405180910390fd5b80915050919050565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611247576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123e9061474f565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61129661263a565b73ffffffffffffffffffffffffffffffffffffffff166112b46116b1565b73ffffffffffffffffffffffffffffffffffffffff161461130a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113019061482f565b60405180910390fd5b6113146000612b83565b565b61131e61263a565b73ffffffffffffffffffffffffffffffffffffffff1661133c6116b1565b73ffffffffffffffffffffffffffffffffffffffff1614611392576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113899061482f565b60405180910390fd5b8060108190555050565b6113a461263a565b73ffffffffffffffffffffffffffffffffffffffff166113c26116b1565b73ffffffffffffffffffffffffffffffffffffffff1614611418576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140f9061482f565b60405180910390fd5b6000611422611a0d565b905060008111611467576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145e906149af565b60405180910390fd5b6114ac601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166103e860238461149d9190614b66565b6114a79190614b35565b612c49565b6114df601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166114da611a0d565b612c49565b50565b6114ea61263a565b73ffffffffffffffffffffffffffffffffffffffff166115086116b1565b73ffffffffffffffffffffffffffffffffffffffff161461155e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115559061482f565b60405180910390fd5b600c548161156a610c76565b6115749190614adf565b11156115b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ac9061496f565b60405180910390fd5b601254816011546115c69190614adf565b1115611607576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115fe9061462f565b60405180910390fd5b60005b818110156116ad57600061161c612cfa565b90506116283382612d15565b6001601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116789190614adf565b925050819055506001601160008282546116929190614adf565b925050819055505080806116a590614d49565b91505061160a565b5050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546116ea90614ce6565b80601f016020809104026020016040519081016040528092919081815260200182805461171690614ce6565b80156117635780601f1061173857610100808354040283529160200191611763565b820191906000526020600020905b81548152906001019060200180831161174657829003601f168201915b5050505050905090565b61177561263a565b73ffffffffffffffffffffffffffffffffffffffff166117936116b1565b73ffffffffffffffffffffffffffffffffffffffff16146117e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e09061482f565b60405180910390fd5b6117f1610c76565b600c819055506117ff610c76565b600d81905550565b61180f61263a565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561187d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611874906146cf565b60405180910390fd5b806005600061188a61263a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661193761263a565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161197c91906144d2565b60405180910390a35050565b61199061263a565b73ffffffffffffffffffffffffffffffffffffffff166119ae6116b1565b73ffffffffffffffffffffffffffffffffffffffff1614611a04576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119fb9061482f565b60405180910390fd5b42601a81905550565b6000611a1761263a565b73ffffffffffffffffffffffffffffffffffffffff16611a356116b1565b73ffffffffffffffffffffffffffffffffffffffff1614611a8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a829061482f565b60405180910390fd5b47905090565b60006002811115611aa557611aa4614e4f565b5b611aad6110cd565b6002811115611abf57611abe614e4f565b5b1415611b00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af79061498f565b60405180910390fd5b600280811115611b1357611b12614e4f565b5b611b1b6110cd565b6002811115611b2d57611b2c614e4f565b5b14611b6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b649061478f565b60405180910390fd5b601154601254611b7d9190614bc0565b600c54611b8a9190614bc0565b81611b93610c76565b611b9d9190614adf565b1115611bde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd5906146ef565b60405180910390fd5b6001601354611bed9190614adf565b81601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611c389190614adf565b1115611c79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c70906147af565b60405180910390fd5b611c81611dc0565b81611c8c9190614b66565b341015611cce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc59061484f565b60405180910390fd5b60005b81811015611d5a576000611ce3612cfa565b9050611cef3382612d15565b6001601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d3f9190614adf565b92505081905550508080611d5290614d49565b915050611cd1565b5050565b611d6f611d6961263a565b83612849565b611dae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da59061492f565b60405180910390fd5b611dba84848484612d33565b50505050565b6000601054905090565b6060611dd582612724565b611e14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0b906148af565b60405180910390fd5b6000601a541415611eb157600f8054611e2c90614ce6565b80601f0160208091040260200160405190810160405280929190818152602001828054611e5890614ce6565b8015611ea55780601f10611e7a57610100808354040283529160200191611ea5565b820191906000526020600020905b815481529060010190602001808311611e8857829003601f168201915b50505050509050611f0a565b6000611ebb612d8f565b90506000815111611edb5760405180602001604052806000815250611f06565b80611ee584612e21565b604051602001611ef6929190614401565b6040516020818303038152906040525b9150505b919050565b828282611f1e33848484610def565b611f5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f549061480f565b60405180910390fd5b60006002811115611f7157611f70614e4f565b5b611f796110cd565b6002811115611f8b57611f8a614e4f565b5b1415611fcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc39061498f565b60405180910390fd5b600280811115611fdf57611fde614e4f565b5b611fe76110cd565b6002811115611ff957611ff8614e4f565b5b141561203a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612031906148ef565b60405180910390fd5b600d5487612046610c76565b6120509190614adf565b1115612091576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120889061458f565b60405180910390fd5b60135487601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546120df9190614adf565b1115612120576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121179061456f565b60405180910390fd5b612128611dc0565b876121339190614b66565b341015612175576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216c9061484f565b60405180910390fd5b60005b8781101561220157600061218a612cfa565b90506121963382612d15565b6001601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121e69190614adf565b925050819055505080806121f990614d49565b915050612178565b5050505050505050565b6000806019541415612252576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612249906149cf565b60405180910390fd5b601954905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6122f661263a565b73ffffffffffffffffffffffffffffffffffffffff166123146116b1565b73ffffffffffffffffffffffffffffffffffffffff161461236a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123619061482f565b60405180910390fd5b6000600281111561237e5761237d614e4f565b5b6123866110cd565b600281111561239857612397614e4f565b5b146123d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123cf9061464f565b60405180910390fd5b42601881905550565b6123e961263a565b73ffffffffffffffffffffffffffffffffffffffff166124076116b1565b73ffffffffffffffffffffffffffffffffffffffff161461245d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124549061482f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156124cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124c4906145ef565b60405180910390fd5b6124d681612b83565b50565b6124e161263a565b73ffffffffffffffffffffffffffffffffffffffff166124ff6116b1565b73ffffffffffffffffffffffffffffffffffffffff1614612555576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254c9061482f565b60405180910390fd5b60028081111561256857612567614e4f565b5b6125706110cd565b600281111561258257612581614e4f565b5b14156125c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ba9061486f565b60405180910390fd5b600160028111156125d7576125d6614e4f565b5b6125df6110cd565b60028111156125f1576125f0614e4f565b5b14612631576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126289061490f565b60405180910390fd5b42601981905550565b600033905090565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061270d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061271d575061271c82612f82565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612803836110fe565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061285482612724565b612893576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161288a9061470f565b60405180910390fd5b600061289e836110fe565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061290d57508373ffffffffffffffffffffffffffffffffffffffff166128f584610ad9565b73ffffffffffffffffffffffffffffffffffffffff16145b8061291e575061291d818561225a565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612947826110fe565b73ffffffffffffffffffffffffffffffffffffffff161461299d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129949061488f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a04906146af565b60405180910390fd5b612a18838383612fec565b612a23600082612790565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a739190614bc0565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612aca9190614adf565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612c6f90614456565b60006040518083038185875af1925050503d8060008114612cac576040519150601f19603f3d011682016040523d82523d6000602084013e612cb1565b606091505b5050905080612cf5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cec9061468f565b60405180910390fd5b505050565b60006001612d06610c76565b612d109190614adf565b905090565b612d2f828260405180602001604052806000815250613100565b5050565b612d3e848484612927565b612d4a8484848461315b565b612d89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d80906145cf565b60405180910390fd5b50505050565b6060600e8054612d9e90614ce6565b80601f0160208091040260200160405190810160405280929190818152602001828054612dca90614ce6565b8015612e175780601f10612dec57610100808354040283529160200191612e17565b820191906000526020600020905b815481529060010190602001808311612dfa57829003601f168201915b5050505050905090565b60606000821415612e69576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612f7d565b600082905060005b60008214612e9b578080612e8490614d49565b915050600a82612e949190614b35565b9150612e71565b60008167ffffffffffffffff811115612eb757612eb6614f0b565b5b6040519080825280601f01601f191660200182016040528015612ee95781602001600182028036833780820191505090505b5090505b60008514612f7657600182612f029190614bc0565b9150600a85612f119190614dc0565b6030612f1d9190614adf565b60f81b818381518110612f3357612f32614edc565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612f6f9190614b35565b9450612eed565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612ff78383836132f2565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561303a57613035816132f7565b613079565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613078576130778382613340565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130bc576130b7816134ad565b6130fb565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146130fa576130f9828261357e565b5b5b505050565b61310a83836135fd565b613117600084848461315b565b613156576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161314d906145cf565b60405180910390fd5b505050565b600061317c8473ffffffffffffffffffffffffffffffffffffffff166137cb565b156132e5578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026131a561263a565b8786866040518563ffffffff1660e01b81526004016131c79493929190614486565b602060405180830381600087803b1580156131e157600080fd5b505af192505050801561321257506040513d601f19601f8201168201806040525081019061320f9190613c4b565b60015b613295573d8060008114613242576040519150601f19603f3d011682016040523d82523d6000602084013e613247565b606091505b5060008151141561328d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613284906145cf565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506132ea565b600190505b949350505050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161334d846111d6565b6133579190614bc0565b905060006008600084815260200190815260200160002054905081811461343c576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016009805490506134c19190614bc0565b90506000600a60008481526020019081526020016000205490506000600983815481106134f1576134f0614edc565b5b90600052602060002001549050806009838154811061351357613512614edc565b5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a600085815260200190815260200160002060009055600980548061356257613561614ead565b5b6001900381819060005260206000200160009055905550505050565b6000613589836111d6565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561366d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613664906147cf565b60405180910390fd5b61367681612724565b156136b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136ad9061460f565b60405180910390fd5b6136c260008383612fec565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546137129190614adf565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b8280546137ea90614ce6565b90600052602060002090601f01602090048101928261380c5760008555613853565b82601f1061382557805160ff1916838001178555613853565b82800160010185558215613853579182015b82811115613852578251825591602001919060010190613837565b5b5090506138609190613864565b5090565b5b8082111561387d576000816000905550600101613865565b5090565b600061389461388f84614a2f565b614a0a565b9050828152602081018484840111156138b0576138af614f3f565b5b6138bb848285614ca4565b509392505050565b60006138d66138d184614a60565b614a0a565b9050828152602081018484840111156138f2576138f1614f3f565b5b6138fd848285614ca4565b509392505050565b6000813590506139148161586b565b92915050565b60008135905061392981615882565b92915050565b60008135905061393e81615899565b92915050565b600081359050613953816158b0565b92915050565b600081519050613968816158b0565b92915050565b600082601f83011261398357613982614f3a565b5b8135613993848260208601613881565b91505092915050565b600082601f8301126139b1576139b0614f3a565b5b81356139c18482602086016138c3565b91505092915050565b6000813590506139d9816158c7565b92915050565b6000813590506139ee816158de565b92915050565b600060208284031215613a0a57613a09614f49565b5b6000613a1884828501613905565b91505092915050565b60008060408385031215613a3857613a37614f49565b5b6000613a4685828601613905565b9250506020613a5785828601613905565b9150509250929050565b600080600060608486031215613a7a57613a79614f49565b5b6000613a8886828701613905565b9350506020613a9986828701613905565b9250506040613aaa868287016139ca565b9150509250925092565b60008060008060808587031215613ace57613acd614f49565b5b6000613adc87828801613905565b9450506020613aed87828801613905565b9350506040613afe878288016139ca565b925050606085013567ffffffffffffffff811115613b1f57613b1e614f44565b5b613b2b8782880161396e565b91505092959194509250565b60008060408385031215613b4e57613b4d614f49565b5b6000613b5c85828601613905565b9250506020613b6d8582860161391a565b9150509250929050565b60008060408385031215613b8e57613b8d614f49565b5b6000613b9c85828601613905565b9250506020613bad858286016139ca565b9150509250929050565b60008060008060808587031215613bd157613bd0614f49565b5b6000613bdf87828801613905565b9450506020613bf0878288016139df565b9350506040613c018782880161392f565b9250506060613c128782880161392f565b91505092959194509250565b600060208284031215613c3457613c33614f49565b5b6000613c4284828501613944565b91505092915050565b600060208284031215613c6157613c60614f49565b5b6000613c6f84828501613959565b91505092915050565b600060208284031215613c8e57613c8d614f49565b5b600082013567ffffffffffffffff811115613cac57613cab614f44565b5b613cb88482850161399c565b91505092915050565b600060208284031215613cd757613cd6614f49565b5b6000613ce5848285016139ca565b91505092915050565b60008060008060808587031215613d0857613d07614f49565b5b6000613d16878288016139ca565b9450506020613d27878288016139df565b9350506040613d388782880161392f565b9250506060613d498782880161392f565b91505092959194509250565b613d5e81614bf4565b82525050565b613d75613d7082614bf4565b614d92565b82525050565b613d8481614c06565b82525050565b613d9381614c12565b82525050565b613daa613da582614c12565b614da4565b82525050565b6000613dbb82614a91565b613dc58185614aa7565b9350613dd5818560208601614cb3565b613dde81614f4e565b840191505092915050565b613df281614c92565b82525050565b6000613e0382614a9c565b613e0d8185614ac3565b9350613e1d818560208601614cb3565b613e2681614f4e565b840191505092915050565b6000613e3c82614a9c565b613e468185614ad4565b9350613e56818560208601614cb3565b80840191505092915050565b6000613e6f602483614ac3565b9150613e7a82614f6c565b604082019050919050565b6000613e92601c83614ad4565b9150613e9d82614fbb565b601c82019050919050565b6000613eb5602983614ac3565b9150613ec082614fe4565b604082019050919050565b6000613ed8602b83614ac3565b9150613ee382615033565b604082019050919050565b6000613efb603283614ac3565b9150613f0682615082565b604082019050919050565b6000613f1e602683614ac3565b9150613f29826150d1565b604082019050919050565b6000613f41601c83614ac3565b9150613f4c82615120565b602082019050919050565b6000613f64603383614ac3565b9150613f6f82615149565b604082019050919050565b6000613f87601883614ac3565b9150613f9282615198565b602082019050919050565b6000613faa601b83614ac3565b9150613fb5826151c1565b602082019050919050565b6000613fcd601483614ac3565b9150613fd8826151ea565b602082019050919050565b6000613ff0602483614ac3565b9150613ffb82615213565b604082019050919050565b6000614013601983614ac3565b915061401e82615262565b602082019050919050565b6000614036601e83614ac3565b91506140418261528b565b602082019050919050565b6000614059602c83614ac3565b9150614064826152b4565b604082019050919050565b600061407c603883614ac3565b915061408782615303565b604082019050919050565b600061409f602a83614ac3565b91506140aa82615352565b604082019050919050565b60006140c2602983614ac3565b91506140cd826153a1565b604082019050919050565b60006140e5601c83614ac3565b91506140f0826153f0565b602082019050919050565b6000614108602483614ac3565b915061411382615419565b604082019050919050565b600061412b602083614ac3565b915061413682615468565b602082019050919050565b600061414e602c83614ac3565b915061415982615491565b604082019050919050565b6000614171600583614ad4565b915061417c826154e0565b600582019050919050565b6000614194601183614ac3565b915061419f82615509565b602082019050919050565b60006141b7602083614ac3565b91506141c282615532565b602082019050919050565b60006141da603183614ac3565b91506141e58261555b565b604082019050919050565b60006141fd601783614ac3565b9150614208826155aa565b602082019050919050565b6000614220602983614ac3565b915061422b826155d3565b604082019050919050565b6000614243602f83614ac3565b915061424e82615622565b604082019050919050565b6000614266602183614ac3565b915061427182615671565b604082019050919050565b6000614289601383614ac3565b9150614294826156c0565b602082019050919050565b60006142ac601883614ac3565b91506142b7826156e9565b602082019050919050565b60006142cf600083614ab8565b91506142da82615712565b600082019050919050565b60006142f2603183614ac3565b91506142fd82615715565b604082019050919050565b6000614315602c83614ac3565b915061432082615764565b604082019050919050565b6000614338601683614ac3565b9150614343826157b3565b602082019050919050565b600061435b601583614ac3565b9150614366826157dc565b602082019050919050565b600061437e601e83614ac3565b915061438982615805565b602082019050919050565b60006143a1601f83614ac3565b91506143ac8261582e565b602082019050919050565b6143c081614c7b565b82525050565b6143cf81614c85565b82525050565b60006143e18285613d64565b6014820191506143f18284613d64565b6014820191508190509392505050565b600061440d8285613e31565b91506144198284613e31565b915061442482614164565b91508190509392505050565b600061443b82613e85565b91506144478284613d99565b60208201915081905092915050565b6000614461826142c2565b9150819050919050565b60006020820190506144806000830184613d55565b92915050565b600060808201905061449b6000830187613d55565b6144a86020830186613d55565b6144b560408301856143b7565b81810360608301526144c78184613db0565b905095945050505050565b60006020820190506144e76000830184613d7b565b92915050565b60006080820190506145026000830187613d8a565b61450f60208301866143c6565b61451c6040830185613d8a565b6145296060830184613d8a565b95945050505050565b60006020820190506145476000830184613de9565b92915050565b600060208201905081810360008301526145678184613df8565b905092915050565b6000602082019050818103600083015261458881613e62565b9050919050565b600060208201905081810360008301526145a881613ea8565b9050919050565b600060208201905081810360008301526145c881613ecb565b9050919050565b600060208201905081810360008301526145e881613eee565b9050919050565b6000602082019050818103600083015261460881613f11565b9050919050565b6000602082019050818103600083015261462881613f34565b9050919050565b6000602082019050818103600083015261464881613f57565b9050919050565b6000602082019050818103600083015261466881613f7a565b9050919050565b6000602082019050818103600083015261468881613f9d565b9050919050565b600060208201905081810360008301526146a881613fc0565b9050919050565b600060208201905081810360008301526146c881613fe3565b9050919050565b600060208201905081810360008301526146e881614006565b9050919050565b6000602082019050818103600083015261470881614029565b9050919050565b600060208201905081810360008301526147288161404c565b9050919050565b600060208201905081810360008301526147488161406f565b9050919050565b6000602082019050818103600083015261476881614092565b9050919050565b60006020820190508181036000830152614788816140b5565b9050919050565b600060208201905081810360008301526147a8816140d8565b9050919050565b600060208201905081810360008301526147c8816140fb565b9050919050565b600060208201905081810360008301526147e88161411e565b9050919050565b6000602082019050818103600083015261480881614141565b9050919050565b6000602082019050818103600083015261482881614187565b9050919050565b60006020820190508181036000830152614848816141aa565b9050919050565b60006020820190508181036000830152614868816141cd565b9050919050565b60006020820190508181036000830152614888816141f0565b9050919050565b600060208201905081810360008301526148a881614213565b9050919050565b600060208201905081810360008301526148c881614236565b9050919050565b600060208201905081810360008301526148e881614259565b9050919050565b600060208201905081810360008301526149088161427c565b9050919050565b600060208201905081810360008301526149288161429f565b9050919050565b60006020820190508181036000830152614948816142e5565b9050919050565b6000602082019050818103600083015261496881614308565b9050919050565b600060208201905081810360008301526149888161432b565b9050919050565b600060208201905081810360008301526149a88161434e565b9050919050565b600060208201905081810360008301526149c881614371565b9050919050565b600060208201905081810360008301526149e881614394565b9050919050565b6000602082019050614a0460008301846143b7565b92915050565b6000614a14614a25565b9050614a208282614d18565b919050565b6000604051905090565b600067ffffffffffffffff821115614a4a57614a49614f0b565b5b614a5382614f4e565b9050602081019050919050565b600067ffffffffffffffff821115614a7b57614a7a614f0b565b5b614a8482614f4e565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614aea82614c7b565b9150614af583614c7b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614b2a57614b29614df1565b5b828201905092915050565b6000614b4082614c7b565b9150614b4b83614c7b565b925082614b5b57614b5a614e20565b5b828204905092915050565b6000614b7182614c7b565b9150614b7c83614c7b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614bb557614bb4614df1565b5b828202905092915050565b6000614bcb82614c7b565b9150614bd683614c7b565b925082821015614be957614be8614df1565b5b828203905092915050565b6000614bff82614c5b565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000819050614c5682615857565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000614c9d82614c48565b9050919050565b82818337600083830152505050565b60005b83811015614cd1578082015181840152602081019050614cb6565b83811115614ce0576000848401525b50505050565b60006002820490506001821680614cfe57607f821691505b60208210811415614d1257614d11614e7e565b5b50919050565b614d2182614f4e565b810181811067ffffffffffffffff82111715614d4057614d3f614f0b565b5b80604052505050565b6000614d5482614c7b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614d8757614d86614df1565b5b600182019050919050565b6000614d9d82614dae565b9050919050565b6000819050919050565b6000614db982614f5f565b9050919050565b6000614dcb82614c7b565b9150614dd683614c7b565b925082614de657614de5614e20565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4f6e6c792032204d696e74732061726520616c6c6f776564207065722041646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f4e6f7420656e6f756768204e465473206c65667420746f206d696e7420696e2060008201527f50726573616c652e2e0000000000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4e6f7420656e6f756768205265736572766564204e46547320666f722043726560008201527f61746f72206c65667420746f206d696e742e2e00000000000000000000000000602082015250565b7f53616c652068617320616c7265616479206f70656e6564210000000000000000600082015250565b7f50726573616c6520686173206e6f74206f70656e656420796574210000000000600082015250565b7f4661696c656420746f2073656e64204574686572000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4e6f7420656e6f756768204e465473206c65667420746f206d696e742e2e0000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f5075626c69632053616c6520696e206e6f74206f70656e207965742100000000600082015250565b7f4f6e6c792033204d696e74732061726520616c6c6f776564207065722041646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f496e76616c6964205369676e6174757265000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f496e73756666696369656e742046756e647320746f206d696e7420746869732060008201527f6e756d626572206f6620546f6b656e7321000000000000000000000000000000602082015250565b7f416c726561647920696e205075626c69632053616c6521000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f50726573616c652068617320636c6f7365642100000000000000000000000000600082015250565b7f53616c6520686173206e6f74206f70656e656420796574210000000000000000600082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4e6f204e465473206c65667420746f206d696e742e2e00000000000000000000600082015250565b7f53616c6520696e206e6f74206f70656e20796574210000000000000000000000600082015250565b7f42616c616e6365206d7573742062652067726561746572207468616e20300000600082015250565b7f5075626c69632053616c6520686173206e6f74206f70656e6564207965742100600082015250565b6003811061586857615867614e4f565b5b50565b61587481614bf4565b811461587f57600080fd5b50565b61588b81614c06565b811461589657600080fd5b50565b6158a281614c12565b81146158ad57600080fd5b50565b6158b981614c1c565b81146158c457600080fd5b50565b6158d081614c7b565b81146158db57600080fd5b50565b6158e781614c85565b81146158f257600080fd5b5056fea2646970667358221220c2900dde352fadf445d17ddcf4f3e2c2c61087e6aeee4a63670136713314a61164736f6c63430008070033

Deployed Bytecode Sourcemap

41840:10168:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44430:8;;;50128:87;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35707:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23428:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24744:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24267:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36347:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25634:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36015:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51259:170;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43219:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45504:306;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44657:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26044:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50295:124;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36537:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42819:72;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51474:298;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23122:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42904:72;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22852:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4535:94;;;;;;;;;;;;;:::i;:::-;;51898:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50493:292;;;;;;;;;;;;;:::i;:::-;;48567:511;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3884:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23597:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49756:139;;;;;;;;;;;;;:::i;:::-;;25037:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49615:82;;;;;;;;;;;;;:::i;:::-;;49945:109;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46970:943;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26300:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51809:81;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47988:487;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45998:964;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51029:183;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25403:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49128:172;;;;;;;;;;;;;:::i;:::-;;4784:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49346:257;;;;;;;;;;;;;:::i;:::-;;50128:87;4115:12;:10;:12::i;:::-;4104:23;;:7;:5;:7::i;:::-;:23;;;4096:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50201:6:::1;50193:5;;:14;;;;;;;;;;;;;;;;;;50128:87:::0;:::o;35707:224::-;35809:4;35848:35;35833:50;;;:11;:50;;;;:90;;;;35887:36;35911:11;35887:23;:36::i;:::-;35833:90;35826:97;;35707:224;;;:::o;23428:100::-;23482:13;23515:5;23508:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23428:100;:::o;24744:221::-;24820:7;24848:16;24856:7;24848;:16::i;:::-;24840:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24933:15;:24;24949:7;24933:24;;;;;;;;;;;;;;;;;;;;;24926:31;;24744:221;;;:::o;24267:411::-;24348:13;24364:23;24379:7;24364:14;:23::i;:::-;24348:39;;24412:5;24406:11;;:2;:11;;;;24398:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;24506:5;24490:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;24515:37;24532:5;24539:12;:10;:12::i;:::-;24515:16;:37::i;:::-;24490:62;24468:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;24649:21;24658:2;24662:7;24649:8;:21::i;:::-;24337:341;24267:411;;:::o;36347:113::-;36408:7;36435:10;:17;;;;36428:24;;36347:113;:::o;25634:339::-;25829:41;25848:12;:10;:12::i;:::-;25862:7;25829:18;:41::i;:::-;25821:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25937:28;25947:4;25953:2;25957:7;25937:9;:28::i;:::-;25634:339;;;:::o;36015:256::-;36112:7;36148:23;36165:5;36148:16;:23::i;:::-;36140:5;:31;36132:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;36237:12;:19;36250:5;36237:19;;;;;;;;;;;;;;;:26;36257:5;36237:26;;;;;;;;;;;;36230:33;;36015:256;;;;:::o;51259:170::-;51304:7;51353:1;51332:17;;:22;;51324:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;51404:17;;51397:24;;51259:170;:::o;43219:50::-;;;;;;;;;;;;;;;;;:::o;45504:306::-;45603:4;45620:12;45670:4;45677;45645:37;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45635:48;;;;;;45620:63;;45710:92;45783:4;45730:58;;;;;;;;:::i;:::-;;;;;;;;;;;;;45720:69;;;;;;45791:2;45795;45799;45710:92;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45701:101;;:5;;;;;;;;;;;:101;;;45694:108;;;45504:306;;;;;;:::o;44657:109::-;4115:12;:10;:12::i;:::-;4104:23;;:7;:5;:7::i;:::-;:23;;;4096:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44750:8:::1;44732:15;:26;;;;;;;;;;;;:::i;:::-;;44657:109:::0;:::o;26044:185::-;26182:39;26199:4;26205:2;26209:7;26182:39;;;;;;;;;;;;:16;:39::i;:::-;26044:185;;;:::o;50295:124::-;50354:4;4115:12;:10;:12::i;:::-;4104:23;;:7;:5;:7::i;:::-;:23;;;4096:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50397:14:::1;;50378:16;;:33;;;;:::i;:::-;50371:40;;50295:124:::0;:::o;36537:233::-;36612:7;36648:30;:28;:30::i;:::-;36640:5;:38;36632:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;36745:10;36756:5;36745:17;;;;;;;;:::i;:::-;;;;;;;;;;36738:24;;36537:233;;;:::o;42819:72::-;;;;;;;;;;;;;:::o;51474:298::-;51515:5;51558:1;51537:17;;:22;51533:232;;;51583:12;51576:19;;;;51533:232;51650:1;51626:20;;:25;51622:143;;;51675:13;51668:20;;;;51622:143;51737:16;51730:23;;51474:298;;:::o;23122:239::-;23194:7;23214:13;23230:7;:16;23238:7;23230:16;;;;;;;;;;;;;;;;;;;;;23214:32;;23282:1;23265:19;;:5;:19;;;;23257:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23348:5;23341:12;;;23122:239;;;:::o;42904:72::-;;;;;;;;;;;;;:::o;22852:208::-;22924:7;22969:1;22952:19;;:5;:19;;;;22944:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;23036:9;:16;23046:5;23036:16;;;;;;;;;;;;;;;;23029:23;;22852:208;;;:::o;4535:94::-;4115:12;:10;:12::i;:::-;4104:23;;:7;:5;:7::i;:::-;:23;;;4096:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4600:21:::1;4618:1;4600:9;:21::i;:::-;4535:94::o:0;51898:96::-;4115:12;:10;:12::i;:::-;4104:23;;:7;:5;:7::i;:::-;:23;;;4096:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51979:7:::1;51967:9;:19;;;;51898:96:::0;:::o;50493:292::-;4115:12;:10;:12::i;:::-;4104:23;;:7;:5;:7::i;:::-;:23;;;4096:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50544:12:::1;50559:16;:14;:16::i;:::-;50544:31;;50604:1;50594:7;:11;50586:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;50661:56;50678:12;;;;;;;;;;;50711:4;50705:2;50695:7;:12;;;;:::i;:::-;50694:21;;;;:::i;:::-;50661:8;:56::i;:::-;50728:49;50745:12;;;;;;;;;;;50760:16;:14;:16::i;:::-;50728:8;:49::i;:::-;50533:252;50493:292::o:0;48567:511::-;4115:12;:10;:12::i;:::-;4104:23;;:7;:5;:7::i;:::-;:23;;;4096:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48667:14:::1;;48657:6;48641:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:40;;48633:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;48779:16;;48769:6;48752:14;;:23;;;;:::i;:::-;:43;;48744:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;48867:9;48862:209;48886:6;48882:1;:10;48862:209;;;48914:11;48928:9;:7;:9::i;:::-;48914:23;;48952:26;48962:10;48974:3;48952:9;:26::i;:::-;49024:1;48993:15;:27;49009:10;48993:27;;;;;;;;;;;;;;;;:32;;;;;;;:::i;:::-;;;;;;;;49058:1;49040:14;;:19;;;;;;;:::i;:::-;;;;;;;;48899:172;48894:3;;;;;:::i;:::-;;;;48862:209;;;;48567:511:::0;:::o;3884:87::-;3930:7;3957:6;;;;;;;;;;;3950:13;;3884:87;:::o;23597:104::-;23653:13;23686:7;23679:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23597:104;:::o;49756:139::-;4115:12;:10;:12::i;:::-;4104:23;;:7;:5;:7::i;:::-;:23;;;4096:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49831:13:::1;:11;:13::i;:::-;49814:14;:30;;;;49874:13;:11;:13::i;:::-;49855:16;:32;;;;49756:139::o:0;25037:295::-;25152:12;:10;:12::i;:::-;25140:24;;:8;:24;;;;25132:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;25252:8;25207:18;:32;25226:12;:10;:12::i;:::-;25207:32;;;;;;;;;;;;;;;:42;25240:8;25207:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;25305:8;25276:48;;25291:12;:10;:12::i;:::-;25276:48;;;25315:8;25276:48;;;;;;:::i;:::-;;;;;;;;25037:295;;:::o;49615:82::-;4115:12;:10;:12::i;:::-;4104:23;;:7;:5;:7::i;:::-;:23;;;4096:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49674:15:::1;49661:10;:28;;;;49615:82::o:0;49945:109::-;50001:4;4115:12;:10;:12::i;:::-;4104:23;;:7;:5;:7::i;:::-;:23;;;4096:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50025:21:::1;50018:28;;49945:109:::0;:::o;46970:943::-;47061:12;47046:27;;;;;;;;:::i;:::-;;:11;:9;:11::i;:::-;:27;;;;;;;;:::i;:::-;;;;47038:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;47133:16;47118:31;;;;;;;;:::i;:::-;;:11;:9;:11::i;:::-;:31;;;;;;;;:::i;:::-;;;47110:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;47265:14;;47245:16;;:34;;;;:::i;:::-;47227:14;;:53;;;;:::i;:::-;47217:6;47201:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:79;;47193:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;47385:1;47374:8;;:12;;;;:::i;:::-;47364:6;47334:15;:27;47350:10;47334:27;;;;;;;;;;;;;;;;:36;;;;:::i;:::-;:52;;47326:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;47468:10;:8;:10::i;:::-;47459:6;:19;;;;:::i;:::-;47446:9;:32;;47438:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;47734:9;47729:175;47753:6;47749:1;:10;47729:175;;;47781:11;47795:9;:7;:9::i;:::-;47781:23;;47819:26;47829:10;47841:3;47819:9;:26::i;:::-;47891:1;47860:15;:27;47876:10;47860:27;;;;;;;;;;;;;;;;:32;;;;;;;:::i;:::-;;;;;;;;47766:138;47761:3;;;;;:::i;:::-;;;;47729:175;;;;46970:943;:::o;26300:328::-;26475:41;26494:12;:10;:12::i;:::-;26508:7;26475:18;:41::i;:::-;26467:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;26581:39;26595:4;26601:2;26605:7;26614:5;26581:13;:39::i;:::-;26300:328;;;;:::o;51809:81::-;51849:4;51873:9;;51866:16;;51809:81;:::o;47988:487::-;48062:13;48096:17;48104:8;48096:7;:17::i;:::-;48088:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;48196:1;48182:10;;:15;48178:266;;;48221:13;48214:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48178:266;48280:21;48304:10;:8;:10::i;:::-;48280:34;;48360:1;48342:7;48336:21;:25;:96;;;;;;;;;;;;;;;;;48388:7;48397:19;:8;:17;:19::i;:::-;48371:55;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48336:96;48329:103;;;47988:487;;;;:::o;45998:964::-;46085:2;46090;46094;45006:41;45027:10;45038:2;45041;45044;45006:20;:41::i;:::-;44997:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;46149:12:::1;46134:27;;;;;;;;:::i;:::-;;:11;:9;:11::i;:::-;:27;;;;;;;;:::i;:::-;;;;46126:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;46221:16;46206:31:::0;::::1;;;;;;;:::i;:::-;;:11;:9;:11::i;:::-;:31;;;;;;;;:::i;:::-;;;;46198:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;46306:16;;46296:6;46280:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:42;;46272:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;46427:8;;46417:6;46387:15;:27;46403:10;46387:27;;;;;;;;;;;;;;;;:36;;;;:::i;:::-;:48;;46379:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;46517:10;:8;:10::i;:::-;46508:6;:19;;;;:::i;:::-;46495:9;:32;;46487:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;46783:9;46778:175;46802:6;46798:1;:10;46778:175;;;46830:11;46844:9;:7;:9::i;:::-;46830:23;;46868:26;46878:10;46890:3;46868:9;:26::i;:::-;46940:1;46909:15;:27;46925:10;46909:27;;;;;;;;;;;;;;;;:32;;;;;;;:::i;:::-;;;;;;;;46815:138;46810:3;;;;;:::i;:::-;;;;46778:175;;;;45998:964:::0;;;;;;;:::o;51029:183::-;51077:7;51129:1;51105:20;;:25;;51097:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;51184:20;;51177:27;;51029:183;:::o;25403:164::-;25500:4;25524:18;:25;25543:5;25524:25;;;;;;;;;;;;;;;:35;25550:8;25524:35;;;;;;;;;;;;;;;;;;;;;;;;;25517:42;;25403:164;;;;:::o;49128:172::-;4115:12;:10;:12::i;:::-;4104:23;;:7;:5;:7::i;:::-;:23;;;4096:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49205:12:::1;49190:27;;;;;;;;:::i;:::-;;:11;:9;:11::i;:::-;:27;;;;;;;;:::i;:::-;;;49182:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;49277:15;49257:17;:35;;;;49128:172::o:0;4784:192::-;4115:12;:10;:12::i;:::-;4104:23;;:7;:5;:7::i;:::-;:23;;;4096:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4893:1:::1;4873:22;;:8;:22;;;;4865:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4949:19;4959:8;4949:9;:19::i;:::-;4784:192:::0;:::o;49346:257::-;4115:12;:10;:12::i;:::-;4104:23;;:7;:5;:7::i;:::-;:23;;;4096:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49426:16:::1;49411:31:::0;::::1;;;;;;;:::i;:::-;;:11;:9;:11::i;:::-;:31;;;;;;;;:::i;:::-;;;;49403:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;49504:13;49489:28;;;;;;;;:::i;:::-;;:11;:9;:11::i;:::-;:28;;;;;;;;:::i;:::-;;;49481:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;49580:15;49557:20;:38;;;;49346:257::o:0;2701:98::-;2754:7;2781:10;2774:17;;2701:98;:::o;22477:305::-;22579:4;22631:25;22616:40;;;:11;:40;;;;:105;;;;22688:33;22673:48;;;:11;:48;;;;22616:105;:158;;;;22738:36;22762:11;22738:23;:36::i;:::-;22616:158;22596:178;;22477:305;;;:::o;28138:127::-;28203:4;28255:1;28227:30;;:7;:16;28235:7;28227:16;;;;;;;;;;;;;;;;;;;;;:30;;;;28220:37;;28138:127;;;:::o;32120:174::-;32222:2;32195:15;:24;32211:7;32195:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;32278:7;32274:2;32240:46;;32249:23;32264:7;32249:14;:23::i;:::-;32240:46;;;;;;;;;;;;32120:174;;:::o;28432:348::-;28525:4;28550:16;28558:7;28550;:16::i;:::-;28542:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;28626:13;28642:23;28657:7;28642:14;:23::i;:::-;28626:39;;28695:5;28684:16;;:7;:16;;;:51;;;;28728:7;28704:31;;:20;28716:7;28704:11;:20::i;:::-;:31;;;28684:51;:87;;;;28739:32;28756:5;28763:7;28739:16;:32::i;:::-;28684:87;28676:96;;;28432:348;;;;:::o;31424:578::-;31583:4;31556:31;;:23;31571:7;31556:14;:23::i;:::-;:31;;;31548:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;31666:1;31652:16;;:2;:16;;;;31644:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;31722:39;31743:4;31749:2;31753:7;31722:20;:39::i;:::-;31826:29;31843:1;31847:7;31826:8;:29::i;:::-;31887:1;31868:9;:15;31878:4;31868:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;31916:1;31899:9;:13;31909:2;31899:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;31947:2;31928:7;:16;31936:7;31928:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;31986:7;31982:2;31967:27;;31976:4;31967:27;;;;;;;;;;;;31424:578;;;:::o;4984:173::-;5040:16;5059:6;;;;;;;;;;;5040:25;;5085:8;5076:6;;:17;;;;;;;;;;;;;;;;;;5140:8;5109:40;;5130:8;5109:40;;;;;;;;;;;;5029:128;4984:173;:::o;50797:181::-;50875:9;50890:8;:13;;50911:6;50890:32;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50874:48;;;50941:4;50933:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;50863:115;50797:181;;:::o;44822:93::-;44863:7;44906:1;44890:13;:11;:13::i;:::-;:17;;;;:::i;:::-;44883:24;;44822:93;:::o;29122:110::-;29198:26;29208:2;29212:7;29198:26;;;;;;;;;;;;:9;:26::i;:::-;29122:110;;:::o;27510:315::-;27667:28;27677:4;27683:2;27687:7;27667:9;:28::i;:::-;27714:48;27737:4;27743:2;27747:7;27756:5;27714:22;:48::i;:::-;27706:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;27510:315;;;;:::o;44483:116::-;44543:13;44576:15;44569:22;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44483:116;:::o;344:723::-;400:13;630:1;621:5;:10;617:53;;;648:10;;;;;;;;;;;;;;;;;;;;;617:53;680:12;695:5;680:20;;711:14;736:78;751:1;743:4;:9;736:78;;769:8;;;;;:::i;:::-;;;;800:2;792:10;;;;;:::i;:::-;;;736:78;;;824:19;856:6;846:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;824:39;;874:154;890:1;881:5;:10;874:154;;918:1;908:11;;;;;:::i;:::-;;;985:2;977:5;:10;;;;:::i;:::-;964:2;:24;;;;:::i;:::-;951:39;;934:6;941;934:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1014:2;1005:11;;;;;:::i;:::-;;;874:154;;;1052:6;1038:21;;;;;344:723;;;;:::o;15748:157::-;15833:4;15872:25;15857:40;;;:11;:40;;;;15850:47;;15748:157;;;:::o;37383:574::-;37492:45;37519:4;37525:2;37529:7;37492:26;:45::i;:::-;37570:1;37554:18;;:4;:18;;;37550:197;;;37589:40;37621:7;37589:31;:40::i;:::-;37550:197;;;37669:2;37661:10;;:4;:10;;;37657:90;;37688:47;37721:4;37727:7;37688:32;:47::i;:::-;37657:90;37550:197;37775:1;37761:16;;:2;:16;;;37757:193;;;37794:45;37831:7;37794:36;:45::i;:::-;37757:193;;;37877:4;37871:10;;:2;:10;;;37867:83;;37898:40;37926:2;37930:7;37898:27;:40::i;:::-;37867:83;37757:193;37383:574;;;:::o;29459:321::-;29589:18;29595:2;29599:7;29589:5;:18::i;:::-;29640:54;29671:1;29675:2;29679:7;29688:5;29640:22;:54::i;:::-;29618:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;29459:321;;;:::o;32859:799::-;33014:4;33035:15;:2;:13;;;:15::i;:::-;33031:620;;;33087:2;33071:36;;;33108:12;:10;:12::i;:::-;33122:4;33128:7;33137:5;33071:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;33067:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33330:1;33313:6;:13;:18;33309:272;;;33356:60;;;;;;;;;;:::i;:::-;;;;;;;;33309:272;33531:6;33525:13;33516:6;33512:2;33508:15;33501:38;33067:529;33204:41;;;33194:51;;;:6;:51;;;;33187:58;;;;;33031:620;33635:4;33628:11;;32859:799;;;;;;;:::o;34230:126::-;;;;:::o;38680:164::-;38784:10;:17;;;;38757:15;:24;38773:7;38757:24;;;;;;;;;;;:44;;;;38812:10;38828:7;38812:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38680:164;:::o;39471:988::-;39737:22;39787:1;39762:22;39779:4;39762:16;:22::i;:::-;:26;;;;:::i;:::-;39737:51;;39799:18;39820:17;:26;39838:7;39820:26;;;;;;;;;;;;39799:47;;39967:14;39953:10;:28;39949:328;;39998:19;40020:12;:18;40033:4;40020:18;;;;;;;;;;;;;;;:34;40039:14;40020:34;;;;;;;;;;;;39998:56;;40104:11;40071:12;:18;40084:4;40071:18;;;;;;;;;;;;;;;:30;40090:10;40071:30;;;;;;;;;;;:44;;;;40221:10;40188:17;:30;40206:11;40188:30;;;;;;;;;;;:43;;;;39983:294;39949:328;40373:17;:26;40391:7;40373:26;;;;;;;;;;;40366:33;;;40417:12;:18;40430:4;40417:18;;;;;;;;;;;;;;;:34;40436:14;40417:34;;;;;;;;;;;40410:41;;;39552:907;;39471:988;;:::o;40754:1079::-;41007:22;41052:1;41032:10;:17;;;;:21;;;;:::i;:::-;41007:46;;41064:18;41085:15;:24;41101:7;41085:24;;;;;;;;;;;;41064:45;;41436:19;41458:10;41469:14;41458:26;;;;;;;;:::i;:::-;;;;;;;;;;41436:48;;41522:11;41497:10;41508;41497:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;41633:10;41602:15;:28;41618:11;41602:28;;;;;;;;;;;:41;;;;41774:15;:24;41790:7;41774:24;;;;;;;;;;;41767:31;;;41809:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;40825:1008;;;40754:1079;:::o;38258:221::-;38343:14;38360:20;38377:2;38360:16;:20::i;:::-;38343:37;;38418:7;38391:12;:16;38404:2;38391:16;;;;;;;;;;;;;;;:24;38408:6;38391:24;;;;;;;;;;;:34;;;;38465:6;38436:17;:26;38454:7;38436:26;;;;;;;;;;;:35;;;;38332:147;38258:221;;:::o;30116:382::-;30210:1;30196:16;;:2;:16;;;;30188:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;30269:16;30277:7;30269;:16::i;:::-;30268:17;30260:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;30331:45;30360:1;30364:2;30368:7;30331:20;:45::i;:::-;30406:1;30389:9;:13;30399:2;30389:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30437:2;30418:7;:16;30426:7;30418:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30482:7;30478:2;30457:33;;30474:1;30457:33;;;;;;;;;;;;30116:382;;:::o;5901:387::-;5961:4;6169:12;6236:7;6224:20;6216:28;;6279:1;6272:4;:8;6265:15;;;5901:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:139::-;1171:5;1209:6;1196:20;1187:29;;1225:33;1252:5;1225:33;:::i;:::-;1125:139;;;;:::o;1270:137::-;1315:5;1353:6;1340:20;1331:29;;1369:32;1395:5;1369:32;:::i;:::-;1270:137;;;;:::o;1413:141::-;1469:5;1500:6;1494:13;1485:22;;1516:32;1542:5;1516:32;:::i;:::-;1413:141;;;;:::o;1573:338::-;1628:5;1677:3;1670:4;1662:6;1658:17;1654:27;1644:122;;1685:79;;:::i;:::-;1644:122;1802:6;1789:20;1827:78;1901:3;1893:6;1886:4;1878:6;1874:17;1827:78;:::i;:::-;1818:87;;1634:277;1573:338;;;;:::o;1931:340::-;1987:5;2036:3;2029:4;2021:6;2017:17;2013:27;2003:122;;2044:79;;:::i;:::-;2003:122;2161:6;2148:20;2186:79;2261:3;2253:6;2246:4;2238:6;2234:17;2186:79;:::i;:::-;2177:88;;1993:278;1931:340;;;;:::o;2277:139::-;2323:5;2361:6;2348:20;2339:29;;2377:33;2404:5;2377:33;:::i;:::-;2277:139;;;;:::o;2422:135::-;2466:5;2504:6;2491:20;2482:29;;2520:31;2545:5;2520:31;:::i;:::-;2422:135;;;;:::o;2563:329::-;2622:6;2671:2;2659:9;2650:7;2646:23;2642:32;2639:119;;;2677:79;;:::i;:::-;2639:119;2797:1;2822:53;2867:7;2858:6;2847:9;2843:22;2822:53;:::i;:::-;2812:63;;2768:117;2563:329;;;;:::o;2898:474::-;2966:6;2974;3023:2;3011:9;3002:7;2998:23;2994:32;2991:119;;;3029:79;;:::i;:::-;2991:119;3149:1;3174:53;3219:7;3210:6;3199:9;3195:22;3174:53;:::i;:::-;3164:63;;3120:117;3276:2;3302:53;3347:7;3338:6;3327:9;3323:22;3302:53;:::i;:::-;3292:63;;3247:118;2898:474;;;;;:::o;3378:619::-;3455:6;3463;3471;3520:2;3508:9;3499:7;3495:23;3491:32;3488:119;;;3526:79;;:::i;:::-;3488:119;3646:1;3671:53;3716:7;3707:6;3696:9;3692:22;3671:53;:::i;:::-;3661:63;;3617:117;3773:2;3799:53;3844:7;3835:6;3824:9;3820:22;3799:53;:::i;:::-;3789:63;;3744:118;3901:2;3927:53;3972:7;3963:6;3952:9;3948:22;3927:53;:::i;:::-;3917:63;;3872:118;3378:619;;;;;:::o;4003:943::-;4098:6;4106;4114;4122;4171:3;4159:9;4150:7;4146:23;4142:33;4139:120;;;4178:79;;:::i;:::-;4139:120;4298:1;4323:53;4368:7;4359:6;4348:9;4344:22;4323:53;:::i;:::-;4313:63;;4269:117;4425:2;4451:53;4496:7;4487:6;4476:9;4472:22;4451:53;:::i;:::-;4441:63;;4396:118;4553:2;4579:53;4624:7;4615:6;4604:9;4600:22;4579:53;:::i;:::-;4569:63;;4524:118;4709:2;4698:9;4694:18;4681:32;4740:18;4732:6;4729:30;4726:117;;;4762:79;;:::i;:::-;4726:117;4867:62;4921:7;4912:6;4901:9;4897:22;4867:62;:::i;:::-;4857:72;;4652:287;4003:943;;;;;;;:::o;4952:468::-;5017:6;5025;5074:2;5062:9;5053:7;5049:23;5045:32;5042:119;;;5080:79;;:::i;:::-;5042:119;5200:1;5225:53;5270:7;5261:6;5250:9;5246:22;5225:53;:::i;:::-;5215:63;;5171:117;5327:2;5353:50;5395:7;5386:6;5375:9;5371:22;5353:50;:::i;:::-;5343:60;;5298:115;4952:468;;;;;:::o;5426:474::-;5494:6;5502;5551:2;5539:9;5530:7;5526:23;5522:32;5519:119;;;5557:79;;:::i;:::-;5519:119;5677:1;5702:53;5747:7;5738:6;5727:9;5723:22;5702:53;:::i;:::-;5692:63;;5648:117;5804:2;5830:53;5875:7;5866:6;5855:9;5851:22;5830:53;:::i;:::-;5820:63;;5775:118;5426:474;;;;;:::o;5906:761::-;5990:6;5998;6006;6014;6063:3;6051:9;6042:7;6038:23;6034:33;6031:120;;;6070:79;;:::i;:::-;6031:120;6190:1;6215:53;6260:7;6251:6;6240:9;6236:22;6215:53;:::i;:::-;6205:63;;6161:117;6317:2;6343:51;6386:7;6377:6;6366:9;6362:22;6343:51;:::i;:::-;6333:61;;6288:116;6443:2;6469:53;6514:7;6505:6;6494:9;6490:22;6469:53;:::i;:::-;6459:63;;6414:118;6571:2;6597:53;6642:7;6633:6;6622:9;6618:22;6597:53;:::i;:::-;6587:63;;6542:118;5906:761;;;;;;;:::o;6673:327::-;6731:6;6780:2;6768:9;6759:7;6755:23;6751:32;6748:119;;;6786:79;;:::i;:::-;6748:119;6906:1;6931:52;6975:7;6966:6;6955:9;6951:22;6931:52;:::i;:::-;6921:62;;6877:116;6673:327;;;;:::o;7006:349::-;7075:6;7124:2;7112:9;7103:7;7099:23;7095:32;7092:119;;;7130:79;;:::i;:::-;7092:119;7250:1;7275:63;7330:7;7321:6;7310:9;7306:22;7275:63;:::i;:::-;7265:73;;7221:127;7006:349;;;;:::o;7361:509::-;7430:6;7479:2;7467:9;7458:7;7454:23;7450:32;7447:119;;;7485:79;;:::i;:::-;7447:119;7633:1;7622:9;7618:17;7605:31;7663:18;7655:6;7652:30;7649:117;;;7685:79;;:::i;:::-;7649:117;7790:63;7845:7;7836:6;7825:9;7821:22;7790:63;:::i;:::-;7780:73;;7576:287;7361:509;;;;:::o;7876:329::-;7935:6;7984:2;7972:9;7963:7;7959:23;7955:32;7952:119;;;7990:79;;:::i;:::-;7952:119;8110:1;8135:53;8180:7;8171:6;8160:9;8156:22;8135:53;:::i;:::-;8125:63;;8081:117;7876:329;;;;:::o;8211:761::-;8295:6;8303;8311;8319;8368:3;8356:9;8347:7;8343:23;8339:33;8336:120;;;8375:79;;:::i;:::-;8336:120;8495:1;8520:53;8565:7;8556:6;8545:9;8541:22;8520:53;:::i;:::-;8510:63;;8466:117;8622:2;8648:51;8691:7;8682:6;8671:9;8667:22;8648:51;:::i;:::-;8638:61;;8593:116;8748:2;8774:53;8819:7;8810:6;8799:9;8795:22;8774:53;:::i;:::-;8764:63;;8719:118;8876:2;8902:53;8947:7;8938:6;8927:9;8923:22;8902:53;:::i;:::-;8892:63;;8847:118;8211:761;;;;;;;:::o;8978:118::-;9065:24;9083:5;9065:24;:::i;:::-;9060:3;9053:37;8978:118;;:::o;9102:157::-;9207:45;9227:24;9245:5;9227:24;:::i;:::-;9207:45;:::i;:::-;9202:3;9195:58;9102:157;;:::o;9265:109::-;9346:21;9361:5;9346:21;:::i;:::-;9341:3;9334:34;9265:109;;:::o;9380:118::-;9467:24;9485:5;9467:24;:::i;:::-;9462:3;9455:37;9380:118;;:::o;9504:157::-;9609:45;9629:24;9647:5;9629:24;:::i;:::-;9609:45;:::i;:::-;9604:3;9597:58;9504:157;;:::o;9667:360::-;9753:3;9781:38;9813:5;9781:38;:::i;:::-;9835:70;9898:6;9893:3;9835:70;:::i;:::-;9828:77;;9914:52;9959:6;9954:3;9947:4;9940:5;9936:16;9914:52;:::i;:::-;9991:29;10013:6;9991:29;:::i;:::-;9986:3;9982:39;9975:46;;9757:270;9667:360;;;;:::o;10033:147::-;10128:45;10167:5;10128:45;:::i;:::-;10123:3;10116:58;10033:147;;:::o;10186:364::-;10274:3;10302:39;10335:5;10302:39;:::i;:::-;10357:71;10421:6;10416:3;10357:71;:::i;:::-;10350:78;;10437:52;10482:6;10477:3;10470:4;10463:5;10459:16;10437:52;:::i;:::-;10514:29;10536:6;10514:29;:::i;:::-;10509:3;10505:39;10498:46;;10278:272;10186:364;;;;:::o;10556:377::-;10662:3;10690:39;10723:5;10690:39;:::i;:::-;10745:89;10827:6;10822:3;10745:89;:::i;:::-;10738:96;;10843:52;10888:6;10883:3;10876:4;10869:5;10865:16;10843:52;:::i;:::-;10920:6;10915:3;10911:16;10904:23;;10666:267;10556:377;;;;:::o;10939:366::-;11081:3;11102:67;11166:2;11161:3;11102:67;:::i;:::-;11095:74;;11178:93;11267:3;11178:93;:::i;:::-;11296:2;11291:3;11287:12;11280:19;;10939:366;;;:::o;11311:402::-;11471:3;11492:85;11574:2;11569:3;11492:85;:::i;:::-;11485:92;;11586:93;11675:3;11586:93;:::i;:::-;11704:2;11699:3;11695:12;11688:19;;11311:402;;;:::o;11719:366::-;11861:3;11882:67;11946:2;11941:3;11882:67;:::i;:::-;11875:74;;11958:93;12047:3;11958:93;:::i;:::-;12076:2;12071:3;12067:12;12060:19;;11719:366;;;:::o;12091:::-;12233:3;12254:67;12318:2;12313:3;12254:67;:::i;:::-;12247:74;;12330:93;12419:3;12330:93;:::i;:::-;12448:2;12443:3;12439:12;12432:19;;12091:366;;;:::o;12463:::-;12605:3;12626:67;12690:2;12685:3;12626:67;:::i;:::-;12619:74;;12702:93;12791:3;12702:93;:::i;:::-;12820:2;12815:3;12811:12;12804:19;;12463:366;;;:::o;12835:::-;12977:3;12998:67;13062:2;13057:3;12998:67;:::i;:::-;12991:74;;13074:93;13163:3;13074:93;:::i;:::-;13192:2;13187:3;13183:12;13176:19;;12835:366;;;:::o;13207:::-;13349:3;13370:67;13434:2;13429:3;13370:67;:::i;:::-;13363:74;;13446:93;13535:3;13446:93;:::i;:::-;13564:2;13559:3;13555:12;13548:19;;13207:366;;;:::o;13579:::-;13721:3;13742:67;13806:2;13801:3;13742:67;:::i;:::-;13735:74;;13818:93;13907:3;13818:93;:::i;:::-;13936:2;13931:3;13927:12;13920:19;;13579:366;;;:::o;13951:::-;14093:3;14114:67;14178:2;14173:3;14114:67;:::i;:::-;14107:74;;14190:93;14279:3;14190:93;:::i;:::-;14308:2;14303:3;14299:12;14292:19;;13951:366;;;:::o;14323:::-;14465:3;14486:67;14550:2;14545:3;14486:67;:::i;:::-;14479:74;;14562:93;14651:3;14562:93;:::i;:::-;14680:2;14675:3;14671:12;14664:19;;14323:366;;;:::o;14695:::-;14837:3;14858:67;14922:2;14917:3;14858:67;:::i;:::-;14851:74;;14934:93;15023:3;14934:93;:::i;:::-;15052:2;15047:3;15043:12;15036:19;;14695:366;;;:::o;15067:::-;15209:3;15230:67;15294:2;15289:3;15230:67;:::i;:::-;15223:74;;15306:93;15395:3;15306:93;:::i;:::-;15424:2;15419:3;15415:12;15408:19;;15067:366;;;:::o;15439:::-;15581:3;15602:67;15666:2;15661:3;15602:67;:::i;:::-;15595:74;;15678:93;15767:3;15678:93;:::i;:::-;15796:2;15791:3;15787:12;15780:19;;15439:366;;;:::o;15811:::-;15953:3;15974:67;16038:2;16033:3;15974:67;:::i;:::-;15967:74;;16050:93;16139:3;16050:93;:::i;:::-;16168:2;16163:3;16159:12;16152:19;;15811:366;;;:::o;16183:::-;16325:3;16346:67;16410:2;16405:3;16346:67;:::i;:::-;16339:74;;16422:93;16511:3;16422:93;:::i;:::-;16540:2;16535:3;16531:12;16524:19;;16183:366;;;:::o;16555:::-;16697:3;16718:67;16782:2;16777:3;16718:67;:::i;:::-;16711:74;;16794:93;16883:3;16794:93;:::i;:::-;16912:2;16907:3;16903:12;16896:19;;16555:366;;;:::o;16927:::-;17069:3;17090:67;17154:2;17149:3;17090:67;:::i;:::-;17083:74;;17166:93;17255:3;17166:93;:::i;:::-;17284:2;17279:3;17275:12;17268:19;;16927:366;;;:::o;17299:::-;17441:3;17462:67;17526:2;17521:3;17462:67;:::i;:::-;17455:74;;17538:93;17627:3;17538:93;:::i;:::-;17656:2;17651:3;17647:12;17640:19;;17299:366;;;:::o;17671:::-;17813:3;17834:67;17898:2;17893:3;17834:67;:::i;:::-;17827:74;;17910:93;17999:3;17910:93;:::i;:::-;18028:2;18023:3;18019:12;18012:19;;17671:366;;;:::o;18043:::-;18185:3;18206:67;18270:2;18265:3;18206:67;:::i;:::-;18199:74;;18282:93;18371:3;18282:93;:::i;:::-;18400:2;18395:3;18391:12;18384:19;;18043:366;;;:::o;18415:::-;18557:3;18578:67;18642:2;18637:3;18578:67;:::i;:::-;18571:74;;18654:93;18743:3;18654:93;:::i;:::-;18772:2;18767:3;18763:12;18756:19;;18415:366;;;:::o;18787:::-;18929:3;18950:67;19014:2;19009:3;18950:67;:::i;:::-;18943:74;;19026:93;19115:3;19026:93;:::i;:::-;19144:2;19139:3;19135:12;19128:19;;18787:366;;;:::o;19159:400::-;19319:3;19340:84;19422:1;19417:3;19340:84;:::i;:::-;19333:91;;19433:93;19522:3;19433:93;:::i;:::-;19551:1;19546:3;19542:11;19535:18;;19159:400;;;:::o;19565:366::-;19707:3;19728:67;19792:2;19787:3;19728:67;:::i;:::-;19721:74;;19804:93;19893:3;19804:93;:::i;:::-;19922:2;19917:3;19913:12;19906:19;;19565:366;;;:::o;19937:::-;20079:3;20100:67;20164:2;20159:3;20100:67;:::i;:::-;20093:74;;20176:93;20265:3;20176:93;:::i;:::-;20294:2;20289:3;20285:12;20278:19;;19937:366;;;:::o;20309:::-;20451:3;20472:67;20536:2;20531:3;20472:67;:::i;:::-;20465:74;;20548:93;20637:3;20548:93;:::i;:::-;20666:2;20661:3;20657:12;20650:19;;20309:366;;;:::o;20681:::-;20823:3;20844:67;20908:2;20903:3;20844:67;:::i;:::-;20837:74;;20920:93;21009:3;20920:93;:::i;:::-;21038:2;21033:3;21029:12;21022:19;;20681:366;;;:::o;21053:::-;21195:3;21216:67;21280:2;21275:3;21216:67;:::i;:::-;21209:74;;21292:93;21381:3;21292:93;:::i;:::-;21410:2;21405:3;21401:12;21394:19;;21053:366;;;:::o;21425:::-;21567:3;21588:67;21652:2;21647:3;21588:67;:::i;:::-;21581:74;;21664:93;21753:3;21664:93;:::i;:::-;21782:2;21777:3;21773:12;21766:19;;21425:366;;;:::o;21797:::-;21939:3;21960:67;22024:2;22019:3;21960:67;:::i;:::-;21953:74;;22036:93;22125:3;22036:93;:::i;:::-;22154:2;22149:3;22145:12;22138:19;;21797:366;;;:::o;22169:::-;22311:3;22332:67;22396:2;22391:3;22332:67;:::i;:::-;22325:74;;22408:93;22497:3;22408:93;:::i;:::-;22526:2;22521:3;22517:12;22510:19;;22169:366;;;:::o;22541:::-;22683:3;22704:67;22768:2;22763:3;22704:67;:::i;:::-;22697:74;;22780:93;22869:3;22780:93;:::i;:::-;22898:2;22893:3;22889:12;22882:19;;22541:366;;;:::o;22913:398::-;23072:3;23093:83;23174:1;23169:3;23093:83;:::i;:::-;23086:90;;23185:93;23274:3;23185:93;:::i;:::-;23303:1;23298:3;23294:11;23287:18;;22913:398;;;:::o;23317:366::-;23459:3;23480:67;23544:2;23539:3;23480:67;:::i;:::-;23473:74;;23556:93;23645:3;23556:93;:::i;:::-;23674:2;23669:3;23665:12;23658:19;;23317:366;;;:::o;23689:::-;23831:3;23852:67;23916:2;23911:3;23852:67;:::i;:::-;23845:74;;23928:93;24017:3;23928:93;:::i;:::-;24046:2;24041:3;24037:12;24030:19;;23689:366;;;:::o;24061:::-;24203:3;24224:67;24288:2;24283:3;24224:67;:::i;:::-;24217:74;;24300:93;24389:3;24300:93;:::i;:::-;24418:2;24413:3;24409:12;24402:19;;24061:366;;;:::o;24433:::-;24575:3;24596:67;24660:2;24655:3;24596:67;:::i;:::-;24589:74;;24672:93;24761:3;24672:93;:::i;:::-;24790:2;24785:3;24781:12;24774:19;;24433:366;;;:::o;24805:::-;24947:3;24968:67;25032:2;25027:3;24968:67;:::i;:::-;24961:74;;25044:93;25133:3;25044:93;:::i;:::-;25162:2;25157:3;25153:12;25146:19;;24805:366;;;:::o;25177:::-;25319:3;25340:67;25404:2;25399:3;25340:67;:::i;:::-;25333:74;;25416:93;25505:3;25416:93;:::i;:::-;25534:2;25529:3;25525:12;25518:19;;25177:366;;;:::o;25549:118::-;25636:24;25654:5;25636:24;:::i;:::-;25631:3;25624:37;25549:118;;:::o;25673:112::-;25756:22;25772:5;25756:22;:::i;:::-;25751:3;25744:35;25673:112;;:::o;25791:397::-;25931:3;25946:75;26017:3;26008:6;25946:75;:::i;:::-;26046:2;26041:3;26037:12;26030:19;;26059:75;26130:3;26121:6;26059:75;:::i;:::-;26159:2;26154:3;26150:12;26143:19;;26179:3;26172:10;;25791:397;;;;;:::o;26194:701::-;26475:3;26497:95;26588:3;26579:6;26497:95;:::i;:::-;26490:102;;26609:95;26700:3;26691:6;26609:95;:::i;:::-;26602:102;;26721:148;26865:3;26721:148;:::i;:::-;26714:155;;26886:3;26879:10;;26194:701;;;;;:::o;26901:522::-;27114:3;27136:148;27280:3;27136:148;:::i;:::-;27129:155;;27294:75;27365:3;27356:6;27294:75;:::i;:::-;27394:2;27389:3;27385:12;27378:19;;27414:3;27407:10;;26901:522;;;;:::o;27429:379::-;27613:3;27635:147;27778:3;27635:147;:::i;:::-;27628:154;;27799:3;27792:10;;27429:379;;;:::o;27814:222::-;27907:4;27945:2;27934:9;27930:18;27922:26;;27958:71;28026:1;28015:9;28011:17;28002:6;27958:71;:::i;:::-;27814:222;;;;:::o;28042:640::-;28237:4;28275:3;28264:9;28260:19;28252:27;;28289:71;28357:1;28346:9;28342:17;28333:6;28289:71;:::i;:::-;28370:72;28438:2;28427:9;28423:18;28414:6;28370:72;:::i;:::-;28452;28520:2;28509:9;28505:18;28496:6;28452:72;:::i;:::-;28571:9;28565:4;28561:20;28556:2;28545:9;28541:18;28534:48;28599:76;28670:4;28661:6;28599:76;:::i;:::-;28591:84;;28042:640;;;;;;;:::o;28688:210::-;28775:4;28813:2;28802:9;28798:18;28790:26;;28826:65;28888:1;28877:9;28873:17;28864:6;28826:65;:::i;:::-;28688:210;;;;:::o;28904:545::-;29077:4;29115:3;29104:9;29100:19;29092:27;;29129:71;29197:1;29186:9;29182:17;29173:6;29129:71;:::i;:::-;29210:68;29274:2;29263:9;29259:18;29250:6;29210:68;:::i;:::-;29288:72;29356:2;29345:9;29341:18;29332:6;29288:72;:::i;:::-;29370;29438:2;29427:9;29423:18;29414:6;29370:72;:::i;:::-;28904:545;;;;;;;:::o;29455:238::-;29556:4;29594:2;29583:9;29579:18;29571:26;;29607:79;29683:1;29672:9;29668:17;29659:6;29607:79;:::i;:::-;29455:238;;;;:::o;29699:313::-;29812:4;29850:2;29839:9;29835:18;29827:26;;29899:9;29893:4;29889:20;29885:1;29874:9;29870:17;29863:47;29927:78;30000:4;29991:6;29927:78;:::i;:::-;29919:86;;29699:313;;;;:::o;30018:419::-;30184:4;30222:2;30211:9;30207:18;30199:26;;30271:9;30265:4;30261:20;30257:1;30246:9;30242:17;30235:47;30299:131;30425:4;30299:131;:::i;:::-;30291:139;;30018:419;;;:::o;30443:::-;30609:4;30647:2;30636:9;30632:18;30624:26;;30696:9;30690:4;30686:20;30682:1;30671:9;30667:17;30660:47;30724:131;30850:4;30724:131;:::i;:::-;30716:139;;30443:419;;;:::o;30868:::-;31034:4;31072:2;31061:9;31057:18;31049:26;;31121:9;31115:4;31111:20;31107:1;31096:9;31092:17;31085:47;31149:131;31275:4;31149:131;:::i;:::-;31141:139;;30868:419;;;:::o;31293:::-;31459:4;31497:2;31486:9;31482:18;31474:26;;31546:9;31540:4;31536:20;31532:1;31521:9;31517:17;31510:47;31574:131;31700:4;31574:131;:::i;:::-;31566:139;;31293:419;;;:::o;31718:::-;31884:4;31922:2;31911:9;31907:18;31899:26;;31971:9;31965:4;31961:20;31957:1;31946:9;31942:17;31935:47;31999:131;32125:4;31999:131;:::i;:::-;31991:139;;31718:419;;;:::o;32143:::-;32309:4;32347:2;32336:9;32332:18;32324:26;;32396:9;32390:4;32386:20;32382:1;32371:9;32367:17;32360:47;32424:131;32550:4;32424:131;:::i;:::-;32416:139;;32143:419;;;:::o;32568:::-;32734:4;32772:2;32761:9;32757:18;32749:26;;32821:9;32815:4;32811:20;32807:1;32796:9;32792:17;32785:47;32849:131;32975:4;32849:131;:::i;:::-;32841:139;;32568:419;;;:::o;32993:::-;33159:4;33197:2;33186:9;33182:18;33174:26;;33246:9;33240:4;33236:20;33232:1;33221:9;33217:17;33210:47;33274:131;33400:4;33274:131;:::i;:::-;33266:139;;32993:419;;;:::o;33418:::-;33584:4;33622:2;33611:9;33607:18;33599:26;;33671:9;33665:4;33661:20;33657:1;33646:9;33642:17;33635:47;33699:131;33825:4;33699:131;:::i;:::-;33691:139;;33418:419;;;:::o;33843:::-;34009:4;34047:2;34036:9;34032:18;34024:26;;34096:9;34090:4;34086:20;34082:1;34071:9;34067:17;34060:47;34124:131;34250:4;34124:131;:::i;:::-;34116:139;;33843:419;;;:::o;34268:::-;34434:4;34472:2;34461:9;34457:18;34449:26;;34521:9;34515:4;34511:20;34507:1;34496:9;34492:17;34485:47;34549:131;34675:4;34549:131;:::i;:::-;34541:139;;34268:419;;;:::o;34693:::-;34859:4;34897:2;34886:9;34882:18;34874:26;;34946:9;34940:4;34936:20;34932:1;34921:9;34917:17;34910:47;34974:131;35100:4;34974:131;:::i;:::-;34966:139;;34693:419;;;:::o;35118:::-;35284:4;35322:2;35311:9;35307:18;35299:26;;35371:9;35365:4;35361:20;35357:1;35346:9;35342:17;35335:47;35399:131;35525:4;35399:131;:::i;:::-;35391:139;;35118:419;;;:::o;35543:::-;35709:4;35747:2;35736:9;35732:18;35724:26;;35796:9;35790:4;35786:20;35782:1;35771:9;35767:17;35760:47;35824:131;35950:4;35824:131;:::i;:::-;35816:139;;35543:419;;;:::o;35968:::-;36134:4;36172:2;36161:9;36157:18;36149:26;;36221:9;36215:4;36211:20;36207:1;36196:9;36192:17;36185:47;36249:131;36375:4;36249:131;:::i;:::-;36241:139;;35968:419;;;:::o;36393:::-;36559:4;36597:2;36586:9;36582:18;36574:26;;36646:9;36640:4;36636:20;36632:1;36621:9;36617:17;36610:47;36674:131;36800:4;36674:131;:::i;:::-;36666:139;;36393:419;;;:::o;36818:::-;36984:4;37022:2;37011:9;37007:18;36999:26;;37071:9;37065:4;37061:20;37057:1;37046:9;37042:17;37035:47;37099:131;37225:4;37099:131;:::i;:::-;37091:139;;36818:419;;;:::o;37243:::-;37409:4;37447:2;37436:9;37432:18;37424:26;;37496:9;37490:4;37486:20;37482:1;37471:9;37467:17;37460:47;37524:131;37650:4;37524:131;:::i;:::-;37516:139;;37243:419;;;:::o;37668:::-;37834:4;37872:2;37861:9;37857:18;37849:26;;37921:9;37915:4;37911:20;37907:1;37896:9;37892:17;37885:47;37949:131;38075:4;37949:131;:::i;:::-;37941:139;;37668:419;;;:::o;38093:::-;38259:4;38297:2;38286:9;38282:18;38274:26;;38346:9;38340:4;38336:20;38332:1;38321:9;38317:17;38310:47;38374:131;38500:4;38374:131;:::i;:::-;38366:139;;38093:419;;;:::o;38518:::-;38684:4;38722:2;38711:9;38707:18;38699:26;;38771:9;38765:4;38761:20;38757:1;38746:9;38742:17;38735:47;38799:131;38925:4;38799:131;:::i;:::-;38791:139;;38518:419;;;:::o;38943:::-;39109:4;39147:2;39136:9;39132:18;39124:26;;39196:9;39190:4;39186:20;39182:1;39171:9;39167:17;39160:47;39224:131;39350:4;39224:131;:::i;:::-;39216:139;;38943:419;;;:::o;39368:::-;39534:4;39572:2;39561:9;39557:18;39549:26;;39621:9;39615:4;39611:20;39607:1;39596:9;39592:17;39585:47;39649:131;39775:4;39649:131;:::i;:::-;39641:139;;39368:419;;;:::o;39793:::-;39959:4;39997:2;39986:9;39982:18;39974:26;;40046:9;40040:4;40036:20;40032:1;40021:9;40017:17;40010:47;40074:131;40200:4;40074:131;:::i;:::-;40066:139;;39793:419;;;:::o;40218:::-;40384:4;40422:2;40411:9;40407:18;40399:26;;40471:9;40465:4;40461:20;40457:1;40446:9;40442:17;40435:47;40499:131;40625:4;40499:131;:::i;:::-;40491:139;;40218:419;;;:::o;40643:::-;40809:4;40847:2;40836:9;40832:18;40824:26;;40896:9;40890:4;40886:20;40882:1;40871:9;40867:17;40860:47;40924:131;41050:4;40924:131;:::i;:::-;40916:139;;40643:419;;;:::o;41068:::-;41234:4;41272:2;41261:9;41257:18;41249:26;;41321:9;41315:4;41311:20;41307:1;41296:9;41292:17;41285:47;41349:131;41475:4;41349:131;:::i;:::-;41341:139;;41068:419;;;:::o;41493:::-;41659:4;41697:2;41686:9;41682:18;41674:26;;41746:9;41740:4;41736:20;41732:1;41721:9;41717:17;41710:47;41774:131;41900:4;41774:131;:::i;:::-;41766:139;;41493:419;;;:::o;41918:::-;42084:4;42122:2;42111:9;42107:18;42099:26;;42171:9;42165:4;42161:20;42157:1;42146:9;42142:17;42135:47;42199:131;42325:4;42199:131;:::i;:::-;42191:139;;41918:419;;;:::o;42343:::-;42509:4;42547:2;42536:9;42532:18;42524:26;;42596:9;42590:4;42586:20;42582:1;42571:9;42567:17;42560:47;42624:131;42750:4;42624:131;:::i;:::-;42616:139;;42343:419;;;:::o;42768:::-;42934:4;42972:2;42961:9;42957:18;42949:26;;43021:9;43015:4;43011:20;43007:1;42996:9;42992:17;42985:47;43049:131;43175:4;43049:131;:::i;:::-;43041:139;;42768:419;;;:::o;43193:::-;43359:4;43397:2;43386:9;43382:18;43374:26;;43446:9;43440:4;43436:20;43432:1;43421:9;43417:17;43410:47;43474:131;43600:4;43474:131;:::i;:::-;43466:139;;43193:419;;;:::o;43618:::-;43784:4;43822:2;43811:9;43807:18;43799:26;;43871:9;43865:4;43861:20;43857:1;43846:9;43842:17;43835:47;43899:131;44025:4;43899:131;:::i;:::-;43891:139;;43618:419;;;:::o;44043:::-;44209:4;44247:2;44236:9;44232:18;44224:26;;44296:9;44290:4;44286:20;44282:1;44271:9;44267:17;44260:47;44324:131;44450:4;44324:131;:::i;:::-;44316:139;;44043:419;;;:::o;44468:::-;44634:4;44672:2;44661:9;44657:18;44649:26;;44721:9;44715:4;44711:20;44707:1;44696:9;44692:17;44685:47;44749:131;44875:4;44749:131;:::i;:::-;44741:139;;44468:419;;;:::o;44893:::-;45059:4;45097:2;45086:9;45082:18;45074:26;;45146:9;45140:4;45136:20;45132:1;45121:9;45117:17;45110:47;45174:131;45300:4;45174:131;:::i;:::-;45166:139;;44893:419;;;:::o;45318:222::-;45411:4;45449:2;45438:9;45434:18;45426:26;;45462:71;45530:1;45519:9;45515:17;45506:6;45462:71;:::i;:::-;45318:222;;;;:::o;45546:129::-;45580:6;45607:20;;:::i;:::-;45597:30;;45636:33;45664:4;45656:6;45636:33;:::i;:::-;45546:129;;;:::o;45681:75::-;45714:6;45747:2;45741:9;45731:19;;45681:75;:::o;45762:307::-;45823:4;45913:18;45905:6;45902:30;45899:56;;;45935:18;;:::i;:::-;45899:56;45973:29;45995:6;45973:29;:::i;:::-;45965:37;;46057:4;46051;46047:15;46039:23;;45762:307;;;:::o;46075:308::-;46137:4;46227:18;46219:6;46216:30;46213:56;;;46249:18;;:::i;:::-;46213:56;46287:29;46309:6;46287:29;:::i;:::-;46279:37;;46371:4;46365;46361:15;46353:23;;46075:308;;;:::o;46389:98::-;46440:6;46474:5;46468:12;46458:22;;46389:98;;;:::o;46493:99::-;46545:6;46579:5;46573:12;46563:22;;46493:99;;;:::o;46598:168::-;46681:11;46715:6;46710:3;46703:19;46755:4;46750:3;46746:14;46731:29;;46598:168;;;;:::o;46772:147::-;46873:11;46910:3;46895:18;;46772:147;;;;:::o;46925:169::-;47009:11;47043:6;47038:3;47031:19;47083:4;47078:3;47074:14;47059:29;;46925:169;;;;:::o;47100:148::-;47202:11;47239:3;47224:18;;47100:148;;;;:::o;47254:305::-;47294:3;47313:20;47331:1;47313:20;:::i;:::-;47308:25;;47347:20;47365:1;47347:20;:::i;:::-;47342:25;;47501:1;47433:66;47429:74;47426:1;47423:81;47420:107;;;47507:18;;:::i;:::-;47420:107;47551:1;47548;47544:9;47537:16;;47254:305;;;;:::o;47565:185::-;47605:1;47622:20;47640:1;47622:20;:::i;:::-;47617:25;;47656:20;47674:1;47656:20;:::i;:::-;47651:25;;47695:1;47685:35;;47700:18;;:::i;:::-;47685:35;47742:1;47739;47735:9;47730:14;;47565:185;;;;:::o;47756:348::-;47796:7;47819:20;47837:1;47819:20;:::i;:::-;47814:25;;47853:20;47871:1;47853:20;:::i;:::-;47848:25;;48041:1;47973:66;47969:74;47966:1;47963:81;47958:1;47951:9;47944:17;47940:105;47937:131;;;48048:18;;:::i;:::-;47937:131;48096:1;48093;48089:9;48078:20;;47756:348;;;;:::o;48110:191::-;48150:4;48170:20;48188:1;48170:20;:::i;:::-;48165:25;;48204:20;48222:1;48204:20;:::i;:::-;48199:25;;48243:1;48240;48237:8;48234:34;;;48248:18;;:::i;:::-;48234:34;48293:1;48290;48286:9;48278:17;;48110:191;;;;:::o;48307:96::-;48344:7;48373:24;48391:5;48373:24;:::i;:::-;48362:35;;48307:96;;;:::o;48409:90::-;48443:7;48486:5;48479:13;48472:21;48461:32;;48409:90;;;:::o;48505:77::-;48542:7;48571:5;48560:16;;48505:77;;;:::o;48588:149::-;48624:7;48664:66;48657:5;48653:78;48642:89;;48588:149;;;:::o;48743:131::-;48790:7;48819:5;48808:16;;48825:43;48862:5;48825:43;:::i;:::-;48743:131;;;:::o;48880:126::-;48917:7;48957:42;48950:5;48946:54;48935:65;;48880:126;;;:::o;49012:77::-;49049:7;49078:5;49067:16;;49012:77;;;:::o;49095:86::-;49130:7;49170:4;49163:5;49159:16;49148:27;;49095:86;;;:::o;49187:131::-;49245:9;49278:34;49306:5;49278:34;:::i;:::-;49265:47;;49187:131;;;:::o;49324:154::-;49408:6;49403:3;49398;49385:30;49470:1;49461:6;49456:3;49452:16;49445:27;49324:154;;;:::o;49484:307::-;49552:1;49562:113;49576:6;49573:1;49570:13;49562:113;;;49661:1;49656:3;49652:11;49646:18;49642:1;49637:3;49633:11;49626:39;49598:2;49595:1;49591:10;49586:15;;49562:113;;;49693:6;49690:1;49687:13;49684:101;;;49773:1;49764:6;49759:3;49755:16;49748:27;49684:101;49533:258;49484:307;;;:::o;49797:320::-;49841:6;49878:1;49872:4;49868:12;49858:22;;49925:1;49919:4;49915:12;49946:18;49936:81;;50002:4;49994:6;49990:17;49980:27;;49936:81;50064:2;50056:6;50053:14;50033:18;50030:38;50027:84;;;50083:18;;:::i;:::-;50027:84;49848:269;49797:320;;;:::o;50123:281::-;50206:27;50228:4;50206:27;:::i;:::-;50198:6;50194:40;50336:6;50324:10;50321:22;50300:18;50288:10;50285:34;50282:62;50279:88;;;50347:18;;:::i;:::-;50279:88;50387:10;50383:2;50376:22;50166:238;50123:281;;:::o;50410:233::-;50449:3;50472:24;50490:5;50472:24;:::i;:::-;50463:33;;50518:66;50511:5;50508:77;50505:103;;;50588:18;;:::i;:::-;50505:103;50635:1;50628:5;50624:13;50617:20;;50410:233;;;:::o;50649:100::-;50688:7;50717:26;50737:5;50717:26;:::i;:::-;50706:37;;50649:100;;;:::o;50755:79::-;50794:7;50823:5;50812:16;;50755:79;;;:::o;50840:94::-;50879:7;50908:20;50922:5;50908:20;:::i;:::-;50897:31;;50840:94;;;:::o;50940:176::-;50972:1;50989:20;51007:1;50989:20;:::i;:::-;50984:25;;51023:20;51041:1;51023:20;:::i;:::-;51018:25;;51062:1;51052:35;;51067:18;;:::i;:::-;51052:35;51108:1;51105;51101:9;51096:14;;50940:176;;;;:::o;51122:180::-;51170:77;51167:1;51160:88;51267:4;51264:1;51257:15;51291:4;51288:1;51281:15;51308:180;51356:77;51353:1;51346:88;51453:4;51450:1;51443:15;51477:4;51474:1;51467:15;51494:180;51542:77;51539:1;51532:88;51639:4;51636:1;51629:15;51663:4;51660:1;51653:15;51680:180;51728:77;51725:1;51718:88;51825:4;51822:1;51815:15;51849:4;51846:1;51839:15;51866:180;51914:77;51911:1;51904:88;52011:4;52008:1;52001:15;52035:4;52032:1;52025:15;52052:180;52100:77;52097:1;52090:88;52197:4;52194:1;52187:15;52221:4;52218:1;52211:15;52238:180;52286:77;52283:1;52276:88;52383:4;52380:1;52373:15;52407:4;52404:1;52397:15;52424:117;52533:1;52530;52523:12;52547:117;52656:1;52653;52646:12;52670:117;52779:1;52776;52769:12;52793:117;52902:1;52899;52892:12;52916:102;52957:6;53008:2;53004:7;52999:2;52992:5;52988:14;52984:28;52974:38;;52916:102;;;:::o;53024:94::-;53057:8;53105:5;53101:2;53097:14;53076:35;;53024:94;;;:::o;53124:223::-;53264:34;53260:1;53252:6;53248:14;53241:58;53333:6;53328:2;53320:6;53316:15;53309:31;53124:223;:::o;53353:214::-;53493:66;53489:1;53481:6;53477:14;53470:90;53353:214;:::o;53573:228::-;53713:34;53709:1;53701:6;53697:14;53690:58;53782:11;53777:2;53769:6;53765:15;53758:36;53573:228;:::o;53807:230::-;53947:34;53943:1;53935:6;53931:14;53924:58;54016:13;54011:2;54003:6;53999:15;53992:38;53807:230;:::o;54043:237::-;54183:34;54179:1;54171:6;54167:14;54160:58;54252:20;54247:2;54239:6;54235:15;54228:45;54043:237;:::o;54286:225::-;54426:34;54422:1;54414:6;54410:14;54403:58;54495:8;54490:2;54482:6;54478:15;54471:33;54286:225;:::o;54517:178::-;54657:30;54653:1;54645:6;54641:14;54634:54;54517:178;:::o;54701:238::-;54841:34;54837:1;54829:6;54825:14;54818:58;54910:21;54905:2;54897:6;54893:15;54886:46;54701:238;:::o;54945:174::-;55085:26;55081:1;55073:6;55069:14;55062:50;54945:174;:::o;55125:177::-;55265:29;55261:1;55253:6;55249:14;55242:53;55125:177;:::o;55308:170::-;55448:22;55444:1;55436:6;55432:14;55425:46;55308:170;:::o;55484:223::-;55624:34;55620:1;55612:6;55608:14;55601:58;55693:6;55688:2;55680:6;55676:15;55669:31;55484:223;:::o;55713:175::-;55853:27;55849:1;55841:6;55837:14;55830:51;55713:175;:::o;55894:180::-;56034:32;56030:1;56022:6;56018:14;56011:56;55894:180;:::o;56080:231::-;56220:34;56216:1;56208:6;56204:14;56197:58;56289:14;56284:2;56276:6;56272:15;56265:39;56080:231;:::o;56317:243::-;56457:34;56453:1;56445:6;56441:14;56434:58;56526:26;56521:2;56513:6;56509:15;56502:51;56317:243;:::o;56566:229::-;56706:34;56702:1;56694:6;56690:14;56683:58;56775:12;56770:2;56762:6;56758:15;56751:37;56566:229;:::o;56801:228::-;56941:34;56937:1;56929:6;56925:14;56918:58;57010:11;57005:2;56997:6;56993:15;56986:36;56801:228;:::o;57035:178::-;57175:30;57171:1;57163:6;57159:14;57152:54;57035:178;:::o;57219:223::-;57359:34;57355:1;57347:6;57343:14;57336:58;57428:6;57423:2;57415:6;57411:15;57404:31;57219:223;:::o;57448:182::-;57588:34;57584:1;57576:6;57572:14;57565:58;57448:182;:::o;57636:231::-;57776:34;57772:1;57764:6;57760:14;57753:58;57845:14;57840:2;57832:6;57828:15;57821:39;57636:231;:::o;57873:155::-;58013:7;58009:1;58001:6;57997:14;57990:31;57873:155;:::o;58034:167::-;58174:19;58170:1;58162:6;58158:14;58151:43;58034:167;:::o;58207:182::-;58347:34;58343:1;58335:6;58331:14;58324:58;58207:182;:::o;58395:236::-;58535:34;58531:1;58523:6;58519:14;58512:58;58604:19;58599:2;58591:6;58587:15;58580:44;58395:236;:::o;58637:173::-;58777:25;58773:1;58765:6;58761:14;58754:49;58637:173;:::o;58816:228::-;58956:34;58952:1;58944:6;58940:14;58933:58;59025:11;59020:2;59012:6;59008:15;59001:36;58816:228;:::o;59050:234::-;59190:34;59186:1;59178:6;59174:14;59167:58;59259:17;59254:2;59246:6;59242:15;59235:42;59050:234;:::o;59290:220::-;59430:34;59426:1;59418:6;59414:14;59407:58;59499:3;59494:2;59486:6;59482:15;59475:28;59290:220;:::o;59516:169::-;59656:21;59652:1;59644:6;59640:14;59633:45;59516:169;:::o;59691:174::-;59831:26;59827:1;59819:6;59815:14;59808:50;59691:174;:::o;59871:114::-;;:::o;59991:236::-;60131:34;60127:1;60119:6;60115:14;60108:58;60200:19;60195:2;60187:6;60183:15;60176:44;59991:236;:::o;60233:231::-;60373:34;60369:1;60361:6;60357:14;60350:58;60442:14;60437:2;60429:6;60425:15;60418:39;60233:231;:::o;60470:172::-;60610:24;60606:1;60598:6;60594:14;60587:48;60470:172;:::o;60648:171::-;60788:23;60784:1;60776:6;60772:14;60765:47;60648:171;:::o;60825:180::-;60965:32;60961:1;60953:6;60949:14;60942:56;60825:180;:::o;61011:181::-;61151:33;61147:1;61139:6;61135:14;61128:57;61011:181;:::o;61198:115::-;61281:1;61274:5;61271:12;61261:46;;61287:18;;:::i;:::-;61261:46;61198:115;:::o;61319:122::-;61392:24;61410:5;61392:24;:::i;:::-;61385:5;61382:35;61372:63;;61431:1;61428;61421:12;61372:63;61319:122;:::o;61447:116::-;61517:21;61532:5;61517:21;:::i;:::-;61510:5;61507:32;61497:60;;61553:1;61550;61543:12;61497:60;61447:116;:::o;61569:122::-;61642:24;61660:5;61642:24;:::i;:::-;61635:5;61632:35;61622:63;;61681:1;61678;61671:12;61622:63;61569:122;:::o;61697:120::-;61769:23;61786:5;61769:23;:::i;:::-;61762:5;61759:34;61749:62;;61807:1;61804;61797:12;61749:62;61697:120;:::o;61823:122::-;61896:24;61914:5;61896:24;:::i;:::-;61889:5;61886:35;61876:63;;61935:1;61932;61925:12;61876:63;61823:122;:::o;61951:118::-;62022:22;62038:5;62022:22;:::i;:::-;62015:5;62012:33;62002:61;;62059:1;62056;62049:12;62002:61;61951:118;:::o

Swarm Source

ipfs://c2900dde352fadf445d17ddcf4f3e2c2c61087e6aeee4a63670136713314a611
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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