ETH Price: $3,381.86 (+0.43%)

Token

Meta Panther Club (MPC)
 

Overview

Max Total Supply

1,155 MPC

Holders

187

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
clvrke.eth
Balance
4 MPC
0xa1c2018fbed0b56d3548aabe70a55c0a8012210c
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:
MetaPantherClub

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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

pragma solidity ^0.8.9;

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

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

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

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

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

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



pragma solidity ^0.8.9;

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

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

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



pragma solidity ^0.8.9;


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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.9;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.9;

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

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



pragma solidity ^0.8.9;

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

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



pragma solidity ^0.8.9;


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

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



pragma solidity ^0.8.9;


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

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

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

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

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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.9;


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

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

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


pragma solidity >=0.8.9;
// to enable certain compiler features



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;
    
    //Mapping para atribuirle un URI para cada token
    mapping(uint256 => string) internal id_to_URI;

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

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

pragma solidity ^0.8.9;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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


pragma solidity ^0.8.9;

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

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


// Creator: Chiru Labs

pragma solidity ^0.8.9;

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

    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
    }

    struct AddressData {
        uint128 balance;
        uint128 numberMinted;
    }

    uint256 internal currentIndex;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @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 override {
        address owner = ERC721A.ownerOf(tokenId);
        require(to != owner, 'ERC721A: approval to current owner');

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        _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 override {
        _transfer(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, _data),
            'ERC721A: transfer to non ERC721Receiver implementer'
        );
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return tokenId < currentIndex;
    }

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

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

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

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

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

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

            uint256 updatedIndex = startTokenId;

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

                updatedIndex++;
            }

            currentIndex = updatedIndex;
        }

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

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) private {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

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

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

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

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


pragma solidity ^0.8.9;

contract MetaPantherClub is ERC721A, Ownable, ReentrancyGuard {
    using Strings for uint256;

    //amount of tokens that have been minted so far, in total and in presale
    uint256 private numberOfTotalTokens;
    
    //declares the maximum amount of tokens that can be minted, total and in presale
    uint256 private maxTotalTokens = 7000;
    uint256 private maxTokensPresale = 1000;

    //reservedmints for the team
    uint256 private _reservedMints;
    uint256 private maxReservedMints = 500;
    
    //initial part of the URI for the metadata
    string private _currentBaseURI;
        
    //cost of mints depending on state of sale    
    uint private mintCostWhitelist = 0.15 ether;
    uint private mintCostSale = 0.2 ether;
    
    //maximum amount of mints per wallet
    uint private maxMintPresale = 4;
    
    //dummy address that we use to sign the mint transaction to make sure it is valid
    address private dummy = 0x80E4929c869102140E69550BBECC20bEd61B080c;

    //amount of mints that each address has executed
    mapping(address => uint256) public mintsPerAddress;
    
    //current state os sale
    enum State {NoSale, Presale, PublicSale}

    //defines the uri for when the NFTs have not been yet revealed
    string public unrevealedURI;
    
    //marks the timestamp of when the respective sales open
    uint256 public presaleLaunchTime;
    uint256 public publicSaleLaunchTime;
    uint256 public revealTime;
    
    //declaring initial values for variables
    constructor() ERC721A("Meta Panther Club", "MPC"){
        
        unrevealedURI = "ipfs://QmdVAw21dtCMSsYQFAf8cMwXqZ7o7TKhLepGf6mKvQX1sP/";
    }
    
    //in case somebody accidentaly sends funds or transaction to contract
    receive() payable external {}
    fallback() payable external {
        revert();
    }
    
    //visualize baseURI
    function _baseURI() internal view virtual override returns (string memory) {
        return _currentBaseURI;
    }
    
    //change baseURI in case needed for IPFS
    function changeBaseURI(string memory baseURI_) public onlyOwner {
        _currentBaseURI = baseURI_;
    }
    
    function changeUnrevealedURI(string memory unrevealedURI_) public onlyOwner {
        unrevealedURI = unrevealedURI_;
    }
    
    //gets the tokenID of NFT to be minted
    /*function tokenId() internal view returns(uint256) {
        return numberOfTotalTokens + 1;
    }*/
    
    modifier onlyValidAccess(uint8 _v, bytes32 _r, bytes32 _s) {
        require( isValidAccessMessage(msg.sender,_v,_r,_s), 'Invalid Signature' );
        _;
    }
 
    /* 
    * @dev Verifies if message was signed by owner to give access to _add for this contract.
    *      Assumes Geth signature prefix.
    * @param _add Address of agent with access
    * @param _v ECDSA signature parameter v.
    * @param _r ECDSA signature parameters r.
    * @param _s ECDSA signature parameters s.
    * @return Validity of access message for a given address.
    */
    function isValidAccessMessage(address _add, uint8 _v, bytes32 _r, bytes32 _s) view public returns (bool) {
        bytes32 hash = keccak256(abi.encodePacked(address(this), _add));
        return dummy == ecrecover(keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)), _v, _r, _s);
    }

    //mint a @param number of NFTs in presale
    function whitelistMint(uint256 number, uint8 _v, bytes32 _r, bytes32 _s) onlyValidAccess(_v,  _r, _s) public payable nonReentrant {
        State saleState_ = saleState();
        require(saleState_ != State.NoSale, "Sale in not open yet!");
        //require(msg.sender == tx.origin, "No transaction from smart contracts!");
        require(saleState_ != State.PublicSale, "Presale has closed, Check out Public Sale!");
        require(totalSupply() + number <= maxTokensPresale, "Not enough NFTs left to mint..");
        require(mintsPerAddress[msg.sender] + number <= maxMintPresale, "Maximum 4 Mints per Address allowed!");
        require(msg.value >= mintCost(1) * number, "Not sufficient Ether to mint this amount of NFTs (Cost = 0.15 ether each NFT)");
        
        _safeMint(msg.sender, number);
        mintsPerAddress[msg.sender] += number;

    }
    
    //mint a @param number of NFTs in presale
    function presaleMint(uint256 number) public payable nonReentrant {
        State saleState_ = saleState();
        require(saleState_ != State.NoSale, "Sale in not open yet!");
        //require(msg.sender == tx.origin, "No transaction from smart contracts!");
        require(saleState_ != State.PublicSale, "Presale has closed, Check out Public Sale!");
        require(totalSupply() + number <= maxTokensPresale, "Not enough NFTs left to mint..");
        require(mintsPerAddress[msg.sender] + number <= maxMintPresale, "Maximum 4 Mints per Address allowed!");
        require(msg.value >= mintCost(2) * number, "Not sufficient Ether to mint this amount of NFTs (Cost = 0.2 ether each NFT)");
        
        _safeMint(msg.sender, number);
        mintsPerAddress[msg.sender] += number;

    }

    //mint a @param number of NFTs in public sale
    function publicSaleMint(uint256 number) public payable nonReentrant {
        State saleState_ = saleState();
        require(saleState_ != State.NoSale, "Sale in not open yet!");
        //require(msg.sender == tx.origin, "No transaction from smart contracts!");
        require(saleState_ != State.Presale, "Presale has closed, Check out Public Sale!");
        require(totalSupply() + number <= maxTotalTokens, "Not enough NFTs left to mint..");
        require(msg.value >= mintCost(2) * number, "Not sufficient Ether to mint this amount of NFTs (Cost = 0.2 ether each NFT)");
        
        _safeMint(msg.sender, number);
        mintsPerAddress[msg.sender] += number;
    }
    
    //reserved NFTs for creator
    function reservedMints(uint256 number, address recipient) public onlyOwner {
        require(_reservedMints + number <= maxReservedMints, "Not enough NFTs left to mint..");
        _safeMint(recipient, number);
        mintsPerAddress[recipient] += number;
    }

    function tokenURI(uint256 tokenId_) public view virtual override returns (string memory) {
        require(_exists(tokenId_), "ERC721Metadata: URI query for nonexistent token");
        
        //check to see that 24 hours have passed since beginning of publicsale launch
        if (revealTime == 0) {
            return unrevealedURI;
        }
        
        else {
            string memory baseURI = _baseURI();
            return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId_.toString(), '.json')) : "";
        }    
    }
    
    //begins the minting of the NFTs
    function switchToPresale() public onlyOwner{
        State saleState_ = saleState();
        require(saleState_ == State.NoSale, "Presale has already opened!");
        presaleLaunchTime = block.timestamp;
    }
    
    //begins the public sale
    function switchToPublicSale() public onlyOwner {
        State saleState_ = saleState();
        require(saleState_ != State.PublicSale, "Public Sale is already live!");
        require(saleState_ != State.NoSale, "Cannot change to Public Sale if there has not been a Presale!");
        
        publicSaleLaunchTime = block.timestamp;
    }
    
    //se the current account balance
    function accountBalance() public onlyOwner view returns(uint) {
        return address(this).balance;
    }
    
    //change the dummy account used for signing transactions
    function changeDummy(address _dummy) public onlyOwner {
        dummy = _dummy;
    }
    
    //to see the total amount of reserved mints left 
    function reservedMintsLeft() public onlyOwner view returns(uint) {
        return maxReservedMints - _reservedMints;
    }
    
    //get the funds from the minting of the NFTs
    function withdraw() public onlyOwner nonReentrant{
        uint256 balance = accountBalance();
        require(balance > 0, "No funds to retrieve!");

        _withdraw(payable(0x90ED73fF39F26b53854230060cC067cB92C18a4a), balance); //to avoid dust eth
        
    }

    function _withdraw(address payable account, uint256 amount) internal {
        (bool sent, ) = account.call{value: amount}("");
        require(sent, "Failed to send Ether");
    }

    //see the current state of the sale
    function saleState() public view returns(State){
        if (presaleLaunchTime == 0) {
            return State.NoSale;
        }
        else if (publicSaleLaunchTime == 0) {
            return State.Presale;
        }
        else {
            return State.PublicSale;
        }
    }

    //get the current price to mint
    function mintCost(uint type_) public view returns(uint256) {
        require(type_ > 0 && type_ < 3, "Invalid Type!");
        if (type_ == 1) {
            return mintCostWhitelist;
        }
        else {
            return mintCostSale;
        }
    }

    //reveal the NFTs
    function reveal() public onlyOwner {
        revealTime = block.timestamp;
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"accountBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"changeBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_dummy","type":"address"}],"name":"changeDummy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"unrevealedURI_","type":"string"}],"name":"changeUnrevealedURI","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":"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":"_add","type":"address"},{"internalType":"uint8","name":"_v","type":"uint8"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"}],"name":"isValidAccessMessage","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"type_","type":"uint256"}],"name":"mintCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintsPerAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"presaleLaunchTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"}],"name":"presaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicSaleLaunchTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"}],"name":"publicSaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"reservedMints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reservedMintsLeft","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleState","outputs":[{"internalType":"enum MetaPantherClub.State","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"switchToPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"switchToPublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unrevealedURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"},{"internalType":"uint8","name":"_v","type":"uint8"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052611b58600a556103e8600b556101f4600d55670214e8348c4f0000600f556702c68af0bb14000060105560046011557380e4929c869102140e69550bbecc20bed61b080c601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200009557600080fd5b506040518060400160405280601181526020017f4d6574612050616e7468657220436c75620000000000000000000000000000008152506040518060400160405280600381526020017f4d5043000000000000000000000000000000000000000000000000000000000081525081600190805190602001906200011a92919062000264565b5080600290805190602001906200013392919062000264565b505050620001566200014a6200019660201b60201c565b6200019e60201b60201c565b600160088190555060405180606001604052806036815260200162005e6760369139601490805190602001906200018f92919062000264565b5062000379565b600033905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002729062000343565b90600052602060002090601f016020900481019282620002965760008555620002e2565b82601f10620002b157805160ff1916838001178555620002e2565b82800160010185558215620002e2579182015b82811115620002e1578251825591602001919060010190620002c4565b5b509050620002f19190620002f5565b5090565b5b8082111562000310576000816000905550600101620002f6565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200035c57607f821691505b6020821081141562000373576200037262000314565b5b50919050565b615ade80620003896000396000f3fe60806040526004361061023e5760003560e01c80637035bf181161012e578063b88d4fde116100ab578063cd5fe7251161006f578063cd5fe72514610864578063e985e9c51461088f578063eab41782146108cc578063f2fde38b146108e3578063ff9849941461090c57610245565b8063b88d4fde1461078e578063ba829d71146107b7578063c4d8b9df146107e2578063c87b56dd1461080b578063c9b298f11461084857610245565b8063a22cb465116100f2578063a22cb465146106de578063a475b5dd14610707578063b0a1c1c41461071e578063b3ab66b014610749578063b620e9751461076557610245565b80637035bf181461060957806370a0823114610634578063715018a6146106715780638da5cb5b1461068857806395d89b41146106b357610245565b80632f745c59116101bc57806342842e0e1161018057806342842e0e146105105780634520e916146105395780634f6ccce714610564578063603f4d52146105a15780636352211e146105cc57610245565b80632f745c59146104195780633023eba614610456578063326241141461049357806339a0c6f9146104d05780633ccfd60b146104f957610245565b8063095ea7b311610203578063095ea7b31461033457806318160ddd1461035d5780631a17fe5e1461038857806323b872dd146103b357806327de8f27146103dc57610245565b8062a1990e1461024a5780630191a6571461026657806301ffc9a71461028f57806306fdde03146102cc578063081812fc146102f757610245565b3661024557005b600080fd5b610264600480360381019061025f9190613b62565b610923565b005b34801561027257600080fd5b5061028d60048036038101906102889190613c27565b610c49565b005b34801561029b57600080fd5b506102b660048036038101906102b19190613cac565b610d09565b6040516102c39190613cf4565b60405180910390f35b3480156102d857600080fd5b506102e1610e53565b6040516102ee9190613da8565b60405180910390f35b34801561030357600080fd5b5061031e60048036038101906103199190613dca565b610ee5565b60405161032b9190613e06565b60405180910390f35b34801561034057600080fd5b5061035b60048036038101906103569190613e21565b610f6a565b005b34801561036957600080fd5b50610372611083565b60405161037f9190613e70565b60405180910390f35b34801561039457600080fd5b5061039d61108c565b6040516103aa9190613e70565b60405180910390f35b3480156103bf57600080fd5b506103da60048036038101906103d59190613e8b565b611092565b005b3480156103e857600080fd5b5061040360048036038101906103fe9190613dca565b6110a2565b6040516104109190613e70565b60405180910390f35b34801561042557600080fd5b50610440600480360381019061043b9190613e21565b611110565b60405161044d9190613e70565b60405180910390f35b34801561046257600080fd5b5061047d60048036038101906104789190613c27565b611302565b60405161048a9190613e70565b60405180910390f35b34801561049f57600080fd5b506104ba60048036038101906104b59190613ede565b61131a565b6040516104c79190613cf4565b60405180910390f35b3480156104dc57600080fd5b506104f760048036038101906104f2919061407a565b611418565b005b34801561050557600080fd5b5061050e6114ae565b005b34801561051c57600080fd5b5061053760048036038101906105329190613e8b565b6115f0565b005b34801561054557600080fd5b5061054e611610565b60405161055b9190613e70565b60405180910390f35b34801561057057600080fd5b5061058b60048036038101906105869190613dca565b6116a3565b6040516105989190613e70565b60405180910390f35b3480156105ad57600080fd5b506105b66116f6565b6040516105c3919061413a565b60405180910390f35b3480156105d857600080fd5b506105f360048036038101906105ee9190613dca565b611727565b6040516106009190613e06565b60405180910390f35b34801561061557600080fd5b5061061e61173d565b60405161062b9190613da8565b60405180910390f35b34801561064057600080fd5b5061065b60048036038101906106569190613c27565b6117cb565b6040516106689190613e70565b60405180910390f35b34801561067d57600080fd5b506106866118b4565b005b34801561069457600080fd5b5061069d61193c565b6040516106aa9190613e06565b60405180910390f35b3480156106bf57600080fd5b506106c8611966565b6040516106d59190613da8565b60405180910390f35b3480156106ea57600080fd5b5061070560048036038101906107009190614181565b6119f8565b005b34801561071357600080fd5b5061071c611b79565b005b34801561072a57600080fd5b50610733611bfe565b6040516107409190613e70565b60405180910390f35b610763600480360381019061075e9190613dca565b611c82565b005b34801561077157600080fd5b5061078c600480360381019061078791906141c1565b611ec6565b005b34801561079a57600080fd5b506107b560048036038101906107b091906142a2565b611ff8565b005b3480156107c357600080fd5b506107cc612054565b6040516107d99190613e70565b60405180910390f35b3480156107ee57600080fd5b506108096004803603810190610804919061407a565b61205a565b005b34801561081757600080fd5b50610832600480360381019061082d9190613dca565b6120f0565b60405161083f9190613da8565b60405180910390f35b610862600480360381019061085d9190613dca565b612235565b005b34801561087057600080fd5b50610879612507565b6040516108869190613e70565b60405180910390f35b34801561089b57600080fd5b506108b660048036038101906108b19190614325565b61250d565b6040516108c39190613cf4565b60405180910390f35b3480156108d857600080fd5b506108e16125a1565b005b3480156108ef57600080fd5b5061090a60048036038101906109059190613c27565b61269a565b005b34801561091857600080fd5b50610921612792565b005b8282826109323384848461131a565b610971576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610968906143b1565b60405180910390fd5b600260085414156109b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ae9061441d565b60405180910390fd5b600260088190555060006109c96116f6565b9050600060028111156109df576109de6140c3565b5b8160028111156109f2576109f16140c3565b5b1415610a33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2a90614489565b60405180910390fd5b600280811115610a4657610a456140c3565b5b816002811115610a5957610a586140c3565b5b1415610a9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a919061451b565b60405180910390fd5b600b5488610aa6611083565b610ab0919061456a565b1115610af1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae89061460c565b60405180910390fd5b60115488601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b3f919061456a565b1115610b80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b779061469e565b60405180910390fd5b87610b8b60016110a2565b610b9591906146be565b341015610bd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bce906147b0565b60405180910390fd5b610be133896128f3565b87601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610c30919061456a565b9250508190555050600160088190555050505050505050565b610c51612911565b73ffffffffffffffffffffffffffffffffffffffff16610c6f61193c565b73ffffffffffffffffffffffffffffffffffffffff1614610cc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbc9061481c565b60405180910390fd5b80601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610dd457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610e3c57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610e4c5750610e4b82612919565b5b9050919050565b606060018054610e629061486b565b80601f0160208091040260200160405190810160405280929190818152602001828054610e8e9061486b565b8015610edb5780601f10610eb057610100808354040283529160200191610edb565b820191906000526020600020905b815481529060010190602001808311610ebe57829003601f168201915b5050505050905090565b6000610ef082612983565b610f2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f269061490f565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610f7582611727565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610fe6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fdd906149a1565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16611005612911565b73ffffffffffffffffffffffffffffffffffffffff16148061103457506110338161102e612911565b61250d565b5b611073576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106a90614a33565b60405180910390fd5b61107e838383612990565b505050565b60008054905090565b60165481565b61109d838383612a42565b505050565b600080821180156110b35750600382105b6110f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e990614a9f565b60405180910390fd5b600182141561110557600f54905061110b565b60105490505b919050565b600061111b836117cb565b821061115c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115390614b31565b60405180910390fd5b6000611166611083565b905060008060005b838110156112c0576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461126057806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156112b257868414156112a95781955050505050506112fc565b83806001019450505b50808060010191505061116e565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f390614bc3565b60405180910390fd5b92915050565b60136020528060005260406000206000915090505481565b6000803086604051602001611330929190614c2b565b60405160208183030381529060405280519060200120905060018160405160200161135b9190614ccf565b60405160208183030381529060405280519060200120868686604051600081526020016040526040516113919493929190614d13565b6020604051602081039080840390855afa1580156113b3573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff16601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614915050949350505050565b611420612911565b73ffffffffffffffffffffffffffffffffffffffff1661143e61193c565b73ffffffffffffffffffffffffffffffffffffffff1614611494576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148b9061481c565b60405180910390fd5b80600e90805190602001906114aa9291906139cc565b5050565b6114b6612911565b73ffffffffffffffffffffffffffffffffffffffff166114d461193c565b73ffffffffffffffffffffffffffffffffffffffff161461152a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115219061481c565b60405180910390fd5b60026008541415611570576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115679061441d565b60405180910390fd5b60026008819055506000611582611bfe565b9050600081116115c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115be90614da4565b60405180910390fd5b6115e57390ed73ff39f26b53854230060cc067cb92c18a4a82612f82565b506001600881905550565b61160b83838360405180602001604052806000815250611ff8565b505050565b600061161a612911565b73ffffffffffffffffffffffffffffffffffffffff1661163861193c565b73ffffffffffffffffffffffffffffffffffffffff161461168e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116859061481c565b60405180910390fd5b600c54600d5461169e9190614dc4565b905090565b60006116ad611083565b82106116ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e590614e6a565b60405180910390fd5b819050919050565b600080601554141561170b5760009050611724565b6000601654141561171f5760019050611724565b600290505b90565b600061173282613033565b600001519050919050565b6014805461174a9061486b565b80601f01602080910402602001604051908101604052809291908181526020018280546117769061486b565b80156117c35780601f10611798576101008083540402835291602001916117c3565b820191906000526020600020905b8154815290600101906020018083116117a657829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561183c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183390614efc565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6118bc612911565b73ffffffffffffffffffffffffffffffffffffffff166118da61193c565b73ffffffffffffffffffffffffffffffffffffffff1614611930576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119279061481c565b60405180910390fd5b61193a60006131cd565b565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600280546119759061486b565b80601f01602080910402602001604051908101604052809291908181526020018280546119a19061486b565b80156119ee5780601f106119c3576101008083540402835291602001916119ee565b820191906000526020600020905b8154815290600101906020018083116119d157829003601f168201915b5050505050905090565b611a00612911565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6590614f68565b60405180910390fd5b8060066000611a7b612911565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611b28612911565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b6d9190613cf4565b60405180910390a35050565b611b81612911565b73ffffffffffffffffffffffffffffffffffffffff16611b9f61193c565b73ffffffffffffffffffffffffffffffffffffffff1614611bf5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bec9061481c565b60405180910390fd5b42601781905550565b6000611c08612911565b73ffffffffffffffffffffffffffffffffffffffff16611c2661193c565b73ffffffffffffffffffffffffffffffffffffffff1614611c7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c739061481c565b60405180910390fd5b47905090565b60026008541415611cc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbf9061441d565b60405180910390fd5b60026008819055506000611cda6116f6565b905060006002811115611cf057611cef6140c3565b5b816002811115611d0357611d026140c3565b5b1415611d44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3b90614489565b60405180910390fd5b60016002811115611d5857611d576140c3565b5b816002811115611d6b57611d6a6140c3565b5b1415611dac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da39061451b565b60405180910390fd5b600a5482611db8611083565b611dc2919061456a565b1115611e03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dfa9061460c565b60405180910390fd5b81611e0e60026110a2565b611e1891906146be565b341015611e5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5190615020565b60405180910390fd5b611e6433836128f3565b81601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611eb3919061456a565b9250508190555050600160088190555050565b611ece612911565b73ffffffffffffffffffffffffffffffffffffffff16611eec61193c565b73ffffffffffffffffffffffffffffffffffffffff1614611f42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f399061481c565b60405180910390fd5b600d5482600c54611f53919061456a565b1115611f94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8b9061460c565b60405180910390fd5b611f9e81836128f3565b81601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611fed919061456a565b925050819055505050565b612003848484612a42565b61200f84848484613293565b61204e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612045906150b2565b60405180910390fd5b50505050565b60175481565b612062612911565b73ffffffffffffffffffffffffffffffffffffffff1661208061193c565b73ffffffffffffffffffffffffffffffffffffffff16146120d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120cd9061481c565b60405180910390fd5b80601490805190602001906120ec9291906139cc565b5050565b60606120fb82612983565b61213a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213190615144565b60405180910390fd5b600060175414156121d757601480546121529061486b565b80601f016020809104026020016040519081016040528092919081815260200182805461217e9061486b565b80156121cb5780601f106121a0576101008083540402835291602001916121cb565b820191906000526020600020905b8154815290600101906020018083116121ae57829003601f168201915b50505050509050612230565b60006121e161342a565b90506000815111612201576040518060200160405280600081525061222c565b8061220b846134bc565b60405160200161221c9291906151e1565b6040516020818303038152906040525b9150505b919050565b6002600854141561227b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122729061441d565b60405180910390fd5b6002600881905550600061228d6116f6565b9050600060028111156122a3576122a26140c3565b5b8160028111156122b6576122b56140c3565b5b14156122f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ee90614489565b60405180910390fd5b60028081111561230a576123096140c3565b5b81600281111561231d5761231c6140c3565b5b141561235e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123559061451b565b60405180910390fd5b600b548261236a611083565b612374919061456a565b11156123b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ac9061460c565b60405180910390fd5b60115482601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612403919061456a565b1115612444576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243b9061469e565b60405180910390fd5b8161244f60026110a2565b61245991906146be565b34101561249b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249290615020565b60405180910390fd5b6124a533836128f3565b81601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124f4919061456a565b9250508190555050600160088190555050565b60155481565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6125a9612911565b73ffffffffffffffffffffffffffffffffffffffff166125c761193c565b73ffffffffffffffffffffffffffffffffffffffff161461261d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126149061481c565b60405180910390fd5b60006126276116f6565b90506000600281111561263d5761263c6140c3565b5b8160028111156126505761264f6140c3565b5b14612690576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126879061525c565b60405180910390fd5b4260158190555050565b6126a2612911565b73ffffffffffffffffffffffffffffffffffffffff166126c061193c565b73ffffffffffffffffffffffffffffffffffffffff1614612716576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270d9061481c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612786576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277d906152ee565b60405180910390fd5b61278f816131cd565b50565b61279a612911565b73ffffffffffffffffffffffffffffffffffffffff166127b861193c565b73ffffffffffffffffffffffffffffffffffffffff161461280e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128059061481c565b60405180910390fd5b60006128186116f6565b905060028081111561282d5761282c6140c3565b5b8160028111156128405761283f6140c3565b5b1415612881576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128789061535a565b60405180910390fd5b60006002811115612895576128946140c3565b5b8160028111156128a8576128a76140c3565b5b14156128e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128e0906153ec565b60405180910390fd5b4260168190555050565b61290d82826040518060200160405280600081525061361d565b5050565b600033905090565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000612a4d82613033565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16612a74612911565b73ffffffffffffffffffffffffffffffffffffffff161480612ad05750612a99612911565b73ffffffffffffffffffffffffffffffffffffffff16612ab884610ee5565b73ffffffffffffffffffffffffffffffffffffffff16145b80612aec5750612aeb8260000151612ae6612911565b61250d565b5b905080612b2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b259061547e565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612ba0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b9790615510565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612c10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c07906155a2565b60405180910390fd5b612c1d858585600161362f565b612c2d6000848460000151612990565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836003600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612f1257612e7181612983565b15612f115782600001516003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612f7b8585856001613635565b5050505050565b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612fa8906155f3565b60006040518083038185875af1925050503d8060008114612fe5576040519150601f19603f3d011682016040523d82523d6000602084013e612fea565b606091505b505090508061302e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161302590615654565b60405180910390fd5b505050565b61303b613a52565b61304482612983565b613083576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161307a906156e6565b60405180910390fd5b60008290505b6000811061318c576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461317d5780925050506131c8565b50808060019003915050613089565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131bf90615778565b60405180910390fd5b919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006132b48473ffffffffffffffffffffffffffffffffffffffff1661363b565b1561341d578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026132dd612911565b8786866040518563ffffffff1660e01b81526004016132ff94939291906157ed565b602060405180830381600087803b15801561331957600080fd5b505af192505050801561334a57506040513d601f19601f82011682018060405250810190613347919061584e565b60015b6133cd573d806000811461337a576040519150601f19603f3d011682016040523d82523d6000602084013e61337f565b606091505b506000815114156133c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133bc906150b2565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613422565b600190505b949350505050565b6060600e80546134399061486b565b80601f01602080910402602001604051908101604052809291908181526020018280546134659061486b565b80156134b25780601f10613487576101008083540402835291602001916134b2565b820191906000526020600020905b81548152906001019060200180831161349557829003601f168201915b5050505050905090565b60606000821415613504576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613618565b600082905060005b6000821461353657808061351f9061587b565b915050600a8261352f91906158f3565b915061350c565b60008167ffffffffffffffff81111561355257613551613f4f565b5b6040519080825280601f01601f1916602001820160405280156135845781602001600182028036833780820191505090505b5090505b600085146136115760018261359d9190614dc4565b9150600a856135ac9190615924565b60306135b8919061456a565b60f81b8183815181106135ce576135cd615955565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561360a91906158f3565b9450613588565b8093505050505b919050565b61362a838383600161364e565b505050565b50505050565b50505050565b600080823b905060008111915050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156136c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136bb906159f6565b60405180910390fd5b6000841415613708576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136ff90615a88565b60405180910390fd5b613715600086838761362f565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b858110156139af57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4831561399a5761395a6000888488613293565b613999576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613990906150b2565b60405180910390fd5b5b818060010192505080806001019150506138e3565b5080600081905550506139c56000868387613635565b5050505050565b8280546139d89061486b565b90600052602060002090601f0160209004810192826139fa5760008555613a41565b82601f10613a1357805160ff1916838001178555613a41565b82800160010185558215613a41579182015b82811115613a40578251825591602001919060010190613a25565b5b509050613a4e9190613a8c565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115613aa5576000816000905550600101613a8d565b5090565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b613ad081613abd565b8114613adb57600080fd5b50565b600081359050613aed81613ac7565b92915050565b600060ff82169050919050565b613b0981613af3565b8114613b1457600080fd5b50565b600081359050613b2681613b00565b92915050565b6000819050919050565b613b3f81613b2c565b8114613b4a57600080fd5b50565b600081359050613b5c81613b36565b92915050565b60008060008060808587031215613b7c57613b7b613ab3565b5b6000613b8a87828801613ade565b9450506020613b9b87828801613b17565b9350506040613bac87828801613b4d565b9250506060613bbd87828801613b4d565b91505092959194509250565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613bf482613bc9565b9050919050565b613c0481613be9565b8114613c0f57600080fd5b50565b600081359050613c2181613bfb565b92915050565b600060208284031215613c3d57613c3c613ab3565b5b6000613c4b84828501613c12565b91505092915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613c8981613c54565b8114613c9457600080fd5b50565b600081359050613ca681613c80565b92915050565b600060208284031215613cc257613cc1613ab3565b5b6000613cd084828501613c97565b91505092915050565b60008115159050919050565b613cee81613cd9565b82525050565b6000602082019050613d096000830184613ce5565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613d49578082015181840152602081019050613d2e565b83811115613d58576000848401525b50505050565b6000601f19601f8301169050919050565b6000613d7a82613d0f565b613d848185613d1a565b9350613d94818560208601613d2b565b613d9d81613d5e565b840191505092915050565b60006020820190508181036000830152613dc28184613d6f565b905092915050565b600060208284031215613de057613ddf613ab3565b5b6000613dee84828501613ade565b91505092915050565b613e0081613be9565b82525050565b6000602082019050613e1b6000830184613df7565b92915050565b60008060408385031215613e3857613e37613ab3565b5b6000613e4685828601613c12565b9250506020613e5785828601613ade565b9150509250929050565b613e6a81613abd565b82525050565b6000602082019050613e856000830184613e61565b92915050565b600080600060608486031215613ea457613ea3613ab3565b5b6000613eb286828701613c12565b9350506020613ec386828701613c12565b9250506040613ed486828701613ade565b9150509250925092565b60008060008060808587031215613ef857613ef7613ab3565b5b6000613f0687828801613c12565b9450506020613f1787828801613b17565b9350506040613f2887828801613b4d565b9250506060613f3987828801613b4d565b91505092959194509250565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613f8782613d5e565b810181811067ffffffffffffffff82111715613fa657613fa5613f4f565b5b80604052505050565b6000613fb9613aa9565b9050613fc58282613f7e565b919050565b600067ffffffffffffffff821115613fe557613fe4613f4f565b5b613fee82613d5e565b9050602081019050919050565b82818337600083830152505050565b600061401d61401884613fca565b613faf565b90508281526020810184848401111561403957614038613f4a565b5b614044848285613ffb565b509392505050565b600082601f83011261406157614060613f45565b5b813561407184826020860161400a565b91505092915050565b6000602082840312156140905761408f613ab3565b5b600082013567ffffffffffffffff8111156140ae576140ad613ab8565b5b6140ba8482850161404c565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60038110614103576141026140c3565b5b50565b6000819050614114826140f2565b919050565b600061412482614106565b9050919050565b61413481614119565b82525050565b600060208201905061414f600083018461412b565b92915050565b61415e81613cd9565b811461416957600080fd5b50565b60008135905061417b81614155565b92915050565b6000806040838503121561419857614197613ab3565b5b60006141a685828601613c12565b92505060206141b78582860161416c565b9150509250929050565b600080604083850312156141d8576141d7613ab3565b5b60006141e685828601613ade565b92505060206141f785828601613c12565b9150509250929050565b600067ffffffffffffffff82111561421c5761421b613f4f565b5b61422582613d5e565b9050602081019050919050565b600061424561424084614201565b613faf565b90508281526020810184848401111561426157614260613f4a565b5b61426c848285613ffb565b509392505050565b600082601f83011261428957614288613f45565b5b8135614299848260208601614232565b91505092915050565b600080600080608085870312156142bc576142bb613ab3565b5b60006142ca87828801613c12565b94505060206142db87828801613c12565b93505060406142ec87828801613ade565b925050606085013567ffffffffffffffff81111561430d5761430c613ab8565b5b61431987828801614274565b91505092959194509250565b6000806040838503121561433c5761433b613ab3565b5b600061434a85828601613c12565b925050602061435b85828601613c12565b9150509250929050565b7f496e76616c6964205369676e6174757265000000000000000000000000000000600082015250565b600061439b601183613d1a565b91506143a682614365565b602082019050919050565b600060208201905081810360008301526143ca8161438e565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614407601f83613d1a565b9150614412826143d1565b602082019050919050565b60006020820190508181036000830152614436816143fa565b9050919050565b7f53616c6520696e206e6f74206f70656e20796574210000000000000000000000600082015250565b6000614473601583613d1a565b915061447e8261443d565b602082019050919050565b600060208201905081810360008301526144a281614466565b9050919050565b7f50726573616c652068617320636c6f7365642c20436865636b206f757420507560008201527f626c69632053616c652100000000000000000000000000000000000000000000602082015250565b6000614505602a83613d1a565b9150614510826144a9565b604082019050919050565b60006020820190508181036000830152614534816144f8565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061457582613abd565b915061458083613abd565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156145b5576145b461453b565b5b828201905092915050565b7f4e6f7420656e6f756768204e465473206c65667420746f206d696e742e2e0000600082015250565b60006145f6601e83613d1a565b9150614601826145c0565b602082019050919050565b60006020820190508181036000830152614625816145e9565b9050919050565b7f4d6178696d756d2034204d696e747320706572204164647265737320616c6c6f60008201527f7765642100000000000000000000000000000000000000000000000000000000602082015250565b6000614688602483613d1a565b91506146938261462c565b604082019050919050565b600060208201905081810360008301526146b78161467b565b9050919050565b60006146c982613abd565b91506146d483613abd565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561470d5761470c61453b565b5b828202905092915050565b7f4e6f742073756666696369656e7420457468657220746f206d696e742074686960008201527f7320616d6f756e74206f66204e4654732028436f7374203d20302e313520657460208201527f6865722065616368204e46542900000000000000000000000000000000000000604082015250565b600061479a604d83613d1a565b91506147a582614718565b606082019050919050565b600060208201905081810360008301526147c98161478d565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614806602083613d1a565b9150614811826147d0565b602082019050919050565b60006020820190508181036000830152614835816147f9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061488357607f821691505b602082108114156148975761489661483c565b5b50919050565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b60006148f9602d83613d1a565b91506149048261489d565b604082019050919050565b60006020820190508181036000830152614928816148ec565b9050919050565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b600061498b602283613d1a565b91506149968261492f565b604082019050919050565b600060208201905081810360008301526149ba8161497e565b9050919050565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b6000614a1d603983613d1a565b9150614a28826149c1565b604082019050919050565b60006020820190508181036000830152614a4c81614a10565b9050919050565b7f496e76616c696420547970652100000000000000000000000000000000000000600082015250565b6000614a89600d83613d1a565b9150614a9482614a53565b602082019050919050565b60006020820190508181036000830152614ab881614a7c565b9050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b6000614b1b602283613d1a565b9150614b2682614abf565b604082019050919050565b60006020820190508181036000830152614b4a81614b0e565b9050919050565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b6000614bad602e83613d1a565b9150614bb882614b51565b604082019050919050565b60006020820190508181036000830152614bdc81614ba0565b9050919050565b60008160601b9050919050565b6000614bfb82614be3565b9050919050565b6000614c0d82614bf0565b9050919050565b614c25614c2082613be9565b614c02565b82525050565b6000614c378285614c14565b601482019150614c478284614c14565b6014820191508190509392505050565b600081905092915050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b6000614c98601c83614c57565b9150614ca382614c62565b601c82019050919050565b6000819050919050565b614cc9614cc482613b2c565b614cae565b82525050565b6000614cda82614c8b565b9150614ce68284614cb8565b60208201915081905092915050565b614cfe81613b2c565b82525050565b614d0d81613af3565b82525050565b6000608082019050614d286000830187614cf5565b614d356020830186614d04565b614d426040830185614cf5565b614d4f6060830184614cf5565b95945050505050565b7f4e6f2066756e647320746f207265747269657665210000000000000000000000600082015250565b6000614d8e601583613d1a565b9150614d9982614d58565b602082019050919050565b60006020820190508181036000830152614dbd81614d81565b9050919050565b6000614dcf82613abd565b9150614dda83613abd565b925082821015614ded57614dec61453b565b5b828203905092915050565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b6000614e54602383613d1a565b9150614e5f82614df8565b604082019050919050565b60006020820190508181036000830152614e8381614e47565b9050919050565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b6000614ee6602b83613d1a565b9150614ef182614e8a565b604082019050919050565b60006020820190508181036000830152614f1581614ed9565b9050919050565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b6000614f52601a83613d1a565b9150614f5d82614f1c565b602082019050919050565b60006020820190508181036000830152614f8181614f45565b9050919050565b7f4e6f742073756666696369656e7420457468657220746f206d696e742074686960008201527f7320616d6f756e74206f66204e4654732028436f7374203d20302e322065746860208201527f65722065616368204e4654290000000000000000000000000000000000000000604082015250565b600061500a604c83613d1a565b915061501582614f88565b606082019050919050565b6000602082019050818103600083015261503981614ffd565b9050919050565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b600061509c603383613d1a565b91506150a782615040565b604082019050919050565b600060208201905081810360008301526150cb8161508f565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b600061512e602f83613d1a565b9150615139826150d2565b604082019050919050565b6000602082019050818103600083015261515d81615121565b9050919050565b600061516f82613d0f565b6151798185614c57565b9350615189818560208601613d2b565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b60006151cb600583614c57565b91506151d682615195565b600582019050919050565b60006151ed8285615164565b91506151f98284615164565b9150615204826151be565b91508190509392505050565b7f50726573616c652068617320616c7265616479206f70656e6564210000000000600082015250565b6000615246601b83613d1a565b915061525182615210565b602082019050919050565b6000602082019050818103600083015261527581615239565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006152d8602683613d1a565b91506152e38261527c565b604082019050919050565b60006020820190508181036000830152615307816152cb565b9050919050565b7f5075626c69632053616c6520697320616c7265616479206c6976652100000000600082015250565b6000615344601c83613d1a565b915061534f8261530e565b602082019050919050565b6000602082019050818103600083015261537381615337565b9050919050565b7f43616e6e6f74206368616e676520746f205075626c69632053616c652069662060008201527f746865726520686173206e6f74206265656e20612050726573616c6521000000602082015250565b60006153d6603d83613d1a565b91506153e18261537a565b604082019050919050565b60006020820190508181036000830152615405816153c9565b9050919050565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b6000615468603283613d1a565b91506154738261540c565b604082019050919050565b600060208201905081810360008301526154978161545b565b9050919050565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b60006154fa602683613d1a565b91506155058261549e565b604082019050919050565b60006020820190508181036000830152615529816154ed565b9050919050565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061558c602583613d1a565b915061559782615530565b604082019050919050565b600060208201905081810360008301526155bb8161557f565b9050919050565b600081905092915050565b50565b60006155dd6000836155c2565b91506155e8826155cd565b600082019050919050565b60006155fe826155d0565b9150819050919050565b7f4661696c656420746f2073656e64204574686572000000000000000000000000600082015250565b600061563e601483613d1a565b915061564982615608565b602082019050919050565b6000602082019050818103600083015261566d81615631565b9050919050565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b60006156d0602a83613d1a565b91506156db82615674565b604082019050919050565b600060208201905081810360008301526156ff816156c3565b9050919050565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b6000615762602f83613d1a565b915061576d82615706565b604082019050919050565b6000602082019050818103600083015261579181615755565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006157bf82615798565b6157c981856157a3565b93506157d9818560208601613d2b565b6157e281613d5e565b840191505092915050565b60006080820190506158026000830187613df7565b61580f6020830186613df7565b61581c6040830185613e61565b818103606083015261582e81846157b4565b905095945050505050565b60008151905061584881613c80565b92915050565b60006020828403121561586457615863613ab3565b5b600061587284828501615839565b91505092915050565b600061588682613abd565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156158b9576158b861453b565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006158fe82613abd565b915061590983613abd565b925082615919576159186158c4565b5b828204905092915050565b600061592f82613abd565b915061593a83613abd565b92508261594a576159496158c4565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006159e0602183613d1a565b91506159eb82615984565b604082019050919050565b60006020820190508181036000830152615a0f816159d3565b9050919050565b7f455243373231413a207175616e74697479206d7573742062652067726561746560008201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b6000615a72602883613d1a565b9150615a7d82615a16565b604082019050919050565b60006020820190508181036000830152615aa181615a65565b905091905056fea2646970667358221220ee77e588db54bcc5e1866af39488b934eafec57ce8582e6323c40a6679e65a1a64736f6c63430008090033697066733a2f2f516d6456417732316474434d5373595146416638634d7758715a376f37544b684c65704766366d4b7651583173502f

Deployed Bytecode

0x60806040526004361061023e5760003560e01c80637035bf181161012e578063b88d4fde116100ab578063cd5fe7251161006f578063cd5fe72514610864578063e985e9c51461088f578063eab41782146108cc578063f2fde38b146108e3578063ff9849941461090c57610245565b8063b88d4fde1461078e578063ba829d71146107b7578063c4d8b9df146107e2578063c87b56dd1461080b578063c9b298f11461084857610245565b8063a22cb465116100f2578063a22cb465146106de578063a475b5dd14610707578063b0a1c1c41461071e578063b3ab66b014610749578063b620e9751461076557610245565b80637035bf181461060957806370a0823114610634578063715018a6146106715780638da5cb5b1461068857806395d89b41146106b357610245565b80632f745c59116101bc57806342842e0e1161018057806342842e0e146105105780634520e916146105395780634f6ccce714610564578063603f4d52146105a15780636352211e146105cc57610245565b80632f745c59146104195780633023eba614610456578063326241141461049357806339a0c6f9146104d05780633ccfd60b146104f957610245565b8063095ea7b311610203578063095ea7b31461033457806318160ddd1461035d5780631a17fe5e1461038857806323b872dd146103b357806327de8f27146103dc57610245565b8062a1990e1461024a5780630191a6571461026657806301ffc9a71461028f57806306fdde03146102cc578063081812fc146102f757610245565b3661024557005b600080fd5b610264600480360381019061025f9190613b62565b610923565b005b34801561027257600080fd5b5061028d60048036038101906102889190613c27565b610c49565b005b34801561029b57600080fd5b506102b660048036038101906102b19190613cac565b610d09565b6040516102c39190613cf4565b60405180910390f35b3480156102d857600080fd5b506102e1610e53565b6040516102ee9190613da8565b60405180910390f35b34801561030357600080fd5b5061031e60048036038101906103199190613dca565b610ee5565b60405161032b9190613e06565b60405180910390f35b34801561034057600080fd5b5061035b60048036038101906103569190613e21565b610f6a565b005b34801561036957600080fd5b50610372611083565b60405161037f9190613e70565b60405180910390f35b34801561039457600080fd5b5061039d61108c565b6040516103aa9190613e70565b60405180910390f35b3480156103bf57600080fd5b506103da60048036038101906103d59190613e8b565b611092565b005b3480156103e857600080fd5b5061040360048036038101906103fe9190613dca565b6110a2565b6040516104109190613e70565b60405180910390f35b34801561042557600080fd5b50610440600480360381019061043b9190613e21565b611110565b60405161044d9190613e70565b60405180910390f35b34801561046257600080fd5b5061047d60048036038101906104789190613c27565b611302565b60405161048a9190613e70565b60405180910390f35b34801561049f57600080fd5b506104ba60048036038101906104b59190613ede565b61131a565b6040516104c79190613cf4565b60405180910390f35b3480156104dc57600080fd5b506104f760048036038101906104f2919061407a565b611418565b005b34801561050557600080fd5b5061050e6114ae565b005b34801561051c57600080fd5b5061053760048036038101906105329190613e8b565b6115f0565b005b34801561054557600080fd5b5061054e611610565b60405161055b9190613e70565b60405180910390f35b34801561057057600080fd5b5061058b60048036038101906105869190613dca565b6116a3565b6040516105989190613e70565b60405180910390f35b3480156105ad57600080fd5b506105b66116f6565b6040516105c3919061413a565b60405180910390f35b3480156105d857600080fd5b506105f360048036038101906105ee9190613dca565b611727565b6040516106009190613e06565b60405180910390f35b34801561061557600080fd5b5061061e61173d565b60405161062b9190613da8565b60405180910390f35b34801561064057600080fd5b5061065b60048036038101906106569190613c27565b6117cb565b6040516106689190613e70565b60405180910390f35b34801561067d57600080fd5b506106866118b4565b005b34801561069457600080fd5b5061069d61193c565b6040516106aa9190613e06565b60405180910390f35b3480156106bf57600080fd5b506106c8611966565b6040516106d59190613da8565b60405180910390f35b3480156106ea57600080fd5b5061070560048036038101906107009190614181565b6119f8565b005b34801561071357600080fd5b5061071c611b79565b005b34801561072a57600080fd5b50610733611bfe565b6040516107409190613e70565b60405180910390f35b610763600480360381019061075e9190613dca565b611c82565b005b34801561077157600080fd5b5061078c600480360381019061078791906141c1565b611ec6565b005b34801561079a57600080fd5b506107b560048036038101906107b091906142a2565b611ff8565b005b3480156107c357600080fd5b506107cc612054565b6040516107d99190613e70565b60405180910390f35b3480156107ee57600080fd5b506108096004803603810190610804919061407a565b61205a565b005b34801561081757600080fd5b50610832600480360381019061082d9190613dca565b6120f0565b60405161083f9190613da8565b60405180910390f35b610862600480360381019061085d9190613dca565b612235565b005b34801561087057600080fd5b50610879612507565b6040516108869190613e70565b60405180910390f35b34801561089b57600080fd5b506108b660048036038101906108b19190614325565b61250d565b6040516108c39190613cf4565b60405180910390f35b3480156108d857600080fd5b506108e16125a1565b005b3480156108ef57600080fd5b5061090a60048036038101906109059190613c27565b61269a565b005b34801561091857600080fd5b50610921612792565b005b8282826109323384848461131a565b610971576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610968906143b1565b60405180910390fd5b600260085414156109b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ae9061441d565b60405180910390fd5b600260088190555060006109c96116f6565b9050600060028111156109df576109de6140c3565b5b8160028111156109f2576109f16140c3565b5b1415610a33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2a90614489565b60405180910390fd5b600280811115610a4657610a456140c3565b5b816002811115610a5957610a586140c3565b5b1415610a9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a919061451b565b60405180910390fd5b600b5488610aa6611083565b610ab0919061456a565b1115610af1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae89061460c565b60405180910390fd5b60115488601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b3f919061456a565b1115610b80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b779061469e565b60405180910390fd5b87610b8b60016110a2565b610b9591906146be565b341015610bd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bce906147b0565b60405180910390fd5b610be133896128f3565b87601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610c30919061456a565b9250508190555050600160088190555050505050505050565b610c51612911565b73ffffffffffffffffffffffffffffffffffffffff16610c6f61193c565b73ffffffffffffffffffffffffffffffffffffffff1614610cc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbc9061481c565b60405180910390fd5b80601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610dd457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610e3c57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610e4c5750610e4b82612919565b5b9050919050565b606060018054610e629061486b565b80601f0160208091040260200160405190810160405280929190818152602001828054610e8e9061486b565b8015610edb5780601f10610eb057610100808354040283529160200191610edb565b820191906000526020600020905b815481529060010190602001808311610ebe57829003601f168201915b5050505050905090565b6000610ef082612983565b610f2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f269061490f565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610f7582611727565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610fe6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fdd906149a1565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16611005612911565b73ffffffffffffffffffffffffffffffffffffffff16148061103457506110338161102e612911565b61250d565b5b611073576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106a90614a33565b60405180910390fd5b61107e838383612990565b505050565b60008054905090565b60165481565b61109d838383612a42565b505050565b600080821180156110b35750600382105b6110f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e990614a9f565b60405180910390fd5b600182141561110557600f54905061110b565b60105490505b919050565b600061111b836117cb565b821061115c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115390614b31565b60405180910390fd5b6000611166611083565b905060008060005b838110156112c0576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461126057806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156112b257868414156112a95781955050505050506112fc565b83806001019450505b50808060010191505061116e565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f390614bc3565b60405180910390fd5b92915050565b60136020528060005260406000206000915090505481565b6000803086604051602001611330929190614c2b565b60405160208183030381529060405280519060200120905060018160405160200161135b9190614ccf565b60405160208183030381529060405280519060200120868686604051600081526020016040526040516113919493929190614d13565b6020604051602081039080840390855afa1580156113b3573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff16601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614915050949350505050565b611420612911565b73ffffffffffffffffffffffffffffffffffffffff1661143e61193c565b73ffffffffffffffffffffffffffffffffffffffff1614611494576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148b9061481c565b60405180910390fd5b80600e90805190602001906114aa9291906139cc565b5050565b6114b6612911565b73ffffffffffffffffffffffffffffffffffffffff166114d461193c565b73ffffffffffffffffffffffffffffffffffffffff161461152a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115219061481c565b60405180910390fd5b60026008541415611570576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115679061441d565b60405180910390fd5b60026008819055506000611582611bfe565b9050600081116115c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115be90614da4565b60405180910390fd5b6115e57390ed73ff39f26b53854230060cc067cb92c18a4a82612f82565b506001600881905550565b61160b83838360405180602001604052806000815250611ff8565b505050565b600061161a612911565b73ffffffffffffffffffffffffffffffffffffffff1661163861193c565b73ffffffffffffffffffffffffffffffffffffffff161461168e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116859061481c565b60405180910390fd5b600c54600d5461169e9190614dc4565b905090565b60006116ad611083565b82106116ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e590614e6a565b60405180910390fd5b819050919050565b600080601554141561170b5760009050611724565b6000601654141561171f5760019050611724565b600290505b90565b600061173282613033565b600001519050919050565b6014805461174a9061486b565b80601f01602080910402602001604051908101604052809291908181526020018280546117769061486b565b80156117c35780601f10611798576101008083540402835291602001916117c3565b820191906000526020600020905b8154815290600101906020018083116117a657829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561183c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183390614efc565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6118bc612911565b73ffffffffffffffffffffffffffffffffffffffff166118da61193c565b73ffffffffffffffffffffffffffffffffffffffff1614611930576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119279061481c565b60405180910390fd5b61193a60006131cd565b565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600280546119759061486b565b80601f01602080910402602001604051908101604052809291908181526020018280546119a19061486b565b80156119ee5780601f106119c3576101008083540402835291602001916119ee565b820191906000526020600020905b8154815290600101906020018083116119d157829003601f168201915b5050505050905090565b611a00612911565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6590614f68565b60405180910390fd5b8060066000611a7b612911565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611b28612911565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b6d9190613cf4565b60405180910390a35050565b611b81612911565b73ffffffffffffffffffffffffffffffffffffffff16611b9f61193c565b73ffffffffffffffffffffffffffffffffffffffff1614611bf5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bec9061481c565b60405180910390fd5b42601781905550565b6000611c08612911565b73ffffffffffffffffffffffffffffffffffffffff16611c2661193c565b73ffffffffffffffffffffffffffffffffffffffff1614611c7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c739061481c565b60405180910390fd5b47905090565b60026008541415611cc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbf9061441d565b60405180910390fd5b60026008819055506000611cda6116f6565b905060006002811115611cf057611cef6140c3565b5b816002811115611d0357611d026140c3565b5b1415611d44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3b90614489565b60405180910390fd5b60016002811115611d5857611d576140c3565b5b816002811115611d6b57611d6a6140c3565b5b1415611dac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da39061451b565b60405180910390fd5b600a5482611db8611083565b611dc2919061456a565b1115611e03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dfa9061460c565b60405180910390fd5b81611e0e60026110a2565b611e1891906146be565b341015611e5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5190615020565b60405180910390fd5b611e6433836128f3565b81601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611eb3919061456a565b9250508190555050600160088190555050565b611ece612911565b73ffffffffffffffffffffffffffffffffffffffff16611eec61193c565b73ffffffffffffffffffffffffffffffffffffffff1614611f42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f399061481c565b60405180910390fd5b600d5482600c54611f53919061456a565b1115611f94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8b9061460c565b60405180910390fd5b611f9e81836128f3565b81601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611fed919061456a565b925050819055505050565b612003848484612a42565b61200f84848484613293565b61204e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612045906150b2565b60405180910390fd5b50505050565b60175481565b612062612911565b73ffffffffffffffffffffffffffffffffffffffff1661208061193c565b73ffffffffffffffffffffffffffffffffffffffff16146120d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120cd9061481c565b60405180910390fd5b80601490805190602001906120ec9291906139cc565b5050565b60606120fb82612983565b61213a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213190615144565b60405180910390fd5b600060175414156121d757601480546121529061486b565b80601f016020809104026020016040519081016040528092919081815260200182805461217e9061486b565b80156121cb5780601f106121a0576101008083540402835291602001916121cb565b820191906000526020600020905b8154815290600101906020018083116121ae57829003601f168201915b50505050509050612230565b60006121e161342a565b90506000815111612201576040518060200160405280600081525061222c565b8061220b846134bc565b60405160200161221c9291906151e1565b6040516020818303038152906040525b9150505b919050565b6002600854141561227b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122729061441d565b60405180910390fd5b6002600881905550600061228d6116f6565b9050600060028111156122a3576122a26140c3565b5b8160028111156122b6576122b56140c3565b5b14156122f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ee90614489565b60405180910390fd5b60028081111561230a576123096140c3565b5b81600281111561231d5761231c6140c3565b5b141561235e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123559061451b565b60405180910390fd5b600b548261236a611083565b612374919061456a565b11156123b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ac9061460c565b60405180910390fd5b60115482601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612403919061456a565b1115612444576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243b9061469e565b60405180910390fd5b8161244f60026110a2565b61245991906146be565b34101561249b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249290615020565b60405180910390fd5b6124a533836128f3565b81601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124f4919061456a565b9250508190555050600160088190555050565b60155481565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6125a9612911565b73ffffffffffffffffffffffffffffffffffffffff166125c761193c565b73ffffffffffffffffffffffffffffffffffffffff161461261d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126149061481c565b60405180910390fd5b60006126276116f6565b90506000600281111561263d5761263c6140c3565b5b8160028111156126505761264f6140c3565b5b14612690576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126879061525c565b60405180910390fd5b4260158190555050565b6126a2612911565b73ffffffffffffffffffffffffffffffffffffffff166126c061193c565b73ffffffffffffffffffffffffffffffffffffffff1614612716576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270d9061481c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612786576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277d906152ee565b60405180910390fd5b61278f816131cd565b50565b61279a612911565b73ffffffffffffffffffffffffffffffffffffffff166127b861193c565b73ffffffffffffffffffffffffffffffffffffffff161461280e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128059061481c565b60405180910390fd5b60006128186116f6565b905060028081111561282d5761282c6140c3565b5b8160028111156128405761283f6140c3565b5b1415612881576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128789061535a565b60405180910390fd5b60006002811115612895576128946140c3565b5b8160028111156128a8576128a76140c3565b5b14156128e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128e0906153ec565b60405180910390fd5b4260168190555050565b61290d82826040518060200160405280600081525061361d565b5050565b600033905090565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000612a4d82613033565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16612a74612911565b73ffffffffffffffffffffffffffffffffffffffff161480612ad05750612a99612911565b73ffffffffffffffffffffffffffffffffffffffff16612ab884610ee5565b73ffffffffffffffffffffffffffffffffffffffff16145b80612aec5750612aeb8260000151612ae6612911565b61250d565b5b905080612b2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b259061547e565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612ba0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b9790615510565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612c10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c07906155a2565b60405180910390fd5b612c1d858585600161362f565b612c2d6000848460000151612990565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836003600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612f1257612e7181612983565b15612f115782600001516003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612f7b8585856001613635565b5050505050565b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612fa8906155f3565b60006040518083038185875af1925050503d8060008114612fe5576040519150601f19603f3d011682016040523d82523d6000602084013e612fea565b606091505b505090508061302e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161302590615654565b60405180910390fd5b505050565b61303b613a52565b61304482612983565b613083576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161307a906156e6565b60405180910390fd5b60008290505b6000811061318c576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461317d5780925050506131c8565b50808060019003915050613089565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131bf90615778565b60405180910390fd5b919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006132b48473ffffffffffffffffffffffffffffffffffffffff1661363b565b1561341d578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026132dd612911565b8786866040518563ffffffff1660e01b81526004016132ff94939291906157ed565b602060405180830381600087803b15801561331957600080fd5b505af192505050801561334a57506040513d601f19601f82011682018060405250810190613347919061584e565b60015b6133cd573d806000811461337a576040519150601f19603f3d011682016040523d82523d6000602084013e61337f565b606091505b506000815114156133c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133bc906150b2565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613422565b600190505b949350505050565b6060600e80546134399061486b565b80601f01602080910402602001604051908101604052809291908181526020018280546134659061486b565b80156134b25780601f10613487576101008083540402835291602001916134b2565b820191906000526020600020905b81548152906001019060200180831161349557829003601f168201915b5050505050905090565b60606000821415613504576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613618565b600082905060005b6000821461353657808061351f9061587b565b915050600a8261352f91906158f3565b915061350c565b60008167ffffffffffffffff81111561355257613551613f4f565b5b6040519080825280601f01601f1916602001820160405280156135845781602001600182028036833780820191505090505b5090505b600085146136115760018261359d9190614dc4565b9150600a856135ac9190615924565b60306135b8919061456a565b60f81b8183815181106135ce576135cd615955565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561360a91906158f3565b9450613588565b8093505050505b919050565b61362a838383600161364e565b505050565b50505050565b50505050565b600080823b905060008111915050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156136c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136bb906159f6565b60405180910390fd5b6000841415613708576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136ff90615a88565b60405180910390fd5b613715600086838761362f565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b858110156139af57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4831561399a5761395a6000888488613293565b613999576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613990906150b2565b60405180910390fd5b5b818060010192505080806001019150506138e3565b5080600081905550506139c56000868387613635565b5050505050565b8280546139d89061486b565b90600052602060002090601f0160209004810192826139fa5760008555613a41565b82601f10613a1357805160ff1916838001178555613a41565b82800160010185558215613a41579182015b82811115613a40578251825591602001919060010190613a25565b5b509050613a4e9190613a8c565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115613aa5576000816000905550600101613a8d565b5090565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b613ad081613abd565b8114613adb57600080fd5b50565b600081359050613aed81613ac7565b92915050565b600060ff82169050919050565b613b0981613af3565b8114613b1457600080fd5b50565b600081359050613b2681613b00565b92915050565b6000819050919050565b613b3f81613b2c565b8114613b4a57600080fd5b50565b600081359050613b5c81613b36565b92915050565b60008060008060808587031215613b7c57613b7b613ab3565b5b6000613b8a87828801613ade565b9450506020613b9b87828801613b17565b9350506040613bac87828801613b4d565b9250506060613bbd87828801613b4d565b91505092959194509250565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613bf482613bc9565b9050919050565b613c0481613be9565b8114613c0f57600080fd5b50565b600081359050613c2181613bfb565b92915050565b600060208284031215613c3d57613c3c613ab3565b5b6000613c4b84828501613c12565b91505092915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613c8981613c54565b8114613c9457600080fd5b50565b600081359050613ca681613c80565b92915050565b600060208284031215613cc257613cc1613ab3565b5b6000613cd084828501613c97565b91505092915050565b60008115159050919050565b613cee81613cd9565b82525050565b6000602082019050613d096000830184613ce5565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613d49578082015181840152602081019050613d2e565b83811115613d58576000848401525b50505050565b6000601f19601f8301169050919050565b6000613d7a82613d0f565b613d848185613d1a565b9350613d94818560208601613d2b565b613d9d81613d5e565b840191505092915050565b60006020820190508181036000830152613dc28184613d6f565b905092915050565b600060208284031215613de057613ddf613ab3565b5b6000613dee84828501613ade565b91505092915050565b613e0081613be9565b82525050565b6000602082019050613e1b6000830184613df7565b92915050565b60008060408385031215613e3857613e37613ab3565b5b6000613e4685828601613c12565b9250506020613e5785828601613ade565b9150509250929050565b613e6a81613abd565b82525050565b6000602082019050613e856000830184613e61565b92915050565b600080600060608486031215613ea457613ea3613ab3565b5b6000613eb286828701613c12565b9350506020613ec386828701613c12565b9250506040613ed486828701613ade565b9150509250925092565b60008060008060808587031215613ef857613ef7613ab3565b5b6000613f0687828801613c12565b9450506020613f1787828801613b17565b9350506040613f2887828801613b4d565b9250506060613f3987828801613b4d565b91505092959194509250565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613f8782613d5e565b810181811067ffffffffffffffff82111715613fa657613fa5613f4f565b5b80604052505050565b6000613fb9613aa9565b9050613fc58282613f7e565b919050565b600067ffffffffffffffff821115613fe557613fe4613f4f565b5b613fee82613d5e565b9050602081019050919050565b82818337600083830152505050565b600061401d61401884613fca565b613faf565b90508281526020810184848401111561403957614038613f4a565b5b614044848285613ffb565b509392505050565b600082601f83011261406157614060613f45565b5b813561407184826020860161400a565b91505092915050565b6000602082840312156140905761408f613ab3565b5b600082013567ffffffffffffffff8111156140ae576140ad613ab8565b5b6140ba8482850161404c565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60038110614103576141026140c3565b5b50565b6000819050614114826140f2565b919050565b600061412482614106565b9050919050565b61413481614119565b82525050565b600060208201905061414f600083018461412b565b92915050565b61415e81613cd9565b811461416957600080fd5b50565b60008135905061417b81614155565b92915050565b6000806040838503121561419857614197613ab3565b5b60006141a685828601613c12565b92505060206141b78582860161416c565b9150509250929050565b600080604083850312156141d8576141d7613ab3565b5b60006141e685828601613ade565b92505060206141f785828601613c12565b9150509250929050565b600067ffffffffffffffff82111561421c5761421b613f4f565b5b61422582613d5e565b9050602081019050919050565b600061424561424084614201565b613faf565b90508281526020810184848401111561426157614260613f4a565b5b61426c848285613ffb565b509392505050565b600082601f83011261428957614288613f45565b5b8135614299848260208601614232565b91505092915050565b600080600080608085870312156142bc576142bb613ab3565b5b60006142ca87828801613c12565b94505060206142db87828801613c12565b93505060406142ec87828801613ade565b925050606085013567ffffffffffffffff81111561430d5761430c613ab8565b5b61431987828801614274565b91505092959194509250565b6000806040838503121561433c5761433b613ab3565b5b600061434a85828601613c12565b925050602061435b85828601613c12565b9150509250929050565b7f496e76616c6964205369676e6174757265000000000000000000000000000000600082015250565b600061439b601183613d1a565b91506143a682614365565b602082019050919050565b600060208201905081810360008301526143ca8161438e565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614407601f83613d1a565b9150614412826143d1565b602082019050919050565b60006020820190508181036000830152614436816143fa565b9050919050565b7f53616c6520696e206e6f74206f70656e20796574210000000000000000000000600082015250565b6000614473601583613d1a565b915061447e8261443d565b602082019050919050565b600060208201905081810360008301526144a281614466565b9050919050565b7f50726573616c652068617320636c6f7365642c20436865636b206f757420507560008201527f626c69632053616c652100000000000000000000000000000000000000000000602082015250565b6000614505602a83613d1a565b9150614510826144a9565b604082019050919050565b60006020820190508181036000830152614534816144f8565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061457582613abd565b915061458083613abd565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156145b5576145b461453b565b5b828201905092915050565b7f4e6f7420656e6f756768204e465473206c65667420746f206d696e742e2e0000600082015250565b60006145f6601e83613d1a565b9150614601826145c0565b602082019050919050565b60006020820190508181036000830152614625816145e9565b9050919050565b7f4d6178696d756d2034204d696e747320706572204164647265737320616c6c6f60008201527f7765642100000000000000000000000000000000000000000000000000000000602082015250565b6000614688602483613d1a565b91506146938261462c565b604082019050919050565b600060208201905081810360008301526146b78161467b565b9050919050565b60006146c982613abd565b91506146d483613abd565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561470d5761470c61453b565b5b828202905092915050565b7f4e6f742073756666696369656e7420457468657220746f206d696e742074686960008201527f7320616d6f756e74206f66204e4654732028436f7374203d20302e313520657460208201527f6865722065616368204e46542900000000000000000000000000000000000000604082015250565b600061479a604d83613d1a565b91506147a582614718565b606082019050919050565b600060208201905081810360008301526147c98161478d565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614806602083613d1a565b9150614811826147d0565b602082019050919050565b60006020820190508181036000830152614835816147f9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061488357607f821691505b602082108114156148975761489661483c565b5b50919050565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b60006148f9602d83613d1a565b91506149048261489d565b604082019050919050565b60006020820190508181036000830152614928816148ec565b9050919050565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b600061498b602283613d1a565b91506149968261492f565b604082019050919050565b600060208201905081810360008301526149ba8161497e565b9050919050565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b6000614a1d603983613d1a565b9150614a28826149c1565b604082019050919050565b60006020820190508181036000830152614a4c81614a10565b9050919050565b7f496e76616c696420547970652100000000000000000000000000000000000000600082015250565b6000614a89600d83613d1a565b9150614a9482614a53565b602082019050919050565b60006020820190508181036000830152614ab881614a7c565b9050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b6000614b1b602283613d1a565b9150614b2682614abf565b604082019050919050565b60006020820190508181036000830152614b4a81614b0e565b9050919050565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b6000614bad602e83613d1a565b9150614bb882614b51565b604082019050919050565b60006020820190508181036000830152614bdc81614ba0565b9050919050565b60008160601b9050919050565b6000614bfb82614be3565b9050919050565b6000614c0d82614bf0565b9050919050565b614c25614c2082613be9565b614c02565b82525050565b6000614c378285614c14565b601482019150614c478284614c14565b6014820191508190509392505050565b600081905092915050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b6000614c98601c83614c57565b9150614ca382614c62565b601c82019050919050565b6000819050919050565b614cc9614cc482613b2c565b614cae565b82525050565b6000614cda82614c8b565b9150614ce68284614cb8565b60208201915081905092915050565b614cfe81613b2c565b82525050565b614d0d81613af3565b82525050565b6000608082019050614d286000830187614cf5565b614d356020830186614d04565b614d426040830185614cf5565b614d4f6060830184614cf5565b95945050505050565b7f4e6f2066756e647320746f207265747269657665210000000000000000000000600082015250565b6000614d8e601583613d1a565b9150614d9982614d58565b602082019050919050565b60006020820190508181036000830152614dbd81614d81565b9050919050565b6000614dcf82613abd565b9150614dda83613abd565b925082821015614ded57614dec61453b565b5b828203905092915050565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b6000614e54602383613d1a565b9150614e5f82614df8565b604082019050919050565b60006020820190508181036000830152614e8381614e47565b9050919050565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b6000614ee6602b83613d1a565b9150614ef182614e8a565b604082019050919050565b60006020820190508181036000830152614f1581614ed9565b9050919050565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b6000614f52601a83613d1a565b9150614f5d82614f1c565b602082019050919050565b60006020820190508181036000830152614f8181614f45565b9050919050565b7f4e6f742073756666696369656e7420457468657220746f206d696e742074686960008201527f7320616d6f756e74206f66204e4654732028436f7374203d20302e322065746860208201527f65722065616368204e4654290000000000000000000000000000000000000000604082015250565b600061500a604c83613d1a565b915061501582614f88565b606082019050919050565b6000602082019050818103600083015261503981614ffd565b9050919050565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b600061509c603383613d1a565b91506150a782615040565b604082019050919050565b600060208201905081810360008301526150cb8161508f565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b600061512e602f83613d1a565b9150615139826150d2565b604082019050919050565b6000602082019050818103600083015261515d81615121565b9050919050565b600061516f82613d0f565b6151798185614c57565b9350615189818560208601613d2b565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b60006151cb600583614c57565b91506151d682615195565b600582019050919050565b60006151ed8285615164565b91506151f98284615164565b9150615204826151be565b91508190509392505050565b7f50726573616c652068617320616c7265616479206f70656e6564210000000000600082015250565b6000615246601b83613d1a565b915061525182615210565b602082019050919050565b6000602082019050818103600083015261527581615239565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006152d8602683613d1a565b91506152e38261527c565b604082019050919050565b60006020820190508181036000830152615307816152cb565b9050919050565b7f5075626c69632053616c6520697320616c7265616479206c6976652100000000600082015250565b6000615344601c83613d1a565b915061534f8261530e565b602082019050919050565b6000602082019050818103600083015261537381615337565b9050919050565b7f43616e6e6f74206368616e676520746f205075626c69632053616c652069662060008201527f746865726520686173206e6f74206265656e20612050726573616c6521000000602082015250565b60006153d6603d83613d1a565b91506153e18261537a565b604082019050919050565b60006020820190508181036000830152615405816153c9565b9050919050565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b6000615468603283613d1a565b91506154738261540c565b604082019050919050565b600060208201905081810360008301526154978161545b565b9050919050565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b60006154fa602683613d1a565b91506155058261549e565b604082019050919050565b60006020820190508181036000830152615529816154ed565b9050919050565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061558c602583613d1a565b915061559782615530565b604082019050919050565b600060208201905081810360008301526155bb8161557f565b9050919050565b600081905092915050565b50565b60006155dd6000836155c2565b91506155e8826155cd565b600082019050919050565b60006155fe826155d0565b9150819050919050565b7f4661696c656420746f2073656e64204574686572000000000000000000000000600082015250565b600061563e601483613d1a565b915061564982615608565b602082019050919050565b6000602082019050818103600083015261566d81615631565b9050919050565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b60006156d0602a83613d1a565b91506156db82615674565b604082019050919050565b600060208201905081810360008301526156ff816156c3565b9050919050565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b6000615762602f83613d1a565b915061576d82615706565b604082019050919050565b6000602082019050818103600083015261579181615755565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006157bf82615798565b6157c981856157a3565b93506157d9818560208601613d2b565b6157e281613d5e565b840191505092915050565b60006080820190506158026000830187613df7565b61580f6020830186613df7565b61581c6040830185613e61565b818103606083015261582e81846157b4565b905095945050505050565b60008151905061584881613c80565b92915050565b60006020828403121561586457615863613ab3565b5b600061587284828501615839565b91505092915050565b600061588682613abd565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156158b9576158b861453b565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006158fe82613abd565b915061590983613abd565b925082615919576159186158c4565b5b828204905092915050565b600061592f82613abd565b915061593a83613abd565b92508261594a576159496158c4565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006159e0602183613d1a565b91506159eb82615984565b604082019050919050565b60006020820190508181036000830152615a0f816159d3565b9050919050565b7f455243373231413a207175616e74697479206d7573742062652067726561746560008201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b6000615a72602883613d1a565b9150615a7d82615a16565b604082019050919050565b60006020820190508181036000830152615aa181615a65565b905091905056fea2646970667358221220ee77e588db54bcc5e1866af39488b934eafec57ce8582e6323c40a6679e65a1a64736f6c63430008090033

Deployed Bytecode Sourcemap

54976:9289:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56839:8;;;58421:875;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62689:87;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41710:372;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43596:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45158:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44679:413;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39959:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56402:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46034:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63883:264;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40631:1007;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56054:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58060:306;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57066:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63029:272;;;;;;;;;;;;;:::i;:::-;;46275:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62843:124;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40144:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63541:297;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43405:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56262:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42146:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4591:94;;;;;;;;;;;;;:::i;:::-;;3940:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43765:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45444:288;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64178:82;;;;;;;;;;;;;:::i;:::-;;62506:109;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60223:691;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60959:266;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46531:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56444:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57187:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61233:568;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59355:809;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56363:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45803:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61851:215;;;;;;;;;;;;;:::i;:::-;;4840:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62108:348;;;;;;;;;;;;;:::i;:::-;;58421:875;58510:2;58515;58519;57562:41;57583:10;57594:2;57597;57600;57562:20;:41::i;:::-;57553:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;36352:1:::1;36950:7;;:19;;36942:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;36352:1;37083:7;:18;;;;58562:16:::2;58581:11;:9;:11::i;:::-;58562:30;;58625:12;58611:26;;;;;;;;:::i;:::-;;:10;:26;;;;;;;;:::i;:::-;;;;58603:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;58781:16;58767:30:::0;::::2;;;;;;;:::i;:::-;;:10;:30;;;;;;;;:::i;:::-;;;;58759:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;58889:16;;58879:6;58863:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:42;;58855:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;58999:14;;58989:6;58959:15;:27;58975:10;58959:27;;;;;;;;;;;;;;;;:36;;;;:::i;:::-;:54;;58951:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;59100:6;59086:11;59095:1;59086:8;:11::i;:::-;:20;;;;:::i;:::-;59073:9;:33;;59065:123;;;;;;;;;;;;:::i;:::-;;;;;;;;;59209:29;59219:10;59231:6;59209:9;:29::i;:::-;59280:6;59249:15;:27;59265:10;59249:27;;;;;;;;;;;;;;;;:37;;;;;;;:::i;:::-;;;;;;;;58551:745;36308:1:::1;37262:7;:22;;;;58421:875:::0;;;;;;;:::o;62689:87::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62762:6:::1;62754:5;;:14;;;;;;;;;;;;;;;;;;62689:87:::0;:::o;41710:372::-;41812:4;41864:25;41849:40;;;:11;:40;;;;:105;;;;41921:33;41906:48;;;:11;:48;;;;41849:105;:172;;;;41986:35;41971:50;;;:11;:50;;;;41849:172;:225;;;;42038:36;42062:11;42038:23;:36::i;:::-;41849:225;41829:245;;41710:372;;;:::o;43596:100::-;43650:13;43683:5;43676:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43596:100;:::o;45158:214::-;45226:7;45254:16;45262:7;45254;:16::i;:::-;45246:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;45340:15;:24;45356:7;45340:24;;;;;;;;;;;;;;;;;;;;;45333:31;;45158:214;;;:::o;44679:413::-;44752:13;44768:24;44784:7;44768:15;:24::i;:::-;44752:40;;44817:5;44811:11;;:2;:11;;;;44803:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;44912:5;44896:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;44921:37;44938:5;44945:12;:10;:12::i;:::-;44921:16;:37::i;:::-;44896:62;44874:169;;;;;;;;;;;;:::i;:::-;;;;;;;;;45056:28;45065:2;45069:7;45078:5;45056:8;:28::i;:::-;44741:351;44679:413;;:::o;39959:108::-;40020:7;40047:12;;40040:19;;39959:108;:::o;56402:35::-;;;;:::o;46034:170::-;46168:28;46178:4;46184:2;46188:7;46168:9;:28::i;:::-;46034:170;;;:::o;63883:264::-;63933:7;63969:1;63961:5;:9;:22;;;;;63982:1;63974:5;:9;63961:22;63953:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;64025:1;64016:5;:10;64012:128;;;64050:17;;64043:24;;;;64012:128;64116:12;;64109:19;;63883:264;;;;:::o;40631:1007::-;40720:7;40756:16;40766:5;40756:9;:16::i;:::-;40748:5;:24;40740:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;40822:22;40847:13;:11;:13::i;:::-;40822:38;;40871:19;40901:25;41090:9;41085:466;41105:14;41101:1;:18;41085:466;;;41145:31;41179:11;:14;41191:1;41179:14;;;;;;;;;;;41145:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41242:1;41216:28;;:9;:14;;;:28;;;41212:111;;41289:9;:14;;;41269:34;;41212:111;41366:5;41345:26;;:17;:26;;;41341:195;;;41415:5;41400:11;:20;41396:85;;;41456:1;41449:8;;;;;;;;;41396:85;41503:13;;;;;;;41341:195;41126:425;41121:3;;;;;;;41085:466;;;;41574:56;;;;;;;;;;:::i;:::-;;;;;;;;40631:1007;;;;;:::o;56054:50::-;;;;;;;;;;;;;;;;;:::o;58060:306::-;58159:4;58176:12;58226:4;58233;58201:37;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58191:48;;;;;;58176:63;;58266:92;58339:4;58286:58;;;;;;;;:::i;:::-;;;;;;;;;;;;;58276:69;;;;;;58347:2;58351;58355;58266:92;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58257:101;;:5;;;;;;;;;;;:101;;;58250:108;;;58060:306;;;;;;:::o;57066:109::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57159:8:::1;57141:15;:26;;;;;;;;;;;;:::i;:::-;;57066:109:::0;:::o;63029:272::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36352:1:::1;36950:7;;:19;;36942:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;36352:1;37083:7;:18;;;;63089:15:::2;63107:16;:14;:16::i;:::-;63089:34;;63152:1;63142:7;:11;63134:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;63192:71;63210:42;63255:7;63192:9;:71::i;:::-;63078:223;36308:1:::1;37262:7;:22;;;;63029:272::o:0;46275:185::-;46413:39;46430:4;46436:2;46440:7;46413:39;;;;;;;;;;;;:16;:39::i;:::-;46275:185;;;:::o;62843:124::-;62902:4;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62945:14:::1;;62926:16;;:33;;;;:::i;:::-;62919:40;;62843:124:::0;:::o;40144:187::-;40211:7;40247:13;:11;:13::i;:::-;40239:5;:21;40231:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;40318:5;40311:12;;40144:187;;;:::o;63541:297::-;63582:5;63624:1;63603:17;;:22;63599:232;;;63649:12;63642:19;;;;63599:232;63716:1;63692:20;;:25;63688:143;;;63741:13;63734:20;;;;63688:143;63803:16;63796:23;;63541:297;;:::o;43405:124::-;43469:7;43496:20;43508:7;43496:11;:20::i;:::-;:25;;;43489:32;;43405:124;;;:::o;56262:27::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;42146:221::-;42210:7;42255:1;42238:19;;:5;:19;;;;42230:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;42331:12;:19;42344:5;42331:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;42323:36;;42316:43;;42146:221;;;:::o;4591:94::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4656:21:::1;4674:1;4656:9;:21::i;:::-;4591:94::o:0;3940:87::-;3986:7;4013:6;;;;;;;;;;;4006:13;;3940:87;:::o;43765:104::-;43821:13;43854:7;43847:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43765:104;:::o;45444:288::-;45551:12;:10;:12::i;:::-;45539:24;;:8;:24;;;;45531:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;45652:8;45607:18;:32;45626:12;:10;:12::i;:::-;45607:32;;;;;;;;;;;;;;;:42;45640:8;45607:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;45705:8;45676:48;;45691:12;:10;:12::i;:::-;45676:48;;;45715:8;45676:48;;;;;;:::i;:::-;;;;;;;;45444:288;;:::o;64178:82::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;64237:15:::1;64224:10;:28;;;;64178:82::o:0;62506:109::-;62562:4;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62586:21:::1;62579:28;;62506:109:::0;:::o;60223:691::-;36352:1;36950:7;;:19;;36942:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;36352:1;37083:7;:18;;;;60302:16:::1;60321:11;:9;:11::i;:::-;60302:30;;60365:12;60351:26;;;;;;;;:::i;:::-;;:10;:26;;;;;;;;:::i;:::-;;;;60343:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;60521:13;60507:27;;;;;;;;:::i;:::-;;:10;:27;;;;;;;;:::i;:::-;;;;60499:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;60626:14;;60616:6;60600:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:40;;60592:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;60721:6;60707:11;60716:1;60707:8;:11::i;:::-;:20;;;;:::i;:::-;60694:9;:33;;60686:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;60829:29;60839:10;60851:6;60829:9;:29::i;:::-;60900:6;60869:15;:27;60885:10;60869:27;;;;;;;;;;;;;;;;:37;;;;;;;:::i;:::-;;;;;;;;60291:623;36308:1:::0;37262:7;:22;;;;60223:691;:::o;60959:266::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61080:16:::1;;61070:6;61053:14;;:23;;;;:::i;:::-;:43;;61045:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;61142:28;61152:9;61163:6;61142:9;:28::i;:::-;61211:6;61181:15;:26;61197:9;61181:26;;;;;;;;;;;;;;;;:36;;;;;;;:::i;:::-;;;;;;;;60959:266:::0;;:::o;46531:355::-;46690:28;46700:4;46706:2;46710:7;46690:9;:28::i;:::-;46751:48;46774:4;46780:2;46784:7;46793:5;46751:22;:48::i;:::-;46729:149;;;;;;;;;;;;:::i;:::-;;;;;;;;;46531:355;;;;:::o;56444:25::-;;;;:::o;57187:125::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57290:14:::1;57274:13;:30;;;;;;;;;;;;:::i;:::-;;57187:125:::0;:::o;61233:568::-;61307:13;61341:17;61349:8;61341:7;:17::i;:::-;61333:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;61536:1;61522:10;;:15;61518:272;;;61561:13;61554:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61518:272;61626:21;61650:10;:8;:10::i;:::-;61626:34;;61706:1;61688:7;61682:21;:25;:96;;;;;;;;;;;;;;;;;61734:7;61743:19;:8;:17;:19::i;:::-;61717:55;;;;;;;;;:::i;:::-;;;;;;;;;;;;;61682:96;61675:103;;;61233:568;;;;:::o;59355:809::-;36352:1;36950:7;;:19;;36942:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;36352:1;37083:7;:18;;;;59431:16:::1;59450:11;:9;:11::i;:::-;59431:30;;59494:12;59480:26;;;;;;;;:::i;:::-;;:10;:26;;;;;;;;:::i;:::-;;;;59472:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;59650:16;59636:30:::0;::::1;;;;;;;:::i;:::-;;:10;:30;;;;;;;;:::i;:::-;;;;59628:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;59758:16;;59748:6;59732:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:42;;59724:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;59868:14;;59858:6;59828:15;:27;59844:10;59828:27;;;;;;;;;;;;;;;;:36;;;;:::i;:::-;:54;;59820:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;59969:6;59955:11;59964:1;59955:8;:11::i;:::-;:20;;;;:::i;:::-;59942:9;:33;;59934:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;60077:29;60087:10;60099:6;60077:9;:29::i;:::-;60148:6;60117:15;:27;60133:10;60117:27;;;;;;;;;;;;;;;;:37;;;;;;;:::i;:::-;;;;;;;;59420:744;36308:1:::0;37262:7;:22;;;;59355:809;:::o;56363:32::-;;;;:::o;45803:164::-;45900:4;45924:18;:25;45943:5;45924:25;;;;;;;;;;;;;;;:35;45950:8;45924:35;;;;;;;;;;;;;;;;;;;;;;;;;45917:42;;45803:164;;;;:::o;61851:215::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61905:16:::1;61924:11;:9;:11::i;:::-;61905:30;;61968:12;61954:26;;;;;;;;:::i;:::-;;:10;:26;;;;;;;;:::i;:::-;;;61946:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;62043:15;62023:17;:35;;;;61894:172;61851:215::o:0;4840:192::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4949:1:::1;4929:22;;:8;:22;;;;4921:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5005:19;5015:8;5005:9;:19::i;:::-;4840:192:::0;:::o;62108:348::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62166:16:::1;62185:11;:9;:11::i;:::-;62166:30;;62229:16;62215:30:::0;::::1;;;;;;;:::i;:::-;;:10;:30;;;;;;;;:::i;:::-;;;;62207:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;62311:12;62297:26;;;;;;;;:::i;:::-;;:10;:26;;;;;;;;:::i;:::-;;;;62289:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;62433:15;62410:20;:38;;;;62155:301;62108:348::o:0;47260:104::-;47329:27;47339:2;47343:8;47329:27;;;;;;;;;;;;:9;:27::i;:::-;47260:104;;:::o;2728:98::-;2781:7;2808:10;2801:17;;2728:98;:::o;15922:157::-;16007:4;16046:25;16031:40;;;:11;:40;;;;16024:47;;15922:157;;;:::o;47141:111::-;47198:4;47232:12;;47222:7;:22;47215:29;;47141:111;;;:::o;52061:196::-;52203:2;52176:15;:24;52192:7;52176:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;52241:7;52237:2;52221:28;;52230:5;52221:28;;;;;;;;;;;;52061:196;;;:::o;49941:2002::-;50056:35;50094:20;50106:7;50094:11;:20::i;:::-;50056:58;;50127:22;50169:13;:18;;;50153:34;;:12;:10;:12::i;:::-;:34;;;:87;;;;50228:12;:10;:12::i;:::-;50204:36;;:20;50216:7;50204:11;:20::i;:::-;:36;;;50153:87;:154;;;;50257:50;50274:13;:18;;;50294:12;:10;:12::i;:::-;50257:16;:50::i;:::-;50153:154;50127:181;;50329:17;50321:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;50444:4;50422:26;;:13;:18;;;:26;;;50414:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;50524:1;50510:16;;:2;:16;;;;50502:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;50581:43;50603:4;50609:2;50613:7;50622:1;50581:21;:43::i;:::-;50689:49;50706:1;50710:7;50719:13;:18;;;50689:8;:49::i;:::-;51064:1;51034:12;:18;51047:4;51034:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51108:1;51080:12;:16;51093:2;51080:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51154:2;51126:11;:20;51138:7;51126:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;51216:15;51171:11;:20;51183:7;51171:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;51484:19;51516:1;51506:7;:11;51484:33;;51577:1;51536:43;;:11;:24;51548:11;51536:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;51532:295;;;51604:20;51612:11;51604:7;:20::i;:::-;51600:212;;;51681:13;:18;;;51649:11;:24;51661:11;51649:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;51764:13;:28;;;51722:11;:24;51734:11;51722:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;51600:212;51532:295;51009:829;51874:7;51870:2;51855:27;;51864:4;51855:27;;;;;;;;;;;;51893:42;51914:4;51920:2;51924:7;51933:1;51893:20;:42::i;:::-;50045:1898;;49941:2002;;;:::o;63309:183::-;63390:9;63405:7;:12;;63425:6;63405:31;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63389:47;;;63455:4;63447:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;63378:114;63309:183;;:::o;42806:537::-;42867:21;;:::i;:::-;42909:16;42917:7;42909;:16::i;:::-;42901:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;43015:12;43030:7;43015:22;;43010:245;43047:1;43039:4;:9;43010:245;;43077:31;43111:11;:17;43123:4;43111:17;;;;;;;;;;;43077:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43177:1;43151:28;;:9;:14;;;:28;;;43147:93;;43211:9;43204:16;;;;;;43147:93;43058:197;43050:6;;;;;;;;43010:245;;;;43278:57;;;;;;;;;;:::i;:::-;;;;;;;;42806:537;;;;:::o;5040:173::-;5096:16;5115:6;;;;;;;;;;;5096:25;;5141:8;5132:6;;:17;;;;;;;;;;;;;;;;;;5196:8;5165:40;;5186:8;5165:40;;;;;;;;;;;;5085:128;5040:173;:::o;52822:804::-;52977:4;52998:15;:2;:13;;;:15::i;:::-;52994:625;;;53050:2;53034:36;;;53071:12;:10;:12::i;:::-;53085:4;53091:7;53100:5;53034:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;53030:534;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53297:1;53280:6;:13;:18;53276:273;;;53323:61;;;;;;;;;;:::i;:::-;;;;;;;;53276:273;53499:6;53493:13;53484:6;53480:2;53476:15;53469:38;53030:534;53167:45;;;53157:55;;;:6;:55;;;;53150:62;;;;;52994:625;53603:4;53596:11;;52822:804;;;;;;;:::o;56892:116::-;56952:13;56985:15;56978:22;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56892:116;:::o;344:723::-;400:13;630:1;621:5;:10;617:53;;;648:10;;;;;;;;;;;;;;;;;;;;;617:53;680:12;695:5;680:20;;711:14;736:78;751:1;743:4;:9;736:78;;769:8;;;;;:::i;:::-;;;;800:2;792:10;;;;;:::i;:::-;;;736:78;;;824:19;856:6;846:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;824:39;;874:154;890:1;881:5;:10;874:154;;918:1;908:11;;;;;:::i;:::-;;;985:2;977:5;:10;;;;:::i;:::-;964:2;:24;;;;:::i;:::-;951:39;;934:6;941;934:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1014:2;1005:11;;;;;:::i;:::-;;;874:154;;;1052:6;1038:21;;;;;344:723;;;;:::o;47727:163::-;47850:32;47856:2;47860:8;47870:5;47877:4;47850:5;:32::i;:::-;47727:163;;;:::o;54114:159::-;;;;;:::o;54685:158::-;;;;;:::o;5986:387::-;6046:4;6254:12;6321:7;6309:20;6301:28;;6364:1;6357:4;:8;6350:15;;;5986:387;;;:::o;48149:1538::-;48288:20;48311:12;;48288:35;;48356:1;48342:16;;:2;:16;;;;48334:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;48427:1;48415:8;:13;;48407:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;48486:61;48516:1;48520:2;48524:12;48538:8;48486:21;:61::i;:::-;48861:8;48825:12;:16;48838:2;48825:16;;;;;;;;;;;;;;;:24;;;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48926:8;48885:12;:16;48898:2;48885:16;;;;;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48985:2;48952:11;:25;48964:12;48952:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;49052:15;49002:11;:25;49014:12;49002:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;49085:20;49108:12;49085:35;;49142:9;49137:415;49157:8;49153:1;:12;49137:415;;;49221:12;49217:2;49196:38;;49213:1;49196:38;;;;;;;;;;;;49257:4;49253:249;;;49320:59;49351:1;49355:2;49359:12;49373:5;49320:22;:59::i;:::-;49286:196;;;;;;;;;;;;:::i;:::-;;;;;;;;;49253:249;49522:14;;;;;;;49167:3;;;;;;;49137:415;;;;49583:12;49568;:27;;;;48800:807;49619:60;49648:1;49652:2;49656:12;49670:8;49619:20;:60::i;:::-;48277:1410;48149:1538;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:77;371:7;400:5;389:16;;334:77;;;:::o;417:122::-;490:24;508:5;490:24;:::i;:::-;483:5;480:35;470:63;;529:1;526;519:12;470:63;417:122;:::o;545:139::-;591:5;629:6;616:20;607:29;;645:33;672:5;645:33;:::i;:::-;545:139;;;;:::o;690:86::-;725:7;765:4;758:5;754:16;743:27;;690:86;;;:::o;782:118::-;853:22;869:5;853:22;:::i;:::-;846:5;843:33;833:61;;890:1;887;880:12;833:61;782:118;:::o;906:135::-;950:5;988:6;975:20;966:29;;1004:31;1029:5;1004:31;:::i;:::-;906:135;;;;:::o;1047:77::-;1084:7;1113:5;1102:16;;1047:77;;;:::o;1130:122::-;1203:24;1221:5;1203:24;:::i;:::-;1196:5;1193:35;1183:63;;1242:1;1239;1232:12;1183:63;1130:122;:::o;1258:139::-;1304:5;1342:6;1329:20;1320:29;;1358:33;1385:5;1358:33;:::i;:::-;1258:139;;;;:::o;1403:761::-;1487:6;1495;1503;1511;1560:3;1548:9;1539:7;1535:23;1531:33;1528:120;;;1567:79;;:::i;:::-;1528:120;1687:1;1712:53;1757:7;1748:6;1737:9;1733:22;1712:53;:::i;:::-;1702:63;;1658:117;1814:2;1840:51;1883:7;1874:6;1863:9;1859:22;1840:51;:::i;:::-;1830:61;;1785:116;1940:2;1966:53;2011:7;2002:6;1991:9;1987:22;1966:53;:::i;:::-;1956:63;;1911:118;2068:2;2094:53;2139:7;2130:6;2119:9;2115:22;2094:53;:::i;:::-;2084:63;;2039:118;1403:761;;;;;;;:::o;2170:126::-;2207:7;2247:42;2240:5;2236:54;2225:65;;2170:126;;;:::o;2302:96::-;2339:7;2368:24;2386:5;2368:24;:::i;:::-;2357:35;;2302:96;;;:::o;2404:122::-;2477:24;2495:5;2477:24;:::i;:::-;2470:5;2467:35;2457:63;;2516:1;2513;2506:12;2457:63;2404:122;:::o;2532:139::-;2578:5;2616:6;2603:20;2594:29;;2632:33;2659:5;2632:33;:::i;:::-;2532:139;;;;:::o;2677:329::-;2736:6;2785:2;2773:9;2764:7;2760:23;2756:32;2753:119;;;2791:79;;:::i;:::-;2753:119;2911:1;2936:53;2981:7;2972:6;2961:9;2957:22;2936:53;:::i;:::-;2926:63;;2882:117;2677:329;;;;:::o;3012:149::-;3048:7;3088:66;3081:5;3077:78;3066:89;;3012:149;;;:::o;3167:120::-;3239:23;3256:5;3239:23;:::i;:::-;3232:5;3229:34;3219:62;;3277:1;3274;3267:12;3219:62;3167:120;:::o;3293:137::-;3338:5;3376:6;3363:20;3354:29;;3392:32;3418:5;3392:32;:::i;:::-;3293:137;;;;:::o;3436:327::-;3494:6;3543:2;3531:9;3522:7;3518:23;3514:32;3511:119;;;3549:79;;:::i;:::-;3511:119;3669:1;3694:52;3738:7;3729:6;3718:9;3714:22;3694:52;:::i;:::-;3684:62;;3640:116;3436:327;;;;:::o;3769:90::-;3803:7;3846:5;3839:13;3832:21;3821:32;;3769:90;;;:::o;3865:109::-;3946:21;3961:5;3946:21;:::i;:::-;3941:3;3934:34;3865:109;;:::o;3980:210::-;4067:4;4105:2;4094:9;4090:18;4082:26;;4118:65;4180:1;4169:9;4165:17;4156:6;4118:65;:::i;:::-;3980:210;;;;:::o;4196:99::-;4248:6;4282:5;4276:12;4266:22;;4196:99;;;:::o;4301:169::-;4385:11;4419:6;4414:3;4407:19;4459:4;4454:3;4450:14;4435:29;;4301:169;;;;:::o;4476:307::-;4544:1;4554:113;4568:6;4565:1;4562:13;4554:113;;;4653:1;4648:3;4644:11;4638:18;4634:1;4629:3;4625:11;4618:39;4590:2;4587:1;4583:10;4578:15;;4554:113;;;4685:6;4682:1;4679:13;4676:101;;;4765:1;4756:6;4751:3;4747:16;4740:27;4676:101;4525:258;4476:307;;;:::o;4789:102::-;4830:6;4881:2;4877:7;4872:2;4865:5;4861:14;4857:28;4847:38;;4789:102;;;:::o;4897:364::-;4985:3;5013:39;5046:5;5013:39;:::i;:::-;5068:71;5132:6;5127:3;5068:71;:::i;:::-;5061:78;;5148:52;5193:6;5188:3;5181:4;5174:5;5170:16;5148:52;:::i;:::-;5225:29;5247:6;5225:29;:::i;:::-;5220:3;5216:39;5209:46;;4989:272;4897:364;;;;:::o;5267:313::-;5380:4;5418:2;5407:9;5403:18;5395:26;;5467:9;5461:4;5457:20;5453:1;5442:9;5438:17;5431:47;5495:78;5568:4;5559:6;5495:78;:::i;:::-;5487:86;;5267:313;;;;:::o;5586:329::-;5645:6;5694:2;5682:9;5673:7;5669:23;5665:32;5662:119;;;5700:79;;:::i;:::-;5662:119;5820:1;5845:53;5890:7;5881:6;5870:9;5866:22;5845:53;:::i;:::-;5835:63;;5791:117;5586:329;;;;:::o;5921:118::-;6008:24;6026:5;6008:24;:::i;:::-;6003:3;5996:37;5921:118;;:::o;6045:222::-;6138:4;6176:2;6165:9;6161:18;6153:26;;6189:71;6257:1;6246:9;6242:17;6233:6;6189:71;:::i;:::-;6045:222;;;;:::o;6273:474::-;6341:6;6349;6398:2;6386:9;6377:7;6373:23;6369:32;6366:119;;;6404:79;;:::i;:::-;6366:119;6524:1;6549:53;6594:7;6585:6;6574:9;6570:22;6549:53;:::i;:::-;6539:63;;6495:117;6651:2;6677:53;6722:7;6713:6;6702:9;6698:22;6677:53;:::i;:::-;6667:63;;6622:118;6273:474;;;;;:::o;6753:118::-;6840:24;6858:5;6840:24;:::i;:::-;6835:3;6828:37;6753:118;;:::o;6877:222::-;6970:4;7008:2;6997:9;6993:18;6985:26;;7021:71;7089:1;7078:9;7074:17;7065:6;7021:71;:::i;:::-;6877:222;;;;:::o;7105:619::-;7182:6;7190;7198;7247:2;7235:9;7226:7;7222:23;7218:32;7215:119;;;7253:79;;:::i;:::-;7215:119;7373:1;7398:53;7443:7;7434:6;7423:9;7419:22;7398:53;:::i;:::-;7388:63;;7344:117;7500:2;7526:53;7571:7;7562:6;7551:9;7547:22;7526:53;:::i;:::-;7516:63;;7471:118;7628:2;7654:53;7699:7;7690:6;7679:9;7675:22;7654:53;:::i;:::-;7644:63;;7599:118;7105:619;;;;;:::o;7730:761::-;7814:6;7822;7830;7838;7887:3;7875:9;7866:7;7862:23;7858:33;7855:120;;;7894:79;;:::i;:::-;7855:120;8014:1;8039:53;8084:7;8075:6;8064:9;8060:22;8039:53;:::i;:::-;8029:63;;7985:117;8141:2;8167:51;8210:7;8201:6;8190:9;8186:22;8167:51;:::i;:::-;8157:61;;8112:116;8267:2;8293:53;8338:7;8329:6;8318:9;8314:22;8293:53;:::i;:::-;8283:63;;8238:118;8395:2;8421:53;8466:7;8457:6;8446:9;8442:22;8421:53;:::i;:::-;8411:63;;8366:118;7730:761;;;;;;;:::o;8497:117::-;8606:1;8603;8596:12;8620:117;8729:1;8726;8719:12;8743:180;8791:77;8788:1;8781:88;8888:4;8885:1;8878:15;8912:4;8909:1;8902:15;8929:281;9012:27;9034:4;9012:27;:::i;:::-;9004:6;9000:40;9142:6;9130:10;9127:22;9106:18;9094:10;9091:34;9088:62;9085:88;;;9153:18;;:::i;:::-;9085:88;9193:10;9189:2;9182:22;8972:238;8929:281;;:::o;9216:129::-;9250:6;9277:20;;:::i;:::-;9267:30;;9306:33;9334:4;9326:6;9306:33;:::i;:::-;9216:129;;;:::o;9351:308::-;9413:4;9503:18;9495:6;9492:30;9489:56;;;9525:18;;:::i;:::-;9489:56;9563:29;9585:6;9563:29;:::i;:::-;9555:37;;9647:4;9641;9637:15;9629:23;;9351:308;;;:::o;9665:154::-;9749:6;9744:3;9739;9726:30;9811:1;9802:6;9797:3;9793:16;9786:27;9665:154;;;:::o;9825:412::-;9903:5;9928:66;9944:49;9986:6;9944:49;:::i;:::-;9928:66;:::i;:::-;9919:75;;10017:6;10010:5;10003:21;10055:4;10048:5;10044:16;10093:3;10084:6;10079:3;10075:16;10072:25;10069:112;;;10100:79;;:::i;:::-;10069:112;10190:41;10224:6;10219:3;10214;10190:41;:::i;:::-;9909:328;9825:412;;;;;:::o;10257:340::-;10313:5;10362:3;10355:4;10347:6;10343:17;10339:27;10329:122;;10370:79;;:::i;:::-;10329:122;10487:6;10474:20;10512:79;10587:3;10579:6;10572:4;10564:6;10560:17;10512:79;:::i;:::-;10503:88;;10319:278;10257:340;;;;:::o;10603:509::-;10672:6;10721:2;10709:9;10700:7;10696:23;10692:32;10689:119;;;10727:79;;:::i;:::-;10689:119;10875:1;10864:9;10860:17;10847:31;10905:18;10897:6;10894:30;10891:117;;;10927:79;;:::i;:::-;10891:117;11032:63;11087:7;11078:6;11067:9;11063:22;11032:63;:::i;:::-;11022:73;;10818:287;10603:509;;;;:::o;11118:180::-;11166:77;11163:1;11156:88;11263:4;11260:1;11253:15;11287:4;11284:1;11277:15;11304:115;11387:1;11380:5;11377:12;11367:46;;11393:18;;:::i;:::-;11367:46;11304:115;:::o;11425:131::-;11472:7;11501:5;11490:16;;11507:43;11544:5;11507:43;:::i;:::-;11425:131;;;:::o;11562:::-;11620:9;11653:34;11681:5;11653:34;:::i;:::-;11640:47;;11562:131;;;:::o;11699:147::-;11794:45;11833:5;11794:45;:::i;:::-;11789:3;11782:58;11699:147;;:::o;11852:238::-;11953:4;11991:2;11980:9;11976:18;11968:26;;12004:79;12080:1;12069:9;12065:17;12056:6;12004:79;:::i;:::-;11852:238;;;;:::o;12096:116::-;12166:21;12181:5;12166:21;:::i;:::-;12159:5;12156:32;12146:60;;12202:1;12199;12192:12;12146:60;12096:116;:::o;12218:133::-;12261:5;12299:6;12286:20;12277:29;;12315:30;12339:5;12315:30;:::i;:::-;12218:133;;;;:::o;12357:468::-;12422:6;12430;12479:2;12467:9;12458:7;12454:23;12450:32;12447:119;;;12485:79;;:::i;:::-;12447:119;12605:1;12630:53;12675:7;12666:6;12655:9;12651:22;12630:53;:::i;:::-;12620:63;;12576:117;12732:2;12758:50;12800:7;12791:6;12780:9;12776:22;12758:50;:::i;:::-;12748:60;;12703:115;12357:468;;;;;:::o;12831:474::-;12899:6;12907;12956:2;12944:9;12935:7;12931:23;12927:32;12924:119;;;12962:79;;:::i;:::-;12924:119;13082:1;13107:53;13152:7;13143:6;13132:9;13128:22;13107:53;:::i;:::-;13097:63;;13053:117;13209:2;13235:53;13280:7;13271:6;13260:9;13256:22;13235:53;:::i;:::-;13225:63;;13180:118;12831:474;;;;;:::o;13311:307::-;13372:4;13462:18;13454:6;13451:30;13448:56;;;13484:18;;:::i;:::-;13448:56;13522:29;13544:6;13522:29;:::i;:::-;13514:37;;13606:4;13600;13596:15;13588:23;;13311:307;;;:::o;13624:410::-;13701:5;13726:65;13742:48;13783:6;13742:48;:::i;:::-;13726:65;:::i;:::-;13717:74;;13814:6;13807:5;13800:21;13852:4;13845:5;13841:16;13890:3;13881:6;13876:3;13872:16;13869:25;13866:112;;;13897:79;;:::i;:::-;13866:112;13987:41;14021:6;14016:3;14011;13987:41;:::i;:::-;13707:327;13624:410;;;;;:::o;14053:338::-;14108:5;14157:3;14150:4;14142:6;14138:17;14134:27;14124:122;;14165:79;;:::i;:::-;14124:122;14282:6;14269:20;14307:78;14381:3;14373:6;14366:4;14358:6;14354:17;14307:78;:::i;:::-;14298:87;;14114:277;14053:338;;;;:::o;14397:943::-;14492:6;14500;14508;14516;14565:3;14553:9;14544:7;14540:23;14536:33;14533:120;;;14572:79;;:::i;:::-;14533:120;14692:1;14717:53;14762:7;14753:6;14742:9;14738:22;14717:53;:::i;:::-;14707:63;;14663:117;14819:2;14845:53;14890:7;14881:6;14870:9;14866:22;14845:53;:::i;:::-;14835:63;;14790:118;14947:2;14973:53;15018:7;15009:6;14998:9;14994:22;14973:53;:::i;:::-;14963:63;;14918:118;15103:2;15092:9;15088:18;15075:32;15134:18;15126:6;15123:30;15120:117;;;15156:79;;:::i;:::-;15120:117;15261:62;15315:7;15306:6;15295:9;15291:22;15261:62;:::i;:::-;15251:72;;15046:287;14397:943;;;;;;;:::o;15346:474::-;15414:6;15422;15471:2;15459:9;15450:7;15446:23;15442:32;15439:119;;;15477:79;;:::i;:::-;15439:119;15597:1;15622:53;15667:7;15658:6;15647:9;15643:22;15622:53;:::i;:::-;15612:63;;15568:117;15724:2;15750:53;15795:7;15786:6;15775:9;15771:22;15750:53;:::i;:::-;15740:63;;15695:118;15346:474;;;;;:::o;15826:167::-;15966:19;15962:1;15954:6;15950:14;15943:43;15826:167;:::o;15999:366::-;16141:3;16162:67;16226:2;16221:3;16162:67;:::i;:::-;16155:74;;16238:93;16327:3;16238:93;:::i;:::-;16356:2;16351:3;16347:12;16340:19;;15999:366;;;:::o;16371:419::-;16537:4;16575:2;16564:9;16560:18;16552:26;;16624:9;16618:4;16614:20;16610:1;16599:9;16595:17;16588:47;16652:131;16778:4;16652:131;:::i;:::-;16644:139;;16371:419;;;:::o;16796:181::-;16936:33;16932:1;16924:6;16920:14;16913:57;16796:181;:::o;16983:366::-;17125:3;17146:67;17210:2;17205:3;17146:67;:::i;:::-;17139:74;;17222:93;17311:3;17222:93;:::i;:::-;17340:2;17335:3;17331:12;17324:19;;16983:366;;;:::o;17355:419::-;17521:4;17559:2;17548:9;17544:18;17536:26;;17608:9;17602:4;17598:20;17594:1;17583:9;17579:17;17572:47;17636:131;17762:4;17636:131;:::i;:::-;17628:139;;17355:419;;;:::o;17780:171::-;17920:23;17916:1;17908:6;17904:14;17897:47;17780:171;:::o;17957:366::-;18099:3;18120:67;18184:2;18179:3;18120:67;:::i;:::-;18113:74;;18196:93;18285:3;18196:93;:::i;:::-;18314:2;18309:3;18305:12;18298:19;;17957:366;;;:::o;18329:419::-;18495:4;18533:2;18522:9;18518:18;18510:26;;18582:9;18576:4;18572:20;18568:1;18557:9;18553:17;18546:47;18610:131;18736:4;18610:131;:::i;:::-;18602:139;;18329:419;;;:::o;18754:229::-;18894:34;18890:1;18882:6;18878:14;18871:58;18963:12;18958:2;18950:6;18946:15;18939:37;18754:229;:::o;18989:366::-;19131:3;19152:67;19216:2;19211:3;19152:67;:::i;:::-;19145:74;;19228:93;19317:3;19228:93;:::i;:::-;19346:2;19341:3;19337:12;19330:19;;18989:366;;;:::o;19361:419::-;19527:4;19565:2;19554:9;19550:18;19542:26;;19614:9;19608:4;19604:20;19600:1;19589:9;19585:17;19578:47;19642:131;19768:4;19642:131;:::i;:::-;19634:139;;19361:419;;;:::o;19786:180::-;19834:77;19831:1;19824:88;19931:4;19928:1;19921:15;19955:4;19952:1;19945:15;19972:305;20012:3;20031:20;20049:1;20031:20;:::i;:::-;20026:25;;20065:20;20083:1;20065:20;:::i;:::-;20060:25;;20219:1;20151:66;20147:74;20144:1;20141:81;20138:107;;;20225:18;;:::i;:::-;20138:107;20269:1;20266;20262:9;20255:16;;19972:305;;;;:::o;20283:180::-;20423:32;20419:1;20411:6;20407:14;20400:56;20283:180;:::o;20469:366::-;20611:3;20632:67;20696:2;20691:3;20632:67;:::i;:::-;20625:74;;20708:93;20797:3;20708:93;:::i;:::-;20826:2;20821:3;20817:12;20810:19;;20469:366;;;:::o;20841:419::-;21007:4;21045:2;21034:9;21030:18;21022:26;;21094:9;21088:4;21084:20;21080:1;21069:9;21065:17;21058:47;21122:131;21248:4;21122:131;:::i;:::-;21114:139;;20841:419;;;:::o;21266:223::-;21406:34;21402:1;21394:6;21390:14;21383:58;21475:6;21470:2;21462:6;21458:15;21451:31;21266:223;:::o;21495:366::-;21637:3;21658:67;21722:2;21717:3;21658:67;:::i;:::-;21651:74;;21734:93;21823:3;21734:93;:::i;:::-;21852:2;21847:3;21843:12;21836:19;;21495:366;;;:::o;21867:419::-;22033:4;22071:2;22060:9;22056:18;22048:26;;22120:9;22114:4;22110:20;22106:1;22095:9;22091:17;22084:47;22148:131;22274:4;22148:131;:::i;:::-;22140:139;;21867:419;;;:::o;22292:348::-;22332:7;22355:20;22373:1;22355:20;:::i;:::-;22350:25;;22389:20;22407:1;22389:20;:::i;:::-;22384:25;;22577:1;22509:66;22505:74;22502:1;22499:81;22494:1;22487:9;22480:17;22476:105;22473:131;;;22584:18;;:::i;:::-;22473:131;22632:1;22629;22625:9;22614:20;;22292:348;;;;:::o;22646:301::-;22786:34;22782:1;22774:6;22770:14;22763:58;22855:34;22850:2;22842:6;22838:15;22831:59;22924:15;22919:2;22911:6;22907:15;22900:40;22646:301;:::o;22953:366::-;23095:3;23116:67;23180:2;23175:3;23116:67;:::i;:::-;23109:74;;23192:93;23281:3;23192:93;:::i;:::-;23310:2;23305:3;23301:12;23294:19;;22953:366;;;:::o;23325:419::-;23491:4;23529:2;23518:9;23514:18;23506:26;;23578:9;23572:4;23568:20;23564:1;23553:9;23549:17;23542:47;23606:131;23732:4;23606:131;:::i;:::-;23598:139;;23325:419;;;:::o;23750:182::-;23890:34;23886:1;23878:6;23874:14;23867:58;23750:182;:::o;23938:366::-;24080:3;24101:67;24165:2;24160:3;24101:67;:::i;:::-;24094:74;;24177:93;24266:3;24177:93;:::i;:::-;24295:2;24290:3;24286:12;24279:19;;23938:366;;;:::o;24310:419::-;24476:4;24514:2;24503:9;24499:18;24491:26;;24563:9;24557:4;24553:20;24549:1;24538:9;24534:17;24527:47;24591:131;24717:4;24591:131;:::i;:::-;24583:139;;24310:419;;;:::o;24735:180::-;24783:77;24780:1;24773:88;24880:4;24877:1;24870:15;24904:4;24901:1;24894:15;24921:320;24965:6;25002:1;24996:4;24992:12;24982:22;;25049:1;25043:4;25039:12;25070:18;25060:81;;25126:4;25118:6;25114:17;25104:27;;25060:81;25188:2;25180:6;25177:14;25157:18;25154:38;25151:84;;;25207:18;;:::i;:::-;25151:84;24972:269;24921:320;;;:::o;25247:232::-;25387:34;25383:1;25375:6;25371:14;25364:58;25456:15;25451:2;25443:6;25439:15;25432:40;25247:232;:::o;25485:366::-;25627:3;25648:67;25712:2;25707:3;25648:67;:::i;:::-;25641:74;;25724:93;25813:3;25724:93;:::i;:::-;25842:2;25837:3;25833:12;25826:19;;25485:366;;;:::o;25857:419::-;26023:4;26061:2;26050:9;26046:18;26038:26;;26110:9;26104:4;26100:20;26096:1;26085:9;26081:17;26074:47;26138:131;26264:4;26138:131;:::i;:::-;26130:139;;25857:419;;;:::o;26282:221::-;26422:34;26418:1;26410:6;26406:14;26399:58;26491:4;26486:2;26478:6;26474:15;26467:29;26282:221;:::o;26509:366::-;26651:3;26672:67;26736:2;26731:3;26672:67;:::i;:::-;26665:74;;26748:93;26837:3;26748:93;:::i;:::-;26866:2;26861:3;26857:12;26850:19;;26509:366;;;:::o;26881:419::-;27047:4;27085:2;27074:9;27070:18;27062:26;;27134:9;27128:4;27124:20;27120:1;27109:9;27105:17;27098:47;27162:131;27288:4;27162:131;:::i;:::-;27154:139;;26881:419;;;:::o;27306:244::-;27446:34;27442:1;27434:6;27430:14;27423:58;27515:27;27510:2;27502:6;27498:15;27491:52;27306:244;:::o;27556:366::-;27698:3;27719:67;27783:2;27778:3;27719:67;:::i;:::-;27712:74;;27795:93;27884:3;27795:93;:::i;:::-;27913:2;27908:3;27904:12;27897:19;;27556:366;;;:::o;27928:419::-;28094:4;28132:2;28121:9;28117:18;28109:26;;28181:9;28175:4;28171:20;28167:1;28156:9;28152:17;28145:47;28209:131;28335:4;28209:131;:::i;:::-;28201:139;;27928:419;;;:::o;28353:163::-;28493:15;28489:1;28481:6;28477:14;28470:39;28353:163;:::o;28522:366::-;28664:3;28685:67;28749:2;28744:3;28685:67;:::i;:::-;28678:74;;28761:93;28850:3;28761:93;:::i;:::-;28879:2;28874:3;28870:12;28863:19;;28522:366;;;:::o;28894:419::-;29060:4;29098:2;29087:9;29083:18;29075:26;;29147:9;29141:4;29137:20;29133:1;29122:9;29118:17;29111:47;29175:131;29301:4;29175:131;:::i;:::-;29167:139;;28894:419;;;:::o;29319:221::-;29459:34;29455:1;29447:6;29443:14;29436:58;29528:4;29523:2;29515:6;29511:15;29504:29;29319:221;:::o;29546:366::-;29688:3;29709:67;29773:2;29768:3;29709:67;:::i;:::-;29702:74;;29785:93;29874:3;29785:93;:::i;:::-;29903:2;29898:3;29894:12;29887:19;;29546:366;;;:::o;29918:419::-;30084:4;30122:2;30111:9;30107:18;30099:26;;30171:9;30165:4;30161:20;30157:1;30146:9;30142:17;30135:47;30199:131;30325:4;30199:131;:::i;:::-;30191:139;;29918:419;;;:::o;30343:233::-;30483:34;30479:1;30471:6;30467:14;30460:58;30552:16;30547:2;30539:6;30535:15;30528:41;30343:233;:::o;30582:366::-;30724:3;30745:67;30809:2;30804:3;30745:67;:::i;:::-;30738:74;;30821:93;30910:3;30821:93;:::i;:::-;30939:2;30934:3;30930:12;30923:19;;30582:366;;;:::o;30954:419::-;31120:4;31158:2;31147:9;31143:18;31135:26;;31207:9;31201:4;31197:20;31193:1;31182:9;31178:17;31171:47;31235:131;31361:4;31235:131;:::i;:::-;31227:139;;30954:419;;;:::o;31379:94::-;31412:8;31460:5;31456:2;31452:14;31431:35;;31379:94;;;:::o;31479:::-;31518:7;31547:20;31561:5;31547:20;:::i;:::-;31536:31;;31479:94;;;:::o;31579:100::-;31618:7;31647:26;31667:5;31647:26;:::i;:::-;31636:37;;31579:100;;;:::o;31685:157::-;31790:45;31810:24;31828:5;31810:24;:::i;:::-;31790:45;:::i;:::-;31785:3;31778:58;31685:157;;:::o;31848:397::-;31988:3;32003:75;32074:3;32065:6;32003:75;:::i;:::-;32103:2;32098:3;32094:12;32087:19;;32116:75;32187:3;32178:6;32116:75;:::i;:::-;32216:2;32211:3;32207:12;32200:19;;32236:3;32229:10;;31848:397;;;;;:::o;32251:148::-;32353:11;32390:3;32375:18;;32251:148;;;;:::o;32405:214::-;32545:66;32541:1;32533:6;32529:14;32522:90;32405:214;:::o;32625:402::-;32785:3;32806:85;32888:2;32883:3;32806:85;:::i;:::-;32799:92;;32900:93;32989:3;32900:93;:::i;:::-;33018:2;33013:3;33009:12;33002:19;;32625:402;;;:::o;33033:79::-;33072:7;33101:5;33090:16;;33033:79;;;:::o;33118:157::-;33223:45;33243:24;33261:5;33243:24;:::i;:::-;33223:45;:::i;:::-;33218:3;33211:58;33118:157;;:::o;33281:522::-;33494:3;33516:148;33660:3;33516:148;:::i;:::-;33509:155;;33674:75;33745:3;33736:6;33674:75;:::i;:::-;33774:2;33769:3;33765:12;33758:19;;33794:3;33787:10;;33281:522;;;;:::o;33809:118::-;33896:24;33914:5;33896:24;:::i;:::-;33891:3;33884:37;33809:118;;:::o;33933:112::-;34016:22;34032:5;34016:22;:::i;:::-;34011:3;34004:35;33933:112;;:::o;34051:545::-;34224:4;34262:3;34251:9;34247:19;34239:27;;34276:71;34344:1;34333:9;34329:17;34320:6;34276:71;:::i;:::-;34357:68;34421:2;34410:9;34406:18;34397:6;34357:68;:::i;:::-;34435:72;34503:2;34492:9;34488:18;34479:6;34435:72;:::i;:::-;34517;34585:2;34574:9;34570:18;34561:6;34517:72;:::i;:::-;34051:545;;;;;;;:::o;34602:171::-;34742:23;34738:1;34730:6;34726:14;34719:47;34602:171;:::o;34779:366::-;34921:3;34942:67;35006:2;35001:3;34942:67;:::i;:::-;34935:74;;35018:93;35107:3;35018:93;:::i;:::-;35136:2;35131:3;35127:12;35120:19;;34779:366;;;:::o;35151:419::-;35317:4;35355:2;35344:9;35340:18;35332:26;;35404:9;35398:4;35394:20;35390:1;35379:9;35375:17;35368:47;35432:131;35558:4;35432:131;:::i;:::-;35424:139;;35151:419;;;:::o;35576:191::-;35616:4;35636:20;35654:1;35636:20;:::i;:::-;35631:25;;35670:20;35688:1;35670:20;:::i;:::-;35665:25;;35709:1;35706;35703:8;35700:34;;;35714:18;;:::i;:::-;35700:34;35759:1;35756;35752:9;35744:17;;35576:191;;;;:::o;35773:222::-;35913:34;35909:1;35901:6;35897:14;35890:58;35982:5;35977:2;35969:6;35965:15;35958:30;35773:222;:::o;36001:366::-;36143:3;36164:67;36228:2;36223:3;36164:67;:::i;:::-;36157:74;;36240:93;36329:3;36240:93;:::i;:::-;36358:2;36353:3;36349:12;36342:19;;36001:366;;;:::o;36373:419::-;36539:4;36577:2;36566:9;36562:18;36554:26;;36626:9;36620:4;36616:20;36612:1;36601:9;36597:17;36590:47;36654:131;36780:4;36654:131;:::i;:::-;36646:139;;36373:419;;;:::o;36798:230::-;36938:34;36934:1;36926:6;36922:14;36915:58;37007:13;37002:2;36994:6;36990:15;36983:38;36798:230;:::o;37034:366::-;37176:3;37197:67;37261:2;37256:3;37197:67;:::i;:::-;37190:74;;37273:93;37362:3;37273:93;:::i;:::-;37391:2;37386:3;37382:12;37375:19;;37034:366;;;:::o;37406:419::-;37572:4;37610:2;37599:9;37595:18;37587:26;;37659:9;37653:4;37649:20;37645:1;37634:9;37630:17;37623:47;37687:131;37813:4;37687:131;:::i;:::-;37679:139;;37406:419;;;:::o;37831:176::-;37971:28;37967:1;37959:6;37955:14;37948:52;37831:176;:::o;38013:366::-;38155:3;38176:67;38240:2;38235:3;38176:67;:::i;:::-;38169:74;;38252:93;38341:3;38252:93;:::i;:::-;38370:2;38365:3;38361:12;38354:19;;38013:366;;;:::o;38385:419::-;38551:4;38589:2;38578:9;38574:18;38566:26;;38638:9;38632:4;38628:20;38624:1;38613:9;38609:17;38602:47;38666:131;38792:4;38666:131;:::i;:::-;38658:139;;38385:419;;;:::o;38810:300::-;38950:34;38946:1;38938:6;38934:14;38927:58;39019:34;39014:2;39006:6;39002:15;38995:59;39088:14;39083:2;39075:6;39071:15;39064:39;38810:300;:::o;39116:366::-;39258:3;39279:67;39343:2;39338:3;39279:67;:::i;:::-;39272:74;;39355:93;39444:3;39355:93;:::i;:::-;39473:2;39468:3;39464:12;39457:19;;39116:366;;;:::o;39488:419::-;39654:4;39692:2;39681:9;39677:18;39669:26;;39741:9;39735:4;39731:20;39727:1;39716:9;39712:17;39705:47;39769:131;39895:4;39769:131;:::i;:::-;39761:139;;39488:419;;;:::o;39913:238::-;40053:34;40049:1;40041:6;40037:14;40030:58;40122:21;40117:2;40109:6;40105:15;40098:46;39913:238;:::o;40157:366::-;40299:3;40320:67;40384:2;40379:3;40320:67;:::i;:::-;40313:74;;40396:93;40485:3;40396:93;:::i;:::-;40514:2;40509:3;40505:12;40498:19;;40157:366;;;:::o;40529:419::-;40695:4;40733:2;40722:9;40718:18;40710:26;;40782:9;40776:4;40772:20;40768:1;40757:9;40753:17;40746:47;40810:131;40936:4;40810:131;:::i;:::-;40802:139;;40529:419;;;:::o;40954:234::-;41094:34;41090:1;41082:6;41078:14;41071:58;41163:17;41158:2;41150:6;41146:15;41139:42;40954:234;:::o;41194:366::-;41336:3;41357:67;41421:2;41416:3;41357:67;:::i;:::-;41350:74;;41433:93;41522:3;41433:93;:::i;:::-;41551:2;41546:3;41542:12;41535:19;;41194:366;;;:::o;41566:419::-;41732:4;41770:2;41759:9;41755:18;41747:26;;41819:9;41813:4;41809:20;41805:1;41794:9;41790:17;41783:47;41847:131;41973:4;41847:131;:::i;:::-;41839:139;;41566:419;;;:::o;41991:377::-;42097:3;42125:39;42158:5;42125:39;:::i;:::-;42180:89;42262:6;42257:3;42180:89;:::i;:::-;42173:96;;42278:52;42323:6;42318:3;42311:4;42304:5;42300:16;42278:52;:::i;:::-;42355:6;42350:3;42346:16;42339:23;;42101:267;41991:377;;;;:::o;42374:155::-;42514:7;42510:1;42502:6;42498:14;42491:31;42374:155;:::o;42535:400::-;42695:3;42716:84;42798:1;42793:3;42716:84;:::i;:::-;42709:91;;42809:93;42898:3;42809:93;:::i;:::-;42927:1;42922:3;42918:11;42911:18;;42535:400;;;:::o;42941:701::-;43222:3;43244:95;43335:3;43326:6;43244:95;:::i;:::-;43237:102;;43356:95;43447:3;43438:6;43356:95;:::i;:::-;43349:102;;43468:148;43612:3;43468:148;:::i;:::-;43461:155;;43633:3;43626:10;;42941:701;;;;;:::o;43648:177::-;43788:29;43784:1;43776:6;43772:14;43765:53;43648:177;:::o;43831:366::-;43973:3;43994:67;44058:2;44053:3;43994:67;:::i;:::-;43987:74;;44070:93;44159:3;44070:93;:::i;:::-;44188:2;44183:3;44179:12;44172:19;;43831:366;;;:::o;44203:419::-;44369:4;44407:2;44396:9;44392:18;44384:26;;44456:9;44450:4;44446:20;44442:1;44431:9;44427:17;44420:47;44484:131;44610:4;44484:131;:::i;:::-;44476:139;;44203:419;;;:::o;44628:225::-;44768:34;44764:1;44756:6;44752:14;44745:58;44837:8;44832:2;44824:6;44820:15;44813:33;44628:225;:::o;44859:366::-;45001:3;45022:67;45086:2;45081:3;45022:67;:::i;:::-;45015:74;;45098:93;45187:3;45098:93;:::i;:::-;45216:2;45211:3;45207:12;45200:19;;44859:366;;;:::o;45231:419::-;45397:4;45435:2;45424:9;45420:18;45412:26;;45484:9;45478:4;45474:20;45470:1;45459:9;45455:17;45448:47;45512:131;45638:4;45512:131;:::i;:::-;45504:139;;45231:419;;;:::o;45656:178::-;45796:30;45792:1;45784:6;45780:14;45773:54;45656:178;:::o;45840:366::-;45982:3;46003:67;46067:2;46062:3;46003:67;:::i;:::-;45996:74;;46079:93;46168:3;46079:93;:::i;:::-;46197:2;46192:3;46188:12;46181:19;;45840:366;;;:::o;46212:419::-;46378:4;46416:2;46405:9;46401:18;46393:26;;46465:9;46459:4;46455:20;46451:1;46440:9;46436:17;46429:47;46493:131;46619:4;46493:131;:::i;:::-;46485:139;;46212:419;;;:::o;46637:248::-;46777:34;46773:1;46765:6;46761:14;46754:58;46846:31;46841:2;46833:6;46829:15;46822:56;46637:248;:::o;46891:366::-;47033:3;47054:67;47118:2;47113:3;47054:67;:::i;:::-;47047:74;;47130:93;47219:3;47130:93;:::i;:::-;47248:2;47243:3;47239:12;47232:19;;46891:366;;;:::o;47263:419::-;47429:4;47467:2;47456:9;47452:18;47444:26;;47516:9;47510:4;47506:20;47502:1;47491:9;47487:17;47480:47;47544:131;47670:4;47544:131;:::i;:::-;47536:139;;47263:419;;;:::o;47688:237::-;47828:34;47824:1;47816:6;47812:14;47805:58;47897:20;47892:2;47884:6;47880:15;47873:45;47688:237;:::o;47931:366::-;48073:3;48094:67;48158:2;48153:3;48094:67;:::i;:::-;48087:74;;48170:93;48259:3;48170:93;:::i;:::-;48288:2;48283:3;48279:12;48272:19;;47931:366;;;:::o;48303:419::-;48469:4;48507:2;48496:9;48492:18;48484:26;;48556:9;48550:4;48546:20;48542:1;48531:9;48527:17;48520:47;48584:131;48710:4;48584:131;:::i;:::-;48576:139;;48303:419;;;:::o;48728:225::-;48868:34;48864:1;48856:6;48852:14;48845:58;48937:8;48932:2;48924:6;48920:15;48913:33;48728:225;:::o;48959:366::-;49101:3;49122:67;49186:2;49181:3;49122:67;:::i;:::-;49115:74;;49198:93;49287:3;49198:93;:::i;:::-;49316:2;49311:3;49307:12;49300:19;;48959:366;;;:::o;49331:419::-;49497:4;49535:2;49524:9;49520:18;49512:26;;49584:9;49578:4;49574:20;49570:1;49559:9;49555:17;49548:47;49612:131;49738:4;49612:131;:::i;:::-;49604:139;;49331:419;;;:::o;49756:224::-;49896:34;49892:1;49884:6;49880:14;49873:58;49965:7;49960:2;49952:6;49948:15;49941:32;49756:224;:::o;49986:366::-;50128:3;50149:67;50213:2;50208:3;50149:67;:::i;:::-;50142:74;;50225:93;50314:3;50225:93;:::i;:::-;50343:2;50338:3;50334:12;50327:19;;49986:366;;;:::o;50358:419::-;50524:4;50562:2;50551:9;50547:18;50539:26;;50611:9;50605:4;50601:20;50597:1;50586:9;50582:17;50575:47;50639:131;50765:4;50639:131;:::i;:::-;50631:139;;50358:419;;;:::o;50783:147::-;50884:11;50921:3;50906:18;;50783:147;;;;:::o;50936:114::-;;:::o;51056:398::-;51215:3;51236:83;51317:1;51312:3;51236:83;:::i;:::-;51229:90;;51328:93;51417:3;51328:93;:::i;:::-;51446:1;51441:3;51437:11;51430:18;;51056:398;;;:::o;51460:379::-;51644:3;51666:147;51809:3;51666:147;:::i;:::-;51659:154;;51830:3;51823:10;;51460:379;;;:::o;51845:170::-;51985:22;51981:1;51973:6;51969:14;51962:46;51845:170;:::o;52021:366::-;52163:3;52184:67;52248:2;52243:3;52184:67;:::i;:::-;52177:74;;52260:93;52349:3;52260:93;:::i;:::-;52378:2;52373:3;52369:12;52362:19;;52021:366;;;:::o;52393:419::-;52559:4;52597:2;52586:9;52582:18;52574:26;;52646:9;52640:4;52636:20;52632:1;52621:9;52617:17;52610:47;52674:131;52800:4;52674:131;:::i;:::-;52666:139;;52393:419;;;:::o;52818:229::-;52958:34;52954:1;52946:6;52942:14;52935:58;53027:12;53022:2;53014:6;53010:15;53003:37;52818:229;:::o;53053:366::-;53195:3;53216:67;53280:2;53275:3;53216:67;:::i;:::-;53209:74;;53292:93;53381:3;53292:93;:::i;:::-;53410:2;53405:3;53401:12;53394:19;;53053:366;;;:::o;53425:419::-;53591:4;53629:2;53618:9;53614:18;53606:26;;53678:9;53672:4;53668:20;53664:1;53653:9;53649:17;53642:47;53706:131;53832:4;53706:131;:::i;:::-;53698:139;;53425:419;;;:::o;53850:234::-;53990:34;53986:1;53978:6;53974:14;53967:58;54059:17;54054:2;54046:6;54042:15;54035:42;53850:234;:::o;54090:366::-;54232:3;54253:67;54317:2;54312:3;54253:67;:::i;:::-;54246:74;;54329:93;54418:3;54329:93;:::i;:::-;54447:2;54442:3;54438:12;54431:19;;54090:366;;;:::o;54462:419::-;54628:4;54666:2;54655:9;54651:18;54643:26;;54715:9;54709:4;54705:20;54701:1;54690:9;54686:17;54679:47;54743:131;54869:4;54743:131;:::i;:::-;54735:139;;54462:419;;;:::o;54887:98::-;54938:6;54972:5;54966:12;54956:22;;54887:98;;;:::o;54991:168::-;55074:11;55108:6;55103:3;55096:19;55148:4;55143:3;55139:14;55124:29;;54991:168;;;;:::o;55165:360::-;55251:3;55279:38;55311:5;55279:38;:::i;:::-;55333:70;55396:6;55391:3;55333:70;:::i;:::-;55326:77;;55412:52;55457:6;55452:3;55445:4;55438:5;55434:16;55412:52;:::i;:::-;55489:29;55511:6;55489:29;:::i;:::-;55484:3;55480:39;55473:46;;55255:270;55165:360;;;;:::o;55531:640::-;55726:4;55764:3;55753:9;55749:19;55741:27;;55778:71;55846:1;55835:9;55831:17;55822:6;55778:71;:::i;:::-;55859:72;55927:2;55916:9;55912:18;55903:6;55859:72;:::i;:::-;55941;56009:2;55998:9;55994:18;55985:6;55941:72;:::i;:::-;56060:9;56054:4;56050:20;56045:2;56034:9;56030:18;56023:48;56088:76;56159:4;56150:6;56088:76;:::i;:::-;56080:84;;55531:640;;;;;;;:::o;56177:141::-;56233:5;56264:6;56258:13;56249:22;;56280:32;56306:5;56280:32;:::i;:::-;56177:141;;;;:::o;56324:349::-;56393:6;56442:2;56430:9;56421:7;56417:23;56413:32;56410:119;;;56448:79;;:::i;:::-;56410:119;56568:1;56593:63;56648:7;56639:6;56628:9;56624:22;56593:63;:::i;:::-;56583:73;;56539:127;56324:349;;;;:::o;56679:233::-;56718:3;56741:24;56759:5;56741:24;:::i;:::-;56732:33;;56787:66;56780:5;56777:77;56774:103;;;56857:18;;:::i;:::-;56774:103;56904:1;56897:5;56893:13;56886:20;;56679:233;;;:::o;56918:180::-;56966:77;56963:1;56956:88;57063:4;57060:1;57053:15;57087:4;57084:1;57077:15;57104:185;57144:1;57161:20;57179:1;57161:20;:::i;:::-;57156:25;;57195:20;57213:1;57195:20;:::i;:::-;57190:25;;57234:1;57224:35;;57239:18;;:::i;:::-;57224:35;57281:1;57278;57274:9;57269:14;;57104:185;;;;:::o;57295:176::-;57327:1;57344:20;57362:1;57344:20;:::i;:::-;57339:25;;57378:20;57396:1;57378:20;:::i;:::-;57373:25;;57417:1;57407:35;;57422:18;;:::i;:::-;57407:35;57463:1;57460;57456:9;57451:14;;57295:176;;;;:::o;57477:180::-;57525:77;57522:1;57515:88;57622:4;57619:1;57612:15;57646:4;57643:1;57636:15;57663:220;57803:34;57799:1;57791:6;57787:14;57780:58;57872:3;57867:2;57859:6;57855:15;57848:28;57663:220;:::o;57889:366::-;58031:3;58052:67;58116:2;58111:3;58052:67;:::i;:::-;58045:74;;58128:93;58217:3;58128:93;:::i;:::-;58246:2;58241:3;58237:12;58230:19;;57889:366;;;:::o;58261:419::-;58427:4;58465:2;58454:9;58450:18;58442:26;;58514:9;58508:4;58504:20;58500:1;58489:9;58485:17;58478:47;58542:131;58668:4;58542:131;:::i;:::-;58534:139;;58261:419;;;:::o;58686:227::-;58826:34;58822:1;58814:6;58810:14;58803:58;58895:10;58890:2;58882:6;58878:15;58871:35;58686:227;:::o;58919:366::-;59061:3;59082:67;59146:2;59141:3;59082:67;:::i;:::-;59075:74;;59158:93;59247:3;59158:93;:::i;:::-;59276:2;59271:3;59267:12;59260:19;;58919:366;;;:::o;59291:419::-;59457:4;59495:2;59484:9;59480:18;59472:26;;59544:9;59538:4;59534:20;59530:1;59519:9;59515:17;59508:47;59572:131;59698:4;59572:131;:::i;:::-;59564:139;;59291:419;;;:::o

Swarm Source

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