ETH Price: $3,316.70 (+1.38%)
Gas: 4 Gwei

Token

Faceless Society v2 (FSO)
 

Overview

Max Total Supply

139 FSO

Holders

51

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
5 FSO
0xbdcbb885f49bedfe296006d30f5c52c2678f3acd
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:
FacelessSocietyV2

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-10-30
*/

pragma solidity ^0.8.0;

// SPDX-License-Identifier: MIT
/**
 * @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 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 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);
}

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.
/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

library MerkleProof {
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        bytes32 computedHash = leaf;

        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];

            if (computedHash <= proofElement) { 
                computedHash = keccak256(abi.encodePacked(computedHash, proofElement));
            } else { 
                computedHash = keccak256(abi.encodePacked(proofElement, computedHash));
            }
        } 
        return computedHash == root;
    }
}

contract OffchainProof is Ownable {
    using MerkleProof for bytes32[];
    using SafeMath for uint256;
     
    bytes32 public _root;  
    
    event RootUpdate(bytes32 root, uint256 startBlock);  
    
    function submitRoot(bytes32 root) public onlyOwner {
        
        _root = root;
        emit RootUpdate(root, block.number); 

    }

    function validateTotal(address _address, uint signedCount, bytes memory signature) external view returns (bool) {
        bytes32[] memory meta;
        bytes32[] memory _proof;
        
        (meta, _proof) = splitIntoBytes32(signature, 2);
        if (meta.length != 2) { return false; }
         
        uint256 count = uint256(meta[1]);
        if (_root == 0x0) { return false; }
        
        bytes32 leaf = keccak256( abi.encodePacked( _address, count ) );

        if (_proof.verify(_root, leaf)) {
            return count == signedCount;
        }
        
        return false;
    }
    
    function splitIntoBytes32(bytes memory byteArray, uint256 numBytes32) internal pure returns (bytes32[] memory bytes32Array,
                                                                                        bytes32[] memory remainder) {
        if ( byteArray.length % 32 != 0 ||
             byteArray.length < numBytes32.mul(32) ||
             byteArray.length.div(32) > 50) { // Arbitrarily limiting this function to an array of 50 bytes32's to conserve gas
        
          bytes32Array = new bytes32[](0);
          remainder = new bytes32[](0);
          return (bytes32Array, remainder);
        }
        
        bytes32Array = new bytes32[](numBytes32);
        remainder = new bytes32[](byteArray.length.sub(64).div(32));
        bytes32 _bytes32;
        for (uint256 k = 32; k <= byteArray.length; k = k.add(32)) {
          assembly {
            _bytes32 := mload(add(byteArray, k))
          }
          if(k <= numBytes32*32){
            bytes32Array[k.sub(32).div(32)] = _bytes32;
          } else {
            remainder[k.sub(96).div(32)] = _bytes32;
          }
        }
    }
}

contract FacelessSocietyV2 is ERC721Enumerable, Ownable, OffchainProof {
    using SafeMath for uint256;  

    uint256 public constant MAX_SUPPLY = 4444;
    uint256 public constant MINT_PRICE = 0.06 ether;  
    uint256 public constant MAX_MINT = 50; 

    // assets set asside for genesis collection holders
    uint256 public constant RESERVED_TOKENS = 1000;

    bool private saleIsActive = true;

    mapping(address => uint) claimedCount;
    uint256 public totalMinted; 
    uint256 public totalClaimed; 

    string public baseTokenURI;
   
    constructor(string memory baseURI) ERC721("Faceless Society v2", "FSO"){
        setBaseURI(baseURI);
        _safeMint(msg.sender, 1);
        
        // genesis collection holders snapshot root 
        _root = 0x879213bb8cbde830bdb98e40f7abd5296f19ca14db59b36779d51d7cdabf2d50;
    } 

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

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

    function startSale() public onlyOwner {
        saleIsActive = true;
    }

    function pauseSale() public onlyOwner {
        saleIsActive = false;
    } 
    
    function mintSingleTo(address to, uint tokenId) public onlyOwner { 
        _safeMint(to, tokenId);
    }  
    
    function mintBatchTo(address to, uint noTokens) public onlyOwner {
        uint availableSupply = MAX_SUPPLY.sub(totalSupply());
        require(saleIsActive, "Sale is not active.");
        require(noTokens <= MAX_MINT, "Number of tokens exceeds per transaction limit");
        require(noTokens <= availableSupply, "Purchase would exceed max supply"); 

        for(uint i = 0; i < noTokens; i++) {
            uint mintIndex = totalSupply().add(1);
            if (totalSupply() < MAX_SUPPLY) {
                _safeMint(to, mintIndex);
            }
        }  
    }  

    function batchMint(uint noTokens) public payable {
        uint availableSupply = MAX_SUPPLY.sub(RESERVED_TOKENS).sub(totalMinted);
        require(saleIsActive, "Sale is not active.");
        require(noTokens <= MAX_MINT, "Number of tokens exceeds per transaction limit");
        require(noTokens <= availableSupply, "Purchase would exceed max supply");
        require(MINT_PRICE.mul(noTokens) <= msg.value, "Ether value sent is not correct");

        for(uint i = 0; i < noTokens; i++) {
            uint mintIndex = totalSupply().add(1);
            if (totalSupply() < MAX_SUPPLY) {
                _safeMint(msg.sender, mintIndex);
                totalMinted = totalMinted.add(1);
            }
        }  
    }  
    
    function getClaimedCountFor(address holder) public view returns (uint){
        return claimedCount[holder];
    }

    function claim(uint noTokens, uint total, bytes calldata signature) public { 
        address holder = msg.sender;
        require(this.validateTotal(holder, total, signature), "Invalid parameters.");
        require(saleIsActive, "Sale is not active.");
        require(noTokens > 0, "Amount must be greater than 0.");  
        require(noTokens <= total, "Number of tokens exceeds number of tokens reserved."); 
        require(this.getClaimedCountFor(holder) + noTokens <= total, "Tokens minted would exceed number of tokens reserve.");  
          
        for(uint i = 0; i < noTokens; i++) {
            uint mintIndex = totalSupply().add(1);
            if (totalSupply() < MAX_SUPPLY) {
                _safeMint(holder, mintIndex);
                claimedCount[holder] = claimedCount[holder].add(1); 
                totalClaimed = totalClaimed.add(1);
            }
        }  
        
    }
     
    function _widthdraw(address _address, uint256 _amount) private {
        (bool success, ) = _address.call{value: _amount}("");
        require(success, "Transfer failed.");
    }

    function withdraw() public onlyOwner {
        uint256 balance = address(this).balance;
        require(balance > 0); 
        _widthdraw(msg.sender, balance);
    }
 
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"root","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"startBlock","type":"uint256"}],"name":"RootUpdate","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","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":[],"name":"MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RESERVED_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_root","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"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":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"noTokens","type":"uint256"}],"name":"batchMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"noTokens","type":"uint256"},{"internalType":"uint256","name":"total","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"}],"name":"getClaimedCountFor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"noTokens","type":"uint256"}],"name":"mintBatchTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"mintSingleTo","outputs":[],"stateMutability":"nonpayable","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":"pauseSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"root","type":"bytes32"}],"name":"submitRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"signedCount","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"validateTotal","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526001600c60006101000a81548160ff0219169083151502179055503480156200002c57600080fd5b506040516200689538038062006895833981810160405281019062000052919062000e69565b6040518060400160405280601381526020017f466163656c65737320536f6369657479207632000000000000000000000000008152506040518060400160405280600381526020017f46534f00000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000d692919062000cf2565b508060019080519060200190620000ef92919062000cf2565b50505062000112620001066200016760201b60201c565b6200016f60201b60201c565b62000123816200023560201b60201c565b62000136336001620002e060201b60201c565b7f879213bb8cbde830bdb98e40f7abd5296f19ca14db59b36779d51d7cdabf2d5060001b600b819055505062001551565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002456200016760201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200026b6200030660201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620002c4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002bb90620010bc565b60405180910390fd5b8060109080519060200190620002dc92919062000cf2565b5050565b620003028282604051806020016040528060008152506200033060201b60201c565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6200034283836200039e60201b60201c565b6200035760008484846200058460201b60201c565b62000399576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003909062001034565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000411576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000408906200109a565b60405180910390fd5b62000422816200073e60201b60201c565b1562000465576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200045c9062001056565b60405180910390fd5b6200047960008383620007aa60201b60201c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254620004cb91906200116a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000620005b28473ffffffffffffffffffffffffffffffffffffffff16620008f160201b6200209b1760201c565b1562000731578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02620005e46200016760201b60201c565b8786866040518563ffffffff1660e01b815260040162000608949392919062000fe0565b602060405180830381600087803b1580156200062357600080fd5b505af19250505080156200065757506040513d601f19601f8201168201806040525081019062000654919062000e37565b60015b620006e0573d80600081146200068a576040519150601f19603f3d011682016040523d82523d6000602084013e6200068f565b606091505b50600081511415620006d8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006cf9062001034565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505062000736565b600190505b949350505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b620007c28383836200090460201b620020ae1760201c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156200080f5762000809816200090960201b60201c565b62000857565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161462000856576200085583826200095260201b60201c565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620008a4576200089e8162000acf60201b60201c565b620008ec565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614620008eb57620008ea828262000bab60201b60201c565b5b5b505050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016200096c8462000c3760201b620013311760201c565b620009789190620011c7565b905060006007600084815260200190815260200160002054905081811462000a5e576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905062000ae59190620011c7565b905060006009600084815260200190815260200160002054905060006008838154811062000b185762000b176200139b565b5b90600052602060002001549050806008838154811062000b3d5762000b3c6200139b565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548062000b8f5762000b8e6200136c565b5b6001900381819060005260206000200160009055905550505050565b600062000bc38362000c3760201b620013311760201c565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000cab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000ca29062001078565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b82805462000d0090620012a2565b90600052602060002090601f01602090048101928262000d24576000855562000d70565b82601f1062000d3f57805160ff191683800117855562000d70565b8280016001018555821562000d70579182015b8281111562000d6f57825182559160200191906001019062000d52565b5b50905062000d7f919062000d83565b5090565b5b8082111562000d9e57600081600090555060010162000d84565b5090565b600062000db962000db38462001107565b620010de565b90508281526020810184848401111562000dd85762000dd7620013fe565b5b62000de58482856200126c565b509392505050565b60008151905062000dfe8162001537565b92915050565b600082601f83011262000e1c5762000e1b620013f9565b5b815162000e2e84826020860162000da2565b91505092915050565b60006020828403121562000e505762000e4f62001408565b5b600062000e608482850162000ded565b91505092915050565b60006020828403121562000e825762000e8162001408565b5b600082015167ffffffffffffffff81111562000ea35762000ea262001403565b5b62000eb18482850162000e04565b91505092915050565b62000ec58162001202565b82525050565b600062000ed8826200113d565b62000ee4818562001148565b935062000ef68185602086016200126c565b62000f01816200140d565b840191505092915050565b600062000f1b60328362001159565b915062000f28826200141e565b604082019050919050565b600062000f42601c8362001159565b915062000f4f826200146d565b602082019050919050565b600062000f69602a8362001159565b915062000f768262001496565b604082019050919050565b600062000f9060208362001159565b915062000f9d82620014e5565b602082019050919050565b600062000fb760208362001159565b915062000fc4826200150e565b602082019050919050565b62000fda8162001262565b82525050565b600060808201905062000ff7600083018762000eba565b62001006602083018662000eba565b62001015604083018562000fcf565b818103606083015262001029818462000ecb565b905095945050505050565b600060208201905081810360008301526200104f8162000f0c565b9050919050565b60006020820190508181036000830152620010718162000f33565b9050919050565b60006020820190508181036000830152620010938162000f5a565b9050919050565b60006020820190508181036000830152620010b58162000f81565b9050919050565b60006020820190508181036000830152620010d78162000fa8565b9050919050565b6000620010ea620010fd565b9050620010f88282620012d8565b919050565b6000604051905090565b600067ffffffffffffffff821115620011255762001124620013ca565b5b62001130826200140d565b9050602081019050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b6000620011778262001262565b9150620011848362001262565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115620011bc57620011bb6200130e565b5b828201905092915050565b6000620011d48262001262565b9150620011e18362001262565b925082821015620011f757620011f66200130e565b5b828203905092915050565b60006200120f8262001242565b9050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b838110156200128c5780820151818401526020810190506200126f565b838111156200129c576000848401525b50505050565b60006002820490506001821680620012bb57607f821691505b60208210811415620012d257620012d16200133d565b5b50919050565b620012e3826200140d565b810181811067ffffffffffffffff82111715620013055762001304620013ca565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b620015428162001216565b81146200154e57600080fd5b50565b61533480620015616000396000f3fe6080604052600436106102255760003560e01c80638467be0d11610123578063c61b5862116100ab578063d54ad2a11161006f578063d54ad2a1146107d2578063e8e0b370146107fd578063e985e9c51461083a578063f0292a0314610877578063f2fde38b146108a257610225565b8063c61b5862146106ed578063c87b56dd14610718578063d33a28b214610755578063d52da3ae1461077e578063d547cfb7146107a757610225565b8063a22cb465116100f2578063a22cb4651461062e578063a2309ff814610657578063b66a0e5d14610682578063b88d4fde14610699578063c002d23d146106c257610225565b80638467be0d146105935780638da5cb5b146105af57806395d89b41146105da5780639f9c79911461060557610225565b806342842e0e116101b15780636352211e116101755780636352211e1461049a57806368fc68c7146104d757806370a0823114610502578063715018a61461053f5780637b8bdea81461055657610225565b806342842e0e146103cb5780634f6ccce7146103f457806355367ba91461043157806355f804b3146104485780635eddd1571461047157610225565b806318160ddd116101f857806318160ddd146102f857806323b872dd146103235780632f745c591461034c57806332cb6b0c146103895780633ccfd60b146103b457610225565b806301ffc9a71461022a57806306fdde0314610267578063081812fc14610292578063095ea7b3146102cf575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c9190613ad0565b6108cb565b60405161025e919061429e565b60405180910390f35b34801561027357600080fd5b5061027c610945565b60405161028991906142fd565b60405180910390f35b34801561029e57600080fd5b506102b960048036038101906102b49190613b73565b6109d7565b6040516102c691906141f7565b60405180910390f35b3480156102db57600080fd5b506102f660048036038101906102f191906139c7565b610a5c565b005b34801561030457600080fd5b5061030d610b74565b60405161031a919061467f565b60405180910390f35b34801561032f57600080fd5b5061034a600480360381019061034591906138b1565b610b81565b005b34801561035857600080fd5b50610373600480360381019061036e91906139c7565b610be1565b604051610380919061467f565b60405180910390f35b34801561039557600080fd5b5061039e610c86565b6040516103ab919061467f565b60405180910390f35b3480156103c057600080fd5b506103c9610c8c565b005b3480156103d757600080fd5b506103f260048036038101906103ed91906138b1565b610d27565b005b34801561040057600080fd5b5061041b60048036038101906104169190613b73565b610d47565b604051610428919061467f565b60405180910390f35b34801561043d57600080fd5b50610446610db8565b005b34801561045457600080fd5b5061046f600480360381019061046a9190613b2a565b610e51565b005b34801561047d57600080fd5b5061049860048036038101906104939190613bcd565b610ee7565b005b3480156104a657600080fd5b506104c160048036038101906104bc9190613b73565b611279565b6040516104ce91906141f7565b60405180910390f35b3480156104e357600080fd5b506104ec61132b565b6040516104f9919061467f565b60405180910390f35b34801561050e57600080fd5b5061052960048036038101906105249190613844565b611331565b604051610536919061467f565b60405180910390f35b34801561054b57600080fd5b506105546113e9565b005b34801561056257600080fd5b5061057d60048036038101906105789190613a07565b611471565b60405161058a919061429e565b60405180910390f35b6105ad60048036038101906105a89190613b73565b611540565b005b3480156105bb57600080fd5b506105c461171c565b6040516105d191906141f7565b60405180910390f35b3480156105e657600080fd5b506105ef611746565b6040516105fc91906142fd565b60405180910390f35b34801561061157600080fd5b5061062c600480360381019061062791906139c7565b6117d8565b005b34801561063a57600080fd5b5061065560048036038101906106509190613987565b611862565b005b34801561066357600080fd5b5061066c6119e3565b604051610679919061467f565b60405180910390f35b34801561068e57600080fd5b506106976119e9565b005b3480156106a557600080fd5b506106c060048036038101906106bb9190613904565b611a82565b005b3480156106ce57600080fd5b506106d7611ae4565b6040516106e4919061467f565b60405180910390f35b3480156106f957600080fd5b50610702611aef565b60405161070f91906142b9565b60405180910390f35b34801561072457600080fd5b5061073f600480360381019061073a9190613b73565b611af5565b60405161074c91906142fd565b60405180910390f35b34801561076157600080fd5b5061077c60048036038101906107779190613aa3565b611b9c565b005b34801561078a57600080fd5b506107a560048036038101906107a091906139c7565b611c5b565b005b3480156107b357600080fd5b506107bc611e2d565b6040516107c991906142fd565b60405180910390f35b3480156107de57600080fd5b506107e7611ebb565b6040516107f4919061467f565b60405180910390f35b34801561080957600080fd5b50610824600480360381019061081f9190613844565b611ec1565b604051610831919061467f565b60405180910390f35b34801561084657600080fd5b50610861600480360381019061085c9190613871565b611f0a565b60405161086e919061429e565b60405180910390f35b34801561088357600080fd5b5061088c611f9e565b604051610899919061467f565b60405180910390f35b3480156108ae57600080fd5b506108c960048036038101906108c49190613844565b611fa3565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061093e575061093d826120b3565b5b9050919050565b60606000805461095490614944565b80601f016020809104026020016040519081016040528092919081815260200182805461098090614944565b80156109cd5780601f106109a2576101008083540402835291602001916109cd565b820191906000526020600020905b8154815290600101906020018083116109b057829003601f168201915b5050505050905090565b60006109e282612195565b610a21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a189061451f565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a6782611279565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ad8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610acf906145df565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610af7612201565b73ffffffffffffffffffffffffffffffffffffffff161480610b265750610b2581610b20612201565b611f0a565b5b610b65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5c9061447f565b60405180910390fd5b610b6f8383612209565b505050565b6000600880549050905090565b610b92610b8c612201565b826122c2565b610bd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc89061461f565b60405180910390fd5b610bdc8383836123a0565b505050565b6000610bec83611331565b8210610c2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c249061435f565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61115c81565b610c94612201565b73ffffffffffffffffffffffffffffffffffffffff16610cb261171c565b73ffffffffffffffffffffffffffffffffffffffff1614610d08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cff9061453f565b60405180910390fd5b600047905060008111610d1a57600080fd5b610d2433826125fc565b50565b610d4283838360405180602001604052806000815250611a82565b505050565b6000610d51610b74565b8210610d92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d899061463f565b60405180910390fd5b60088281548110610da657610da5614b15565b5b90600052602060002001549050919050565b610dc0612201565b73ffffffffffffffffffffffffffffffffffffffff16610dde61171c565b73ffffffffffffffffffffffffffffffffffffffff1614610e34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2b9061453f565b60405180910390fd5b6000600c60006101000a81548160ff021916908315150217905550565b610e59612201565b73ffffffffffffffffffffffffffffffffffffffff16610e7761171c565b73ffffffffffffffffffffffffffffffffffffffff1614610ecd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec49061453f565b60405180910390fd5b8060109080519060200190610ee39291906135c3565b5050565b60003390503073ffffffffffffffffffffffffffffffffffffffff16637b8bdea8828686866040518563ffffffff1660e01b8152600401610f2b949392919061425e565b60206040518083038186803b158015610f4357600080fd5b505afa158015610f57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7b9190613a76565b610fba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb1906145bf565b60405180910390fd5b600c60009054906101000a900460ff16611009576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110009061459f565b60405180910390fd5b6000851161104c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110439061431f565b60405180910390fd5b8385111561108f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110869061441f565b60405180910390fd5b83853073ffffffffffffffffffffffffffffffffffffffff1663e8e0b370846040518263ffffffff1660e01b81526004016110ca91906141f7565b60206040518083038186803b1580156110e257600080fd5b505afa1580156110f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111a9190613ba0565b611124919061476f565b1115611165576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115c9061465f565b60405180910390fd5b60005b8581101561127157600061118d600161117f610b74565b6126ad90919063ffffffff16565b905061115c61119a610b74565b101561125d576111aa83826126c3565b6111fd6001600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546126ad90919063ffffffff16565b600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506112566001600f546126ad90919063ffffffff16565b600f819055505b508080611269906149a7565b915050611168565b505050505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611322576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611319906144bf565b60405180910390fd5b80915050919050565b6103e881565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113a2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113999061449f565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6113f1612201565b73ffffffffffffffffffffffffffffffffffffffff1661140f61171c565b73ffffffffffffffffffffffffffffffffffffffff1614611465576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145c9061453f565b60405180910390fd5b61146f60006126e1565b565b60006060806114818460026127a7565b8092508193505050600282511461149d57600092505050611539565b6000826001815181106114b3576114b2614b15565b5b602002602001015160001c90506000801b600b5414156114d95760009350505050611539565b600087826040516020016114ee929190614166565b60405160208183030381529060405280519060200120905061151d600b548285612a389092919063ffffffff16565b1561153057868214945050505050611539565b60009450505050505b9392505050565b600061156d600e5461155f6103e861115c612aee90919063ffffffff16565b612aee90919063ffffffff16565b9050600c60009054906101000a900460ff166115be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b59061459f565b60405180910390fd5b6032821115611602576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f99061433f565b60405180910390fd5b80821115611645576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163c906144df565b60405180910390fd5b346116608366d529ae9e860000612b0490919063ffffffff16565b11156116a1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116989061443f565b60405180910390fd5b60005b828110156117175760006116c960016116bb610b74565b6126ad90919063ffffffff16565b905061115c6116d6610b74565b1015611703576116e633826126c3565b6116fc6001600e546126ad90919063ffffffff16565b600e819055505b50808061170f906149a7565b9150506116a4565b505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461175590614944565b80601f016020809104026020016040519081016040528092919081815260200182805461178190614944565b80156117ce5780601f106117a3576101008083540402835291602001916117ce565b820191906000526020600020905b8154815290600101906020018083116117b157829003601f168201915b5050505050905090565b6117e0612201565b73ffffffffffffffffffffffffffffffffffffffff166117fe61171c565b73ffffffffffffffffffffffffffffffffffffffff1614611854576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184b9061453f565b60405180910390fd5b61185e82826126c3565b5050565b61186a612201565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118cf906143ff565b60405180910390fd5b80600560006118e5612201565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611992612201565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119d7919061429e565b60405180910390a35050565b600e5481565b6119f1612201565b73ffffffffffffffffffffffffffffffffffffffff16611a0f61171c565b73ffffffffffffffffffffffffffffffffffffffff1614611a65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5c9061453f565b60405180910390fd5b6001600c60006101000a81548160ff021916908315150217905550565b611a93611a8d612201565b836122c2565b611ad2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac99061461f565b60405180910390fd5b611ade84848484612b1a565b50505050565b66d529ae9e86000081565b600b5481565b6060611b0082612195565b611b3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b369061457f565b60405180910390fd5b6000611b49612b76565b90506000815111611b695760405180602001604052806000815250611b94565b80611b7384612c08565b604051602001611b849291906141be565b6040516020818303038152906040525b915050919050565b611ba4612201565b73ffffffffffffffffffffffffffffffffffffffff16611bc261171c565b73ffffffffffffffffffffffffffffffffffffffff1614611c18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0f9061453f565b60405180910390fd5b80600b819055507f451c8006982ef9f00fc7be206b4140c6ab4ac4beac4036cf4f409c03ce78c2458143604051611c509291906142d4565b60405180910390a150565b611c63612201565b73ffffffffffffffffffffffffffffffffffffffff16611c8161171c565b73ffffffffffffffffffffffffffffffffffffffff1614611cd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cce9061453f565b60405180910390fd5b6000611cf5611ce4610b74565b61115c612aee90919063ffffffff16565b9050600c60009054906101000a900460ff16611d46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3d9061459f565b60405180910390fd5b6032821115611d8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d819061433f565b60405180910390fd5b80821115611dcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc4906144df565b60405180910390fd5b60005b82811015611e27576000611df56001611de7610b74565b6126ad90919063ffffffff16565b905061115c611e02610b74565b1015611e1357611e1285826126c3565b5b508080611e1f906149a7565b915050611dd0565b50505050565b60108054611e3a90614944565b80601f0160208091040260200160405190810160405280929190818152602001828054611e6690614944565b8015611eb35780601f10611e8857610100808354040283529160200191611eb3565b820191906000526020600020905b815481529060010190602001808311611e9657829003601f168201915b505050505081565b600f5481565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b603281565b611fab612201565b73ffffffffffffffffffffffffffffffffffffffff16611fc961171c565b73ffffffffffffffffffffffffffffffffffffffff161461201f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120169061453f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561208f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120869061439f565b60405180910390fd5b612098816126e1565b50565b600080823b905060008111915050919050565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061217e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061218e575061218d82612d69565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661227c83611279565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006122cd82612195565b61230c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123039061445f565b60405180910390fd5b600061231783611279565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061238657508373ffffffffffffffffffffffffffffffffffffffff1661236e846109d7565b73ffffffffffffffffffffffffffffffffffffffff16145b8061239757506123968185611f0a565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166123c082611279565b73ffffffffffffffffffffffffffffffffffffffff1614612416576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240d9061455f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612486576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247d906143df565b60405180910390fd5b612491838383612dd3565b61249c600082612209565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124ec9190614850565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612543919061476f565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612622906141e2565b60006040518083038185875af1925050503d806000811461265f576040519150601f19603f3d011682016040523d82523d6000602084013e612664565b606091505b50509050806126a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269f906145ff565b60405180910390fd5b505050565b600081836126bb919061476f565b905092915050565b6126dd828260405180602001604052806000815250612ee7565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6060806000602085516127ba9190614a28565b1415806127da57506127d6602084612b0490919063ffffffff16565b8451105b806127f9575060326127f760208651612f4290919063ffffffff16565b115b1561289b57600067ffffffffffffffff81111561281957612818614b44565b5b6040519080825280602002602001820160405280156128475781602001602082028036833780820191505090505b509150600067ffffffffffffffff81111561286557612864614b44565b5b6040519080825280602002602001820160405280156128935781602001602082028036833780820191505090505b509050612a31565b8267ffffffffffffffff8111156128b5576128b4614b44565b5b6040519080825280602002602001820160405280156128e35781602001602082028036833780820191505090505b50915061290e602061290060408751612aee90919063ffffffff16565b612f4290919063ffffffff16565b67ffffffffffffffff81111561292757612926614b44565b5b6040519080825280602002602001820160405280156129555781602001602082028036833780820191505090505b509050600080602090505b85518111612a2e5780860151915060208561297b91906147f6565b81116129cc5781846129aa602061299c602086612aee90919063ffffffff16565b612f4290919063ffffffff16565b815181106129bb576129ba614b15565b5b602002602001018181525050612a13565b81836129f560206129e7606086612aee90919063ffffffff16565b612f4290919063ffffffff16565b81518110612a0657612a05614b15565b5b6020026020010181815250505b612a276020826126ad90919063ffffffff16565b9050612960565b50505b9250929050565b60008082905060005b8551811015612ae0576000868281518110612a5f57612a5e614b15565b5b60200260200101519050808311612aa0578281604051602001612a83929190614192565b604051602081830303815290604052805190602001209250612acc565b8083604051602001612ab3929190614192565b6040516020818303038152906040528051906020012092505b508080612ad8906149a7565b915050612a41565b508381149150509392505050565b60008183612afc9190614850565b905092915050565b60008183612b1291906147f6565b905092915050565b612b258484846123a0565b612b3184848484612f58565b612b70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b679061437f565b60405180910390fd5b50505050565b606060108054612b8590614944565b80601f0160208091040260200160405190810160405280929190818152602001828054612bb190614944565b8015612bfe5780601f10612bd357610100808354040283529160200191612bfe565b820191906000526020600020905b815481529060010190602001808311612be157829003601f168201915b5050505050905090565b60606000821415612c50576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612d64565b600082905060005b60008214612c82578080612c6b906149a7565b915050600a82612c7b91906147c5565b9150612c58565b60008167ffffffffffffffff811115612c9e57612c9d614b44565b5b6040519080825280601f01601f191660200182016040528015612cd05781602001600182028036833780820191505090505b5090505b60008514612d5d57600182612ce99190614850565b9150600a85612cf89190614a28565b6030612d04919061476f565b60f81b818381518110612d1a57612d19614b15565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612d5691906147c5565b9450612cd4565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612dde8383836120ae565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612e2157612e1c816130ef565b612e60565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612e5f57612e5e8382613138565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ea357612e9e816132a5565b612ee2565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612ee157612ee08282613376565b5b5b505050565b612ef183836133f5565b612efe6000848484612f58565b612f3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f349061437f565b60405180910390fd5b505050565b60008183612f5091906147c5565b905092915050565b6000612f798473ffffffffffffffffffffffffffffffffffffffff1661209b565b156130e2578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612fa2612201565b8786866040518563ffffffff1660e01b8152600401612fc49493929190614212565b602060405180830381600087803b158015612fde57600080fd5b505af192505050801561300f57506040513d601f19601f8201168201806040525081019061300c9190613afd565b60015b613092573d806000811461303f576040519150601f19603f3d011682016040523d82523d6000602084013e613044565b606091505b5060008151141561308a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130819061437f565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506130e7565b600190505b949350505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161314584611331565b61314f9190614850565b9050600060076000848152602001908152602001600020549050818114613234576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506132b99190614850565b90506000600960008481526020019081526020016000205490506000600883815481106132e9576132e8614b15565b5b90600052602060002001549050806008838154811061330b5761330a614b15565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061335a57613359614ae6565b5b6001900381819060005260206000200160009055905550505050565b600061338183611331565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613465576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161345c906144ff565b60405180910390fd5b61346e81612195565b156134ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134a5906143bf565b60405180910390fd5b6134ba60008383612dd3565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461350a919061476f565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b8280546135cf90614944565b90600052602060002090601f0160209004810192826135f15760008555613638565b82601f1061360a57805160ff1916838001178555613638565b82800160010185558215613638579182015b8281111561363757825182559160200191906001019061361c565b5b5090506136459190613649565b5090565b5b8082111561366257600081600090555060010161364a565b5090565b6000613679613674846146bf565b61469a565b90508281526020810184848401111561369557613694614b82565b5b6136a0848285614902565b509392505050565b60006136bb6136b6846146f0565b61469a565b9050828152602081018484840111156136d7576136d6614b82565b5b6136e2848285614902565b509392505050565b6000813590506136f98161528b565b92915050565b60008135905061370e816152a2565b92915050565b600081519050613723816152a2565b92915050565b600081359050613738816152b9565b92915050565b60008135905061374d816152d0565b92915050565b600081519050613762816152d0565b92915050565b60008083601f84011261377e5761377d614b78565b5b8235905067ffffffffffffffff81111561379b5761379a614b73565b5b6020830191508360018202830111156137b7576137b6614b7d565b5b9250929050565b600082601f8301126137d3576137d2614b78565b5b81356137e3848260208601613666565b91505092915050565b600082601f83011261380157613800614b78565b5b81356138118482602086016136a8565b91505092915050565b600081359050613829816152e7565b92915050565b60008151905061383e816152e7565b92915050565b60006020828403121561385a57613859614b8c565b5b6000613868848285016136ea565b91505092915050565b6000806040838503121561388857613887614b8c565b5b6000613896858286016136ea565b92505060206138a7858286016136ea565b9150509250929050565b6000806000606084860312156138ca576138c9614b8c565b5b60006138d8868287016136ea565b93505060206138e9868287016136ea565b92505060406138fa8682870161381a565b9150509250925092565b6000806000806080858703121561391e5761391d614b8c565b5b600061392c878288016136ea565b945050602061393d878288016136ea565b935050604061394e8782880161381a565b925050606085013567ffffffffffffffff81111561396f5761396e614b87565b5b61397b878288016137be565b91505092959194509250565b6000806040838503121561399e5761399d614b8c565b5b60006139ac858286016136ea565b92505060206139bd858286016136ff565b9150509250929050565b600080604083850312156139de576139dd614b8c565b5b60006139ec858286016136ea565b92505060206139fd8582860161381a565b9150509250929050565b600080600060608486031215613a2057613a1f614b8c565b5b6000613a2e868287016136ea565b9350506020613a3f8682870161381a565b925050604084013567ffffffffffffffff811115613a6057613a5f614b87565b5b613a6c868287016137be565b9150509250925092565b600060208284031215613a8c57613a8b614b8c565b5b6000613a9a84828501613714565b91505092915050565b600060208284031215613ab957613ab8614b8c565b5b6000613ac784828501613729565b91505092915050565b600060208284031215613ae657613ae5614b8c565b5b6000613af48482850161373e565b91505092915050565b600060208284031215613b1357613b12614b8c565b5b6000613b2184828501613753565b91505092915050565b600060208284031215613b4057613b3f614b8c565b5b600082013567ffffffffffffffff811115613b5e57613b5d614b87565b5b613b6a848285016137ec565b91505092915050565b600060208284031215613b8957613b88614b8c565b5b6000613b978482850161381a565b91505092915050565b600060208284031215613bb657613bb5614b8c565b5b6000613bc48482850161382f565b91505092915050565b60008060008060608587031215613be757613be6614b8c565b5b6000613bf58782880161381a565b9450506020613c068782880161381a565b935050604085013567ffffffffffffffff811115613c2757613c26614b87565b5b613c3387828801613768565b925092505092959194509250565b613c4a81614884565b82525050565b613c61613c5c82614884565b6149f0565b82525050565b613c7081614896565b82525050565b613c7f816148a2565b82525050565b613c96613c91826148a2565b614a02565b82525050565b6000613ca88385614737565b9350613cb5838584614902565b613cbe83614b91565b840190509392505050565b6000613cd482614721565b613cde8185614737565b9350613cee818560208601614911565b613cf781614b91565b840191505092915050565b6000613d0d8261472c565b613d178185614753565b9350613d27818560208601614911565b613d3081614b91565b840191505092915050565b6000613d468261472c565b613d508185614764565b9350613d60818560208601614911565b80840191505092915050565b6000613d79601e83614753565b9150613d8482614baf565b602082019050919050565b6000613d9c602e83614753565b9150613da782614bd8565b604082019050919050565b6000613dbf602b83614753565b9150613dca82614c27565b604082019050919050565b6000613de2603283614753565b9150613ded82614c76565b604082019050919050565b6000613e05602683614753565b9150613e1082614cc5565b604082019050919050565b6000613e28601c83614753565b9150613e3382614d14565b602082019050919050565b6000613e4b602483614753565b9150613e5682614d3d565b604082019050919050565b6000613e6e601983614753565b9150613e7982614d8c565b602082019050919050565b6000613e91603383614753565b9150613e9c82614db5565b604082019050919050565b6000613eb4601f83614753565b9150613ebf82614e04565b602082019050919050565b6000613ed7602c83614753565b9150613ee282614e2d565b604082019050919050565b6000613efa603883614753565b9150613f0582614e7c565b604082019050919050565b6000613f1d602a83614753565b9150613f2882614ecb565b604082019050919050565b6000613f40602983614753565b9150613f4b82614f1a565b604082019050919050565b6000613f63602083614753565b9150613f6e82614f69565b602082019050919050565b6000613f86602083614753565b9150613f9182614f92565b602082019050919050565b6000613fa9602c83614753565b9150613fb482614fbb565b604082019050919050565b6000613fcc602083614753565b9150613fd78261500a565b602082019050919050565b6000613fef602983614753565b9150613ffa82615033565b604082019050919050565b6000614012602f83614753565b915061401d82615082565b604082019050919050565b6000614035601383614753565b9150614040826150d1565b602082019050919050565b6000614058601383614753565b9150614063826150fa565b602082019050919050565b600061407b602183614753565b915061408682615123565b604082019050919050565b600061409e600083614748565b91506140a982615172565b600082019050919050565b60006140c1601083614753565b91506140cc82615175565b602082019050919050565b60006140e4603183614753565b91506140ef8261519e565b604082019050919050565b6000614107602c83614753565b9150614112826151ed565b604082019050919050565b600061412a603483614753565b91506141358261523c565b604082019050919050565b614149816148f8565b82525050565b61416061415b826148f8565b614a1e565b82525050565b60006141728285613c50565b601482019150614182828461414f565b6020820191508190509392505050565b600061419e8285613c85565b6020820191506141ae8284613c85565b6020820191508190509392505050565b60006141ca8285613d3b565b91506141d68284613d3b565b91508190509392505050565b60006141ed82614091565b9150819050919050565b600060208201905061420c6000830184613c41565b92915050565b60006080820190506142276000830187613c41565b6142346020830186613c41565b6142416040830185614140565b81810360608301526142538184613cc9565b905095945050505050565b60006060820190506142736000830187613c41565b6142806020830186614140565b8181036040830152614293818486613c9c565b905095945050505050565b60006020820190506142b36000830184613c67565b92915050565b60006020820190506142ce6000830184613c76565b92915050565b60006040820190506142e96000830185613c76565b6142f66020830184614140565b9392505050565b600060208201905081810360008301526143178184613d02565b905092915050565b6000602082019050818103600083015261433881613d6c565b9050919050565b6000602082019050818103600083015261435881613d8f565b9050919050565b6000602082019050818103600083015261437881613db2565b9050919050565b6000602082019050818103600083015261439881613dd5565b9050919050565b600060208201905081810360008301526143b881613df8565b9050919050565b600060208201905081810360008301526143d881613e1b565b9050919050565b600060208201905081810360008301526143f881613e3e565b9050919050565b6000602082019050818103600083015261441881613e61565b9050919050565b6000602082019050818103600083015261443881613e84565b9050919050565b6000602082019050818103600083015261445881613ea7565b9050919050565b6000602082019050818103600083015261447881613eca565b9050919050565b6000602082019050818103600083015261449881613eed565b9050919050565b600060208201905081810360008301526144b881613f10565b9050919050565b600060208201905081810360008301526144d881613f33565b9050919050565b600060208201905081810360008301526144f881613f56565b9050919050565b6000602082019050818103600083015261451881613f79565b9050919050565b6000602082019050818103600083015261453881613f9c565b9050919050565b6000602082019050818103600083015261455881613fbf565b9050919050565b6000602082019050818103600083015261457881613fe2565b9050919050565b6000602082019050818103600083015261459881614005565b9050919050565b600060208201905081810360008301526145b881614028565b9050919050565b600060208201905081810360008301526145d88161404b565b9050919050565b600060208201905081810360008301526145f88161406e565b9050919050565b60006020820190508181036000830152614618816140b4565b9050919050565b60006020820190508181036000830152614638816140d7565b9050919050565b60006020820190508181036000830152614658816140fa565b9050919050565b600060208201905081810360008301526146788161411d565b9050919050565b60006020820190506146946000830184614140565b92915050565b60006146a46146b5565b90506146b08282614976565b919050565b6000604051905090565b600067ffffffffffffffff8211156146da576146d9614b44565b5b6146e382614b91565b9050602081019050919050565b600067ffffffffffffffff82111561470b5761470a614b44565b5b61471482614b91565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061477a826148f8565b9150614785836148f8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156147ba576147b9614a59565b5b828201905092915050565b60006147d0826148f8565b91506147db836148f8565b9250826147eb576147ea614a88565b5b828204905092915050565b6000614801826148f8565b915061480c836148f8565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561484557614844614a59565b5b828202905092915050565b600061485b826148f8565b9150614866836148f8565b92508282101561487957614878614a59565b5b828203905092915050565b600061488f826148d8565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561492f578082015181840152602081019050614914565b8381111561493e576000848401525b50505050565b6000600282049050600182168061495c57607f821691505b602082108114156149705761496f614ab7565b5b50919050565b61497f82614b91565b810181811067ffffffffffffffff8211171561499e5761499d614b44565b5b80604052505050565b60006149b2826148f8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156149e5576149e4614a59565b5b600182019050919050565b60006149fb82614a0c565b9050919050565b6000819050919050565b6000614a1782614ba2565b9050919050565b6000819050919050565b6000614a33826148f8565b9150614a3e836148f8565b925082614a4e57614a4d614a88565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f416d6f756e74206d7573742062652067726561746572207468616e20302e0000600082015250565b7f4e756d626572206f6620746f6b656e732065786365656473207065722074726160008201527f6e73616374696f6e206c696d6974000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4e756d626572206f6620746f6b656e732065786365656473206e756d6265722060008201527f6f6620746f6b656e732072657365727665642e00000000000000000000000000602082015250565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564206d617820737570706c79600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f53616c65206973206e6f74206163746976652e00000000000000000000000000600082015250565b7f496e76616c696420706172616d65746572732e00000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f546f6b656e73206d696e74656420776f756c6420657863656564206e756d626560008201527f72206f6620746f6b656e7320726573657276652e000000000000000000000000602082015250565b61529481614884565b811461529f57600080fd5b50565b6152ab81614896565b81146152b657600080fd5b50565b6152c2816148a2565b81146152cd57600080fd5b50565b6152d9816148ac565b81146152e457600080fd5b50565b6152f0816148f8565b81146152fb57600080fd5b5056fea2646970667358221220a7e4f775e6d4be18e5d7a65fc2e563949fbea3bfd89beaff236e9a23433c0f2d64736f6c6343000807003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d544e4339587067666a554856453564564373533436524d44456579426a725a6845716931384e41364158334c2f00000000000000000000

Deployed Bytecode

0x6080604052600436106102255760003560e01c80638467be0d11610123578063c61b5862116100ab578063d54ad2a11161006f578063d54ad2a1146107d2578063e8e0b370146107fd578063e985e9c51461083a578063f0292a0314610877578063f2fde38b146108a257610225565b8063c61b5862146106ed578063c87b56dd14610718578063d33a28b214610755578063d52da3ae1461077e578063d547cfb7146107a757610225565b8063a22cb465116100f2578063a22cb4651461062e578063a2309ff814610657578063b66a0e5d14610682578063b88d4fde14610699578063c002d23d146106c257610225565b80638467be0d146105935780638da5cb5b146105af57806395d89b41146105da5780639f9c79911461060557610225565b806342842e0e116101b15780636352211e116101755780636352211e1461049a57806368fc68c7146104d757806370a0823114610502578063715018a61461053f5780637b8bdea81461055657610225565b806342842e0e146103cb5780634f6ccce7146103f457806355367ba91461043157806355f804b3146104485780635eddd1571461047157610225565b806318160ddd116101f857806318160ddd146102f857806323b872dd146103235780632f745c591461034c57806332cb6b0c146103895780633ccfd60b146103b457610225565b806301ffc9a71461022a57806306fdde0314610267578063081812fc14610292578063095ea7b3146102cf575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c9190613ad0565b6108cb565b60405161025e919061429e565b60405180910390f35b34801561027357600080fd5b5061027c610945565b60405161028991906142fd565b60405180910390f35b34801561029e57600080fd5b506102b960048036038101906102b49190613b73565b6109d7565b6040516102c691906141f7565b60405180910390f35b3480156102db57600080fd5b506102f660048036038101906102f191906139c7565b610a5c565b005b34801561030457600080fd5b5061030d610b74565b60405161031a919061467f565b60405180910390f35b34801561032f57600080fd5b5061034a600480360381019061034591906138b1565b610b81565b005b34801561035857600080fd5b50610373600480360381019061036e91906139c7565b610be1565b604051610380919061467f565b60405180910390f35b34801561039557600080fd5b5061039e610c86565b6040516103ab919061467f565b60405180910390f35b3480156103c057600080fd5b506103c9610c8c565b005b3480156103d757600080fd5b506103f260048036038101906103ed91906138b1565b610d27565b005b34801561040057600080fd5b5061041b60048036038101906104169190613b73565b610d47565b604051610428919061467f565b60405180910390f35b34801561043d57600080fd5b50610446610db8565b005b34801561045457600080fd5b5061046f600480360381019061046a9190613b2a565b610e51565b005b34801561047d57600080fd5b5061049860048036038101906104939190613bcd565b610ee7565b005b3480156104a657600080fd5b506104c160048036038101906104bc9190613b73565b611279565b6040516104ce91906141f7565b60405180910390f35b3480156104e357600080fd5b506104ec61132b565b6040516104f9919061467f565b60405180910390f35b34801561050e57600080fd5b5061052960048036038101906105249190613844565b611331565b604051610536919061467f565b60405180910390f35b34801561054b57600080fd5b506105546113e9565b005b34801561056257600080fd5b5061057d60048036038101906105789190613a07565b611471565b60405161058a919061429e565b60405180910390f35b6105ad60048036038101906105a89190613b73565b611540565b005b3480156105bb57600080fd5b506105c461171c565b6040516105d191906141f7565b60405180910390f35b3480156105e657600080fd5b506105ef611746565b6040516105fc91906142fd565b60405180910390f35b34801561061157600080fd5b5061062c600480360381019061062791906139c7565b6117d8565b005b34801561063a57600080fd5b5061065560048036038101906106509190613987565b611862565b005b34801561066357600080fd5b5061066c6119e3565b604051610679919061467f565b60405180910390f35b34801561068e57600080fd5b506106976119e9565b005b3480156106a557600080fd5b506106c060048036038101906106bb9190613904565b611a82565b005b3480156106ce57600080fd5b506106d7611ae4565b6040516106e4919061467f565b60405180910390f35b3480156106f957600080fd5b50610702611aef565b60405161070f91906142b9565b60405180910390f35b34801561072457600080fd5b5061073f600480360381019061073a9190613b73565b611af5565b60405161074c91906142fd565b60405180910390f35b34801561076157600080fd5b5061077c60048036038101906107779190613aa3565b611b9c565b005b34801561078a57600080fd5b506107a560048036038101906107a091906139c7565b611c5b565b005b3480156107b357600080fd5b506107bc611e2d565b6040516107c991906142fd565b60405180910390f35b3480156107de57600080fd5b506107e7611ebb565b6040516107f4919061467f565b60405180910390f35b34801561080957600080fd5b50610824600480360381019061081f9190613844565b611ec1565b604051610831919061467f565b60405180910390f35b34801561084657600080fd5b50610861600480360381019061085c9190613871565b611f0a565b60405161086e919061429e565b60405180910390f35b34801561088357600080fd5b5061088c611f9e565b604051610899919061467f565b60405180910390f35b3480156108ae57600080fd5b506108c960048036038101906108c49190613844565b611fa3565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061093e575061093d826120b3565b5b9050919050565b60606000805461095490614944565b80601f016020809104026020016040519081016040528092919081815260200182805461098090614944565b80156109cd5780601f106109a2576101008083540402835291602001916109cd565b820191906000526020600020905b8154815290600101906020018083116109b057829003601f168201915b5050505050905090565b60006109e282612195565b610a21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a189061451f565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a6782611279565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ad8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610acf906145df565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610af7612201565b73ffffffffffffffffffffffffffffffffffffffff161480610b265750610b2581610b20612201565b611f0a565b5b610b65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5c9061447f565b60405180910390fd5b610b6f8383612209565b505050565b6000600880549050905090565b610b92610b8c612201565b826122c2565b610bd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc89061461f565b60405180910390fd5b610bdc8383836123a0565b505050565b6000610bec83611331565b8210610c2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c249061435f565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61115c81565b610c94612201565b73ffffffffffffffffffffffffffffffffffffffff16610cb261171c565b73ffffffffffffffffffffffffffffffffffffffff1614610d08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cff9061453f565b60405180910390fd5b600047905060008111610d1a57600080fd5b610d2433826125fc565b50565b610d4283838360405180602001604052806000815250611a82565b505050565b6000610d51610b74565b8210610d92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d899061463f565b60405180910390fd5b60088281548110610da657610da5614b15565b5b90600052602060002001549050919050565b610dc0612201565b73ffffffffffffffffffffffffffffffffffffffff16610dde61171c565b73ffffffffffffffffffffffffffffffffffffffff1614610e34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2b9061453f565b60405180910390fd5b6000600c60006101000a81548160ff021916908315150217905550565b610e59612201565b73ffffffffffffffffffffffffffffffffffffffff16610e7761171c565b73ffffffffffffffffffffffffffffffffffffffff1614610ecd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec49061453f565b60405180910390fd5b8060109080519060200190610ee39291906135c3565b5050565b60003390503073ffffffffffffffffffffffffffffffffffffffff16637b8bdea8828686866040518563ffffffff1660e01b8152600401610f2b949392919061425e565b60206040518083038186803b158015610f4357600080fd5b505afa158015610f57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7b9190613a76565b610fba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb1906145bf565b60405180910390fd5b600c60009054906101000a900460ff16611009576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110009061459f565b60405180910390fd5b6000851161104c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110439061431f565b60405180910390fd5b8385111561108f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110869061441f565b60405180910390fd5b83853073ffffffffffffffffffffffffffffffffffffffff1663e8e0b370846040518263ffffffff1660e01b81526004016110ca91906141f7565b60206040518083038186803b1580156110e257600080fd5b505afa1580156110f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111a9190613ba0565b611124919061476f565b1115611165576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115c9061465f565b60405180910390fd5b60005b8581101561127157600061118d600161117f610b74565b6126ad90919063ffffffff16565b905061115c61119a610b74565b101561125d576111aa83826126c3565b6111fd6001600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546126ad90919063ffffffff16565b600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506112566001600f546126ad90919063ffffffff16565b600f819055505b508080611269906149a7565b915050611168565b505050505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611322576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611319906144bf565b60405180910390fd5b80915050919050565b6103e881565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113a2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113999061449f565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6113f1612201565b73ffffffffffffffffffffffffffffffffffffffff1661140f61171c565b73ffffffffffffffffffffffffffffffffffffffff1614611465576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145c9061453f565b60405180910390fd5b61146f60006126e1565b565b60006060806114818460026127a7565b8092508193505050600282511461149d57600092505050611539565b6000826001815181106114b3576114b2614b15565b5b602002602001015160001c90506000801b600b5414156114d95760009350505050611539565b600087826040516020016114ee929190614166565b60405160208183030381529060405280519060200120905061151d600b548285612a389092919063ffffffff16565b1561153057868214945050505050611539565b60009450505050505b9392505050565b600061156d600e5461155f6103e861115c612aee90919063ffffffff16565b612aee90919063ffffffff16565b9050600c60009054906101000a900460ff166115be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b59061459f565b60405180910390fd5b6032821115611602576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f99061433f565b60405180910390fd5b80821115611645576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163c906144df565b60405180910390fd5b346116608366d529ae9e860000612b0490919063ffffffff16565b11156116a1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116989061443f565b60405180910390fd5b60005b828110156117175760006116c960016116bb610b74565b6126ad90919063ffffffff16565b905061115c6116d6610b74565b1015611703576116e633826126c3565b6116fc6001600e546126ad90919063ffffffff16565b600e819055505b50808061170f906149a7565b9150506116a4565b505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461175590614944565b80601f016020809104026020016040519081016040528092919081815260200182805461178190614944565b80156117ce5780601f106117a3576101008083540402835291602001916117ce565b820191906000526020600020905b8154815290600101906020018083116117b157829003601f168201915b5050505050905090565b6117e0612201565b73ffffffffffffffffffffffffffffffffffffffff166117fe61171c565b73ffffffffffffffffffffffffffffffffffffffff1614611854576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184b9061453f565b60405180910390fd5b61185e82826126c3565b5050565b61186a612201565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118cf906143ff565b60405180910390fd5b80600560006118e5612201565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611992612201565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119d7919061429e565b60405180910390a35050565b600e5481565b6119f1612201565b73ffffffffffffffffffffffffffffffffffffffff16611a0f61171c565b73ffffffffffffffffffffffffffffffffffffffff1614611a65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5c9061453f565b60405180910390fd5b6001600c60006101000a81548160ff021916908315150217905550565b611a93611a8d612201565b836122c2565b611ad2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac99061461f565b60405180910390fd5b611ade84848484612b1a565b50505050565b66d529ae9e86000081565b600b5481565b6060611b0082612195565b611b3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b369061457f565b60405180910390fd5b6000611b49612b76565b90506000815111611b695760405180602001604052806000815250611b94565b80611b7384612c08565b604051602001611b849291906141be565b6040516020818303038152906040525b915050919050565b611ba4612201565b73ffffffffffffffffffffffffffffffffffffffff16611bc261171c565b73ffffffffffffffffffffffffffffffffffffffff1614611c18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0f9061453f565b60405180910390fd5b80600b819055507f451c8006982ef9f00fc7be206b4140c6ab4ac4beac4036cf4f409c03ce78c2458143604051611c509291906142d4565b60405180910390a150565b611c63612201565b73ffffffffffffffffffffffffffffffffffffffff16611c8161171c565b73ffffffffffffffffffffffffffffffffffffffff1614611cd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cce9061453f565b60405180910390fd5b6000611cf5611ce4610b74565b61115c612aee90919063ffffffff16565b9050600c60009054906101000a900460ff16611d46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3d9061459f565b60405180910390fd5b6032821115611d8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d819061433f565b60405180910390fd5b80821115611dcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc4906144df565b60405180910390fd5b60005b82811015611e27576000611df56001611de7610b74565b6126ad90919063ffffffff16565b905061115c611e02610b74565b1015611e1357611e1285826126c3565b5b508080611e1f906149a7565b915050611dd0565b50505050565b60108054611e3a90614944565b80601f0160208091040260200160405190810160405280929190818152602001828054611e6690614944565b8015611eb35780601f10611e8857610100808354040283529160200191611eb3565b820191906000526020600020905b815481529060010190602001808311611e9657829003601f168201915b505050505081565b600f5481565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b603281565b611fab612201565b73ffffffffffffffffffffffffffffffffffffffff16611fc961171c565b73ffffffffffffffffffffffffffffffffffffffff161461201f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120169061453f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561208f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120869061439f565b60405180910390fd5b612098816126e1565b50565b600080823b905060008111915050919050565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061217e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061218e575061218d82612d69565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661227c83611279565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006122cd82612195565b61230c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123039061445f565b60405180910390fd5b600061231783611279565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061238657508373ffffffffffffffffffffffffffffffffffffffff1661236e846109d7565b73ffffffffffffffffffffffffffffffffffffffff16145b8061239757506123968185611f0a565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166123c082611279565b73ffffffffffffffffffffffffffffffffffffffff1614612416576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240d9061455f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612486576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247d906143df565b60405180910390fd5b612491838383612dd3565b61249c600082612209565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124ec9190614850565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612543919061476f565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612622906141e2565b60006040518083038185875af1925050503d806000811461265f576040519150601f19603f3d011682016040523d82523d6000602084013e612664565b606091505b50509050806126a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269f906145ff565b60405180910390fd5b505050565b600081836126bb919061476f565b905092915050565b6126dd828260405180602001604052806000815250612ee7565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6060806000602085516127ba9190614a28565b1415806127da57506127d6602084612b0490919063ffffffff16565b8451105b806127f9575060326127f760208651612f4290919063ffffffff16565b115b1561289b57600067ffffffffffffffff81111561281957612818614b44565b5b6040519080825280602002602001820160405280156128475781602001602082028036833780820191505090505b509150600067ffffffffffffffff81111561286557612864614b44565b5b6040519080825280602002602001820160405280156128935781602001602082028036833780820191505090505b509050612a31565b8267ffffffffffffffff8111156128b5576128b4614b44565b5b6040519080825280602002602001820160405280156128e35781602001602082028036833780820191505090505b50915061290e602061290060408751612aee90919063ffffffff16565b612f4290919063ffffffff16565b67ffffffffffffffff81111561292757612926614b44565b5b6040519080825280602002602001820160405280156129555781602001602082028036833780820191505090505b509050600080602090505b85518111612a2e5780860151915060208561297b91906147f6565b81116129cc5781846129aa602061299c602086612aee90919063ffffffff16565b612f4290919063ffffffff16565b815181106129bb576129ba614b15565b5b602002602001018181525050612a13565b81836129f560206129e7606086612aee90919063ffffffff16565b612f4290919063ffffffff16565b81518110612a0657612a05614b15565b5b6020026020010181815250505b612a276020826126ad90919063ffffffff16565b9050612960565b50505b9250929050565b60008082905060005b8551811015612ae0576000868281518110612a5f57612a5e614b15565b5b60200260200101519050808311612aa0578281604051602001612a83929190614192565b604051602081830303815290604052805190602001209250612acc565b8083604051602001612ab3929190614192565b6040516020818303038152906040528051906020012092505b508080612ad8906149a7565b915050612a41565b508381149150509392505050565b60008183612afc9190614850565b905092915050565b60008183612b1291906147f6565b905092915050565b612b258484846123a0565b612b3184848484612f58565b612b70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b679061437f565b60405180910390fd5b50505050565b606060108054612b8590614944565b80601f0160208091040260200160405190810160405280929190818152602001828054612bb190614944565b8015612bfe5780601f10612bd357610100808354040283529160200191612bfe565b820191906000526020600020905b815481529060010190602001808311612be157829003601f168201915b5050505050905090565b60606000821415612c50576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612d64565b600082905060005b60008214612c82578080612c6b906149a7565b915050600a82612c7b91906147c5565b9150612c58565b60008167ffffffffffffffff811115612c9e57612c9d614b44565b5b6040519080825280601f01601f191660200182016040528015612cd05781602001600182028036833780820191505090505b5090505b60008514612d5d57600182612ce99190614850565b9150600a85612cf89190614a28565b6030612d04919061476f565b60f81b818381518110612d1a57612d19614b15565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612d5691906147c5565b9450612cd4565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612dde8383836120ae565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612e2157612e1c816130ef565b612e60565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612e5f57612e5e8382613138565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ea357612e9e816132a5565b612ee2565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612ee157612ee08282613376565b5b5b505050565b612ef183836133f5565b612efe6000848484612f58565b612f3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f349061437f565b60405180910390fd5b505050565b60008183612f5091906147c5565b905092915050565b6000612f798473ffffffffffffffffffffffffffffffffffffffff1661209b565b156130e2578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612fa2612201565b8786866040518563ffffffff1660e01b8152600401612fc49493929190614212565b602060405180830381600087803b158015612fde57600080fd5b505af192505050801561300f57506040513d601f19601f8201168201806040525081019061300c9190613afd565b60015b613092573d806000811461303f576040519150601f19603f3d011682016040523d82523d6000602084013e613044565b606091505b5060008151141561308a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130819061437f565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506130e7565b600190505b949350505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161314584611331565b61314f9190614850565b9050600060076000848152602001908152602001600020549050818114613234576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506132b99190614850565b90506000600960008481526020019081526020016000205490506000600883815481106132e9576132e8614b15565b5b90600052602060002001549050806008838154811061330b5761330a614b15565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061335a57613359614ae6565b5b6001900381819060005260206000200160009055905550505050565b600061338183611331565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613465576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161345c906144ff565b60405180910390fd5b61346e81612195565b156134ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134a5906143bf565b60405180910390fd5b6134ba60008383612dd3565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461350a919061476f565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b8280546135cf90614944565b90600052602060002090601f0160209004810192826135f15760008555613638565b82601f1061360a57805160ff1916838001178555613638565b82800160010185558215613638579182015b8281111561363757825182559160200191906001019061361c565b5b5090506136459190613649565b5090565b5b8082111561366257600081600090555060010161364a565b5090565b6000613679613674846146bf565b61469a565b90508281526020810184848401111561369557613694614b82565b5b6136a0848285614902565b509392505050565b60006136bb6136b6846146f0565b61469a565b9050828152602081018484840111156136d7576136d6614b82565b5b6136e2848285614902565b509392505050565b6000813590506136f98161528b565b92915050565b60008135905061370e816152a2565b92915050565b600081519050613723816152a2565b92915050565b600081359050613738816152b9565b92915050565b60008135905061374d816152d0565b92915050565b600081519050613762816152d0565b92915050565b60008083601f84011261377e5761377d614b78565b5b8235905067ffffffffffffffff81111561379b5761379a614b73565b5b6020830191508360018202830111156137b7576137b6614b7d565b5b9250929050565b600082601f8301126137d3576137d2614b78565b5b81356137e3848260208601613666565b91505092915050565b600082601f83011261380157613800614b78565b5b81356138118482602086016136a8565b91505092915050565b600081359050613829816152e7565b92915050565b60008151905061383e816152e7565b92915050565b60006020828403121561385a57613859614b8c565b5b6000613868848285016136ea565b91505092915050565b6000806040838503121561388857613887614b8c565b5b6000613896858286016136ea565b92505060206138a7858286016136ea565b9150509250929050565b6000806000606084860312156138ca576138c9614b8c565b5b60006138d8868287016136ea565b93505060206138e9868287016136ea565b92505060406138fa8682870161381a565b9150509250925092565b6000806000806080858703121561391e5761391d614b8c565b5b600061392c878288016136ea565b945050602061393d878288016136ea565b935050604061394e8782880161381a565b925050606085013567ffffffffffffffff81111561396f5761396e614b87565b5b61397b878288016137be565b91505092959194509250565b6000806040838503121561399e5761399d614b8c565b5b60006139ac858286016136ea565b92505060206139bd858286016136ff565b9150509250929050565b600080604083850312156139de576139dd614b8c565b5b60006139ec858286016136ea565b92505060206139fd8582860161381a565b9150509250929050565b600080600060608486031215613a2057613a1f614b8c565b5b6000613a2e868287016136ea565b9350506020613a3f8682870161381a565b925050604084013567ffffffffffffffff811115613a6057613a5f614b87565b5b613a6c868287016137be565b9150509250925092565b600060208284031215613a8c57613a8b614b8c565b5b6000613a9a84828501613714565b91505092915050565b600060208284031215613ab957613ab8614b8c565b5b6000613ac784828501613729565b91505092915050565b600060208284031215613ae657613ae5614b8c565b5b6000613af48482850161373e565b91505092915050565b600060208284031215613b1357613b12614b8c565b5b6000613b2184828501613753565b91505092915050565b600060208284031215613b4057613b3f614b8c565b5b600082013567ffffffffffffffff811115613b5e57613b5d614b87565b5b613b6a848285016137ec565b91505092915050565b600060208284031215613b8957613b88614b8c565b5b6000613b978482850161381a565b91505092915050565b600060208284031215613bb657613bb5614b8c565b5b6000613bc48482850161382f565b91505092915050565b60008060008060608587031215613be757613be6614b8c565b5b6000613bf58782880161381a565b9450506020613c068782880161381a565b935050604085013567ffffffffffffffff811115613c2757613c26614b87565b5b613c3387828801613768565b925092505092959194509250565b613c4a81614884565b82525050565b613c61613c5c82614884565b6149f0565b82525050565b613c7081614896565b82525050565b613c7f816148a2565b82525050565b613c96613c91826148a2565b614a02565b82525050565b6000613ca88385614737565b9350613cb5838584614902565b613cbe83614b91565b840190509392505050565b6000613cd482614721565b613cde8185614737565b9350613cee818560208601614911565b613cf781614b91565b840191505092915050565b6000613d0d8261472c565b613d178185614753565b9350613d27818560208601614911565b613d3081614b91565b840191505092915050565b6000613d468261472c565b613d508185614764565b9350613d60818560208601614911565b80840191505092915050565b6000613d79601e83614753565b9150613d8482614baf565b602082019050919050565b6000613d9c602e83614753565b9150613da782614bd8565b604082019050919050565b6000613dbf602b83614753565b9150613dca82614c27565b604082019050919050565b6000613de2603283614753565b9150613ded82614c76565b604082019050919050565b6000613e05602683614753565b9150613e1082614cc5565b604082019050919050565b6000613e28601c83614753565b9150613e3382614d14565b602082019050919050565b6000613e4b602483614753565b9150613e5682614d3d565b604082019050919050565b6000613e6e601983614753565b9150613e7982614d8c565b602082019050919050565b6000613e91603383614753565b9150613e9c82614db5565b604082019050919050565b6000613eb4601f83614753565b9150613ebf82614e04565b602082019050919050565b6000613ed7602c83614753565b9150613ee282614e2d565b604082019050919050565b6000613efa603883614753565b9150613f0582614e7c565b604082019050919050565b6000613f1d602a83614753565b9150613f2882614ecb565b604082019050919050565b6000613f40602983614753565b9150613f4b82614f1a565b604082019050919050565b6000613f63602083614753565b9150613f6e82614f69565b602082019050919050565b6000613f86602083614753565b9150613f9182614f92565b602082019050919050565b6000613fa9602c83614753565b9150613fb482614fbb565b604082019050919050565b6000613fcc602083614753565b9150613fd78261500a565b602082019050919050565b6000613fef602983614753565b9150613ffa82615033565b604082019050919050565b6000614012602f83614753565b915061401d82615082565b604082019050919050565b6000614035601383614753565b9150614040826150d1565b602082019050919050565b6000614058601383614753565b9150614063826150fa565b602082019050919050565b600061407b602183614753565b915061408682615123565b604082019050919050565b600061409e600083614748565b91506140a982615172565b600082019050919050565b60006140c1601083614753565b91506140cc82615175565b602082019050919050565b60006140e4603183614753565b91506140ef8261519e565b604082019050919050565b6000614107602c83614753565b9150614112826151ed565b604082019050919050565b600061412a603483614753565b91506141358261523c565b604082019050919050565b614149816148f8565b82525050565b61416061415b826148f8565b614a1e565b82525050565b60006141728285613c50565b601482019150614182828461414f565b6020820191508190509392505050565b600061419e8285613c85565b6020820191506141ae8284613c85565b6020820191508190509392505050565b60006141ca8285613d3b565b91506141d68284613d3b565b91508190509392505050565b60006141ed82614091565b9150819050919050565b600060208201905061420c6000830184613c41565b92915050565b60006080820190506142276000830187613c41565b6142346020830186613c41565b6142416040830185614140565b81810360608301526142538184613cc9565b905095945050505050565b60006060820190506142736000830187613c41565b6142806020830186614140565b8181036040830152614293818486613c9c565b905095945050505050565b60006020820190506142b36000830184613c67565b92915050565b60006020820190506142ce6000830184613c76565b92915050565b60006040820190506142e96000830185613c76565b6142f66020830184614140565b9392505050565b600060208201905081810360008301526143178184613d02565b905092915050565b6000602082019050818103600083015261433881613d6c565b9050919050565b6000602082019050818103600083015261435881613d8f565b9050919050565b6000602082019050818103600083015261437881613db2565b9050919050565b6000602082019050818103600083015261439881613dd5565b9050919050565b600060208201905081810360008301526143b881613df8565b9050919050565b600060208201905081810360008301526143d881613e1b565b9050919050565b600060208201905081810360008301526143f881613e3e565b9050919050565b6000602082019050818103600083015261441881613e61565b9050919050565b6000602082019050818103600083015261443881613e84565b9050919050565b6000602082019050818103600083015261445881613ea7565b9050919050565b6000602082019050818103600083015261447881613eca565b9050919050565b6000602082019050818103600083015261449881613eed565b9050919050565b600060208201905081810360008301526144b881613f10565b9050919050565b600060208201905081810360008301526144d881613f33565b9050919050565b600060208201905081810360008301526144f881613f56565b9050919050565b6000602082019050818103600083015261451881613f79565b9050919050565b6000602082019050818103600083015261453881613f9c565b9050919050565b6000602082019050818103600083015261455881613fbf565b9050919050565b6000602082019050818103600083015261457881613fe2565b9050919050565b6000602082019050818103600083015261459881614005565b9050919050565b600060208201905081810360008301526145b881614028565b9050919050565b600060208201905081810360008301526145d88161404b565b9050919050565b600060208201905081810360008301526145f88161406e565b9050919050565b60006020820190508181036000830152614618816140b4565b9050919050565b60006020820190508181036000830152614638816140d7565b9050919050565b60006020820190508181036000830152614658816140fa565b9050919050565b600060208201905081810360008301526146788161411d565b9050919050565b60006020820190506146946000830184614140565b92915050565b60006146a46146b5565b90506146b08282614976565b919050565b6000604051905090565b600067ffffffffffffffff8211156146da576146d9614b44565b5b6146e382614b91565b9050602081019050919050565b600067ffffffffffffffff82111561470b5761470a614b44565b5b61471482614b91565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061477a826148f8565b9150614785836148f8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156147ba576147b9614a59565b5b828201905092915050565b60006147d0826148f8565b91506147db836148f8565b9250826147eb576147ea614a88565b5b828204905092915050565b6000614801826148f8565b915061480c836148f8565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561484557614844614a59565b5b828202905092915050565b600061485b826148f8565b9150614866836148f8565b92508282101561487957614878614a59565b5b828203905092915050565b600061488f826148d8565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561492f578082015181840152602081019050614914565b8381111561493e576000848401525b50505050565b6000600282049050600182168061495c57607f821691505b602082108114156149705761496f614ab7565b5b50919050565b61497f82614b91565b810181811067ffffffffffffffff8211171561499e5761499d614b44565b5b80604052505050565b60006149b2826148f8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156149e5576149e4614a59565b5b600182019050919050565b60006149fb82614a0c565b9050919050565b6000819050919050565b6000614a1782614ba2565b9050919050565b6000819050919050565b6000614a33826148f8565b9150614a3e836148f8565b925082614a4e57614a4d614a88565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f416d6f756e74206d7573742062652067726561746572207468616e20302e0000600082015250565b7f4e756d626572206f6620746f6b656e732065786365656473207065722074726160008201527f6e73616374696f6e206c696d6974000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4e756d626572206f6620746f6b656e732065786365656473206e756d6265722060008201527f6f6620746f6b656e732072657365727665642e00000000000000000000000000602082015250565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564206d617820737570706c79600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f53616c65206973206e6f74206163746976652e00000000000000000000000000600082015250565b7f496e76616c696420706172616d65746572732e00000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f546f6b656e73206d696e74656420776f756c6420657863656564206e756d626560008201527f72206f6620746f6b656e7320726573657276652e000000000000000000000000602082015250565b61529481614884565b811461529f57600080fd5b50565b6152ab81614896565b81146152b657600080fd5b50565b6152c2816148a2565b81146152cd57600080fd5b50565b6152d9816148ac565b81146152e457600080fd5b50565b6152f0816148f8565b81146152fb57600080fd5b5056fea2646970667358221220a7e4f775e6d4be18e5d7a65fc2e563949fbea3bfd89beaff236e9a23433c0f2d64736f6c63430008070033

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

00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d544e4339587067666a554856453564564373533436524d44456579426a725a6845716931384e41364158334c2f00000000000000000000

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

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [2] : 697066733a2f2f516d544e4339587067666a554856453564564373533436524d
Arg [3] : 44456579426a725a6845716931384e41364158334c2f00000000000000000000


Deployed Bytecode Sourcemap

51620:4163:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33652:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20784:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22343:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21866:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34292:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23233:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33960:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51735:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55608:169;;;;;;;;;;;;;:::i;:::-;;23643:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34482:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52809:77;;;;;;;;;;;;;:::i;:::-;;52615:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54487:919;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20478:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51943:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20208:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41361:94;;;;;;;;;;;;;:::i;:::-;;49853:617;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53613:736;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40710:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20953:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52899:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22636:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52083:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52725:76;;;;;;;;;;;;;:::i;:::-;;23899:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51783:47;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49604:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21128:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49704:141;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53020:583;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52154:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52117:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54363:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23002:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51839:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41610:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33652:224;33754:4;33793:35;33778:50;;;:11;:50;;;;:90;;;;33832:36;33856:11;33832:23;:36::i;:::-;33778:90;33771:97;;33652:224;;;:::o;20784:100::-;20838:13;20871:5;20864:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20784:100;:::o;22343:221::-;22419:7;22447:16;22455:7;22447;:16::i;:::-;22439:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22532:15;:24;22548:7;22532:24;;;;;;;;;;;;;;;;;;;;;22525:31;;22343:221;;;:::o;21866:411::-;21947:13;21963:23;21978:7;21963:14;:23::i;:::-;21947:39;;22011:5;22005:11;;:2;:11;;;;21997:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;22105:5;22089:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;22114:37;22131:5;22138:12;:10;:12::i;:::-;22114:16;:37::i;:::-;22089:62;22067:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;22248:21;22257:2;22261:7;22248:8;:21::i;:::-;21936:341;21866:411;;:::o;34292:113::-;34353:7;34380:10;:17;;;;34373:24;;34292:113;:::o;23233:339::-;23428:41;23447:12;:10;:12::i;:::-;23461:7;23428:18;:41::i;:::-;23420:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;23536:28;23546:4;23552:2;23556:7;23536:9;:28::i;:::-;23233:339;;;:::o;33960:256::-;34057:7;34093:23;34110:5;34093:16;:23::i;:::-;34085:5;:31;34077:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;34182:12;:19;34195:5;34182:19;;;;;;;;;;;;;;;:26;34202:5;34182:26;;;;;;;;;;;;34175:33;;33960:256;;;;:::o;51735:41::-;51772:4;51735:41;:::o;55608:169::-;40941:12;:10;:12::i;:::-;40930:23;;:7;:5;:7::i;:::-;:23;;;40922:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55656:15:::1;55674:21;55656:39;;55724:1;55714:7;:11;55706:20;;;::::0;::::1;;55738:31;55749:10;55761:7;55738:10;:31::i;:::-;55645:132;55608:169::o:0;23643:185::-;23781:39;23798:4;23804:2;23808:7;23781:39;;;;;;;;;;;;:16;:39::i;:::-;23643:185;;;:::o;34482:233::-;34557:7;34593:30;:28;:30::i;:::-;34585:5;:38;34577:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;34690:10;34701:5;34690:17;;;;;;;;:::i;:::-;;;;;;;;;;34683:24;;34482:233;;;:::o;52809:77::-;40941:12;:10;:12::i;:::-;40930:23;;:7;:5;:7::i;:::-;:23;;;40922:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52873:5:::1;52858:12;;:20;;;;;;;;;;;;;;;;;;52809:77::o:0;52615:101::-;40941:12;:10;:12::i;:::-;40930:23;;:7;:5;:7::i;:::-;:23;;;40922:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52701:7:::1;52686:12;:22;;;;;;;;;;;;:::i;:::-;;52615:101:::0;:::o;54487:919::-;54574:14;54591:10;54574:27;;54620:4;:18;;;54639:6;54647:5;54654:9;;54620:44;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54612:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;54707:12;;;;;;;;;;;54699:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;54773:1;54762:8;:12;54754:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;54842:5;54830:8;:17;;54822:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;54969:5;54957:8;54923:4;:23;;;54947:6;54923:31;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:42;;;;:::i;:::-;:51;;54915:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;55060:6;55056:331;55076:8;55072:1;:12;55056:331;;;55106:14;55123:20;55141:1;55123:13;:11;:13::i;:::-;:17;;:20;;;;:::i;:::-;55106:37;;51772:4;55162:13;:11;:13::i;:::-;:26;55158:218;;;55209:28;55219:6;55227:9;55209;:28::i;:::-;55279:27;55304:1;55279:12;:20;55292:6;55279:20;;;;;;;;;;;;;;;;:24;;:27;;;;:::i;:::-;55256:12;:20;55269:6;55256:20;;;;;;;;;;;;;;;:50;;;;55341:19;55358:1;55341:12;;:16;;:19;;;;:::i;:::-;55326:12;:34;;;;55158:218;55091:296;55086:3;;;;;:::i;:::-;;;;55056:331;;;;54562:844;54487:919;;;;:::o;20478:239::-;20550:7;20570:13;20586:7;:16;20594:7;20586:16;;;;;;;;;;;;;;;;;;;;;20570:32;;20638:1;20621:19;;:5;:19;;;;20613:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;20704:5;20697:12;;;20478:239;;;:::o;51943:46::-;51985:4;51943:46;:::o;20208:208::-;20280:7;20325:1;20308:19;;:5;:19;;;;20300:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;20392:9;:16;20402:5;20392:16;;;;;;;;;;;;;;;;20385:23;;20208:208;;;:::o;41361:94::-;40941:12;:10;:12::i;:::-;40930:23;;:7;:5;:7::i;:::-;:23;;;40922:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41426:21:::1;41444:1;41426:9;:21::i;:::-;41361:94::o:0;49853:617::-;49959:4;49976:21;50008:23;50069:30;50086:9;50097:1;50069:16;:30::i;:::-;50052:47;;;;;;;;50129:1;50114:4;:11;:16;50110:39;;50141:5;50134:12;;;;;;50110:39;50170:13;50194:4;50199:1;50194:7;;;;;;;;:::i;:::-;;;;;;;;50186:16;;50170:32;;50226:3;50217:12;;:5;;:12;50213:35;;;50240:5;50233:12;;;;;;;50213:35;50268:12;50312:8;50322:5;50294:35;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50283:48;;;;;;50268:63;;50348:26;50362:5;;50369:4;50348:6;:13;;:26;;;;;:::i;:::-;50344:86;;;50407:11;50398:5;:20;50391:27;;;;;;;;50344:86;50457:5;50450:12;;;;;;49853:617;;;;;;:::o;53613:736::-;53673:20;53696:48;53732:11;;53696:31;51985:4;51772;53696:14;;:31;;;;:::i;:::-;:35;;:48;;;;:::i;:::-;53673:71;;53763:12;;;;;;;;;;;53755:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;51874:2;53818:8;:20;;53810:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;53920:15;53908:8;:27;;53900:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;54019:9;53991:24;54006:8;51820:10;53991:14;;:24;;;;:::i;:::-;:37;;53983:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;54081:6;54077:263;54097:8;54093:1;:12;54077:263;;;54127:14;54144:20;54162:1;54144:13;:11;:13::i;:::-;:17;;:20;;;;:::i;:::-;54127:37;;51772:4;54183:13;:11;:13::i;:::-;:26;54179:150;;;54230:32;54240:10;54252:9;54230;:32::i;:::-;54295:18;54311:1;54295:11;;:15;;:18;;;;:::i;:::-;54281:11;:32;;;;54179:150;54112:228;54107:3;;;;;:::i;:::-;;;;54077:263;;;;53662:687;53613:736;:::o;40710:87::-;40756:7;40783:6;;;;;;;;;;;40776:13;;40710:87;:::o;20953:104::-;21009:13;21042:7;21035:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20953:104;:::o;52899:107::-;40941:12;:10;:12::i;:::-;40930:23;;:7;:5;:7::i;:::-;:23;;;40922:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52976:22:::1;52986:2;52990:7;52976:9;:22::i;:::-;52899:107:::0;;:::o;22636:295::-;22751:12;:10;:12::i;:::-;22739:24;;:8;:24;;;;22731:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;22851:8;22806:18;:32;22825:12;:10;:12::i;:::-;22806:32;;;;;;;;;;;;;;;:42;22839:8;22806:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;22904:8;22875:48;;22890:12;:10;:12::i;:::-;22875:48;;;22914:8;22875:48;;;;;;:::i;:::-;;;;;;;;22636:295;;:::o;52083:26::-;;;;:::o;52725:76::-;40941:12;:10;:12::i;:::-;40930:23;;:7;:5;:7::i;:::-;:23;;;40922:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52789:4:::1;52774:12;;:19;;;;;;;;;;;;;;;;;;52725:76::o:0;23899:328::-;24074:41;24093:12;:10;:12::i;:::-;24107:7;24074:18;:41::i;:::-;24066:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24180:39;24194:4;24200:2;24204:7;24213:5;24180:13;:39::i;:::-;23899:328;;;;:::o;51783:47::-;51820:10;51783:47;:::o;49604:20::-;;;;:::o;21128:334::-;21201:13;21235:16;21243:7;21235;:16::i;:::-;21227:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;21316:21;21340:10;:8;:10::i;:::-;21316:34;;21392:1;21374:7;21368:21;:25;:86;;;;;;;;;;;;;;;;;21420:7;21429:18;:7;:16;:18::i;:::-;21403:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;21368:86;21361:93;;;21128:334;;;:::o;49704:141::-;40941:12;:10;:12::i;:::-;40930:23;;:7;:5;:7::i;:::-;:23;;;40922:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49784:4:::1;49776:5;:12;;;;49804:30;49815:4;49821:12;49804:30;;;;;;;:::i;:::-;;;;;;;;49704:141:::0;:::o;53020:583::-;40941:12;:10;:12::i;:::-;40930:23;;:7;:5;:7::i;:::-;:23;;;40922:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53096:20:::1;53119:29;53134:13;:11;:13::i;:::-;51772:4;53119:14;;:29;;;;:::i;:::-;53096:52;;53167:12;;;;;;;;;;;53159:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;51874:2;53222:8;:20;;53214:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;53324:15;53312:8;:27;;53304:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;53394:6;53390:204;53410:8;53406:1;:12;53390:204;;;53440:14;53457:20;53475:1;53457:13;:11;:13::i;:::-;:17;;:20;;;;:::i;:::-;53440:37;;51772:4;53496:13;:11;:13::i;:::-;:26;53492:91;;;53543:24;53553:2;53557:9;53543;:24::i;:::-;53492:91;53425:169;53420:3;;;;;:::i;:::-;;;;53390:204;;;;53085:518;53020:583:::0;;:::o;52154:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;52117:27::-;;;;:::o;54363:116::-;54428:4;54451:12;:20;54464:6;54451:20;;;;;;;;;;;;;;;;54444:27;;54363:116;;;:::o;23002:164::-;23099:4;23123:18;:25;23142:5;23123:25;;;;;;;;;;;;;;;:35;23149:8;23123:35;;;;;;;;;;;;;;;;;;;;;;;;;23116:42;;23002:164;;;;:::o;51839:37::-;51874:2;51839:37;:::o;41610:192::-;40941:12;:10;:12::i;:::-;40930:23;;:7;:5;:7::i;:::-;:23;;;40922:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41719:1:::1;41699:22;;:8;:22;;;;41691:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;41775:19;41785:8;41775:9;:19::i;:::-;41610:192:::0;:::o;7680:387::-;7740:4;7948:12;8015:7;8003:20;7995:28;;8058:1;8051:4;:8;8044:15;;;7680:387;;;:::o;31829:126::-;;;;:::o;19839:305::-;19941:4;19993:25;19978:40;;;:11;:40;;;;:105;;;;20050:33;20035:48;;;:11;:48;;;;19978:105;:158;;;;20100:36;20124:11;20100:23;:36::i;:::-;19978:158;19958:178;;19839:305;;;:::o;25737:127::-;25802:4;25854:1;25826:30;;:7;:16;25834:7;25826:16;;;;;;;;;;;;;;;;;;;;;:30;;;;25819:37;;25737:127;;;:::o;15551:98::-;15604:7;15631:10;15624:17;;15551:98;:::o;29719:174::-;29821:2;29794:15;:24;29810:7;29794:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;29877:7;29873:2;29839:46;;29848:23;29863:7;29848:14;:23::i;:::-;29839:46;;;;;;;;;;;;29719:174;;:::o;26031:348::-;26124:4;26149:16;26157:7;26149;:16::i;:::-;26141:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26225:13;26241:23;26256:7;26241:14;:23::i;:::-;26225:39;;26294:5;26283:16;;:7;:16;;;:51;;;;26327:7;26303:31;;:20;26315:7;26303:11;:20::i;:::-;:31;;;26283:51;:87;;;;26338:32;26355:5;26362:7;26338:16;:32::i;:::-;26283:87;26275:96;;;26031:348;;;;:::o;29023:578::-;29182:4;29155:31;;:23;29170:7;29155:14;:23::i;:::-;:31;;;29147:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;29265:1;29251:16;;:2;:16;;;;29243:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;29321:39;29342:4;29348:2;29352:7;29321:20;:39::i;:::-;29425:29;29442:1;29446:7;29425:8;:29::i;:::-;29486:1;29467:9;:15;29477:4;29467:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;29515:1;29498:9;:13;29508:2;29498:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29546:2;29527:7;:16;29535:7;29527:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29585:7;29581:2;29566:27;;29575:4;29566:27;;;;;;;;;;;;29023:578;;;:::o;55419:181::-;55494:12;55512:8;:13;;55533:7;55512:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55493:52;;;55564:7;55556:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;55482:118;55419:181;;:::o;44689:98::-;44747:7;44778:1;44774;:5;;;;:::i;:::-;44767:12;;44689:98;;;;:::o;26721:110::-;26797:26;26807:2;26811:7;26797:26;;;;;;;;;;;;:9;:26::i;:::-;26721:110;;:::o;41810:173::-;41866:16;41885:6;;;;;;;;;;;41866:25;;41911:8;41902:6;;:17;;;;;;;;;;;;;;;;;;41966:8;41935:40;;41956:8;41935:40;;;;;;;;;;;;41855:128;41810:173;:::o;50482:1131::-;50575:29;50695:26;50764:1;50758:2;50739:9;:16;:21;;;;:::i;:::-;:26;;:81;;;;50802:18;50817:2;50802:10;:14;;:18;;;;:::i;:::-;50783:9;:16;:37;50739:81;:128;;;;50865:2;50838:24;50859:2;50838:9;:16;:20;;:24;;;;:::i;:::-;:29;50739:128;50734:369;;;51003:1;50989:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50974:31;;51044:1;51030:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51018:28;;51059:32;;50734:369;51152:10;51138:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51123:40;;51200:32;51229:2;51200:24;51221:2;51200:9;:16;:20;;:24;;;;:::i;:::-;:28;;:32;;;;:::i;:::-;51186:47;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51174:59;;51244:16;51276:9;51288:2;51276:14;;51271:335;51297:9;:16;51292:1;:21;51271:335;;51400:1;51389:9;51385:17;51379:24;51367:36;;51447:2;51436:10;:13;;;;:::i;:::-;51431:1;:18;51428:167;;51499:8;51465:12;51478:17;51492:2;51478:9;51484:2;51478:1;:5;;:9;;;;:::i;:::-;:13;;:17;;;;:::i;:::-;51465:31;;;;;;;;:::i;:::-;;;;;;;:42;;;;;51428:167;;;51573:8;51542:9;51552:17;51566:2;51552:9;51558:2;51552:1;:5;;:9;;;;:::i;:::-;:13;;:17;;;;:::i;:::-;51542:28;;;;;;;;:::i;:::-;;;;;;;:39;;;;;51428:167;51319:9;51325:2;51319:1;:5;;:9;;;;:::i;:::-;51315:13;;51271:335;;;;50723:890;50482:1131;;;;;;:::o;48881:597::-;49006:4;49023:20;49046:4;49023:27;;49068:9;49063:369;49087:5;:12;49083:1;:16;49063:369;;;49121:20;49144:5;49150:1;49144:8;;;;;;;;:::i;:::-;;;;;;;;49121:31;;49189:12;49173;:28;49169:252;;49265:12;49279;49248:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49238:55;;;;;;49223:70;;49169:252;;;49377:12;49391;49360:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49350:55;;;;;;49335:70;;49169:252;49106:326;49101:3;;;;;:::i;:::-;;;;49063:369;;;;49466:4;49450:12;:20;49443:27;;;48881:597;;;;;:::o;45070:98::-;45128:7;45159:1;45155;:5;;;;:::i;:::-;45148:12;;45070:98;;;;:::o;45427:::-;45485:7;45516:1;45512;:5;;;;:::i;:::-;45505:12;;45427:98;;;;:::o;25109:315::-;25266:28;25276:4;25282:2;25286:7;25266:9;:28::i;:::-;25313:48;25336:4;25342:2;25346:7;25355:5;25313:22;:48::i;:::-;25305:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25109:315;;;;:::o;52494:113::-;52554:13;52587:12;52580:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52494:113;:::o;15991:723::-;16047:13;16277:1;16268:5;:10;16264:53;;;16295:10;;;;;;;;;;;;;;;;;;;;;16264:53;16327:12;16342:5;16327:20;;16358:14;16383:78;16398:1;16390:4;:9;16383:78;;16416:8;;;;;:::i;:::-;;;;16447:2;16439:10;;;;;:::i;:::-;;;16383:78;;;16471:19;16503:6;16493:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16471:39;;16521:154;16537:1;16528:5;:10;16521:154;;16565:1;16555:11;;;;;:::i;:::-;;;16632:2;16624:5;:10;;;;:::i;:::-;16611:2;:24;;;;:::i;:::-;16598:39;;16581:6;16588;16581:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;16661:2;16652:11;;;;;:::i;:::-;;;16521:154;;;16699:6;16685:21;;;;;15991:723;;;;:::o;18448:157::-;18533:4;18572:25;18557:40;;;:11;:40;;;;18550:47;;18448:157;;;:::o;35328:589::-;35472:45;35499:4;35505:2;35509:7;35472:26;:45::i;:::-;35550:1;35534:18;;:4;:18;;;35530:187;;;35569:40;35601:7;35569:31;:40::i;:::-;35530:187;;;35639:2;35631:10;;:4;:10;;;35627:90;;35658:47;35691:4;35697:7;35658:32;:47::i;:::-;35627:90;35530:187;35745:1;35731:16;;:2;:16;;;35727:183;;;35764:45;35801:7;35764:36;:45::i;:::-;35727:183;;;35837:4;35831:10;;:2;:10;;;35827:83;;35858:40;35886:2;35890:7;35858:27;:40::i;:::-;35827:83;35727:183;35328:589;;;:::o;27058:321::-;27188:18;27194:2;27198:7;27188:5;:18::i;:::-;27239:54;27270:1;27274:2;27278:7;27287:5;27239:22;:54::i;:::-;27217:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;27058:321;;;:::o;45826:98::-;45884:7;45915:1;45911;:5;;;;:::i;:::-;45904:12;;45826:98;;;;:::o;30458:799::-;30613:4;30634:15;:2;:13;;;:15::i;:::-;30630:620;;;30686:2;30670:36;;;30707:12;:10;:12::i;:::-;30721:4;30727:7;30736:5;30670:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;30666:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30929:1;30912:6;:13;:18;30908:272;;;30955:60;;;;;;;;;;:::i;:::-;;;;;;;;30908:272;31130:6;31124:13;31115:6;31111:2;31107:15;31100:38;30666:529;30803:41;;;30793:51;;;:6;:51;;;;30786:58;;;;;30630:620;31234:4;31227:11;;30458:799;;;;;;;:::o;36640:164::-;36744:10;:17;;;;36717:15;:24;36733:7;36717:24;;;;;;;;;;;:44;;;;36772:10;36788:7;36772:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36640:164;:::o;37431:988::-;37697:22;37747:1;37722:22;37739:4;37722:16;:22::i;:::-;:26;;;;:::i;:::-;37697:51;;37759:18;37780:17;:26;37798:7;37780:26;;;;;;;;;;;;37759:47;;37927:14;37913:10;:28;37909:328;;37958:19;37980:12;:18;37993:4;37980:18;;;;;;;;;;;;;;;:34;37999:14;37980:34;;;;;;;;;;;;37958:56;;38064:11;38031:12;:18;38044:4;38031:18;;;;;;;;;;;;;;;:30;38050:10;38031:30;;;;;;;;;;;:44;;;;38181:10;38148:17;:30;38166:11;38148:30;;;;;;;;;;;:43;;;;37943:294;37909:328;38333:17;:26;38351:7;38333:26;;;;;;;;;;;38326:33;;;38377:12;:18;38390:4;38377:18;;;;;;;;;;;;;;;:34;38396:14;38377:34;;;;;;;;;;;38370:41;;;37512:907;;37431:988;;:::o;38714:1079::-;38967:22;39012:1;38992:10;:17;;;;:21;;;;:::i;:::-;38967:46;;39024:18;39045:15;:24;39061:7;39045:24;;;;;;;;;;;;39024:45;;39396:19;39418:10;39429:14;39418:26;;;;;;;;:::i;:::-;;;;;;;;;;39396:48;;39482:11;39457:10;39468;39457:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;39593:10;39562:15;:28;39578:11;39562:28;;;;;;;;;;;:41;;;;39734:15;:24;39750:7;39734:24;;;;;;;;;;;39727:31;;;39769:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;38785:1008;;;38714:1079;:::o;36218:221::-;36303:14;36320:20;36337:2;36320:16;:20::i;:::-;36303:37;;36378:7;36351:12;:16;36364:2;36351:16;;;;;;;;;;;;;;;:24;36368:6;36351:24;;;;;;;;;;;:34;;;;36425:6;36396:17;:26;36414:7;36396:26;;;;;;;;;;;:35;;;;36292:147;36218:221;;:::o;27715:382::-;27809:1;27795:16;;:2;:16;;;;27787:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;27868:16;27876:7;27868;:16::i;:::-;27867:17;27859:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;27930:45;27959:1;27963:2;27967:7;27930:20;:45::i;:::-;28005:1;27988:9;:13;27998:2;27988:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28036:2;28017:7;:16;28025:7;28017:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28081:7;28077:2;28056:33;;28073:1;28056:33;;;;;;;;;;;;27715:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1179:5;1210:6;1204:13;1195:22;;1226:30;1250:5;1226:30;:::i;:::-;1125:137;;;;:::o;1268:139::-;1314:5;1352:6;1339:20;1330:29;;1368:33;1395:5;1368:33;:::i;:::-;1268:139;;;;:::o;1413:137::-;1458:5;1496:6;1483:20;1474:29;;1512:32;1538:5;1512:32;:::i;:::-;1413:137;;;;:::o;1556:141::-;1612:5;1643:6;1637:13;1628:22;;1659:32;1685:5;1659:32;:::i;:::-;1556:141;;;;:::o;1716:552::-;1773:8;1783:6;1833:3;1826:4;1818:6;1814:17;1810:27;1800:122;;1841:79;;:::i;:::-;1800:122;1954:6;1941:20;1931:30;;1984:18;1976:6;1973:30;1970:117;;;2006:79;;:::i;:::-;1970:117;2120:4;2112:6;2108:17;2096:29;;2174:3;2166:4;2158:6;2154:17;2144:8;2140:32;2137:41;2134:128;;;2181:79;;:::i;:::-;2134:128;1716:552;;;;;:::o;2287:338::-;2342:5;2391:3;2384:4;2376:6;2372:17;2368:27;2358:122;;2399:79;;:::i;:::-;2358:122;2516:6;2503:20;2541:78;2615:3;2607:6;2600:4;2592:6;2588:17;2541:78;:::i;:::-;2532:87;;2348:277;2287:338;;;;:::o;2645:340::-;2701:5;2750:3;2743:4;2735:6;2731:17;2727:27;2717:122;;2758:79;;:::i;:::-;2717:122;2875:6;2862:20;2900:79;2975:3;2967:6;2960:4;2952:6;2948:17;2900:79;:::i;:::-;2891:88;;2707:278;2645:340;;;;:::o;2991:139::-;3037:5;3075:6;3062:20;3053:29;;3091:33;3118:5;3091:33;:::i;:::-;2991:139;;;;:::o;3136:143::-;3193:5;3224:6;3218:13;3209:22;;3240:33;3267:5;3240:33;:::i;:::-;3136:143;;;;:::o;3285:329::-;3344:6;3393:2;3381:9;3372:7;3368:23;3364:32;3361:119;;;3399:79;;:::i;:::-;3361:119;3519:1;3544:53;3589:7;3580:6;3569:9;3565:22;3544:53;:::i;:::-;3534:63;;3490:117;3285:329;;;;:::o;3620:474::-;3688:6;3696;3745:2;3733:9;3724:7;3720:23;3716:32;3713:119;;;3751:79;;:::i;:::-;3713:119;3871:1;3896:53;3941:7;3932:6;3921:9;3917:22;3896:53;:::i;:::-;3886:63;;3842:117;3998:2;4024:53;4069:7;4060:6;4049:9;4045:22;4024:53;:::i;:::-;4014:63;;3969:118;3620:474;;;;;:::o;4100:619::-;4177:6;4185;4193;4242:2;4230:9;4221:7;4217:23;4213:32;4210:119;;;4248:79;;:::i;:::-;4210:119;4368:1;4393:53;4438:7;4429:6;4418:9;4414:22;4393:53;:::i;:::-;4383:63;;4339:117;4495:2;4521:53;4566:7;4557:6;4546:9;4542:22;4521:53;:::i;:::-;4511:63;;4466:118;4623:2;4649:53;4694:7;4685:6;4674:9;4670:22;4649:53;:::i;:::-;4639:63;;4594:118;4100:619;;;;;:::o;4725:943::-;4820:6;4828;4836;4844;4893:3;4881:9;4872:7;4868:23;4864:33;4861:120;;;4900:79;;:::i;:::-;4861:120;5020:1;5045:53;5090:7;5081:6;5070:9;5066:22;5045:53;:::i;:::-;5035:63;;4991:117;5147:2;5173:53;5218:7;5209:6;5198:9;5194:22;5173:53;:::i;:::-;5163:63;;5118:118;5275:2;5301:53;5346:7;5337:6;5326:9;5322:22;5301:53;:::i;:::-;5291:63;;5246:118;5431:2;5420:9;5416:18;5403:32;5462:18;5454:6;5451:30;5448:117;;;5484:79;;:::i;:::-;5448:117;5589:62;5643:7;5634:6;5623:9;5619:22;5589:62;:::i;:::-;5579:72;;5374:287;4725:943;;;;;;;:::o;5674:468::-;5739:6;5747;5796:2;5784:9;5775:7;5771:23;5767:32;5764:119;;;5802:79;;:::i;:::-;5764:119;5922:1;5947:53;5992:7;5983:6;5972:9;5968:22;5947:53;:::i;:::-;5937:63;;5893:117;6049:2;6075:50;6117:7;6108:6;6097:9;6093:22;6075:50;:::i;:::-;6065:60;;6020:115;5674:468;;;;;:::o;6148:474::-;6216:6;6224;6273:2;6261:9;6252:7;6248:23;6244:32;6241:119;;;6279:79;;:::i;:::-;6241:119;6399:1;6424:53;6469:7;6460:6;6449:9;6445:22;6424:53;:::i;:::-;6414:63;;6370:117;6526:2;6552:53;6597:7;6588:6;6577:9;6573:22;6552:53;:::i;:::-;6542:63;;6497:118;6148:474;;;;;:::o;6628:797::-;6714:6;6722;6730;6779:2;6767:9;6758:7;6754:23;6750:32;6747:119;;;6785:79;;:::i;:::-;6747:119;6905:1;6930:53;6975:7;6966:6;6955:9;6951:22;6930:53;:::i;:::-;6920:63;;6876:117;7032:2;7058:53;7103:7;7094:6;7083:9;7079:22;7058:53;:::i;:::-;7048:63;;7003:118;7188:2;7177:9;7173:18;7160:32;7219:18;7211:6;7208:30;7205:117;;;7241:79;;:::i;:::-;7205:117;7346:62;7400:7;7391:6;7380:9;7376:22;7346:62;:::i;:::-;7336:72;;7131:287;6628:797;;;;;:::o;7431:345::-;7498:6;7547:2;7535:9;7526:7;7522:23;7518:32;7515:119;;;7553:79;;:::i;:::-;7515:119;7673:1;7698:61;7751:7;7742:6;7731:9;7727:22;7698:61;:::i;:::-;7688:71;;7644:125;7431:345;;;;:::o;7782:329::-;7841:6;7890:2;7878:9;7869:7;7865:23;7861:32;7858:119;;;7896:79;;:::i;:::-;7858:119;8016:1;8041:53;8086:7;8077:6;8066:9;8062:22;8041:53;:::i;:::-;8031:63;;7987:117;7782:329;;;;:::o;8117:327::-;8175:6;8224:2;8212:9;8203:7;8199:23;8195:32;8192:119;;;8230:79;;:::i;:::-;8192:119;8350:1;8375:52;8419:7;8410:6;8399:9;8395:22;8375:52;:::i;:::-;8365:62;;8321:116;8117:327;;;;:::o;8450:349::-;8519:6;8568:2;8556:9;8547:7;8543:23;8539:32;8536:119;;;8574:79;;:::i;:::-;8536:119;8694:1;8719:63;8774:7;8765:6;8754:9;8750:22;8719:63;:::i;:::-;8709:73;;8665:127;8450:349;;;;:::o;8805:509::-;8874:6;8923:2;8911:9;8902:7;8898:23;8894:32;8891:119;;;8929:79;;:::i;:::-;8891:119;9077:1;9066:9;9062:17;9049:31;9107:18;9099:6;9096:30;9093:117;;;9129:79;;:::i;:::-;9093:117;9234:63;9289:7;9280:6;9269:9;9265:22;9234:63;:::i;:::-;9224:73;;9020:287;8805:509;;;;:::o;9320:329::-;9379:6;9428:2;9416:9;9407:7;9403:23;9399:32;9396:119;;;9434:79;;:::i;:::-;9396:119;9554:1;9579:53;9624:7;9615:6;9604:9;9600:22;9579:53;:::i;:::-;9569:63;;9525:117;9320:329;;;;:::o;9655:351::-;9725:6;9774:2;9762:9;9753:7;9749:23;9745:32;9742:119;;;9780:79;;:::i;:::-;9742:119;9900:1;9925:64;9981:7;9972:6;9961:9;9957:22;9925:64;:::i;:::-;9915:74;;9871:128;9655:351;;;;:::o;10012:817::-;10100:6;10108;10116;10124;10173:2;10161:9;10152:7;10148:23;10144:32;10141:119;;;10179:79;;:::i;:::-;10141:119;10299:1;10324:53;10369:7;10360:6;10349:9;10345:22;10324:53;:::i;:::-;10314:63;;10270:117;10426:2;10452:53;10497:7;10488:6;10477:9;10473:22;10452:53;:::i;:::-;10442:63;;10397:118;10582:2;10571:9;10567:18;10554:32;10613:18;10605:6;10602:30;10599:117;;;10635:79;;:::i;:::-;10599:117;10748:64;10804:7;10795:6;10784:9;10780:22;10748:64;:::i;:::-;10730:82;;;;10525:297;10012:817;;;;;;;:::o;10835:118::-;10922:24;10940:5;10922:24;:::i;:::-;10917:3;10910:37;10835:118;;:::o;10959:157::-;11064:45;11084:24;11102:5;11084:24;:::i;:::-;11064:45;:::i;:::-;11059:3;11052:58;10959:157;;:::o;11122:109::-;11203:21;11218:5;11203:21;:::i;:::-;11198:3;11191:34;11122:109;;:::o;11237:118::-;11324:24;11342:5;11324:24;:::i;:::-;11319:3;11312:37;11237:118;;:::o;11361:157::-;11466:45;11486:24;11504:5;11486:24;:::i;:::-;11466:45;:::i;:::-;11461:3;11454:58;11361:157;;:::o;11546:301::-;11642:3;11663:70;11726:6;11721:3;11663:70;:::i;:::-;11656:77;;11743:43;11779:6;11774:3;11767:5;11743:43;:::i;:::-;11811:29;11833:6;11811:29;:::i;:::-;11806:3;11802:39;11795:46;;11546:301;;;;;:::o;11853:360::-;11939:3;11967:38;11999:5;11967:38;:::i;:::-;12021:70;12084:6;12079:3;12021:70;:::i;:::-;12014:77;;12100:52;12145:6;12140:3;12133:4;12126:5;12122:16;12100:52;:::i;:::-;12177:29;12199:6;12177:29;:::i;:::-;12172:3;12168:39;12161:46;;11943:270;11853:360;;;;:::o;12219:364::-;12307:3;12335:39;12368:5;12335:39;:::i;:::-;12390:71;12454:6;12449:3;12390:71;:::i;:::-;12383:78;;12470:52;12515:6;12510:3;12503:4;12496:5;12492:16;12470:52;:::i;:::-;12547:29;12569:6;12547:29;:::i;:::-;12542:3;12538:39;12531:46;;12311:272;12219:364;;;;:::o;12589:377::-;12695:3;12723:39;12756:5;12723:39;:::i;:::-;12778:89;12860:6;12855:3;12778:89;:::i;:::-;12771:96;;12876:52;12921:6;12916:3;12909:4;12902:5;12898:16;12876:52;:::i;:::-;12953:6;12948:3;12944:16;12937:23;;12699:267;12589:377;;;;:::o;12972:366::-;13114:3;13135:67;13199:2;13194:3;13135:67;:::i;:::-;13128:74;;13211:93;13300:3;13211:93;:::i;:::-;13329:2;13324:3;13320:12;13313:19;;12972:366;;;:::o;13344:::-;13486:3;13507:67;13571:2;13566:3;13507:67;:::i;:::-;13500:74;;13583:93;13672:3;13583:93;:::i;:::-;13701:2;13696:3;13692:12;13685:19;;13344:366;;;:::o;13716:::-;13858:3;13879:67;13943:2;13938:3;13879:67;:::i;:::-;13872:74;;13955:93;14044:3;13955:93;:::i;:::-;14073:2;14068:3;14064:12;14057:19;;13716:366;;;:::o;14088:::-;14230:3;14251:67;14315:2;14310:3;14251:67;:::i;:::-;14244:74;;14327:93;14416:3;14327:93;:::i;:::-;14445:2;14440:3;14436:12;14429:19;;14088:366;;;:::o;14460:::-;14602:3;14623:67;14687:2;14682:3;14623:67;:::i;:::-;14616:74;;14699:93;14788:3;14699:93;:::i;:::-;14817:2;14812:3;14808:12;14801:19;;14460:366;;;:::o;14832:::-;14974:3;14995:67;15059:2;15054:3;14995:67;:::i;:::-;14988:74;;15071:93;15160:3;15071:93;:::i;:::-;15189:2;15184:3;15180:12;15173:19;;14832:366;;;:::o;15204:::-;15346:3;15367:67;15431:2;15426:3;15367:67;:::i;:::-;15360:74;;15443:93;15532:3;15443:93;:::i;:::-;15561:2;15556:3;15552:12;15545:19;;15204:366;;;:::o;15576:::-;15718:3;15739:67;15803:2;15798:3;15739:67;:::i;:::-;15732:74;;15815:93;15904:3;15815:93;:::i;:::-;15933:2;15928:3;15924:12;15917:19;;15576:366;;;:::o;15948:::-;16090:3;16111:67;16175:2;16170:3;16111:67;:::i;:::-;16104:74;;16187:93;16276:3;16187:93;:::i;:::-;16305:2;16300:3;16296:12;16289:19;;15948:366;;;:::o;16320:::-;16462:3;16483:67;16547:2;16542:3;16483:67;:::i;:::-;16476:74;;16559:93;16648:3;16559:93;:::i;:::-;16677:2;16672:3;16668:12;16661:19;;16320:366;;;:::o;16692:::-;16834:3;16855:67;16919:2;16914:3;16855:67;:::i;:::-;16848:74;;16931:93;17020:3;16931:93;:::i;:::-;17049:2;17044:3;17040:12;17033:19;;16692:366;;;:::o;17064:::-;17206:3;17227:67;17291:2;17286:3;17227:67;:::i;:::-;17220:74;;17303:93;17392:3;17303:93;:::i;:::-;17421:2;17416:3;17412:12;17405:19;;17064:366;;;:::o;17436:::-;17578:3;17599:67;17663:2;17658:3;17599:67;:::i;:::-;17592:74;;17675:93;17764:3;17675:93;:::i;:::-;17793:2;17788:3;17784:12;17777:19;;17436:366;;;:::o;17808:::-;17950:3;17971:67;18035:2;18030:3;17971:67;:::i;:::-;17964:74;;18047:93;18136:3;18047:93;:::i;:::-;18165:2;18160:3;18156:12;18149:19;;17808:366;;;:::o;18180:::-;18322:3;18343:67;18407:2;18402:3;18343:67;:::i;:::-;18336:74;;18419:93;18508:3;18419:93;:::i;:::-;18537:2;18532:3;18528:12;18521:19;;18180:366;;;:::o;18552:::-;18694:3;18715:67;18779:2;18774:3;18715:67;:::i;:::-;18708:74;;18791:93;18880:3;18791:93;:::i;:::-;18909:2;18904:3;18900:12;18893:19;;18552:366;;;:::o;18924:::-;19066:3;19087:67;19151:2;19146:3;19087:67;:::i;:::-;19080:74;;19163:93;19252:3;19163:93;:::i;:::-;19281:2;19276:3;19272:12;19265:19;;18924:366;;;:::o;19296:::-;19438:3;19459:67;19523:2;19518:3;19459:67;:::i;:::-;19452:74;;19535:93;19624:3;19535:93;:::i;:::-;19653:2;19648:3;19644:12;19637:19;;19296:366;;;:::o;19668:::-;19810:3;19831:67;19895:2;19890:3;19831:67;:::i;:::-;19824:74;;19907:93;19996:3;19907:93;:::i;:::-;20025:2;20020:3;20016:12;20009:19;;19668:366;;;:::o;20040:::-;20182:3;20203:67;20267:2;20262:3;20203:67;:::i;:::-;20196:74;;20279:93;20368:3;20279:93;:::i;:::-;20397:2;20392:3;20388:12;20381:19;;20040:366;;;:::o;20412:::-;20554:3;20575:67;20639:2;20634:3;20575:67;:::i;:::-;20568:74;;20651:93;20740:3;20651:93;:::i;:::-;20769:2;20764:3;20760:12;20753:19;;20412:366;;;:::o;20784:::-;20926:3;20947:67;21011:2;21006:3;20947:67;:::i;:::-;20940:74;;21023:93;21112:3;21023:93;:::i;:::-;21141:2;21136:3;21132:12;21125:19;;20784:366;;;:::o;21156:::-;21298:3;21319:67;21383:2;21378:3;21319:67;:::i;:::-;21312:74;;21395:93;21484:3;21395:93;:::i;:::-;21513:2;21508:3;21504:12;21497:19;;21156:366;;;:::o;21528:398::-;21687:3;21708:83;21789:1;21784:3;21708:83;:::i;:::-;21701:90;;21800:93;21889:3;21800:93;:::i;:::-;21918:1;21913:3;21909:11;21902:18;;21528:398;;;:::o;21932:366::-;22074:3;22095:67;22159:2;22154:3;22095:67;:::i;:::-;22088:74;;22171:93;22260:3;22171:93;:::i;:::-;22289:2;22284:3;22280:12;22273:19;;21932:366;;;:::o;22304:::-;22446:3;22467:67;22531:2;22526:3;22467:67;:::i;:::-;22460:74;;22543:93;22632:3;22543:93;:::i;:::-;22661:2;22656:3;22652:12;22645:19;;22304:366;;;:::o;22676:::-;22818:3;22839:67;22903:2;22898:3;22839:67;:::i;:::-;22832:74;;22915:93;23004:3;22915:93;:::i;:::-;23033:2;23028:3;23024:12;23017:19;;22676:366;;;:::o;23048:::-;23190:3;23211:67;23275:2;23270:3;23211:67;:::i;:::-;23204:74;;23287:93;23376:3;23287:93;:::i;:::-;23405:2;23400:3;23396:12;23389:19;;23048:366;;;:::o;23420:118::-;23507:24;23525:5;23507:24;:::i;:::-;23502:3;23495:37;23420:118;;:::o;23544:157::-;23649:45;23669:24;23687:5;23669:24;:::i;:::-;23649:45;:::i;:::-;23644:3;23637:58;23544:157;;:::o;23707:397::-;23847:3;23862:75;23933:3;23924:6;23862:75;:::i;:::-;23962:2;23957:3;23953:12;23946:19;;23975:75;24046:3;24037:6;23975:75;:::i;:::-;24075:2;24070:3;24066:12;24059:19;;24095:3;24088:10;;23707:397;;;;;:::o;24110:::-;24250:3;24265:75;24336:3;24327:6;24265:75;:::i;:::-;24365:2;24360:3;24356:12;24349:19;;24378:75;24449:3;24440:6;24378:75;:::i;:::-;24478:2;24473:3;24469:12;24462:19;;24498:3;24491:10;;24110:397;;;;;:::o;24513:435::-;24693:3;24715:95;24806:3;24797:6;24715:95;:::i;:::-;24708:102;;24827:95;24918:3;24909:6;24827:95;:::i;:::-;24820:102;;24939:3;24932:10;;24513:435;;;;;:::o;24954:379::-;25138:3;25160:147;25303:3;25160:147;:::i;:::-;25153:154;;25324:3;25317:10;;24954:379;;;:::o;25339:222::-;25432:4;25470:2;25459:9;25455:18;25447:26;;25483:71;25551:1;25540:9;25536:17;25527:6;25483:71;:::i;:::-;25339:222;;;;:::o;25567:640::-;25762:4;25800:3;25789:9;25785:19;25777:27;;25814:71;25882:1;25871:9;25867:17;25858:6;25814:71;:::i;:::-;25895:72;25963:2;25952:9;25948:18;25939:6;25895:72;:::i;:::-;25977;26045:2;26034:9;26030:18;26021:6;25977:72;:::i;:::-;26096:9;26090:4;26086:20;26081:2;26070:9;26066:18;26059:48;26124:76;26195:4;26186:6;26124:76;:::i;:::-;26116:84;;25567:640;;;;;;;:::o;26213:549::-;26390:4;26428:2;26417:9;26413:18;26405:26;;26441:71;26509:1;26498:9;26494:17;26485:6;26441:71;:::i;:::-;26522:72;26590:2;26579:9;26575:18;26566:6;26522:72;:::i;:::-;26641:9;26635:4;26631:20;26626:2;26615:9;26611:18;26604:48;26669:86;26750:4;26741:6;26733;26669:86;:::i;:::-;26661:94;;26213:549;;;;;;;:::o;26768:210::-;26855:4;26893:2;26882:9;26878:18;26870:26;;26906:65;26968:1;26957:9;26953:17;26944:6;26906:65;:::i;:::-;26768:210;;;;:::o;26984:222::-;27077:4;27115:2;27104:9;27100:18;27092:26;;27128:71;27196:1;27185:9;27181:17;27172:6;27128:71;:::i;:::-;26984:222;;;;:::o;27212:332::-;27333:4;27371:2;27360:9;27356:18;27348:26;;27384:71;27452:1;27441:9;27437:17;27428:6;27384:71;:::i;:::-;27465:72;27533:2;27522:9;27518:18;27509:6;27465:72;:::i;:::-;27212:332;;;;;:::o;27550:313::-;27663:4;27701:2;27690:9;27686:18;27678:26;;27750:9;27744:4;27740:20;27736:1;27725:9;27721:17;27714:47;27778:78;27851:4;27842:6;27778:78;:::i;:::-;27770:86;;27550:313;;;;:::o;27869:419::-;28035:4;28073:2;28062:9;28058:18;28050:26;;28122:9;28116:4;28112:20;28108:1;28097:9;28093:17;28086:47;28150:131;28276:4;28150:131;:::i;:::-;28142:139;;27869:419;;;:::o;28294:::-;28460:4;28498:2;28487:9;28483:18;28475:26;;28547:9;28541:4;28537:20;28533:1;28522:9;28518:17;28511:47;28575:131;28701:4;28575:131;:::i;:::-;28567:139;;28294:419;;;:::o;28719:::-;28885:4;28923:2;28912:9;28908:18;28900:26;;28972:9;28966:4;28962:20;28958:1;28947:9;28943:17;28936:47;29000:131;29126:4;29000:131;:::i;:::-;28992:139;;28719:419;;;:::o;29144:::-;29310:4;29348:2;29337:9;29333:18;29325:26;;29397:9;29391:4;29387:20;29383:1;29372:9;29368:17;29361:47;29425:131;29551:4;29425:131;:::i;:::-;29417:139;;29144:419;;;:::o;29569:::-;29735:4;29773:2;29762:9;29758:18;29750:26;;29822:9;29816:4;29812:20;29808:1;29797:9;29793:17;29786:47;29850:131;29976:4;29850:131;:::i;:::-;29842:139;;29569:419;;;:::o;29994:::-;30160:4;30198:2;30187:9;30183:18;30175:26;;30247:9;30241:4;30237:20;30233:1;30222:9;30218:17;30211:47;30275:131;30401:4;30275:131;:::i;:::-;30267:139;;29994:419;;;:::o;30419:::-;30585:4;30623:2;30612:9;30608:18;30600:26;;30672:9;30666:4;30662:20;30658:1;30647:9;30643:17;30636:47;30700:131;30826:4;30700:131;:::i;:::-;30692:139;;30419:419;;;:::o;30844:::-;31010:4;31048:2;31037:9;31033:18;31025:26;;31097:9;31091:4;31087:20;31083:1;31072:9;31068:17;31061:47;31125:131;31251:4;31125:131;:::i;:::-;31117:139;;30844:419;;;:::o;31269:::-;31435:4;31473:2;31462:9;31458:18;31450:26;;31522:9;31516:4;31512:20;31508:1;31497:9;31493:17;31486:47;31550:131;31676:4;31550:131;:::i;:::-;31542:139;;31269:419;;;:::o;31694:::-;31860:4;31898:2;31887:9;31883:18;31875:26;;31947:9;31941:4;31937:20;31933:1;31922:9;31918:17;31911:47;31975:131;32101:4;31975:131;:::i;:::-;31967:139;;31694:419;;;:::o;32119:::-;32285:4;32323:2;32312:9;32308:18;32300:26;;32372:9;32366:4;32362:20;32358:1;32347:9;32343:17;32336:47;32400:131;32526:4;32400:131;:::i;:::-;32392:139;;32119:419;;;:::o;32544:::-;32710:4;32748:2;32737:9;32733:18;32725:26;;32797:9;32791:4;32787:20;32783:1;32772:9;32768:17;32761:47;32825:131;32951:4;32825:131;:::i;:::-;32817:139;;32544:419;;;:::o;32969:::-;33135:4;33173:2;33162:9;33158:18;33150:26;;33222:9;33216:4;33212:20;33208:1;33197:9;33193:17;33186:47;33250:131;33376:4;33250:131;:::i;:::-;33242:139;;32969:419;;;:::o;33394:::-;33560:4;33598:2;33587:9;33583:18;33575:26;;33647:9;33641:4;33637:20;33633:1;33622:9;33618:17;33611:47;33675:131;33801:4;33675:131;:::i;:::-;33667:139;;33394:419;;;:::o;33819:::-;33985:4;34023:2;34012:9;34008:18;34000:26;;34072:9;34066:4;34062:20;34058:1;34047:9;34043:17;34036:47;34100:131;34226:4;34100:131;:::i;:::-;34092:139;;33819:419;;;:::o;34244:::-;34410:4;34448:2;34437:9;34433:18;34425:26;;34497:9;34491:4;34487:20;34483:1;34472:9;34468:17;34461:47;34525:131;34651:4;34525:131;:::i;:::-;34517:139;;34244:419;;;:::o;34669:::-;34835:4;34873:2;34862:9;34858:18;34850:26;;34922:9;34916:4;34912:20;34908:1;34897:9;34893:17;34886:47;34950:131;35076:4;34950:131;:::i;:::-;34942:139;;34669:419;;;:::o;35094:::-;35260:4;35298:2;35287:9;35283:18;35275:26;;35347:9;35341:4;35337:20;35333:1;35322:9;35318:17;35311:47;35375:131;35501:4;35375:131;:::i;:::-;35367:139;;35094:419;;;:::o;35519:::-;35685:4;35723:2;35712:9;35708:18;35700:26;;35772:9;35766:4;35762:20;35758:1;35747:9;35743:17;35736:47;35800:131;35926:4;35800:131;:::i;:::-;35792:139;;35519:419;;;:::o;35944:::-;36110:4;36148:2;36137:9;36133:18;36125:26;;36197:9;36191:4;36187:20;36183:1;36172:9;36168:17;36161:47;36225:131;36351:4;36225:131;:::i;:::-;36217:139;;35944:419;;;:::o;36369:::-;36535:4;36573:2;36562:9;36558:18;36550:26;;36622:9;36616:4;36612:20;36608:1;36597:9;36593:17;36586:47;36650:131;36776:4;36650:131;:::i;:::-;36642:139;;36369:419;;;:::o;36794:::-;36960:4;36998:2;36987:9;36983:18;36975:26;;37047:9;37041:4;37037:20;37033:1;37022:9;37018:17;37011:47;37075:131;37201:4;37075:131;:::i;:::-;37067:139;;36794:419;;;:::o;37219:::-;37385:4;37423:2;37412:9;37408:18;37400:26;;37472:9;37466:4;37462:20;37458:1;37447:9;37443:17;37436:47;37500:131;37626:4;37500:131;:::i;:::-;37492:139;;37219:419;;;:::o;37644:::-;37810:4;37848:2;37837:9;37833:18;37825:26;;37897:9;37891:4;37887:20;37883:1;37872:9;37868:17;37861:47;37925:131;38051:4;37925:131;:::i;:::-;37917:139;;37644:419;;;:::o;38069:::-;38235:4;38273:2;38262:9;38258:18;38250:26;;38322:9;38316:4;38312:20;38308:1;38297:9;38293:17;38286:47;38350:131;38476:4;38350:131;:::i;:::-;38342:139;;38069:419;;;:::o;38494:::-;38660:4;38698:2;38687:9;38683:18;38675:26;;38747:9;38741:4;38737:20;38733:1;38722:9;38718:17;38711:47;38775:131;38901:4;38775:131;:::i;:::-;38767:139;;38494:419;;;:::o;38919:::-;39085:4;39123:2;39112:9;39108:18;39100:26;;39172:9;39166:4;39162:20;39158:1;39147:9;39143:17;39136:47;39200:131;39326:4;39200:131;:::i;:::-;39192:139;;38919:419;;;:::o;39344:222::-;39437:4;39475:2;39464:9;39460:18;39452:26;;39488:71;39556:1;39545:9;39541:17;39532:6;39488:71;:::i;:::-;39344:222;;;;:::o;39572:129::-;39606:6;39633:20;;:::i;:::-;39623:30;;39662:33;39690:4;39682:6;39662:33;:::i;:::-;39572:129;;;:::o;39707:75::-;39740:6;39773:2;39767:9;39757:19;;39707:75;:::o;39788:307::-;39849:4;39939:18;39931:6;39928:30;39925:56;;;39961:18;;:::i;:::-;39925:56;39999:29;40021:6;39999:29;:::i;:::-;39991:37;;40083:4;40077;40073:15;40065:23;;39788:307;;;:::o;40101:308::-;40163:4;40253:18;40245:6;40242:30;40239:56;;;40275:18;;:::i;:::-;40239:56;40313:29;40335:6;40313:29;:::i;:::-;40305:37;;40397:4;40391;40387:15;40379:23;;40101:308;;;:::o;40415:98::-;40466:6;40500:5;40494:12;40484:22;;40415:98;;;:::o;40519:99::-;40571:6;40605:5;40599:12;40589:22;;40519:99;;;:::o;40624:168::-;40707:11;40741:6;40736:3;40729:19;40781:4;40776:3;40772:14;40757:29;;40624:168;;;;:::o;40798:147::-;40899:11;40936:3;40921:18;;40798:147;;;;:::o;40951:169::-;41035:11;41069:6;41064:3;41057:19;41109:4;41104:3;41100:14;41085:29;;40951:169;;;;:::o;41126:148::-;41228:11;41265:3;41250:18;;41126:148;;;;:::o;41280:305::-;41320:3;41339:20;41357:1;41339:20;:::i;:::-;41334:25;;41373:20;41391:1;41373:20;:::i;:::-;41368:25;;41527:1;41459:66;41455:74;41452:1;41449:81;41446:107;;;41533:18;;:::i;:::-;41446:107;41577:1;41574;41570:9;41563:16;;41280:305;;;;:::o;41591:185::-;41631:1;41648:20;41666:1;41648:20;:::i;:::-;41643:25;;41682:20;41700:1;41682:20;:::i;:::-;41677:25;;41721:1;41711:35;;41726:18;;:::i;:::-;41711:35;41768:1;41765;41761:9;41756:14;;41591:185;;;;:::o;41782:348::-;41822:7;41845:20;41863:1;41845:20;:::i;:::-;41840:25;;41879:20;41897:1;41879:20;:::i;:::-;41874:25;;42067:1;41999:66;41995:74;41992:1;41989:81;41984:1;41977:9;41970:17;41966:105;41963:131;;;42074:18;;:::i;:::-;41963:131;42122:1;42119;42115:9;42104:20;;41782:348;;;;:::o;42136:191::-;42176:4;42196:20;42214:1;42196:20;:::i;:::-;42191:25;;42230:20;42248:1;42230:20;:::i;:::-;42225:25;;42269:1;42266;42263:8;42260:34;;;42274:18;;:::i;:::-;42260:34;42319:1;42316;42312:9;42304:17;;42136:191;;;;:::o;42333:96::-;42370:7;42399:24;42417:5;42399:24;:::i;:::-;42388:35;;42333:96;;;:::o;42435:90::-;42469:7;42512:5;42505:13;42498:21;42487:32;;42435:90;;;:::o;42531:77::-;42568:7;42597:5;42586:16;;42531:77;;;:::o;42614:149::-;42650:7;42690:66;42683:5;42679:78;42668:89;;42614:149;;;:::o;42769:126::-;42806:7;42846:42;42839:5;42835:54;42824:65;;42769:126;;;:::o;42901:77::-;42938:7;42967:5;42956:16;;42901:77;;;:::o;42984:154::-;43068:6;43063:3;43058;43045:30;43130:1;43121:6;43116:3;43112:16;43105:27;42984:154;;;:::o;43144:307::-;43212:1;43222:113;43236:6;43233:1;43230:13;43222:113;;;43321:1;43316:3;43312:11;43306:18;43302:1;43297:3;43293:11;43286:39;43258:2;43255:1;43251:10;43246:15;;43222:113;;;43353:6;43350:1;43347:13;43344:101;;;43433:1;43424:6;43419:3;43415:16;43408:27;43344:101;43193:258;43144:307;;;:::o;43457:320::-;43501:6;43538:1;43532:4;43528:12;43518:22;;43585:1;43579:4;43575:12;43606:18;43596:81;;43662:4;43654:6;43650:17;43640:27;;43596:81;43724:2;43716:6;43713:14;43693:18;43690:38;43687:84;;;43743:18;;:::i;:::-;43687:84;43508:269;43457:320;;;:::o;43783:281::-;43866:27;43888:4;43866:27;:::i;:::-;43858:6;43854:40;43996:6;43984:10;43981:22;43960:18;43948:10;43945:34;43942:62;43939:88;;;44007:18;;:::i;:::-;43939:88;44047:10;44043:2;44036:22;43826:238;43783:281;;:::o;44070:233::-;44109:3;44132:24;44150:5;44132:24;:::i;:::-;44123:33;;44178:66;44171:5;44168:77;44165:103;;;44248:18;;:::i;:::-;44165:103;44295:1;44288:5;44284:13;44277:20;;44070:233;;;:::o;44309:100::-;44348:7;44377:26;44397:5;44377:26;:::i;:::-;44366:37;;44309:100;;;:::o;44415:79::-;44454:7;44483:5;44472:16;;44415:79;;;:::o;44500:94::-;44539:7;44568:20;44582:5;44568:20;:::i;:::-;44557:31;;44500:94;;;:::o;44600:79::-;44639:7;44668:5;44657:16;;44600:79;;;:::o;44685:176::-;44717:1;44734:20;44752:1;44734:20;:::i;:::-;44729:25;;44768:20;44786:1;44768:20;:::i;:::-;44763:25;;44807:1;44797:35;;44812:18;;:::i;:::-;44797:35;44853:1;44850;44846:9;44841:14;;44685:176;;;;:::o;44867:180::-;44915:77;44912:1;44905:88;45012:4;45009:1;45002:15;45036:4;45033:1;45026:15;45053:180;45101:77;45098:1;45091:88;45198:4;45195:1;45188:15;45222:4;45219:1;45212:15;45239:180;45287:77;45284:1;45277:88;45384:4;45381:1;45374:15;45408:4;45405:1;45398:15;45425:180;45473:77;45470:1;45463:88;45570:4;45567:1;45560:15;45594:4;45591:1;45584:15;45611:180;45659:77;45656:1;45649:88;45756:4;45753:1;45746:15;45780:4;45777:1;45770:15;45797:180;45845:77;45842:1;45835:88;45942:4;45939:1;45932:15;45966:4;45963:1;45956:15;45983:117;46092:1;46089;46082:12;46106:117;46215:1;46212;46205:12;46229:117;46338:1;46335;46328:12;46352:117;46461:1;46458;46451:12;46475:117;46584:1;46581;46574:12;46598:117;46707:1;46704;46697:12;46721:102;46762:6;46813:2;46809:7;46804:2;46797:5;46793:14;46789:28;46779:38;;46721:102;;;:::o;46829:94::-;46862:8;46910:5;46906:2;46902:14;46881:35;;46829:94;;;:::o;46929:180::-;47069:32;47065:1;47057:6;47053:14;47046:56;46929:180;:::o;47115:233::-;47255:34;47251:1;47243:6;47239:14;47232:58;47324:16;47319:2;47311:6;47307:15;47300:41;47115:233;:::o;47354:230::-;47494:34;47490:1;47482:6;47478:14;47471:58;47563:13;47558:2;47550:6;47546:15;47539:38;47354:230;:::o;47590:237::-;47730:34;47726:1;47718:6;47714:14;47707:58;47799:20;47794:2;47786:6;47782:15;47775:45;47590:237;:::o;47833:225::-;47973:34;47969:1;47961:6;47957:14;47950:58;48042:8;48037:2;48029:6;48025:15;48018:33;47833:225;:::o;48064:178::-;48204:30;48200:1;48192:6;48188:14;48181:54;48064:178;:::o;48248:223::-;48388:34;48384:1;48376:6;48372:14;48365:58;48457:6;48452:2;48444:6;48440:15;48433:31;48248:223;:::o;48477:175::-;48617:27;48613:1;48605:6;48601:14;48594:51;48477:175;:::o;48658:238::-;48798:34;48794:1;48786:6;48782:14;48775:58;48867:21;48862:2;48854:6;48850:15;48843:46;48658:238;:::o;48902:181::-;49042:33;49038:1;49030:6;49026:14;49019:57;48902:181;:::o;49089:231::-;49229:34;49225:1;49217:6;49213:14;49206:58;49298:14;49293:2;49285:6;49281:15;49274:39;49089:231;:::o;49326:243::-;49466:34;49462:1;49454:6;49450:14;49443:58;49535:26;49530:2;49522:6;49518:15;49511:51;49326:243;:::o;49575:229::-;49715:34;49711:1;49703:6;49699:14;49692:58;49784:12;49779:2;49771:6;49767:15;49760:37;49575:229;:::o;49810:228::-;49950:34;49946:1;49938:6;49934:14;49927:58;50019:11;50014:2;50006:6;50002:15;49995:36;49810:228;:::o;50044:182::-;50184:34;50180:1;50172:6;50168:14;50161:58;50044:182;:::o;50232:::-;50372:34;50368:1;50360:6;50356:14;50349:58;50232:182;:::o;50420:231::-;50560:34;50556:1;50548:6;50544:14;50537:58;50629:14;50624:2;50616:6;50612:15;50605:39;50420:231;:::o;50657:182::-;50797:34;50793:1;50785:6;50781:14;50774:58;50657:182;:::o;50845:228::-;50985:34;50981:1;50973:6;50969:14;50962:58;51054:11;51049:2;51041:6;51037:15;51030:36;50845:228;:::o;51079:234::-;51219:34;51215:1;51207:6;51203:14;51196:58;51288:17;51283:2;51275:6;51271:15;51264:42;51079:234;:::o;51319:169::-;51459:21;51455:1;51447:6;51443:14;51436:45;51319:169;:::o;51494:::-;51634:21;51630:1;51622:6;51618:14;51611:45;51494:169;:::o;51669:220::-;51809:34;51805:1;51797:6;51793:14;51786:58;51878:3;51873:2;51865:6;51861:15;51854:28;51669:220;:::o;51895:114::-;;:::o;52015:166::-;52155:18;52151:1;52143:6;52139:14;52132:42;52015:166;:::o;52187:236::-;52327:34;52323:1;52315:6;52311:14;52304:58;52396:19;52391:2;52383:6;52379:15;52372:44;52187:236;:::o;52429:231::-;52569:34;52565:1;52557:6;52553:14;52546:58;52638:14;52633:2;52625:6;52621:15;52614:39;52429:231;:::o;52666:239::-;52806:34;52802:1;52794:6;52790:14;52783:58;52875:22;52870:2;52862:6;52858:15;52851:47;52666:239;:::o;52911:122::-;52984:24;53002:5;52984:24;:::i;:::-;52977:5;52974:35;52964:63;;53023:1;53020;53013:12;52964:63;52911:122;:::o;53039:116::-;53109:21;53124:5;53109:21;:::i;:::-;53102:5;53099:32;53089:60;;53145:1;53142;53135:12;53089:60;53039:116;:::o;53161:122::-;53234:24;53252:5;53234:24;:::i;:::-;53227:5;53224:35;53214:63;;53273:1;53270;53263:12;53214:63;53161:122;:::o;53289:120::-;53361:23;53378:5;53361:23;:::i;:::-;53354:5;53351:34;53341:62;;53399:1;53396;53389:12;53341:62;53289:120;:::o;53415:122::-;53488:24;53506:5;53488:24;:::i;:::-;53481:5;53478:35;53468:63;;53527:1;53524;53517:12;53468:63;53415:122;:::o

Swarm Source

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