ETH Price: $3,886.69 (+0.06%)

Token

Besties (BESTIES)
 

Overview

Max Total Supply

649 BESTIES

Holders

162

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 BESTIES
0xad476864a3d0245afd139e7ac5047dde6f863174
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:
Besties

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT

//  '########::'########::'######::'########:'####:'########::'######::
//   ##.... ##: ##.....::'##... ##:... ##..::. ##:: ##.....::'##... ##:
//   ##:::: ##: ##::::::: ##:::..::::: ##::::: ##:: ##::::::: ##:::..::
//   ########:: ######:::. ######::::: ##::::: ##:: ######:::. ######::
//   ##.... ##: ##...:::::..... ##:::: ##::::: ##:: ##...:::::..... ##:
//   ##:::: ##: ##:::::::'##::: ##:::: ##::::: ##:: ##:::::::'##::: ##:
//   ########:: ########:. ######::::: ##::::'####: ########:. ######::
//  :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
//  ::::::::::::::::::::::::::::::10,000:::::::::::::::::::::::::::::::
//  :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

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

pragma solidity ^0.8.0;

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

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


pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;


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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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

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

pragma solidity ^0.8.0;

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

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

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

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

pragma solidity ^0.8.0;


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

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


pragma solidity ^0.8.0;


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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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



pragma solidity ^0.8.0;


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

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

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

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


pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// @openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol


pragma solidity ^0.8.0;

/**
 * @dev ERC721 token with storage based token URI management.
 */
