ETH Price: $2,124.36 (-13.59%)

Token

Villainous (VIL)
 

Overview

Max Total Supply

44 VIL

Holders

25

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
8 VIL
0x86612a46b4b0989a5d20e63f494df5c3b30524f7
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
nft

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-12-20
*/

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

pragma solidity ^0.8.0;


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

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

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

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

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

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



pragma solidity ^0.8.0;

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

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

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



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;

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

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



pragma solidity ^0.8.0;

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

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



pragma solidity ^0.8.0;


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

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



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;


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

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

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

// File: Matt W - NFT.sol


// André Luque 
pragma solidity >=0.8.2;
// to enable certain compiler features

//import '@openzeppelin/contracts/token/ERC721/ERC721.sol';









contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;
    
    
    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

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

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

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

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

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


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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

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

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


abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

contract nft is ERC721Enumerable, Ownable {
   
    //baseURI that is established
    string private _currentBaseURI;
    
    //limit the tokens that can be minted
    uint256 public maxTokens;
    
    //stores the amount of mints each address has had
    mapping(address => uint) private mintsPerAddress;    
    
    //price to pay for each nft
    uint256 private mintCost_;

    //maximum mints per address
    uint private maxMint = 2;
    
    //current state os sale
    enum State {NoSale, OpenSale}
    //variable that defines the current state of sale
    State private saleState_;

    address payable private dev = payable(0x318cBF186eB13C74533943b054959867eE44eFFE);
    
    //marks the time that the sale has started
    uint256 public saleLaunchTime;
    
    constructor() ERC721('Villainous', 'VIL') {
        //this uri will only be used once revealed is on
        _currentBaseURI = 'ipfs://QmPrifdDJ2mMF7LtnWZ6UXtHUPMFJ7ePiLnLGQXL6fyWx7/';
        //start off with zero tokens and max in total collection will be 10k
        maxTokens = 1000;
        //setting the initial cost to mint 
        mintCost_ = 0.15 ether;
        //setting the initial state of sale to closed
        saleState_ = State.NoSale;

        //mint 1 inital NFT
        _safeMint(msg.sender, 1);
        mintsPerAddress[msg.sender] += 1;
    }
    
    //this uri will only be used once revealed is on
    function setBaseURI(string memory baseURI) public onlyOwner {
        _currentBaseURI = baseURI;
    }

    //function to see the current baseURI
    function _baseURI() internal view override returns (string memory) {
        return _currentBaseURI;
    }
    
    //tokens are numbered from 1 to 777
    function tokenId() internal view returns(uint256) {
        uint currentId = totalSupply();
        bool exists = true;
        while (exists) {
            currentId += 1;
            exists = _exists(currentId);
        }
        
        return currentId;
    }
    
    //minting a new NFT
    function mint(uint number) payable public {
        require(saleState_ == State.OpenSale, 'Sale is not open yet!');
        require(totalSupply() + number <= maxTokens, 'No more NFTs left to mint!');
        require(msg.value >= mintCost() * number, 'Insufficient Funds, Check current price to Mint');
        require(mintsPerAddress[msg.sender] + number <= maxMint, 'Maximum Mints per Address reached!');
        
        for (uint i = 0; i < number; i++) {
            uint tid = tokenId();
            _safeMint(msg.sender, tid);
            mintsPerAddress[msg.sender] += 1;
        }
        
    }
    
    //open the sale
    function openSale() public onlyOwner {
        saleState_ = State.OpenSale;
        saleLaunchTime = block.timestamp;
    }

    //shows the current state of sale
    function saleState() public view returns(State) {
        return saleState_;
    }
    
    //to see the price of minting
    function mintCost() public view returns(uint) {
        if (saleState_ == State.NoSale) {
            return mintCost_;
        }
        else {
            uint incrementPeriods = (block.timestamp - saleLaunchTime) / 300;
            if (mintCost_ <= (incrementPeriods * 0.00017361 ether)) {
                return 0;
            }
            else {
                return mintCost_ - (incrementPeriods * 0.00017361 ether);
            }
        }
    }

    //see account balance
    function accountBalance() public view returns(uint256) {
        return address(this).balance;
    }

    //to withdraw funds
    function withdraw() public onlyOwner {
        uint256 balance_ = accountBalance();
        require(balance_ > 0, 'No funds to withdraw');
        
        withdraw_(payable(owner()), ((balance_ * 98) / 100));
        withdraw_(dev, accountBalance()); //to avoid dust eth
    }

    function withdraw_(address payable _address, uint amount) internal {
        (bool sent, ) = _address.call{value: amount}("");
        require(sent, "Failed to send Ether");
    }
    
    //to see if a person has minted a NFT
    function isMinter() public view returns(bool) {
        if (mintsPerAddress[msg.sender] != 0) {
            return true;
        }
        else {
            return false;
        }
    }
    
    
    
   
}

Contract Security Audit

Contract ABI

