ETH Price: $3,392.72 (-2.54%)
Gas: 1 Gwei

Token

COVIDBots (BOT-19)
 

Overview

Max Total Supply

3,884 BOT-19

Holders

752

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
4 BOT-19
0xa85819617a048287ae2f5ba42740d7d71c9e439c
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

'The year is 2051. OMEGA COVID has merged with ETH nodes across the globe, threatening the mechanized population of the once-human race. The W.H.D.O. (World Hard Drive Organization) has mandated that all Bots mask up to avoid spreading the disease through short-wave radio tran...

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
COVIDBots

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-08-13
*/

// SPDX-License-Identifier: MIT

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) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}
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);
}

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

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

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

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

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

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;
        // solhint-disable-next-line no-inline-assembly
        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");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}


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 () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), 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 {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor () {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }
}

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant alphabet = "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] = alphabet[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

}


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}. 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 {
                    // solhint-disable-next-line no-inline-assembly
                    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` 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 { }
}

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.
 */
 // <3
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();
    }
}








// WELCOME TO COVIDBots, the exclusive, limited edition NFT series airdropped to COVIDPunks fans who experienced the dreaded
// "out-of-gas" error during our launch. COVIDBots are a cryptographically unique and highly scarce collection that will
// never be available for minting by anyone. Thank you for your patience on this airdrop. We are so grateful for our 
// lovely, enthusiastic community! May Gill Bates save us all. :-) 
//   -Waddle, Waggle, and Liu


pragma solidity ^0.8.0;

contract COVIDBots is Ownable, ERC721Enumerable, ReentrancyGuard {
  using Counters for Counters.Counter;
  using Strings for uint256;

  string public imageHash;

  uint256 public constant MAX_MINTABLE_AT_ONCE = 20;
  
  string public botcontractURI;
  
  constructor() ERC721("COVIDBots", "BOT-19") {}

  uint256[3884] private _availableTokens;

  uint256 private _numAvailableTokens = 3884;

  uint256 private _lastTokenIdMintedInInitialSet = 3884;

  function numTotalBots() public view virtual returns (uint256) {
    return 3884;
  }

  // function to mint and send airdrop
  function airdropMint(address receiver, uint256 numRolls) public onlyOwner {
    require(numRolls < 21, "You should not mint more than 20 at a time.");
    uint256 toMint = numRolls;
    _mint(toMint, receiver); 
  }

  // internal minting function
  function _mint(uint256 _numToMint, address receiver) internal {
    require(_numToMint <= MAX_MINTABLE_AT_ONCE, "Minting too many at once.");

    uint256 updatedNumAvailableTokens = _numAvailableTokens;
    for (uint256 i = 0; i < _numToMint; i++) {
      uint256 newTokenId = useRandomAvailableToken(_numToMint, i);
      _safeMint(receiver, newTokenId);
      updatedNumAvailableTokens--;
    }
    _numAvailableTokens = updatedNumAvailableTokens;
  }

  function useRandomAvailableToken(uint256 _numToFetch, uint256 _i)
    internal
    returns (uint256)
  {
    uint256 randomNum =
      uint256(
        keccak256(
          abi.encode(
            msg.sender,
            tx.gasprice,
            block.number,
            block.timestamp,
            blockhash(block.number - 1),
            _numToFetch,
            _i
          )
        )
      );
    uint256 randomIndex = randomNum % _numAvailableTokens;
    return useAvailableTokenAtIndex(randomIndex);
  }

  function useAvailableTokenAtIndex(uint256 indexToUse)
    internal
    returns (uint256)
  {
    uint256 valAtIndex = _availableTokens[indexToUse];
    uint256 result;
    if (valAtIndex == 0) {
      // This means the index itself is still an available token
      result = indexToUse;
    } else {
      // This means the index itself is not an available token, but the val at that index is.
      result = valAtIndex;
    }

    uint256 lastIndex = _numAvailableTokens - 1;
    if (indexToUse != lastIndex) {
      // Replace the value at indexToUse, now that it's been used.
      // Replace it with the data from the last index in the array, since we are going to decrease the array size afterwards.
      uint256 lastValInArray = _availableTokens[lastIndex];
      if (lastValInArray == 0) {
        // This means the index itself is still an available token
        _availableTokens[indexToUse] = lastIndex;
      } else {
        // This means the index itself is not an available token, but the val at that index is.
        _availableTokens[indexToUse] = lastValInArray;
      }
    }

    _numAvailableTokens--;
    return result;
  }

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

  function getBotsBelongingToOwner(address _owner)
    external
    view
    returns (uint256[] memory)
  {
    uint256 numBots = balanceOf(_owner);
    if (numBots == 0) {
      return new uint256[](0);
    } else {
      uint256[] memory result = new uint256[](numBots);
      for (uint256 i = 0; i < numBots; i++) {
        result[i] = tokenOfOwnerByIndex(_owner, i);
      }
      return result;
    }
  }

  /*
   * Dev stuff.
   */

  // metadata URI
  string private _baseTokenURI;

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

  function tokenURI(uint256 _tokenId)
    public
    view
    override
    returns (string memory)
  {
    string memory base = _baseURI();
    string memory _tokenURI = Strings.toString(_tokenId);
    string memory ending = ".json";

    // If there is no base URI, return the token URI.
    if (bytes(base).length == 0) {
      return _tokenURI;
    }

    return string(abi.encodePacked(base, _tokenURI, ending));
  }
  

  /*
   * Owner stuff
   */


  // URIs
  function setBaseURI(string memory baseURI) external onlyOwner {
    _baseTokenURI = baseURI;
  }

  function setContractURI(string memory _contractURI) external onlyOwner {
    botcontractURI = _contractURI;
  }
  
    function setImageHash(string memory _imageHash) external onlyOwner {
    imageHash = _imageHash;
  }
  
    function withdraw() public onlyOwner {
    (bool success, ) = msg.sender.call{value: address(this).balance}("");
    require(success, "Transfer failed.");
  }

  function _beforeTokenTransfer(
    address from,
    address to,
    uint256 tokenId
  ) internal virtual override(ERC721Enumerable) {
    super._beforeTokenTransfer(from, to, tokenId);
  }

  function supportsInterface(bytes4 interfaceId)
    public
    view
    virtual
    override(ERC721Enumerable)
    returns (bool)
  {
    return super.supportsInterface(interfaceId);
  }
}
//xoxo

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_MINTABLE_AT_ONCE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"numRolls","type":"uint256"}],"name":"airdropMint","outputs":[],"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":"botcontractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"getBotsBelongingToOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"imageHash","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numTotalBots","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_contractURI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_imageHash","type":"string"}],"name":"setImageHash","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":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052610f2c610f3a55610f2c610f3b553480156200001f57600080fd5b506040518060400160405280600981526020017f434f564944426f747300000000000000000000000000000000000000000000008152506040518060400160405280600681526020017f424f542d3139000000000000000000000000000000000000000000000000000081525060006200009e6200017e60201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35081600190805190602001906200015492919062000186565b5080600290805190602001906200016d92919062000186565b5050506001600b819055506200029b565b600033905090565b828054620001949062000236565b90600052602060002090601f016020900481019282620001b8576000855562000204565b82601f10620001d357805160ff191683800117855562000204565b8280016001018555821562000204579182015b8281111562000203578251825591602001919060010190620001e6565b5b50905062000213919062000217565b5090565b5b808211156200023257600081600090555060010162000218565b5090565b600060028204905060018216806200024f57607f821691505b602082108114156200026657620002656200026c565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61438a80620002ab6000396000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c80636352211e11610104578063b88d4fde116100a2578063e8a3d48511610071578063e8a3d48514610541578063e985e9c51461055f578063f2fde38b1461058f578063f4d20a89146105ab576101da565b8063b88d4fde146104a7578063c87b56dd146104c3578063cbf775b2146104f3578063d9fd734114610511576101da565b80638da5cb5b116100de5780638da5cb5b14610433578063938e3d7b1461045157806395d89b411461046d578063a22cb4651461048b576101da565b80636352211e146103c957806370a08231146103f9578063715018a614610429576101da565b806322ad06701161017c57806342842e0e1161014b57806342842e0e146103435780634f6ccce71461035f57806351605d801461038f57806355f804b3146103ad576101da565b806322ad0670146102d157806323b872dd146102ed5780632f745c59146103095780633ccfd60b14610339576101da565b8063081812fc116101b8578063081812fc14610249578063095ea7b31461027957806316939d8b1461029557806318160ddd146102b3576101da565b806301ffc9a7146101df57806304299b2a1461020f57806306fdde031461022b575b600080fd5b6101f960048036038101906101f4919061303b565b6105c9565b6040516102069190613678565b60405180910390f35b6102296004803603810190610224919061308d565b6105db565b005b610233610671565b6040516102409190613693565b60405180910390f35b610263600480360381019061025e91906130ce565b610703565b6040516102709190613580565b60405180910390f35b610293600480360381019061028e9190612fff565b610788565b005b61029d6108a0565b6040516102aa9190613693565b60405180910390f35b6102bb61092e565b6040516102c89190613935565b60405180910390f35b6102eb60048036038101906102e69190612fff565b61093b565b005b61030760048036038101906103029190612ef9565b610a0e565b005b610323600480360381019061031e9190612fff565b610a6e565b6040516103309190613935565b60405180910390f35b610341610b13565b005b61035d60048036038101906103589190612ef9565b610c3e565b005b610379600480360381019061037491906130ce565b610c5e565b6040516103869190613935565b60405180910390f35b610397610cf5565b6040516103a49190613693565b60405180910390f35b6103c760048036038101906103c2919061308d565b610d83565b005b6103e360048036038101906103de91906130ce565b610e1a565b6040516103f09190613580565b60405180910390f35b610413600480360381019061040e9190612e94565b610ecc565b6040516104209190613935565b60405180910390f35b610431610f84565b005b61043b6110be565b6040516104489190613580565b60405180910390f35b61046b6004803603810190610466919061308d565b6110e7565b005b61047561117d565b6040516104829190613693565b60405180910390f35b6104a560048036038101906104a09190612fc3565b61120f565b005b6104c160048036038101906104bc9190612f48565b611390565b005b6104dd60048036038101906104d891906130ce565b6113f2565b6040516104ea9190613693565b60405180910390f35b6104fb61148b565b6040516105089190613935565b60405180910390f35b61052b60048036038101906105269190612e94565b611490565b6040516105389190613656565b60405180910390f35b61054961160c565b6040516105569190613693565b60405180910390f35b61057960048036038101906105749190612ebd565b61169e565b6040516105869190613678565b60405180910390f35b6105a960048036038101906105a49190612e94565b611732565b005b6105b36118db565b6040516105c09190613935565b60405180910390f35b60006105d4826118e5565b9050919050565b6105e361195f565b73ffffffffffffffffffffffffffffffffffffffff166106016110be565b73ffffffffffffffffffffffffffffffffffffffff1614610657576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064e90613855565b60405180910390fd5b80600c908051906020019061066d929190612cb8565b5050565b60606001805461068090613c03565b80601f01602080910402602001604051908101604052809291908181526020018280546106ac90613c03565b80156106f95780601f106106ce576101008083540402835291602001916106f9565b820191906000526020600020905b8154815290600101906020018083116106dc57829003601f168201915b5050505050905090565b600061070e82611967565b61074d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161074490613835565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061079382610e1a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610804576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107fb906138b5565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661082361195f565b73ffffffffffffffffffffffffffffffffffffffff16148061085257506108518161084c61195f565b61169e565b5b610891576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610888906137b5565b60405180910390fd5b61089b83836119d3565b505050565b600d80546108ad90613c03565b80601f01602080910402602001604051908101604052809291908181526020018280546108d990613c03565b80156109265780601f106108fb57610100808354040283529160200191610926565b820191906000526020600020905b81548152906001019060200180831161090957829003601f168201915b505050505081565b6000600980549050905090565b61094361195f565b73ffffffffffffffffffffffffffffffffffffffff166109616110be565b73ffffffffffffffffffffffffffffffffffffffff16146109b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ae90613855565b60405180910390fd5b601581106109fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f190613775565b60405180910390fd5b6000819050610a098184611a8c565b505050565b610a1f610a1961195f565b82611b2b565b610a5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a55906138f5565b60405180910390fd5b610a69838383611c09565b505050565b6000610a7983610ecc565b8210610aba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab1906136b5565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610b1b61195f565b73ffffffffffffffffffffffffffffffffffffffff16610b396110be565b73ffffffffffffffffffffffffffffffffffffffff1614610b8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8690613855565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff1647604051610bb59061356b565b60006040518083038185875af1925050503d8060008114610bf2576040519150601f19603f3d011682016040523d82523d6000602084013e610bf7565b606091505b5050905080610c3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c32906138d5565b60405180910390fd5b50565b610c5983838360405180602001604052806000815250611390565b505050565b6000610c6861092e565b8210610ca9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca090613915565b60405180910390fd5b60098281548110610ce3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b600c8054610d0290613c03565b80601f0160208091040260200160405190810160405280929190818152602001828054610d2e90613c03565b8015610d7b5780601f10610d5057610100808354040283529160200191610d7b565b820191906000526020600020905b815481529060010190602001808311610d5e57829003601f168201915b505050505081565b610d8b61195f565b73ffffffffffffffffffffffffffffffffffffffff16610da96110be565b73ffffffffffffffffffffffffffffffffffffffff1614610dff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df690613855565b60405180910390fd5b80610f3c9080519060200190610e16929190612cb8565b5050565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610ec3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eba906137f5565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f34906137d5565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610f8c61195f565b73ffffffffffffffffffffffffffffffffffffffff16610faa6110be565b73ffffffffffffffffffffffffffffffffffffffff1614611000576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff790613855565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6110ef61195f565b73ffffffffffffffffffffffffffffffffffffffff1661110d6110be565b73ffffffffffffffffffffffffffffffffffffffff1614611163576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115a90613855565b60405180910390fd5b80600d9080519060200190611179929190612cb8565b5050565b60606002805461118c90613c03565b80601f01602080910402602001604051908101604052809291908181526020018280546111b890613c03565b80156112055780601f106111da57610100808354040283529160200191611205565b820191906000526020600020905b8154815290600101906020018083116111e857829003601f168201915b5050505050905090565b61121761195f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611285576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127c90613755565b60405180910390fd5b806006600061129261195f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661133f61195f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516113849190613678565b60405180910390a35050565b6113a161139b61195f565b83611b2b565b6113e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d7906138f5565b60405180910390fd5b6113ec84848484611e65565b50505050565b606060006113fe611ec1565b9050600061140b84611f54565b905060006040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250905060008351141561145c57819350505050611486565b8282826040516020016114719392919061353a565b60405160208183030381529060405293505050505b919050565b601481565b6060600061149d83610ecc565b9050600081141561152057600067ffffffffffffffff8111156114e9577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156115175781602001602082028036833780820191505090505b50915050611607565b60008167ffffffffffffffff811115611562577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156115905781602001602082028036833780820191505090505b50905060005b82811015611600576115a88582610a6e565b8282815181106115e1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505080806115f890613c66565b915050611596565b5080925050505b919050565b6060600d805461161b90613c03565b80601f016020809104026020016040519081016040528092919081815260200182805461164790613c03565b80156116945780601f1061166957610100808354040283529160200191611694565b820191906000526020600020905b81548152906001019060200180831161167757829003601f168201915b5050505050905090565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61173a61195f565b73ffffffffffffffffffffffffffffffffffffffff166117586110be565b73ffffffffffffffffffffffffffffffffffffffff16146117ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a590613855565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561181e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611815906136f5565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000610f2c905090565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611958575061195782612101565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611a4683610e1a565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6014821115611ad0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac790613895565b60405180910390fd5b6000610f3a54905060005b83811015611b1d576000611aef85836121e3565b9050611afb8482612251565b8280611b0690613bd9565b935050508080611b1590613c66565b915050611adb565b5080610f3a81905550505050565b6000611b3682611967565b611b75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6c90613795565b60405180910390fd5b6000611b8083610e1a565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611bef57508373ffffffffffffffffffffffffffffffffffffffff16611bd784610703565b73ffffffffffffffffffffffffffffffffffffffff16145b80611c005750611bff818561169e565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611c2982610e1a565b73ffffffffffffffffffffffffffffffffffffffff1614611c7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7690613875565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611cef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce690613735565b60405180910390fd5b611cfa83838361226f565b611d056000826119d3565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d559190613ae5565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611dac9190613a5e565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611e70848484611c09565b611e7c8484848461227f565b611ebb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb2906136d5565b60405180910390fd5b50505050565b6060610f3c8054611ed190613c03565b80601f0160208091040260200160405190810160405280929190818152602001828054611efd90613c03565b8015611f4a5780601f10611f1f57610100808354040283529160200191611f4a565b820191906000526020600020905b815481529060010190602001808311611f2d57829003601f168201915b5050505050905090565b60606000821415611f9c576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506120fc565b600082905060005b60008214611fce578080611fb790613c66565b915050600a82611fc79190613ab4565b9150611fa4565b60008167ffffffffffffffff811115612010577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156120425781602001600182028036833780820191505090505b5090505b600085146120f55760018261205b9190613ae5565b9150600a8561206a9190613caf565b60306120769190613a5e565b60f81b8183815181106120b2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856120ee9190613ab4565b9450612046565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806121cc57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806121dc57506121db82612416565b5b9050919050565b600080333a43426001436121f79190613ae5565b40888860405160200161221097969594939291906135e7565b6040516020818303038152906040528051906020012060001c90506000610f3a548261223c9190613caf565b905061224781612480565b9250505092915050565b61226b8282604051806020016040528060008152506125eb565b5050565b61227a838383612646565b505050565b60006122a08473ffffffffffffffffffffffffffffffffffffffff1661275a565b15612409578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026122c961195f565b8786866040518563ffffffff1660e01b81526004016122eb949392919061359b565b602060405180830381600087803b15801561230557600080fd5b505af192505050801561233657506040513d601f19601f820116820180604052508101906123339190613064565b60015b6123b9573d8060008114612366576040519150601f19603f3d011682016040523d82523d6000602084013e61236b565b606091505b506000815114156123b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a8906136d5565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061240e565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600080600e83610f2c81106124be577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b015490506000808214156124d4578390506124d8565b8190505b60006001610f3a546124ea9190613ae5565b90508085146125c7576000600e82610f2c8110612530577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b0154905060008114156125835781600e87610f2c8110612579577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b01819055506125c5565b80600e87610f2c81106125bf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b01819055505b505b610f3a60008154809291906125db90613bd9565b9190505550819350505050919050565b6125f5838361276d565b612602600084848461227f565b612641576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612638906136d5565b60405180910390fd5b505050565b61265183838361293b565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156126945761268f81612940565b6126d3565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146126d2576126d18382612989565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127165761271181612af6565b612755565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612754576127538282612c39565b5b5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127d490613815565b60405180910390fd5b6127e681611967565b15612826576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281d90613715565b60405180910390fd5b6128326000838361226f565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128829190613a5e565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161299684610ecc565b6129a09190613ae5565b9050600060086000848152602001908152602001600020549050818114612a85576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600980549050612b0a9190613ae5565b90506000600a6000848152602001908152602001600020549050600060098381548110612b60577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060098381548110612ba8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a6000858152602001908152602001600020600090556009805480612c1d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612c4483610ecc565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b828054612cc490613c03565b90600052602060002090601f016020900481019282612ce65760008555612d2d565b82601f10612cff57805160ff1916838001178555612d2d565b82800160010185558215612d2d579182015b82811115612d2c578251825591602001919060010190612d11565b5b509050612d3a9190612d3e565b5090565b5b80821115612d57576000816000905550600101612d3f565b5090565b6000612d6e612d6984613975565b613950565b905082815260208101848484011115612d8657600080fd5b612d91848285613b97565b509392505050565b6000612dac612da7846139a6565b613950565b905082815260208101848484011115612dc457600080fd5b612dcf848285613b97565b509392505050565b600081359050612de6816142f8565b92915050565b600081359050612dfb8161430f565b92915050565b600081359050612e1081614326565b92915050565b600081519050612e2581614326565b92915050565b600082601f830112612e3c57600080fd5b8135612e4c848260208601612d5b565b91505092915050565b600082601f830112612e6657600080fd5b8135612e76848260208601612d99565b91505092915050565b600081359050612e8e8161433d565b92915050565b600060208284031215612ea657600080fd5b6000612eb484828501612dd7565b91505092915050565b60008060408385031215612ed057600080fd5b6000612ede85828601612dd7565b9250506020612eef85828601612dd7565b9150509250929050565b600080600060608486031215612f0e57600080fd5b6000612f1c86828701612dd7565b9350506020612f2d86828701612dd7565b9250506040612f3e86828701612e7f565b9150509250925092565b60008060008060808587031215612f5e57600080fd5b6000612f6c87828801612dd7565b9450506020612f7d87828801612dd7565b9350506040612f8e87828801612e7f565b925050606085013567ffffffffffffffff811115612fab57600080fd5b612fb787828801612e2b565b91505092959194509250565b60008060408385031215612fd657600080fd5b6000612fe485828601612dd7565b9250506020612ff585828601612dec565b9150509250929050565b6000806040838503121561301257600080fd5b600061302085828601612dd7565b925050602061303185828601612e7f565b9150509250929050565b60006020828403121561304d57600080fd5b600061305b84828501612e01565b91505092915050565b60006020828403121561307657600080fd5b600061308484828501612e16565b91505092915050565b60006020828403121561309f57600080fd5b600082013567ffffffffffffffff8111156130b957600080fd5b6130c584828501612e55565b91505092915050565b6000602082840312156130e057600080fd5b60006130ee84828501612e7f565b91505092915050565b6000613103838361351c565b60208301905092915050565b61311881613b19565b82525050565b6000613129826139e7565b6131338185613a15565b935061313e836139d7565b8060005b8381101561316f57815161315688826130f7565b975061316183613a08565b925050600181019050613142565b5085935050505092915050565b61318581613b2b565b82525050565b61319481613b37565b82525050565b60006131a5826139f2565b6131af8185613a26565b93506131bf818560208601613ba6565b6131c881613d9c565b840191505092915050565b60006131de826139fd565b6131e88185613a42565b93506131f8818560208601613ba6565b61320181613d9c565b840191505092915050565b6000613217826139fd565b6132218185613a53565b9350613231818560208601613ba6565b80840191505092915050565b600061324a602b83613a42565b915061325582613dad565b604082019050919050565b600061326d603283613a42565b915061327882613dfc565b604082019050919050565b6000613290602683613a42565b915061329b82613e4b565b604082019050919050565b60006132b3601c83613a42565b91506132be82613e9a565b602082019050919050565b60006132d6602483613a42565b91506132e182613ec3565b604082019050919050565b60006132f9601983613a42565b915061330482613f12565b602082019050919050565b600061331c602b83613a42565b915061332782613f3b565b604082019050919050565b600061333f602c83613a42565b915061334a82613f8a565b604082019050919050565b6000613362603883613a42565b915061336d82613fd9565b604082019050919050565b6000613385602a83613a42565b915061339082614028565b604082019050919050565b60006133a8602983613a42565b91506133b382614077565b604082019050919050565b60006133cb602083613a42565b91506133d6826140c6565b602082019050919050565b60006133ee602c83613a42565b91506133f9826140ef565b604082019050919050565b6000613411602083613a42565b915061341c8261413e565b602082019050919050565b6000613434602983613a42565b915061343f82614167565b604082019050919050565b6000613457601983613a42565b9150613462826141b6565b602082019050919050565b600061347a602183613a42565b9150613485826141df565b604082019050919050565b600061349d600083613a37565b91506134a88261422e565b600082019050919050565b60006134c0601083613a42565b91506134cb82614231565b602082019050919050565b60006134e3603183613a42565b91506134ee8261425a565b604082019050919050565b6000613506602c83613a42565b9150613511826142a9565b604082019050919050565b61352581613b8d565b82525050565b61353481613b8d565b82525050565b6000613546828661320c565b9150613552828561320c565b915061355e828461320c565b9150819050949350505050565b600061357682613490565b9150819050919050565b6000602082019050613595600083018461310f565b92915050565b60006080820190506135b0600083018761310f565b6135bd602083018661310f565b6135ca604083018561352b565b81810360608301526135dc818461319a565b905095945050505050565b600060e0820190506135fc600083018a61310f565b613609602083018961352b565b613616604083018861352b565b613623606083018761352b565b613630608083018661318b565b61363d60a083018561352b565b61364a60c083018461352b565b98975050505050505050565b60006020820190508181036000830152613670818461311e565b905092915050565b600060208201905061368d600083018461317c565b92915050565b600060208201905081810360008301526136ad81846131d3565b905092915050565b600060208201905081810360008301526136ce8161323d565b9050919050565b600060208201905081810360008301526136ee81613260565b9050919050565b6000602082019050818103600083015261370e81613283565b9050919050565b6000602082019050818103600083015261372e816132a6565b9050919050565b6000602082019050818103600083015261374e816132c9565b9050919050565b6000602082019050818103600083015261376e816132ec565b9050919050565b6000602082019050818103600083015261378e8161330f565b9050919050565b600060208201905081810360008301526137ae81613332565b9050919050565b600060208201905081810360008301526137ce81613355565b9050919050565b600060208201905081810360008301526137ee81613378565b9050919050565b6000602082019050818103600083015261380e8161339b565b9050919050565b6000602082019050818103600083015261382e816133be565b9050919050565b6000602082019050818103600083015261384e816133e1565b9050919050565b6000602082019050818103600083015261386e81613404565b9050919050565b6000602082019050818103600083015261388e81613427565b9050919050565b600060208201905081810360008301526138ae8161344a565b9050919050565b600060208201905081810360008301526138ce8161346d565b9050919050565b600060208201905081810360008301526138ee816134b3565b9050919050565b6000602082019050818103600083015261390e816134d6565b9050919050565b6000602082019050818103600083015261392e816134f9565b9050919050565b600060208201905061394a600083018461352b565b92915050565b600061395a61396b565b90506139668282613c35565b919050565b6000604051905090565b600067ffffffffffffffff8211156139905761398f613d6d565b5b61399982613d9c565b9050602081019050919050565b600067ffffffffffffffff8211156139c1576139c0613d6d565b5b6139ca82613d9c565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613a6982613b8d565b9150613a7483613b8d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613aa957613aa8613ce0565b5b828201905092915050565b6000613abf82613b8d565b9150613aca83613b8d565b925082613ada57613ad9613d0f565b5b828204905092915050565b6000613af082613b8d565b9150613afb83613b8d565b925082821015613b0e57613b0d613ce0565b5b828203905092915050565b6000613b2482613b6d565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613bc4578082015181840152602081019050613ba9565b83811115613bd3576000848401525b50505050565b6000613be482613b8d565b91506000821415613bf857613bf7613ce0565b5b600182039050919050565b60006002820490506001821680613c1b57607f821691505b60208210811415613c2f57613c2e613d3e565b5b50919050565b613c3e82613d9c565b810181811067ffffffffffffffff82111715613c5d57613c5c613d6d565b5b80604052505050565b6000613c7182613b8d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613ca457613ca3613ce0565b5b600182019050919050565b6000613cba82613b8d565b9150613cc583613b8d565b925082613cd557613cd4613d0f565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f596f752073686f756c64206e6f74206d696e74206d6f7265207468616e20323060008201527f20617420612074696d652e000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4d696e74696e6720746f6f206d616e79206174206f6e63652e00000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b61430181613b19565b811461430c57600080fd5b50565b61431881613b2b565b811461432357600080fd5b50565b61432f81613b41565b811461433a57600080fd5b50565b61434681613b8d565b811461435157600080fd5b5056fea2646970667358221220944a7377e0622a606d3cab245c6757f2fdca55cb915e220692d4274ff1187fed64736f6c63430008040033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101da5760003560e01c80636352211e11610104578063b88d4fde116100a2578063e8a3d48511610071578063e8a3d48514610541578063e985e9c51461055f578063f2fde38b1461058f578063f4d20a89146105ab576101da565b8063b88d4fde146104a7578063c87b56dd146104c3578063cbf775b2146104f3578063d9fd734114610511576101da565b80638da5cb5b116100de5780638da5cb5b14610433578063938e3d7b1461045157806395d89b411461046d578063a22cb4651461048b576101da565b80636352211e146103c957806370a08231146103f9578063715018a614610429576101da565b806322ad06701161017c57806342842e0e1161014b57806342842e0e146103435780634f6ccce71461035f57806351605d801461038f57806355f804b3146103ad576101da565b806322ad0670146102d157806323b872dd146102ed5780632f745c59146103095780633ccfd60b14610339576101da565b8063081812fc116101b8578063081812fc14610249578063095ea7b31461027957806316939d8b1461029557806318160ddd146102b3576101da565b806301ffc9a7146101df57806304299b2a1461020f57806306fdde031461022b575b600080fd5b6101f960048036038101906101f4919061303b565b6105c9565b6040516102069190613678565b60405180910390f35b6102296004803603810190610224919061308d565b6105db565b005b610233610671565b6040516102409190613693565b60405180910390f35b610263600480360381019061025e91906130ce565b610703565b6040516102709190613580565b60405180910390f35b610293600480360381019061028e9190612fff565b610788565b005b61029d6108a0565b6040516102aa9190613693565b60405180910390f35b6102bb61092e565b6040516102c89190613935565b60405180910390f35b6102eb60048036038101906102e69190612fff565b61093b565b005b61030760048036038101906103029190612ef9565b610a0e565b005b610323600480360381019061031e9190612fff565b610a6e565b6040516103309190613935565b60405180910390f35b610341610b13565b005b61035d60048036038101906103589190612ef9565b610c3e565b005b610379600480360381019061037491906130ce565b610c5e565b6040516103869190613935565b60405180910390f35b610397610cf5565b6040516103a49190613693565b60405180910390f35b6103c760048036038101906103c2919061308d565b610d83565b005b6103e360048036038101906103de91906130ce565b610e1a565b6040516103f09190613580565b60405180910390f35b610413600480360381019061040e9190612e94565b610ecc565b6040516104209190613935565b60405180910390f35b610431610f84565b005b61043b6110be565b6040516104489190613580565b60405180910390f35b61046b6004803603810190610466919061308d565b6110e7565b005b61047561117d565b6040516104829190613693565b60405180910390f35b6104a560048036038101906104a09190612fc3565b61120f565b005b6104c160048036038101906104bc9190612f48565b611390565b005b6104dd60048036038101906104d891906130ce565b6113f2565b6040516104ea9190613693565b60405180910390f35b6104fb61148b565b6040516105089190613935565b60405180910390f35b61052b60048036038101906105269190612e94565b611490565b6040516105389190613656565b60405180910390f35b61054961160c565b6040516105569190613693565b60405180910390f35b61057960048036038101906105749190612ebd565b61169e565b6040516105869190613678565b60405180910390f35b6105a960048036038101906105a49190612e94565b611732565b005b6105b36118db565b6040516105c09190613935565b60405180910390f35b60006105d4826118e5565b9050919050565b6105e361195f565b73ffffffffffffffffffffffffffffffffffffffff166106016110be565b73ffffffffffffffffffffffffffffffffffffffff1614610657576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064e90613855565b60405180910390fd5b80600c908051906020019061066d929190612cb8565b5050565b60606001805461068090613c03565b80601f01602080910402602001604051908101604052809291908181526020018280546106ac90613c03565b80156106f95780601f106106ce576101008083540402835291602001916106f9565b820191906000526020600020905b8154815290600101906020018083116106dc57829003601f168201915b5050505050905090565b600061070e82611967565b61074d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161074490613835565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061079382610e1a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610804576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107fb906138b5565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661082361195f565b73ffffffffffffffffffffffffffffffffffffffff16148061085257506108518161084c61195f565b61169e565b5b610891576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610888906137b5565b60405180910390fd5b61089b83836119d3565b505050565b600d80546108ad90613c03565b80601f01602080910402602001604051908101604052809291908181526020018280546108d990613c03565b80156109265780601f106108fb57610100808354040283529160200191610926565b820191906000526020600020905b81548152906001019060200180831161090957829003601f168201915b505050505081565b6000600980549050905090565b61094361195f565b73ffffffffffffffffffffffffffffffffffffffff166109616110be565b73ffffffffffffffffffffffffffffffffffffffff16146109b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ae90613855565b60405180910390fd5b601581106109fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f190613775565b60405180910390fd5b6000819050610a098184611a8c565b505050565b610a1f610a1961195f565b82611b2b565b610a5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a55906138f5565b60405180910390fd5b610a69838383611c09565b505050565b6000610a7983610ecc565b8210610aba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab1906136b5565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610b1b61195f565b73ffffffffffffffffffffffffffffffffffffffff16610b396110be565b73ffffffffffffffffffffffffffffffffffffffff1614610b8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8690613855565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff1647604051610bb59061356b565b60006040518083038185875af1925050503d8060008114610bf2576040519150601f19603f3d011682016040523d82523d6000602084013e610bf7565b606091505b5050905080610c3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c32906138d5565b60405180910390fd5b50565b610c5983838360405180602001604052806000815250611390565b505050565b6000610c6861092e565b8210610ca9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca090613915565b60405180910390fd5b60098281548110610ce3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b600c8054610d0290613c03565b80601f0160208091040260200160405190810160405280929190818152602001828054610d2e90613c03565b8015610d7b5780601f10610d5057610100808354040283529160200191610d7b565b820191906000526020600020905b815481529060010190602001808311610d5e57829003601f168201915b505050505081565b610d8b61195f565b73ffffffffffffffffffffffffffffffffffffffff16610da96110be565b73ffffffffffffffffffffffffffffffffffffffff1614610dff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df690613855565b60405180910390fd5b80610f3c9080519060200190610e16929190612cb8565b5050565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610ec3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eba906137f5565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f34906137d5565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610f8c61195f565b73ffffffffffffffffffffffffffffffffffffffff16610faa6110be565b73ffffffffffffffffffffffffffffffffffffffff1614611000576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff790613855565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6110ef61195f565b73ffffffffffffffffffffffffffffffffffffffff1661110d6110be565b73ffffffffffffffffffffffffffffffffffffffff1614611163576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115a90613855565b60405180910390fd5b80600d9080519060200190611179929190612cb8565b5050565b60606002805461118c90613c03565b80601f01602080910402602001604051908101604052809291908181526020018280546111b890613c03565b80156112055780601f106111da57610100808354040283529160200191611205565b820191906000526020600020905b8154815290600101906020018083116111e857829003601f168201915b5050505050905090565b61121761195f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611285576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127c90613755565b60405180910390fd5b806006600061129261195f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661133f61195f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516113849190613678565b60405180910390a35050565b6113a161139b61195f565b83611b2b565b6113e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d7906138f5565b60405180910390fd5b6113ec84848484611e65565b50505050565b606060006113fe611ec1565b9050600061140b84611f54565b905060006040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250905060008351141561145c57819350505050611486565b8282826040516020016114719392919061353a565b60405160208183030381529060405293505050505b919050565b601481565b6060600061149d83610ecc565b9050600081141561152057600067ffffffffffffffff8111156114e9577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156115175781602001602082028036833780820191505090505b50915050611607565b60008167ffffffffffffffff811115611562577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156115905781602001602082028036833780820191505090505b50905060005b82811015611600576115a88582610a6e565b8282815181106115e1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505080806115f890613c66565b915050611596565b5080925050505b919050565b6060600d805461161b90613c03565b80601f016020809104026020016040519081016040528092919081815260200182805461164790613c03565b80156116945780601f1061166957610100808354040283529160200191611694565b820191906000526020600020905b81548152906001019060200180831161167757829003601f168201915b5050505050905090565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61173a61195f565b73ffffffffffffffffffffffffffffffffffffffff166117586110be565b73ffffffffffffffffffffffffffffffffffffffff16146117ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a590613855565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561181e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611815906136f5565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000610f2c905090565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611958575061195782612101565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611a4683610e1a565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6014821115611ad0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac790613895565b60405180910390fd5b6000610f3a54905060005b83811015611b1d576000611aef85836121e3565b9050611afb8482612251565b8280611b0690613bd9565b935050508080611b1590613c66565b915050611adb565b5080610f3a81905550505050565b6000611b3682611967565b611b75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6c90613795565b60405180910390fd5b6000611b8083610e1a565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611bef57508373ffffffffffffffffffffffffffffffffffffffff16611bd784610703565b73ffffffffffffffffffffffffffffffffffffffff16145b80611c005750611bff818561169e565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611c2982610e1a565b73ffffffffffffffffffffffffffffffffffffffff1614611c7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7690613875565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611cef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce690613735565b60405180910390fd5b611cfa83838361226f565b611d056000826119d3565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d559190613ae5565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611dac9190613a5e565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611e70848484611c09565b611e7c8484848461227f565b611ebb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb2906136d5565b60405180910390fd5b50505050565b6060610f3c8054611ed190613c03565b80601f0160208091040260200160405190810160405280929190818152602001828054611efd90613c03565b8015611f4a5780601f10611f1f57610100808354040283529160200191611f4a565b820191906000526020600020905b815481529060010190602001808311611f2d57829003601f168201915b5050505050905090565b60606000821415611f9c576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506120fc565b600082905060005b60008214611fce578080611fb790613c66565b915050600a82611fc79190613ab4565b9150611fa4565b60008167ffffffffffffffff811115612010577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156120425781602001600182028036833780820191505090505b5090505b600085146120f55760018261205b9190613ae5565b9150600a8561206a9190613caf565b60306120769190613a5e565b60f81b8183815181106120b2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856120ee9190613ab4565b9450612046565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806121cc57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806121dc57506121db82612416565b5b9050919050565b600080333a43426001436121f79190613ae5565b40888860405160200161221097969594939291906135e7565b6040516020818303038152906040528051906020012060001c90506000610f3a548261223c9190613caf565b905061224781612480565b9250505092915050565b61226b8282604051806020016040528060008152506125eb565b5050565b61227a838383612646565b505050565b60006122a08473ffffffffffffffffffffffffffffffffffffffff1661275a565b15612409578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026122c961195f565b8786866040518563ffffffff1660e01b81526004016122eb949392919061359b565b602060405180830381600087803b15801561230557600080fd5b505af192505050801561233657506040513d601f19601f820116820180604052508101906123339190613064565b60015b6123b9573d8060008114612366576040519150601f19603f3d011682016040523d82523d6000602084013e61236b565b606091505b506000815114156123b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a8906136d5565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061240e565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600080600e83610f2c81106124be577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b015490506000808214156124d4578390506124d8565b8190505b60006001610f3a546124ea9190613ae5565b90508085146125c7576000600e82610f2c8110612530577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b0154905060008114156125835781600e87610f2c8110612579577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b01819055506125c5565b80600e87610f2c81106125bf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b01819055505b505b610f3a60008154809291906125db90613bd9565b9190505550819350505050919050565b6125f5838361276d565b612602600084848461227f565b612641576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612638906136d5565b60405180910390fd5b505050565b61265183838361293b565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156126945761268f81612940565b6126d3565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146126d2576126d18382612989565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127165761271181612af6565b612755565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612754576127538282612c39565b5b5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127d490613815565b60405180910390fd5b6127e681611967565b15612826576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281d90613715565b60405180910390fd5b6128326000838361226f565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128829190613a5e565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161299684610ecc565b6129a09190613ae5565b9050600060086000848152602001908152602001600020549050818114612a85576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600980549050612b0a9190613ae5565b90506000600a6000848152602001908152602001600020549050600060098381548110612b60577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060098381548110612ba8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a6000858152602001908152602001600020600090556009805480612c1d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612c4483610ecc565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b828054612cc490613c03565b90600052602060002090601f016020900481019282612ce65760008555612d2d565b82601f10612cff57805160ff1916838001178555612d2d565b82800160010185558215612d2d579182015b82811115612d2c578251825591602001919060010190612d11565b5b509050612d3a9190612d3e565b5090565b5b80821115612d57576000816000905550600101612d3f565b5090565b6000612d6e612d6984613975565b613950565b905082815260208101848484011115612d8657600080fd5b612d91848285613b97565b509392505050565b6000612dac612da7846139a6565b613950565b905082815260208101848484011115612dc457600080fd5b612dcf848285613b97565b509392505050565b600081359050612de6816142f8565b92915050565b600081359050612dfb8161430f565b92915050565b600081359050612e1081614326565b92915050565b600081519050612e2581614326565b92915050565b600082601f830112612e3c57600080fd5b8135612e4c848260208601612d5b565b91505092915050565b600082601f830112612e6657600080fd5b8135612e76848260208601612d99565b91505092915050565b600081359050612e8e8161433d565b92915050565b600060208284031215612ea657600080fd5b6000612eb484828501612dd7565b91505092915050565b60008060408385031215612ed057600080fd5b6000612ede85828601612dd7565b9250506020612eef85828601612dd7565b9150509250929050565b600080600060608486031215612f0e57600080fd5b6000612f1c86828701612dd7565b9350506020612f2d86828701612dd7565b9250506040612f3e86828701612e7f565b9150509250925092565b60008060008060808587031215612f5e57600080fd5b6000612f6c87828801612dd7565b9450506020612f7d87828801612dd7565b9350506040612f8e87828801612e7f565b925050606085013567ffffffffffffffff811115612fab57600080fd5b612fb787828801612e2b565b91505092959194509250565b60008060408385031215612fd657600080fd5b6000612fe485828601612dd7565b9250506020612ff585828601612dec565b9150509250929050565b6000806040838503121561301257600080fd5b600061302085828601612dd7565b925050602061303185828601612e7f565b9150509250929050565b60006020828403121561304d57600080fd5b600061305b84828501612e01565b91505092915050565b60006020828403121561307657600080fd5b600061308484828501612e16565b91505092915050565b60006020828403121561309f57600080fd5b600082013567ffffffffffffffff8111156130b957600080fd5b6130c584828501612e55565b91505092915050565b6000602082840312156130e057600080fd5b60006130ee84828501612e7f565b91505092915050565b6000613103838361351c565b60208301905092915050565b61311881613b19565b82525050565b6000613129826139e7565b6131338185613a15565b935061313e836139d7565b8060005b8381101561316f57815161315688826130f7565b975061316183613a08565b925050600181019050613142565b5085935050505092915050565b61318581613b2b565b82525050565b61319481613b37565b82525050565b60006131a5826139f2565b6131af8185613a26565b93506131bf818560208601613ba6565b6131c881613d9c565b840191505092915050565b60006131de826139fd565b6131e88185613a42565b93506131f8818560208601613ba6565b61320181613d9c565b840191505092915050565b6000613217826139fd565b6132218185613a53565b9350613231818560208601613ba6565b80840191505092915050565b600061324a602b83613a42565b915061325582613dad565b604082019050919050565b600061326d603283613a42565b915061327882613dfc565b604082019050919050565b6000613290602683613a42565b915061329b82613e4b565b604082019050919050565b60006132b3601c83613a42565b91506132be82613e9a565b602082019050919050565b60006132d6602483613a42565b91506132e182613ec3565b604082019050919050565b60006132f9601983613a42565b915061330482613f12565b602082019050919050565b600061331c602b83613a42565b915061332782613f3b565b604082019050919050565b600061333f602c83613a42565b915061334a82613f8a565b604082019050919050565b6000613362603883613a42565b915061336d82613fd9565b604082019050919050565b6000613385602a83613a42565b915061339082614028565b604082019050919050565b60006133a8602983613a42565b91506133b382614077565b604082019050919050565b60006133cb602083613a42565b91506133d6826140c6565b602082019050919050565b60006133ee602c83613a42565b91506133f9826140ef565b604082019050919050565b6000613411602083613a42565b915061341c8261413e565b602082019050919050565b6000613434602983613a42565b915061343f82614167565b604082019050919050565b6000613457601983613a42565b9150613462826141b6565b602082019050919050565b600061347a602183613a42565b9150613485826141df565b604082019050919050565b600061349d600083613a37565b91506134a88261422e565b600082019050919050565b60006134c0601083613a42565b91506134cb82614231565b602082019050919050565b60006134e3603183613a42565b91506134ee8261425a565b604082019050919050565b6000613506602c83613a42565b9150613511826142a9565b604082019050919050565b61352581613b8d565b82525050565b61353481613b8d565b82525050565b6000613546828661320c565b9150613552828561320c565b915061355e828461320c565b9150819050949350505050565b600061357682613490565b9150819050919050565b6000602082019050613595600083018461310f565b92915050565b60006080820190506135b0600083018761310f565b6135bd602083018661310f565b6135ca604083018561352b565b81810360608301526135dc818461319a565b905095945050505050565b600060e0820190506135fc600083018a61310f565b613609602083018961352b565b613616604083018861352b565b613623606083018761352b565b613630608083018661318b565b61363d60a083018561352b565b61364a60c083018461352b565b98975050505050505050565b60006020820190508181036000830152613670818461311e565b905092915050565b600060208201905061368d600083018461317c565b92915050565b600060208201905081810360008301526136ad81846131d3565b905092915050565b600060208201905081810360008301526136ce8161323d565b9050919050565b600060208201905081810360008301526136ee81613260565b9050919050565b6000602082019050818103600083015261370e81613283565b9050919050565b6000602082019050818103600083015261372e816132a6565b9050919050565b6000602082019050818103600083015261374e816132c9565b9050919050565b6000602082019050818103600083015261376e816132ec565b9050919050565b6000602082019050818103600083015261378e8161330f565b9050919050565b600060208201905081810360008301526137ae81613332565b9050919050565b600060208201905081810360008301526137ce81613355565b9050919050565b600060208201905081810360008301526137ee81613378565b9050919050565b6000602082019050818103600083015261380e8161339b565b9050919050565b6000602082019050818103600083015261382e816133be565b9050919050565b6000602082019050818103600083015261384e816133e1565b9050919050565b6000602082019050818103600083015261386e81613404565b9050919050565b6000602082019050818103600083015261388e81613427565b9050919050565b600060208201905081810360008301526138ae8161344a565b9050919050565b600060208201905081810360008301526138ce8161346d565b9050919050565b600060208201905081810360008301526138ee816134b3565b9050919050565b6000602082019050818103600083015261390e816134d6565b9050919050565b6000602082019050818103600083015261392e816134f9565b9050919050565b600060208201905061394a600083018461352b565b92915050565b600061395a61396b565b90506139668282613c35565b919050565b6000604051905090565b600067ffffffffffffffff8211156139905761398f613d6d565b5b61399982613d9c565b9050602081019050919050565b600067ffffffffffffffff8211156139c1576139c0613d6d565b5b6139ca82613d9c565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613a6982613b8d565b9150613a7483613b8d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613aa957613aa8613ce0565b5b828201905092915050565b6000613abf82613b8d565b9150613aca83613b8d565b925082613ada57613ad9613d0f565b5b828204905092915050565b6000613af082613b8d565b9150613afb83613b8d565b925082821015613b0e57613b0d613ce0565b5b828203905092915050565b6000613b2482613b6d565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613bc4578082015181840152602081019050613ba9565b83811115613bd3576000848401525b50505050565b6000613be482613b8d565b91506000821415613bf857613bf7613ce0565b5b600182039050919050565b60006002820490506001821680613c1b57607f821691505b60208210811415613c2f57613c2e613d3e565b5b50919050565b613c3e82613d9c565b810181811067ffffffffffffffff82111715613c5d57613c5c613d6d565b5b80604052505050565b6000613c7182613b8d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613ca457613ca3613ce0565b5b600182019050919050565b6000613cba82613b8d565b9150613cc583613b8d565b925082613cd557613cd4613d0f565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f596f752073686f756c64206e6f74206d696e74206d6f7265207468616e20323060008201527f20617420612074696d652e000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4d696e74696e6720746f6f206d616e79206174206f6e63652e00000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b61430181613b19565b811461430c57600080fd5b50565b61431881613b2b565b811461432357600080fd5b50565b61432f81613b41565b811461433a57600080fd5b50565b61434681613b8d565b811461435157600080fd5b5056fea2646970667358221220944a7377e0622a606d3cab245c6757f2fdca55cb915e220692d4274ff1187fed64736f6c63430008040033

Deployed Bytecode Sourcemap

46304:5171:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51279:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50799:102;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27946:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29406:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28943:397;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46534:28;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40318:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46909:219;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30296:305;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39986:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50911:161;;;:::i;:::-;;30672:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40508:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46446:23;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50572:98;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27640:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27370:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19311:148;;;:::i;:::-;;18660:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50676:113;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28115:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29699:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30894:285;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50082:434;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46476:49;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49454:422;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49356:92;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30065:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19614:244;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46777:86;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51279:193;51407:4;51430:36;51454:11;51430:23;:36::i;:::-;51423:43;;51279:193;;;:::o;50799:102::-;18891:12;:10;:12::i;:::-;18880:23;;:7;:5;:7::i;:::-;:23;;;18872:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50885:10:::1;50873:9;:22;;;;;;;;;;;;:::i;:::-;;50799:102:::0;:::o;27946:100::-;28000:13;28033:5;28026:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27946:100;:::o;29406:221::-;29482:7;29510:16;29518:7;29510;:16::i;:::-;29502:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;29595:15;:24;29611:7;29595:24;;;;;;;;;;;;;;;;;;;;;29588:31;;29406:221;;;:::o;28943:397::-;29024:13;29040:23;29055:7;29040:14;:23::i;:::-;29024:39;;29088:5;29082:11;;:2;:11;;;;29074:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;29168:5;29152:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;29177:37;29194:5;29201:12;:10;:12::i;:::-;29177:16;:37::i;:::-;29152:62;29144:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;29311:21;29320:2;29324:7;29311:8;:21::i;:::-;28943:397;;;:::o;46534:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;40318:113::-;40379:7;40406:10;:17;;;;40399:24;;40318:113;:::o;46909:219::-;18891:12;:10;:12::i;:::-;18880:23;;:7;:5;:7::i;:::-;:23;;;18872:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47009:2:::1;46998:8;:13;46990:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;47066:14;47083:8;47066:25;;47098:23;47104:6;47112:8;47098:5;:23::i;:::-;18951:1;46909:219:::0;;:::o;30296:305::-;30457:41;30476:12;:10;:12::i;:::-;30490:7;30457:18;:41::i;:::-;30449:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;30565:28;30575:4;30581:2;30585:7;30565:9;:28::i;:::-;30296:305;;;:::o;39986:256::-;40083:7;40119:23;40136:5;40119:16;:23::i;:::-;40111:5;:31;40103:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;40208:12;:19;40221:5;40208:19;;;;;;;;;;;;;;;:26;40228:5;40208:26;;;;;;;;;;;;40201:33;;39986:256;;;;:::o;50911:161::-;18891:12;:10;:12::i;:::-;18880:23;;:7;:5;:7::i;:::-;:23;;;18872:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50956:12:::1;50974:10;:15;;50997:21;50974:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50955:68;;;51038:7;51030:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;18951:1;50911:161::o:0;30672:151::-;30776:39;30793:4;30799:2;30803:7;30776:39;;;;;;;;;;;;:16;:39::i;:::-;30672:151;;;:::o;40508:233::-;40583:7;40619:30;:28;:30::i;:::-;40611:5;:38;40603:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;40716:10;40727:5;40716:17;;;;;;;;;;;;;;;;;;;;;;;;40709:24;;40508:233;;;:::o;46446:23::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;50572:98::-;18891:12;:10;:12::i;:::-;18880:23;;:7;:5;:7::i;:::-;:23;;;18872:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50657:7:::1;50641:13;:23;;;;;;;;;;;;:::i;:::-;;50572:98:::0;:::o;27640:239::-;27712:7;27732:13;27748:7;:16;27756:7;27748:16;;;;;;;;;;;;;;;;;;;;;27732:32;;27800:1;27783:19;;:5;:19;;;;27775:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27866:5;27859:12;;;27640:239;;;:::o;27370:208::-;27442:7;27487:1;27470:19;;:5;:19;;;;27462:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;27554:9;:16;27564:5;27554:16;;;;;;;;;;;;;;;;27547:23;;27370:208;;;:::o;19311:148::-;18891:12;:10;:12::i;:::-;18880:23;;:7;:5;:7::i;:::-;:23;;;18872:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;19418:1:::1;19381:40;;19402:6;::::0;::::1;;;;;;;;19381:40;;;;;;;;;;;;19449:1;19432:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;19311:148::o:0;18660:87::-;18706:7;18733:6;;;;;;;;;;;18726:13;;18660:87;:::o;50676:113::-;18891:12;:10;:12::i;:::-;18880:23;;:7;:5;:7::i;:::-;:23;;;18872:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50771:12:::1;50754:14;:29;;;;;;;;;;;;:::i;:::-;;50676:113:::0;:::o;28115:104::-;28171:13;28204:7;28197:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28115:104;:::o;29699:295::-;29814:12;:10;:12::i;:::-;29802:24;;:8;:24;;;;29794:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;29914:8;29869:18;:32;29888:12;:10;:12::i;:::-;29869:32;;;;;;;;;;;;;;;:42;29902:8;29869:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;29967:8;29938:48;;29953:12;:10;:12::i;:::-;29938:48;;;29977:8;29938:48;;;;;;:::i;:::-;;;;;;;;29699:295;;:::o;30894:285::-;31026:41;31045:12;:10;:12::i;:::-;31059:7;31026:18;:41::i;:::-;31018:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;31132:39;31146:4;31152:2;31156:7;31165:5;31132:13;:39::i;:::-;30894:285;;;;:::o;50082:434::-;50168:13;50193:18;50214:10;:8;:10::i;:::-;50193:31;;50231:23;50257:26;50274:8;50257:16;:26::i;:::-;50231:52;;50290:20;:30;;;;;;;;;;;;;;;;;;;50410:1;50394:4;50388:18;:23;50384:62;;;50429:9;50422:16;;;;;;;50384:62;50485:4;50491:9;50502:6;50468:41;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50454:56;;;;;50082:434;;;;:::o;46476:49::-;46523:2;46476:49;:::o;49454:422::-;49541:16;49569:15;49587:17;49597:6;49587:9;:17::i;:::-;49569:35;;49626:1;49615:7;:12;49611:260;;;49659:1;49645:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49638:23;;;;;49611:260;49684:23;49724:7;49710:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49684:48;;49746:9;49741:101;49765:7;49761:1;:11;49741:101;;;49802:30;49822:6;49830:1;49802:19;:30::i;:::-;49790:6;49797:1;49790:9;;;;;;;;;;;;;;;;;;;;;:42;;;;;49774:3;;;;;:::i;:::-;;;;49741:101;;;;49857:6;49850:13;;;;49454:422;;;;:::o;49356:92::-;49400:13;49428:14;49421:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49356:92;:::o;30065:164::-;30162:4;30186:18;:25;30205:5;30186:25;;;;;;;;;;;;;;;:35;30212:8;30186:35;;;;;;;;;;;;;;;;;;;;;;;;;30179:42;;30065:164;;;;:::o;19614:244::-;18891:12;:10;:12::i;:::-;18880:23;;:7;:5;:7::i;:::-;:23;;;18872:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;19723:1:::1;19703:22;;:8;:22;;;;19695:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;19813:8;19784:38;;19805:6;::::0;::::1;;;;;;;;19784:38;;;;;;;;;;;;19842:8;19833:6;::::0;:17:::1;;;;;;;;;;;;;;;;;;19614:244:::0;:::o;46777:86::-;46830:7;46853:4;46846:11;;46777:86;:::o;39665:237::-;39767:4;39806:35;39791:50;;;:11;:50;;;;:103;;;;39858:36;39882:11;39858:23;:36::i;:::-;39791:103;39784:110;;39665:237;;;:::o;601:98::-;654:7;681:10;674:17;;601:98;:::o;32646:127::-;32711:4;32763:1;32735:30;;:7;:16;32743:7;32735:16;;;;;;;;;;;;;;;;;;;;;:30;;;;32728:37;;32646:127;;;:::o;36523:174::-;36625:2;36598:15;:24;36614:7;36598:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;36681:7;36677:2;36643:46;;36652:23;36667:7;36652:14;:23::i;:::-;36643:46;;;;;;;;;;;;36523:174;;:::o;47166:464::-;46523:2;47243:10;:34;;47235:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;47316:33;47352:19;;47316:55;;47383:9;47378:193;47402:10;47398:1;:14;47378:193;;;47428:18;47449:38;47473:10;47485:1;47449:23;:38::i;:::-;47428:59;;47496:31;47506:8;47516:10;47496:9;:31::i;:::-;47536:27;;;;;:::i;:::-;;;;47378:193;47414:3;;;;;:::i;:::-;;;;47378:193;;;;47599:25;47577:19;:47;;;;47166:464;;;:::o;32940:348::-;33033:4;33058:16;33066:7;33058;:16::i;:::-;33050:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;33134:13;33150:23;33165:7;33150:14;:23::i;:::-;33134:39;;33203:5;33192:16;;:7;:16;;;:51;;;;33236:7;33212:31;;:20;33224:7;33212:11;:20::i;:::-;:31;;;33192:51;:87;;;;33247:32;33264:5;33271:7;33247:16;:32::i;:::-;33192:87;33184:96;;;32940:348;;;;:::o;35861:544::-;35986:4;35959:31;;:23;35974:7;35959:14;:23::i;:::-;:31;;;35951:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;36069:1;36055:16;;:2;:16;;;;36047:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;36125:39;36146:4;36152:2;36156:7;36125:20;:39::i;:::-;36229:29;36246:1;36250:7;36229:8;:29::i;:::-;36290:1;36271:9;:15;36281:4;36271:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;36319:1;36302:9;:13;36312:2;36302:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;36350:2;36331:7;:16;36339:7;36331:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;36389:7;36385:2;36370:27;;36379:4;36370:27;;;;;;;;;;;;35861:544;;;:::o;32061:272::-;32175:28;32185:4;32191:2;32195:7;32175:9;:28::i;:::-;32222:48;32245:4;32251:2;32255:7;32264:5;32222:22;:48::i;:::-;32214:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;32061:272;;;;:::o;49968:108::-;50028:13;50057;50050:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49968:108;:::o;23995:723::-;24051:13;24281:1;24272:5;:10;24268:53;;;24299:10;;;;;;;;;;;;;;;;;;;;;24268:53;24331:12;24346:5;24331:20;;24362:14;24387:78;24402:1;24394:4;:9;24387:78;;24420:8;;;;;:::i;:::-;;;;24451:2;24443:10;;;;;:::i;:::-;;;24387:78;;;24475:19;24507:6;24497:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24475:39;;24525:154;24541:1;24532:5;:10;24525:154;;24569:1;24559:11;;;;;:::i;:::-;;;24636:2;24628:5;:10;;;;:::i;:::-;24615:2;:24;;;;:::i;:::-;24602:39;;24585:6;24592;24585:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;24665:2;24656:11;;;;;:::i;:::-;;;24525:154;;;24703:6;24689:21;;;;;23995:723;;;;:::o;27014:292::-;27116:4;27155:25;27140:40;;;:11;:40;;;;:105;;;;27212:33;27197:48;;;:11;:48;;;;27140:105;:158;;;;27262:36;27286:11;27262:23;:36::i;:::-;27140:158;27133:165;;27014:292;;;:::o;47636:533::-;47730:7;47749:17;47841:10;47866:11;47892:12;47919:15;47974:1;47959:12;:16;;;;:::i;:::-;47949:27;47991:11;48017:2;47816:216;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47794:249;;;;;;47776:276;;47749:303;;48059:19;48093;;48081:9;:31;;;;:::i;:::-;48059:53;;48126:37;48151:11;48126:24;:37::i;:::-;48119:44;;;;47636:533;;;;:::o;33630:110::-;33706:26;33716:2;33720:7;33706:26;;;;;;;;;;;;:9;:26::i;:::-;33630:110;;:::o;51078:195::-;51222:45;51249:4;51255:2;51259:7;51222:26;:45::i;:::-;51078:195;;;:::o;37262:843::-;37383:4;37409:15;:2;:13;;;:15::i;:::-;37405:693;;;37461:2;37445:36;;;37482:12;:10;:12::i;:::-;37496:4;37502:7;37511:5;37445:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;37441:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37708:1;37691:6;:13;:18;37687:341;;;37734:60;;;;;;;;;;:::i;:::-;;;;;;;;37687:341;37978:6;37972:13;37963:6;37959:2;37955:15;37948:38;37441:602;37578:45;;;37568:55;;;:6;:55;;;;37561:62;;;;;37405:693;38082:4;38075:11;;37262:843;;;;;;;:::o;9492:157::-;9577:4;9616:25;9601:40;;;:11;:40;;;;9594:47;;9492:157;;;:::o;48175:1175::-;48257:7;48276:18;48297:16;48314:10;48297:28;;;;;;;;;;;;;;;;;48276:49;;48332:14;48371:1;48357:10;:15;48353:260;;;48458:10;48449:19;;48353:260;;;48595:10;48586:19;;48353:260;48621:17;48663:1;48641:19;;:23;;;;:::i;:::-;48621:43;;48689:9;48675:10;:23;48671:624;;48904:22;48929:16;48946:9;48929:27;;;;;;;;;;;;;;;;;48904:52;;48987:1;48969:14;:19;48965:323;;;49100:9;49069:16;49086:10;49069:28;;;;;;;;;;;;;;;;:40;;;;48965:323;;;49264:14;49233:16;49250:10;49233:28;;;;;;;;;;;;;;;;:45;;;;48965:323;48671:624;;49303:19;;:21;;;;;;;;;:::i;:::-;;;;;;49338:6;49331:13;;;;;48175:1175;;;:::o;33967:250::-;34063:18;34069:2;34073:7;34063:5;:18::i;:::-;34100:54;34131:1;34135:2;34139:7;34148:5;34100:22;:54::i;:::-;34092:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;33967:250;;;:::o;41354:555::-;41464:45;41491:4;41497:2;41501:7;41464:26;:45::i;:::-;41542:1;41526:18;;:4;:18;;;41522:187;;;41561:40;41593:7;41561:31;:40::i;:::-;41522:187;;;41631:2;41623:10;;:4;:10;;;41619:90;;41650:47;41683:4;41689:7;41650:32;:47::i;:::-;41619:90;41522:187;41737:1;41723:16;;:2;:16;;;41719:183;;;41756:45;41793:7;41756:36;:45::i;:::-;41719:183;;;41829:4;41823:10;;:2;:10;;;41819:83;;41850:40;41878:2;41882:7;41850:27;:40::i;:::-;41819:83;41719:183;41354:555;;;:::o;10364:422::-;10424:4;10632:12;10743:7;10731:20;10723:28;;10777:1;10770:4;:8;10763:15;;;10364:422;;;:::o;34553:382::-;34647:1;34633:16;;:2;:16;;;;34625:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;34706:16;34714:7;34706;:16::i;:::-;34705:17;34697:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;34768:45;34797:1;34801:2;34805:7;34768:20;:45::i;:::-;34843:1;34826:9;:13;34836:2;34826:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;34874:2;34855:7;:16;34863:7;34855:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;34919:7;34915:2;34894:33;;34911:1;34894:33;;;;;;;;;;;;34553:382;;:::o;38716:93::-;;;;:::o;42632:164::-;42736:10;:17;;;;42709:15;:24;42725:7;42709:24;;;;;;;;;;;:44;;;;42764:10;42780:7;42764:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42632:164;:::o;43423:988::-;43689:22;43739:1;43714:22;43731:4;43714:16;:22::i;:::-;:26;;;;:::i;:::-;43689:51;;43751:18;43772:17;:26;43790:7;43772:26;;;;;;;;;;;;43751:47;;43919:14;43905:10;:28;43901:328;;43950:19;43972:12;:18;43985:4;43972:18;;;;;;;;;;;;;;;:34;43991:14;43972:34;;;;;;;;;;;;43950:56;;44056:11;44023:12;:18;44036:4;44023:18;;;;;;;;;;;;;;;:30;44042:10;44023:30;;;;;;;;;;;:44;;;;44173:10;44140:17;:30;44158:11;44140:30;;;;;;;;;;;:43;;;;43901:328;;44325:17;:26;44343:7;44325:26;;;;;;;;;;;44318:33;;;44369:12;:18;44382:4;44369:18;;;;;;;;;;;;;;;:34;44388:14;44369:34;;;;;;;;;;;44362:41;;;43423:988;;;;:::o;44706:1079::-;44959:22;45004:1;44984:10;:17;;;;:21;;;;:::i;:::-;44959:46;;45016:18;45037:15;:24;45053:7;45037:24;;;;;;;;;;;;45016:45;;45388:19;45410:10;45421:14;45410:26;;;;;;;;;;;;;;;;;;;;;;;;45388:48;;45474:11;45449:10;45460;45449:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;45585:10;45554:15;:28;45570:11;45554:28;;;;;;;;;;;:41;;;;45726:15;:24;45742:7;45726:24;;;;;;;;;;;45719:31;;;45761:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44706:1079;;;;:::o;42210:221::-;42295:14;42312:20;42329:2;42312:16;:20::i;:::-;42295:37;;42370:7;42343:12;:16;42356:2;42343:16;;;;;;;;;;;;;;;:24;42360:6;42343:24;;;;;;;;;;;:34;;;;42417:6;42388:17;:26;42406:7;42388:26;;;;;;;;;;;:35;;;;42210:221;;;:::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:118::-;7365:24;7383:5;7365:24;:::i;:::-;7360:3;7353:37;7343:53;;:::o;7402:360::-;7488:3;7516:38;7548:5;7516:38;:::i;:::-;7570:70;7633:6;7628:3;7570:70;:::i;:::-;7563:77;;7649:52;7694:6;7689:3;7682:4;7675:5;7671:16;7649:52;:::i;:::-;7726:29;7748:6;7726:29;:::i;:::-;7721:3;7717:39;7710:46;;7492:270;;;;;:::o;7768:364::-;7856:3;7884:39;7917:5;7884:39;:::i;:::-;7939:71;8003:6;7998:3;7939:71;:::i;:::-;7932:78;;8019:52;8064:6;8059:3;8052:4;8045:5;8041:16;8019:52;:::i;:::-;8096:29;8118:6;8096:29;:::i;:::-;8091:3;8087:39;8080:46;;7860:272;;;;;:::o;8138:377::-;8244:3;8272:39;8305:5;8272:39;:::i;:::-;8327:89;8409:6;8404:3;8327:89;:::i;:::-;8320:96;;8425:52;8470:6;8465:3;8458:4;8451:5;8447:16;8425:52;:::i;:::-;8502:6;8497:3;8493:16;8486:23;;8248:267;;;;;:::o;8521:366::-;8663:3;8684:67;8748:2;8743:3;8684:67;:::i;:::-;8677:74;;8760:93;8849:3;8760:93;:::i;:::-;8878:2;8873:3;8869:12;8862:19;;8667:220;;;:::o;8893:366::-;9035:3;9056:67;9120:2;9115:3;9056:67;:::i;:::-;9049:74;;9132:93;9221:3;9132:93;:::i;:::-;9250:2;9245:3;9241:12;9234:19;;9039:220;;;:::o;9265:366::-;9407:3;9428:67;9492:2;9487:3;9428:67;:::i;:::-;9421:74;;9504:93;9593:3;9504:93;:::i;:::-;9622:2;9617:3;9613:12;9606:19;;9411:220;;;:::o;9637:366::-;9779:3;9800:67;9864:2;9859:3;9800:67;:::i;:::-;9793:74;;9876:93;9965:3;9876:93;:::i;:::-;9994:2;9989:3;9985:12;9978:19;;9783:220;;;:::o;10009:366::-;10151:3;10172:67;10236:2;10231:3;10172:67;:::i;:::-;10165:74;;10248:93;10337:3;10248:93;:::i;:::-;10366:2;10361:3;10357:12;10350:19;;10155:220;;;:::o;10381:366::-;10523:3;10544:67;10608:2;10603:3;10544:67;:::i;:::-;10537:74;;10620:93;10709:3;10620:93;:::i;:::-;10738:2;10733:3;10729:12;10722:19;;10527:220;;;:::o;10753:366::-;10895:3;10916:67;10980:2;10975:3;10916:67;:::i;:::-;10909:74;;10992:93;11081:3;10992:93;:::i;:::-;11110:2;11105:3;11101:12;11094:19;;10899:220;;;:::o;11125:366::-;11267:3;11288:67;11352:2;11347:3;11288:67;:::i;:::-;11281:74;;11364:93;11453:3;11364:93;:::i;:::-;11482:2;11477:3;11473:12;11466:19;;11271:220;;;:::o;11497:366::-;11639:3;11660:67;11724:2;11719:3;11660:67;:::i;:::-;11653:74;;11736:93;11825:3;11736:93;:::i;:::-;11854:2;11849:3;11845:12;11838:19;;11643:220;;;:::o;11869:366::-;12011:3;12032:67;12096:2;12091:3;12032:67;:::i;:::-;12025:74;;12108:93;12197:3;12108:93;:::i;:::-;12226:2;12221:3;12217:12;12210:19;;12015:220;;;:::o;12241:366::-;12383:3;12404:67;12468:2;12463:3;12404:67;:::i;:::-;12397:74;;12480:93;12569:3;12480:93;:::i;:::-;12598:2;12593:3;12589:12;12582:19;;12387:220;;;:::o;12613:366::-;12755:3;12776:67;12840:2;12835:3;12776:67;:::i;:::-;12769:74;;12852:93;12941:3;12852:93;:::i;:::-;12970:2;12965:3;12961:12;12954:19;;12759:220;;;:::o;12985:366::-;13127:3;13148:67;13212:2;13207:3;13148:67;:::i;:::-;13141:74;;13224:93;13313:3;13224:93;:::i;:::-;13342:2;13337:3;13333:12;13326:19;;13131:220;;;:::o;13357:366::-;13499:3;13520:67;13584:2;13579:3;13520:67;:::i;:::-;13513:74;;13596:93;13685:3;13596:93;:::i;:::-;13714:2;13709:3;13705:12;13698:19;;13503:220;;;:::o;13729:366::-;13871:3;13892:67;13956:2;13951:3;13892:67;:::i;:::-;13885:74;;13968:93;14057:3;13968:93;:::i;:::-;14086:2;14081:3;14077:12;14070:19;;13875:220;;;:::o;14101:366::-;14243:3;14264:67;14328:2;14323:3;14264:67;:::i;:::-;14257:74;;14340:93;14429:3;14340:93;:::i;:::-;14458:2;14453:3;14449:12;14442:19;;14247:220;;;:::o;14473:366::-;14615:3;14636:67;14700:2;14695:3;14636:67;:::i;:::-;14629:74;;14712:93;14801:3;14712:93;:::i;:::-;14830:2;14825:3;14821:12;14814:19;;14619:220;;;:::o;14845:398::-;15004:3;15025:83;15106:1;15101:3;15025:83;:::i;:::-;15018:90;;15117:93;15206:3;15117:93;:::i;:::-;15235:1;15230:3;15226:11;15219:18;;15008:235;;;:::o;15249:366::-;15391:3;15412:67;15476:2;15471:3;15412:67;:::i;:::-;15405:74;;15488:93;15577:3;15488:93;:::i;:::-;15606:2;15601:3;15597:12;15590:19;;15395:220;;;:::o;15621:366::-;15763:3;15784:67;15848:2;15843:3;15784:67;:::i;:::-;15777:74;;15860:93;15949:3;15860:93;:::i;:::-;15978:2;15973:3;15969:12;15962:19;;15767:220;;;:::o;15993:366::-;16135:3;16156:67;16220:2;16215:3;16156:67;:::i;:::-;16149:74;;16232:93;16321:3;16232:93;:::i;:::-;16350:2;16345:3;16341:12;16334:19;;16139:220;;;:::o;16365:108::-;16442:24;16460:5;16442:24;:::i;:::-;16437:3;16430:37;16420:53;;:::o;16479:118::-;16566:24;16584:5;16566:24;:::i;:::-;16561:3;16554:37;16544:53;;:::o;16603:595::-;16831:3;16853:95;16944:3;16935:6;16853:95;:::i;:::-;16846:102;;16965:95;17056:3;17047:6;16965:95;:::i;:::-;16958:102;;17077:95;17168:3;17159:6;17077:95;:::i;:::-;17070:102;;17189:3;17182:10;;16835:363;;;;;;:::o;17204:379::-;17388:3;17410:147;17553:3;17410:147;:::i;:::-;17403:154;;17574:3;17567:10;;17392:191;;;:::o;17589:222::-;17682:4;17720:2;17709:9;17705:18;17697:26;;17733:71;17801:1;17790:9;17786:17;17777:6;17733:71;:::i;:::-;17687:124;;;;:::o;17817:640::-;18012:4;18050:3;18039:9;18035:19;18027:27;;18064:71;18132:1;18121:9;18117:17;18108:6;18064:71;:::i;:::-;18145:72;18213:2;18202:9;18198:18;18189:6;18145:72;:::i;:::-;18227;18295:2;18284:9;18280:18;18271:6;18227:72;:::i;:::-;18346:9;18340:4;18336:20;18331:2;18320:9;18316:18;18309:48;18374:76;18445:4;18436:6;18374:76;:::i;:::-;18366:84;;18017:440;;;;;;;:::o;18463:886::-;18724:4;18762:3;18751:9;18747:19;18739:27;;18776:71;18844:1;18833:9;18829:17;18820:6;18776:71;:::i;:::-;18857:72;18925:2;18914:9;18910:18;18901:6;18857:72;:::i;:::-;18939;19007:2;18996:9;18992:18;18983:6;18939:72;:::i;:::-;19021;19089:2;19078:9;19074:18;19065:6;19021:72;:::i;:::-;19103:73;19171:3;19160:9;19156:19;19147:6;19103:73;:::i;:::-;19186;19254:3;19243:9;19239:19;19230:6;19186:73;:::i;:::-;19269;19337:3;19326:9;19322:19;19313:6;19269:73;:::i;:::-;18729:620;;;;;;;;;;:::o;19355:373::-;19498:4;19536:2;19525:9;19521:18;19513:26;;19585:9;19579:4;19575:20;19571:1;19560:9;19556:17;19549:47;19613:108;19716:4;19707:6;19613:108;:::i;:::-;19605:116;;19503:225;;;;:::o;19734:210::-;19821:4;19859:2;19848:9;19844:18;19836:26;;19872:65;19934:1;19923:9;19919:17;19910:6;19872:65;:::i;:::-;19826:118;;;;:::o;19950:313::-;20063:4;20101:2;20090:9;20086:18;20078:26;;20150:9;20144:4;20140:20;20136:1;20125:9;20121:17;20114:47;20178:78;20251:4;20242:6;20178:78;:::i;:::-;20170:86;;20068:195;;;;:::o;20269:419::-;20435:4;20473:2;20462:9;20458:18;20450:26;;20522:9;20516:4;20512:20;20508:1;20497:9;20493:17;20486:47;20550:131;20676:4;20550:131;:::i;:::-;20542:139;;20440:248;;;:::o;20694:419::-;20860:4;20898:2;20887:9;20883:18;20875:26;;20947:9;20941:4;20937:20;20933:1;20922:9;20918:17;20911:47;20975:131;21101:4;20975:131;:::i;:::-;20967:139;;20865:248;;;:::o;21119:419::-;21285:4;21323:2;21312:9;21308:18;21300:26;;21372:9;21366:4;21362:20;21358:1;21347:9;21343:17;21336:47;21400:131;21526:4;21400:131;:::i;:::-;21392:139;;21290:248;;;:::o;21544:419::-;21710:4;21748:2;21737:9;21733:18;21725:26;;21797:9;21791:4;21787:20;21783:1;21772:9;21768:17;21761:47;21825:131;21951:4;21825:131;:::i;:::-;21817:139;;21715:248;;;:::o;21969:419::-;22135:4;22173:2;22162:9;22158:18;22150:26;;22222:9;22216:4;22212:20;22208:1;22197:9;22193:17;22186:47;22250:131;22376:4;22250:131;:::i;:::-;22242:139;;22140:248;;;:::o;22394:419::-;22560:4;22598:2;22587:9;22583:18;22575:26;;22647:9;22641:4;22637:20;22633:1;22622:9;22618:17;22611:47;22675:131;22801:4;22675:131;:::i;:::-;22667:139;;22565:248;;;:::o;22819:419::-;22985:4;23023:2;23012:9;23008:18;23000:26;;23072:9;23066:4;23062:20;23058:1;23047:9;23043:17;23036:47;23100:131;23226:4;23100:131;:::i;:::-;23092:139;;22990:248;;;:::o;23244:419::-;23410:4;23448:2;23437:9;23433:18;23425:26;;23497:9;23491:4;23487:20;23483:1;23472:9;23468:17;23461:47;23525:131;23651:4;23525:131;:::i;:::-;23517:139;;23415:248;;;:::o;23669:419::-;23835:4;23873:2;23862:9;23858:18;23850:26;;23922:9;23916:4;23912:20;23908:1;23897:9;23893:17;23886:47;23950:131;24076:4;23950:131;:::i;:::-;23942:139;;23840:248;;;:::o;24094:419::-;24260:4;24298:2;24287:9;24283:18;24275:26;;24347:9;24341:4;24337:20;24333:1;24322:9;24318:17;24311:47;24375:131;24501:4;24375:131;:::i;:::-;24367:139;;24265:248;;;:::o;24519:419::-;24685:4;24723:2;24712:9;24708:18;24700:26;;24772:9;24766:4;24762:20;24758:1;24747:9;24743:17;24736:47;24800:131;24926:4;24800:131;:::i;:::-;24792:139;;24690:248;;;:::o;24944:419::-;25110:4;25148:2;25137:9;25133:18;25125:26;;25197:9;25191:4;25187:20;25183:1;25172:9;25168:17;25161:47;25225:131;25351:4;25225:131;:::i;:::-;25217:139;;25115:248;;;:::o;25369:419::-;25535:4;25573:2;25562:9;25558:18;25550:26;;25622:9;25616:4;25612:20;25608:1;25597:9;25593:17;25586:47;25650:131;25776:4;25650:131;:::i;:::-;25642:139;;25540:248;;;:::o;25794:419::-;25960:4;25998:2;25987:9;25983:18;25975:26;;26047:9;26041:4;26037:20;26033:1;26022:9;26018:17;26011:47;26075:131;26201:4;26075:131;:::i;:::-;26067:139;;25965:248;;;:::o;26219:419::-;26385:4;26423:2;26412:9;26408:18;26400:26;;26472:9;26466:4;26462:20;26458:1;26447:9;26443:17;26436:47;26500:131;26626:4;26500:131;:::i;:::-;26492:139;;26390:248;;;:::o;26644:419::-;26810:4;26848:2;26837:9;26833:18;26825:26;;26897:9;26891:4;26887:20;26883:1;26872:9;26868:17;26861:47;26925:131;27051:4;26925:131;:::i;:::-;26917:139;;26815:248;;;:::o;27069:419::-;27235:4;27273:2;27262:9;27258:18;27250:26;;27322:9;27316:4;27312:20;27308:1;27297:9;27293:17;27286:47;27350:131;27476:4;27350:131;:::i;:::-;27342:139;;27240:248;;;:::o;27494:419::-;27660:4;27698:2;27687:9;27683:18;27675:26;;27747:9;27741:4;27737:20;27733:1;27722:9;27718:17;27711:47;27775:131;27901:4;27775:131;:::i;:::-;27767:139;;27665:248;;;:::o;27919:419::-;28085:4;28123:2;28112:9;28108:18;28100:26;;28172:9;28166:4;28162:20;28158:1;28147:9;28143:17;28136:47;28200:131;28326:4;28200:131;:::i;:::-;28192:139;;28090:248;;;:::o;28344:419::-;28510:4;28548:2;28537:9;28533:18;28525:26;;28597:9;28591:4;28587:20;28583:1;28572:9;28568:17;28561:47;28625:131;28751:4;28625:131;:::i;:::-;28617:139;;28515:248;;;:::o;28769:222::-;28862:4;28900:2;28889:9;28885:18;28877:26;;28913:71;28981:1;28970:9;28966:17;28957:6;28913:71;:::i;:::-;28867:124;;;;:::o;28997:129::-;29031:6;29058:20;;:::i;:::-;29048:30;;29087:33;29115:4;29107:6;29087:33;:::i;:::-;29038:88;;;:::o;29132:75::-;29165:6;29198:2;29192:9;29182:19;;29172:35;:::o;29213:307::-;29274:4;29364:18;29356:6;29353:30;29350:2;;;29386:18;;:::i;:::-;29350:2;29424:29;29446:6;29424:29;:::i;:::-;29416:37;;29508:4;29502;29498:15;29490:23;;29279:241;;;:::o;29526:308::-;29588:4;29678:18;29670:6;29667:30;29664:2;;;29700:18;;:::i;:::-;29664:2;29738:29;29760:6;29738:29;:::i;:::-;29730:37;;29822:4;29816;29812:15;29804:23;;29593:241;;;:::o;29840:132::-;29907:4;29930:3;29922:11;;29960:4;29955:3;29951:14;29943:22;;29912:60;;;:::o;29978:114::-;30045:6;30079:5;30073:12;30063:22;;30052:40;;;:::o;30098:98::-;30149:6;30183:5;30177:12;30167:22;;30156:40;;;:::o;30202:99::-;30254:6;30288:5;30282:12;30272:22;;30261:40;;;:::o;30307:113::-;30377:4;30409;30404:3;30400:14;30392:22;;30382:38;;;:::o;30426:184::-;30525:11;30559:6;30554:3;30547:19;30599:4;30594:3;30590:14;30575:29;;30537:73;;;;:::o;30616:168::-;30699:11;30733:6;30728:3;30721:19;30773:4;30768:3;30764:14;30749:29;;30711:73;;;;:::o;30790:147::-;30891:11;30928:3;30913:18;;30903:34;;;;:::o;30943:169::-;31027:11;31061:6;31056:3;31049:19;31101:4;31096:3;31092:14;31077:29;;31039:73;;;;:::o;31118:148::-;31220:11;31257:3;31242:18;;31232:34;;;;:::o;31272:305::-;31312:3;31331:20;31349:1;31331:20;:::i;:::-;31326:25;;31365:20;31383:1;31365:20;:::i;:::-;31360:25;;31519:1;31451:66;31447:74;31444:1;31441:81;31438:2;;;31525:18;;:::i;:::-;31438:2;31569:1;31566;31562:9;31555:16;;31316:261;;;;:::o;31583:185::-;31623:1;31640:20;31658:1;31640:20;:::i;:::-;31635:25;;31674:20;31692:1;31674:20;:::i;:::-;31669:25;;31713:1;31703:2;;31718:18;;:::i;:::-;31703:2;31760:1;31757;31753:9;31748:14;;31625:143;;;;:::o;31774:191::-;31814:4;31834:20;31852:1;31834:20;:::i;:::-;31829:25;;31868:20;31886:1;31868:20;:::i;:::-;31863:25;;31907:1;31904;31901:8;31898:2;;;31912:18;;:::i;:::-;31898:2;31957:1;31954;31950:9;31942:17;;31819:146;;;;:::o;31971:96::-;32008:7;32037:24;32055:5;32037:24;:::i;:::-;32026:35;;32016:51;;;:::o;32073:90::-;32107:7;32150:5;32143:13;32136:21;32125:32;;32115:48;;;:::o;32169:77::-;32206:7;32235:5;32224:16;;32214:32;;;:::o;32252:149::-;32288:7;32328:66;32321:5;32317:78;32306:89;;32296:105;;;:::o;32407:126::-;32444:7;32484:42;32477:5;32473:54;32462:65;;32452:81;;;:::o;32539:77::-;32576:7;32605:5;32594:16;;32584:32;;;:::o;32622:154::-;32706:6;32701:3;32696;32683:30;32768:1;32759:6;32754:3;32750:16;32743:27;32673:103;;;:::o;32782:307::-;32850:1;32860:113;32874:6;32871:1;32868:13;32860:113;;;32959:1;32954:3;32950:11;32944:18;32940:1;32935:3;32931:11;32924:39;32896:2;32893:1;32889:10;32884:15;;32860:113;;;32991:6;32988:1;32985:13;32982:2;;;33071:1;33062:6;33057:3;33053:16;33046:27;32982:2;32831:258;;;;:::o;33095:171::-;33134:3;33157:24;33175:5;33157:24;:::i;:::-;33148:33;;33203:4;33196:5;33193:15;33190:2;;;33211:18;;:::i;:::-;33190:2;33258:1;33251:5;33247:13;33240:20;;33138:128;;;:::o;33272:320::-;33316:6;33353:1;33347:4;33343:12;33333:22;;33400:1;33394:4;33390:12;33421:18;33411:2;;33477:4;33469:6;33465:17;33455:27;;33411:2;33539;33531:6;33528:14;33508:18;33505:38;33502:2;;;33558:18;;:::i;:::-;33502:2;33323:269;;;;:::o;33598:281::-;33681:27;33703:4;33681:27;:::i;:::-;33673:6;33669:40;33811:6;33799:10;33796:22;33775:18;33763:10;33760:34;33757:62;33754:2;;;33822:18;;:::i;:::-;33754:2;33862:10;33858:2;33851:22;33641:238;;;:::o;33885:233::-;33924:3;33947:24;33965:5;33947:24;:::i;:::-;33938:33;;33993:66;33986:5;33983:77;33980:2;;;34063:18;;:::i;:::-;33980:2;34110:1;34103:5;34099:13;34092:20;;33928:190;;;:::o;34124:176::-;34156:1;34173:20;34191:1;34173:20;:::i;:::-;34168:25;;34207:20;34225:1;34207:20;:::i;:::-;34202:25;;34246:1;34236:2;;34251:18;;:::i;:::-;34236:2;34292:1;34289;34285:9;34280:14;;34158:142;;;;:::o;34306:180::-;34354:77;34351:1;34344:88;34451:4;34448:1;34441:15;34475:4;34472:1;34465:15;34492:180;34540:77;34537:1;34530:88;34637:4;34634:1;34627:15;34661:4;34658:1;34651:15;34678:180;34726:77;34723:1;34716:88;34823:4;34820:1;34813:15;34847:4;34844:1;34837:15;34864:180;34912:77;34909:1;34902:88;35009:4;35006:1;34999:15;35033:4;35030:1;35023:15;35050:102;35091:6;35142:2;35138:7;35133:2;35126:5;35122:14;35118:28;35108:38;;35098:54;;;:::o;35158:230::-;35298:34;35294:1;35286:6;35282:14;35275:58;35367:13;35362:2;35354:6;35350:15;35343:38;35264:124;:::o;35394:237::-;35534:34;35530:1;35522:6;35518:14;35511:58;35603:20;35598:2;35590:6;35586:15;35579:45;35500:131;:::o;35637:225::-;35777:34;35773:1;35765:6;35761:14;35754:58;35846:8;35841:2;35833:6;35829:15;35822:33;35743:119;:::o;35868:178::-;36008:30;36004:1;35996:6;35992:14;35985:54;35974:72;:::o;36052:223::-;36192:34;36188:1;36180:6;36176:14;36169:58;36261:6;36256:2;36248:6;36244:15;36237:31;36158:117;:::o;36281:175::-;36421:27;36417:1;36409:6;36405:14;36398:51;36387:69;:::o;36462:230::-;36602:34;36598:1;36590:6;36586:14;36579:58;36671:13;36666:2;36658:6;36654:15;36647:38;36568:124;:::o;36698:231::-;36838:34;36834:1;36826:6;36822:14;36815:58;36907:14;36902:2;36894:6;36890:15;36883:39;36804:125;:::o;36935:243::-;37075:34;37071:1;37063:6;37059:14;37052:58;37144:26;37139:2;37131:6;37127:15;37120:51;37041:137;:::o;37184:229::-;37324:34;37320:1;37312:6;37308:14;37301:58;37393:12;37388:2;37380:6;37376:15;37369:37;37290:123;:::o;37419:228::-;37559:34;37555:1;37547:6;37543:14;37536:58;37628:11;37623:2;37615:6;37611:15;37604:36;37525:122;:::o;37653:182::-;37793:34;37789:1;37781:6;37777:14;37770:58;37759:76;:::o;37841:231::-;37981:34;37977:1;37969:6;37965:14;37958:58;38050:14;38045:2;38037:6;38033:15;38026:39;37947:125;:::o;38078:182::-;38218:34;38214:1;38206:6;38202:14;38195:58;38184:76;:::o;38266:228::-;38406:34;38402:1;38394:6;38390:14;38383:58;38475:11;38470:2;38462:6;38458:15;38451:36;38372:122;:::o;38500:175::-;38640:27;38636:1;38628:6;38624:14;38617:51;38606:69;:::o;38681:220::-;38821:34;38817:1;38809:6;38805:14;38798:58;38890:3;38885:2;38877:6;38873:15;38866:28;38787:114;:::o;38907:::-;39013:8;:::o;39027:166::-;39167:18;39163:1;39155:6;39151:14;39144:42;39133:60;:::o;39199:236::-;39339:34;39335:1;39327:6;39323:14;39316:58;39408:19;39403:2;39395:6;39391:15;39384:44;39305:130;:::o;39441:231::-;39581:34;39577:1;39569:6;39565:14;39558:58;39650:14;39645:2;39637:6;39633:15;39626:39;39547:125;:::o;39678:122::-;39751:24;39769:5;39751:24;:::i;:::-;39744:5;39741:35;39731:2;;39790:1;39787;39780:12;39731:2;39721:79;:::o;39806:116::-;39876:21;39891:5;39876:21;:::i;:::-;39869:5;39866:32;39856:2;;39912:1;39909;39902:12;39856:2;39846:76;:::o;39928:120::-;40000:23;40017:5;40000:23;:::i;:::-;39993:5;39990:34;39980:2;;40038:1;40035;40028:12;39980:2;39970:78;:::o;40054:122::-;40127:24;40145:5;40127:24;:::i;:::-;40120:5;40117:35;40107:2;;40166:1;40163;40156:12;40107:2;40097:79;:::o

Swarm Source

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