abstract contract ERC721URIStorage is ERC721 {
    using Strings for uint256;

    // Optional mapping for token URIs
    mapping(uint256 => string) private _tokenURIs;

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

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }

        return super.tokenURI(tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

    /**
     * @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 override {
        super._burn(tokenId);

        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }
    }
}

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


pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

// contracts/bestiesContract.sol

pragma solidity ^0.8.0;


contract Besties is ERC721Enumerable, Ownable {
    using Strings for uint256;

    string _baseTokenURI;
    
    uint256 public _reserve = 1100;
    uint256 public constant bestiesSupply = 10000;
    uint256 public bestiesPrice = 0.04 ether;
    bool public saleActive = false;


    struct Whitelist {
        address addr;
        uint claimAmount;
        uint hasMinted;
    }
    mapping(address => Whitelist) public whitelist;
    
    address[] whitelistAddr;

    constructor(string memory baseURI) ERC721("Besties", "BESTIES")  {
        setBaseURI(baseURI);

    }

    function mintBesties(uint256 numberOfTokens) public payable {
        uint256 supply = totalSupply();
        require(saleActive, "Sale is inactive");
        require( numberOfTokens <= 20, "You can mint 20 tokens at a time" );
        require( supply + numberOfTokens <= (bestiesSupply - _reserve), "Purchase exceeds maximum supply of Besties" );
        require( msg.value >= bestiesPrice * numberOfTokens,  "Ether sent is not correct" );

        for(uint256 i = 1; i <= numberOfTokens; i++){
            _safeMint( msg.sender, supply + i );
        }
    }
    function reserveBesties(address _to, uint256 _amount) external onlyOwner() {
        require( _amount <= _reserve, "Exceeds reserved supply" );
        uint256 supply = totalSupply();
        for(uint256 i = 1 ; i <= _amount; i++){
            _safeMint( _to, supply + i );
        }
        _reserve -= _amount;
    }

    function claimBesties(uint numberOfTokens) public {
        uint256 supply = totalSupply();
        require(numberOfTokens <= 20, "You can mint 20 tokens at a time");
        require(totalSupply() + numberOfTokens <= (bestiesSupply - _reserve), "Exceeds max supply");
        require(whitelist[msg.sender].claimAmount > 0, "You have no amount to claim");
        require(numberOfTokens <= whitelist[msg.sender].claimAmount, "You have less NFTs to claim. Input the correct amount.");

        for(uint256 i = 1 ; i <= numberOfTokens; i++){
            _safeMint( msg.sender, supply + i );
        }
        whitelist[msg.sender].claimAmount = whitelist[msg.sender].claimAmount - numberOfTokens;
        whitelist[msg.sender].hasMinted = whitelist[msg.sender].hasMinted + numberOfTokens;
    }

    function walletQuery(address _owner) public view returns(uint256[] memory) {
        uint256 tokenCount = balanceOf(_owner);

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

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

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

    function setPrice(uint256 newPrice) public onlyOwner {
        bestiesPrice = newPrice;
    }

    function getPrice() public view returns (uint256) {
        return bestiesPrice;
    }

    function setReserve(uint256 newReserve) public onlyOwner {
        _reserve = newReserve;
    }

    function getReserve() public view returns (uint256) {
        return _reserve;
    }

    function flipSaleState() public onlyOwner {
        saleActive = !saleActive;
    }

    function addAddressToWhitelist(address addr, uint claimAmount) onlyOwner public returns(bool success) {
        require(!isWhitelisted(addr), "Already whitelisted");
        whitelist[addr].addr = addr;
        whitelist[addr].claimAmount = claimAmount;
        whitelist[addr].hasMinted = 0;
        success = true;
    }

    function isWhitelisted(address addr) public view returns (bool isWhiteListed) {
        return whitelist[addr].addr == addr;
    }

    function withdraw() public onlyOwner {
        uint balance = address(this).balance;
        payable(msg.sender).transfer(balance);
    }
 
    
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_reserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"claimAmount","type":"uint256"}],"name":"addAddressToWhitelist","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bestiesPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bestiesSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"claimBesties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipSaleState","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":[],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"isWhiteListed","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintBesties","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"reserveBesties","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":"saleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newReserve","type":"uint256"}],"name":"setReserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletQuery","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"claimAmount","type":"uint256"},{"internalType":"uint256","name":"hasMinted","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405261044c600c55668e1bc9bf040000600d556000600e60006101000a81548160ff0219169083151502179055503480156200003d57600080fd5b506040516200525838038062005258833981810160405281019062000063919062000400565b6040518060400160405280600781526020017f42657374696573000000000000000000000000000000000000000000000000008152506040518060400160405280600781526020017f42455354494553000000000000000000000000000000000000000000000000008152508160009080519060200190620000e7929190620002de565b50806001908051906020019062000100929190620002de565b50505062000123620001176200013b60201b60201c565b6200014360201b60201c565b62000134816200020960201b60201c565b5062000638565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002196200013b60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200023f620002b460201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000298576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200028f906200046c565b60405180910390fd5b80600b9080519060200190620002b0929190620002de565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620002ec9062000534565b90600052602060002090601f0160209004810192826200031057600085556200035c565b82601f106200032b57805160ff19168380011785556200035c565b828001600101855582156200035c579182015b828111156200035b5782518255916020019190600101906200033e565b5b5090506200036b91906200036f565b5090565b5b808211156200038a57600081600090555060010162000370565b5090565b6000620003a56200039f84620004b7565b6200048e565b905082815260208101848484011115620003be57600080fd5b620003cb848285620004fe565b509392505050565b600082601f830112620003e557600080fd5b8151620003f78482602086016200038e565b91505092915050565b6000602082840312156200041357600080fd5b600082015167ffffffffffffffff8111156200042e57600080fd5b6200043c84828501620003d3565b91505092915050565b600062000454602083620004ed565b915062000461826200060f565b602082019050919050565b60006020820190508181036000830152620004878162000445565b9050919050565b60006200049a620004ad565b9050620004a882826200056a565b919050565b6000604051905090565b600067ffffffffffffffff821115620004d557620004d4620005cf565b5b620004e082620005fe565b9050602081019050919050565b600082825260208201905092915050565b60005b838110156200051e57808201518184015260208101905062000501565b838111156200052e576000848401525b50505050565b600060028204905060018216806200054d57607f821691505b60208210811415620005645762000563620005a0565b5b50919050565b6200057582620005fe565b810181811067ffffffffffffffff82111715620005975762000596620005cf565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b614c1080620006486000396000f3fe60806040526004361061021a5760003560e01c806359bf5d39116101235780639b19251a116100ab578063c87b56dd1161006f578063c87b56dd146107d3578063d070334514610810578063e17039b81461082c578063e985e9c514610869578063f2fde38b146108a65761021a565b80639b19251a146106f0578063a22cb4651461072f578063ad813c5514610758578063b0fdbb5b14610781578063b88d4fde146107aa5761021a565b8063715018a6116100f2578063715018a61461062f5780638da5cb5b1461064657806391b7f5ed1461067157806395d89b411461069a57806398d5fdca146106c55761021a565b806359bf5d391461055f5780636352211e1461058a57806368428a1b146105c757806370a08231146105f25761021a565b806334918dfd116101a65780634256dbe3116101755780634256dbe31461047c57806342842e0e146104a557806344fd2254146104ce5780634f6ccce7146104f957806355f804b3146105365761021a565b806334918dfd146103e65780633af32abf146103fd5780633ccfd60b1461043a578063413ab4a8146104515761021a565b806318160ddd116101ed57806318160ddd146102ed57806323b872dd146103185780632a5cde09146103415780632edd8bc61461037e5780632f745c59146103a95761021a565b806301ffc9a71461021f57806306fdde031461025c578063081812fc14610287578063095ea7b3146102c4575b600080fd5b34801561022b57600080fd5b50610246600480360381019061024191906135f5565b6108cf565b6040516102539190613c9b565b60405180910390f35b34801561026857600080fd5b50610271610949565b60405161027e9190613cb6565b60405180910390f35b34801561029357600080fd5b506102ae60048036038101906102a99190613688565b6109db565b6040516102bb9190613bdb565b60405180910390f35b3480156102d057600080fd5b506102eb60048036038101906102e691906135b9565b610a60565b005b3480156102f957600080fd5b50610302610b78565b60405161030f9190614038565b60405180910390f35b34801561032457600080fd5b5061033f600480360381019061033a91906134b3565b610b85565b005b34801561034d57600080fd5b506103686004803603810190610363919061344e565b610be5565b6040516103759190613c79565b60405180910390f35b34801561038a57600080fd5b50610393610cdf565b6040516103a09190614038565b60405180910390f35b3480156103b557600080fd5b506103d060048036038101906103cb91906135b9565b610ce5565b6040516103dd9190614038565b60405180910390f35b3480156103f257600080fd5b506103fb610d8a565b005b34801561040957600080fd5b50610424600480360381019061041f919061344e565b610e32565b6040516104319190613c9b565b60405180910390f35b34801561044657600080fd5b5061044f610ecc565b005b34801561045d57600080fd5b50610466610f97565b6040516104739190614038565b60405180910390f35b34801561048857600080fd5b506104a3600480360381019061049e9190613688565b610f9d565b005b3480156104b157600080fd5b506104cc60048036038101906104c791906134b3565b611023565b005b3480156104da57600080fd5b506104e3611043565b6040516104f09190614038565b60405180910390f35b34801561050557600080fd5b50610520600480360381019061051b9190613688565b611049565b60405161052d9190614038565b60405180910390f35b34801561054257600080fd5b5061055d60048036038101906105589190613647565b6110e0565b005b34801561056b57600080fd5b50610574611176565b6040516105819190614038565b60405180910390f35b34801561059657600080fd5b506105b160048036038101906105ac9190613688565b611180565b6040516105be9190613bdb565b60405180910390f35b3480156105d357600080fd5b506105dc611232565b6040516105e99190613c9b565b60405180910390f35b3480156105fe57600080fd5b506106196004803603810190610614919061344e565b611245565b6040516106269190614038565b60405180910390f35b34801561063b57600080fd5b506106446112fd565b005b34801561065257600080fd5b5061065b611385565b6040516106689190613bdb565b60405180910390f35b34801561067d57600080fd5b5061069860048036038101906106939190613688565b6113af565b005b3480156106a657600080fd5b506106af611435565b6040516106bc9190613cb6565b60405180910390f35b3480156106d157600080fd5b506106da6114c7565b6040516106e79190614038565b60405180910390f35b3480156106fc57600080fd5b506107176004803603810190610712919061344e565b6114d1565b60405161072693929190613c42565b60405180910390f35b34801561073b57600080fd5b506107566004803603810190610751919061357d565b61151b565b005b34801561076457600080fd5b5061077f600480360381019061077a91906135b9565b61169c565b005b34801561078d57600080fd5b506107a860048036038101906107a39190613688565b6117be565b005b3480156107b657600080fd5b506107d160048036038101906107cc9190613502565b611adf565b005b3480156107df57600080fd5b506107fa60048036038101906107f59190613688565b611b41565b6040516108079190613cb6565b60405180910390f35b61082a60048036038101906108259190613688565b611be8565b005b34801561083857600080fd5b50610853600480360381019061084e91906135b9565b611d6f565b6040516108609190613c9b565b60405180910390f35b34801561087557600080fd5b50610890600480360381019061088b9190613477565b611f50565b60405161089d9190613c9b565b60405180910390f35b3480156108b257600080fd5b506108cd60048036038101906108c8919061344e565b611fe4565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109425750610941826120dc565b5b9050919050565b60606000805461095890614321565b80601f016020809104026020016040519081016040528092919081815260200182805461098490614321565b80156109d15780601f106109a6576101008083540402835291602001916109d1565b820191906000526020600020905b8154815290600101906020018083116109b457829003601f168201915b5050505050905090565b60006109e6826121be565b610a25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1c90613eb8565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a6b82611180565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610adc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad390613f58565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610afb61222a565b73ffffffffffffffffffffffffffffffffffffffff161480610b2a5750610b2981610b2461222a565b611f50565b5b610b69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6090613df8565b60405180910390fd5b610b738383612232565b505050565b6000600880549050905090565b610b96610b9061222a565b826122eb565b610bd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcc90613f98565b60405180910390fd5b610be08383836123c9565b505050565b60606000610bf283611245565b905060008167ffffffffffffffff811115610c36577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015610c645781602001602082028036833780820191505090505b50905060005b82811015610cd457610c7c8582610ce5565b828281518110610cb5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080610ccc90614384565b915050610c6a565b508092505050919050565b600d5481565b6000610cf083611245565b8210610d31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2890613cd8565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610d9261222a565b73ffffffffffffffffffffffffffffffffffffffff16610db0611385565b73ffffffffffffffffffffffffffffffffffffffff1614610e06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfd90613ed8565b60405180910390fd5b600e60009054906101000a900460ff1615600e60006101000a81548160ff021916908315150217905550565b60008173ffffffffffffffffffffffffffffffffffffffff16600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16149050919050565b610ed461222a565b73ffffffffffffffffffffffffffffffffffffffff16610ef2611385565b73ffffffffffffffffffffffffffffffffffffffff1614610f48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3f90613ed8565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610f93573d6000803e3d6000fd5b5050565b600c5481565b610fa561222a565b73ffffffffffffffffffffffffffffffffffffffff16610fc3611385565b73ffffffffffffffffffffffffffffffffffffffff1614611019576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101090613ed8565b60405180910390fd5b80600c8190555050565b61103e83838360405180602001604052806000815250611adf565b505050565b61271081565b6000611053610b78565b8210611094576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108b90613fb8565b60405180910390fd5b600882815481106110ce577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6110e861222a565b73ffffffffffffffffffffffffffffffffffffffff16611106611385565b73ffffffffffffffffffffffffffffffffffffffff161461115c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115390613ed8565b60405180910390fd5b80600b9080519060200190611172929190613272565b5050565b6000600c54905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611229576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122090613e38565b60405180910390fd5b80915050919050565b600e60009054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ad90613e18565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61130561222a565b73ffffffffffffffffffffffffffffffffffffffff16611323611385565b73ffffffffffffffffffffffffffffffffffffffff1614611379576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137090613ed8565b60405180910390fd5b6113836000612625565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6113b761222a565b73ffffffffffffffffffffffffffffffffffffffff166113d5611385565b73ffffffffffffffffffffffffffffffffffffffff161461142b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142290613ed8565b60405180910390fd5b80600d8190555050565b60606001805461144490614321565b80601f016020809104026020016040519081016040528092919081815260200182805461147090614321565b80156114bd5780601f10611492576101008083540402835291602001916114bd565b820191906000526020600020905b8154815290600101906020018083116114a057829003601f168201915b5050505050905090565b6000600d54905090565b600f6020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154905083565b61152361222a565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611591576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158890613d98565b60405180910390fd5b806005600061159e61222a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661164b61222a565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116909190613c9b565b60405180910390a35050565b6116a461222a565b73ffffffffffffffffffffffffffffffffffffffff166116c2611385565b73ffffffffffffffffffffffffffffffffffffffff1614611718576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170f90613ed8565b60405180910390fd5b600c5481111561175d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175490613e78565b60405180910390fd5b6000611767610b78565b90506000600190505b82811161179f5761178c8482846117879190614156565b6126eb565b808061179790614384565b915050611770565b5081600c60008282546117b29190614237565b92505081905550505050565b60006117c8610b78565b9050601482111561180e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180590613db8565b60405180910390fd5b600c5461271061181e9190614237565b82611827610b78565b6118319190614156565b1115611872576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186990613e58565b60405180910390fd5b6000600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154116118f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ee90614018565b60405180910390fd5b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015482111561197c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197390613d58565b60405180910390fd5b6000600190505b8281116119b25761199f33828461199a9190614156565b6126eb565b80806119aa90614384565b915050611983565b5081600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154611a019190614237565b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555081600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154611a959190614156565b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055505050565b611af0611aea61222a565b836122eb565b611b2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2690613f98565b60405180910390fd5b611b3b84848484612709565b50505050565b6060611b4c826121be565b611b8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8290613f18565b60405180910390fd5b6000611b95612765565b90506000815111611bb55760405180602001604052806000815250611be0565b80611bbf846127f7565b604051602001611bd0929190613bb7565b6040516020818303038152906040525b915050919050565b6000611bf2610b78565b9050600e60009054906101000a900460ff16611c43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3a90613ff8565b60405180910390fd5b6014821115611c87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7e90613db8565b60405180910390fd5b600c54612710611c979190614237565b8282611ca39190614156565b1115611ce4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cdb90613fd8565b60405180910390fd5b81600d54611cf291906141dd565b341015611d34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2b90613f78565b60405180910390fd5b6000600190505b828111611d6a57611d57338284611d529190614156565b6126eb565b8080611d6290614384565b915050611d3b565b505050565b6000611d7961222a565b73ffffffffffffffffffffffffffffffffffffffff16611d97611385565b73ffffffffffffffffffffffffffffffffffffffff1614611ded576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de490613ed8565b60405180910390fd5b611df683610e32565b15611e36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2d90613f38565b60405180910390fd5b82600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055506000600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055506001905092915050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611fec61222a565b73ffffffffffffffffffffffffffffffffffffffff1661200a611385565b73ffffffffffffffffffffffffffffffffffffffff1614612060576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205790613ed8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156120d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c790613d18565b60405180910390fd5b6120d981612625565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806121a757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806121b757506121b6826129a4565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166122a583611180565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006122f6826121be565b612335576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232c90613dd8565b60405180910390fd5b600061234083611180565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806123af57508373ffffffffffffffffffffffffffffffffffffffff16612397846109db565b73ffffffffffffffffffffffffffffffffffffffff16145b806123c057506123bf8185611f50565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166123e982611180565b73ffffffffffffffffffffffffffffffffffffffff161461243f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243690613ef8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156124af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a690613d78565b60405180910390fd5b6124ba838383612a0e565b6124c5600082612232565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125159190614237565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461256c9190614156565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612705828260405180602001604052806000815250612b22565b5050565b6127148484846123c9565b61272084848484612b7d565b61275f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275690613cf8565b60405180910390fd5b50505050565b6060600b805461277490614321565b80601f01602080910402602001604051908101604052809291908181526020018280546127a090614321565b80156127ed5780601f106127c2576101008083540402835291602001916127ed565b820191906000526020600020905b8154815290600101906020018083116127d057829003601f168201915b5050505050905090565b6060600082141561283f576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061299f565b600082905060005b6000821461287157808061285a90614384565b915050600a8261286a91906141ac565b9150612847565b60008167ffffffffffffffff8111156128b3577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156128e55781602001600182028036833780820191505090505b5090505b60008514612998576001826128fe9190614237565b9150600a8561290d91906143cd565b60306129199190614156565b60f81b818381518110612955577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561299191906141ac565b94506128e9565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612a19838383612d14565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612a5c57612a5781612d19565b612a9b565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612a9a57612a998382612d62565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ade57612ad981612ecf565b612b1d565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612b1c57612b1b8282613012565b5b5b505050565b612b2c8383613091565b612b396000848484612b7d565b612b78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6f90613cf8565b60405180910390fd5b505050565b6000612b9e8473ffffffffffffffffffffffffffffffffffffffff1661325f565b15612d07578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612bc761222a565b8786866040518563ffffffff1660e01b8152600401612be99493929190613bf6565b602060405180830381600087803b158015612c0357600080fd5b505af1925050508015612c3457506040513d601f19601f82011682018060405250810190612c31919061361e565b60015b612cb7573d8060008114612c64576040519150601f19603f3d011682016040523d82523d6000602084013e612c69565b606091505b50600081511415612caf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ca690613cf8565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612d0c565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612d6f84611245565b612d799190614237565b9050600060076000848152602001908152602001600020549050818114612e5e576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612ee39190614237565b9050600060096000848152602001908152602001600020549050600060088381548110612f39577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612f81577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612ff6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061301d83611245565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613101576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130f890613e98565b60405180910390fd5b61310a816121be565b1561314a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161314190613d38565b60405180910390fd5b61315660008383612a0e565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546131a69190614156565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b82805461327e90614321565b90600052602060002090601f0160209004810192826132a057600085556132e7565b82601f106132b957805160ff19168380011785556132e7565b828001600101855582156132e7579182015b828111156132e65782518255916020019190600101906132cb565b5b5090506132f491906132f8565b5090565b5b808211156133115760008160009055506001016132f9565b5090565b600061332861332384614078565b614053565b90508281526020810184848401111561334057600080fd5b61334b8482856142df565b509392505050565b6000613366613361846140a9565b614053565b90508281526020810184848401111561337e57600080fd5b6133898482856142df565b509392505050565b6000813590506133a081614b7e565b92915050565b6000813590506133b581614b95565b92915050565b6000813590506133ca81614bac565b92915050565b6000815190506133df81614bac565b92915050565b600082601f8301126133f657600080fd5b8135613406848260208601613315565b91505092915050565b600082601f83011261342057600080fd5b8135613430848260208601613353565b91505092915050565b60008135905061344881614bc3565b92915050565b60006020828403121561346057600080fd5b600061346e84828501613391565b91505092915050565b6000806040838503121561348a57600080fd5b600061349885828601613391565b92505060206134a985828601613391565b9150509250929050565b6000806000606084860312156134c857600080fd5b60006134d686828701613391565b93505060206134e786828701613391565b92505060406134f886828701613439565b9150509250925092565b6000806000806080858703121561351857600080fd5b600061352687828801613391565b945050602061353787828801613391565b935050604061354887828801613439565b925050606085013567ffffffffffffffff81111561356557600080fd5b613571878288016133e5565b91505092959194509250565b6000806040838503121561359057600080fd5b600061359e85828601613391565b92505060206135af858286016133a6565b9150509250929050565b600080604083850312156135cc57600080fd5b60006135da85828601613391565b92505060206135eb85828601613439565b9150509250929050565b60006020828403121561360757600080fd5b6000613615848285016133bb565b91505092915050565b60006020828403121561363057600080fd5b600061363e848285016133d0565b91505092915050565b60006020828403121561365957600080fd5b600082013567ffffffffffffffff81111561367357600080fd5b61367f8482850161340f565b91505092915050565b60006020828403121561369a57600080fd5b60006136a884828501613439565b91505092915050565b60006136bd8383613b99565b60208301905092915050565b6136d28161426b565b82525050565b60006136e3826140ea565b6136ed8185614118565b93506136f8836140da565b8060005b8381101561372957815161371088826136b1565b975061371b8361410b565b9250506001810190506136fc565b5085935050505092915050565b61373f8161427d565b82525050565b6000613750826140f5565b61375a8185614129565b935061376a8185602086016142ee565b613773816144ba565b840191505092915050565b600061378982614100565b613793818561413a565b93506137a38185602086016142ee565b6137ac816144ba565b840191505092915050565b60006137c282614100565b6137cc818561414b565b93506137dc8185602086016142ee565b80840191505092915050565b60006137f5602b8361413a565b9150613800826144cb565b604082019050919050565b600061381860328361413a565b91506138238261451a565b604082019050919050565b600061383b60268361413a565b915061384682614569565b604082019050919050565b600061385e601c8361413a565b9150613869826145b8565b602082019050919050565b600061388160368361413a565b915061388c826145e1565b604082019050919050565b60006138a460248361413a565b91506138af82614630565b604082019050919050565b60006138c760198361413a565b91506138d28261467f565b602082019050919050565b60006138ea60208361413a565b91506138f5826146a8565b602082019050919050565b600061390d602c8361413a565b9150613918826146d1565b604082019050919050565b600061393060388361413a565b915061393b82614720565b604082019050919050565b6000613953602a8361413a565b915061395e8261476f565b604082019050919050565b600061397660298361413a565b9150613981826147be565b604082019050919050565b600061399960128361413a565b91506139a48261480d565b602082019050919050565b60006139bc60178361413a565b91506139c782614836565b602082019050919050565b60006139df60208361413a565b91506139ea8261485f565b602082019050919050565b6000613a02602c8361413a565b9150613a0d82614888565b604082019050919050565b6000613a2560208361413a565b9150613a30826148d7565b602082019050919050565b6000613a4860298361413a565b9150613a5382614900565b604082019050919050565b6000613a6b602f8361413a565b9150613a768261494f565b604082019050919050565b6000613a8e60138361413a565b9150613a998261499e565b602082019050919050565b6000613ab160218361413a565b9150613abc826149c7565b604082019050919050565b6000613ad460198361413a565b9150613adf82614a16565b602082019050919050565b6000613af760318361413a565b9150613b0282614a3f565b604082019050919050565b6000613b1a602c8361413a565b9150613b2582614a8e565b604082019050919050565b6000613b3d602a8361413a565b9150613b4882614add565b604082019050919050565b6000613b6060108361413a565b9150613b6b82614b2c565b602082019050919050565b6000613b83601b8361413a565b9150613b8e82614b55565b602082019050919050565b613ba2816142d5565b82525050565b613bb1816142d5565b82525050565b6000613bc382856137b7565b9150613bcf82846137b7565b91508190509392505050565b6000602082019050613bf060008301846136c9565b92915050565b6000608082019050613c0b60008301876136c9565b613c1860208301866136c9565b613c256040830185613ba8565b8181036060830152613c378184613745565b905095945050505050565b6000606082019050613c5760008301866136c9565b613c646020830185613ba8565b613c716040830184613ba8565b949350505050565b60006020820190508181036000830152613c9381846136d8565b905092915050565b6000602082019050613cb06000830184613736565b92915050565b60006020820190508181036000830152613cd0818461377e565b905092915050565b60006020820190508181036000830152613cf1816137e8565b9050919050565b60006020820190508181036000830152613d118161380b565b9050919050565b60006020820190508181036000830152613d318161382e565b9050919050565b60006020820190508181036000830152613d5181613851565b9050919050565b60006020820190508181036000830152613d7181613874565b9050919050565b60006020820190508181036000830152613d9181613897565b9050919050565b60006020820190508181036000830152613db1816138ba565b9050919050565b60006020820190508181036000830152613dd1816138dd565b9050919050565b60006020820190508181036000830152613df181613900565b9050919050565b60006020820190508181036000830152613e1181613923565b9050919050565b60006020820190508181036000830152613e3181613946565b9050919050565b60006020820190508181036000830152613e5181613969565b9050919050565b60006020820190508181036000830152613e718161398c565b9050919050565b60006020820190508181036000830152613e91816139af565b9050919050565b60006020820190508181036000830152613eb1816139d2565b9050919050565b60006020820190508181036000830152613ed1816139f5565b9050919050565b60006020820190508181036000830152613ef181613a18565b9050919050565b60006020820190508181036000830152613f1181613a3b565b9050919050565b60006020820190508181036000830152613f3181613a5e565b9050919050565b60006020820190508181036000830152613f5181613a81565b9050919050565b60006020820190508181036000830152613f7181613aa4565b9050919050565b60006020820190508181036000830152613f9181613ac7565b9050919050565b60006020820190508181036000830152613fb181613aea565b9050919050565b60006020820190508181036000830152613fd181613b0d565b9050919050565b60006020820190508181036000830152613ff181613b30565b9050919050565b6000602082019050818103600083015261401181613b53565b9050919050565b6000602082019050818103600083015261403181613b76565b9050919050565b600060208201905061404d6000830184613ba8565b92915050565b600061405d61406e565b90506140698282614353565b919050565b6000604051905090565b600067ffffffffffffffff8211156140935761409261448b565b5b61409c826144ba565b9050602081019050919050565b600067ffffffffffffffff8211156140c4576140c361448b565b5b6140cd826144ba565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614161826142d5565b915061416c836142d5565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156141a1576141a06143fe565b5b828201905092915050565b60006141b7826142d5565b91506141c2836142d5565b9250826141d2576141d161442d565b5b828204905092915050565b60006141e8826142d5565b91506141f3836142d5565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561422c5761422b6143fe565b5b828202905092915050565b6000614242826142d5565b915061424d836142d5565b9250828210156142605761425f6143fe565b5b828203905092915050565b6000614276826142b5565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561430c5780820151818401526020810190506142f1565b8381111561431b576000848401525b50505050565b6000600282049050600182168061433957607f821691505b6020821081141561434d5761434c61445c565b5b50919050565b61435c826144ba565b810181811067ffffffffffffffff8211171561437b5761437a61448b565b5b80604052505050565b600061438f826142d5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156143c2576143c16143fe565b5b600182019050919050565b60006143d8826142d5565b91506143e3836142d5565b9250826143f3576143f261442d565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f596f752068617665206c657373204e46547320746f20636c61696d2e20496e7060008201527f75742074686520636f727265637420616d6f756e742e00000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f596f752063616e206d696e7420323020746f6b656e7320617420612074696d65600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45786365656473206d617820737570706c790000000000000000000000000000600082015250565b7f4578636565647320726573657276656420737570706c79000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f416c72656164792077686974656c697374656400000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f45746865722073656e74206973206e6f7420636f727265637400000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f50757263686173652065786365656473206d6178696d756d20737570706c792060008201527f6f66204265737469657300000000000000000000000000000000000000000000602082015250565b7f53616c6520697320696e61637469766500000000000000000000000000000000600082015250565b7f596f752068617665206e6f20616d6f756e7420746f20636c61696d0000000000600082015250565b614b878161426b565b8114614b9257600080fd5b50565b614b9e8161427d565b8114614ba957600080fd5b50565b614bb581614289565b8114614bc057600080fd5b50565b614bcc816142d5565b8114614bd757600080fd5b5056fea2646970667358221220cb55b023bb59b54a12529ead09dce09b37123f8e01f68565695a476c1d85ec4964736f6c6343000804003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061021a5760003560e01c806359bf5d39116101235780639b19251a116100ab578063c87b56dd1161006f578063c87b56dd146107d3578063d070334514610810578063e17039b81461082c578063e985e9c514610869578063f2fde38b146108a65761021a565b80639b19251a146106f0578063a22cb4651461072f578063ad813c5514610758578063b0fdbb5b14610781578063b88d4fde146107aa5761021a565b8063715018a6116100f2578063715018a61461062f5780638da5cb5b1461064657806391b7f5ed1461067157806395d89b411461069a57806398d5fdca146106c55761021a565b806359bf5d391461055f5780636352211e1461058a57806368428a1b146105c757806370a08231146105f25761021a565b806334918dfd116101a65780634256dbe3116101755780634256dbe31461047c57806342842e0e146104a557806344fd2254146104ce5780634f6ccce7146104f957806355f804b3146105365761021a565b806334918dfd146103e65780633af32abf146103fd5780633ccfd60b1461043a578063413ab4a8146104515761021a565b806318160ddd116101ed57806318160ddd146102ed57806323b872dd146103185780632a5cde09146103415780632edd8bc61461037e5780632f745c59146103a95761021a565b806301ffc9a71461021f57806306fdde031461025c578063081812fc14610287578063095ea7b3146102c4575b600080fd5b34801561022b57600080fd5b50610246600480360381019061024191906135f5565b6108cf565b6040516102539190613c9b565b60405180910390f35b34801561026857600080fd5b50610271610949565b60405161027e9190613cb6565b60405180910390f35b34801561029357600080fd5b506102ae60048036038101906102a99190613688565b6109db565b6040516102bb9190613bdb565b60405180910390f35b3480156102d057600080fd5b506102eb60048036038101906102e691906135b9565b610a60565b005b3480156102f957600080fd5b50610302610b78565b60405161030f9190614038565b60405180910390f35b34801561032457600080fd5b5061033f600480360381019061033a91906134b3565b610b85565b005b34801561034d57600080fd5b506103686004803603810190610363919061344e565b610be5565b6040516103759190613c79565b60405180910390f35b34801561038a57600080fd5b50610393610cdf565b6040516103a09190614038565b60405180910390f35b3480156103b557600080fd5b506103d060048036038101906103cb91906135b9565b610ce5565b6040516103dd9190614038565b60405180910390f35b3480156103f257600080fd5b506103fb610d8a565b005b34801561040957600080fd5b50610424600480360381019061041f919061344e565b610e32565b6040516104319190613c9b565b60405180910390f35b34801561044657600080fd5b5061044f610ecc565b005b34801561045d57600080fd5b50610466610f97565b6040516104739190614038565b60405180910390f35b34801561048857600080fd5b506104a3600480360381019061049e9190613688565b610f9d565b005b3480156104b157600080fd5b506104cc60048036038101906104c791906134b3565b611023565b005b3480156104da57600080fd5b506104e3611043565b6040516104f09190614038565b60405180910390f35b34801561050557600080fd5b50610520600480360381019061051b9190613688565b611049565b60405161052d9190614038565b60405180910390f35b34801561054257600080fd5b5061055d60048036038101906105589190613647565b6110e0565b005b34801561056b57600080fd5b50610574611176565b6040516105819190614038565b60405180910390f35b34801561059657600080fd5b506105b160048036038101906105ac9190613688565b611180565b6040516105be9190613bdb565b60405180910390f35b3480156105d357600080fd5b506105dc611232565b6040516105e99190613c9b565b60405180910390f35b3480156105fe57600080fd5b506106196004803603810190610614919061344e565b611245565b6040516106269190614038565b60405180910390f35b34801561063b57600080fd5b506106446112fd565b005b34801561065257600080fd5b5061065b611385565b6040516106689190613bdb565b60405180910390f35b34801561067d57600080fd5b5061069860048036038101906106939190613688565b6113af565b005b3480156106a657600080fd5b506106af611435565b6040516106bc9190613cb6565b60405180910390f35b3480156106d157600080fd5b506106da6114c7565b6040516106e79190614038565b60405180910390f35b3480156106fc57600080fd5b506107176004803603810190610712919061344e565b6114d1565b60405161072693929190613c42565b60405180910390f35b34801561073b57600080fd5b506107566004803603810190610751919061357d565b61151b565b005b34801561076457600080fd5b5061077f600480360381019061077a91906135b9565b61169c565b005b34801561078d57600080fd5b506107a860048036038101906107a39190613688565b6117be565b005b3480156107b657600080fd5b506107d160048036038101906107cc9190613502565b611adf565b005b3480156107df57600080fd5b506107fa60048036038101906107f59190613688565b611b41565b6040516108079190613cb6565b60405180910390f35b61082a60048036038101906108259190613688565b611be8565b005b34801561083857600080fd5b50610853600480360381019061084e91906135b9565b611d6f565b6040516108609190613c9b565b60405180910390f35b34801561087557600080fd5b50610890600480360381019061088b9190613477565b611f50565b60405161089d9190613c9b565b60405180910390f35b3480156108b257600080fd5b506108cd60048036038101906108c8919061344e565b611fe4565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109425750610941826120dc565b5b9050919050565b60606000805461095890614321565b80601f016020809104026020016040519081016040528092919081815260200182805461098490614321565b80156109d15780601f106109a6576101008083540402835291602001916109d1565b820191906000526020600020905b8154815290600101906020018083116109b457829003601f168201915b5050505050905090565b60006109e6826121be565b610a25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1c90613eb8565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a6b82611180565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610adc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad390613f58565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610afb61222a565b73ffffffffffffffffffffffffffffffffffffffff161480610b2a5750610b2981610b2461222a565b611f50565b5b610b69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6090613df8565b60405180910390fd5b610b738383612232565b505050565b6000600880549050905090565b610b96610b9061222a565b826122eb565b610bd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcc90613f98565b60405180910390fd5b610be08383836123c9565b505050565b60606000610bf283611245565b905060008167ffffffffffffffff811115610c36577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015610c645781602001602082028036833780820191505090505b50905060005b82811015610cd457610c7c8582610ce5565b828281518110610cb5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080610ccc90614384565b915050610c6a565b508092505050919050565b600d5481565b6000610cf083611245565b8210610d31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2890613cd8565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610d9261222a565b73ffffffffffffffffffffffffffffffffffffffff16610db0611385565b73ffffffffffffffffffffffffffffffffffffffff1614610e06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfd90613ed8565b60405180910390fd5b600e60009054906101000a900460ff1615600e60006101000a81548160ff021916908315150217905550565b60008173ffffffffffffffffffffffffffffffffffffffff16600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16149050919050565b610ed461222a565b73ffffffffffffffffffffffffffffffffffffffff16610ef2611385565b73ffffffffffffffffffffffffffffffffffffffff1614610f48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3f90613ed8565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610f93573d6000803e3d6000fd5b5050565b600c5481565b610fa561222a565b73ffffffffffffffffffffffffffffffffffffffff16610fc3611385565b73ffffffffffffffffffffffffffffffffffffffff1614611019576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101090613ed8565b60405180910390fd5b80600c8190555050565b61103e83838360405180602001604052806000815250611adf565b505050565b61271081565b6000611053610b78565b8210611094576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108b90613fb8565b60405180910390fd5b600882815481106110ce577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6110e861222a565b73ffffffffffffffffffffffffffffffffffffffff16611106611385565b73ffffffffffffffffffffffffffffffffffffffff161461115c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115390613ed8565b60405180910390fd5b80600b9080519060200190611172929190613272565b5050565b6000600c54905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611229576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122090613e38565b60405180910390fd5b80915050919050565b600e60009054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ad90613e18565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61130561222a565b73ffffffffffffffffffffffffffffffffffffffff16611323611385565b73ffffffffffffffffffffffffffffffffffffffff1614611379576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137090613ed8565b60405180910390fd5b6113836000612625565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6113b761222a565b73ffffffffffffffffffffffffffffffffffffffff166113d5611385565b73ffffffffffffffffffffffffffffffffffffffff161461142b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142290613ed8565b60405180910390fd5b80600d8190555050565b60606001805461144490614321565b80601f016020809104026020016040519081016040528092919081815260200182805461147090614321565b80156114bd5780601f10611492576101008083540402835291602001916114bd565b820191906000526020600020905b8154815290600101906020018083116114a057829003601f168201915b5050505050905090565b6000600d54905090565b600f6020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154905083565b61152361222a565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611591576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158890613d98565b60405180910390fd5b806005600061159e61222a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661164b61222a565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116909190613c9b565b60405180910390a35050565b6116a461222a565b73ffffffffffffffffffffffffffffffffffffffff166116c2611385565b73ffffffffffffffffffffffffffffffffffffffff1614611718576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170f90613ed8565b60405180910390fd5b600c5481111561175d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175490613e78565b60405180910390fd5b6000611767610b78565b90506000600190505b82811161179f5761178c8482846117879190614156565b6126eb565b808061179790614384565b915050611770565b5081600c60008282546117b29190614237565b92505081905550505050565b60006117c8610b78565b9050601482111561180e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180590613db8565b60405180910390fd5b600c5461271061181e9190614237565b82611827610b78565b6118319190614156565b1115611872576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186990613e58565b60405180910390fd5b6000600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154116118f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ee90614018565b60405180910390fd5b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015482111561197c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197390613d58565b60405180910390fd5b6000600190505b8281116119b25761199f33828461199a9190614156565b6126eb565b80806119aa90614384565b915050611983565b5081600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154611a019190614237565b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555081600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154611a959190614156565b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055505050565b611af0611aea61222a565b836122eb565b611b2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2690613f98565b60405180910390fd5b611b3b84848484612709565b50505050565b6060611b4c826121be565b611b8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8290613f18565b60405180910390fd5b6000611b95612765565b90506000815111611bb55760405180602001604052806000815250611be0565b80611bbf846127f7565b604051602001611bd0929190613bb7565b6040516020818303038152906040525b915050919050565b6000611bf2610b78565b9050600e60009054906101000a900460ff16611c43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3a90613ff8565b60405180910390fd5b6014821115611c87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7e90613db8565b60405180910390fd5b600c54612710611c979190614237565b8282611ca39190614156565b1115611ce4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cdb90613fd8565b60405180910390fd5b81600d54611cf291906141dd565b341015611d34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2b90613f78565b60405180910390fd5b6000600190505b828111611d6a57611d57338284611d529190614156565b6126eb565b8080611d6290614384565b915050611d3b565b505050565b6000611d7961222a565b73ffffffffffffffffffffffffffffffffffffffff16611d97611385565b73ffffffffffffffffffffffffffffffffffffffff1614611ded576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de490613ed8565b60405180910390fd5b611df683610e32565b15611e36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2d90613f38565b60405180910390fd5b82600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055506000600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055506001905092915050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611fec61222a565b73ffffffffffffffffffffffffffffffffffffffff1661200a611385565b73ffffffffffffffffffffffffffffffffffffffff1614612060576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205790613ed8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156120d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c790613d18565b60405180910390fd5b6120d981612625565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806121a757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806121b757506121b6826129a4565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166122a583611180565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006122f6826121be565b612335576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232c90613dd8565b60405180910390fd5b600061234083611180565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806123af57508373ffffffffffffffffffffffffffffffffffffffff16612397846109db565b73ffffffffffffffffffffffffffffffffffffffff16145b806123c057506123bf8185611f50565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166123e982611180565b73ffffffffffffffffffffffffffffffffffffffff161461243f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243690613ef8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156124af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a690613d78565b60405180910390fd5b6124ba838383612a0e565b6124c5600082612232565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125159190614237565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461256c9190614156565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612705828260405180602001604052806000815250612b22565b5050565b6127148484846123c9565b61272084848484612b7d565b61275f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275690613cf8565b60405180910390fd5b50505050565b6060600b805461277490614321565b80601f01602080910402602001604051908101604052809291908181526020018280546127a090614321565b80156127ed5780601f106127c2576101008083540402835291602001916127ed565b820191906000526020600020905b8154815290600101906020018083116127d057829003601f168201915b5050505050905090565b6060600082141561283f576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061299f565b600082905060005b6000821461287157808061285a90614384565b915050600a8261286a91906141ac565b9150612847565b60008167ffffffffffffffff8111156128b3577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156128e55781602001600182028036833780820191505090505b5090505b60008514612998576001826128fe9190614237565b9150600a8561290d91906143cd565b60306129199190614156565b60f81b818381518110612955577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561299191906141ac565b94506128e9565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612a19838383612d14565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612a5c57612a5781612d19565b612a9b565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612a9a57612a998382612d62565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ade57612ad981612ecf565b612b1d565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612b1c57612b1b8282613012565b5b5b505050565b612b2c8383613091565b612b396000848484612b7d565b612b78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6f90613cf8565b60405180910390fd5b505050565b6000612b9e8473ffffffffffffffffffffffffffffffffffffffff1661325f565b15612d07578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612bc761222a565b8786866040518563ffffffff1660e01b8152600401612be99493929190613bf6565b602060405180830381600087803b158015612c0357600080fd5b505af1925050508015612c3457506040513d601f19601f82011682018060405250810190612c31919061361e565b60015b612cb7573d8060008114612c64576040519150601f19603f3d011682016040523d82523d6000602084013e612c69565b606091505b50600081511415612caf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ca690613cf8565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612d0c565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612d6f84611245565b612d799190614237565b9050600060076000848152602001908152602001600020549050818114612e5e576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612ee39190614237565b9050600060096000848152602001908152602001600020549050600060088381548110612f39577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612f81577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612ff6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061301d83611245565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613101576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130f890613e98565b60405180910390fd5b61310a816121be565b1561314a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161314190613d38565b60405180910390fd5b61315660008383612a0e565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546131a69190614156565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b82805461327e90614321565b90600052602060002090601f0160209004810192826132a057600085556132e7565b82601f106132b957805160ff19168380011785556132e7565b828001600101855582156132e7579182015b828111156132e65782518255916020019190600101906132cb565b5b5090506132f491906132f8565b5090565b5b808211156133115760008160009055506001016132f9565b5090565b600061332861332384614078565b614053565b90508281526020810184848401111561334057600080fd5b61334b8482856142df565b509392505050565b6000613366613361846140a9565b614053565b90508281526020810184848401111561337e57600080fd5b6133898482856142df565b509392505050565b6000813590506133a081614b7e565b92915050565b6000813590506133b581614b95565b92915050565b6000813590506133ca81614bac565b92915050565b6000815190506133df81614bac565b92915050565b600082601f8301126133f657600080fd5b8135613406848260208601613315565b91505092915050565b600082601f83011261342057600080fd5b8135613430848260208601613353565b91505092915050565b60008135905061344881614bc3565b92915050565b60006020828403121561346057600080fd5b600061346e84828501613391565b91505092915050565b6000806040838503121561348a57600080fd5b600061349885828601613391565b92505060206134a985828601613391565b9150509250929050565b6000806000606084860312156134c857600080fd5b60006134d686828701613391565b93505060206134e786828701613391565b92505060406134f886828701613439565b9150509250925092565b6000806000806080858703121561351857600080fd5b600061352687828801613391565b945050602061353787828801613391565b935050604061354887828801613439565b925050606085013567ffffffffffffffff81111561356557600080fd5b613571878288016133e5565b91505092959194509250565b6000806040838503121561359057600080fd5b600061359e85828601613391565b92505060206135af858286016133a6565b9150509250929050565b600080604083850312156135cc57600080fd5b60006135da85828601613391565b92505060206135eb85828601613439565b9150509250929050565b60006020828403121561360757600080fd5b6000613615848285016133bb565b91505092915050565b60006020828403121561363057600080fd5b600061363e848285016133d0565b91505092915050565b60006020828403121561365957600080fd5b600082013567ffffffffffffffff81111561367357600080fd5b61367f8482850161340f565b91505092915050565b60006020828403121561369a57600080fd5b60006136a884828501613439565b91505092915050565b60006136bd8383613b99565b60208301905092915050565b6136d28161426b565b82525050565b60006136e3826140ea565b6136ed8185614118565b93506136f8836140da565b8060005b8381101561372957815161371088826136b1565b975061371b8361410b565b9250506001810190506136fc565b5085935050505092915050565b61373f8161427d565b82525050565b6000613750826140f5565b61375a8185614129565b935061376a8185602086016142ee565b613773816144ba565b840191505092915050565b600061378982614100565b613793818561413a565b93506137a38185602086016142ee565b6137ac816144ba565b840191505092915050565b60006137c282614100565b6137cc818561414b565b93506137dc8185602086016142ee565b80840191505092915050565b60006137f5602b8361413a565b9150613800826144cb565b604082019050919050565b600061381860328361413a565b91506138238261451a565b604082019050919050565b600061383b60268361413a565b915061384682614569565b604082019050919050565b600061385e601c8361413a565b9150613869826145b8565b602082019050919050565b600061388160368361413a565b915061388c826145e1565b604082019050919050565b60006138a460248361413a565b91506138af82614630565b604082019050919050565b60006138c760198361413a565b91506138d28261467f565b602082019050919050565b60006138ea60208361413a565b91506138f5826146a8565b602082019050919050565b600061390d602c8361413a565b9150613918826146d1565b604082019050919050565b600061393060388361413a565b915061393b82614720565b604082019050919050565b6000613953602a8361413a565b915061395e8261476f565b604082019050919050565b600061397660298361413a565b9150613981826147be565b604082019050919050565b600061399960128361413a565b91506139a48261480d565b602082019050919050565b60006139bc60178361413a565b91506139c782614836565b602082019050919050565b60006139df60208361413a565b91506139ea8261485f565b602082019050919050565b6000613a02602c8361413a565b9150613a0d82614888565b604082019050919050565b6000613a2560208361413a565b9150613a30826148d7565b602082019050919050565b6000613a4860298361413a565b9150613a5382614900565b604082019050919050565b6000613a6b602f8361413a565b9150613a768261494f565b604082019050919050565b6000613a8e60138361413a565b9150613a998261499e565b602082019050919050565b6000613ab160218361413a565b9150613abc826149c7565b604082019050919050565b6000613ad460198361413a565b9150613adf82614a16565b602082019050919050565b6000613af760318361413a565b9150613b0282614a3f565b604082019050919050565b6000613b1a602c8361413a565b9150613b2582614a8e565b604082019050919050565b6000613b3d602a8361413a565b9150613b4882614add565b604082019050919050565b6000613b6060108361413a565b9150613b6b82614b2c565b602082019050919050565b6000613b83601b8361413a565b9150613b8e82614b55565b602082019050919050565b613ba2816142d5565b82525050565b613bb1816142d5565b82525050565b6000613bc382856137b7565b9150613bcf82846137b7565b91508190509392505050565b6000602082019050613bf060008301846136c9565b92915050565b6000608082019050613c0b60008301876136c9565b613c1860208301866136c9565b613c256040830185613ba8565b8181036060830152613c378184613745565b905095945050505050565b6000606082019050613c5760008301866136c9565b613c646020830185613ba8565b613c716040830184613ba8565b949350505050565b60006020820190508181036000830152613c9381846136d8565b905092915050565b6000602082019050613cb06000830184613736565b92915050565b60006020820190508181036000830152613cd0818461377e565b905092915050565b60006020820190508181036000830152613cf1816137e8565b9050919050565b60006020820190508181036000830152613d118161380b565b9050919050565b60006020820190508181036000830152613d318161382e565b9050919050565b60006020820190508181036000830152613d5181613851565b9050919050565b60006020820190508181036000830152613d7181613874565b9050919050565b60006020820190508181036000830152613d9181613897565b9050919050565b60006020820190508181036000830152613db1816138ba565b9050919050565b60006020820190508181036000830152613dd1816138dd565b9050919050565b60006020820190508181036000830152613df181613900565b9050919050565b60006020820190508181036000830152613e1181613923565b9050919050565b60006020820190508181036000830152613e3181613946565b9050919050565b60006020820190508181036000830152613e5181613969565b9050919050565b60006020820190508181036000830152613e718161398c565b9050919050565b60006020820190508181036000830152613e91816139af565b9050919050565b60006020820190508181036000830152613eb1816139d2565b9050919050565b60006020820190508181036000830152613ed1816139f5565b9050919050565b60006020820190508181036000830152613ef181613a18565b9050919050565b60006020820190508181036000830152613f1181613a3b565b9050919050565b60006020820190508181036000830152613f3181613a5e565b9050919050565b60006020820190508181036000830152613f5181613a81565b9050919050565b60006020820190508181036000830152613f7181613aa4565b9050919050565b60006020820190508181036000830152613f9181613ac7565b9050919050565b60006020820190508181036000830152613fb181613aea565b9050919050565b60006020820190508181036000830152613fd181613b0d565b9050919050565b60006020820190508181036000830152613ff181613b30565b9050919050565b6000602082019050818103600083015261401181613b53565b9050919050565b6000602082019050818103600083015261403181613b76565b9050919050565b600060208201905061404d6000830184613ba8565b92915050565b600061405d61406e565b90506140698282614353565b919050565b6000604051905090565b600067ffffffffffffffff8211156140935761409261448b565b5b61409c826144ba565b9050602081019050919050565b600067ffffffffffffffff8211156140c4576140c361448b565b5b6140cd826144ba565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614161826142d5565b915061416c836142d5565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156141a1576141a06143fe565b5b828201905092915050565b60006141b7826142d5565b91506141c2836142d5565b9250826141d2576141d161442d565b5b828204905092915050565b60006141e8826142d5565b91506141f3836142d5565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561422c5761422b6143fe565b5b828202905092915050565b6000614242826142d5565b915061424d836142d5565b9250828210156142605761425f6143fe565b5b828203905092915050565b6000614276826142b5565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561430c5780820151818401526020810190506142f1565b8381111561431b576000848401525b50505050565b6000600282049050600182168061433957607f821691505b6020821081141561434d5761434c61445c565b5b50919050565b61435c826144ba565b810181811067ffffffffffffffff8211171561437b5761437a61448b565b5b80604052505050565b600061438f826142d5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156143c2576143c16143fe565b5b600182019050919050565b60006143d8826142d5565b91506143e3836142d5565b9250826143f3576143f261442d565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f596f752068617665206c657373204e46547320746f20636c61696d2e20496e7060008201527f75742074686520636f727265637420616d6f756e742e00000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f596f752063616e206d696e7420323020746f6b656e7320617420612074696d65600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45786365656473206d617820737570706c790000000000000000000000000000600082015250565b7f4578636565647320726573657276656420737570706c79000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f416c72656164792077686974656c697374656400000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f45746865722073656e74206973206e6f7420636f727265637400000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f50757263686173652065786365656473206d6178696d756d20737570706c792060008201527f6f66204265737469657300000000000000000000000000000000000000000000602082015250565b7f53616c6520697320696e61637469766500000000000000000000000000000000600082015250565b7f596f752068617665206e6f20616d6f756e7420746f20636c61696d0000000000600082015250565b614b878161426b565b8114614b9257600080fd5b50565b614b9e8161427d565b8114614ba957600080fd5b50565b614bb581614289565b8114614bc057600080fd5b50565b614bcc816142d5565b8114614bd757600080fd5b5056fea2646970667358221220cb55b023bb59b54a12529ead09dce09b37123f8e01f68565695a476c1d85ec4964736f6c63430008040033

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

00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : baseURI (string):

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

45523:4026:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35126:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22039:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23598:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23121:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35766:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24488:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47850:340;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45732:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35434:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48828:85;;;;;;;;;;;;;:::i;:::-;;49257:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49397:140;;;;;;;;;;;;;:::i;:::-;;45643:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48629:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24898:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45680:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35956:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48198:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48734:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21733:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45779:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21463:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44829:94;;;;;;;;;;;;;:::i;:::-;;44178:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48430:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22208:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48533:88;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45926:46;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;23891:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46706:325;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47039:803;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25154:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22383:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46130:570;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48921:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24257:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45078:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35126:224;35228:4;35267:35;35252:50;;;:11;:50;;;;:90;;;;35306:36;35330:11;35306:23;:36::i;:::-;35252:90;35245:97;;35126:224;;;:::o;22039:100::-;22093:13;22126:5;22119:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22039:100;:::o;23598:221::-;23674:7;23702:16;23710:7;23702;:16::i;:::-;23694:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23787:15;:24;23803:7;23787:24;;;;;;;;;;;;;;;;;;;;;23780:31;;23598:221;;;:::o;23121:411::-;23202:13;23218:23;23233:7;23218:14;:23::i;:::-;23202:39;;23266:5;23260:11;;:2;:11;;;;23252:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;23360:5;23344:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;23369:37;23386:5;23393:12;:10;:12::i;:::-;23369:16;:37::i;:::-;23344:62;23322:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;23503:21;23512:2;23516:7;23503:8;:21::i;:::-;23121:411;;;:::o;35766:113::-;35827:7;35854:10;:17;;;;35847:24;;35766:113;:::o;24488:339::-;24683:41;24702:12;:10;:12::i;:::-;24716:7;24683:18;:41::i;:::-;24675:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24791:28;24801:4;24807:2;24811:7;24791:9;:28::i;:::-;24488:339;;;:::o;47850:340::-;47907:16;47936:18;47957:17;47967:6;47957:9;:17::i;:::-;47936:38;;47987:25;48029:10;48015:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47987:53;;48055:9;48051:106;48070:10;48066:1;:14;48051:106;;;48115:30;48135:6;48143:1;48115:19;:30::i;:::-;48101:8;48110:1;48101:11;;;;;;;;;;;;;;;;;;;;;:44;;;;;48082:3;;;;;:::i;:::-;;;;48051:106;;;;48174:8;48167:15;;;;47850:340;;;:::o;45732:40::-;;;;:::o;35434:256::-;35531:7;35567:23;35584:5;35567:16;:23::i;:::-;35559:5;:31;35551:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;35656:12;:19;35669:5;35656:19;;;;;;;;;;;;;;;:26;35676:5;35656:26;;;;;;;;;;;;35649:33;;35434:256;;;;:::o;48828:85::-;44409:12;:10;:12::i;:::-;44398:23;;:7;:5;:7::i;:::-;:23;;;44390:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48895:10:::1;;;;;;;;;;;48894:11;48881:10;;:24;;;;;;;;;;;;;;;;;;48828:85::o:0;49257:132::-;49315:18;49377:4;49353:28;;:9;:15;49363:4;49353:15;;;;;;;;;;;;;;;:20;;;;;;;;;;;;:28;;;49346:35;;49257:132;;;:::o;49397:140::-;44409:12;:10;:12::i;:::-;44398:23;;:7;:5;:7::i;:::-;:23;;;44390:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49445:12:::1;49460:21;49445:36;;49500:10;49492:28;;:37;49521:7;49492:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;44469:1;49397:140::o:0;45643:30::-;;;;:::o;48629:97::-;44409:12;:10;:12::i;:::-;44398:23;;:7;:5;:7::i;:::-;:23;;;44390:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48708:10:::1;48697:8;:21;;;;48629:97:::0;:::o;24898:185::-;25036:39;25053:4;25059:2;25063:7;25036:39;;;;;;;;;;;;:16;:39::i;:::-;24898:185;;;:::o;45680:45::-;45720:5;45680:45;:::o;35956:233::-;36031:7;36067:30;:28;:30::i;:::-;36059:5;:38;36051:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;36164:10;36175:5;36164:17;;;;;;;;;;;;;;;;;;;;;;;;36157:24;;35956:233;;;:::o;48198:102::-;44409:12;:10;:12::i;:::-;44398:23;;:7;:5;:7::i;:::-;:23;;;44390:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48285:7:::1;48269:13;:23;;;;;;;;;;;;:::i;:::-;;48198:102:::0;:::o;48734:86::-;48777:7;48804:8;;48797:15;;48734:86;:::o;21733:239::-;21805:7;21825:13;21841:7;:16;21849:7;21841:16;;;;;;;;;;;;;;;;;;;;;21825:32;;21893:1;21876:19;;:5;:19;;;;21868:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21959:5;21952:12;;;21733:239;;;:::o;45779:30::-;;;;;;;;;;;;;:::o;21463:208::-;21535:7;21580:1;21563:19;;:5;:19;;;;21555:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21647:9;:16;21657:5;21647:16;;;;;;;;;;;;;;;;21640:23;;21463:208;;;:::o;44829:94::-;44409:12;:10;:12::i;:::-;44398:23;;:7;:5;:7::i;:::-;:23;;;44390:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44894:21:::1;44912:1;44894:9;:21::i;:::-;44829:94::o:0;44178:87::-;44224:7;44251:6;;;;;;;;;;;44244:13;;44178:87;:::o;48430:95::-;44409:12;:10;:12::i;:::-;44398:23;;:7;:5;:7::i;:::-;:23;;;44390:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48509:8:::1;48494:12;:23;;;;48430:95:::0;:::o;22208:104::-;22264:13;22297:7;22290:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22208:104;:::o;48533:88::-;48574:7;48601:12;;48594:19;;48533:88;:::o;45926:46::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;23891:295::-;24006:12;:10;:12::i;:::-;23994:24;;:8;:24;;;;23986:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;24106:8;24061:18;:32;24080:12;:10;:12::i;:::-;24061:32;;;;;;;;;;;;;;;:42;24094:8;24061:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;24159:8;24130:48;;24145:12;:10;:12::i;:::-;24130:48;;;24169:8;24130:48;;;;;;:::i;:::-;;;;;;;;23891:295;;:::o;46706:325::-;44409:12;:10;:12::i;:::-;44398:23;;:7;:5;:7::i;:::-;:23;;;44390:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46812:8:::1;;46801:7;:19;;46792:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;46860:14;46877:13;:11;:13::i;:::-;46860:30;;46905:9;46917:1;46905:13;;46901:93;46926:7;46921:1;:12;46901:93;;46954:28;46965:3;46979:1;46970:6;:10;;;;:::i;:::-;46954:9;:28::i;:::-;46935:3;;;;;:::i;:::-;;;;46901:93;;;;47016:7;47004:8;;:19;;;;;;;:::i;:::-;;;;;;;;44469:1;46706:325:::0;;:::o;47039:803::-;47100:14;47117:13;:11;:13::i;:::-;47100:30;;47167:2;47149:14;:20;;47141:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;47276:8;;45720:5;47260:24;;;;:::i;:::-;47241:14;47225:13;:11;:13::i;:::-;:30;;;;:::i;:::-;:60;;47217:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;47363:1;47327:9;:21;47337:10;47327:21;;;;;;;;;;;;;;;:33;;;:37;47319:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;47433:9;:21;47443:10;47433:21;;;;;;;;;;;;;;;:33;;;47415:14;:51;;47407:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;47542:9;47554:1;47542:13;;47538:107;47563:14;47558:1;:19;47538:107;;47598:35;47609:10;47630:1;47621:6;:10;;;;:::i;:::-;47598:9;:35::i;:::-;47579:3;;;;;:::i;:::-;;;;47538:107;;;;47727:14;47691:9;:21;47701:10;47691:21;;;;;;;;;;;;;;;:33;;;:50;;;;:::i;:::-;47655:9;:21;47665:10;47655:21;;;;;;;;;;;;;;;:33;;:86;;;;47820:14;47786:9;:21;47796:10;47786:21;;;;;;;;;;;;;;;:31;;;:48;;;;:::i;:::-;47752:9;:21;47762:10;47752:21;;;;;;;;;;;;;;;:31;;:82;;;;47039:803;;:::o;25154:328::-;25329:41;25348:12;:10;:12::i;:::-;25362:7;25329:18;:41::i;:::-;25321:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25435:39;25449:4;25455:2;25459:7;25468:5;25435:13;:39::i;:::-;25154:328;;;;:::o;22383:334::-;22456:13;22490:16;22498:7;22490;:16::i;:::-;22482:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;22571:21;22595:10;:8;:10::i;:::-;22571:34;;22647:1;22629:7;22623:21;:25;:86;;;;;;;;;;;;;;;;;22675:7;22684:18;:7;:16;:18::i;:::-;22658:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;22623:86;22616:93;;;22383:334;;;:::o;46130:570::-;46201:14;46218:13;:11;:13::i;:::-;46201:30;;46250:10;;;;;;;;;;;46242:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;46319:2;46301:14;:20;;46292:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;46423:8;;45720:5;46407:24;;;;:::i;:::-;46388:14;46379:6;:23;;;;:::i;:::-;:53;;46370:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;46528:14;46513:12;;:29;;;;:::i;:::-;46500:9;:42;;46491:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;46591:9;46603:1;46591:13;;46587:106;46611:14;46606:1;:19;46587:106;;46646:35;46657:10;46678:1;46669:6;:10;;;;:::i;:::-;46646:9;:35::i;:::-;46627:3;;;;;:::i;:::-;;;;46587:106;;;;46130:570;;:::o;48921:328::-;49009:12;44409;:10;:12::i;:::-;44398:23;;:7;:5;:7::i;:::-;:23;;;44390:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49043:19:::1;49057:4;49043:13;:19::i;:::-;49042:20;49034:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;49120:4;49097:9;:15;49107:4;49097:15;;;;;;;;;;;;;;;:20;;;:27;;;;;;;;;;;;;;;;;;49165:11;49135:9;:15;49145:4;49135:15;;;;;;;;;;;;;;;:27;;:41;;;;49215:1;49187:9;:15;49197:4;49187:15;;;;;;;;;;;;;;;:25;;:29;;;;49237:4;49227:14;;48921:328:::0;;;;:::o;24257:164::-;24354:4;24378:18;:25;24397:5;24378:25;;;;;;;;;;;;;;;:35;24404:8;24378:35;;;;;;;;;;;;;;;;;;;;;;;;;24371:42;;24257:164;;;;:::o;45078:192::-;44409:12;:10;:12::i;:::-;44398:23;;:7;:5;:7::i;:::-;:23;;;44390:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45187:1:::1;45167:22;;:8;:22;;;;45159:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;45243:19;45253:8;45243:9;:19::i;:::-;45078:192:::0;:::o;21094:305::-;21196:4;21248:25;21233:40;;;:11;:40;;;;:105;;;;21305:33;21290:48;;;:11;:48;;;;21233:105;:158;;;;21355:36;21379:11;21355:23;:36::i;:::-;21233:158;21213:178;;21094:305;;;:::o;26992:127::-;27057:4;27109:1;27081:30;;:7;:16;27089:7;27081:16;;;;;;;;;;;;;;;;;;;;;:30;;;;27074:37;;26992:127;;;:::o;16556:98::-;16609:7;16636:10;16629:17;;16556:98;:::o;30974:174::-;31076:2;31049:15;:24;31065:7;31049:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;31132:7;31128:2;31094:46;;31103:23;31118:7;31103:14;:23::i;:::-;31094:46;;;;;;;;;;;;30974:174;;:::o;27286:348::-;27379:4;27404:16;27412:7;27404;:16::i;:::-;27396:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27480:13;27496:23;27511:7;27496:14;:23::i;:::-;27480:39;;27549:5;27538:16;;:7;:16;;;:51;;;;27582:7;27558:31;;:20;27570:7;27558:11;:20::i;:::-;:31;;;27538:51;:87;;;;27593:32;27610:5;27617:7;27593:16;:32::i;:::-;27538:87;27530:96;;;27286:348;;;;:::o;30278:578::-;30437:4;30410:31;;:23;30425:7;30410:14;:23::i;:::-;:31;;;30402:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;30520:1;30506:16;;:2;:16;;;;30498:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;30576:39;30597:4;30603:2;30607:7;30576:20;:39::i;:::-;30680:29;30697:1;30701:7;30680:8;:29::i;:::-;30741:1;30722:9;:15;30732:4;30722:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;30770:1;30753:9;:13;30763:2;30753:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30801:2;30782:7;:16;30790:7;30782:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30840:7;30836:2;30821:27;;30830:4;30821:27;;;;;;;;;;;;30278:578;;;:::o;45278:173::-;45334:16;45353:6;;;;;;;;;;;45334:25;;45379:8;45370:6;;:17;;;;;;;;;;;;;;;;;;45434:8;45403:40;;45424:8;45403:40;;;;;;;;;;;;45278:173;;:::o;27976:110::-;28052:26;28062:2;28066:7;28052:26;;;;;;;;;;;;:9;:26::i;:::-;27976:110;;:::o;26364:315::-;26521:28;26531:4;26537:2;26541:7;26521:9;:28::i;:::-;26568:48;26591:4;26597:2;26601:7;26610:5;26568:22;:48::i;:::-;26560:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;26364:315;;;;:::o;48308:114::-;48368:13;48401;48394:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48308:114;:::o;17071:723::-;17127:13;17357:1;17348:5;:10;17344:53;;;17375:10;;;;;;;;;;;;;;;;;;;;;17344:53;17407:12;17422:5;17407:20;;17438:14;17463:78;17478:1;17470:4;:9;17463:78;;17496:8;;;;;:::i;:::-;;;;17527:2;17519:10;;;;;:::i;:::-;;;17463:78;;;17551:19;17583:6;17573:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17551:39;;17601:154;17617:1;17608:5;:10;17601:154;;17645:1;17635:11;;;;;:::i;:::-;;;17712:2;17704:5;:10;;;;:::i;:::-;17691:2;:24;;;;:::i;:::-;17678:39;;17661:6;17668;17661:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;17741:2;17732:11;;;;;:::i;:::-;;;17601:154;;;17779:6;17765:21;;;;;17071:723;;;;:::o;19618:157::-;19703:4;19742:25;19727:40;;;:11;:40;;;;19720:47;;19618:157;;;:::o;36802:589::-;36946:45;36973:4;36979:2;36983:7;36946:26;:45::i;:::-;37024:1;37008:18;;:4;:18;;;37004:187;;;37043:40;37075:7;37043:31;:40::i;:::-;37004:187;;;37113:2;37105:10;;:4;:10;;;37101:90;;37132:47;37165:4;37171:7;37132:32;:47::i;:::-;37101:90;37004:187;37219:1;37205:16;;:2;:16;;;37201:183;;;37238:45;37275:7;37238:36;:45::i;:::-;37201:183;;;37311:4;37305:10;;:2;:10;;;37301:83;;37332:40;37360:2;37364:7;37332:27;:40::i;:::-;37301:83;37201:183;36802:589;;;:::o;28313:321::-;28443:18;28449:2;28453:7;28443:5;:18::i;:::-;28494:54;28525:1;28529:2;28533:7;28542:5;28494:22;:54::i;:::-;28472:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;28313:321;;;:::o;31713:803::-;31868:4;31889:15;:2;:13;;;:15::i;:::-;31885:624;;;31941:2;31925:36;;;31962:12;:10;:12::i;:::-;31976:4;31982:7;31991:5;31925:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;31921:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32188:1;32171:6;:13;:18;32167:272;;;32214:60;;;;;;;;;;:::i;:::-;;;;;;;;32167:272;32389:6;32383:13;32374:6;32370:2;32366:15;32359:38;31921:533;32058:45;;;32048:55;;;:6;:55;;;;32041:62;;;;;31885:624;32493:4;32486:11;;31713:803;;;;;;;:::o;33088:126::-;;;;:::o;38114:164::-;38218:10;:17;;;;38191:15;:24;38207:7;38191:24;;;;;;;;;;;:44;;;;38246:10;38262:7;38246:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38114:164;:::o;38905:988::-;39171:22;39221:1;39196:22;39213:4;39196:16;:22::i;:::-;:26;;;;:::i;:::-;39171:51;;39233:18;39254:17;:26;39272:7;39254:26;;;;;;;;;;;;39233:47;;39401:14;39387:10;:28;39383:328;;39432:19;39454:12;:18;39467:4;39454:18;;;;;;;;;;;;;;;:34;39473:14;39454:34;;;;;;;;;;;;39432:56;;39538:11;39505:12;:18;39518:4;39505:18;;;;;;;;;;;;;;;:30;39524:10;39505:30;;;;;;;;;;;:44;;;;39655:10;39622:17;:30;39640:11;39622:30;;;;;;;;;;;:43;;;;39383:328;;39807:17;:26;39825:7;39807:26;;;;;;;;;;;39800:33;;;39851:12;:18;39864:4;39851:18;;;;;;;;;;;;;;;:34;39870:14;39851:34;;;;;;;;;;;39844:41;;;38905:988;;;;:::o;40188:1079::-;40441:22;40486:1;40466:10;:17;;;;:21;;;;:::i;:::-;40441:46;;40498:18;40519:15;:24;40535:7;40519:24;;;;;;;;;;;;40498:45;;40870:19;40892:10;40903:14;40892:26;;;;;;;;;;;;;;;;;;;;;;;;40870:48;;40956:11;40931:10;40942;40931:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;41067:10;41036:15;:28;41052:11;41036:28;;;;;;;;;;;:41;;;;41208:15;:24;41224:7;41208:24;;;;;;;;;;;41201:31;;;41243:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40188:1079;;;;:::o;37692:221::-;37777:14;37794:20;37811:2;37794:16;:20::i;:::-;37777:37;;37852:7;37825:12;:16;37838:2;37825:16;;;;;;;;;;;;;;;:24;37842:6;37825:24;;;;;;;;;;;:34;;;;37899:6;37870:17;:26;37888:7;37870:26;;;;;;;;;;;:35;;;;37692:221;;;:::o;28970:382::-;29064:1;29050:16;;:2;:16;;;;29042:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;29123:16;29131:7;29123;:16::i;:::-;29122:17;29114:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;29185:45;29214:1;29218:2;29222:7;29185:20;:45::i;:::-;29260:1;29243:9;:13;29253:2;29243:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29291:2;29272:7;:16;29280:7;29272:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29336:7;29332:2;29311:33;;29328:1;29311:33;;;;;;;;;;;;28970:382;;:::o;8828:387::-;8888:4;9096:12;9163:7;9151:20;9143:28;;9206:1;9199:4;:8;9192:15;;;8828:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343: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:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;434:5;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;753:5;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;852:133::-;895:5;933:6;920:20;911:29;;949:30;973:5;949:30;:::i;:::-;901:84;;;;:::o;991:137::-;1036:5;1074:6;1061:20;1052:29;;1090:32;1116:5;1090:32;:::i;:::-;1042:86;;;;:::o;1134:141::-;1190:5;1221:6;1215:13;1206:22;;1237:32;1263:5;1237:32;:::i;:::-;1196:79;;;;:::o;1294:271::-;1349:5;1398:3;1391:4;1383:6;1379:17;1375:27;1365:2;;1416:1;1413;1406:12;1365:2;1456:6;1443:20;1481:78;1555:3;1547:6;1540:4;1532:6;1528:17;1481:78;:::i;:::-;1472:87;;1355:210;;;;;:::o;1585:273::-;1641:5;1690:3;1683:4;1675:6;1671:17;1667:27;1657:2;;1708:1;1705;1698:12;1657:2;1748:6;1735:20;1773:79;1848:3;1840:6;1833:4;1825:6;1821:17;1773:79;:::i;:::-;1764:88;;1647:211;;;;;:::o;1864:139::-;1910:5;1948:6;1935:20;1926:29;;1964:33;1991:5;1964:33;:::i;:::-;1916:87;;;;:::o;2009:262::-;2068:6;2117:2;2105:9;2096:7;2092:23;2088:32;2085:2;;;2133:1;2130;2123:12;2085:2;2176:1;2201:53;2246:7;2237:6;2226:9;2222:22;2201:53;:::i;:::-;2191:63;;2147:117;2075:196;;;;:::o;2277:407::-;2345:6;2353;2402:2;2390:9;2381:7;2377:23;2373:32;2370:2;;;2418:1;2415;2408:12;2370:2;2461:1;2486:53;2531:7;2522:6;2511:9;2507:22;2486:53;:::i;:::-;2476:63;;2432:117;2588:2;2614:53;2659:7;2650:6;2639:9;2635:22;2614:53;:::i;:::-;2604:63;;2559:118;2360:324;;;;;:::o;2690:552::-;2767:6;2775;2783;2832:2;2820:9;2811:7;2807:23;2803:32;2800:2;;;2848:1;2845;2838:12;2800:2;2891:1;2916:53;2961:7;2952:6;2941:9;2937:22;2916:53;:::i;:::-;2906:63;;2862:117;3018:2;3044:53;3089:7;3080:6;3069:9;3065:22;3044:53;:::i;:::-;3034:63;;2989:118;3146:2;3172:53;3217:7;3208:6;3197:9;3193:22;3172:53;:::i;:::-;3162:63;;3117:118;2790:452;;;;;:::o;3248:809::-;3343:6;3351;3359;3367;3416:3;3404:9;3395:7;3391:23;3387:33;3384:2;;;3433:1;3430;3423:12;3384:2;3476:1;3501:53;3546:7;3537:6;3526:9;3522:22;3501:53;:::i;:::-;3491:63;;3447:117;3603:2;3629:53;3674:7;3665:6;3654:9;3650:22;3629:53;:::i;:::-;3619:63;;3574:118;3731:2;3757:53;3802:7;3793:6;3782:9;3778:22;3757:53;:::i;:::-;3747:63;;3702:118;3887:2;3876:9;3872:18;3859:32;3918:18;3910:6;3907:30;3904:2;;;3950:1;3947;3940:12;3904:2;3978:62;4032:7;4023:6;4012:9;4008:22;3978:62;:::i;:::-;3968:72;;3830:220;3374:683;;;;;;;:::o;4063:401::-;4128:6;4136;4185:2;4173:9;4164:7;4160:23;4156:32;4153:2;;;4201:1;4198;4191:12;4153:2;4244:1;4269:53;4314:7;4305:6;4294:9;4290:22;4269:53;:::i;:::-;4259:63;;4215:117;4371:2;4397:50;4439:7;4430:6;4419:9;4415:22;4397:50;:::i;:::-;4387:60;;4342:115;4143:321;;;;;:::o;4470:407::-;4538:6;4546;4595:2;4583:9;4574:7;4570:23;4566:32;4563:2;;;4611:1;4608;4601:12;4563:2;4654:1;4679:53;4724:7;4715:6;4704:9;4700:22;4679:53;:::i;:::-;4669:63;;4625:117;4781:2;4807:53;4852:7;4843:6;4832:9;4828:22;4807:53;:::i;:::-;4797:63;;4752:118;4553:324;;;;;:::o;4883:260::-;4941:6;4990:2;4978:9;4969:7;4965:23;4961:32;4958:2;;;5006:1;5003;4996:12;4958:2;5049:1;5074:52;5118:7;5109:6;5098:9;5094:22;5074:52;:::i;:::-;5064:62;;5020:116;4948:195;;;;:::o;5149:282::-;5218:6;5267:2;5255:9;5246:7;5242:23;5238:32;5235:2;;;5283:1;5280;5273:12;5235:2;5326:1;5351:63;5406:7;5397:6;5386:9;5382:22;5351:63;:::i;:::-;5341:73;;5297:127;5225:206;;;;:::o;5437:375::-;5506:6;5555:2;5543:9;5534:7;5530:23;5526:32;5523:2;;;5571:1;5568;5561:12;5523:2;5642:1;5631:9;5627:17;5614:31;5672:18;5664:6;5661:30;5658:2;;;5704:1;5701;5694:12;5658:2;5732:63;5787:7;5778:6;5767:9;5763:22;5732:63;:::i;:::-;5722:73;;5585:220;5513:299;;;;:::o;5818:262::-;5877:6;5926:2;5914:9;5905:7;5901:23;5897:32;5894:2;;;5942:1;5939;5932:12;5894:2;5985:1;6010:53;6055:7;6046:6;6035:9;6031:22;6010:53;:::i;:::-;6000:63;;5956:117;5884:196;;;;:::o;6086:179::-;6155:10;6176:46;6218:3;6210:6;6176:46;:::i;:::-;6254:4;6249:3;6245:14;6231:28;;6166:99;;;;:::o;6271:118::-;6358:24;6376:5;6358:24;:::i;:::-;6353:3;6346:37;6336:53;;:::o;6425:732::-;6544:3;6573:54;6621:5;6573:54;:::i;:::-;6643:86;6722:6;6717:3;6643:86;:::i;:::-;6636:93;;6753:56;6803:5;6753:56;:::i;:::-;6832:7;6863:1;6848:284;6873:6;6870:1;6867:13;6848:284;;;6949:6;6943:13;6976:63;7035:3;7020:13;6976:63;:::i;:::-;6969:70;;7062:60;7115:6;7062:60;:::i;:::-;7052:70;;6908:224;6895:1;6892;6888:9;6883:14;;6848:284;;;6852:14;7148:3;7141:10;;6549:608;;;;;;;:::o;7163:109::-;7244:21;7259:5;7244:21;:::i;:::-;7239:3;7232:34;7222:50;;:::o;7278:360::-;7364:3;7392:38;7424:5;7392:38;:::i;:::-;7446:70;7509:6;7504:3;7446:70;:::i;:::-;7439:77;;7525:52;7570:6;7565:3;7558:4;7551:5;7547:16;7525:52;:::i;:::-;7602:29;7624:6;7602:29;:::i;:::-;7597:3;7593:39;7586:46;;7368:270;;;;;:::o;7644:364::-;7732:3;7760:39;7793:5;7760:39;:::i;:::-;7815:71;7879:6;7874:3;7815:71;:::i;:::-;7808:78;;7895:52;7940:6;7935:3;7928:4;7921:5;7917:16;7895:52;:::i;:::-;7972:29;7994:6;7972:29;:::i;:::-;7967:3;7963:39;7956:46;;7736:272;;;;;:::o;8014:377::-;8120:3;8148:39;8181:5;8148:39;:::i;:::-;8203:89;8285:6;8280:3;8203:89;:::i;:::-;8196:96;;8301:52;8346:6;8341:3;8334:4;8327:5;8323:16;8301:52;:::i;:::-;8378:6;8373:3;8369:16;8362:23;;8124:267;;;;;:::o;8397:366::-;8539:3;8560:67;8624:2;8619:3;8560:67;:::i;:::-;8553:74;;8636:93;8725:3;8636:93;:::i;:::-;8754:2;8749:3;8745:12;8738:19;;8543:220;;;:::o;8769:366::-;8911:3;8932:67;8996:2;8991:3;8932:67;:::i;:::-;8925:74;;9008:93;9097:3;9008:93;:::i;:::-;9126:2;9121:3;9117:12;9110:19;;8915:220;;;:::o;9141:366::-;9283:3;9304:67;9368:2;9363:3;9304:67;:::i;:::-;9297:74;;9380:93;9469:3;9380:93;:::i;:::-;9498:2;9493:3;9489:12;9482:19;;9287:220;;;:::o;9513:366::-;9655:3;9676:67;9740:2;9735:3;9676:67;:::i;:::-;9669:74;;9752:93;9841:3;9752:93;:::i;:::-;9870:2;9865:3;9861:12;9854:19;;9659:220;;;:::o;9885:366::-;10027:3;10048:67;10112:2;10107:3;10048:67;:::i;:::-;10041:74;;10124:93;10213:3;10124:93;:::i;:::-;10242:2;10237:3;10233:12;10226:19;;10031:220;;;:::o;10257:366::-;10399:3;10420:67;10484:2;10479:3;10420:67;:::i;:::-;10413:74;;10496:93;10585:3;10496:93;:::i;:::-;10614:2;10609:3;10605:12;10598:19;;10403:220;;;:::o;10629:366::-;10771:3;10792:67;10856:2;10851:3;10792:67;:::i;:::-;10785:74;;10868:93;10957:3;10868:93;:::i;:::-;10986:2;10981:3;10977:12;10970:19;;10775:220;;;:::o;11001:366::-;11143:3;11164:67;11228:2;11223:3;11164:67;:::i;:::-;11157:74;;11240:93;11329:3;11240:93;:::i;:::-;11358:2;11353:3;11349:12;11342:19;;11147:220;;;:::o;11373:366::-;11515:3;11536:67;11600:2;11595:3;11536:67;:::i;:::-;11529:74;;11612:93;11701:3;11612:93;:::i;:::-;11730:2;11725:3;11721:12;11714:19;;11519:220;;;:::o;11745:366::-;11887:3;11908:67;11972:2;11967:3;11908:67;:::i;:::-;11901:74;;11984:93;12073:3;11984:93;:::i;:::-;12102:2;12097:3;12093:12;12086:19;;11891:220;;;:::o;12117:366::-;12259:3;12280:67;12344:2;12339:3;12280:67;:::i;:::-;12273:74;;12356:93;12445:3;12356:93;:::i;:::-;12474:2;12469:3;12465:12;12458:19;;12263:220;;;:::o;12489:366::-;12631:3;12652:67;12716:2;12711:3;12652:67;:::i;:::-;12645:74;;12728:93;12817:3;12728:93;:::i;:::-;12846:2;12841:3;12837:12;12830:19;;12635:220;;;:::o;12861:366::-;13003:3;13024:67;13088:2;13083:3;13024:67;:::i;:::-;13017:74;;13100:93;13189:3;13100:93;:::i;:::-;13218:2;13213:3;13209:12;13202:19;;13007:220;;;:::o;13233:366::-;13375:3;13396:67;13460:2;13455:3;13396:67;:::i;:::-;13389:74;;13472:93;13561:3;13472:93;:::i;:::-;13590:2;13585:3;13581:12;13574:19;;13379:220;;;:::o;13605:366::-;13747:3;13768:67;13832:2;13827:3;13768:67;:::i;:::-;13761:74;;13844:93;13933:3;13844:93;:::i;:::-;13962:2;13957:3;13953:12;13946:19;;13751:220;;;:::o;13977:366::-;14119:3;14140:67;14204:2;14199:3;14140:67;:::i;:::-;14133:74;;14216:93;14305:3;14216:93;:::i;:::-;14334:2;14329:3;14325:12;14318:19;;14123:220;;;:::o;14349:366::-;14491:3;14512:67;14576:2;14571:3;14512:67;:::i;:::-;14505:74;;14588:93;14677:3;14588:93;:::i;:::-;14706:2;14701:3;14697:12;14690:19;;14495:220;;;:::o;14721:366::-;14863:3;14884:67;14948:2;14943:3;14884:67;:::i;:::-;14877:74;;14960:93;15049:3;14960:93;:::i;:::-;15078:2;15073:3;15069:12;15062:19;;14867:220;;;:::o;15093:366::-;15235:3;15256:67;15320:2;15315:3;15256:67;:::i;:::-;15249:74;;15332:93;15421:3;15332:93;:::i;:::-;15450:2;15445:3;15441:12;15434:19;;15239:220;;;:::o;15465:366::-;15607:3;15628:67;15692:2;15687:3;15628:67;:::i;:::-;15621:74;;15704:93;15793:3;15704:93;:::i;:::-;15822:2;15817:3;15813:12;15806:19;;15611:220;;;:::o;15837:366::-;15979:3;16000:67;16064:2;16059:3;16000:67;:::i;:::-;15993:74;;16076:93;16165:3;16076:93;:::i;:::-;16194:2;16189:3;16185:12;16178:19;;15983:220;;;:::o;16209:366::-;16351:3;16372:67;16436:2;16431:3;16372:67;:::i;:::-;16365:74;;16448:93;16537:3;16448:93;:::i;:::-;16566:2;16561:3;16557:12;16550:19;;16355:220;;;:::o;16581:366::-;16723:3;16744:67;16808:2;16803:3;16744:67;:::i;:::-;16737:74;;16820:93;16909:3;16820:93;:::i;:::-;16938:2;16933:3;16929:12;16922:19;;16727:220;;;:::o;16953:366::-;17095:3;17116:67;17180:2;17175:3;17116:67;:::i;:::-;17109:74;;17192:93;17281:3;17192:93;:::i;:::-;17310:2;17305:3;17301:12;17294:19;;17099:220;;;:::o;17325:366::-;17467:3;17488:67;17552:2;17547:3;17488:67;:::i;:::-;17481:74;;17564:93;17653:3;17564:93;:::i;:::-;17682:2;17677:3;17673:12;17666:19;;17471:220;;;:::o;17697:366::-;17839:3;17860:67;17924:2;17919:3;17860:67;:::i;:::-;17853:74;;17936:93;18025:3;17936:93;:::i;:::-;18054:2;18049:3;18045:12;18038:19;;17843:220;;;:::o;18069:366::-;18211:3;18232:67;18296:2;18291:3;18232:67;:::i;:::-;18225:74;;18308:93;18397:3;18308:93;:::i;:::-;18426:2;18421:3;18417:12;18410:19;;18215:220;;;:::o;18441:108::-;18518:24;18536:5;18518:24;:::i;:::-;18513:3;18506:37;18496:53;;:::o;18555:118::-;18642:24;18660:5;18642:24;:::i;:::-;18637:3;18630:37;18620:53;;:::o;18679:435::-;18859:3;18881:95;18972:3;18963:6;18881:95;:::i;:::-;18874:102;;18993:95;19084:3;19075:6;18993:95;:::i;:::-;18986:102;;19105:3;19098:10;;18863:251;;;;;:::o;19120:222::-;19213:4;19251:2;19240:9;19236:18;19228:26;;19264:71;19332:1;19321:9;19317:17;19308:6;19264:71;:::i;:::-;19218:124;;;;:::o;19348:640::-;19543:4;19581:3;19570:9;19566:19;19558:27;;19595:71;19663:1;19652:9;19648:17;19639:6;19595:71;:::i;:::-;19676:72;19744:2;19733:9;19729:18;19720:6;19676:72;:::i;:::-;19758;19826:2;19815:9;19811:18;19802:6;19758:72;:::i;:::-;19877:9;19871:4;19867:20;19862:2;19851:9;19847:18;19840:48;19905:76;19976:4;19967:6;19905:76;:::i;:::-;19897:84;;19548:440;;;;;;;:::o;19994:442::-;20143:4;20181:2;20170:9;20166:18;20158:26;;20194:71;20262:1;20251:9;20247:17;20238:6;20194:71;:::i;:::-;20275:72;20343:2;20332:9;20328:18;20319:6;20275:72;:::i;:::-;20357;20425:2;20414:9;20410:18;20401:6;20357:72;:::i;:::-;20148:288;;;;;;:::o;20442:373::-;20585:4;20623:2;20612:9;20608:18;20600:26;;20672:9;20666:4;20662:20;20658:1;20647:9;20643:17;20636:47;20700:108;20803:4;20794:6;20700:108;:::i;:::-;20692:116;;20590:225;;;;:::o;20821:210::-;20908:4;20946:2;20935:9;20931:18;20923:26;;20959:65;21021:1;21010:9;21006:17;20997:6;20959:65;:::i;:::-;20913:118;;;;:::o;21037:313::-;21150:4;21188:2;21177:9;21173:18;21165:26;;21237:9;21231:4;21227:20;21223:1;21212:9;21208:17;21201:47;21265:78;21338:4;21329:6;21265:78;:::i;:::-;21257:86;;21155:195;;;;:::o;21356:419::-;21522:4;21560:2;21549:9;21545:18;21537:26;;21609:9;21603:4;21599:20;21595:1;21584:9;21580:17;21573:47;21637:131;21763:4;21637:131;:::i;:::-;21629:139;;21527:248;;;:::o;21781:419::-;21947:4;21985:2;21974:9;21970:18;21962:26;;22034:9;22028:4;22024:20;22020:1;22009:9;22005:17;21998:47;22062:131;22188:4;22062:131;:::i;:::-;22054:139;;21952:248;;;:::o;22206:419::-;22372:4;22410:2;22399:9;22395:18;22387:26;;22459:9;22453:4;22449:20;22445:1;22434:9;22430:17;22423:47;22487:131;22613:4;22487:131;:::i;:::-;22479:139;;22377:248;;;:::o;22631:419::-;22797:4;22835:2;22824:9;22820:18;22812:26;;22884:9;22878:4;22874:20;22870:1;22859:9;22855:17;22848:47;22912:131;23038:4;22912:131;:::i;:::-;22904:139;;22802:248;;;:::o;23056:419::-;23222:4;23260:2;23249:9;23245:18;23237:26;;23309:9;23303:4;23299:20;23295:1;23284:9;23280:17;23273:47;23337:131;23463:4;23337:131;:::i;:::-;23329:139;;23227:248;;;:::o;23481:419::-;23647:4;23685:2;23674:9;23670:18;23662:26;;23734:9;23728:4;23724:20;23720:1;23709:9;23705:17;23698:47;23762:131;23888:4;23762:131;:::i;:::-;23754:139;;23652:248;;;:::o;23906:419::-;24072:4;24110:2;24099:9;24095:18;24087:26;;24159:9;24153:4;24149:20;24145:1;24134:9;24130:17;24123:47;24187:131;24313:4;24187:131;:::i;:::-;24179:139;;24077:248;;;:::o;24331:419::-;24497:4;24535:2;24524:9;24520:18;24512:26;;24584:9;24578:4;24574:20;24570:1;24559:9;24555:17;24548:47;24612:131;24738:4;24612:131;:::i;:::-;24604:139;;24502:248;;;:::o;24756:419::-;24922:4;24960:2;24949:9;24945:18;24937:26;;25009:9;25003:4;24999:20;24995:1;24984:9;24980:17;24973:47;25037:131;25163:4;25037:131;:::i;:::-;25029:139;;24927:248;;;:::o;25181:419::-;25347:4;25385:2;25374:9;25370:18;25362:26;;25434:9;25428:4;25424:20;25420:1;25409:9;25405:17;25398:47;25462:131;25588:4;25462:131;:::i;:::-;25454:139;;25352:248;;;:::o;25606:419::-;25772:4;25810:2;25799:9;25795:18;25787:26;;25859:9;25853:4;25849:20;25845:1;25834:9;25830:17;25823:47;25887:131;26013:4;25887:131;:::i;:::-;25879:139;;25777:248;;;:::o;26031:419::-;26197:4;26235:2;26224:9;26220:18;26212:26;;26284:9;26278:4;26274:20;26270:1;26259:9;26255:17;26248:47;26312:131;26438:4;26312:131;:::i;:::-;26304:139;;26202:248;;;:::o;26456:419::-;26622:4;26660:2;26649:9;26645:18;26637:26;;26709:9;26703:4;26699:20;26695:1;26684:9;26680:17;26673:47;26737:131;26863:4;26737:131;:::i;:::-;26729:139;;26627:248;;;:::o;26881:419::-;27047:4;27085:2;27074:9;27070:18;27062:26;;27134:9;27128:4;27124:20;27120:1;27109:9;27105:17;27098:47;27162:131;27288:4;27162:131;:::i;:::-;27154:139;;27052:248;;;:::o;27306:419::-;27472:4;27510:2;27499:9;27495:18;27487:26;;27559:9;27553:4;27549:20;27545:1;27534:9;27530:17;27523:47;27587:131;27713:4;27587:131;:::i;:::-;27579:139;;27477:248;;;:::o;27731:419::-;27897:4;27935:2;27924:9;27920:18;27912:26;;27984:9;27978:4;27974:20;27970:1;27959:9;27955:17;27948:47;28012:131;28138:4;28012:131;:::i;:::-;28004:139;;27902:248;;;:::o;28156:419::-;28322:4;28360:2;28349:9;28345:18;28337:26;;28409:9;28403:4;28399:20;28395:1;28384:9;28380:17;28373:47;28437:131;28563:4;28437:131;:::i;:::-;28429:139;;28327:248;;;:::o;28581:419::-;28747:4;28785:2;28774:9;28770:18;28762:26;;28834:9;28828:4;28824:20;28820:1;28809:9;28805:17;28798:47;28862:131;28988:4;28862:131;:::i;:::-;28854:139;;28752:248;;;:::o;29006:419::-;29172:4;29210:2;29199:9;29195:18;29187:26;;29259:9;29253:4;29249:20;29245:1;29234:9;29230:17;29223:47;29287:131;29413:4;29287:131;:::i;:::-;29279:139;;29177:248;;;:::o;29431:419::-;29597:4;29635:2;29624:9;29620:18;29612:26;;29684:9;29678:4;29674:20;29670:1;29659:9;29655:17;29648:47;29712:131;29838:4;29712:131;:::i;:::-;29704:139;;29602:248;;;:::o;29856:419::-;30022:4;30060:2;30049:9;30045:18;30037:26;;30109:9;30103:4;30099:20;30095:1;30084:9;30080:17;30073:47;30137:131;30263:4;30137:131;:::i;:::-;30129:139;;30027:248;;;:::o;30281:419::-;30447:4;30485:2;30474:9;30470:18;30462:26;;30534:9;30528:4;30524:20;30520:1;30509:9;30505:17;30498:47;30562:131;30688:4;30562:131;:::i;:::-;30554:139;;30452:248;;;:::o;30706:419::-;30872:4;30910:2;30899:9;30895:18;30887:26;;30959:9;30953:4;30949:20;30945:1;30934:9;30930:17;30923:47;30987:131;31113:4;30987:131;:::i;:::-;30979:139;;30877:248;;;:::o;31131:419::-;31297:4;31335:2;31324:9;31320:18;31312:26;;31384:9;31378:4;31374:20;31370:1;31359:9;31355:17;31348:47;31412:131;31538:4;31412:131;:::i;:::-;31404:139;;31302:248;;;:::o;31556:419::-;31722:4;31760:2;31749:9;31745:18;31737:26;;31809:9;31803:4;31799:20;31795:1;31784:9;31780:17;31773:47;31837:131;31963:4;31837:131;:::i;:::-;31829:139;;31727:248;;;:::o;31981:419::-;32147:4;32185:2;32174:9;32170:18;32162:26;;32234:9;32228:4;32224:20;32220:1;32209:9;32205:17;32198:47;32262:131;32388:4;32262:131;:::i;:::-;32254:139;;32152:248;;;:::o;32406:419::-;32572:4;32610:2;32599:9;32595:18;32587:26;;32659:9;32653:4;32649:20;32645:1;32634:9;32630:17;32623:47;32687:131;32813:4;32687:131;:::i;:::-;32679:139;;32577:248;;;:::o;32831:222::-;32924:4;32962:2;32951:9;32947:18;32939:26;;32975:71;33043:1;33032:9;33028:17;33019:6;32975:71;:::i;:::-;32929:124;;;;:::o;33059:129::-;33093:6;33120:20;;:::i;:::-;33110:30;;33149:33;33177:4;33169:6;33149:33;:::i;:::-;33100:88;;;:::o;33194:75::-;33227:6;33260:2;33254:9;33244:19;;33234:35;:::o;33275:307::-;33336:4;33426:18;33418:6;33415:30;33412:2;;;33448:18;;:::i;:::-;33412:2;33486:29;33508:6;33486:29;:::i;:::-;33478:37;;33570:4;33564;33560:15;33552:23;;33341:241;;;:::o;33588:308::-;33650:4;33740:18;33732:6;33729:30;33726:2;;;33762:18;;:::i;:::-;33726:2;33800:29;33822:6;33800:29;:::i;:::-;33792:37;;33884:4;33878;33874:15;33866:23;;33655:241;;;:::o;33902:132::-;33969:4;33992:3;33984:11;;34022:4;34017:3;34013:14;34005:22;;33974:60;;;:::o;34040:114::-;34107:6;34141:5;34135:12;34125:22;;34114:40;;;:::o;34160:98::-;34211:6;34245:5;34239:12;34229:22;;34218:40;;;:::o;34264:99::-;34316:6;34350:5;34344:12;34334:22;;34323:40;;;:::o;34369:113::-;34439:4;34471;34466:3;34462:14;34454:22;;34444:38;;;:::o;34488:184::-;34587:11;34621:6;34616:3;34609:19;34661:4;34656:3;34652:14;34637:29;;34599:73;;;;:::o;34678:168::-;34761:11;34795:6;34790:3;34783:19;34835:4;34830:3;34826:14;34811:29;;34773:73;;;;:::o;34852:169::-;34936:11;34970:6;34965:3;34958:19;35010:4;35005:3;35001:14;34986:29;;34948:73;;;;:::o;35027:148::-;35129:11;35166:3;35151:18;;35141:34;;;;:::o;35181:305::-;35221:3;35240:20;35258:1;35240:20;:::i;:::-;35235:25;;35274:20;35292:1;35274:20;:::i;:::-;35269:25;;35428:1;35360:66;35356:74;35353:1;35350:81;35347:2;;;35434:18;;:::i;:::-;35347:2;35478:1;35475;35471:9;35464:16;;35225:261;;;;:::o;35492:185::-;35532:1;35549:20;35567:1;35549:20;:::i;:::-;35544:25;;35583:20;35601:1;35583:20;:::i;:::-;35578:25;;35622:1;35612:2;;35627:18;;:::i;:::-;35612:2;35669:1;35666;35662:9;35657:14;;35534:143;;;;:::o;35683:348::-;35723:7;35746:20;35764:1;35746:20;:::i;:::-;35741:25;;35780:20;35798:1;35780:20;:::i;:::-;35775:25;;35968:1;35900:66;35896:74;35893:1;35890:81;35885:1;35878:9;35871:17;35867:105;35864:2;;;35975:18;;:::i;:::-;35864:2;36023:1;36020;36016:9;36005:20;;35731:300;;;;:::o;36037:191::-;36077:4;36097:20;36115:1;36097:20;:::i;:::-;36092:25;;36131:20;36149:1;36131:20;:::i;:::-;36126:25;;36170:1;36167;36164:8;36161:2;;;36175:18;;:::i;:::-;36161:2;36220:1;36217;36213:9;36205:17;;36082:146;;;;:::o;36234:96::-;36271:7;36300:24;36318:5;36300:24;:::i;:::-;36289:35;;36279:51;;;:::o;36336:90::-;36370:7;36413:5;36406:13;36399:21;36388:32;;36378:48;;;:::o;36432:149::-;36468:7;36508:66;36501:5;36497:78;36486:89;;36476:105;;;:::o;36587:126::-;36624:7;36664:42;36657:5;36653:54;36642:65;;36632:81;;;:::o;36719:77::-;36756:7;36785:5;36774:16;;36764:32;;;:::o;36802:154::-;36886:6;36881:3;36876;36863:30;36948:1;36939:6;36934:3;36930:16;36923:27;36853:103;;;:::o;36962:307::-;37030:1;37040:113;37054:6;37051:1;37048:13;37040:113;;;37139:1;37134:3;37130:11;37124:18;37120:1;37115:3;37111:11;37104:39;37076:2;37073:1;37069:10;37064:15;;37040:113;;;37171:6;37168:1;37165:13;37162:2;;;37251:1;37242:6;37237:3;37233:16;37226:27;37162:2;37011:258;;;;:::o;37275:320::-;37319:6;37356:1;37350:4;37346:12;37336:22;;37403:1;37397:4;37393:12;37424:18;37414:2;;37480:4;37472:6;37468:17;37458:27;;37414:2;37542;37534:6;37531:14;37511:18;37508:38;37505:2;;;37561:18;;:::i;:::-;37505:2;37326:269;;;;:::o;37601:281::-;37684:27;37706:4;37684:27;:::i;:::-;37676:6;37672:40;37814:6;37802:10;37799:22;37778:18;37766:10;37763:34;37760:62;37757:2;;;37825:18;;:::i;:::-;37757:2;37865:10;37861:2;37854:22;37644:238;;;:::o;37888:233::-;37927:3;37950:24;37968:5;37950:24;:::i;:::-;37941:33;;37996:66;37989:5;37986:77;37983:2;;;38066:18;;:::i;:::-;37983:2;38113:1;38106:5;38102:13;38095:20;;37931:190;;;:::o;38127:176::-;38159:1;38176:20;38194:1;38176:20;:::i;:::-;38171:25;;38210:20;38228:1;38210:20;:::i;:::-;38205:25;;38249:1;38239:2;;38254:18;;:::i;:::-;38239:2;38295:1;38292;38288:9;38283:14;;38161:142;;;;:::o;38309:180::-;38357:77;38354:1;38347:88;38454:4;38451:1;38444:15;38478:4;38475:1;38468:15;38495:180;38543:77;38540:1;38533:88;38640:4;38637:1;38630:15;38664:4;38661:1;38654:15;38681:180;38729:77;38726:1;38719:88;38826:4;38823:1;38816:15;38850:4;38847:1;38840:15;38867:180;38915:77;38912:1;38905:88;39012:4;39009:1;39002:15;39036:4;39033:1;39026:15;39053:102;39094:6;39145:2;39141:7;39136:2;39129:5;39125:14;39121:28;39111:38;;39101:54;;;:::o;39161:230::-;39301:34;39297:1;39289:6;39285:14;39278:58;39370:13;39365:2;39357:6;39353:15;39346:38;39267:124;:::o;39397:237::-;39537:34;39533:1;39525:6;39521:14;39514:58;39606:20;39601:2;39593:6;39589:15;39582:45;39503:131;:::o;39640:225::-;39780:34;39776:1;39768:6;39764:14;39757:58;39849:8;39844:2;39836:6;39832:15;39825:33;39746:119;:::o;39871:178::-;40011:30;40007:1;39999:6;39995:14;39988:54;39977:72;:::o;40055:241::-;40195:34;40191:1;40183:6;40179:14;40172:58;40264:24;40259:2;40251:6;40247:15;40240:49;40161:135;:::o;40302:223::-;40442:34;40438:1;40430:6;40426:14;40419:58;40511:6;40506:2;40498:6;40494:15;40487:31;40408:117;:::o;40531:175::-;40671:27;40667:1;40659:6;40655:14;40648:51;40637:69;:::o;40712:182::-;40852:34;40848:1;40840:6;40836:14;40829:58;40818:76;:::o;40900:231::-;41040:34;41036:1;41028:6;41024:14;41017:58;41109:14;41104:2;41096:6;41092:15;41085:39;41006:125;:::o;41137:243::-;41277:34;41273:1;41265:6;41261:14;41254:58;41346:26;41341:2;41333:6;41329:15;41322:51;41243:137;:::o;41386:229::-;41526:34;41522:1;41514:6;41510:14;41503:58;41595:12;41590:2;41582:6;41578:15;41571:37;41492:123;:::o;41621:228::-;41761:34;41757:1;41749:6;41745:14;41738:58;41830:11;41825:2;41817:6;41813:15;41806:36;41727:122;:::o;41855:168::-;41995:20;41991:1;41983:6;41979:14;41972:44;41961:62;:::o;42029:173::-;42169:25;42165:1;42157:6;42153:14;42146:49;42135:67;:::o;42208:182::-;42348:34;42344:1;42336:6;42332:14;42325:58;42314:76;:::o;42396:231::-;42536:34;42532:1;42524:6;42520:14;42513:58;42605:14;42600:2;42592:6;42588:15;42581:39;42502:125;:::o;42633:182::-;42773:34;42769:1;42761:6;42757:14;42750:58;42739:76;:::o;42821:228::-;42961:34;42957:1;42949:6;42945:14;42938:58;43030:11;43025:2;43017:6;43013:15;43006:36;42927:122;:::o;43055:234::-;43195:34;43191:1;43183:6;43179:14;43172:58;43264:17;43259:2;43251:6;43247:15;43240:42;43161:128;:::o;43295:169::-;43435:21;43431:1;43423:6;43419:14;43412:45;43401:63;:::o;43470:220::-;43610:34;43606:1;43598:6;43594:14;43587:58;43679:3;43674:2;43666:6;43662:15;43655:28;43576:114;:::o;43696:175::-;43836:27;43832:1;43824:6;43820:14;43813:51;43802:69;:::o;43877:236::-;44017:34;44013:1;44005:6;44001:14;43994:58;44086:19;44081:2;44073:6;44069:15;44062:44;43983:130;:::o;44119:231::-;44259:34;44255:1;44247:6;44243:14;44236:58;44328:14;44323:2;44315:6;44311:15;44304:39;44225:125;:::o;44356:229::-;44496:34;44492:1;44484:6;44480:14;44473:58;44565:12;44560:2;44552:6;44548:15;44541:37;44462:123;:::o;44591:166::-;44731:18;44727:1;44719:6;44715:14;44708:42;44697:60;:::o;44763:177::-;44903:29;44899:1;44891:6;44887:14;44880:53;44869:71;:::o;44946:122::-;45019:24;45037:5;45019:24;:::i;:::-;45012:5;45009:35;44999:2;;45058:1;45055;45048:12;44999:2;44989:79;:::o;45074:116::-;45144:21;45159:5;45144:21;:::i;:::-;45137:5;45134:32;45124:2;;45180:1;45177;45170:12;45124:2;45114:76;:::o;45196:120::-;45268:23;45285:5;45268:23;:::i;:::-;45261:5;45258:34;45248:2;;45306:1;45303;45296:12;45248:2;45238:78;:::o;45322:122::-;45395:24;45413:5;45395:24;:::i;:::-;45388:5;45385:35;45375:2;;45434:1;45431;45424:12;45375:2;45365:79;:::o

Swarm Source

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