API
[{"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":"accountBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openSale","outputs":[],"stateMutability":"nonpayable","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":[],"name":"saleLaunchTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"saleState","outputs":[{"internalType":"enum nft.State","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","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"}]

60806040526002600f5573318cbf186eb13c74533943b054959867ee44effe601060016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200006b57600080fd5b506040518060400160405280600a81526020017f56696c6c61696e6f7573000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f56494c00000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000f092919062000ccc565b5080600190805190602001906200010992919062000ccc565b5050506200012c620001206200021660201b60201c565b6200021e60201b60201c565b6040518060600160405280603681526020016200561560369139600b90805190602001906200015d92919062000ccc565b506103e8600c81905550670214e8348c4f0000600e819055506000601060006101000a81548160ff021916908360018111156200019f576200019e6200116a565b5b0217905550620001b7336001620002e460201b60201c565b6001600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825462000209919062000fcd565b9250508190555062001346565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620003068282604051806020016040528060008152506200030a60201b60201c565b5050565b6200031c83836200037860201b60201c565b6200033160008484846200055e60201b60201c565b62000373576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200036a9062000f18565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620003eb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003e29062000f7e565b60405180910390fd5b620003fc816200071860201b60201c565b156200043f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004369062000f3a565b60405180910390fd5b62000453600083836200078460201b60201c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254620004a5919062000fcd565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60006200058c8473ffffffffffffffffffffffffffffffffffffffff16620008cb60201b620017d11760201c565b156200070b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02620005be6200021660201b60201c565b8786866040518563ffffffff1660e01b8152600401620005e2949392919062000ec4565b602060405180830381600087803b158015620005fd57600080fd5b505af19250505080156200063157506040513d601f19601f820116820180604052508101906200062e919062000d93565b60015b620006ba573d806000811462000664576040519150601f19603f3d011682016040523d82523d6000602084013e62000669565b606091505b50600081511415620006b2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006a99062000f18565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505062000710565b600190505b949350505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6200079c838383620008de60201b620017e41760201c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415620007e957620007e381620008e360201b60201c565b62000831565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161462000830576200082f83826200092c60201b60201c565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156200087e57620008788162000aa960201b60201c565b620008c6565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614620008c557620008c4828262000b8560201b60201c565b5b5b505050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001620009468462000c1160201b62000ebb1760201c565b6200095291906200102a565b905060006007600084815260200190815260200160002054905081811462000a38576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905062000abf91906200102a565b905060006009600084815260200190815260200160002054905060006008838154811062000af25762000af1620011f7565b5b90600052602060002001549050806008838154811062000b175762000b16620011f7565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548062000b695762000b68620011c8565b5b6001900381819060005260206000200160009055905550505050565b600062000b9d8362000c1160201b62000ebb1760201c565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000c85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000c7c9062000f5c565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b82805462000cda9062001105565b90600052602060002090601f01602090048101928262000cfe576000855562000d4a565b82601f1062000d1957805160ff191683800117855562000d4a565b8280016001018555821562000d4a579182015b8281111562000d4957825182559160200191906001019062000d2c565b5b50905062000d59919062000d5d565b5090565b5b8082111562000d7857600081600090555060010162000d5e565b5090565b60008151905062000d8d816200132c565b92915050565b60006020828403121562000dac5762000dab62001226565b5b600062000dbc8482850162000d7c565b91505092915050565b62000dd08162001065565b82525050565b600062000de38262000fa0565b62000def818562000fab565b935062000e01818560208601620010cf565b62000e0c816200122b565b840191505092915050565b600062000e2660328362000fbc565b915062000e33826200123c565b604082019050919050565b600062000e4d601c8362000fbc565b915062000e5a826200128b565b602082019050919050565b600062000e74602a8362000fbc565b915062000e8182620012b4565b604082019050919050565b600062000e9b60208362000fbc565b915062000ea88262001303565b602082019050919050565b62000ebe81620010c5565b82525050565b600060808201905062000edb600083018762000dc5565b62000eea602083018662000dc5565b62000ef9604083018562000eb3565b818103606083015262000f0d818462000dd6565b905095945050505050565b6000602082019050818103600083015262000f338162000e17565b9050919050565b6000602082019050818103600083015262000f558162000e3e565b9050919050565b6000602082019050818103600083015262000f778162000e65565b9050919050565b6000602082019050818103600083015262000f998162000e8c565b9050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600062000fda82620010c5565b915062000fe783620010c5565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156200101f576200101e6200113b565b5b828201905092915050565b60006200103782620010c5565b91506200104483620010c5565b9250828210156200105a57620010596200113b565b5b828203905092915050565b60006200107282620010a5565b9050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b83811015620010ef578082015181840152602081019050620010d2565b83811115620010ff576000848401525b50505050565b600060028204905060018216806200111e57607f821691505b6020821081141562001135576200113462001199565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b620013378162001079565b81146200134357600080fd5b50565b6142bf80620013566000396000f3fe6080604052600436106101c25760003560e01c80636352211e116100f7578063a22cb46511610095578063c87b56dd11610064578063c87b56dd1461060f578063e83157421461064c578063e985e9c514610677578063f2fde38b146106b4576101c2565b8063a22cb46514610567578063b0a1c1c414610590578063b88d4fde146105bb578063bdb4b848146105e4576101c2565b80637ad4f78f116100d15780637ad4f78f146104ca5780638da5cb5b146104f557806395d89b4114610520578063a0712d681461054b576101c2565b80636352211e1461043957806370a0823114610476578063715018a6146104b3576101c2565b80632f745c59116101645780634f6ccce71161013e5780634f6ccce71461037d57806350e59eb3146103ba57806355f804b3146103e5578063603f4d521461040e576101c2565b80632f745c59146103005780633ccfd60b1461033d57806342842e0e14610354576101c2565b8063095ea7b3116101a0578063095ea7b31461026c578063167ff46f1461029557806318160ddd146102ac57806323b872dd146102d7576101c2565b806301ffc9a7146101c757806306fdde0314610204578063081812fc1461022f575b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e99190612d4a565b6106dd565b6040516101fb9190613332565b60405180910390f35b34801561021057600080fd5b50610219610757565b6040516102269190613368565b60405180910390f35b34801561023b57600080fd5b5061025660048036038101906102519190612ded565b6107e9565b60405161026391906132cb565b60405180910390f35b34801561027857600080fd5b50610293600480360381019061028e9190612d0a565b61086e565b005b3480156102a157600080fd5b506102aa610986565b005b3480156102b857600080fd5b506102c1610a36565b6040516102ce919061368a565b60405180910390f35b3480156102e357600080fd5b506102fe60048036038101906102f99190612bf4565b610a43565b005b34801561030c57600080fd5b5061032760048036038101906103229190612d0a565b610aa3565b604051610334919061368a565b60405180910390f35b34801561034957600080fd5b50610352610b48565b005b34801561036057600080fd5b5061037b60048036038101906103769190612bf4565b610c72565b005b34801561038957600080fd5b506103a4600480360381019061039f9190612ded565b610c92565b6040516103b1919061368a565b60405180910390f35b3480156103c657600080fd5b506103cf610d03565b6040516103dc9190613332565b60405180910390f35b3480156103f157600080fd5b5061040c60048036038101906104079190612da4565b610d5c565b005b34801561041a57600080fd5b50610423610df2565b604051610430919061334d565b60405180910390f35b34801561044557600080fd5b50610460600480360381019061045b9190612ded565b610e09565b60405161046d91906132cb565b60405180910390f35b34801561048257600080fd5b5061049d60048036038101906104989190612b87565b610ebb565b6040516104aa919061368a565b60405180910390f35b3480156104bf57600080fd5b506104c8610f73565b005b3480156104d657600080fd5b506104df610ffb565b6040516104ec919061368a565b60405180910390f35b34801561050157600080fd5b5061050a611001565b60405161051791906132cb565b60405180910390f35b34801561052c57600080fd5b5061053561102b565b6040516105429190613368565b60405180910390f35b61056560048036038101906105609190612ded565b6110bd565b005b34801561057357600080fd5b5061058e60048036038101906105899190612cca565b6112fd565b005b34801561059c57600080fd5b506105a561147e565b6040516105b2919061368a565b60405180910390f35b3480156105c757600080fd5b506105e260048036038101906105dd9190612c47565b611486565b005b3480156105f057600080fd5b506105f96114e8565b604051610606919061368a565b60405180910390f35b34801561061b57600080fd5b5061063660048036038101906106319190612ded565b611598565b6040516106439190613368565b60405180910390f35b34801561065857600080fd5b5061066161163f565b60405161066e919061368a565b60405180910390f35b34801561068357600080fd5b5061069e60048036038101906106999190612bb4565b611645565b6040516106ab9190613332565b60405180910390f35b3480156106c057600080fd5b506106db60048036038101906106d69190612b87565b6116d9565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610750575061074f826117e9565b5b9050919050565b6060600080546107669061396a565b80601f01602080910402602001604051908101604052809291908181526020018280546107929061396a565b80156107df5780601f106107b4576101008083540402835291602001916107df565b820191906000526020600020905b8154815290600101906020018083116107c257829003601f168201915b5050505050905090565b60006107f4826118cb565b610833576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082a9061358a565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061087982610e09565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156108ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e19061362a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610909611937565b73ffffffffffffffffffffffffffffffffffffffff161480610938575061093781610932611937565b611645565b5b610977576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096e906134ca565b60405180910390fd5b610981838361193f565b505050565b61098e611937565b73ffffffffffffffffffffffffffffffffffffffff166109ac611001565b73ffffffffffffffffffffffffffffffffffffffff1614610a02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f9906135aa565b60405180910390fd5b6001601060006101000a81548160ff02191690836001811115610a2857610a27613aa5565b5b021790555042601181905550565b6000600880549050905090565b610a54610a4e611937565b826119f8565b610a93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8a9061364a565b60405180910390fd5b610a9e838383611ad6565b505050565b6000610aae83610ebb565b8210610aef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae6906133aa565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610b50611937565b73ffffffffffffffffffffffffffffffffffffffff16610b6e611001565b73ffffffffffffffffffffffffffffffffffffffff1614610bc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bbb906135aa565b60405180910390fd5b6000610bce61147e565b905060008111610c13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0a9061348a565b60405180910390fd5b610c3c610c1e611001565b6064606284610c2d9190613801565b610c3791906137d0565b611d32565b610c6f601060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610c6a61147e565b611d32565b50565b610c8d83838360405180602001604052806000815250611486565b505050565b6000610c9c610a36565b8210610cdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd49061366a565b60405180910390fd5b60088281548110610cf157610cf0613b32565b5b90600052602060002001549050919050565b600080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414610d545760019050610d59565b600090505b90565b610d64611937565b73ffffffffffffffffffffffffffffffffffffffff16610d82611001565b73ffffffffffffffffffffffffffffffffffffffff1614610dd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dcf906135aa565b60405180910390fd5b80600b9080519060200190610dee92919061299b565b5050565b6000601060009054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610eb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea99061352a565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f239061350a565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610f7b611937565b73ffffffffffffffffffffffffffffffffffffffff16610f99611001565b73ffffffffffffffffffffffffffffffffffffffff1614610fef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe6906135aa565b60405180910390fd5b610ff96000611de3565b565b60115481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461103a9061396a565b80601f01602080910402602001604051908101604052809291908181526020018280546110669061396a565b80156110b35780601f10611088576101008083540402835291602001916110b3565b820191906000526020600020905b81548152906001019060200180831161109657829003601f168201915b5050505050905090565b6001808111156110d0576110cf613aa5565b5b601060009054906101000a900460ff1660018111156110f2576110f1613aa5565b5b14611132576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611129906135ca565b60405180910390fd5b600c548161113e610a36565b611148919061377a565b1115611189576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111809061338a565b60405180910390fd5b806111926114e8565b61119c9190613801565b3410156111de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d5906134ea565b60405180910390fd5b600f5481600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461122c919061377a565b111561126d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112649061354a565b60405180910390fd5b60005b818110156112f9576000611282611ea9565b905061128e3382611eea565b6001600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546112de919061377a565b925050819055505080806112f1906139cd565b915050611270565b5050565b611305611937565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611373576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136a9061346a565b60405180910390fd5b8060056000611380611937565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661142d611937565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114729190613332565b60405180910390a35050565b600047905090565b611497611491611937565b836119f8565b6114d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114cd9061364a565b60405180910390fd5b6114e284848484611f08565b50505050565b60008060018111156114fd576114fc613aa5565b5b601060009054906101000a900460ff16600181111561151f5761151e613aa5565b5b141561152f57600e549050611595565b600061012c60115442611542919061385b565b61154c91906137d0565b9050659de5ba612400816115609190613801565b600e5411611572576000915050611595565b659de5ba612400816115849190613801565b600e54611591919061385b565b9150505b90565b60606115a3826118cb565b6115e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d99061360a565b60405180910390fd5b60006115ec611f64565b9050600081511161160c5760405180602001604052806000815250611637565b8061161684611ff6565b604051602001611627929190613287565b6040516020818303038152906040525b915050919050565b600c5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6116e1611937565b73ffffffffffffffffffffffffffffffffffffffff166116ff611001565b73ffffffffffffffffffffffffffffffffffffffff1614611755576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174c906135aa565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156117c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117bc906133ea565b60405180910390fd5b6117ce81611de3565b50565b600080823b905060008111915050919050565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806118b457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806118c457506118c382612157565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166119b283610e09565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611a03826118cb565b611a42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a39906134aa565b60405180910390fd5b6000611a4d83610e09565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611abc57508373ffffffffffffffffffffffffffffffffffffffff16611aa4846107e9565b73ffffffffffffffffffffffffffffffffffffffff16145b80611acd5750611acc8185611645565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611af682610e09565b73ffffffffffffffffffffffffffffffffffffffff1614611b4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b43906135ea565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611bbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb39061344a565b60405180910390fd5b611bc78383836121c1565b611bd260008261193f565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c22919061385b565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c79919061377a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008273ffffffffffffffffffffffffffffffffffffffff1682604051611d58906132b6565b60006040518083038185875af1925050503d8060008114611d95576040519150601f19603f3d011682016040523d82523d6000602084013e611d9a565b606091505b5050905080611dde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd59061342a565b60405180910390fd5b505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080611eb4610a36565b90506000600190505b8015611ee257600182611ed0919061377a565b9150611edb826118cb565b9050611ebd565b819250505090565b611f048282604051806020016040528060008152506122d5565b5050565b611f13848484611ad6565b611f1f84848484612330565b611f5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f55906133ca565b60405180910390fd5b50505050565b6060600b8054611f739061396a565b80601f0160208091040260200160405190810160405280929190818152602001828054611f9f9061396a565b8015611fec5780601f10611fc157610100808354040283529160200191611fec565b820191906000526020600020905b815481529060010190602001808311611fcf57829003601f168201915b5050505050905090565b6060600082141561203e576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612152565b600082905060005b60008214612070578080612059906139cd565b915050600a8261206991906137d0565b9150612046565b60008167ffffffffffffffff81111561208c5761208b613b61565b5b6040519080825280601f01601f1916602001820160405280156120be5781602001600182028036833780820191505090505b5090505b6000851461214b576001826120d7919061385b565b9150600a856120e69190613a16565b60306120f2919061377a565b60f81b81838151811061210857612107613b32565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561214491906137d0565b94506120c2565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6121cc8383836117e4565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561220f5761220a816124c7565b61224e565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461224d5761224c8382612510565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122915761228c8161267d565b6122d0565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146122cf576122ce828261274e565b5b5b505050565b6122df83836127cd565b6122ec6000848484612330565b61232b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612322906133ca565b60405180910390fd5b505050565b60006123518473ffffffffffffffffffffffffffffffffffffffff166117d1565b156124ba578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261237a611937565b8786866040518563ffffffff1660e01b815260040161239c94939291906132e6565b602060405180830381600087803b1580156123b657600080fd5b505af19250505080156123e757506040513d601f19601f820116820180604052508101906123e49190612d77565b60015b61246a573d8060008114612417576040519150601f19603f3d011682016040523d82523d6000602084013e61241c565b606091505b50600081511415612462576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612459906133ca565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506124bf565b600190505b949350505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161251d84610ebb565b612527919061385b565b905060006007600084815260200190815260200160002054905081811461260c576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612691919061385b565b90506000600960008481526020019081526020016000205490506000600883815481106126c1576126c0613b32565b5b9060005260206000200154905080600883815481106126e3576126e2613b32565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061273257612731613b03565b5b6001900381819060005260206000200160009055905550505050565b600061275983610ebb565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561283d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128349061356a565b60405180910390fd5b612846816118cb565b15612886576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287d9061340a565b60405180910390fd5b612892600083836121c1565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128e2919061377a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b8280546129a79061396a565b90600052602060002090601f0160209004810192826129c95760008555612a10565b82601f106129e257805160ff1916838001178555612a10565b82800160010185558215612a10579182015b82811115612a0f5782518255916020019190600101906129f4565b5b509050612a1d9190612a21565b5090565b5b80821115612a3a576000816000905550600101612a22565b5090565b6000612a51612a4c846136ca565b6136a5565b905082815260208101848484011115612a6d57612a6c613b95565b5b612a78848285613928565b509392505050565b6000612a93612a8e846136fb565b6136a5565b905082815260208101848484011115612aaf57612aae613b95565b5b612aba848285613928565b509392505050565b600081359050612ad18161422d565b92915050565b600081359050612ae681614244565b92915050565b600081359050612afb8161425b565b92915050565b600081519050612b108161425b565b92915050565b600082601f830112612b2b57612b2a613b90565b5b8135612b3b848260208601612a3e565b91505092915050565b600082601f830112612b5957612b58613b90565b5b8135612b69848260208601612a80565b91505092915050565b600081359050612b8181614272565b92915050565b600060208284031215612b9d57612b9c613b9f565b5b6000612bab84828501612ac2565b91505092915050565b60008060408385031215612bcb57612bca613b9f565b5b6000612bd985828601612ac2565b9250506020612bea85828601612ac2565b9150509250929050565b600080600060608486031215612c0d57612c0c613b9f565b5b6000612c1b86828701612ac2565b9350506020612c2c86828701612ac2565b9250506040612c3d86828701612b72565b9150509250925092565b60008060008060808587031215612c6157612c60613b9f565b5b6000612c6f87828801612ac2565b9450506020612c8087828801612ac2565b9350506040612c9187828801612b72565b925050606085013567ffffffffffffffff811115612cb257612cb1613b9a565b5b612cbe87828801612b16565b91505092959194509250565b60008060408385031215612ce157612ce0613b9f565b5b6000612cef85828601612ac2565b9250506020612d0085828601612ad7565b9150509250929050565b60008060408385031215612d2157612d20613b9f565b5b6000612d2f85828601612ac2565b9250506020612d4085828601612b72565b9150509250929050565b600060208284031215612d6057612d5f613b9f565b5b6000612d6e84828501612aec565b91505092915050565b600060208284031215612d8d57612d8c613b9f565b5b6000612d9b84828501612b01565b91505092915050565b600060208284031215612dba57612db9613b9f565b5b600082013567ffffffffffffffff811115612dd857612dd7613b9a565b5b612de484828501612b44565b91505092915050565b600060208284031215612e0357612e02613b9f565b5b6000612e1184828501612b72565b91505092915050565b612e238161388f565b82525050565b612e32816138a1565b82525050565b6000612e438261372c565b612e4d8185613742565b9350612e5d818560208601613937565b612e6681613ba4565b840191505092915050565b612e7a81613916565b82525050565b6000612e8b82613737565b612e95818561375e565b9350612ea5818560208601613937565b612eae81613ba4565b840191505092915050565b6000612ec482613737565b612ece818561376f565b9350612ede818560208601613937565b80840191505092915050565b6000612ef7601a8361375e565b9150612f0282613bb5565b602082019050919050565b6000612f1a602b8361375e565b9150612f2582613bde565b604082019050919050565b6000612f3d60328361375e565b9150612f4882613c2d565b604082019050919050565b6000612f6060268361375e565b9150612f6b82613c7c565b604082019050919050565b6000612f83601c8361375e565b9150612f8e82613ccb565b602082019050919050565b6000612fa660148361375e565b9150612fb182613cf4565b602082019050919050565b6000612fc960248361375e565b9150612fd482613d1d565b604082019050919050565b6000612fec60198361375e565b9150612ff782613d6c565b602082019050919050565b600061300f60148361375e565b915061301a82613d95565b602082019050919050565b6000613032602c8361375e565b915061303d82613dbe565b604082019050919050565b600061305560388361375e565b915061306082613e0d565b604082019050919050565b6000613078602f8361375e565b915061308382613e5c565b604082019050919050565b600061309b602a8361375e565b91506130a682613eab565b604082019050919050565b60006130be60298361375e565b91506130c982613efa565b604082019050919050565b60006130e160228361375e565b91506130ec82613f49565b604082019050919050565b600061310460208361375e565b915061310f82613f98565b602082019050919050565b6000613127602c8361375e565b915061313282613fc1565b604082019050919050565b600061314a60058361376f565b915061315582614010565b600582019050919050565b600061316d60208361375e565b915061317882614039565b602082019050919050565b600061319060158361375e565b915061319b82614062565b602082019050919050565b60006131b360298361375e565b91506131be8261408b565b604082019050919050565b60006131d6602f8361375e565b91506131e1826140da565b604082019050919050565b60006131f960218361375e565b915061320482614129565b604082019050919050565b600061321c600083613753565b915061322782614178565b600082019050919050565b600061323f60318361375e565b915061324a8261417b565b604082019050919050565b6000613262602c8361375e565b915061326d826141ca565b604082019050919050565b6132818161390c565b82525050565b60006132938285612eb9565b915061329f8284612eb9565b91506132aa8261313d565b91508190509392505050565b60006132c18261320f565b9150819050919050565b60006020820190506132e06000830184612e1a565b92915050565b60006080820190506132fb6000830187612e1a565b6133086020830186612e1a565b6133156040830185613278565b81810360608301526133278184612e38565b905095945050505050565b60006020820190506133476000830184612e29565b92915050565b60006020820190506133626000830184612e71565b92915050565b600060208201905081810360008301526133828184612e80565b905092915050565b600060208201905081810360008301526133a381612eea565b9050919050565b600060208201905081810360008301526133c381612f0d565b9050919050565b600060208201905081810360008301526133e381612f30565b9050919050565b6000602082019050818103600083015261340381612f53565b9050919050565b6000602082019050818103600083015261342381612f76565b9050919050565b6000602082019050818103600083015261344381612f99565b9050919050565b6000602082019050818103600083015261346381612fbc565b9050919050565b6000602082019050818103600083015261348381612fdf565b9050919050565b600060208201905081810360008301526134a381613002565b9050919050565b600060208201905081810360008301526134c381613025565b9050919050565b600060208201905081810360008301526134e381613048565b9050919050565b600060208201905081810360008301526135038161306b565b9050919050565b600060208201905081810360008301526135238161308e565b9050919050565b60006020820190508181036000830152613543816130b1565b9050919050565b60006020820190508181036000830152613563816130d4565b9050919050565b60006020820190508181036000830152613583816130f7565b9050919050565b600060208201905081810360008301526135a38161311a565b9050919050565b600060208201905081810360008301526135c381613160565b9050919050565b600060208201905081810360008301526135e381613183565b9050919050565b60006020820190508181036000830152613603816131a6565b9050919050565b60006020820190508181036000830152613623816131c9565b9050919050565b60006020820190508181036000830152613643816131ec565b9050919050565b6000602082019050818103600083015261366381613232565b9050919050565b6000602082019050818103600083015261368381613255565b9050919050565b600060208201905061369f6000830184613278565b92915050565b60006136af6136c0565b90506136bb828261399c565b919050565b6000604051905090565b600067ffffffffffffffff8211156136e5576136e4613b61565b5b6136ee82613ba4565b9050602081019050919050565b600067ffffffffffffffff82111561371657613715613b61565b5b61371f82613ba4565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006137858261390c565b91506137908361390c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156137c5576137c4613a47565b5b828201905092915050565b60006137db8261390c565b91506137e68361390c565b9250826137f6576137f5613a76565b5b828204905092915050565b600061380c8261390c565b91506138178361390c565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156138505761384f613a47565b5b828202905092915050565b60006138668261390c565b91506138718361390c565b92508282101561388457613883613a47565b5b828203905092915050565b600061389a826138ec565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60008190506138e782614219565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000613921826138d9565b9050919050565b82818337600083830152505050565b60005b8381101561395557808201518184015260208101905061393a565b83811115613964576000848401525b50505050565b6000600282049050600182168061398257607f821691505b6020821081141561399657613995613ad4565b5b50919050565b6139a582613ba4565b810181811067ffffffffffffffff821117156139c4576139c3613b61565b5b80604052505050565b60006139d88261390c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613a0b57613a0a613a47565b5b600182019050919050565b6000613a218261390c565b9150613a2c8361390c565b925082613a3c57613a3b613a76565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e6f206d6f7265204e465473206c65667420746f206d696e7421000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4661696c656420746f2073656e64204574686572000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4e6f2066756e647320746f207769746864726177000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f496e73756666696369656e742046756e64732c20436865636b2063757272656e60008201527f7420707269636520746f204d696e740000000000000000000000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4d6178696d756d204d696e74732070657220416464726573732072656163686560008201527f6421000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f53616c65206973206e6f74206f70656e20796574210000000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6002811061422a57614229613aa5565b5b50565b6142368161388f565b811461424157600080fd5b50565b61424d816138a1565b811461425857600080fd5b50565b614264816138ad565b811461426f57600080fd5b50565b61427b8161390c565b811461428657600080fd5b5056fea26469706673582212206643f8e050032ee514f2659bac3b8cfddef55823b2eff3e3172c367763b060a564736f6c63430008070033697066733a2f2f516d5072696664444a326d4d46374c746e575a365558744855504d464a376550694c6e4c4751584c3666795778372f

Deployed Bytecode

0x6080604052600436106101c25760003560e01c80636352211e116100f7578063a22cb46511610095578063c87b56dd11610064578063c87b56dd1461060f578063e83157421461064c578063e985e9c514610677578063f2fde38b146106b4576101c2565b8063a22cb46514610567578063b0a1c1c414610590578063b88d4fde146105bb578063bdb4b848146105e4576101c2565b80637ad4f78f116100d15780637ad4f78f146104ca5780638da5cb5b146104f557806395d89b4114610520578063a0712d681461054b576101c2565b80636352211e1461043957806370a0823114610476578063715018a6146104b3576101c2565b80632f745c59116101645780634f6ccce71161013e5780634f6ccce71461037d57806350e59eb3146103ba57806355f804b3146103e5578063603f4d521461040e576101c2565b80632f745c59146103005780633ccfd60b1461033d57806342842e0e14610354576101c2565b8063095ea7b3116101a0578063095ea7b31461026c578063167ff46f1461029557806318160ddd146102ac57806323b872dd146102d7576101c2565b806301ffc9a7146101c757806306fdde0314610204578063081812fc1461022f575b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e99190612d4a565b6106dd565b6040516101fb9190613332565b60405180910390f35b34801561021057600080fd5b50610219610757565b6040516102269190613368565b60405180910390f35b34801561023b57600080fd5b5061025660048036038101906102519190612ded565b6107e9565b60405161026391906132cb565b60405180910390f35b34801561027857600080fd5b50610293600480360381019061028e9190612d0a565b61086e565b005b3480156102a157600080fd5b506102aa610986565b005b3480156102b857600080fd5b506102c1610a36565b6040516102ce919061368a565b60405180910390f35b3480156102e357600080fd5b506102fe60048036038101906102f99190612bf4565b610a43565b005b34801561030c57600080fd5b5061032760048036038101906103229190612d0a565b610aa3565b604051610334919061368a565b60405180910390f35b34801561034957600080fd5b50610352610b48565b005b34801561036057600080fd5b5061037b60048036038101906103769190612bf4565b610c72565b005b34801561038957600080fd5b506103a4600480360381019061039f9190612ded565b610c92565b6040516103b1919061368a565b60405180910390f35b3480156103c657600080fd5b506103cf610d03565b6040516103dc9190613332565b60405180910390f35b3480156103f157600080fd5b5061040c60048036038101906104079190612da4565b610d5c565b005b34801561041a57600080fd5b50610423610df2565b604051610430919061334d565b60405180910390f35b34801561044557600080fd5b50610460600480360381019061045b9190612ded565b610e09565b60405161046d91906132cb565b60405180910390f35b34801561048257600080fd5b5061049d60048036038101906104989190612b87565b610ebb565b6040516104aa919061368a565b60405180910390f35b3480156104bf57600080fd5b506104c8610f73565b005b3480156104d657600080fd5b506104df610ffb565b6040516104ec919061368a565b60405180910390f35b34801561050157600080fd5b5061050a611001565b60405161051791906132cb565b60405180910390f35b34801561052c57600080fd5b5061053561102b565b6040516105429190613368565b60405180910390f35b61056560048036038101906105609190612ded565b6110bd565b005b34801561057357600080fd5b5061058e60048036038101906105899190612cca565b6112fd565b005b34801561059c57600080fd5b506105a561147e565b6040516105b2919061368a565b60405180910390f35b3480156105c757600080fd5b506105e260048036038101906105dd9190612c47565b611486565b005b3480156105f057600080fd5b506105f96114e8565b604051610606919061368a565b60405180910390f35b34801561061b57600080fd5b5061063660048036038101906106319190612ded565b611598565b6040516106439190613368565b60405180910390f35b34801561065857600080fd5b5061066161163f565b60405161066e919061368a565b60405180910390f35b34801561068357600080fd5b5061069e60048036038101906106999190612bb4565b611645565b6040516106ab9190613332565b60405180910390f35b3480156106c057600080fd5b506106db60048036038101906106d69190612b87565b6116d9565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610750575061074f826117e9565b5b9050919050565b6060600080546107669061396a565b80601f01602080910402602001604051908101604052809291908181526020018280546107929061396a565b80156107df5780601f106107b4576101008083540402835291602001916107df565b820191906000526020600020905b8154815290600101906020018083116107c257829003601f168201915b5050505050905090565b60006107f4826118cb565b610833576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082a9061358a565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061087982610e09565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156108ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e19061362a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610909611937565b73ffffffffffffffffffffffffffffffffffffffff161480610938575061093781610932611937565b611645565b5b610977576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096e906134ca565b60405180910390fd5b610981838361193f565b505050565b61098e611937565b73ffffffffffffffffffffffffffffffffffffffff166109ac611001565b73ffffffffffffffffffffffffffffffffffffffff1614610a02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f9906135aa565b60405180910390fd5b6001601060006101000a81548160ff02191690836001811115610a2857610a27613aa5565b5b021790555042601181905550565b6000600880549050905090565b610a54610a4e611937565b826119f8565b610a93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8a9061364a565b60405180910390fd5b610a9e838383611ad6565b505050565b6000610aae83610ebb565b8210610aef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae6906133aa565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610b50611937565b73ffffffffffffffffffffffffffffffffffffffff16610b6e611001565b73ffffffffffffffffffffffffffffffffffffffff1614610bc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bbb906135aa565b60405180910390fd5b6000610bce61147e565b905060008111610c13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0a9061348a565b60405180910390fd5b610c3c610c1e611001565b6064606284610c2d9190613801565b610c3791906137d0565b611d32565b610c6f601060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610c6a61147e565b611d32565b50565b610c8d83838360405180602001604052806000815250611486565b505050565b6000610c9c610a36565b8210610cdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd49061366a565b60405180910390fd5b60088281548110610cf157610cf0613b32565b5b90600052602060002001549050919050565b600080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414610d545760019050610d59565b600090505b90565b610d64611937565b73ffffffffffffffffffffffffffffffffffffffff16610d82611001565b73ffffffffffffffffffffffffffffffffffffffff1614610dd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dcf906135aa565b60405180910390fd5b80600b9080519060200190610dee92919061299b565b5050565b6000601060009054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610eb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea99061352a565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f239061350a565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610f7b611937565b73ffffffffffffffffffffffffffffffffffffffff16610f99611001565b73ffffffffffffffffffffffffffffffffffffffff1614610fef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe6906135aa565b60405180910390fd5b610ff96000611de3565b565b60115481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461103a9061396a565b80601f01602080910402602001604051908101604052809291908181526020018280546110669061396a565b80156110b35780601f10611088576101008083540402835291602001916110b3565b820191906000526020600020905b81548152906001019060200180831161109657829003601f168201915b5050505050905090565b6001808111156110d0576110cf613aa5565b5b601060009054906101000a900460ff1660018111156110f2576110f1613aa5565b5b14611132576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611129906135ca565b60405180910390fd5b600c548161113e610a36565b611148919061377a565b1115611189576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111809061338a565b60405180910390fd5b806111926114e8565b61119c9190613801565b3410156111de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d5906134ea565b60405180910390fd5b600f5481600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461122c919061377a565b111561126d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112649061354a565b60405180910390fd5b60005b818110156112f9576000611282611ea9565b905061128e3382611eea565b6001600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546112de919061377a565b925050819055505080806112f1906139cd565b915050611270565b5050565b611305611937565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611373576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136a9061346a565b60405180910390fd5b8060056000611380611937565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661142d611937565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114729190613332565b60405180910390a35050565b600047905090565b611497611491611937565b836119f8565b6114d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114cd9061364a565b60405180910390fd5b6114e284848484611f08565b50505050565b60008060018111156114fd576114fc613aa5565b5b601060009054906101000a900460ff16600181111561151f5761151e613aa5565b5b141561152f57600e549050611595565b600061012c60115442611542919061385b565b61154c91906137d0565b9050659de5ba612400816115609190613801565b600e5411611572576000915050611595565b659de5ba612400816115849190613801565b600e54611591919061385b565b9150505b90565b60606115a3826118cb565b6115e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d99061360a565b60405180910390fd5b60006115ec611f64565b9050600081511161160c5760405180602001604052806000815250611637565b8061161684611ff6565b604051602001611627929190613287565b6040516020818303038152906040525b915050919050565b600c5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6116e1611937565b73ffffffffffffffffffffffffffffffffffffffff166116ff611001565b73ffffffffffffffffffffffffffffffffffffffff1614611755576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174c906135aa565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156117c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117bc906133ea565b60405180910390fd5b6117ce81611de3565b50565b600080823b905060008111915050919050565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806118b457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806118c457506118c382612157565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166119b283610e09565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611a03826118cb565b611a42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a39906134aa565b60405180910390fd5b6000611a4d83610e09565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611abc57508373ffffffffffffffffffffffffffffffffffffffff16611aa4846107e9565b73ffffffffffffffffffffffffffffffffffffffff16145b80611acd5750611acc8185611645565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611af682610e09565b73ffffffffffffffffffffffffffffffffffffffff1614611b4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b43906135ea565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611bbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb39061344a565b60405180910390fd5b611bc78383836121c1565b611bd260008261193f565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c22919061385b565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c79919061377a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008273ffffffffffffffffffffffffffffffffffffffff1682604051611d58906132b6565b60006040518083038185875af1925050503d8060008114611d95576040519150601f19603f3d011682016040523d82523d6000602084013e611d9a565b606091505b5050905080611dde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd59061342a565b60405180910390fd5b505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080611eb4610a36565b90506000600190505b8015611ee257600182611ed0919061377a565b9150611edb826118cb565b9050611ebd565b819250505090565b611f048282604051806020016040528060008152506122d5565b5050565b611f13848484611ad6565b611f1f84848484612330565b611f5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f55906133ca565b60405180910390fd5b50505050565b6060600b8054611f739061396a565b80601f0160208091040260200160405190810160405280929190818152602001828054611f9f9061396a565b8015611fec5780601f10611fc157610100808354040283529160200191611fec565b820191906000526020600020905b815481529060010190602001808311611fcf57829003601f168201915b5050505050905090565b6060600082141561203e576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612152565b600082905060005b60008214612070578080612059906139cd565b915050600a8261206991906137d0565b9150612046565b60008167ffffffffffffffff81111561208c5761208b613b61565b5b6040519080825280601f01601f1916602001820160405280156120be5781602001600182028036833780820191505090505b5090505b6000851461214b576001826120d7919061385b565b9150600a856120e69190613a16565b60306120f2919061377a565b60f81b81838151811061210857612107613b32565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561214491906137d0565b94506120c2565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6121cc8383836117e4565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561220f5761220a816124c7565b61224e565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461224d5761224c8382612510565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122915761228c8161267d565b6122d0565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146122cf576122ce828261274e565b5b5b505050565b6122df83836127cd565b6122ec6000848484612330565b61232b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612322906133ca565b60405180910390fd5b505050565b60006123518473ffffffffffffffffffffffffffffffffffffffff166117d1565b156124ba578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261237a611937565b8786866040518563ffffffff1660e01b815260040161239c94939291906132e6565b602060405180830381600087803b1580156123b657600080fd5b505af19250505080156123e757506040513d601f19601f820116820180604052508101906123e49190612d77565b60015b61246a573d8060008114612417576040519150601f19603f3d011682016040523d82523d6000602084013e61241c565b606091505b50600081511415612462576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612459906133ca565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506124bf565b600190505b949350505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161251d84610ebb565b612527919061385b565b905060006007600084815260200190815260200160002054905081811461260c576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612691919061385b565b90506000600960008481526020019081526020016000205490506000600883815481106126c1576126c0613b32565b5b9060005260206000200154905080600883815481106126e3576126e2613b32565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061273257612731613b03565b5b6001900381819060005260206000200160009055905550505050565b600061275983610ebb565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561283d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128349061356a565b60405180910390fd5b612846816118cb565b15612886576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287d9061340a565b60405180910390fd5b612892600083836121c1565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128e2919061377a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b8280546129a79061396a565b90600052602060002090601f0160209004810192826129c95760008555612a10565b82601f106129e257805160ff1916838001178555612a10565b82800160010185558215612a10579182015b82811115612a0f5782518255916020019190600101906129f4565b5b509050612a1d9190612a21565b5090565b5b80821115612a3a576000816000905550600101612a22565b5090565b6000612a51612a4c846136ca565b6136a5565b905082815260208101848484011115612a6d57612a6c613b95565b5b612a78848285613928565b509392505050565b6000612a93612a8e846136fb565b6136a5565b905082815260208101848484011115612aaf57612aae613b95565b5b612aba848285613928565b509392505050565b600081359050612ad18161422d565b92915050565b600081359050612ae681614244565b92915050565b600081359050612afb8161425b565b92915050565b600081519050612b108161425b565b92915050565b600082601f830112612b2b57612b2a613b90565b5b8135612b3b848260208601612a3e565b91505092915050565b600082601f830112612b5957612b58613b90565b5b8135612b69848260208601612a80565b91505092915050565b600081359050612b8181614272565b92915050565b600060208284031215612b9d57612b9c613b9f565b5b6000612bab84828501612ac2565b91505092915050565b60008060408385031215612bcb57612bca613b9f565b5b6000612bd985828601612ac2565b9250506020612bea85828601612ac2565b9150509250929050565b600080600060608486031215612c0d57612c0c613b9f565b5b6000612c1b86828701612ac2565b9350506020612c2c86828701612ac2565b9250506040612c3d86828701612b72565b9150509250925092565b60008060008060808587031215612c6157612c60613b9f565b5b6000612c6f87828801612ac2565b9450506020612c8087828801612ac2565b9350506040612c9187828801612b72565b925050606085013567ffffffffffffffff811115612cb257612cb1613b9a565b5b612cbe87828801612b16565b91505092959194509250565b60008060408385031215612ce157612ce0613b9f565b5b6000612cef85828601612ac2565b9250506020612d0085828601612ad7565b9150509250929050565b60008060408385031215612d2157612d20613b9f565b5b6000612d2f85828601612ac2565b9250506020612d4085828601612b72565b9150509250929050565b600060208284031215612d6057612d5f613b9f565b5b6000612d6e84828501612aec565b91505092915050565b600060208284031215612d8d57612d8c613b9f565b5b6000612d9b84828501612b01565b91505092915050565b600060208284031215612dba57612db9613b9f565b5b600082013567ffffffffffffffff811115612dd857612dd7613b9a565b5b612de484828501612b44565b91505092915050565b600060208284031215612e0357612e02613b9f565b5b6000612e1184828501612b72565b91505092915050565b612e238161388f565b82525050565b612e32816138a1565b82525050565b6000612e438261372c565b612e4d8185613742565b9350612e5d818560208601613937565b612e6681613ba4565b840191505092915050565b612e7a81613916565b82525050565b6000612e8b82613737565b612e95818561375e565b9350612ea5818560208601613937565b612eae81613ba4565b840191505092915050565b6000612ec482613737565b612ece818561376f565b9350612ede818560208601613937565b80840191505092915050565b6000612ef7601a8361375e565b9150612f0282613bb5565b602082019050919050565b6000612f1a602b8361375e565b9150612f2582613bde565b604082019050919050565b6000612f3d60328361375e565b9150612f4882613c2d565b604082019050919050565b6000612f6060268361375e565b9150612f6b82613c7c565b604082019050919050565b6000612f83601c8361375e565b9150612f8e82613ccb565b602082019050919050565b6000612fa660148361375e565b9150612fb182613cf4565b602082019050919050565b6000612fc960248361375e565b9150612fd482613d1d565b604082019050919050565b6000612fec60198361375e565b9150612ff782613d6c565b602082019050919050565b600061300f60148361375e565b915061301a82613d95565b602082019050919050565b6000613032602c8361375e565b915061303d82613dbe565b604082019050919050565b600061305560388361375e565b915061306082613e0d565b604082019050919050565b6000613078602f8361375e565b915061308382613e5c565b604082019050919050565b600061309b602a8361375e565b91506130a682613eab565b604082019050919050565b60006130be60298361375e565b91506130c982613efa565b604082019050919050565b60006130e160228361375e565b91506130ec82613f49565b604082019050919050565b600061310460208361375e565b915061310f82613f98565b602082019050919050565b6000613127602c8361375e565b915061313282613fc1565b604082019050919050565b600061314a60058361376f565b915061315582614010565b600582019050919050565b600061316d60208361375e565b915061317882614039565b602082019050919050565b600061319060158361375e565b915061319b82614062565b602082019050919050565b60006131b360298361375e565b91506131be8261408b565b604082019050919050565b60006131d6602f8361375e565b91506131e1826140da565b604082019050919050565b60006131f960218361375e565b915061320482614129565b604082019050919050565b600061321c600083613753565b915061322782614178565b600082019050919050565b600061323f60318361375e565b915061324a8261417b565b604082019050919050565b6000613262602c8361375e565b915061326d826141ca565b604082019050919050565b6132818161390c565b82525050565b60006132938285612eb9565b915061329f8284612eb9565b91506132aa8261313d565b91508190509392505050565b60006132c18261320f565b9150819050919050565b60006020820190506132e06000830184612e1a565b92915050565b60006080820190506132fb6000830187612e1a565b6133086020830186612e1a565b6133156040830185613278565b81810360608301526133278184612e38565b905095945050505050565b60006020820190506133476000830184612e29565b92915050565b60006020820190506133626000830184612e71565b92915050565b600060208201905081810360008301526133828184612e80565b905092915050565b600060208201905081810360008301526133a381612eea565b9050919050565b600060208201905081810360008301526133c381612f0d565b9050919050565b600060208201905081810360008301526133e381612f30565b9050919050565b6000602082019050818103600083015261340381612f53565b9050919050565b6000602082019050818103600083015261342381612f76565b9050919050565b6000602082019050818103600083015261344381612f99565b9050919050565b6000602082019050818103600083015261346381612fbc565b9050919050565b6000602082019050818103600083015261348381612fdf565b9050919050565b600060208201905081810360008301526134a381613002565b9050919050565b600060208201905081810360008301526134c381613025565b9050919050565b600060208201905081810360008301526134e381613048565b9050919050565b600060208201905081810360008301526135038161306b565b9050919050565b600060208201905081810360008301526135238161308e565b9050919050565b60006020820190508181036000830152613543816130b1565b9050919050565b60006020820190508181036000830152613563816130d4565b9050919050565b60006020820190508181036000830152613583816130f7565b9050919050565b600060208201905081810360008301526135a38161311a565b9050919050565b600060208201905081810360008301526135c381613160565b9050919050565b600060208201905081810360008301526135e381613183565b9050919050565b60006020820190508181036000830152613603816131a6565b9050919050565b60006020820190508181036000830152613623816131c9565b9050919050565b60006020820190508181036000830152613643816131ec565b9050919050565b6000602082019050818103600083015261366381613232565b9050919050565b6000602082019050818103600083015261368381613255565b9050919050565b600060208201905061369f6000830184613278565b92915050565b60006136af6136c0565b90506136bb828261399c565b919050565b6000604051905090565b600067ffffffffffffffff8211156136e5576136e4613b61565b5b6136ee82613ba4565b9050602081019050919050565b600067ffffffffffffffff82111561371657613715613b61565b5b61371f82613ba4565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006137858261390c565b91506137908361390c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156137c5576137c4613a47565b5b828201905092915050565b60006137db8261390c565b91506137e68361390c565b9250826137f6576137f5613a76565b5b828204905092915050565b600061380c8261390c565b91506138178361390c565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156138505761384f613a47565b5b828202905092915050565b60006138668261390c565b91506138718361390c565b92508282101561388457613883613a47565b5b828203905092915050565b600061389a826138ec565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60008190506138e782614219565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000613921826138d9565b9050919050565b82818337600083830152505050565b60005b8381101561395557808201518184015260208101905061393a565b83811115613964576000848401525b50505050565b6000600282049050600182168061398257607f821691505b6020821081141561399657613995613ad4565b5b50919050565b6139a582613ba4565b810181811067ffffffffffffffff821117156139c4576139c3613b61565b5b80604052505050565b60006139d88261390c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613a0b57613a0a613a47565b5b600182019050919050565b6000613a218261390c565b9150613a2c8361390c565b925082613a3c57613a3b613a76565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e6f206d6f7265204e465473206c65667420746f206d696e7421000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4661696c656420746f2073656e64204574686572000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4e6f2066756e647320746f207769746864726177000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f496e73756666696369656e742046756e64732c20436865636b2063757272656e60008201527f7420707269636520746f204d696e740000000000000000000000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4d6178696d756d204d696e74732070657220416464726573732072656163686560008201527f6421000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f53616c65206973206e6f74206f70656e20796574210000000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6002811061422a57614229613aa5565b5b50565b6142368161388f565b811461424157600080fd5b50565b61424d816138a1565b811461425857600080fd5b50565b614264816138ad565b811461426f57600080fd5b50565b61427b8161390c565b811461428657600080fd5b5056fea26469706673582212206643f8e050032ee514f2659bac3b8cfddef55823b2eff3e3172c367763b060a564736f6c63430008070033

Deployed Bytecode Sourcemap

42430:4411:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36297:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23752:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25332:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24855:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45151:126;;;;;;;;;;;;;:::i;:::-;;36937:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26222:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36605:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46093:283;;;;;;;;;;;;;:::i;:::-;;26632:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37127:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46621:194;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43877:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45324:84;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23446:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23176:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4593:94;;;;;;;;;;;;;:::i;:::-;;43193:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3942:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23921:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44503:615;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25625:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45958:102;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26888:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45455:468;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24096:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42605:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25991:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4842:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36297:224;36399:4;36438:35;36423:50;;;:11;:50;;;;:90;;;;36477:36;36501:11;36477:23;:36::i;:::-;36423:90;36416:97;;36297:224;;;:::o;23752:100::-;23806:13;23839:5;23832:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23752:100;:::o;25332:221::-;25408:7;25436:16;25444:7;25436;:16::i;:::-;25428:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25521:15;:24;25537:7;25521:24;;;;;;;;;;;;;;;;;;;;;25514:31;;25332:221;;;:::o;24855:411::-;24936:13;24952:23;24967:7;24952:14;:23::i;:::-;24936:39;;25000:5;24994:11;;:2;:11;;;;24986:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;25094:5;25078:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;25103:37;25120:5;25127:12;:10;:12::i;:::-;25103:16;:37::i;:::-;25078:62;25056:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;25237:21;25246:2;25250:7;25237:8;:21::i;:::-;24925:341;24855:411;;:::o;45151:126::-;4173:12;:10;:12::i;:::-;4162:23;;:7;:5;:7::i;:::-;:23;;;4154:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45212:14:::1;45199:10;;:27;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;45254:15;45237:14;:32;;;;45151:126::o:0;36937:113::-;36998:7;37025:10;:17;;;;37018:24;;36937:113;:::o;26222:339::-;26417:41;26436:12;:10;:12::i;:::-;26450:7;26417:18;:41::i;:::-;26409:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;26525:28;26535:4;26541:2;26545:7;26525:9;:28::i;:::-;26222:339;;;:::o;36605:256::-;36702:7;36738:23;36755:5;36738:16;:23::i;:::-;36730:5;:31;36722:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;36827:12;:19;36840:5;36827:19;;;;;;;;;;;;;;;:26;36847:5;36827:26;;;;;;;;;;;;36820:33;;36605:256;;;;:::o;46093:283::-;4173:12;:10;:12::i;:::-;4162:23;;:7;:5;:7::i;:::-;:23;;;4154:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46141:16:::1;46160;:14;:16::i;:::-;46141:35;;46206:1;46195:8;:12;46187:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;46253:52;46271:7;:5;:7::i;:::-;46300:3;46294:2;46283:8;:13;;;;:::i;:::-;46282:21;;;;:::i;:::-;46253:9;:52::i;:::-;46316:32;46326:3;;;;;;;;;;;46331:16;:14;:16::i;:::-;46316:9;:32::i;:::-;46130:246;46093:283::o:0;26632:185::-;26770:39;26787:4;26793:2;26797:7;26770:39;;;;;;;;;;;;:16;:39::i;:::-;26632:185;;;:::o;37127:233::-;37202:7;37238:30;:28;:30::i;:::-;37230:5;:38;37222:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;37335:10;37346:5;37335:17;;;;;;;;:::i;:::-;;;;;;;;;;37328:24;;37127:233;;;:::o;46621:194::-;46661:4;46713:1;46682:15;:27;46698:10;46682:27;;;;;;;;;;;;;;;;:32;46678:130;;46738:4;46731:11;;;;46678:130;46791:5;46784:12;;46621:194;;:::o;43877:104::-;4173:12;:10;:12::i;:::-;4162:23;;:7;:5;:7::i;:::-;:23;;;4154:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43966:7:::1;43948:15;:25;;;;;;;;;;;;:::i;:::-;;43877:104:::0;:::o;45324:84::-;45365:5;45390:10;;;;;;;;;;;45383:17;;45324:84;:::o;23446:239::-;23518:7;23538:13;23554:7;:16;23562:7;23554:16;;;;;;;;;;;;;;;;;;;;;23538:32;;23606:1;23589:19;;:5;:19;;;;23581:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23672:5;23665:12;;;23446:239;;;:::o;23176:208::-;23248:7;23293:1;23276:19;;:5;:19;;;;23268:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;23360:9;:16;23370:5;23360:16;;;;;;;;;;;;;;;;23353:23;;23176:208;;;:::o;4593:94::-;4173:12;:10;:12::i;:::-;4162:23;;:7;:5;:7::i;:::-;:23;;;4154:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4658:21:::1;4676:1;4658:9;:21::i;:::-;4593:94::o:0;43193:29::-;;;;:::o;3942:87::-;3988:7;4015:6;;;;;;;;;;;4008:13;;3942:87;:::o;23921:104::-;23977:13;24010:7;24003:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23921:104;:::o;44503:615::-;44578:14;44564:28;;;;;;;;:::i;:::-;;:10;;;;;;;;;;;:28;;;;;;;;:::i;:::-;;;44556:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;44663:9;;44653:6;44637:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:35;;44629:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;44748:6;44735:10;:8;:10::i;:::-;:19;;;;:::i;:::-;44722:9;:32;;44714:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;44865:7;;44855:6;44825:15;:27;44841:10;44825:27;;;;;;;;;;;;;;;;:36;;;;:::i;:::-;:47;;44817:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;44937:6;44932:169;44953:6;44949:1;:10;44932:169;;;44981:8;44992:9;:7;:9::i;:::-;44981:20;;45016:26;45026:10;45038:3;45016:9;:26::i;:::-;45088:1;45057:15;:27;45073:10;45057:27;;;;;;;;;;;;;;;;:32;;;;;;;:::i;:::-;;;;;;;;44966:135;44961:3;;;;;:::i;:::-;;;;44932:169;;;;44503:615;:::o;25625:295::-;25740:12;:10;:12::i;:::-;25728:24;;:8;:24;;;;25720:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;25840:8;25795:18;:32;25814:12;:10;:12::i;:::-;25795:32;;;;;;;;;;;;;;;:42;25828:8;25795:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;25893:8;25864:48;;25879:12;:10;:12::i;:::-;25864:48;;;25903:8;25864:48;;;;;;:::i;:::-;;;;;;;;25625:295;;:::o;45958:102::-;46004:7;46031:21;46024:28;;45958:102;:::o;26888:328::-;27063:41;27082:12;:10;:12::i;:::-;27096:7;27063:18;:41::i;:::-;27055:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;27169:39;27183:4;27189:2;27193:7;27202:5;27169:13;:39::i;:::-;26888:328;;;;:::o;45455:468::-;45495:4;45530:12;45516:26;;;;;;;;:::i;:::-;;:10;;;;;;;;;;;:26;;;;;;;;:::i;:::-;;;45512:404;;;45566:9;;45559:16;;;;45512:404;45617:21;45678:3;45660:14;;45642:15;:32;;;;:::i;:::-;45641:40;;;;:::i;:::-;45617:64;;45733:16;45714;:35;;;;:::i;:::-;45700:9;;:50;45696:209;;45778:1;45771:8;;;;;45696:209;45872:16;45853;:35;;;;:::i;:::-;45840:9;;:49;;;;:::i;:::-;45833:56;;;45455:468;;:::o;24096:355::-;24169:13;24203:16;24211:7;24203;:16::i;:::-;24195:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;24286:21;24310:10;:8;:10::i;:::-;24286:34;;24362:1;24344:7;24338:21;:25;:95;;;;;;;;;;;;;;;;;24390:7;24399:18;:7;:16;:18::i;:::-;24373:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;24338:95;24331:102;;;24096:355;;;:::o;42605:24::-;;;;:::o;25991:164::-;26088:4;26112:18;:25;26131:5;26112:25;;;;;;;;;;;;;;;:35;26138:8;26112:35;;;;;;;;;;;;;;;;;;;;;;;;;26105:42;;25991:164;;;;:::o;4842:192::-;4173:12;:10;:12::i;:::-;4162:23;;:7;:5;:7::i;:::-;:23;;;4154:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4951:1:::1;4931:22;;:8;:22;;;;4923:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5007:19;5017:8;5007:9;:19::i;:::-;4842:192:::0;:::o;5988:387::-;6048:4;6256:12;6323:7;6311:20;6303:28;;6366:1;6359:4;:8;6352:15;;;5988:387;;;:::o;34818:126::-;;;;:::o;22807:305::-;22909:4;22961:25;22946:40;;;:11;:40;;;;:105;;;;23018:33;23003:48;;;:11;:48;;;;22946:105;:158;;;;23068:36;23092:11;23068:23;:36::i;:::-;22946:158;22926:178;;22807:305;;;:::o;28726:127::-;28791:4;28843:1;28815:30;;:7;:16;28823:7;28815:16;;;;;;;;;;;;;;;;;;;;;:30;;;;28808:37;;28726:127;;;:::o;2730:98::-;2783:7;2810:10;2803:17;;2730:98;:::o;32708:174::-;32810:2;32783:15;:24;32799:7;32783:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;32866:7;32862:2;32828:46;;32837:23;32852:7;32837:14;:23::i;:::-;32828:46;;;;;;;;;;;;32708:174;;:::o;29020:348::-;29113:4;29138:16;29146:7;29138;:16::i;:::-;29130:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;29214:13;29230:23;29245:7;29230:14;:23::i;:::-;29214:39;;29283:5;29272:16;;:7;:16;;;:51;;;;29316:7;29292:31;;:20;29304:7;29292:11;:20::i;:::-;:31;;;29272:51;:87;;;;29327:32;29344:5;29351:7;29327:16;:32::i;:::-;29272:87;29264:96;;;29020:348;;;;:::o;32012:578::-;32171:4;32144:31;;:23;32159:7;32144:14;:23::i;:::-;:31;;;32136:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;32254:1;32240:16;;:2;:16;;;;32232:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;32310:39;32331:4;32337:2;32341:7;32310:20;:39::i;:::-;32414:29;32431:1;32435:7;32414:8;:29::i;:::-;32475:1;32456:9;:15;32466:4;32456:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;32504:1;32487:9;:13;32497:2;32487:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32535:2;32516:7;:16;32524:7;32516:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32574:7;32570:2;32555:27;;32564:4;32555:27;;;;;;;;;;;;32012:578;;;:::o;46384:182::-;46463:9;46478:8;:13;;46499:6;46478:32;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46462:48;;;46529:4;46521:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;46451:115;46384:182;;:::o;5042:173::-;5098:16;5117:6;;;;;;;;;;;5098:25;;5143:8;5134:6;;:17;;;;;;;;;;;;;;;;;;5198:8;5167:40;;5188:8;5167:40;;;;;;;;;;;;5087:128;5042:173;:::o;44193:273::-;44234:7;44254:14;44271:13;:11;:13::i;:::-;44254:30;;44295:11;44309:4;44295:18;;44324:98;44331:6;44324:98;;;44367:1;44354:14;;;;;:::i;:::-;;;44392:18;44400:9;44392:7;:18::i;:::-;44383:27;;44324:98;;;44449:9;44442:16;;;;44193:273;:::o;29710:110::-;29786:26;29796:2;29800:7;29786:26;;;;;;;;;;;;:9;:26::i;:::-;29710:110;;:::o;28098:315::-;28255:28;28265:4;28271:2;28275:7;28255:9;:28::i;:::-;28302:48;28325:4;28331:2;28335:7;28344:5;28302:22;:48::i;:::-;28294:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;28098:315;;;;:::o;44032:108::-;44084:13;44117:15;44110:22;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44032:108;:::o;346:723::-;402:13;632:1;623:5;:10;619:53;;;650:10;;;;;;;;;;;;;;;;;;;;;619:53;682:12;697:5;682:20;;713:14;738:78;753:1;745:4;:9;738:78;;771:8;;;;;:::i;:::-;;;;802:2;794:10;;;;;:::i;:::-;;;738:78;;;826:19;858:6;848:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;826:39;;876:154;892:1;883:5;:10;876:154;;920:1;910:11;;;;;:::i;:::-;;;987:2;979:5;:10;;;;:::i;:::-;966:2;:24;;;;:::i;:::-;953:39;;936:6;943;936:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1016:2;1007:11;;;;;:::i;:::-;;;876:154;;;1054:6;1040:21;;;;;346:723;;;;:::o;15928:157::-;16013:4;16052:25;16037:40;;;:11;:40;;;;16030:47;;15928:157;;;:::o;37973:574::-;38082:45;38109:4;38115:2;38119:7;38082:26;:45::i;:::-;38160:1;38144:18;;:4;:18;;;38140:197;;;38179:40;38211:7;38179:31;:40::i;:::-;38140:197;;;38259:2;38251:10;;:4;:10;;;38247:90;;38278:47;38311:4;38317:7;38278:32;:47::i;:::-;38247:90;38140:197;38365:1;38351:16;;:2;:16;;;38347:193;;;38384:45;38421:7;38384:36;:45::i;:::-;38347:193;;;38467:4;38461:10;;:2;:10;;;38457:83;;38488:40;38516:2;38520:7;38488:27;:40::i;:::-;38457:83;38347:193;37973:574;;;:::o;30047:321::-;30177:18;30183:2;30187:7;30177:5;:18::i;:::-;30228:54;30259:1;30263:2;30267:7;30276:5;30228:22;:54::i;:::-;30206:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;30047:321;;;:::o;33447:799::-;33602:4;33623:15;:2;:13;;;:15::i;:::-;33619:620;;;33675:2;33659:36;;;33696:12;:10;:12::i;:::-;33710:4;33716:7;33725:5;33659:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;33655:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33918:1;33901:6;:13;:18;33897:272;;;33944:60;;;;;;;;;;:::i;:::-;;;;;;;;33897:272;34119:6;34113:13;34104:6;34100:2;34096:15;34089:38;33655:529;33792:41;;;33782:51;;;:6;:51;;;;33775:58;;;;;33619:620;34223:4;34216:11;;33447:799;;;;;;;:::o;39270:164::-;39374:10;:17;;;;39347:15;:24;39363:7;39347:24;;;;;;;;;;;:44;;;;39402:10;39418:7;39402:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39270:164;:::o;40061:988::-;40327:22;40377:1;40352:22;40369:4;40352:16;:22::i;:::-;:26;;;;:::i;:::-;40327:51;;40389:18;40410:17;:26;40428:7;40410:26;;;;;;;;;;;;40389:47;;40557:14;40543:10;:28;40539:328;;40588:19;40610:12;:18;40623:4;40610:18;;;;;;;;;;;;;;;:34;40629:14;40610:34;;;;;;;;;;;;40588:56;;40694:11;40661:12;:18;40674:4;40661:18;;;;;;;;;;;;;;;:30;40680:10;40661:30;;;;;;;;;;;:44;;;;40811:10;40778:17;:30;40796:11;40778:30;;;;;;;;;;;:43;;;;40573:294;40539:328;40963:17;:26;40981:7;40963:26;;;;;;;;;;;40956:33;;;41007:12;:18;41020:4;41007:18;;;;;;;;;;;;;;;:34;41026:14;41007:34;;;;;;;;;;;41000:41;;;40142:907;;40061:988;;:::o;41344:1079::-;41597:22;41642:1;41622:10;:17;;;;:21;;;;:::i;:::-;41597:46;;41654:18;41675:15;:24;41691:7;41675:24;;;;;;;;;;;;41654:45;;42026:19;42048:10;42059:14;42048:26;;;;;;;;:::i;:::-;;;;;;;;;;42026:48;;42112:11;42087:10;42098;42087:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;42223:10;42192:15;:28;42208:11;42192:28;;;;;;;;;;;:41;;;;42364:15;:24;42380:7;42364:24;;;;;;;;;;;42357:31;;;42399:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;41415:1008;;;41344:1079;:::o;38848:221::-;38933:14;38950:20;38967:2;38950:16;:20::i;:::-;38933:37;;39008:7;38981:12;:16;38994:2;38981:16;;;;;;;;;;;;;;;:24;38998:6;38981:24;;;;;;;;;;;:34;;;;39055:6;39026:17;:26;39044:7;39026:26;;;;;;;;;;;:35;;;;38922:147;38848:221;;:::o;30704:382::-;30798:1;30784:16;;:2;:16;;;;30776:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;30857:16;30865:7;30857;:16::i;:::-;30856:17;30848:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;30919:45;30948:1;30952:2;30956:7;30919:20;:45::i;:::-;30994:1;30977:9;:13;30987:2;30977:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;31025:2;31006:7;:16;31014:7;31006:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;31070:7;31066:2;31045:33;;31062:1;31045:33;;;;;;;;;;;;30704:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:327::-;5678:6;5727:2;5715:9;5706:7;5702:23;5698:32;5695:119;;;5733:79;;:::i;:::-;5695:119;5853:1;5878:52;5922:7;5913:6;5902:9;5898:22;5878:52;:::i;:::-;5868:62;;5824:116;5620:327;;;;:::o;5953:349::-;6022:6;6071:2;6059:9;6050:7;6046:23;6042:32;6039:119;;;6077:79;;:::i;:::-;6039:119;6197:1;6222:63;6277:7;6268:6;6257:9;6253:22;6222:63;:::i;:::-;6212:73;;6168:127;5953:349;;;;:::o;6308:509::-;6377:6;6426:2;6414:9;6405:7;6401:23;6397:32;6394:119;;;6432:79;;:::i;:::-;6394:119;6580:1;6569:9;6565:17;6552:31;6610:18;6602:6;6599:30;6596:117;;;6632:79;;:::i;:::-;6596:117;6737:63;6792:7;6783:6;6772:9;6768:22;6737:63;:::i;:::-;6727:73;;6523:287;6308:509;;;;:::o;6823:329::-;6882:6;6931:2;6919:9;6910:7;6906:23;6902:32;6899:119;;;6937:79;;:::i;:::-;6899:119;7057:1;7082:53;7127:7;7118:6;7107:9;7103:22;7082:53;:::i;:::-;7072:63;;7028:117;6823:329;;;;:::o;7158:118::-;7245:24;7263:5;7245:24;:::i;:::-;7240:3;7233:37;7158:118;;:::o;7282:109::-;7363:21;7378:5;7363:21;:::i;:::-;7358:3;7351:34;7282:109;;:::o;7397:360::-;7483:3;7511:38;7543:5;7511:38;:::i;:::-;7565:70;7628:6;7623:3;7565:70;:::i;:::-;7558:77;;7644:52;7689:6;7684:3;7677:4;7670:5;7666:16;7644:52;:::i;:::-;7721:29;7743:6;7721:29;:::i;:::-;7716:3;7712:39;7705:46;;7487:270;7397:360;;;;:::o;7763:147::-;7858:45;7897:5;7858:45;:::i;:::-;7853:3;7846:58;7763:147;;:::o;7916:364::-;8004:3;8032:39;8065:5;8032:39;:::i;:::-;8087:71;8151:6;8146:3;8087:71;:::i;:::-;8080:78;;8167:52;8212:6;8207:3;8200:4;8193:5;8189:16;8167:52;:::i;:::-;8244:29;8266:6;8244:29;:::i;:::-;8239:3;8235:39;8228:46;;8008:272;7916:364;;;;:::o;8286:377::-;8392:3;8420:39;8453:5;8420:39;:::i;:::-;8475:89;8557:6;8552:3;8475:89;:::i;:::-;8468:96;;8573:52;8618:6;8613:3;8606:4;8599:5;8595:16;8573:52;:::i;:::-;8650:6;8645:3;8641:16;8634:23;;8396:267;8286:377;;;;:::o;8669:366::-;8811:3;8832:67;8896:2;8891:3;8832:67;:::i;:::-;8825:74;;8908:93;8997:3;8908:93;:::i;:::-;9026:2;9021:3;9017:12;9010:19;;8669:366;;;:::o;9041:::-;9183:3;9204:67;9268:2;9263:3;9204:67;:::i;:::-;9197:74;;9280:93;9369:3;9280:93;:::i;:::-;9398:2;9393:3;9389:12;9382:19;;9041:366;;;:::o;9413:::-;9555:3;9576:67;9640:2;9635:3;9576:67;:::i;:::-;9569:74;;9652:93;9741:3;9652:93;:::i;:::-;9770:2;9765:3;9761:12;9754:19;;9413:366;;;:::o;9785:::-;9927:3;9948:67;10012:2;10007:3;9948:67;:::i;:::-;9941:74;;10024:93;10113:3;10024:93;:::i;:::-;10142:2;10137:3;10133:12;10126:19;;9785:366;;;:::o;10157:::-;10299:3;10320:67;10384:2;10379:3;10320:67;:::i;:::-;10313:74;;10396:93;10485:3;10396:93;:::i;:::-;10514:2;10509:3;10505:12;10498:19;;10157:366;;;:::o;10529:::-;10671:3;10692:67;10756:2;10751:3;10692:67;:::i;:::-;10685:74;;10768:93;10857:3;10768:93;:::i;:::-;10886:2;10881:3;10877:12;10870:19;;10529:366;;;:::o;10901:::-;11043:3;11064:67;11128:2;11123:3;11064:67;:::i;:::-;11057:74;;11140:93;11229:3;11140:93;:::i;:::-;11258:2;11253:3;11249:12;11242:19;;10901:366;;;:::o;11273:::-;11415:3;11436:67;11500:2;11495:3;11436:67;:::i;:::-;11429:74;;11512:93;11601:3;11512:93;:::i;:::-;11630:2;11625:3;11621:12;11614:19;;11273:366;;;:::o;11645:::-;11787:3;11808:67;11872:2;11867:3;11808:67;:::i;:::-;11801:74;;11884:93;11973:3;11884:93;:::i;:::-;12002:2;11997:3;11993:12;11986:19;;11645:366;;;:::o;12017:::-;12159:3;12180:67;12244:2;12239:3;12180:67;:::i;:::-;12173:74;;12256:93;12345:3;12256:93;:::i;:::-;12374:2;12369:3;12365:12;12358:19;;12017:366;;;:::o;12389:::-;12531:3;12552:67;12616:2;12611:3;12552:67;:::i;:::-;12545:74;;12628:93;12717:3;12628:93;:::i;:::-;12746:2;12741:3;12737:12;12730:19;;12389:366;;;:::o;12761:::-;12903:3;12924:67;12988:2;12983:3;12924:67;:::i;:::-;12917:74;;13000:93;13089:3;13000:93;:::i;:::-;13118:2;13113:3;13109:12;13102:19;;12761:366;;;:::o;13133:::-;13275:3;13296:67;13360:2;13355:3;13296:67;:::i;:::-;13289:74;;13372:93;13461:3;13372:93;:::i;:::-;13490:2;13485:3;13481:12;13474:19;;13133:366;;;:::o;13505:::-;13647:3;13668:67;13732:2;13727:3;13668:67;:::i;:::-;13661:74;;13744:93;13833:3;13744:93;:::i;:::-;13862:2;13857:3;13853:12;13846:19;;13505:366;;;:::o;13877:::-;14019:3;14040:67;14104:2;14099:3;14040:67;:::i;:::-;14033:74;;14116:93;14205:3;14116:93;:::i;:::-;14234:2;14229:3;14225:12;14218:19;;13877:366;;;:::o;14249:::-;14391:3;14412:67;14476:2;14471:3;14412:67;:::i;:::-;14405:74;;14488:93;14577:3;14488:93;:::i;:::-;14606:2;14601:3;14597:12;14590:19;;14249:366;;;:::o;14621:::-;14763:3;14784:67;14848:2;14843:3;14784:67;:::i;:::-;14777:74;;14860:93;14949:3;14860:93;:::i;:::-;14978:2;14973:3;14969:12;14962:19;;14621:366;;;:::o;14993:400::-;15153:3;15174:84;15256:1;15251:3;15174:84;:::i;:::-;15167:91;;15267:93;15356:3;15267:93;:::i;:::-;15385:1;15380:3;15376:11;15369:18;;14993:400;;;:::o;15399:366::-;15541:3;15562:67;15626:2;15621:3;15562:67;:::i;:::-;15555:74;;15638:93;15727:3;15638:93;:::i;:::-;15756:2;15751:3;15747:12;15740:19;;15399:366;;;:::o;15771:::-;15913:3;15934:67;15998:2;15993:3;15934:67;:::i;:::-;15927:74;;16010:93;16099:3;16010:93;:::i;:::-;16128:2;16123:3;16119:12;16112:19;;15771:366;;;:::o;16143:::-;16285:3;16306:67;16370:2;16365:3;16306:67;:::i;:::-;16299:74;;16382:93;16471:3;16382:93;:::i;:::-;16500:2;16495:3;16491:12;16484:19;;16143:366;;;:::o;16515:::-;16657:3;16678:67;16742:2;16737:3;16678:67;:::i;:::-;16671:74;;16754:93;16843:3;16754:93;:::i;:::-;16872:2;16867:3;16863:12;16856:19;;16515:366;;;:::o;16887:::-;17029:3;17050:67;17114:2;17109:3;17050:67;:::i;:::-;17043:74;;17126:93;17215:3;17126:93;:::i;:::-;17244:2;17239:3;17235:12;17228:19;;16887:366;;;:::o;17259:398::-;17418:3;17439:83;17520:1;17515:3;17439:83;:::i;:::-;17432:90;;17531:93;17620:3;17531:93;:::i;:::-;17649:1;17644:3;17640:11;17633:18;;17259:398;;;:::o;17663:366::-;17805:3;17826:67;17890:2;17885:3;17826:67;:::i;:::-;17819:74;;17902:93;17991:3;17902:93;:::i;:::-;18020:2;18015:3;18011:12;18004:19;;17663:366;;;:::o;18035:::-;18177:3;18198:67;18262:2;18257:3;18198:67;:::i;:::-;18191:74;;18274:93;18363:3;18274:93;:::i;:::-;18392:2;18387:3;18383:12;18376:19;;18035:366;;;:::o;18407:118::-;18494:24;18512:5;18494:24;:::i;:::-;18489:3;18482:37;18407:118;;:::o;18531:701::-;18812:3;18834:95;18925:3;18916:6;18834:95;:::i;:::-;18827:102;;18946:95;19037:3;19028:6;18946:95;:::i;:::-;18939:102;;19058:148;19202:3;19058:148;:::i;:::-;19051:155;;19223:3;19216:10;;18531:701;;;;;:::o;19238:379::-;19422:3;19444:147;19587:3;19444:147;:::i;:::-;19437:154;;19608:3;19601:10;;19238:379;;;:::o;19623:222::-;19716:4;19754:2;19743:9;19739:18;19731:26;;19767:71;19835:1;19824:9;19820:17;19811:6;19767:71;:::i;:::-;19623:222;;;;:::o;19851:640::-;20046:4;20084:3;20073:9;20069:19;20061:27;;20098:71;20166:1;20155:9;20151:17;20142:6;20098:71;:::i;:::-;20179:72;20247:2;20236:9;20232:18;20223:6;20179:72;:::i;:::-;20261;20329:2;20318:9;20314:18;20305:6;20261:72;:::i;:::-;20380:9;20374:4;20370:20;20365:2;20354:9;20350:18;20343:48;20408:76;20479:4;20470:6;20408:76;:::i;:::-;20400:84;;19851:640;;;;;;;:::o;20497:210::-;20584:4;20622:2;20611:9;20607:18;20599:26;;20635:65;20697:1;20686:9;20682:17;20673:6;20635:65;:::i;:::-;20497:210;;;;:::o;20713:238::-;20814:4;20852:2;20841:9;20837:18;20829:26;;20865:79;20941:1;20930:9;20926:17;20917:6;20865:79;:::i;:::-;20713:238;;;;:::o;20957:313::-;21070:4;21108:2;21097:9;21093:18;21085:26;;21157:9;21151:4;21147:20;21143:1;21132:9;21128:17;21121:47;21185:78;21258:4;21249:6;21185:78;:::i;:::-;21177:86;;20957:313;;;;:::o;21276:419::-;21442:4;21480:2;21469:9;21465:18;21457:26;;21529:9;21523:4;21519:20;21515:1;21504:9;21500:17;21493:47;21557:131;21683:4;21557:131;:::i;:::-;21549:139;;21276:419;;;:::o;21701:::-;21867:4;21905:2;21894:9;21890:18;21882:26;;21954:9;21948:4;21944:20;21940:1;21929:9;21925:17;21918:47;21982:131;22108:4;21982:131;:::i;:::-;21974:139;;21701:419;;;:::o;22126:::-;22292:4;22330:2;22319:9;22315:18;22307:26;;22379:9;22373:4;22369:20;22365:1;22354:9;22350:17;22343:47;22407:131;22533:4;22407:131;:::i;:::-;22399:139;;22126:419;;;:::o;22551:::-;22717:4;22755:2;22744:9;22740:18;22732:26;;22804:9;22798:4;22794:20;22790:1;22779:9;22775:17;22768:47;22832:131;22958:4;22832:131;:::i;:::-;22824:139;;22551:419;;;:::o;22976:::-;23142:4;23180:2;23169:9;23165:18;23157:26;;23229:9;23223:4;23219:20;23215:1;23204:9;23200:17;23193:47;23257:131;23383:4;23257:131;:::i;:::-;23249:139;;22976:419;;;:::o;23401:::-;23567:4;23605:2;23594:9;23590:18;23582:26;;23654:9;23648:4;23644:20;23640:1;23629:9;23625:17;23618:47;23682:131;23808:4;23682:131;:::i;:::-;23674:139;;23401:419;;;:::o;23826:::-;23992:4;24030:2;24019:9;24015:18;24007:26;;24079:9;24073:4;24069:20;24065:1;24054:9;24050:17;24043:47;24107:131;24233:4;24107:131;:::i;:::-;24099:139;;23826:419;;;:::o;24251:::-;24417:4;24455:2;24444:9;24440:18;24432:26;;24504:9;24498:4;24494:20;24490:1;24479:9;24475:17;24468:47;24532:131;24658:4;24532:131;:::i;:::-;24524:139;;24251:419;;;:::o;24676:::-;24842:4;24880:2;24869:9;24865:18;24857:26;;24929:9;24923:4;24919:20;24915:1;24904:9;24900:17;24893:47;24957:131;25083:4;24957:131;:::i;:::-;24949:139;;24676:419;;;:::o;25101:::-;25267:4;25305:2;25294:9;25290:18;25282:26;;25354:9;25348:4;25344:20;25340:1;25329:9;25325:17;25318:47;25382:131;25508:4;25382:131;:::i;:::-;25374:139;;25101:419;;;:::o;25526:::-;25692:4;25730:2;25719:9;25715:18;25707:26;;25779:9;25773:4;25769:20;25765:1;25754:9;25750:17;25743:47;25807:131;25933:4;25807:131;:::i;:::-;25799:139;;25526:419;;;:::o;25951:::-;26117:4;26155:2;26144:9;26140:18;26132:26;;26204:9;26198:4;26194:20;26190:1;26179:9;26175:17;26168:47;26232:131;26358:4;26232:131;:::i;:::-;26224:139;;25951:419;;;:::o;26376:::-;26542:4;26580:2;26569:9;26565:18;26557:26;;26629:9;26623:4;26619:20;26615:1;26604:9;26600:17;26593:47;26657:131;26783:4;26657:131;:::i;:::-;26649:139;;26376:419;;;:::o;26801:::-;26967:4;27005:2;26994:9;26990:18;26982:26;;27054:9;27048:4;27044:20;27040:1;27029:9;27025:17;27018:47;27082:131;27208:4;27082:131;:::i;:::-;27074:139;;26801:419;;;:::o;27226:::-;27392:4;27430:2;27419:9;27415:18;27407:26;;27479:9;27473:4;27469:20;27465:1;27454:9;27450:17;27443:47;27507:131;27633:4;27507:131;:::i;:::-;27499:139;;27226:419;;;:::o;27651:::-;27817:4;27855:2;27844:9;27840:18;27832:26;;27904:9;27898:4;27894:20;27890:1;27879:9;27875:17;27868:47;27932:131;28058:4;27932:131;:::i;:::-;27924:139;;27651:419;;;:::o;28076:::-;28242:4;28280:2;28269:9;28265:18;28257:26;;28329:9;28323:4;28319:20;28315:1;28304:9;28300:17;28293:47;28357:131;28483:4;28357:131;:::i;:::-;28349:139;;28076:419;;;:::o;28501:::-;28667:4;28705:2;28694:9;28690:18;28682:26;;28754:9;28748:4;28744:20;28740:1;28729:9;28725:17;28718:47;28782:131;28908:4;28782:131;:::i;:::-;28774:139;;28501:419;;;:::o;28926:::-;29092:4;29130:2;29119:9;29115:18;29107:26;;29179:9;29173:4;29169:20;29165:1;29154:9;29150:17;29143:47;29207:131;29333:4;29207:131;:::i;:::-;29199:139;;28926:419;;;:::o;29351:::-;29517:4;29555:2;29544:9;29540:18;29532:26;;29604:9;29598:4;29594:20;29590:1;29579:9;29575:17;29568:47;29632:131;29758:4;29632:131;:::i;:::-;29624:139;;29351:419;;;:::o;29776:::-;29942:4;29980:2;29969:9;29965:18;29957:26;;30029:9;30023:4;30019:20;30015:1;30004:9;30000:17;29993:47;30057:131;30183:4;30057:131;:::i;:::-;30049:139;;29776:419;;;:::o;30201:::-;30367:4;30405:2;30394:9;30390:18;30382:26;;30454:9;30448:4;30444:20;30440:1;30429:9;30425:17;30418:47;30482:131;30608:4;30482:131;:::i;:::-;30474:139;;30201:419;;;:::o;30626:::-;30792:4;30830:2;30819:9;30815:18;30807:26;;30879:9;30873:4;30869:20;30865:1;30854:9;30850:17;30843:47;30907:131;31033:4;30907:131;:::i;:::-;30899:139;;30626:419;;;:::o;31051:::-;31217:4;31255:2;31244:9;31240:18;31232:26;;31304:9;31298:4;31294:20;31290:1;31279:9;31275:17;31268:47;31332:131;31458:4;31332:131;:::i;:::-;31324:139;;31051:419;;;:::o;31476:222::-;31569:4;31607:2;31596:9;31592:18;31584:26;;31620:71;31688:1;31677:9;31673:17;31664:6;31620:71;:::i;:::-;31476:222;;;;:::o;31704:129::-;31738:6;31765:20;;:::i;:::-;31755:30;;31794:33;31822:4;31814:6;31794:33;:::i;:::-;31704:129;;;:::o;31839:75::-;31872:6;31905:2;31899:9;31889:19;;31839:75;:::o;31920:307::-;31981:4;32071:18;32063:6;32060:30;32057:56;;;32093:18;;:::i;:::-;32057:56;32131:29;32153:6;32131:29;:::i;:::-;32123:37;;32215:4;32209;32205:15;32197:23;;31920:307;;;:::o;32233:308::-;32295:4;32385:18;32377:6;32374:30;32371:56;;;32407:18;;:::i;:::-;32371:56;32445:29;32467:6;32445:29;:::i;:::-;32437:37;;32529:4;32523;32519:15;32511:23;;32233:308;;;:::o;32547:98::-;32598:6;32632:5;32626:12;32616:22;;32547:98;;;:::o;32651:99::-;32703:6;32737:5;32731:12;32721:22;;32651:99;;;:::o;32756:168::-;32839:11;32873:6;32868:3;32861:19;32913:4;32908:3;32904:14;32889:29;;32756:168;;;;:::o;32930:147::-;33031:11;33068:3;33053:18;;32930:147;;;;:::o;33083:169::-;33167:11;33201:6;33196:3;33189:19;33241:4;33236:3;33232:14;33217:29;;33083:169;;;;:::o;33258:148::-;33360:11;33397:3;33382:18;;33258:148;;;;:::o;33412:305::-;33452:3;33471:20;33489:1;33471:20;:::i;:::-;33466:25;;33505:20;33523:1;33505:20;:::i;:::-;33500:25;;33659:1;33591:66;33587:74;33584:1;33581:81;33578:107;;;33665:18;;:::i;:::-;33578:107;33709:1;33706;33702:9;33695:16;;33412:305;;;;:::o;33723:185::-;33763:1;33780:20;33798:1;33780:20;:::i;:::-;33775:25;;33814:20;33832:1;33814:20;:::i;:::-;33809:25;;33853:1;33843:35;;33858:18;;:::i;:::-;33843:35;33900:1;33897;33893:9;33888:14;;33723:185;;;;:::o;33914:348::-;33954:7;33977:20;33995:1;33977:20;:::i;:::-;33972:25;;34011:20;34029:1;34011:20;:::i;:::-;34006:25;;34199:1;34131:66;34127:74;34124:1;34121:81;34116:1;34109:9;34102:17;34098:105;34095:131;;;34206:18;;:::i;:::-;34095:131;34254:1;34251;34247:9;34236:20;;33914:348;;;;:::o;34268:191::-;34308:4;34328:20;34346:1;34328:20;:::i;:::-;34323:25;;34362:20;34380:1;34362:20;:::i;:::-;34357:25;;34401:1;34398;34395:8;34392:34;;;34406:18;;:::i;:::-;34392:34;34451:1;34448;34444:9;34436:17;;34268:191;;;;:::o;34465:96::-;34502:7;34531:24;34549:5;34531:24;:::i;:::-;34520:35;;34465:96;;;:::o;34567:90::-;34601:7;34644:5;34637:13;34630:21;34619:32;;34567:90;;;:::o;34663:149::-;34699:7;34739:66;34732:5;34728:78;34717:89;;34663:149;;;:::o;34818:131::-;34865:7;34894:5;34883:16;;34900:43;34937:5;34900:43;:::i;:::-;34818:131;;;:::o;34955:126::-;34992:7;35032:42;35025:5;35021:54;35010:65;;34955:126;;;:::o;35087:77::-;35124:7;35153:5;35142:16;;35087:77;;;:::o;35170:131::-;35228:9;35261:34;35289:5;35261:34;:::i;:::-;35248:47;;35170:131;;;:::o;35307:154::-;35391:6;35386:3;35381;35368:30;35453:1;35444:6;35439:3;35435:16;35428:27;35307:154;;;:::o;35467:307::-;35535:1;35545:113;35559:6;35556:1;35553:13;35545:113;;;35644:1;35639:3;35635:11;35629:18;35625:1;35620:3;35616:11;35609:39;35581:2;35578:1;35574:10;35569:15;;35545:113;;;35676:6;35673:1;35670:13;35667:101;;;35756:1;35747:6;35742:3;35738:16;35731:27;35667:101;35516:258;35467:307;;;:::o;35780:320::-;35824:6;35861:1;35855:4;35851:12;35841:22;;35908:1;35902:4;35898:12;35929:18;35919:81;;35985:4;35977:6;35973:17;35963:27;;35919:81;36047:2;36039:6;36036:14;36016:18;36013:38;36010:84;;;36066:18;;:::i;:::-;36010:84;35831:269;35780:320;;;:::o;36106:281::-;36189:27;36211:4;36189:27;:::i;:::-;36181:6;36177:40;36319:6;36307:10;36304:22;36283:18;36271:10;36268:34;36265:62;36262:88;;;36330:18;;:::i;:::-;36262:88;36370:10;36366:2;36359:22;36149:238;36106:281;;:::o;36393:233::-;36432:3;36455:24;36473:5;36455:24;:::i;:::-;36446:33;;36501:66;36494:5;36491:77;36488:103;;;36571:18;;:::i;:::-;36488:103;36618:1;36611:5;36607:13;36600:20;;36393:233;;;:::o;36632:176::-;36664:1;36681:20;36699:1;36681:20;:::i;:::-;36676:25;;36715:20;36733:1;36715:20;:::i;:::-;36710:25;;36754:1;36744:35;;36759:18;;:::i;:::-;36744:35;36800:1;36797;36793:9;36788:14;;36632:176;;;;:::o;36814:180::-;36862:77;36859:1;36852:88;36959:4;36956:1;36949:15;36983:4;36980:1;36973:15;37000:180;37048:77;37045:1;37038:88;37145:4;37142:1;37135:15;37169:4;37166:1;37159:15;37186:180;37234:77;37231:1;37224:88;37331:4;37328:1;37321:15;37355:4;37352:1;37345:15;37372:180;37420:77;37417:1;37410:88;37517:4;37514:1;37507:15;37541:4;37538:1;37531:15;37558:180;37606:77;37603:1;37596:88;37703:4;37700:1;37693:15;37727:4;37724:1;37717:15;37744:180;37792:77;37789:1;37782:88;37889:4;37886:1;37879:15;37913:4;37910:1;37903:15;37930:180;37978:77;37975:1;37968:88;38075:4;38072:1;38065:15;38099:4;38096:1;38089:15;38116:117;38225:1;38222;38215:12;38239:117;38348:1;38345;38338:12;38362:117;38471:1;38468;38461:12;38485:117;38594:1;38591;38584:12;38608:102;38649:6;38700:2;38696:7;38691:2;38684:5;38680:14;38676:28;38666:38;;38608:102;;;:::o;38716:176::-;38856:28;38852:1;38844:6;38840:14;38833:52;38716:176;:::o;38898:230::-;39038:34;39034:1;39026:6;39022:14;39015:58;39107:13;39102:2;39094:6;39090:15;39083:38;38898:230;:::o;39134:237::-;39274:34;39270:1;39262:6;39258:14;39251:58;39343:20;39338:2;39330:6;39326:15;39319:45;39134:237;:::o;39377:225::-;39517:34;39513:1;39505:6;39501:14;39494:58;39586:8;39581:2;39573:6;39569:15;39562:33;39377:225;:::o;39608:178::-;39748:30;39744:1;39736:6;39732:14;39725:54;39608:178;:::o;39792:170::-;39932:22;39928:1;39920:6;39916:14;39909:46;39792:170;:::o;39968:223::-;40108:34;40104:1;40096:6;40092:14;40085:58;40177:6;40172:2;40164:6;40160:15;40153:31;39968:223;:::o;40197:175::-;40337:27;40333:1;40325:6;40321:14;40314:51;40197:175;:::o;40378:170::-;40518:22;40514:1;40506:6;40502:14;40495:46;40378:170;:::o;40554:231::-;40694:34;40690:1;40682:6;40678:14;40671:58;40763:14;40758:2;40750:6;40746:15;40739:39;40554:231;:::o;40791:243::-;40931:34;40927:1;40919:6;40915:14;40908:58;41000:26;40995:2;40987:6;40983:15;40976:51;40791:243;:::o;41040:234::-;41180:34;41176:1;41168:6;41164:14;41157:58;41249:17;41244:2;41236:6;41232:15;41225:42;41040:234;:::o;41280:229::-;41420:34;41416:1;41408:6;41404:14;41397:58;41489:12;41484:2;41476:6;41472:15;41465:37;41280:229;:::o;41515:228::-;41655:34;41651:1;41643:6;41639:14;41632:58;41724:11;41719:2;41711:6;41707:15;41700:36;41515:228;:::o;41749:221::-;41889:34;41885:1;41877:6;41873:14;41866:58;41958:4;41953:2;41945:6;41941:15;41934:29;41749:221;:::o;41976:182::-;42116:34;42112:1;42104:6;42100:14;42093:58;41976:182;:::o;42164:231::-;42304:34;42300:1;42292:6;42288:14;42281:58;42373:14;42368:2;42360:6;42356:15;42349:39;42164:231;:::o;42401:155::-;42541:7;42537:1;42529:6;42525:14;42518:31;42401:155;:::o;42562:182::-;42702:34;42698:1;42690:6;42686:14;42679:58;42562:182;:::o;42750:171::-;42890:23;42886:1;42878:6;42874:14;42867:47;42750:171;:::o;42927:228::-;43067:34;43063:1;43055:6;43051:14;43044:58;43136:11;43131:2;43123:6;43119:15;43112:36;42927:228;:::o;43161:234::-;43301:34;43297:1;43289:6;43285:14;43278:58;43370:17;43365:2;43357:6;43353:15;43346:42;43161:234;:::o;43401:220::-;43541:34;43537:1;43529:6;43525:14;43518:58;43610:3;43605:2;43597:6;43593:15;43586:28;43401:220;:::o;43627:114::-;;:::o;43747:236::-;43887:34;43883:1;43875:6;43871:14;43864:58;43956:19;43951:2;43943:6;43939:15;43932:44;43747:236;:::o;43989:231::-;44129:34;44125:1;44117:6;44113:14;44106:58;44198:14;44193:2;44185:6;44181:15;44174:39;43989:231;:::o;44226:115::-;44309:1;44302:5;44299:12;44289:46;;44315:18;;:::i;:::-;44289:46;44226:115;:::o;44347:122::-;44420:24;44438:5;44420:24;:::i;:::-;44413:5;44410:35;44400:63;;44459:1;44456;44449:12;44400:63;44347:122;:::o;44475:116::-;44545:21;44560:5;44545:21;:::i;:::-;44538:5;44535:32;44525:60;;44581:1;44578;44571:12;44525:60;44475:116;:::o;44597:120::-;44669:23;44686:5;44669:23;:::i;:::-;44662:5;44659:34;44649:62;;44707:1;44704;44697:12;44649:62;44597:120;:::o;44723:122::-;44796:24;44814:5;44796:24;:::i;:::-;44789:5;44786:35;44776:63;;44835:1;44832;44825:12;44776:63;44723:122;:::o

Swarm Source

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