ETH Price: $2,289.61 (-2.31%)

Token

Moka Genesis (MG NFT)
 

Overview

Max Total Supply

755 MG NFT

Holders

103

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
2 MG NFT
0x77F48fC60E38B30f20a51Cf9cCcBfF03CA0aa571
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:
MokaGenesis

Compiler Version
v0.8.14+commit.80d49f37

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-06-07
*/

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

// SPDX-License-Identifier: MIT
//

pragma solidity ^0.8.12;

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


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

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

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

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

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

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

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

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

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

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


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

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..).
 *
 * Does not support burning tokens to address(0).
 *
 * Assumes that an owner cannot have more than the 2**128 - 1 (max value of uint128) of supply
 */
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable {
    using Address for address;
    using Strings for uint256;

    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
    }

    struct AddressData {
        uint128 balance;
        uint128 numberMinted;
    }

    uint256 public currentIndex = 1;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    string internal uri = "ipfs://QM/";

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

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

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view override returns (uint256) {
        require(index < totalSupply(), 'ERC721A: global index out of bounds');
        return index;
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) {
        require(index < balanceOf(owner), 'ERC721A: owner index out of bounds');
        uint256 numMintedSoFar = totalSupply();
        uint256 tokenIdsIdx;
        address currOwnershipAddr;

        // Counter overflow is impossible as the loop breaks when uint256 i is equal to another uint256 numMintedSoFar.
        unchecked {
            for (uint256 i; i < numMintedSoFar; i++) {
                TokenOwnership memory ownership = _ownerships[i];
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    if (tokenIdsIdx == index) {
                        return i;
                    }
                    tokenIdsIdx++;
                }
            }
        }

        revert('ERC721A: unable to get token of owner by index');
    }

    /**
     * @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 ||
            interfaceId == type(IERC721Enumerable).interfaceId ||
            super.supportsInterface(interfaceId);
    }

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

    function _numberMinted(address owner) internal view returns (uint256) {
        require(owner != address(0), 'ERC721A: number minted query for the zero address');
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        require(_exists(tokenId), 'ERC721A: owner query for nonexistent token');

        unchecked {
            for (uint256 curr = tokenId; curr >= 0; curr--) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (ownership.addr != address(0)) {
                    return ownership;
                }
            }
        }

        revert('ERC721A: unable to determine the owner of token');
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return ownershipOf(tokenId).addr;
    }

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

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

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public override {
        require(operator != _msgSender(), 'ERC721A: 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 override {
        _transfer(from, to, tokenId);
    }

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public override {
        _transfer(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, _data),
            'ERC721A: 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`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return tokenId < currentIndex && tokenId > 0;
    }

    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity, _data, true);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(
        address to,
        uint256 quantity,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = currentIndex;
        require(to != address(0), 'ERC721A: mint to the zero address');
        require(quantity != 0, 'ERC721A: quantity must be greater than 0');

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 3.4e38 (2**128) - 1
        // updatedIndex overflows if currentIndex + quantity > 1.56e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint128(quantity);
            _addressData[to].numberMinted += uint128(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;

            for (uint256 i; i < quantity; i++) {
                emit Transfer(address(0), to, updatedIndex);
                if (safe) {
                    require(
                        _checkOnERC721Received(address(0), to, updatedIndex, _data),
                        'ERC721A: transfer to non ERC721Receiver implementer'
                    );
                }

                updatedIndex++;
            }

            currentIndex = updatedIndex;
        }

        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * 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
    ) private {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

        bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
            getApproved(tokenId) == _msgSender() ||
            isApprovedForAll(prevOwnership.addr, _msgSender()));

        require(isApprovedOrOwner, 'ERC721A: transfer caller is not owner nor approved');

        require(prevOwnership.addr == from, 'ERC721A: transfer from incorrect owner');
        require(to != address(0), 'ERC721A: transfer to the zero address');

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            _ownerships[tokenId].addr = to;
            _ownerships[tokenId].startTimestamp = uint64(block.timestamp);

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            if (_ownerships[nextTokenId].addr == address(0)) {
                if (_exists(nextTokenId)) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

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

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

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * 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`.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}

contract MokaGenesis is ERC721A {
    using Strings for uint256;

    event StageChanged(Stage from, Stage to);

    enum Stage {
        Pause,
        Public
    }

    modifier onlyOwner() {
        require(owner == _msgSender(), "Moka Genesis: not owner");
        _;
    }

    uint256 public constant MAX_SUPPLY = 5555;
    uint256 public freeSupply = 2000;
    uint256 public price = 0.005 ether;
    uint256 public constant MAX_MINT_PER_TX = 10;
    uint256 public constant MAX_MINT_PER_WALLET_FREE = 2;
    address public immutable owner;

    mapping(address => bool) public addressFreeMinted;

    Stage public stage;
    string public baseURI = "ipfs://QmWnxayNRjKheb8gPKcBjCGAp9jiPxmEnYUy7KPFjqVtJ8/";
    string internal baseExtension = ".json";

    constructor() ERC721A("Moka Genesis", "MG NFT") {
        owner = _msgSender();
    }

    // GET Functions

    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(_exists(tokenId), "MokaGenesis: not exist");
        string memory currentBaseURI = _baseURI();
        return (
            bytes(currentBaseURI).length > 0
                ? string(
                    abi.encodePacked(
                        currentBaseURI,
                        tokenId.toString(),
                        baseExtension
                    )
                )
                : ""
        );
    }

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

    // MINT Functions

    // Only works before freeSupply is reached
    // This function only work once

    function devmint(uint256 amount) external onlyOwner {
        uint256 currentSupply = totalSupply();
        require(
            currentSupply + amount <= MAX_SUPPLY,
            "MokaGenesis: exceed max supply."
        );
        require(((currentSupply + amount)-1) <= MAX_SUPPLY, "NOT_ENOUGH_TOKENS");
        _safeMint(msg.sender, amount);
    }


    function freeMint(uint256 _quantity) external payable {
        uint256 currentSupply = totalSupply();
        require(
            currentSupply + _quantity <= MAX_SUPPLY,
            "MokaGenesis: exceed max supply."
        );
        require(
            addressFreeMinted[msg.sender] == false,
            "MokaGenesis: already free minted"
        );
        if (stage == Stage.Public) {
            if (currentSupply < freeSupply) {
                require(
                    _quantity <= MAX_MINT_PER_WALLET_FREE,
                    "MokaGenesis: too many free mint per tx."
                );
            }
        } else {
            revert("MokaGenesis: mint is pause.");
        }
        addressFreeMinted[msg.sender] = true;
        _safeMint(msg.sender, _quantity);
    }

    function mint(uint256 _quantity) external payable {
        uint256 currentSupply = totalSupply();
        require(
            currentSupply + _quantity <= MAX_SUPPLY,
            "MokaGenesis: exceed max supply."
        );
        if (stage == Stage.Public) {
            require(_quantity <= MAX_MINT_PER_TX, "MokaGenesis: too many mint.");
            require(
                msg.value >= price * _quantity,
                "MokaGenesis: insufficient fund."
            );
        } else {
            revert("MokaGenesis: mint is pause.");
        }
        _safeMint(msg.sender, _quantity);
    }

    // SET Functions

    

    function setStage(Stage newStage) external onlyOwner {
        require(stage != newStage, "MokaGenesis: invalid stage.");
        Stage prevStage = stage;
        stage = newStage;
        emit StageChanged(prevStage, stage);
    }

    function setFreeSupply(uint256 newFreeSupply) external onlyOwner {
        freeSupply = newFreeSupply;
    }

    function setPrice(uint256 newPrice) external onlyOwner {
        price = newPrice;
    }

    function setBaseURI(string memory newBaseURI) external onlyOwner {
        baseURI = newBaseURI;
    }

    // WITHDRAW Functions

    function withdrawAll() external onlyOwner {
        uint256 balance = address(this).balance;
        require(balance > 0, "No money");
        _withdraw(msg.sender, address(this).balance);
    }

    function _withdraw(address _address, uint256 _amount) private {
        (bool success, ) = _address.call{value: _amount}("");
        require(success, "Transfer failed");
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"enum MokaGenesis.Stage","name":"from","type":"uint8"},{"indexed":false,"internalType":"enum MokaGenesis.Stage","name":"to","type":"uint8"}],"name":"StageChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_MINT_PER_TX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_MINT_PER_WALLET_FREE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressFreeMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"devmint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"freeMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"freeSupply","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":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","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":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newFreeSupply","type":"uint256"}],"name":"setFreeSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum MokaGenesis.Stage","name":"newStage","type":"uint8"}],"name":"setStage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stage","outputs":[{"internalType":"enum MokaGenesis.Stage","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a060405260016000556040518060400160405280600a81526020017f697066733a2f2f514d2f000000000000000000000000000000000000000000008152506003908051906020019062000056929190620001e7565b506107d06008556611c37937e0800060095560405180606001604052806036815260200162004c0c60369139600c908051906020019062000099929190620001e7565b506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600d9080519060200190620000e7929190620001e7565b50348015620000f557600080fd5b506040518060400160405280600c81526020017f4d6f6b612047656e6573697300000000000000000000000000000000000000008152506040518060400160405280600681526020017f4d47204e4654000000000000000000000000000000000000000000000000000081525081600190805190602001906200017a929190620001e7565b50806002908051906020019062000193929190620001e7565b505050620001a6620001df60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1681525050620002fb565b600033905090565b828054620001f590620002c6565b90600052602060002090601f01602090048101928262000219576000855562000265565b82601f106200023457805160ff191683800117855562000265565b8280016001018555821562000265579182015b828111156200026457825182559160200191906001019062000247565b5b50905062000274919062000278565b5090565b5b808211156200029357600081600090555060010162000279565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620002df57607f821691505b602082108103620002f557620002f462000297565b5b50919050565b6080516148cb620003416000396000818161097a01528181610fa4015281816113fd015281816114c90152818161151001528181611a780152611ca001526148cb6000f3fe6080604052600436106101f95760003560e01c806370a082311161010d578063a0712d68116100a0578063c040e6b81161006f578063c040e6b814610719578063c87b56dd14610744578063ce3cd99714610781578063e985e9c5146107aa578063f676308a146107e7576101f9565b8063a0712d681461066e578063a22cb4651461068a578063b2e3ef2c146106b3578063b88d4fde146106f0576101f9565b80638ecad721116100dc5780638ecad721146105c457806391b7f5ed146105ef57806395d89b4114610618578063a035b1fe14610643576101f9565b806370a08231146105295780637c928fe914610566578063853828b6146105825780638da5cb5b14610599576101f9565b80632524f7351161019057806342842e0e1161015f57806342842e0e146104325780634f6ccce71461045b57806355f804b3146104985780636352211e146104c15780636c0360eb146104fe576101f9565b80632524f7351461037457806326987b601461039f5780632f745c59146103ca57806332cb6b0c14610407576101f9565b8063095ea7b3116101cc578063095ea7b3146102cc57806318160ddd146102f557806323b872dd1461032057806324a6ab0c14610349576101f9565b806301ffc9a7146101fe57806302fb47911461023b57806306fdde0314610264578063081812fc1461028f575b600080fd5b34801561020a57600080fd5b5061022560048036038101906102209190612e72565b610810565b6040516102329190612eba565b60405180910390f35b34801561024757600080fd5b50610262600480360381019061025d9190612f0b565b61095a565b005b34801561027057600080fd5b50610279610ab5565b6040516102869190612fd1565b60405180910390f35b34801561029b57600080fd5b506102b660048036038101906102b19190612f0b565b610b47565b6040516102c39190613034565b60405180910390f35b3480156102d857600080fd5b506102f360048036038101906102ee919061307b565b610bcc565b005b34801561030157600080fd5b5061030a610ce4565b60405161031791906130ca565b60405180910390f35b34801561032c57600080fd5b50610347600480360381019061034291906130e5565b610cfa565b005b34801561035557600080fd5b5061035e610d0a565b60405161036b91906130ca565b60405180910390f35b34801561038057600080fd5b50610389610d10565b60405161039691906130ca565b60405180910390f35b3480156103ab57600080fd5b506103b4610d15565b6040516103c191906130ca565b60405180910390f35b3480156103d657600080fd5b506103f160048036038101906103ec919061307b565b610d1b565b6040516103fe91906130ca565b60405180910390f35b34801561041357600080fd5b5061041c610f0b565b60405161042991906130ca565b60405180910390f35b34801561043e57600080fd5b50610459600480360381019061045491906130e5565b610f11565b005b34801561046757600080fd5b50610482600480360381019061047d9190612f0b565b610f31565b60405161048f91906130ca565b60405180910390f35b3480156104a457600080fd5b506104bf60048036038101906104ba919061326d565b610f84565b005b3480156104cd57600080fd5b506104e860048036038101906104e39190612f0b565b611033565b6040516104f59190613034565b60405180910390f35b34801561050a57600080fd5b50610513611049565b6040516105209190612fd1565b60405180910390f35b34801561053557600080fd5b50610550600480360381019061054b91906132b6565b6110d7565b60405161055d91906130ca565b60405180910390f35b610580600480360381019061057b9190612f0b565b6111bf565b005b34801561058e57600080fd5b506105976113dd565b005b3480156105a557600080fd5b506105ae6114c7565b6040516105bb9190613034565b60405180910390f35b3480156105d057600080fd5b506105d96114eb565b6040516105e691906130ca565b60405180910390f35b3480156105fb57600080fd5b5061061660048036038101906106119190612f0b565b6114f0565b005b34801561062457600080fd5b5061062d61158f565b60405161063a9190612fd1565b60405180910390f35b34801561064f57600080fd5b50610658611621565b60405161066591906130ca565b60405180910390f35b61068860048036038101906106839190612f0b565b611627565b005b34801561069657600080fd5b506106b160048036038101906106ac919061330f565b61179f565b005b3480156106bf57600080fd5b506106da60048036038101906106d591906132b6565b61191f565b6040516106e79190612eba565b60405180910390f35b3480156106fc57600080fd5b50610717600480360381019061071291906133f0565b61193f565b005b34801561072557600080fd5b5061072e61199b565b60405161073b91906134ea565b60405180910390f35b34801561075057600080fd5b5061076b60048036038101906107669190612f0b565b6119ae565b6040516107789190612fd1565b60405180910390f35b34801561078d57600080fd5b506107a860048036038101906107a3919061352a565b611a58565b005b3480156107b657600080fd5b506107d160048036038101906107cc9190613557565b611bec565b6040516107de9190612eba565b60405180910390f35b3480156107f357600080fd5b5061080e60048036038101906108099190612f0b565b611c80565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108db57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061094357507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610953575061095282611d1f565b5b9050919050565b610962611d89565b73ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16146109ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e6906135e3565b60405180910390fd5b60006109f9610ce4565b90506115b38282610a0a9190613632565b1115610a4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a42906136d4565b60405180910390fd5b6115b360018383610a5c9190613632565b610a6691906136f4565b1115610aa7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9e90613774565b60405180910390fd5b610ab13383611d91565b5050565b606060018054610ac4906137c3565b80601f0160208091040260200160405190810160405280929190818152602001828054610af0906137c3565b8015610b3d5780601f10610b1257610100808354040283529160200191610b3d565b820191906000526020600020905b815481529060010190602001808311610b2057829003601f168201915b5050505050905090565b6000610b5282611daf565b610b91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8890613866565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610bd782611033565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610c47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3e906138f8565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c66611d89565b73ffffffffffffffffffffffffffffffffffffffff161480610c955750610c9481610c8f611d89565b611bec565b5b610cd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ccb9061398a565b60405180910390fd5b610cdf838383611dc8565b505050565b60006001600054610cf591906136f4565b905090565b610d05838383611e7a565b505050565b60085481565b600281565b60005481565b6000610d26836110d7565b8210610d67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5e90613a1c565b60405180910390fd5b6000610d71610ce4565b905060008060005b83811015610ec9576000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610e6b57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610ebb57868403610eb2578195505050505050610f05565b83806001019450505b508080600101915050610d79565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efc90613aae565b60405180910390fd5b92915050565b6115b381565b610f2c8383836040518060200160405280600081525061193f565b505050565b6000610f3b610ce4565b8210610f7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7390613b40565b60405180910390fd5b819050919050565b610f8c611d89565b73ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614611019576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611010906135e3565b60405180910390fd5b80600c908051906020019061102f929190612d29565b5050565b600061103e826123b8565b600001519050919050565b600c8054611056906137c3565b80601f0160208091040260200160405190810160405280929190818152602001828054611082906137c3565b80156110cf5780601f106110a4576101008083540402835291602001916110cf565b820191906000526020600020905b8154815290600101906020018083116110b257829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611147576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113e90613bd2565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b60006111c9610ce4565b90506115b382826111da9190613632565b111561121b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611212906136d4565b60405180910390fd5b60001515600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146112ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a590613c3e565b60405180910390fd5b6001808111156112c1576112c0613473565b5b600b60009054906101000a900460ff1660018111156112e3576112e2613473565b5b0361133c57600854811015611337576002821115611336576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132d90613cd0565b60405180910390fd5b5b611377565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136e90613d3c565b60405180910390fd5b6001600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506113d93383611d91565b5050565b6113e5611d89565b73ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614611472576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611469906135e3565b60405180910390fd5b6000479050600081116114ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b190613da8565b60405180910390fd5b6114c43347612552565b50565b7f000000000000000000000000000000000000000000000000000000000000000081565b600a81565b6114f8611d89565b73ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614611585576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157c906135e3565b60405180910390fd5b8060098190555050565b60606002805461159e906137c3565b80601f01602080910402602001604051908101604052809291908181526020018280546115ca906137c3565b80156116175780601f106115ec57610100808354040283529160200191611617565b820191906000526020600020905b8154815290600101906020018083116115fa57829003601f168201915b5050505050905090565b60095481565b6000611631610ce4565b90506115b382826116429190613632565b1115611683576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167a906136d4565b60405180910390fd5b60018081111561169657611695613473565b5b600b60009054906101000a900460ff1660018111156116b8576116b7613473565b5b0361175657600a821115611701576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f890613e14565b60405180910390fd5b8160095461170f9190613e34565b341015611751576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174890613eda565b60405180910390fd5b611791565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178890613d3c565b60405180910390fd5b61179b3383611d91565b5050565b6117a7611d89565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611814576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180b90613f46565b60405180910390fd5b8060076000611821611d89565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166118ce611d89565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119139190612eba565b60405180910390a35050565b600a6020528060005260406000206000915054906101000a900460ff1681565b61194a848484611e7a565b61195684848484612603565b611995576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198c90613fd8565b60405180910390fd5b50505050565b600b60009054906101000a900460ff1681565b60606119b982611daf565b6119f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ef90614044565b60405180910390fd5b6000611a0261278a565b90506000815111611a225760405180602001604052806000815250611a50565b80611a2c8461281c565b600d604051602001611a4093929190614134565b6040516020818303038152906040525b915050919050565b611a60611d89565b73ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614611aed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae4906135e3565b60405180910390fd5b806001811115611b0057611aff613473565b5b600b60009054906101000a900460ff166001811115611b2257611b21613473565b5b03611b62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b59906141b1565b60405180910390fd5b6000600b60009054906101000a900460ff16905081600b60006101000a81548160ff02191690836001811115611b9b57611b9a613473565b5b02179055507f0f63b8bffe147a0fe1362da0e6e3ae0fcffce5497482f4d438715fe53890acf181600b60009054906101000a900460ff16604051611be09291906141d1565b60405180910390a15050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611c88611d89565b73ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614611d15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0c906135e3565b60405180910390fd5b8060088190555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b611dab82826040518060200160405280600081525061297c565b5050565b6000805482108015611dc15750600082115b9050919050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000611e85826123b8565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611eac611d89565b73ffffffffffffffffffffffffffffffffffffffff161480611f085750611ed1611d89565b73ffffffffffffffffffffffffffffffffffffffff16611ef084610b47565b73ffffffffffffffffffffffffffffffffffffffff16145b80611f245750611f238260000151611f1e611d89565b611bec565b5b905080611f66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5d9061426c565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611fd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fcf906142fe565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612047576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203e90614390565b60405180910390fd5b612054858585600161298e565b6120646000848460000151611dc8565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603612348576122a781611daf565b156123475782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123b18585856001612994565b5050505050565b6123c0612daf565b6123c982611daf565b612408576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ff90614422565b60405180910390fd5b60008290505b60008110612511576000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461250257809250505061254d565b5080806001900391505061240e565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612544906144b4565b60405180910390fd5b919050565b60008273ffffffffffffffffffffffffffffffffffffffff168260405161257890614505565b60006040518083038185875af1925050503d80600081146125b5576040519150601f19603f3d011682016040523d82523d6000602084013e6125ba565b606091505b50509050806125fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125f590614566565b60405180910390fd5b505050565b60006126248473ffffffffffffffffffffffffffffffffffffffff1661299a565b1561277d578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261264d611d89565b8786866040518563ffffffff1660e01b815260040161266f94939291906145db565b6020604051808303816000875af19250505080156126ab57506040513d601f19601f820116820180604052508101906126a8919061463c565b60015b61272d573d80600081146126db576040519150601f19603f3d011682016040523d82523d6000602084013e6126e0565b606091505b506000815103612725576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271c90613fd8565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612782565b600190505b949350505050565b6060600c8054612799906137c3565b80601f01602080910402602001604051908101604052809291908181526020018280546127c5906137c3565b80156128125780601f106127e757610100808354040283529160200191612812565b820191906000526020600020905b8154815290600101906020018083116127f557829003601f168201915b5050505050905090565b606060008203612863576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612977565b600082905060005b6000821461289557808061287e90614669565b915050600a8261288e91906146e0565b915061286b565b60008167ffffffffffffffff8111156128b1576128b0613142565b5b6040519080825280601f01601f1916602001820160405280156128e35781602001600182028036833780820191505090505b5090505b60008514612970576001826128fc91906136f4565b9150600a8561290b9190614711565b60306129179190613632565b60f81b81838151811061292d5761292c614742565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561296991906146e0565b94506128e7565b8093505050505b919050565b61298983838360016129ad565b505050565b50505050565b50505050565b600080823b905060008111915050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612a22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a19906147e3565b60405180910390fd5b60008403612a65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a5c90614875565b60405180910390fd5b612a72600086838761298e565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b85811015612d0c57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48315612cf757612cb76000888488612603565b612cf6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ced90613fd8565b60405180910390fd5b5b81806001019250508080600101915050612c40565b508060008190555050612d226000868387612994565b5050505050565b828054612d35906137c3565b90600052602060002090601f016020900481019282612d575760008555612d9e565b82601f10612d7057805160ff1916838001178555612d9e565b82800160010185558215612d9e579182015b82811115612d9d578251825591602001919060010190612d82565b5b509050612dab9190612de9565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115612e02576000816000905550600101612dea565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612e4f81612e1a565b8114612e5a57600080fd5b50565b600081359050612e6c81612e46565b92915050565b600060208284031215612e8857612e87612e10565b5b6000612e9684828501612e5d565b91505092915050565b60008115159050919050565b612eb481612e9f565b82525050565b6000602082019050612ecf6000830184612eab565b92915050565b6000819050919050565b612ee881612ed5565b8114612ef357600080fd5b50565b600081359050612f0581612edf565b92915050565b600060208284031215612f2157612f20612e10565b5b6000612f2f84828501612ef6565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612f72578082015181840152602081019050612f57565b83811115612f81576000848401525b50505050565b6000601f19601f8301169050919050565b6000612fa382612f38565b612fad8185612f43565b9350612fbd818560208601612f54565b612fc681612f87565b840191505092915050565b60006020820190508181036000830152612feb8184612f98565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061301e82612ff3565b9050919050565b61302e81613013565b82525050565b60006020820190506130496000830184613025565b92915050565b61305881613013565b811461306357600080fd5b50565b6000813590506130758161304f565b92915050565b6000806040838503121561309257613091612e10565b5b60006130a085828601613066565b92505060206130b185828601612ef6565b9150509250929050565b6130c481612ed5565b82525050565b60006020820190506130df60008301846130bb565b92915050565b6000806000606084860312156130fe576130fd612e10565b5b600061310c86828701613066565b935050602061311d86828701613066565b925050604061312e86828701612ef6565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61317a82612f87565b810181811067ffffffffffffffff8211171561319957613198613142565b5b80604052505050565b60006131ac612e06565b90506131b88282613171565b919050565b600067ffffffffffffffff8211156131d8576131d7613142565b5b6131e182612f87565b9050602081019050919050565b82818337600083830152505050565b600061321061320b846131bd565b6131a2565b90508281526020810184848401111561322c5761322b61313d565b5b6132378482856131ee565b509392505050565b600082601f83011261325457613253613138565b5b81356132648482602086016131fd565b91505092915050565b60006020828403121561328357613282612e10565b5b600082013567ffffffffffffffff8111156132a1576132a0612e15565b5b6132ad8482850161323f565b91505092915050565b6000602082840312156132cc576132cb612e10565b5b60006132da84828501613066565b91505092915050565b6132ec81612e9f565b81146132f757600080fd5b50565b600081359050613309816132e3565b92915050565b6000806040838503121561332657613325612e10565b5b600061333485828601613066565b9250506020613345858286016132fa565b9150509250929050565b600067ffffffffffffffff82111561336a57613369613142565b5b61337382612f87565b9050602081019050919050565b600061339361338e8461334f565b6131a2565b9050828152602081018484840111156133af576133ae61313d565b5b6133ba8482856131ee565b509392505050565b600082601f8301126133d7576133d6613138565b5b81356133e7848260208601613380565b91505092915050565b6000806000806080858703121561340a57613409612e10565b5b600061341887828801613066565b945050602061342987828801613066565b935050604061343a87828801612ef6565b925050606085013567ffffffffffffffff81111561345b5761345a612e15565b5b613467878288016133c2565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600281106134b3576134b2613473565b5b50565b60008190506134c4826134a2565b919050565b60006134d4826134b6565b9050919050565b6134e4816134c9565b82525050565b60006020820190506134ff60008301846134db565b92915050565b6002811061351257600080fd5b50565b60008135905061352481613505565b92915050565b6000602082840312156135405761353f612e10565b5b600061354e84828501613515565b91505092915050565b6000806040838503121561356e5761356d612e10565b5b600061357c85828601613066565b925050602061358d85828601613066565b9150509250929050565b7f4d6f6b612047656e657369733a206e6f74206f776e6572000000000000000000600082015250565b60006135cd601783612f43565b91506135d882613597565b602082019050919050565b600060208201905081810360008301526135fc816135c0565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061363d82612ed5565b915061364883612ed5565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561367d5761367c613603565b5b828201905092915050565b7f4d6f6b6147656e657369733a20657863656564206d617820737570706c792e00600082015250565b60006136be601f83612f43565b91506136c982613688565b602082019050919050565b600060208201905081810360008301526136ed816136b1565b9050919050565b60006136ff82612ed5565b915061370a83612ed5565b92508282101561371d5761371c613603565b5b828203905092915050565b7f4e4f545f454e4f5547485f544f4b454e53000000000000000000000000000000600082015250565b600061375e601183612f43565b915061376982613728565b602082019050919050565b6000602082019050818103600083015261378d81613751565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806137db57607f821691505b6020821081036137ee576137ed613794565b5b50919050565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b6000613850602d83612f43565b915061385b826137f4565b604082019050919050565b6000602082019050818103600083015261387f81613843565b9050919050565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b60006138e2602283612f43565b91506138ed82613886565b604082019050919050565b60006020820190508181036000830152613911816138d5565b9050919050565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b6000613974603983612f43565b915061397f82613918565b604082019050919050565b600060208201905081810360008301526139a381613967565b9050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b6000613a06602283612f43565b9150613a11826139aa565b604082019050919050565b60006020820190508181036000830152613a35816139f9565b9050919050565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b6000613a98602e83612f43565b9150613aa382613a3c565b604082019050919050565b60006020820190508181036000830152613ac781613a8b565b9050919050565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b6000613b2a602383612f43565b9150613b3582613ace565b604082019050919050565b60006020820190508181036000830152613b5981613b1d565b9050919050565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b6000613bbc602b83612f43565b9150613bc782613b60565b604082019050919050565b60006020820190508181036000830152613beb81613baf565b9050919050565b7f4d6f6b6147656e657369733a20616c72656164792066726565206d696e746564600082015250565b6000613c28602083612f43565b9150613c3382613bf2565b602082019050919050565b60006020820190508181036000830152613c5781613c1b565b9050919050565b7f4d6f6b6147656e657369733a20746f6f206d616e792066726565206d696e742060008201527f7065722074782e00000000000000000000000000000000000000000000000000602082015250565b6000613cba602783612f43565b9150613cc582613c5e565b604082019050919050565b60006020820190508181036000830152613ce981613cad565b9050919050565b7f4d6f6b6147656e657369733a206d696e742069732070617573652e0000000000600082015250565b6000613d26601b83612f43565b9150613d3182613cf0565b602082019050919050565b60006020820190508181036000830152613d5581613d19565b9050919050565b7f4e6f206d6f6e6579000000000000000000000000000000000000000000000000600082015250565b6000613d92600883612f43565b9150613d9d82613d5c565b602082019050919050565b60006020820190508181036000830152613dc181613d85565b9050919050565b7f4d6f6b6147656e657369733a20746f6f206d616e79206d696e742e0000000000600082015250565b6000613dfe601b83612f43565b9150613e0982613dc8565b602082019050919050565b60006020820190508181036000830152613e2d81613df1565b9050919050565b6000613e3f82612ed5565b9150613e4a83612ed5565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e8357613e82613603565b5b828202905092915050565b7f4d6f6b6147656e657369733a20696e73756666696369656e742066756e642e00600082015250565b6000613ec4601f83612f43565b9150613ecf82613e8e565b602082019050919050565b60006020820190508181036000830152613ef381613eb7565b9050919050565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b6000613f30601a83612f43565b9150613f3b82613efa565b602082019050919050565b60006020820190508181036000830152613f5f81613f23565b9050919050565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b6000613fc2603383612f43565b9150613fcd82613f66565b604082019050919050565b60006020820190508181036000830152613ff181613fb5565b9050919050565b7f4d6f6b6147656e657369733a206e6f7420657869737400000000000000000000600082015250565b600061402e601683612f43565b915061403982613ff8565b602082019050919050565b6000602082019050818103600083015261405d81614021565b9050919050565b600081905092915050565b600061407a82612f38565b6140848185614064565b9350614094818560208601612f54565b80840191505092915050565b60008190508160005260206000209050919050565b600081546140c2816137c3565b6140cc8186614064565b945060018216600081146140e757600181146140f85761412b565b60ff1983168652818601935061412b565b614101856140a0565b60005b8381101561412357815481890152600182019150602081019050614104565b838801955050505b50505092915050565b6000614140828661406f565b915061414c828561406f565b915061415882846140b5565b9150819050949350505050565b7f4d6f6b6147656e657369733a20696e76616c69642073746167652e0000000000600082015250565b600061419b601b83612f43565b91506141a682614165565b602082019050919050565b600060208201905081810360008301526141ca8161418e565b9050919050565b60006040820190506141e660008301856134db565b6141f360208301846134db565b9392505050565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b6000614256603283612f43565b9150614261826141fa565b604082019050919050565b6000602082019050818103600083015261428581614249565b9050919050565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b60006142e8602683612f43565b91506142f38261428c565b604082019050919050565b60006020820190508181036000830152614317816142db565b9050919050565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061437a602583612f43565b91506143858261431e565b604082019050919050565b600060208201905081810360008301526143a98161436d565b9050919050565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b600061440c602a83612f43565b9150614417826143b0565b604082019050919050565b6000602082019050818103600083015261443b816143ff565b9050919050565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b600061449e602f83612f43565b91506144a982614442565b604082019050919050565b600060208201905081810360008301526144cd81614491565b9050919050565b600081905092915050565b50565b60006144ef6000836144d4565b91506144fa826144df565b600082019050919050565b6000614510826144e2565b9150819050919050565b7f5472616e73666572206661696c65640000000000000000000000000000000000600082015250565b6000614550600f83612f43565b915061455b8261451a565b602082019050919050565b6000602082019050818103600083015261457f81614543565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006145ad82614586565b6145b78185614591565b93506145c7818560208601612f54565b6145d081612f87565b840191505092915050565b60006080820190506145f06000830187613025565b6145fd6020830186613025565b61460a60408301856130bb565b818103606083015261461c81846145a2565b905095945050505050565b60008151905061463681612e46565b92915050565b60006020828403121561465257614651612e10565b5b600061466084828501614627565b91505092915050565b600061467482612ed5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036146a6576146a5613603565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006146eb82612ed5565b91506146f683612ed5565b925082614706576147056146b1565b5b828204905092915050565b600061471c82612ed5565b915061472783612ed5565b925082614737576147366146b1565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006147cd602183612f43565b91506147d882614771565b604082019050919050565b600060208201905081810360008301526147fc816147c0565b9050919050565b7f455243373231413a207175616e74697479206d7573742062652067726561746560008201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b600061485f602883612f43565b915061486a82614803565b604082019050919050565b6000602082019050818103600083015261488e81614852565b905091905056fea2646970667358221220a4e61c7fdb06e4fb0c3b617d7c87060d5b3abced06faa2d81fb76d34fa6d280b64736f6c634300080e0033697066733a2f2f516d576e7861794e526a4b6865623867504b63426a43474170396a6950786d456e595579374b50466a7156744a382f

Deployed Bytecode

0x6080604052600436106101f95760003560e01c806370a082311161010d578063a0712d68116100a0578063c040e6b81161006f578063c040e6b814610719578063c87b56dd14610744578063ce3cd99714610781578063e985e9c5146107aa578063f676308a146107e7576101f9565b8063a0712d681461066e578063a22cb4651461068a578063b2e3ef2c146106b3578063b88d4fde146106f0576101f9565b80638ecad721116100dc5780638ecad721146105c457806391b7f5ed146105ef57806395d89b4114610618578063a035b1fe14610643576101f9565b806370a08231146105295780637c928fe914610566578063853828b6146105825780638da5cb5b14610599576101f9565b80632524f7351161019057806342842e0e1161015f57806342842e0e146104325780634f6ccce71461045b57806355f804b3146104985780636352211e146104c15780636c0360eb146104fe576101f9565b80632524f7351461037457806326987b601461039f5780632f745c59146103ca57806332cb6b0c14610407576101f9565b8063095ea7b3116101cc578063095ea7b3146102cc57806318160ddd146102f557806323b872dd1461032057806324a6ab0c14610349576101f9565b806301ffc9a7146101fe57806302fb47911461023b57806306fdde0314610264578063081812fc1461028f575b600080fd5b34801561020a57600080fd5b5061022560048036038101906102209190612e72565b610810565b6040516102329190612eba565b60405180910390f35b34801561024757600080fd5b50610262600480360381019061025d9190612f0b565b61095a565b005b34801561027057600080fd5b50610279610ab5565b6040516102869190612fd1565b60405180910390f35b34801561029b57600080fd5b506102b660048036038101906102b19190612f0b565b610b47565b6040516102c39190613034565b60405180910390f35b3480156102d857600080fd5b506102f360048036038101906102ee919061307b565b610bcc565b005b34801561030157600080fd5b5061030a610ce4565b60405161031791906130ca565b60405180910390f35b34801561032c57600080fd5b50610347600480360381019061034291906130e5565b610cfa565b005b34801561035557600080fd5b5061035e610d0a565b60405161036b91906130ca565b60405180910390f35b34801561038057600080fd5b50610389610d10565b60405161039691906130ca565b60405180910390f35b3480156103ab57600080fd5b506103b4610d15565b6040516103c191906130ca565b60405180910390f35b3480156103d657600080fd5b506103f160048036038101906103ec919061307b565b610d1b565b6040516103fe91906130ca565b60405180910390f35b34801561041357600080fd5b5061041c610f0b565b60405161042991906130ca565b60405180910390f35b34801561043e57600080fd5b50610459600480360381019061045491906130e5565b610f11565b005b34801561046757600080fd5b50610482600480360381019061047d9190612f0b565b610f31565b60405161048f91906130ca565b60405180910390f35b3480156104a457600080fd5b506104bf60048036038101906104ba919061326d565b610f84565b005b3480156104cd57600080fd5b506104e860048036038101906104e39190612f0b565b611033565b6040516104f59190613034565b60405180910390f35b34801561050a57600080fd5b50610513611049565b6040516105209190612fd1565b60405180910390f35b34801561053557600080fd5b50610550600480360381019061054b91906132b6565b6110d7565b60405161055d91906130ca565b60405180910390f35b610580600480360381019061057b9190612f0b565b6111bf565b005b34801561058e57600080fd5b506105976113dd565b005b3480156105a557600080fd5b506105ae6114c7565b6040516105bb9190613034565b60405180910390f35b3480156105d057600080fd5b506105d96114eb565b6040516105e691906130ca565b60405180910390f35b3480156105fb57600080fd5b5061061660048036038101906106119190612f0b565b6114f0565b005b34801561062457600080fd5b5061062d61158f565b60405161063a9190612fd1565b60405180910390f35b34801561064f57600080fd5b50610658611621565b60405161066591906130ca565b60405180910390f35b61068860048036038101906106839190612f0b565b611627565b005b34801561069657600080fd5b506106b160048036038101906106ac919061330f565b61179f565b005b3480156106bf57600080fd5b506106da60048036038101906106d591906132b6565b61191f565b6040516106e79190612eba565b60405180910390f35b3480156106fc57600080fd5b50610717600480360381019061071291906133f0565b61193f565b005b34801561072557600080fd5b5061072e61199b565b60405161073b91906134ea565b60405180910390f35b34801561075057600080fd5b5061076b60048036038101906107669190612f0b565b6119ae565b6040516107789190612fd1565b60405180910390f35b34801561078d57600080fd5b506107a860048036038101906107a3919061352a565b611a58565b005b3480156107b657600080fd5b506107d160048036038101906107cc9190613557565b611bec565b6040516107de9190612eba565b60405180910390f35b3480156107f357600080fd5b5061080e60048036038101906108099190612f0b565b611c80565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108db57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061094357507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610953575061095282611d1f565b5b9050919050565b610962611d89565b73ffffffffffffffffffffffffffffffffffffffff167f0000000000000000000000006900816cfcd60a251747b376fe9590a1dbe6428173ffffffffffffffffffffffffffffffffffffffff16146109ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e6906135e3565b60405180910390fd5b60006109f9610ce4565b90506115b38282610a0a9190613632565b1115610a4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a42906136d4565b60405180910390fd5b6115b360018383610a5c9190613632565b610a6691906136f4565b1115610aa7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9e90613774565b60405180910390fd5b610ab13383611d91565b5050565b606060018054610ac4906137c3565b80601f0160208091040260200160405190810160405280929190818152602001828054610af0906137c3565b8015610b3d5780601f10610b1257610100808354040283529160200191610b3d565b820191906000526020600020905b815481529060010190602001808311610b2057829003601f168201915b5050505050905090565b6000610b5282611daf565b610b91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8890613866565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610bd782611033565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610c47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3e906138f8565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c66611d89565b73ffffffffffffffffffffffffffffffffffffffff161480610c955750610c9481610c8f611d89565b611bec565b5b610cd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ccb9061398a565b60405180910390fd5b610cdf838383611dc8565b505050565b60006001600054610cf591906136f4565b905090565b610d05838383611e7a565b505050565b60085481565b600281565b60005481565b6000610d26836110d7565b8210610d67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5e90613a1c565b60405180910390fd5b6000610d71610ce4565b905060008060005b83811015610ec9576000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610e6b57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610ebb57868403610eb2578195505050505050610f05565b83806001019450505b508080600101915050610d79565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efc90613aae565b60405180910390fd5b92915050565b6115b381565b610f2c8383836040518060200160405280600081525061193f565b505050565b6000610f3b610ce4565b8210610f7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7390613b40565b60405180910390fd5b819050919050565b610f8c611d89565b73ffffffffffffffffffffffffffffffffffffffff167f0000000000000000000000006900816cfcd60a251747b376fe9590a1dbe6428173ffffffffffffffffffffffffffffffffffffffff1614611019576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611010906135e3565b60405180910390fd5b80600c908051906020019061102f929190612d29565b5050565b600061103e826123b8565b600001519050919050565b600c8054611056906137c3565b80601f0160208091040260200160405190810160405280929190818152602001828054611082906137c3565b80156110cf5780601f106110a4576101008083540402835291602001916110cf565b820191906000526020600020905b8154815290600101906020018083116110b257829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611147576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113e90613bd2565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b60006111c9610ce4565b90506115b382826111da9190613632565b111561121b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611212906136d4565b60405180910390fd5b60001515600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146112ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a590613c3e565b60405180910390fd5b6001808111156112c1576112c0613473565b5b600b60009054906101000a900460ff1660018111156112e3576112e2613473565b5b0361133c57600854811015611337576002821115611336576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132d90613cd0565b60405180910390fd5b5b611377565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136e90613d3c565b60405180910390fd5b6001600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506113d93383611d91565b5050565b6113e5611d89565b73ffffffffffffffffffffffffffffffffffffffff167f0000000000000000000000006900816cfcd60a251747b376fe9590a1dbe6428173ffffffffffffffffffffffffffffffffffffffff1614611472576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611469906135e3565b60405180910390fd5b6000479050600081116114ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b190613da8565b60405180910390fd5b6114c43347612552565b50565b7f0000000000000000000000006900816cfcd60a251747b376fe9590a1dbe6428181565b600a81565b6114f8611d89565b73ffffffffffffffffffffffffffffffffffffffff167f0000000000000000000000006900816cfcd60a251747b376fe9590a1dbe6428173ffffffffffffffffffffffffffffffffffffffff1614611585576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157c906135e3565b60405180910390fd5b8060098190555050565b60606002805461159e906137c3565b80601f01602080910402602001604051908101604052809291908181526020018280546115ca906137c3565b80156116175780601f106115ec57610100808354040283529160200191611617565b820191906000526020600020905b8154815290600101906020018083116115fa57829003601f168201915b5050505050905090565b60095481565b6000611631610ce4565b90506115b382826116429190613632565b1115611683576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167a906136d4565b60405180910390fd5b60018081111561169657611695613473565b5b600b60009054906101000a900460ff1660018111156116b8576116b7613473565b5b0361175657600a821115611701576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f890613e14565b60405180910390fd5b8160095461170f9190613e34565b341015611751576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174890613eda565b60405180910390fd5b611791565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178890613d3c565b60405180910390fd5b61179b3383611d91565b5050565b6117a7611d89565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611814576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180b90613f46565b60405180910390fd5b8060076000611821611d89565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166118ce611d89565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119139190612eba565b60405180910390a35050565b600a6020528060005260406000206000915054906101000a900460ff1681565b61194a848484611e7a565b61195684848484612603565b611995576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198c90613fd8565b60405180910390fd5b50505050565b600b60009054906101000a900460ff1681565b60606119b982611daf565b6119f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ef90614044565b60405180910390fd5b6000611a0261278a565b90506000815111611a225760405180602001604052806000815250611a50565b80611a2c8461281c565b600d604051602001611a4093929190614134565b6040516020818303038152906040525b915050919050565b611a60611d89565b73ffffffffffffffffffffffffffffffffffffffff167f0000000000000000000000006900816cfcd60a251747b376fe9590a1dbe6428173ffffffffffffffffffffffffffffffffffffffff1614611aed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae4906135e3565b60405180910390fd5b806001811115611b0057611aff613473565b5b600b60009054906101000a900460ff166001811115611b2257611b21613473565b5b03611b62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b59906141b1565b60405180910390fd5b6000600b60009054906101000a900460ff16905081600b60006101000a81548160ff02191690836001811115611b9b57611b9a613473565b5b02179055507f0f63b8bffe147a0fe1362da0e6e3ae0fcffce5497482f4d438715fe53890acf181600b60009054906101000a900460ff16604051611be09291906141d1565b60405180910390a15050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611c88611d89565b73ffffffffffffffffffffffffffffffffffffffff167f0000000000000000000000006900816cfcd60a251747b376fe9590a1dbe6428173ffffffffffffffffffffffffffffffffffffffff1614611d15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0c906135e3565b60405180910390fd5b8060088190555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b611dab82826040518060200160405280600081525061297c565b5050565b6000805482108015611dc15750600082115b9050919050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000611e85826123b8565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611eac611d89565b73ffffffffffffffffffffffffffffffffffffffff161480611f085750611ed1611d89565b73ffffffffffffffffffffffffffffffffffffffff16611ef084610b47565b73ffffffffffffffffffffffffffffffffffffffff16145b80611f245750611f238260000151611f1e611d89565b611bec565b5b905080611f66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5d9061426c565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611fd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fcf906142fe565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612047576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203e90614390565b60405180910390fd5b612054858585600161298e565b6120646000848460000151611dc8565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603612348576122a781611daf565b156123475782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123b18585856001612994565b5050505050565b6123c0612daf565b6123c982611daf565b612408576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ff90614422565b60405180910390fd5b60008290505b60008110612511576000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461250257809250505061254d565b5080806001900391505061240e565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612544906144b4565b60405180910390fd5b919050565b60008273ffffffffffffffffffffffffffffffffffffffff168260405161257890614505565b60006040518083038185875af1925050503d80600081146125b5576040519150601f19603f3d011682016040523d82523d6000602084013e6125ba565b606091505b50509050806125fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125f590614566565b60405180910390fd5b505050565b60006126248473ffffffffffffffffffffffffffffffffffffffff1661299a565b1561277d578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261264d611d89565b8786866040518563ffffffff1660e01b815260040161266f94939291906145db565b6020604051808303816000875af19250505080156126ab57506040513d601f19601f820116820180604052508101906126a8919061463c565b60015b61272d573d80600081146126db576040519150601f19603f3d011682016040523d82523d6000602084013e6126e0565b606091505b506000815103612725576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271c90613fd8565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612782565b600190505b949350505050565b6060600c8054612799906137c3565b80601f01602080910402602001604051908101604052809291908181526020018280546127c5906137c3565b80156128125780601f106127e757610100808354040283529160200191612812565b820191906000526020600020905b8154815290600101906020018083116127f557829003601f168201915b5050505050905090565b606060008203612863576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612977565b600082905060005b6000821461289557808061287e90614669565b915050600a8261288e91906146e0565b915061286b565b60008167ffffffffffffffff8111156128b1576128b0613142565b5b6040519080825280601f01601f1916602001820160405280156128e35781602001600182028036833780820191505090505b5090505b60008514612970576001826128fc91906136f4565b9150600a8561290b9190614711565b60306129179190613632565b60f81b81838151811061292d5761292c614742565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561296991906146e0565b94506128e7565b8093505050505b919050565b61298983838360016129ad565b505050565b50505050565b50505050565b600080823b905060008111915050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612a22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a19906147e3565b60405180910390fd5b60008403612a65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a5c90614875565b60405180910390fd5b612a72600086838761298e565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b85811015612d0c57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48315612cf757612cb76000888488612603565b612cf6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ced90613fd8565b60405180910390fd5b5b81806001019250508080600101915050612c40565b508060008190555050612d226000868387612994565b5050505050565b828054612d35906137c3565b90600052602060002090601f016020900481019282612d575760008555612d9e565b82601f10612d7057805160ff1916838001178555612d9e565b82800160010185558215612d9e579182015b82811115612d9d578251825591602001919060010190612d82565b5b509050612dab9190612de9565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115612e02576000816000905550600101612dea565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612e4f81612e1a565b8114612e5a57600080fd5b50565b600081359050612e6c81612e46565b92915050565b600060208284031215612e8857612e87612e10565b5b6000612e9684828501612e5d565b91505092915050565b60008115159050919050565b612eb481612e9f565b82525050565b6000602082019050612ecf6000830184612eab565b92915050565b6000819050919050565b612ee881612ed5565b8114612ef357600080fd5b50565b600081359050612f0581612edf565b92915050565b600060208284031215612f2157612f20612e10565b5b6000612f2f84828501612ef6565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612f72578082015181840152602081019050612f57565b83811115612f81576000848401525b50505050565b6000601f19601f8301169050919050565b6000612fa382612f38565b612fad8185612f43565b9350612fbd818560208601612f54565b612fc681612f87565b840191505092915050565b60006020820190508181036000830152612feb8184612f98565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061301e82612ff3565b9050919050565b61302e81613013565b82525050565b60006020820190506130496000830184613025565b92915050565b61305881613013565b811461306357600080fd5b50565b6000813590506130758161304f565b92915050565b6000806040838503121561309257613091612e10565b5b60006130a085828601613066565b92505060206130b185828601612ef6565b9150509250929050565b6130c481612ed5565b82525050565b60006020820190506130df60008301846130bb565b92915050565b6000806000606084860312156130fe576130fd612e10565b5b600061310c86828701613066565b935050602061311d86828701613066565b925050604061312e86828701612ef6565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61317a82612f87565b810181811067ffffffffffffffff8211171561319957613198613142565b5b80604052505050565b60006131ac612e06565b90506131b88282613171565b919050565b600067ffffffffffffffff8211156131d8576131d7613142565b5b6131e182612f87565b9050602081019050919050565b82818337600083830152505050565b600061321061320b846131bd565b6131a2565b90508281526020810184848401111561322c5761322b61313d565b5b6132378482856131ee565b509392505050565b600082601f83011261325457613253613138565b5b81356132648482602086016131fd565b91505092915050565b60006020828403121561328357613282612e10565b5b600082013567ffffffffffffffff8111156132a1576132a0612e15565b5b6132ad8482850161323f565b91505092915050565b6000602082840312156132cc576132cb612e10565b5b60006132da84828501613066565b91505092915050565b6132ec81612e9f565b81146132f757600080fd5b50565b600081359050613309816132e3565b92915050565b6000806040838503121561332657613325612e10565b5b600061333485828601613066565b9250506020613345858286016132fa565b9150509250929050565b600067ffffffffffffffff82111561336a57613369613142565b5b61337382612f87565b9050602081019050919050565b600061339361338e8461334f565b6131a2565b9050828152602081018484840111156133af576133ae61313d565b5b6133ba8482856131ee565b509392505050565b600082601f8301126133d7576133d6613138565b5b81356133e7848260208601613380565b91505092915050565b6000806000806080858703121561340a57613409612e10565b5b600061341887828801613066565b945050602061342987828801613066565b935050604061343a87828801612ef6565b925050606085013567ffffffffffffffff81111561345b5761345a612e15565b5b613467878288016133c2565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600281106134b3576134b2613473565b5b50565b60008190506134c4826134a2565b919050565b60006134d4826134b6565b9050919050565b6134e4816134c9565b82525050565b60006020820190506134ff60008301846134db565b92915050565b6002811061351257600080fd5b50565b60008135905061352481613505565b92915050565b6000602082840312156135405761353f612e10565b5b600061354e84828501613515565b91505092915050565b6000806040838503121561356e5761356d612e10565b5b600061357c85828601613066565b925050602061358d85828601613066565b9150509250929050565b7f4d6f6b612047656e657369733a206e6f74206f776e6572000000000000000000600082015250565b60006135cd601783612f43565b91506135d882613597565b602082019050919050565b600060208201905081810360008301526135fc816135c0565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061363d82612ed5565b915061364883612ed5565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561367d5761367c613603565b5b828201905092915050565b7f4d6f6b6147656e657369733a20657863656564206d617820737570706c792e00600082015250565b60006136be601f83612f43565b91506136c982613688565b602082019050919050565b600060208201905081810360008301526136ed816136b1565b9050919050565b60006136ff82612ed5565b915061370a83612ed5565b92508282101561371d5761371c613603565b5b828203905092915050565b7f4e4f545f454e4f5547485f544f4b454e53000000000000000000000000000000600082015250565b600061375e601183612f43565b915061376982613728565b602082019050919050565b6000602082019050818103600083015261378d81613751565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806137db57607f821691505b6020821081036137ee576137ed613794565b5b50919050565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b6000613850602d83612f43565b915061385b826137f4565b604082019050919050565b6000602082019050818103600083015261387f81613843565b9050919050565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b60006138e2602283612f43565b91506138ed82613886565b604082019050919050565b60006020820190508181036000830152613911816138d5565b9050919050565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b6000613974603983612f43565b915061397f82613918565b604082019050919050565b600060208201905081810360008301526139a381613967565b9050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b6000613a06602283612f43565b9150613a11826139aa565b604082019050919050565b60006020820190508181036000830152613a35816139f9565b9050919050565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b6000613a98602e83612f43565b9150613aa382613a3c565b604082019050919050565b60006020820190508181036000830152613ac781613a8b565b9050919050565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b6000613b2a602383612f43565b9150613b3582613ace565b604082019050919050565b60006020820190508181036000830152613b5981613b1d565b9050919050565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b6000613bbc602b83612f43565b9150613bc782613b60565b604082019050919050565b60006020820190508181036000830152613beb81613baf565b9050919050565b7f4d6f6b6147656e657369733a20616c72656164792066726565206d696e746564600082015250565b6000613c28602083612f43565b9150613c3382613bf2565b602082019050919050565b60006020820190508181036000830152613c5781613c1b565b9050919050565b7f4d6f6b6147656e657369733a20746f6f206d616e792066726565206d696e742060008201527f7065722074782e00000000000000000000000000000000000000000000000000602082015250565b6000613cba602783612f43565b9150613cc582613c5e565b604082019050919050565b60006020820190508181036000830152613ce981613cad565b9050919050565b7f4d6f6b6147656e657369733a206d696e742069732070617573652e0000000000600082015250565b6000613d26601b83612f43565b9150613d3182613cf0565b602082019050919050565b60006020820190508181036000830152613d5581613d19565b9050919050565b7f4e6f206d6f6e6579000000000000000000000000000000000000000000000000600082015250565b6000613d92600883612f43565b9150613d9d82613d5c565b602082019050919050565b60006020820190508181036000830152613dc181613d85565b9050919050565b7f4d6f6b6147656e657369733a20746f6f206d616e79206d696e742e0000000000600082015250565b6000613dfe601b83612f43565b9150613e0982613dc8565b602082019050919050565b60006020820190508181036000830152613e2d81613df1565b9050919050565b6000613e3f82612ed5565b9150613e4a83612ed5565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e8357613e82613603565b5b828202905092915050565b7f4d6f6b6147656e657369733a20696e73756666696369656e742066756e642e00600082015250565b6000613ec4601f83612f43565b9150613ecf82613e8e565b602082019050919050565b60006020820190508181036000830152613ef381613eb7565b9050919050565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b6000613f30601a83612f43565b9150613f3b82613efa565b602082019050919050565b60006020820190508181036000830152613f5f81613f23565b9050919050565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b6000613fc2603383612f43565b9150613fcd82613f66565b604082019050919050565b60006020820190508181036000830152613ff181613fb5565b9050919050565b7f4d6f6b6147656e657369733a206e6f7420657869737400000000000000000000600082015250565b600061402e601683612f43565b915061403982613ff8565b602082019050919050565b6000602082019050818103600083015261405d81614021565b9050919050565b600081905092915050565b600061407a82612f38565b6140848185614064565b9350614094818560208601612f54565b80840191505092915050565b60008190508160005260206000209050919050565b600081546140c2816137c3565b6140cc8186614064565b945060018216600081146140e757600181146140f85761412b565b60ff1983168652818601935061412b565b614101856140a0565b60005b8381101561412357815481890152600182019150602081019050614104565b838801955050505b50505092915050565b6000614140828661406f565b915061414c828561406f565b915061415882846140b5565b9150819050949350505050565b7f4d6f6b6147656e657369733a20696e76616c69642073746167652e0000000000600082015250565b600061419b601b83612f43565b91506141a682614165565b602082019050919050565b600060208201905081810360008301526141ca8161418e565b9050919050565b60006040820190506141e660008301856134db565b6141f360208301846134db565b9392505050565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b6000614256603283612f43565b9150614261826141fa565b604082019050919050565b6000602082019050818103600083015261428581614249565b9050919050565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b60006142e8602683612f43565b91506142f38261428c565b604082019050919050565b60006020820190508181036000830152614317816142db565b9050919050565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061437a602583612f43565b91506143858261431e565b604082019050919050565b600060208201905081810360008301526143a98161436d565b9050919050565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b600061440c602a83612f43565b9150614417826143b0565b604082019050919050565b6000602082019050818103600083015261443b816143ff565b9050919050565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b600061449e602f83612f43565b91506144a982614442565b604082019050919050565b600060208201905081810360008301526144cd81614491565b9050919050565b600081905092915050565b50565b60006144ef6000836144d4565b91506144fa826144df565b600082019050919050565b6000614510826144e2565b9150819050919050565b7f5472616e73666572206661696c65640000000000000000000000000000000000600082015250565b6000614550600f83612f43565b915061455b8261451a565b602082019050919050565b6000602082019050818103600083015261457f81614543565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006145ad82614586565b6145b78185614591565b93506145c7818560208601612f54565b6145d081612f87565b840191505092915050565b60006080820190506145f06000830187613025565b6145fd6020830186613025565b61460a60408301856130bb565b818103606083015261461c81846145a2565b905095945050505050565b60008151905061463681612e46565b92915050565b60006020828403121561465257614651612e10565b5b600061466084828501614627565b91505092915050565b600061467482612ed5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036146a6576146a5613603565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006146eb82612ed5565b91506146f683612ed5565b925082614706576147056146b1565b5b828204905092915050565b600061471c82612ed5565b915061472783612ed5565b925082614737576147366146b1565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006147cd602183612f43565b91506147d882614771565b604082019050919050565b600060208201905081810360008301526147fc816147c0565b9050919050565b7f455243373231413a207175616e74697479206d7573742062652067726561746560008201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b600061485f602883612f43565b915061486a82614803565b604082019050919050565b6000602082019050818103600083015261488e81614852565b905091905056fea2646970667358221220a4e61c7fdb06e4fb0c3b617d7c87060d5b3abced06faa2d81fb76d34fa6d280b64736f6c634300080e0033

Deployed Bytecode Sourcemap

38409:4577:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25260:372;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40148:359;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27146:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28718:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28239:413;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23513:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29594:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38755:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38886:52;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22555:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24181:1007;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38707:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29827:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23694:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42457:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26955:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39067:80;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25696:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40517:812;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42598:198;;;;;;;;;;;;;:::i;:::-;;38945:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38835:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42359:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27315:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38794:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41337:620;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29004:288;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38984:49;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30075:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39042:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39321:591;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41997:236;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29363:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42241:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25260:372;25362:4;25414:25;25399:40;;;:11;:40;;;;:105;;;;25471:33;25456:48;;;:11;:48;;;;25399:105;:172;;;;25536:35;25521:50;;;:11;:50;;;;25399:172;:225;;;;25588:36;25612:11;25588:23;:36::i;:::-;25399:225;25379:245;;25260:372;;;:::o;40148:359::-;38639:12;:10;:12::i;:::-;38630:21;;:5;:21;;;38622:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;40211:21:::1;40235:13;:11;:13::i;:::-;40211:37;;38744:4;40297:6;40281:13;:22;;;;:::i;:::-;:36;;40259:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;38744:4;40421:1;40413:6;40397:13;:22;;;;:::i;:::-;40396:26;;;;:::i;:::-;40395:42;;40387:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;40470:29;40480:10;40492:6;40470:9;:29::i;:::-;40200:307;40148:359:::0;:::o;27146:100::-;27200:13;27233:5;27226:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27146:100;:::o;28718:214::-;28786:7;28814:16;28822:7;28814;:16::i;:::-;28806:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;28900:15;:24;28916:7;28900:24;;;;;;;;;;;;;;;;;;;;;28893:31;;28718:214;;;:::o;28239:413::-;28312:13;28328:24;28344:7;28328:15;:24::i;:::-;28312:40;;28377:5;28371:11;;:2;:11;;;28363:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28472:5;28456:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;28481:37;28498:5;28505:12;:10;:12::i;:::-;28481:16;:37::i;:::-;28456:62;28434:169;;;;;;;;;;;;:::i;:::-;;;;;;;;;28616:28;28625:2;28629:7;28638:5;28616:8;:28::i;:::-;28301:351;28239:413;;:::o;23513:104::-;23566:7;23608:1;23593:12;;:16;;;;:::i;:::-;23586:23;;23513:104;:::o;29594:162::-;29720:28;29730:4;29736:2;29740:7;29720:9;:28::i;:::-;29594:162;;;:::o;38755:32::-;;;;:::o;38886:52::-;38937:1;38886:52;:::o;22555:31::-;;;;:::o;24181:1007::-;24270:7;24306:16;24316:5;24306:9;:16::i;:::-;24298:5;:24;24290:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;24372:22;24397:13;:11;:13::i;:::-;24372:38;;24421:19;24451:25;24640:9;24635:466;24655:14;24651:1;:18;24635:466;;;24695:31;24729:11;:14;24741:1;24729:14;;;;;;;;;;;24695:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24792:1;24766:28;;:9;:14;;;:28;;;24762:111;;24839:9;:14;;;24819:34;;24762:111;24916:5;24895:26;;:17;:26;;;24891:195;;24965:5;24950:11;:20;24946:85;;25006:1;24999:8;;;;;;;;;24946:85;25053:13;;;;;;;24891:195;24676:425;24671:3;;;;;;;24635:466;;;;25124:56;;;;;;;;;;:::i;:::-;;;;;;;;24181:1007;;;;;:::o;38707:41::-;38744:4;38707:41;:::o;29827:177::-;29957:39;29974:4;29980:2;29984:7;29957:39;;;;;;;;;;;;:16;:39::i;:::-;29827:177;;;:::o;23694:187::-;23761:7;23797:13;:11;:13::i;:::-;23789:5;:21;23781:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;23868:5;23861:12;;23694:187;;;:::o;42457:104::-;38639:12;:10;:12::i;:::-;38630:21;;:5;:21;;;38622:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;42543:10:::1;42533:7;:20;;;;;;;;;;;;:::i;:::-;;42457:104:::0;:::o;26955:124::-;27019:7;27046:20;27058:7;27046:11;:20::i;:::-;:25;;;27039:32;;26955:124;;;:::o;39067:80::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25696:221::-;25760:7;25805:1;25788:19;;:5;:19;;;25780:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;25881:12;:19;25894:5;25881:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;25873:36;;25866:43;;25696:221;;;:::o;40517:812::-;40582:21;40606:13;:11;:13::i;:::-;40582:37;;38744:4;40668:9;40652:13;:25;;;;:::i;:::-;:39;;40630:120;;;;;;;;;;;;:::i;:::-;;;;;;;;;40816:5;40783:38;;:17;:29;40801:10;40783:29;;;;;;;;;;;;;;;;;;;;;;;;;:38;;;40761:120;;;;;;;;;;;;:::i;:::-;;;;;;;;;40905:12;40896:21;;;;;;;;:::i;:::-;;:5;;;;;;;;;;;:21;;;;;;;;:::i;:::-;;;40892:340;;40954:10;;40938:13;:26;40934:217;;;38937:1;41015:9;:37;;40985:150;;;;;;;;;;;;:::i;:::-;;;;;;;;;40934:217;40892:340;;;41183:37;;;;;;;;;;:::i;:::-;;;;;;;;40892:340;41274:4;41242:17;:29;41260:10;41242:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;41289:32;41299:10;41311:9;41289;:32::i;:::-;40571:758;40517:812;:::o;42598:198::-;38639:12;:10;:12::i;:::-;38630:21;;:5;:21;;;38622:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;42651:15:::1;42669:21;42651:39;;42719:1;42709:7;:11;42701:32;;;;;;;;;;;;:::i;:::-;;;;;;;;;42744:44;42754:10;42766:21;42744:9;:44::i;:::-;42640:156;42598:198::o:0;38945:30::-;;;:::o;38835:44::-;38877:2;38835:44;:::o;42359:90::-;38639:12;:10;:12::i;:::-;38630:21;;:5;:21;;;38622:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;42433:8:::1;42425:5;:16;;;;42359:90:::0;:::o;27315:104::-;27371:13;27404:7;27397:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27315:104;:::o;38794:34::-;;;;:::o;41337:620::-;41398:21;41422:13;:11;:13::i;:::-;41398:37;;38744:4;41484:9;41468:13;:25;;;;:::i;:::-;:39;;41446:120;;;;;;;;;;;;:::i;:::-;;;;;;;;;41590:12;41581:21;;;;;;;;:::i;:::-;;:5;;;;;;;;;;;:21;;;;;;;;:::i;:::-;;;41577:330;;38877:2;41627:9;:28;;41619:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41749:9;41741:5;;:17;;;;:::i;:::-;41728:9;:30;;41702:123;;;;;;;;;;;;:::i;:::-;;;;;;;;;41577:330;;;41858:37;;;;;;;;;;:::i;:::-;;;;;;;;41577:330;41917:32;41927:10;41939:9;41917;:32::i;:::-;41387:570;41337:620;:::o;29004:288::-;29111:12;:10;:12::i;:::-;29099:24;;:8;:24;;;29091:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;29212:8;29167:18;:32;29186:12;:10;:12::i;:::-;29167:32;;;;;;;;;;;;;;;:42;29200:8;29167:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;29265:8;29236:48;;29251:12;:10;:12::i;:::-;29236:48;;;29275:8;29236:48;;;;;;:::i;:::-;;;;;;;;29004:288;;:::o;38984:49::-;;;;;;;;;;;;;;;;;;;;;;:::o;30075:355::-;30234:28;30244:4;30250:2;30254:7;30234:9;:28::i;:::-;30295:48;30318:4;30324:2;30328:7;30337:5;30295:22;:48::i;:::-;30273:149;;;;;;;;;;;;:::i;:::-;;;;;;;;;30075:355;;;;:::o;39042:18::-;;;;;;;;;;;;;:::o;39321:591::-;39439:13;39478:16;39486:7;39478;:16::i;:::-;39470:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;39532:28;39563:10;:8;:10::i;:::-;39532:41;;39637:1;39612:14;39606:28;:32;:287;;;;;;;;;;;;;;;;;39730:14;39771:18;:7;:16;:18::i;:::-;39816:13;39687:165;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;39606:287;39584:320;;;39321:591;;;:::o;41997:236::-;38639:12;:10;:12::i;:::-;38630:21;;:5;:21;;;38622:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;42078:8:::1;42069:17;;;;;;;;:::i;:::-;;:5;;;;;;;;;;;:17;;;;;;;;:::i;:::-;;::::0;42061:57:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;42129:15;42147:5;;;;;;;;;;;42129:23;;42171:8;42163:5;;:16;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;42195:30;42208:9;42219:5;;;;;;;;;;;42195:30;;;;;;;:::i;:::-;;;;;;;;42050:183;41997:236:::0;:::o;29363:164::-;29460:4;29484:18;:25;29503:5;29484:25;;;;;;;;;;;;;;;:35;29510:8;29484:35;;;;;;;;;;;;;;;;;;;;;;;;;29477:42;;29363:164;;;;:::o;42241:110::-;38639:12;:10;:12::i;:::-;38630:21;;:5;:21;;;38622:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;42330:13:::1;42317:10;:26;;;;42241:110:::0;:::o;15391:157::-;15476:4;15515:25;15500:40;;;:11;:40;;;;15493:47;;15391:157;;;:::o;2665:98::-;2718:7;2745:10;2738:17;;2665:98;:::o;30819:104::-;30888:27;30898:2;30902:8;30888:27;;;;;;;;;;;;:9;:27::i;:::-;30819:104;;:::o;30685:126::-;30742:4;30776:12;;30766:7;:22;:37;;;;;30802:1;30792:7;:11;30766:37;30759:44;;30685:126;;;:::o;35620:196::-;35762:2;35735:15;:24;35751:7;35735:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;35800:7;35796:2;35780:28;;35789:5;35780:28;;;;;;;;;;;;35620:196;;;:::o;33500:2002::-;33615:35;33653:20;33665:7;33653:11;:20::i;:::-;33615:58;;33686:22;33728:13;:18;;;33712:34;;:12;:10;:12::i;:::-;:34;;;:87;;;;33787:12;:10;:12::i;:::-;33763:36;;:20;33775:7;33763:11;:20::i;:::-;:36;;;33712:87;:154;;;;33816:50;33833:13;:18;;;33853:12;:10;:12::i;:::-;33816:16;:50::i;:::-;33712:154;33686:181;;33888:17;33880:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;34003:4;33981:26;;:13;:18;;;:26;;;33973:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;34083:1;34069:16;;:2;:16;;;34061:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;34140:43;34162:4;34168:2;34172:7;34181:1;34140:21;:43::i;:::-;34248:49;34265:1;34269:7;34278:13;:18;;;34248:8;:49::i;:::-;34623:1;34593:12;:18;34606:4;34593:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34667:1;34639:12;:16;34652:2;34639:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34713:2;34685:11;:20;34697:7;34685:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;34775:15;34730:11;:20;34742:7;34730:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;35043:19;35075:1;35065:7;:11;35043:33;;35136:1;35095:43;;:11;:24;35107:11;35095:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;35091:295;;35163:20;35171:11;35163:7;:20::i;:::-;35159:212;;;35240:13;:18;;;35208:11;:24;35220:11;35208:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;35323:13;:28;;;35281:11;:24;35293:11;35281:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;35159:212;35091:295;34568:829;35433:7;35429:2;35414:27;;35423:4;35414:27;;;;;;;;;;;;35452:42;35473:4;35479:2;35483:7;35492:1;35452:20;:42::i;:::-;33604:1898;;33500:2002;;;:::o;26356:537::-;26417:21;;:::i;:::-;26459:16;26467:7;26459;:16::i;:::-;26451:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;26565:12;26580:7;26565:22;;26560:245;26597:1;26589:4;:9;26560:245;;26627:31;26661:11;:17;26673:4;26661:17;;;;;;;;;;;26627:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26727:1;26701:28;;:9;:14;;;:28;;;26697:93;;26761:9;26754:16;;;;;;26697:93;26608:197;26600:6;;;;;;;;26560:245;;;;26828:57;;;;;;;;;;:::i;:::-;;;;;;;;26356:537;;;;:::o;42804:179::-;42878:12;42896:8;:13;;42917:7;42896:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42877:52;;;42948:7;42940:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;42866:117;42804:179;;:::o;36381:804::-;36536:4;36557:15;:2;:13;;;:15::i;:::-;36553:625;;;36609:2;36593:36;;;36630:12;:10;:12::i;:::-;36644:4;36650:7;36659:5;36593:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;36589:534;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36856:1;36839:6;:13;:18;36835:273;;36882:61;;;;;;;;;;:::i;:::-;;;;;;;;36835:273;37058:6;37052:13;37043:6;37039:2;37035:15;37028:38;36589:534;36726:45;;;36716:55;;;:6;:55;;;;36709:62;;;;;36553:625;37162:4;37155:11;;36381:804;;;;;;;:::o;39920:108::-;39980:13;40013:7;40006:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39920:108;:::o;364:723::-;420:13;650:1;641:5;:10;637:53;;668:10;;;;;;;;;;;;;;;;;;;;;637:53;700:12;715:5;700:20;;731:14;756:78;771:1;763:4;:9;756:78;;789:8;;;;;:::i;:::-;;;;820:2;812:10;;;;;:::i;:::-;;;756:78;;;844:19;876:6;866:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;844:39;;894:154;910:1;901:5;:10;894:154;;938:1;928:11;;;;;:::i;:::-;;;1005:2;997:5;:10;;;;:::i;:::-;984:2;:24;;;;:::i;:::-;971:39;;954:6;961;954:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1034:2;1025:11;;;;;:::i;:::-;;;894:154;;;1072:6;1058:21;;;;;364:723;;;;:::o;31286:163::-;31409:32;31415:2;31419:8;31429:5;31436:4;31409:5;:32::i;:::-;31286:163;;;:::o;37673:159::-;;;;;:::o;38244:158::-;;;;;:::o;5750:387::-;5810:4;6018:12;6085:7;6073:20;6065:28;;6128:1;6121:4;:8;6114:15;;;5750:387;;;:::o;31708:1538::-;31847:20;31870:12;;31847:35;;31915:1;31901:16;;:2;:16;;;31893:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;31986:1;31974:8;:13;31966:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;32045:61;32075:1;32079:2;32083:12;32097:8;32045:21;:61::i;:::-;32420:8;32384:12;:16;32397:2;32384:16;;;;;;;;;;;;;;;:24;;;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32485:8;32444:12;:16;32457:2;32444:16;;;;;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32544:2;32511:11;:25;32523:12;32511:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;32611:15;32561:11;:25;32573:12;32561:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;32644:20;32667:12;32644:35;;32701:9;32696:415;32716:8;32712:1;:12;32696:415;;;32780:12;32776:2;32755:38;;32772:1;32755:38;;;;;;;;;;;;32816:4;32812:249;;;32879:59;32910:1;32914:2;32918:12;32932:5;32879:22;:59::i;:::-;32845:196;;;;;;;;;;;;:::i;:::-;;;;;;;;;32812:249;33081:14;;;;;;;32726:3;;;;;;;32696:415;;;;33142:12;33127;:27;;;;32359:807;33178:60;33207:1;33211:2;33215:12;33229:8;33178:20;:60::i;:::-;31836:1410;31708:1538;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:77::-;1555:7;1584:5;1573:16;;1518:77;;;:::o;1601:122::-;1674:24;1692:5;1674:24;:::i;:::-;1667:5;1664:35;1654:63;;1713:1;1710;1703:12;1654:63;1601:122;:::o;1729:139::-;1775:5;1813:6;1800:20;1791:29;;1829:33;1856:5;1829:33;:::i;:::-;1729:139;;;;:::o;1874:329::-;1933:6;1982:2;1970:9;1961:7;1957:23;1953:32;1950:119;;;1988:79;;:::i;:::-;1950:119;2108:1;2133:53;2178:7;2169:6;2158:9;2154:22;2133:53;:::i;:::-;2123:63;;2079:117;1874:329;;;;:::o;2209:99::-;2261:6;2295:5;2289:12;2279:22;;2209:99;;;:::o;2314:169::-;2398:11;2432:6;2427:3;2420:19;2472:4;2467:3;2463:14;2448:29;;2314:169;;;;:::o;2489:307::-;2557:1;2567:113;2581:6;2578:1;2575:13;2567:113;;;2666:1;2661:3;2657:11;2651:18;2647:1;2642:3;2638:11;2631:39;2603:2;2600:1;2596:10;2591:15;;2567:113;;;2698:6;2695:1;2692:13;2689:101;;;2778:1;2769:6;2764:3;2760:16;2753:27;2689:101;2538:258;2489:307;;;:::o;2802:102::-;2843:6;2894:2;2890:7;2885:2;2878:5;2874:14;2870:28;2860:38;;2802:102;;;:::o;2910:364::-;2998:3;3026:39;3059:5;3026:39;:::i;:::-;3081:71;3145:6;3140:3;3081:71;:::i;:::-;3074:78;;3161:52;3206:6;3201:3;3194:4;3187:5;3183:16;3161:52;:::i;:::-;3238:29;3260:6;3238:29;:::i;:::-;3233:3;3229:39;3222:46;;3002:272;2910:364;;;;:::o;3280:313::-;3393:4;3431:2;3420:9;3416:18;3408:26;;3480:9;3474:4;3470:20;3466:1;3455:9;3451:17;3444:47;3508:78;3581:4;3572:6;3508:78;:::i;:::-;3500:86;;3280:313;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:117::-;6024:1;6021;6014:12;6038:117;6147:1;6144;6137:12;6161:180;6209:77;6206:1;6199:88;6306:4;6303:1;6296:15;6330:4;6327:1;6320:15;6347:281;6430:27;6452:4;6430:27;:::i;:::-;6422:6;6418:40;6560:6;6548:10;6545:22;6524:18;6512:10;6509:34;6506:62;6503:88;;;6571:18;;:::i;:::-;6503:88;6611:10;6607:2;6600:22;6390:238;6347:281;;:::o;6634:129::-;6668:6;6695:20;;:::i;:::-;6685:30;;6724:33;6752:4;6744:6;6724:33;:::i;:::-;6634:129;;;:::o;6769:308::-;6831:4;6921:18;6913:6;6910:30;6907:56;;;6943:18;;:::i;:::-;6907:56;6981:29;7003:6;6981:29;:::i;:::-;6973:37;;7065:4;7059;7055:15;7047:23;;6769:308;;;:::o;7083:154::-;7167:6;7162:3;7157;7144:30;7229:1;7220:6;7215:3;7211:16;7204:27;7083:154;;;:::o;7243:412::-;7321:5;7346:66;7362:49;7404:6;7362:49;:::i;:::-;7346:66;:::i;:::-;7337:75;;7435:6;7428:5;7421:21;7473:4;7466:5;7462:16;7511:3;7502:6;7497:3;7493:16;7490:25;7487:112;;;7518:79;;:::i;:::-;7487:112;7608:41;7642:6;7637:3;7632;7608:41;:::i;:::-;7327:328;7243:412;;;;;:::o;7675:340::-;7731:5;7780:3;7773:4;7765:6;7761:17;7757:27;7747:122;;7788:79;;:::i;:::-;7747:122;7905:6;7892:20;7930:79;8005:3;7997:6;7990:4;7982:6;7978:17;7930:79;:::i;:::-;7921:88;;7737:278;7675:340;;;;:::o;8021:509::-;8090:6;8139:2;8127:9;8118:7;8114:23;8110:32;8107:119;;;8145:79;;:::i;:::-;8107:119;8293:1;8282:9;8278:17;8265:31;8323:18;8315:6;8312:30;8309:117;;;8345:79;;:::i;:::-;8309:117;8450:63;8505:7;8496:6;8485:9;8481:22;8450:63;:::i;:::-;8440:73;;8236:287;8021:509;;;;:::o;8536:329::-;8595:6;8644:2;8632:9;8623:7;8619:23;8615:32;8612:119;;;8650:79;;:::i;:::-;8612:119;8770:1;8795:53;8840:7;8831:6;8820:9;8816:22;8795:53;:::i;:::-;8785:63;;8741:117;8536:329;;;;:::o;8871:116::-;8941:21;8956:5;8941:21;:::i;:::-;8934:5;8931:32;8921:60;;8977:1;8974;8967:12;8921:60;8871:116;:::o;8993:133::-;9036:5;9074:6;9061:20;9052:29;;9090:30;9114:5;9090:30;:::i;:::-;8993:133;;;;:::o;9132:468::-;9197:6;9205;9254:2;9242:9;9233:7;9229:23;9225:32;9222:119;;;9260:79;;:::i;:::-;9222:119;9380:1;9405:53;9450:7;9441:6;9430:9;9426:22;9405:53;:::i;:::-;9395:63;;9351:117;9507:2;9533:50;9575:7;9566:6;9555:9;9551:22;9533:50;:::i;:::-;9523:60;;9478:115;9132:468;;;;;:::o;9606:307::-;9667:4;9757:18;9749:6;9746:30;9743:56;;;9779:18;;:::i;:::-;9743:56;9817:29;9839:6;9817:29;:::i;:::-;9809:37;;9901:4;9895;9891:15;9883:23;;9606:307;;;:::o;9919:410::-;9996:5;10021:65;10037:48;10078:6;10037:48;:::i;:::-;10021:65;:::i;:::-;10012:74;;10109:6;10102:5;10095:21;10147:4;10140:5;10136:16;10185:3;10176:6;10171:3;10167:16;10164:25;10161:112;;;10192:79;;:::i;:::-;10161:112;10282:41;10316:6;10311:3;10306;10282:41;:::i;:::-;10002:327;9919:410;;;;;:::o;10348:338::-;10403:5;10452:3;10445:4;10437:6;10433:17;10429:27;10419:122;;10460:79;;:::i;:::-;10419:122;10577:6;10564:20;10602:78;10676:3;10668:6;10661:4;10653:6;10649:17;10602:78;:::i;:::-;10593:87;;10409:277;10348:338;;;;:::o;10692:943::-;10787:6;10795;10803;10811;10860:3;10848:9;10839:7;10835:23;10831:33;10828:120;;;10867:79;;:::i;:::-;10828:120;10987:1;11012:53;11057:7;11048:6;11037:9;11033:22;11012:53;:::i;:::-;11002:63;;10958:117;11114:2;11140:53;11185:7;11176:6;11165:9;11161:22;11140:53;:::i;:::-;11130:63;;11085:118;11242:2;11268:53;11313:7;11304:6;11293:9;11289:22;11268:53;:::i;:::-;11258:63;;11213:118;11398:2;11387:9;11383:18;11370:32;11429:18;11421:6;11418:30;11415:117;;;11451:79;;:::i;:::-;11415:117;11556:62;11610:7;11601:6;11590:9;11586:22;11556:62;:::i;:::-;11546:72;;11341:287;10692:943;;;;;;;:::o;11641:180::-;11689:77;11686:1;11679:88;11786:4;11783:1;11776:15;11810:4;11807:1;11800:15;11827:115;11910:1;11903:5;11900:12;11890:46;;11916:18;;:::i;:::-;11890:46;11827:115;:::o;11948:131::-;11995:7;12024:5;12013:16;;12030:43;12067:5;12030:43;:::i;:::-;11948:131;;;:::o;12085:::-;12143:9;12176:34;12204:5;12176:34;:::i;:::-;12163:47;;12085:131;;;:::o;12222:147::-;12317:45;12356:5;12317:45;:::i;:::-;12312:3;12305:58;12222:147;;:::o;12375:238::-;12476:4;12514:2;12503:9;12499:18;12491:26;;12527:79;12603:1;12592:9;12588:17;12579:6;12527:79;:::i;:::-;12375:238;;;;:::o;12619:109::-;12702:1;12695:5;12692:12;12682:40;;12718:1;12715;12708:12;12682:40;12619:109;:::o;12734:159::-;12790:5;12828:6;12815:20;12806:29;;12844:43;12881:5;12844:43;:::i;:::-;12734:159;;;;:::o;12899:349::-;12968:6;13017:2;13005:9;12996:7;12992:23;12988:32;12985:119;;;13023:79;;:::i;:::-;12985:119;13143:1;13168:63;13223:7;13214:6;13203:9;13199:22;13168:63;:::i;:::-;13158:73;;13114:127;12899:349;;;;:::o;13254:474::-;13322:6;13330;13379:2;13367:9;13358:7;13354:23;13350:32;13347:119;;;13385:79;;:::i;:::-;13347:119;13505:1;13530:53;13575:7;13566:6;13555:9;13551:22;13530:53;:::i;:::-;13520:63;;13476:117;13632:2;13658:53;13703:7;13694:6;13683:9;13679:22;13658:53;:::i;:::-;13648:63;;13603:118;13254:474;;;;;:::o;13734:173::-;13874:25;13870:1;13862:6;13858:14;13851:49;13734:173;:::o;13913:366::-;14055:3;14076:67;14140:2;14135:3;14076:67;:::i;:::-;14069:74;;14152:93;14241:3;14152:93;:::i;:::-;14270:2;14265:3;14261:12;14254:19;;13913:366;;;:::o;14285:419::-;14451:4;14489:2;14478:9;14474:18;14466:26;;14538:9;14532:4;14528:20;14524:1;14513:9;14509:17;14502:47;14566:131;14692:4;14566:131;:::i;:::-;14558:139;;14285:419;;;:::o;14710:180::-;14758:77;14755:1;14748:88;14855:4;14852:1;14845:15;14879:4;14876:1;14869:15;14896:305;14936:3;14955:20;14973:1;14955:20;:::i;:::-;14950:25;;14989:20;15007:1;14989:20;:::i;:::-;14984:25;;15143:1;15075:66;15071:74;15068:1;15065:81;15062:107;;;15149:18;;:::i;:::-;15062:107;15193:1;15190;15186:9;15179:16;;14896:305;;;;:::o;15207:181::-;15347:33;15343:1;15335:6;15331:14;15324:57;15207:181;:::o;15394:366::-;15536:3;15557:67;15621:2;15616:3;15557:67;:::i;:::-;15550:74;;15633:93;15722:3;15633:93;:::i;:::-;15751:2;15746:3;15742:12;15735:19;;15394:366;;;:::o;15766:419::-;15932:4;15970:2;15959:9;15955:18;15947:26;;16019:9;16013:4;16009:20;16005:1;15994:9;15990:17;15983:47;16047:131;16173:4;16047:131;:::i;:::-;16039:139;;15766:419;;;:::o;16191:191::-;16231:4;16251:20;16269:1;16251:20;:::i;:::-;16246:25;;16285:20;16303:1;16285:20;:::i;:::-;16280:25;;16324:1;16321;16318:8;16315:34;;;16329:18;;:::i;:::-;16315:34;16374:1;16371;16367:9;16359:17;;16191:191;;;;:::o;16388:167::-;16528:19;16524:1;16516:6;16512:14;16505:43;16388:167;:::o;16561:366::-;16703:3;16724:67;16788:2;16783:3;16724:67;:::i;:::-;16717:74;;16800:93;16889:3;16800:93;:::i;:::-;16918:2;16913:3;16909:12;16902:19;;16561:366;;;:::o;16933:419::-;17099:4;17137:2;17126:9;17122:18;17114:26;;17186:9;17180:4;17176:20;17172:1;17161:9;17157:17;17150:47;17214:131;17340:4;17214:131;:::i;:::-;17206:139;;16933:419;;;:::o;17358:180::-;17406:77;17403:1;17396:88;17503:4;17500:1;17493:15;17527:4;17524:1;17517:15;17544:320;17588:6;17625:1;17619:4;17615:12;17605:22;;17672:1;17666:4;17662:12;17693:18;17683:81;;17749:4;17741:6;17737:17;17727:27;;17683:81;17811:2;17803:6;17800:14;17780:18;17777:38;17774:84;;17830:18;;:::i;:::-;17774:84;17595:269;17544:320;;;:::o;17870:232::-;18010:34;18006:1;17998:6;17994:14;17987:58;18079:15;18074:2;18066:6;18062:15;18055:40;17870:232;:::o;18108:366::-;18250:3;18271:67;18335:2;18330:3;18271:67;:::i;:::-;18264:74;;18347:93;18436:3;18347:93;:::i;:::-;18465:2;18460:3;18456:12;18449:19;;18108:366;;;:::o;18480:419::-;18646:4;18684:2;18673:9;18669:18;18661:26;;18733:9;18727:4;18723:20;18719:1;18708:9;18704:17;18697:47;18761:131;18887:4;18761:131;:::i;:::-;18753:139;;18480:419;;;:::o;18905:221::-;19045:34;19041:1;19033:6;19029:14;19022:58;19114:4;19109:2;19101:6;19097:15;19090:29;18905:221;:::o;19132:366::-;19274:3;19295:67;19359:2;19354:3;19295:67;:::i;:::-;19288:74;;19371:93;19460:3;19371:93;:::i;:::-;19489:2;19484:3;19480:12;19473:19;;19132:366;;;:::o;19504:419::-;19670:4;19708:2;19697:9;19693:18;19685:26;;19757:9;19751:4;19747:20;19743:1;19732:9;19728:17;19721:47;19785:131;19911:4;19785:131;:::i;:::-;19777:139;;19504:419;;;:::o;19929:244::-;20069:34;20065:1;20057:6;20053:14;20046:58;20138:27;20133:2;20125:6;20121:15;20114:52;19929:244;:::o;20179:366::-;20321:3;20342:67;20406:2;20401:3;20342:67;:::i;:::-;20335:74;;20418:93;20507:3;20418:93;:::i;:::-;20536:2;20531:3;20527:12;20520:19;;20179:366;;;:::o;20551:419::-;20717:4;20755:2;20744:9;20740:18;20732:26;;20804:9;20798:4;20794:20;20790:1;20779:9;20775:17;20768:47;20832:131;20958:4;20832:131;:::i;:::-;20824:139;;20551:419;;;:::o;20976:221::-;21116:34;21112:1;21104:6;21100:14;21093:58;21185:4;21180:2;21172:6;21168:15;21161:29;20976:221;:::o;21203:366::-;21345:3;21366:67;21430:2;21425:3;21366:67;:::i;:::-;21359:74;;21442:93;21531:3;21442:93;:::i;:::-;21560:2;21555:3;21551:12;21544:19;;21203:366;;;:::o;21575:419::-;21741:4;21779:2;21768:9;21764:18;21756:26;;21828:9;21822:4;21818:20;21814:1;21803:9;21799:17;21792:47;21856:131;21982:4;21856:131;:::i;:::-;21848:139;;21575:419;;;:::o;22000:233::-;22140:34;22136:1;22128:6;22124:14;22117:58;22209:16;22204:2;22196:6;22192:15;22185:41;22000:233;:::o;22239:366::-;22381:3;22402:67;22466:2;22461:3;22402:67;:::i;:::-;22395:74;;22478:93;22567:3;22478:93;:::i;:::-;22596:2;22591:3;22587:12;22580:19;;22239:366;;;:::o;22611:419::-;22777:4;22815:2;22804:9;22800:18;22792:26;;22864:9;22858:4;22854:20;22850:1;22839:9;22835:17;22828:47;22892:131;23018:4;22892:131;:::i;:::-;22884:139;;22611:419;;;:::o;23036:222::-;23176:34;23172:1;23164:6;23160:14;23153:58;23245:5;23240:2;23232:6;23228:15;23221:30;23036:222;:::o;23264:366::-;23406:3;23427:67;23491:2;23486:3;23427:67;:::i;:::-;23420:74;;23503:93;23592:3;23503:93;:::i;:::-;23621:2;23616:3;23612:12;23605:19;;23264:366;;;:::o;23636:419::-;23802:4;23840:2;23829:9;23825:18;23817:26;;23889:9;23883:4;23879:20;23875:1;23864:9;23860:17;23853:47;23917:131;24043:4;23917:131;:::i;:::-;23909:139;;23636:419;;;:::o;24061:230::-;24201:34;24197:1;24189:6;24185:14;24178:58;24270:13;24265:2;24257:6;24253:15;24246:38;24061:230;:::o;24297:366::-;24439:3;24460:67;24524:2;24519:3;24460:67;:::i;:::-;24453:74;;24536:93;24625:3;24536:93;:::i;:::-;24654:2;24649:3;24645:12;24638:19;;24297:366;;;:::o;24669:419::-;24835:4;24873:2;24862:9;24858:18;24850:26;;24922:9;24916:4;24912:20;24908:1;24897:9;24893:17;24886:47;24950:131;25076:4;24950:131;:::i;:::-;24942:139;;24669:419;;;:::o;25094:182::-;25234:34;25230:1;25222:6;25218:14;25211:58;25094:182;:::o;25282:366::-;25424:3;25445:67;25509:2;25504:3;25445:67;:::i;:::-;25438:74;;25521:93;25610:3;25521:93;:::i;:::-;25639:2;25634:3;25630:12;25623:19;;25282:366;;;:::o;25654:419::-;25820:4;25858:2;25847:9;25843:18;25835:26;;25907:9;25901:4;25897:20;25893:1;25882:9;25878:17;25871:47;25935:131;26061:4;25935:131;:::i;:::-;25927:139;;25654:419;;;:::o;26079:226::-;26219:34;26215:1;26207:6;26203:14;26196:58;26288:9;26283:2;26275:6;26271:15;26264:34;26079:226;:::o;26311:366::-;26453:3;26474:67;26538:2;26533:3;26474:67;:::i;:::-;26467:74;;26550:93;26639:3;26550:93;:::i;:::-;26668:2;26663:3;26659:12;26652:19;;26311:366;;;:::o;26683:419::-;26849:4;26887:2;26876:9;26872:18;26864:26;;26936:9;26930:4;26926:20;26922:1;26911:9;26907:17;26900:47;26964:131;27090:4;26964:131;:::i;:::-;26956:139;;26683:419;;;:::o;27108:177::-;27248:29;27244:1;27236:6;27232:14;27225:53;27108:177;:::o;27291:366::-;27433:3;27454:67;27518:2;27513:3;27454:67;:::i;:::-;27447:74;;27530:93;27619:3;27530:93;:::i;:::-;27648:2;27643:3;27639:12;27632:19;;27291:366;;;:::o;27663:419::-;27829:4;27867:2;27856:9;27852:18;27844:26;;27916:9;27910:4;27906:20;27902:1;27891:9;27887:17;27880:47;27944:131;28070:4;27944:131;:::i;:::-;27936:139;;27663:419;;;:::o;28088:158::-;28228:10;28224:1;28216:6;28212:14;28205:34;28088:158;:::o;28252:365::-;28394:3;28415:66;28479:1;28474:3;28415:66;:::i;:::-;28408:73;;28490:93;28579:3;28490:93;:::i;:::-;28608:2;28603:3;28599:12;28592:19;;28252:365;;;:::o;28623:419::-;28789:4;28827:2;28816:9;28812:18;28804:26;;28876:9;28870:4;28866:20;28862:1;28851:9;28847:17;28840:47;28904:131;29030:4;28904:131;:::i;:::-;28896:139;;28623:419;;;:::o;29048:177::-;29188:29;29184:1;29176:6;29172:14;29165:53;29048:177;:::o;29231:366::-;29373:3;29394:67;29458:2;29453:3;29394:67;:::i;:::-;29387:74;;29470:93;29559:3;29470:93;:::i;:::-;29588:2;29583:3;29579:12;29572:19;;29231:366;;;:::o;29603:419::-;29769:4;29807:2;29796:9;29792:18;29784:26;;29856:9;29850:4;29846:20;29842:1;29831:9;29827:17;29820:47;29884:131;30010:4;29884:131;:::i;:::-;29876:139;;29603:419;;;:::o;30028:348::-;30068:7;30091:20;30109:1;30091:20;:::i;:::-;30086:25;;30125:20;30143:1;30125:20;:::i;:::-;30120:25;;30313:1;30245:66;30241:74;30238:1;30235:81;30230:1;30223:9;30216:17;30212:105;30209:131;;;30320:18;;:::i;:::-;30209:131;30368:1;30365;30361:9;30350:20;;30028:348;;;;:::o;30382:181::-;30522:33;30518:1;30510:6;30506:14;30499:57;30382:181;:::o;30569:366::-;30711:3;30732:67;30796:2;30791:3;30732:67;:::i;:::-;30725:74;;30808:93;30897:3;30808:93;:::i;:::-;30926:2;30921:3;30917:12;30910:19;;30569:366;;;:::o;30941:419::-;31107:4;31145:2;31134:9;31130:18;31122:26;;31194:9;31188:4;31184:20;31180:1;31169:9;31165:17;31158:47;31222:131;31348:4;31222:131;:::i;:::-;31214:139;;30941:419;;;:::o;31366:176::-;31506:28;31502:1;31494:6;31490:14;31483:52;31366:176;:::o;31548:366::-;31690:3;31711:67;31775:2;31770:3;31711:67;:::i;:::-;31704:74;;31787:93;31876:3;31787:93;:::i;:::-;31905:2;31900:3;31896:12;31889:19;;31548:366;;;:::o;31920:419::-;32086:4;32124:2;32113:9;32109:18;32101:26;;32173:9;32167:4;32163:20;32159:1;32148:9;32144:17;32137:47;32201:131;32327:4;32201:131;:::i;:::-;32193:139;;31920:419;;;:::o;32345:238::-;32485:34;32481:1;32473:6;32469:14;32462:58;32554:21;32549:2;32541:6;32537:15;32530:46;32345:238;:::o;32589:366::-;32731:3;32752:67;32816:2;32811:3;32752:67;:::i;:::-;32745:74;;32828:93;32917:3;32828:93;:::i;:::-;32946:2;32941:3;32937:12;32930:19;;32589:366;;;:::o;32961:419::-;33127:4;33165:2;33154:9;33150:18;33142:26;;33214:9;33208:4;33204:20;33200:1;33189:9;33185:17;33178:47;33242:131;33368:4;33242:131;:::i;:::-;33234:139;;32961:419;;;:::o;33386:172::-;33526:24;33522:1;33514:6;33510:14;33503:48;33386:172;:::o;33564:366::-;33706:3;33727:67;33791:2;33786:3;33727:67;:::i;:::-;33720:74;;33803:93;33892:3;33803:93;:::i;:::-;33921:2;33916:3;33912:12;33905:19;;33564:366;;;:::o;33936:419::-;34102:4;34140:2;34129:9;34125:18;34117:26;;34189:9;34183:4;34179:20;34175:1;34164:9;34160:17;34153:47;34217:131;34343:4;34217:131;:::i;:::-;34209:139;;33936:419;;;:::o;34361:148::-;34463:11;34500:3;34485:18;;34361:148;;;;:::o;34515:377::-;34621:3;34649:39;34682:5;34649:39;:::i;:::-;34704:89;34786:6;34781:3;34704:89;:::i;:::-;34697:96;;34802:52;34847:6;34842:3;34835:4;34828:5;34824:16;34802:52;:::i;:::-;34879:6;34874:3;34870:16;34863:23;;34625:267;34515:377;;;;:::o;34898:141::-;34947:4;34970:3;34962:11;;34993:3;34990:1;34983:14;35027:4;35024:1;35014:18;35006:26;;34898:141;;;:::o;35069:845::-;35172:3;35209:5;35203:12;35238:36;35264:9;35238:36;:::i;:::-;35290:89;35372:6;35367:3;35290:89;:::i;:::-;35283:96;;35410:1;35399:9;35395:17;35426:1;35421:137;;;;35572:1;35567:341;;;;35388:520;;35421:137;35505:4;35501:9;35490;35486:25;35481:3;35474:38;35541:6;35536:3;35532:16;35525:23;;35421:137;;35567:341;35634:38;35666:5;35634:38;:::i;:::-;35694:1;35708:154;35722:6;35719:1;35716:13;35708:154;;;35796:7;35790:14;35786:1;35781:3;35777:11;35770:35;35846:1;35837:7;35833:15;35822:26;;35744:4;35741:1;35737:12;35732:17;;35708:154;;;35891:6;35886:3;35882:16;35875:23;;35574:334;;35388:520;;35176:738;;35069:845;;;;:::o;35920:589::-;36145:3;36167:95;36258:3;36249:6;36167:95;:::i;:::-;36160:102;;36279:95;36370:3;36361:6;36279:95;:::i;:::-;36272:102;;36391:92;36479:3;36470:6;36391:92;:::i;:::-;36384:99;;36500:3;36493:10;;35920:589;;;;;;:::o;36515:177::-;36655:29;36651:1;36643:6;36639:14;36632:53;36515:177;:::o;36698:366::-;36840:3;36861:67;36925:2;36920:3;36861:67;:::i;:::-;36854:74;;36937:93;37026:3;36937:93;:::i;:::-;37055:2;37050:3;37046:12;37039:19;;36698:366;;;:::o;37070:419::-;37236:4;37274:2;37263:9;37259:18;37251:26;;37323:9;37317:4;37313:20;37309:1;37298:9;37294:17;37287:47;37351:131;37477:4;37351:131;:::i;:::-;37343:139;;37070:419;;;:::o;37495:364::-;37632:4;37670:2;37659:9;37655:18;37647:26;;37683:79;37759:1;37748:9;37744:17;37735:6;37683:79;:::i;:::-;37772:80;37848:2;37837:9;37833:18;37824:6;37772:80;:::i;:::-;37495:364;;;;;:::o;37865:237::-;38005:34;38001:1;37993:6;37989:14;37982:58;38074:20;38069:2;38061:6;38057:15;38050:45;37865:237;:::o;38108:366::-;38250:3;38271:67;38335:2;38330:3;38271:67;:::i;:::-;38264:74;;38347:93;38436:3;38347:93;:::i;:::-;38465:2;38460:3;38456:12;38449:19;;38108:366;;;:::o;38480:419::-;38646:4;38684:2;38673:9;38669:18;38661:26;;38733:9;38727:4;38723:20;38719:1;38708:9;38704:17;38697:47;38761:131;38887:4;38761:131;:::i;:::-;38753:139;;38480:419;;;:::o;38905:225::-;39045:34;39041:1;39033:6;39029:14;39022:58;39114:8;39109:2;39101:6;39097:15;39090:33;38905:225;:::o;39136:366::-;39278:3;39299:67;39363:2;39358:3;39299:67;:::i;:::-;39292:74;;39375:93;39464:3;39375:93;:::i;:::-;39493:2;39488:3;39484:12;39477:19;;39136:366;;;:::o;39508:419::-;39674:4;39712:2;39701:9;39697:18;39689:26;;39761:9;39755:4;39751:20;39747:1;39736:9;39732:17;39725:47;39789:131;39915:4;39789:131;:::i;:::-;39781:139;;39508:419;;;:::o;39933:224::-;40073:34;40069:1;40061:6;40057:14;40050:58;40142:7;40137:2;40129:6;40125:15;40118:32;39933:224;:::o;40163:366::-;40305:3;40326:67;40390:2;40385:3;40326:67;:::i;:::-;40319:74;;40402:93;40491:3;40402:93;:::i;:::-;40520:2;40515:3;40511:12;40504:19;;40163:366;;;:::o;40535:419::-;40701:4;40739:2;40728:9;40724:18;40716:26;;40788:9;40782:4;40778:20;40774:1;40763:9;40759:17;40752:47;40816:131;40942:4;40816:131;:::i;:::-;40808:139;;40535:419;;;:::o;40960:229::-;41100:34;41096:1;41088:6;41084:14;41077:58;41169:12;41164:2;41156:6;41152:15;41145:37;40960:229;:::o;41195:366::-;41337:3;41358:67;41422:2;41417:3;41358:67;:::i;:::-;41351:74;;41434:93;41523:3;41434:93;:::i;:::-;41552:2;41547:3;41543:12;41536:19;;41195:366;;;:::o;41567:419::-;41733:4;41771:2;41760:9;41756:18;41748:26;;41820:9;41814:4;41810:20;41806:1;41795:9;41791:17;41784:47;41848:131;41974:4;41848:131;:::i;:::-;41840:139;;41567:419;;;:::o;41992:234::-;42132:34;42128:1;42120:6;42116:14;42109:58;42201:17;42196:2;42188:6;42184:15;42177:42;41992:234;:::o;42232:366::-;42374:3;42395:67;42459:2;42454:3;42395:67;:::i;:::-;42388:74;;42471:93;42560:3;42471:93;:::i;:::-;42589:2;42584:3;42580:12;42573:19;;42232:366;;;:::o;42604:419::-;42770:4;42808:2;42797:9;42793:18;42785:26;;42857:9;42851:4;42847:20;42843:1;42832:9;42828:17;42821:47;42885:131;43011:4;42885:131;:::i;:::-;42877:139;;42604:419;;;:::o;43029:147::-;43130:11;43167:3;43152:18;;43029:147;;;;:::o;43182:114::-;;:::o;43302:398::-;43461:3;43482:83;43563:1;43558:3;43482:83;:::i;:::-;43475:90;;43574:93;43663:3;43574:93;:::i;:::-;43692:1;43687:3;43683:11;43676:18;;43302:398;;;:::o;43706:379::-;43890:3;43912:147;44055:3;43912:147;:::i;:::-;43905:154;;44076:3;44069:10;;43706:379;;;:::o;44091:165::-;44231:17;44227:1;44219:6;44215:14;44208:41;44091:165;:::o;44262:366::-;44404:3;44425:67;44489:2;44484:3;44425:67;:::i;:::-;44418:74;;44501:93;44590:3;44501:93;:::i;:::-;44619:2;44614:3;44610:12;44603:19;;44262:366;;;:::o;44634:419::-;44800:4;44838:2;44827:9;44823:18;44815:26;;44887:9;44881:4;44877:20;44873:1;44862:9;44858:17;44851:47;44915:131;45041:4;44915:131;:::i;:::-;44907:139;;44634:419;;;:::o;45059:98::-;45110:6;45144:5;45138:12;45128:22;;45059:98;;;:::o;45163:168::-;45246:11;45280:6;45275:3;45268:19;45320:4;45315:3;45311:14;45296:29;;45163:168;;;;:::o;45337:360::-;45423:3;45451:38;45483:5;45451:38;:::i;:::-;45505:70;45568:6;45563:3;45505:70;:::i;:::-;45498:77;;45584:52;45629:6;45624:3;45617:4;45610:5;45606:16;45584:52;:::i;:::-;45661:29;45683:6;45661:29;:::i;:::-;45656:3;45652:39;45645:46;;45427:270;45337:360;;;;:::o;45703:640::-;45898:4;45936:3;45925:9;45921:19;45913:27;;45950:71;46018:1;46007:9;46003:17;45994:6;45950:71;:::i;:::-;46031:72;46099:2;46088:9;46084:18;46075:6;46031:72;:::i;:::-;46113;46181:2;46170:9;46166:18;46157:6;46113:72;:::i;:::-;46232:9;46226:4;46222:20;46217:2;46206:9;46202:18;46195:48;46260:76;46331:4;46322:6;46260:76;:::i;:::-;46252:84;;45703:640;;;;;;;:::o;46349:141::-;46405:5;46436:6;46430:13;46421:22;;46452:32;46478:5;46452:32;:::i;:::-;46349:141;;;;:::o;46496:349::-;46565:6;46614:2;46602:9;46593:7;46589:23;46585:32;46582:119;;;46620:79;;:::i;:::-;46582:119;46740:1;46765:63;46820:7;46811:6;46800:9;46796:22;46765:63;:::i;:::-;46755:73;;46711:127;46496:349;;;;:::o;46851:233::-;46890:3;46913:24;46931:5;46913:24;:::i;:::-;46904:33;;46959:66;46952:5;46949:77;46946:103;;47029:18;;:::i;:::-;46946:103;47076:1;47069:5;47065:13;47058:20;;46851:233;;;:::o;47090:180::-;47138:77;47135:1;47128:88;47235:4;47232:1;47225:15;47259:4;47256:1;47249:15;47276:185;47316:1;47333:20;47351:1;47333:20;:::i;:::-;47328:25;;47367:20;47385:1;47367:20;:::i;:::-;47362:25;;47406:1;47396:35;;47411:18;;:::i;:::-;47396:35;47453:1;47450;47446:9;47441:14;;47276:185;;;;:::o;47467:176::-;47499:1;47516:20;47534:1;47516:20;:::i;:::-;47511:25;;47550:20;47568:1;47550:20;:::i;:::-;47545:25;;47589:1;47579:35;;47594:18;;:::i;:::-;47579:35;47635:1;47632;47628:9;47623:14;;47467:176;;;;:::o;47649:180::-;47697:77;47694:1;47687:88;47794:4;47791:1;47784:15;47818:4;47815:1;47808:15;47835:220;47975:34;47971:1;47963:6;47959:14;47952:58;48044:3;48039:2;48031:6;48027:15;48020:28;47835:220;:::o;48061:366::-;48203:3;48224:67;48288:2;48283:3;48224:67;:::i;:::-;48217:74;;48300:93;48389:3;48300:93;:::i;:::-;48418:2;48413:3;48409:12;48402:19;;48061:366;;;:::o;48433:419::-;48599:4;48637:2;48626:9;48622:18;48614:26;;48686:9;48680:4;48676:20;48672:1;48661:9;48657:17;48650:47;48714:131;48840:4;48714:131;:::i;:::-;48706:139;;48433:419;;;:::o;48858:227::-;48998:34;48994:1;48986:6;48982:14;48975:58;49067:10;49062:2;49054:6;49050:15;49043:35;48858:227;:::o;49091:366::-;49233:3;49254:67;49318:2;49313:3;49254:67;:::i;:::-;49247:74;;49330:93;49419:3;49330:93;:::i;:::-;49448:2;49443:3;49439:12;49432:19;;49091:366;;;:::o;49463:419::-;49629:4;49667:2;49656:9;49652:18;49644:26;;49716:9;49710:4;49706:20;49702:1;49691:9;49687:17;49680:47;49744:131;49870:4;49744:131;:::i;:::-;49736:139;;49463:419;;;:::o

Swarm Source

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